summaryrefslogtreecommitdiffstats
path: root/deluge
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2023-02-19 14:52:21 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2023-02-19 14:52:21 +0000
commitd1772d410235592b482e3b08b1863f6624d9fe6b (patch)
treeaccfb4b99c32e5e435089f8023d62e67a6951603 /deluge
parentInitial commit. (diff)
downloaddeluge-d1772d410235592b482e3b08b1863f6624d9fe6b.tar.xz
deluge-d1772d410235592b482e3b08b1863f6624d9fe6b.zip
Adding upstream version 2.0.3.upstream/2.0.3
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'deluge')
-rw-r--r--deluge/__init__.py1
-rw-r--r--deluge/_libtorrent.py33
-rw-r--r--deluge/argparserbase.py387
-rw-r--r--deluge/bencode.py158
-rw-r--r--deluge/common.py1369
-rw-r--r--deluge/component.py489
-rw-r--r--deluge/config.py569
-rw-r--r--deluge/configmanager.py130
-rw-r--r--deluge/core/__init__.py0
-rw-r--r--deluge/core/alertmanager.py152
-rw-r--r--deluge/core/authmanager.py289
-rw-r--r--deluge/core/core.py1301
-rw-r--r--deluge/core/daemon.py205
-rw-r--r--deluge/core/daemon_entry.py143
-rw-r--r--deluge/core/eventmanager.py69
-rw-r--r--deluge/core/filtermanager.py281
-rw-r--r--deluge/core/pluginmanager.py108
-rw-r--r--deluge/core/preferencesmanager.py482
-rw-r--r--deluge/core/rpcserver.py646
-rw-r--r--deluge/core/torrent.py1501
-rw-r--r--deluge/core/torrentmanager.py1699
-rw-r--r--deluge/crypto_utils.py79
-rw-r--r--deluge/decorators.py164
-rw-r--r--deluge/error.py96
-rw-r--r--deluge/event.py324
-rw-r--r--deluge/httpdownloader.py330
-rw-r--r--deluge/i18n/__init__.py15
-rw-r--r--deluge/i18n/ar.po6147
-rw-r--r--deluge/i18n/ast.po4653
-rw-r--r--deluge/i18n/be.po3922
-rw-r--r--deluge/i18n/bg.po4664
-rw-r--r--deluge/i18n/bn.po3725
-rw-r--r--deluge/i18n/bs.po3744
-rw-r--r--deluge/i18n/ca.po6384
-rw-r--r--deluge/i18n/cs.po6147
-rw-r--r--deluge/i18n/cy.po3820
-rw-r--r--deluge/i18n/da.po6390
-rw-r--r--deluge/i18n/de.po4777
-rw-r--r--deluge/i18n/el.po4733
-rw-r--r--deluge/i18n/en_AU.po4734
-rw-r--r--deluge/i18n/en_CA.po4736
-rw-r--r--deluge/i18n/en_GB.po6185
-rw-r--r--deluge/i18n/eo.po3741
-rw-r--r--deluge/i18n/es.po6315
-rw-r--r--deluge/i18n/et.po4708
-rw-r--r--deluge/i18n/eu.po3760
-rw-r--r--deluge/i18n/fa.po3967
-rw-r--r--deluge/i18n/fi.po6147
-rw-r--r--deluge/i18n/fr.po6153
-rw-r--r--deluge/i18n/fy.po4460
-rw-r--r--deluge/i18n/gl.po6195
-rw-r--r--deluge/i18n/he.po6147
-rw-r--r--deluge/i18n/hi.po4636
-rw-r--r--deluge/i18n/hr.po6256
-rw-r--r--deluge/i18n/hu.po6147
-rw-r--r--deluge/i18n/id.po4098
-rw-r--r--deluge/i18n/is.po4642
-rw-r--r--deluge/i18n/it.po6147
-rw-r--r--deluge/i18n/iu.po3712
-rw-r--r--deluge/i18n/ja.po4652
-rw-r--r--deluge/i18n/ka.po3918
-rw-r--r--deluge/i18n/kk.po4737
-rw-r--r--deluge/i18n/kn.po3922
-rw-r--r--deluge/i18n/ko.po4645
-rw-r--r--deluge/i18n/ku.po3754
-rw-r--r--deluge/i18n/la.po3727
-rw-r--r--deluge/i18n/languages.py117
-rw-r--r--deluge/i18n/lt.po4720
-rw-r--r--deluge/i18n/lv.po4742
-rw-r--r--deluge/i18n/mk.po4044
-rw-r--r--deluge/i18n/ms.po4688
-rw-r--r--deluge/i18n/nb.po4671
-rw-r--r--deluge/i18n/nds.po3739
-rw-r--r--deluge/i18n/nl.po4749
-rw-r--r--deluge/i18n/pl.po4725
-rw-r--r--deluge/i18n/pms.po3715
-rw-r--r--deluge/i18n/pt.po6147
-rw-r--r--deluge/i18n/pt_BR.po6147
-rw-r--r--deluge/i18n/ro.po4744
-rw-r--r--deluge/i18n/ru.po6158
-rw-r--r--deluge/i18n/si.po3712
-rw-r--r--deluge/i18n/sk.po6147
-rw-r--r--deluge/i18n/sl.po4544
-rw-r--r--deluge/i18n/sr.po4388
-rw-r--r--deluge/i18n/sv.po6635
-rw-r--r--deluge/i18n/ta.po3733
-rw-r--r--deluge/i18n/th.po3739
-rw-r--r--deluge/i18n/tl.po3715
-rw-r--r--deluge/i18n/tlh.po3712
-rw-r--r--deluge/i18n/tr.po4771
-rw-r--r--deluge/i18n/uk.po6508
-rw-r--r--deluge/i18n/util.py150
-rw-r--r--deluge/i18n/vi.po3753
-rw-r--r--deluge/i18n/zh_CN.po4613
-rw-r--r--deluge/i18n/zh_HK.po3754
-rw-r--r--deluge/i18n/zh_TW.po4603
-rw-r--r--deluge/log.py348
-rw-r--r--deluge/maketorrent.py379
-rw-r--r--deluge/metafile.py246
-rw-r--r--deluge/path_chooser_common.py92
-rw-r--r--deluge/pluginmanagerbase.py282
-rw-r--r--deluge/plugins/AutoAdd/deluge_autoadd/__init__.py41
-rw-r--r--deluge/plugins/AutoAdd/deluge_autoadd/common.py24
-rw-r--r--deluge/plugins/AutoAdd/deluge_autoadd/core.py522
-rw-r--r--deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd.js239
-rw-r--r--deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.js475
-rw-r--r--deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui1342
-rw-r--r--deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/main_tab.js304
-rw-r--r--deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/options_tab.js302
-rw-r--r--deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui134
-rw-r--r--deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py580
-rw-r--r--deluge/plugins/AutoAdd/deluge_autoadd/webui.py38
-rw-r--r--deluge/plugins/AutoAdd/setup.py48
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/__init__.py36
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/common.py176
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/core.py557
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/data/blocklist.js429
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/data/blocklist16.pngbin0 -> 586 bytes
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_download24.pngbin0 -> 764 bytes
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_import24.pngbin0 -> 1176 bytes
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui607
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui~603
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/decompressers.py47
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/detect.py51
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/gtkui.py257
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py72
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/readers.py102
-rw-r--r--deluge/plugins/Blocklist/deluge_blocklist/webui.py31
-rw-r--r--deluge/plugins/Blocklist/setup.py43
-rw-r--r--deluge/plugins/Execute/deluge_execute/__init__.py36
-rw-r--r--deluge/plugins/Execute/deluge_execute/common.py23
-rw-r--r--deluge/plugins/Execute/deluge_execute/core.py185
-rw-r--r--deluge/plugins/Execute/deluge_execute/data/execute.js312
-rw-r--r--deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui197
-rw-r--r--deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui~190
-rw-r--r--deluge/plugins/Execute/deluge_execute/gtkui.py165
-rw-r--r--deluge/plugins/Execute/deluge_execute/webui.py24
-rw-r--r--deluge/plugins/Execute/setup.py42
-rw-r--r--deluge/plugins/Extractor/deluge_extractor/__init__.py40
-rw-r--r--deluge/plugins/Extractor/deluge_extractor/common.py23
-rw-r--r--deluge/plugins/Extractor/deluge_extractor/core.py192
-rw-r--r--deluge/plugins/Extractor/deluge_extractor/data/extractor.js100
-rw-r--r--deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui123
-rw-r--r--deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui~120
-rw-r--r--deluge/plugins/Extractor/deluge_extractor/gtkui.py96
-rw-r--r--deluge/plugins/Extractor/deluge_extractor/webui.py28
-rw-r--r--deluge/plugins/Extractor/setup.py55
-rw-r--r--deluge/plugins/Label/TODO11
-rw-r--r--deluge/plugins/Label/deluge_label/__init__.py40
-rw-r--r--deluge/plugins/Label/deluge_label/common.py23
-rw-r--r--deluge/plugins/Label/deluge_label/core.py351
-rw-r--r--deluge/plugins/Label/deluge_label/data/label.js642
-rw-r--r--deluge/plugins/Label/deluge_label/data/label_add.ui174
-rw-r--r--deluge/plugins/Label/deluge_label/data/label_options.ui735
-rw-r--r--deluge/plugins/Label/deluge_label/data/label_pref.ui56
-rw-r--r--deluge/plugins/Label/deluge_label/gtkui/__init__.py77
-rw-r--r--deluge/plugins/Label/deluge_label/gtkui/label_config.py61
-rw-r--r--deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py263
-rw-r--r--deluge/plugins/Label/deluge_label/gtkui/submenu.py65
-rw-r--r--deluge/plugins/Label/deluge_label/test.py50
-rw-r--r--deluge/plugins/Label/deluge_label/webui.py27
-rw-r--r--deluge/plugins/Label/setup.py46
-rw-r--r--deluge/plugins/Notifications/deluge_notifications/__init__.py41
-rw-r--r--deluge/plugins/Notifications/deluge_notifications/common.py117
-rw-r--r--deluge/plugins/Notifications/deluge_notifications/core.py232
-rw-r--r--deluge/plugins/Notifications/deluge_notifications/data/config.ui651
-rw-r--r--deluge/plugins/Notifications/deluge_notifications/data/config.ui~643
-rw-r--r--deluge/plugins/Notifications/deluge_notifications/data/notifications.js522
-rw-r--r--deluge/plugins/Notifications/deluge_notifications/gtkui.py742
-rw-r--r--deluge/plugins/Notifications/deluge_notifications/test.py89
-rw-r--r--deluge/plugins/Notifications/deluge_notifications/webui.py35
-rwxr-xr-xdeluge/plugins/Notifications/setup.py54
-rw-r--r--deluge/plugins/Scheduler/deluge_scheduler/__init__.py40
-rw-r--r--deluge/plugins/Scheduler/deluge_scheduler/common.py23
-rw-r--r--deluge/plugins/Scheduler/deluge_scheduler/core.py170
-rw-r--r--deluge/plugins/Scheduler/deluge_scheduler/data/green.svg1
-rw-r--r--deluge/plugins/Scheduler/deluge_scheduler/data/red.svg1
-rw-r--r--deluge/plugins/Scheduler/deluge_scheduler/data/scheduler.js621
-rw-r--r--deluge/plugins/Scheduler/deluge_scheduler/data/yellow.svg1
-rw-r--r--deluge/plugins/Scheduler/deluge_scheduler/gtkui.py359
-rw-r--r--deluge/plugins/Scheduler/deluge_scheduler/webui.py27
-rw-r--r--deluge/plugins/Scheduler/setup.py46
-rw-r--r--deluge/plugins/Stats/deluge_stats/__init__.py40
-rw-r--r--deluge/plugins/Stats/deluge_stats/common.py23
-rw-r--r--deluge/plugins/Stats/deluge_stats/core.py223
-rw-r--r--deluge/plugins/Stats/deluge_stats/data/config.ui284
-rw-r--r--deluge/plugins/Stats/deluge_stats/data/config.ui~280
-rw-r--r--deluge/plugins/Stats/deluge_stats/data/stats.js27
-rw-r--r--deluge/plugins/Stats/deluge_stats/data/tabs.ui169
-rw-r--r--deluge/plugins/Stats/deluge_stats/graph.py338
-rw-r--r--deluge/plugins/Stats/deluge_stats/gtkui.py296
-rw-r--r--deluge/plugins/Stats/deluge_stats/template/graph.html12
-rw-r--r--deluge/plugins/Stats/deluge_stats/tests/__init__.py0
-rw-r--r--deluge/plugins/Stats/deluge_stats/tests/test.html9
-rw-r--r--deluge/plugins/Stats/deluge_stats/tests/test_stats.py113
-rw-r--r--deluge/plugins/Stats/deluge_stats/webui.py36
-rw-r--r--deluge/plugins/Stats/setup.py50
-rw-r--r--deluge/plugins/Toggle/deluge_toggle/__init__.py41
-rw-r--r--deluge/plugins/Toggle/deluge_toggle/common.py23
-rw-r--r--deluge/plugins/Toggle/deluge_toggle/core.py50
-rw-r--r--deluge/plugins/Toggle/deluge_toggle/data/toggle.js27
-rw-r--r--deluge/plugins/Toggle/deluge_toggle/gtkui.py56
-rw-r--r--deluge/plugins/Toggle/deluge_toggle/webui.py34
-rw-r--r--deluge/plugins/Toggle/setup.py47
-rw-r--r--deluge/plugins/WebUi/deluge_webui/__init__.py40
-rw-r--r--deluge/plugins/WebUi/deluge_webui/common.py23
-rw-r--r--deluge/plugins/WebUi/deluge_webui/core.py120
-rw-r--r--deluge/plugins/WebUi/deluge_webui/data/config.ui129
-rw-r--r--deluge/plugins/WebUi/deluge_webui/data/config.ui~126
-rw-r--r--deluge/plugins/WebUi/deluge_webui/gtkui.py100
-rw-r--r--deluge/plugins/WebUi/deluge_webui/tests/__init__.py0
-rw-r--r--deluge/plugins/WebUi/deluge_webui/tests/test_plugin_webui.py49
-rw-r--r--deluge/plugins/WebUi/setup.py44
-rw-r--r--deluge/plugins/__init__.py0
-rw-r--r--deluge/plugins/init.py30
-rw-r--r--deluge/plugins/pluginbase.py84
-rw-r--r--deluge/tests/__init__.py19
-rw-r--r--deluge/tests/basetest.py59
-rw-r--r--deluge/tests/common.py341
-rw-r--r--deluge/tests/common_web.py69
-rw-r--r--deluge/tests/daemon_base.py86
-rw-r--r--deluge/tests/data/deluge.pngbin0 -> 722 bytes
-rw-r--r--deluge/tests/data/dir_with_6_files.torrentbin0 -> 9630 bytes
-rw-r--r--deluge/tests/data/filehash_field.torrent2
-rw-r--r--deluge/tests/data/google.icobin0 -> 5430 bytes
-rw-r--r--deluge/tests/data/seo.icobin0 -> 1150 bytes
-rw-r--r--deluge/tests/data/test.torrent2
-rw-r--r--deluge/tests/data/test_torrent.file.torrent2
-rw-r--r--deluge/tests/data/ubuntu-9.04-desktop-i386.iso.torrentbin0 -> 28184 bytes
-rw-r--r--deluge/tests/data/unicode_file.torrent1
-rw-r--r--deluge/tests/data/unicode_filenames.torrentbin0 -> 34298 bytes
-rw-r--r--deluge/tests/test_alertmanager.py39
-rw-r--r--deluge/tests/test_authmanager.py27
-rw-r--r--deluge/tests/test_bencode.py34
-rw-r--r--deluge/tests/test_client.py204
-rw-r--r--deluge/tests/test_common.py202
-rw-r--r--deluge/tests/test_component.py267
-rw-r--r--deluge/tests/test_config.py194
-rw-r--r--deluge/tests/test_core.py498
-rw-r--r--deluge/tests/test_decorators.py52
-rw-r--r--deluge/tests/test_error.py54
-rw-r--r--deluge/tests/test_files_tab.py176
-rw-r--r--deluge/tests/test_httpdownloader.py266
-rw-r--r--deluge/tests/test_json_api.py291
-rw-r--r--deluge/tests/test_log.py51
-rw-r--r--deluge/tests/test_maketorrent.py96
-rw-r--r--deluge/tests/test_metafile.py68
-rw-r--r--deluge/tests/test_plugin_metadata.py31
-rw-r--r--deluge/tests/test_rpcserver.py113
-rw-r--r--deluge/tests/test_security.py184
-rw-r--r--deluge/tests/test_sessionproxy.py164
-rw-r--r--deluge/tests/test_torrent.py347
-rw-r--r--deluge/tests/test_torrentmanager.py120
-rw-r--r--deluge/tests/test_torrentview.py285
-rw-r--r--deluge/tests/test_tracker_icons.py77
-rw-r--r--deluge/tests/test_transfer.py403
-rw-r--r--deluge/tests/test_ui_common.py77
-rw-r--r--deluge/tests/test_ui_console.py67
-rw-r--r--deluge/tests/test_ui_entry.py513
-rw-r--r--deluge/tests/test_web_api.py199
-rw-r--r--deluge/tests/test_web_auth.py36
-rw-r--r--deluge/tests/test_webserver.py59
-rw-r--r--deluge/tests/twisted/plugins/delugereporter.py50
-rw-r--r--deluge/transfer.py161
-rw-r--r--deluge/ui/__init__.py0
-rw-r--r--deluge/ui/client.py838
-rw-r--r--deluge/ui/common.py564
-rw-r--r--deluge/ui/console/__init__.py19
-rw-r--r--deluge/ui/console/cmdline/__init__.py0
-rw-r--r--deluge/ui/console/cmdline/command.py215
-rw-r--r--deluge/ui/console/cmdline/commands/__init__.py6
-rw-r--r--deluge/ui/console/cmdline/commands/add.py126
-rw-r--r--deluge/ui/console/cmdline/commands/cache.py31
-rw-r--r--deluge/ui/console/cmdline/commands/config.py168
-rw-r--r--deluge/ui/console/cmdline/commands/connect.py86
-rw-r--r--deluge/ui/console/cmdline/commands/debug.py40
-rw-r--r--deluge/ui/console/cmdline/commands/gui.py30
-rw-r--r--deluge/ui/console/cmdline/commands/halt.py35
-rw-r--r--deluge/ui/console/cmdline/commands/help.py74
-rw-r--r--deluge/ui/console/cmdline/commands/info.py484
-rw-r--r--deluge/ui/console/cmdline/commands/manage.py119
-rw-r--r--deluge/ui/console/cmdline/commands/move.py97
-rw-r--r--deluge/ui/console/cmdline/commands/pause.py48
-rw-r--r--deluge/ui/console/cmdline/commands/plugin.py143
-rw-r--r--deluge/ui/console/cmdline/commands/quit.py25
-rw-r--r--deluge/ui/console/cmdline/commands/recheck.py47
-rw-r--r--deluge/ui/console/cmdline/commands/resume.py48
-rw-r--r--deluge/ui/console/cmdline/commands/rm.py83
-rw-r--r--deluge/ui/console/cmdline/commands/status.py114
-rw-r--r--deluge/ui/console/cmdline/commands/update_tracker.py47
-rw-r--r--deluge/ui/console/console.py169
-rw-r--r--deluge/ui/console/main.py765
-rw-r--r--deluge/ui/console/modes/__init__.py0
-rw-r--r--deluge/ui/console/modes/add_util.py97
-rw-r--r--deluge/ui/console/modes/addtorrents.py545
-rw-r--r--deluge/ui/console/modes/basemode.py357
-rw-r--r--deluge/ui/console/modes/cmdline.py850
-rw-r--r--deluge/ui/console/modes/connectionmanager.py206
-rw-r--r--deluge/ui/console/modes/eventview.py115
-rw-r--r--deluge/ui/console/modes/preferences/__init__.py5
-rw-r--r--deluge/ui/console/modes/preferences/preference_panes.py764
-rw-r--r--deluge/ui/console/modes/preferences/preferences.py379
-rw-r--r--deluge/ui/console/modes/torrentdetail.py1026
-rw-r--r--deluge/ui/console/modes/torrentlist/__init__.py20
-rw-r--r--deluge/ui/console/modes/torrentlist/add_torrents_popup.py113
-rw-r--r--deluge/ui/console/modes/torrentlist/filtersidebar.py134
-rw-r--r--deluge/ui/console/modes/torrentlist/queue_mode.py157
-rw-r--r--deluge/ui/console/modes/torrentlist/search_mode.py210
-rw-r--r--deluge/ui/console/modes/torrentlist/torrentactions.py276
-rw-r--r--deluge/ui/console/modes/torrentlist/torrentlist.py348
-rw-r--r--deluge/ui/console/modes/torrentlist/torrentview.py517
-rw-r--r--deluge/ui/console/modes/torrentlist/torrentviewcolumns.py162
-rw-r--r--deluge/ui/console/parser.py143
-rw-r--r--deluge/ui/console/utils/__init__.py0
-rw-r--r--deluge/ui/console/utils/colors.py326
-rw-r--r--deluge/ui/console/utils/column.py77
-rw-r--r--deluge/ui/console/utils/common.py23
-rw-r--r--deluge/ui/console/utils/curses_util.py65
-rw-r--r--deluge/ui/console/utils/format_utils.py353
-rw-r--r--deluge/ui/console/widgets/__init__.py7
-rw-r--r--deluge/ui/console/widgets/fields.py1210
-rw-r--r--deluge/ui/console/widgets/inputpane.py397
-rw-r--r--deluge/ui/console/widgets/popup.py402
-rw-r--r--deluge/ui/console/widgets/sidebar.py82
-rw-r--r--deluge/ui/console/widgets/statusbars.py122
-rw-r--r--deluge/ui/console/widgets/window.py185
-rw-r--r--deluge/ui/coreconfig.py54
-rw-r--r--deluge/ui/countries.py256
-rw-r--r--deluge/ui/data/__pycache__/__init__.cpython-37.pycbin0 -> 141 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/128x128/apps/deluge.pngbin0 -> 4365 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/16x16/apps/deluge-panel.pngbin0 -> 551 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/16x16/apps/deluge.pngbin0 -> 551 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/192x192/apps/deluge.pngbin0 -> 6606 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/22x22/apps/deluge-panel.pngbin0 -> 778 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/22x22/apps/deluge.pngbin0 -> 778 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/24x24/apps/deluge-panel.pngbin0 -> 877 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/24x24/apps/deluge.pngbin0 -> 877 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/256x256/apps/deluge.pngbin0 -> 8907 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/32x32/apps/deluge.pngbin0 -> 1126 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/36x36/apps/deluge.pngbin0 -> 1270 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/48x48/apps/deluge.pngbin0 -> 1798 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/512x512/apps/deluge.pngbin0 -> 20135 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/64x64/apps/deluge.pngbin0 -> 2324 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/72x72/apps/deluge.pngbin0 -> 2535 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/96x96/apps/deluge.pngbin0 -> 3323 bytes
-rw-r--r--deluge/ui/data/icons/hicolor/scalable/apps/deluge.svg610
-rw-r--r--deluge/ui/data/pixmaps/__pycache__/__init__.cpython-37.pycbin0 -> 149 bytes
-rw-r--r--deluge/ui/data/pixmaps/active.svg612
-rw-r--r--deluge/ui/data/pixmaps/active16.pngbin0 -> 505 bytes
-rw-r--r--deluge/ui/data/pixmaps/alert.svg512
-rw-r--r--deluge/ui/data/pixmaps/alert16.pngbin0 -> 462 bytes
-rw-r--r--deluge/ui/data/pixmaps/all.svg826
-rw-r--r--deluge/ui/data/pixmaps/all16.pngbin0 -> 533 bytes
-rw-r--r--deluge/ui/data/pixmaps/checking.svg504
-rw-r--r--deluge/ui/data/pixmaps/checking16.pngbin0 -> 490 bytes
-rw-r--r--deluge/ui/data/pixmaps/deluge-about.pngbin0 -> 6117 bytes
-rw-r--r--deluge/ui/data/pixmaps/deluge.icobin0 -> 112928 bytes
-rw-r--r--deluge/ui/data/pixmaps/deluge.pngbin0 -> 1798 bytes
-rw-r--r--deluge/ui/data/pixmaps/deluge.svg610
-rw-r--r--deluge/ui/data/pixmaps/deluge16.pngbin0 -> 552 bytes
-rw-r--r--deluge/ui/data/pixmaps/dht.svg163
-rw-r--r--deluge/ui/data/pixmaps/dht16.pngbin0 -> 582 bytes
-rw-r--r--deluge/ui/data/pixmaps/downloading.svg515
-rw-r--r--deluge/ui/data/pixmaps/downloading16.pngbin0 -> 465 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ad.pngbin0 -> 444 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ae.pngbin0 -> 275 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/af.pngbin0 -> 415 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ag.pngbin0 -> 431 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ai.pngbin0 -> 492 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/al.pngbin0 -> 427 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/am.pngbin0 -> 322 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/an.pngbin0 -> 359 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ao.pngbin0 -> 381 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/aq.pngbin0 -> 582 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ar.pngbin0 -> 354 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/as.pngbin0 -> 514 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/at.pngbin0 -> 286 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/au.pngbin0 -> 554 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/aw.pngbin0 -> 376 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ax.pngbin0 -> 470 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/az.pngbin0 -> 411 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ba.pngbin0 -> 449 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bb.pngbin0 -> 392 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bd.pngbin0 -> 355 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/be.pngbin0 -> 286 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bf.pngbin0 -> 333 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bg.pngbin0 -> 306 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bh.pngbin0 -> 331 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bi.pngbin0 -> 548 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bj.pngbin0 -> 307 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bm.pngbin0 -> 475 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bn.pngbin0 -> 486 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bo.pngbin0 -> 335 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/br.pngbin0 -> 458 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bs.pngbin0 -> 386 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bt.pngbin0 -> 460 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bv.pngbin0 -> 380 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bw.pngbin0 -> 313 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/by.pngbin0 -> 365 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/bz.pngbin0 -> 457 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ca.pngbin0 -> 459 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cc.pngbin0 -> 480 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cd.pngbin0 -> 448 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cf.pngbin0 -> 443 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cg.pngbin0 -> 366 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ch.pngbin0 -> 231 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ci.pngbin0 -> 300 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ck.pngbin0 -> 474 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cl.pngbin0 -> 316 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cm.pngbin0 -> 335 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cn.pngbin0 -> 339 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/co.pngbin0 -> 322 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cr.pngbin0 -> 339 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cs.pngbin0 -> 305 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cu.pngbin0 -> 416 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cv.pngbin0 -> 403 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cx.pngbin0 -> 459 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cy.pngbin0 -> 318 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/cz.pngbin0 -> 349 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/de.pngbin0 -> 353 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/dj.pngbin0 -> 411 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/dk.pngbin0 -> 342 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/dm.pngbin0 -> 488 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/do.pngbin0 -> 361 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/dz.pngbin0 -> 442 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ec.pngbin0 -> 345 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ee.pngbin0 -> 285 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/eg.pngbin0 -> 344 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/eh.pngbin0 -> 377 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/er.pngbin0 -> 480 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/es.pngbin0 -> 336 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/et.pngbin0 -> 424 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/fi.pngbin0 -> 355 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/fj.pngbin0 -> 485 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/fk.pngbin0 -> 498 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/fm.pngbin0 -> 394 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/fo.pngbin0 -> 367 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/fr.pngbin0 -> 363 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/fx.pngbin0 -> 460 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ga.pngbin0 -> 331 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gb.pngbin0 -> 526 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gd.pngbin0 -> 446 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ge.pngbin0 -> 468 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gf.pngbin0 -> 363 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gg.pngbin0 -> 445 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gh.pngbin0 -> 320 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gi.pngbin0 -> 354 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gl.pngbin0 -> 337 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gm.pngbin0 -> 349 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gn.pngbin0 -> 309 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gp.pngbin0 -> 343 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gq.pngbin0 -> 391 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gr.pngbin0 -> 377 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gs.pngbin0 -> 499 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gt.pngbin0 -> 327 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gu.pngbin0 -> 366 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gw.pngbin0 -> 339 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/gy.pngbin0 -> 500 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/hk.pngbin0 -> 380 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/hm.pngbin0 -> 554 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/hn.pngbin0 -> 394 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/hr.pngbin0 -> 368 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ht.pngbin0 -> 319 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/hu.pngbin0 -> 284 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/id.pngbin0 -> 291 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ie.pngbin0 -> 325 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/il.pngbin0 -> 310 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/in.pngbin0 -> 360 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/io.pngbin0 -> 556 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/iq.pngbin0 -> 391 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ir.pngbin0 -> 385 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/is.pngbin0 -> 395 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/it.pngbin0 -> 277 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/je.pngbin0 -> 630 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/jm.pngbin0 -> 478 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/jo.pngbin0 -> 344 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/jp.pngbin0 -> 299 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ke.pngbin0 -> 423 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/kg.pngbin0 -> 341 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/kh.pngbin0 -> 409 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ki.pngbin0 -> 520 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/km.pngbin0 -> 432 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/kn.pngbin0 -> 455 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/kp.pngbin0 -> 409 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/kr.pngbin0 -> 484 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/kw.pngbin0 -> 341 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ky.pngbin0 -> 505 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/kz.pngbin0 -> 441 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/la.pngbin0 -> 395 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/lb.pngbin0 -> 374 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/lc.pngbin0 -> 454 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/li.pngbin0 -> 382 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/lk.pngbin0 -> 454 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/lr.pngbin0 -> 356 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ls.pngbin0 -> 480 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/lt.pngbin0 -> 336 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/lu.pngbin0 -> 320 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/lv.pngbin0 -> 329 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ly.pngbin0 -> 269 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ma.pngbin0 -> 286 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mc.pngbin0 -> 251 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/md.pngbin0 -> 393 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/me.pngbin0 -> 371 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mg.pngbin0 -> 304 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mh.pngbin0 -> 500 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mk.pngbin0 -> 433 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ml.pngbin0 -> 314 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mm.pngbin0 -> 334 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mn.pngbin0 -> 328 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mo.pngbin0 -> 440 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mp.pngbin0 -> 460 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mq.pngbin0 -> 524 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mr.pngbin0 -> 398 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ms.pngbin0 -> 472 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mt.pngbin0 -> 290 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mu.pngbin0 -> 350 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mv.pngbin0 -> 385 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mw.pngbin0 -> 356 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mx.pngbin0 -> 409 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/my.pngbin0 -> 453 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/mz.pngbin0 -> 418 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/na.pngbin0 -> 531 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/nc.pngbin0 -> 450 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ne.pngbin0 -> 370 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/nf.pngbin0 -> 457 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ng.pngbin0 -> 334 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ni.pngbin0 -> 358 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/nl.pngbin0 -> 300 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/no.pngbin0 -> 380 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/np.pngbin0 -> 330 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/nr.pngbin0 -> 376 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/nu.pngbin0 -> 449 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/nz.pngbin0 -> 500 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/om.pngbin0 -> 334 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/pa.pngbin0 -> 379 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/pe.pngbin0 -> 251 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/pf.pngbin0 -> 373 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/pg.pngbin0 -> 414 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ph.pngbin0 -> 406 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/pk.pngbin0 -> 439 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/pl.pngbin0 -> 236 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/pm.pngbin0 -> 552 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/pn.pngbin0 -> 523 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/pr.pngbin0 -> 420 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ps.pngbin0 -> 334 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/pt.pngbin0 -> 391 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/pw.pngbin0 -> 403 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/py.pngbin0 -> 334 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/qa.pngbin0 -> 325 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/re.pngbin0 -> 363 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ro.pngbin0 -> 322 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/rs.pngbin0 -> 362 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ru.pngbin0 -> 281 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/rw.pngbin0 -> 365 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sa.pngbin0 -> 418 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sb.pngbin0 -> 489 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sc.pngbin0 -> 464 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sd.pngbin0 -> 349 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/se.pngbin0 -> 374 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sg.pngbin0 -> 338 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sh.pngbin0 -> 498 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/si.pngbin0 -> 370 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sj.pngbin0 -> 380 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sk.pngbin0 -> 419 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sl.pngbin0 -> 311 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sm.pngbin0 -> 367 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sn.pngbin0 -> 351 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/so.pngbin0 -> 366 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sr.pngbin0 -> 360 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/st.pngbin0 -> 415 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sv.pngbin0 -> 357 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sy.pngbin0 -> 312 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/sz.pngbin0 -> 486 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tc.pngbin0 -> 485 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/td.pngbin0 -> 370 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tf.pngbin0 -> 386 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tg.pngbin0 -> 397 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/th.pngbin0 -> 324 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tj.pngbin0 -> 353 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tk.pngbin0 -> 499 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tl.pngbin0 -> 377 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tm.pngbin0 -> 438 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tn.pngbin0 -> 358 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/to.pngbin0 -> 292 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tp.pngbin0 -> 445 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tr.pngbin0 -> 358 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tt.pngbin0 -> 460 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tv.pngbin0 -> 416 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tw.pngbin0 -> 320 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/tz.pngbin0 -> 488 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ua.pngbin0 -> 297 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ug.pngbin0 -> 374 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/um.pngbin0 -> 443 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/us.pngbin0 -> 455 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/uy.pngbin0 -> 396 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/uz.pngbin0 -> 390 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/va.pngbin0 -> 401 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/vc.pngbin0 -> 398 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ve.pngbin0 -> 384 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/vg.pngbin0 -> 485 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/vi.pngbin0 -> 503 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/vn.pngbin0 -> 310 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/vu.pngbin0 -> 423 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/wf.pngbin0 -> 429 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ws.pngbin0 -> 346 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/ye.pngbin0 -> 289 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/yt.pngbin0 -> 446 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/yu.pngbin0 -> 385 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/za.pngbin0 -> 497 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/zm.pngbin0 -> 349 bytes
-rw-r--r--deluge/ui/data/pixmaps/flags/zw.pngbin0 -> 440 bytes
-rw-r--r--deluge/ui/data/pixmaps/inactive.svg492
-rw-r--r--deluge/ui/data/pixmaps/inactive16.pngbin0 -> 432 bytes
-rw-r--r--deluge/ui/data/pixmaps/loading.gifbin0 -> 723 bytes
-rw-r--r--deluge/ui/data/pixmaps/magnet.pngbin0 -> 906 bytes
-rw-r--r--deluge/ui/data/pixmaps/queued.svg532
-rw-r--r--deluge/ui/data/pixmaps/queued16.pngbin0 -> 410 bytes
-rw-r--r--deluge/ui/data/pixmaps/seeding.svg509
-rw-r--r--deluge/ui/data/pixmaps/seeding16.pngbin0 -> 505 bytes
-rw-r--r--deluge/ui/data/pixmaps/tracker_all16.pngbin0 -> 1097 bytes
-rw-r--r--deluge/ui/data/pixmaps/tracker_warning16.pngbin0 -> 683 bytes
-rw-r--r--deluge/ui/data/pixmaps/traffic.svg94
-rw-r--r--deluge/ui/data/pixmaps/traffic16.pngbin0 -> 394 bytes
-rw-r--r--deluge/ui/data/share/appdata/deluge.appdata.xml.in30
-rw-r--r--deluge/ui/data/share/applications/deluge.desktop.in16
-rw-r--r--deluge/ui/gtk3/__init__.py63
-rw-r--r--deluge/ui/gtk3/aboutdialog.py855
-rw-r--r--deluge/ui/gtk3/addtorrentdialog.py1101
-rw-r--r--deluge/ui/gtk3/common.py395
-rw-r--r--deluge/ui/gtk3/connectionmanager.py568
-rw-r--r--deluge/ui/gtk3/createtorrentdialog.py520
-rw-r--r--deluge/ui/gtk3/details_tab.py74
-rw-r--r--deluge/ui/gtk3/dialogs.py455
-rw-r--r--deluge/ui/gtk3/edittrackersdialog.py300
-rw-r--r--deluge/ui/gtk3/files_tab.py860
-rw-r--r--deluge/ui/gtk3/filtertreeview.py378
-rw-r--r--deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui219
-rw-r--r--deluge/ui/gtk3/glade/add_torrent_dialog.ui1039
-rw-r--r--deluge/ui/gtk3/glade/add_torrent_dialog.url.ui176
-rw-r--r--deluge/ui/gtk3/glade/connect_peer_dialog.ui154
-rw-r--r--deluge/ui/gtk3/glade/connection_manager.addhost.ui237
-rw-r--r--deluge/ui/gtk3/glade/connection_manager.ui394
-rw-r--r--deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui57
-rw-r--r--deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui176
-rw-r--r--deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui176
-rw-r--r--deluge/ui/gtk3/glade/create_torrent_dialog.ui847
-rw-r--r--deluge/ui/gtk3/glade/edit_trackers.add.ui183
-rw-r--r--deluge/ui/gtk3/glade/edit_trackers.edit.ui177
-rw-r--r--deluge/ui/gtk3/glade/edit_trackers.ui247
-rw-r--r--deluge/ui/gtk3/glade/filtertree_menu.ui60
-rw-r--r--deluge/ui/gtk3/glade/main_window.new_release.ui249
-rw-r--r--deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui138
-rw-r--r--deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui27
-rw-r--r--deluge/ui/gtk3/glade/main_window.tabs.ui1679
-rw-r--r--deluge/ui/gtk3/glade/main_window.ui796
-rw-r--r--deluge/ui/gtk3/glade/move_storage_dialog.ui163
-rw-r--r--deluge/ui/gtk3/glade/other_dialog.ui190
-rw-r--r--deluge/ui/gtk3/glade/path_combo_chooser.ui1002
-rw-r--r--deluge/ui/gtk3/glade/preferences_dialog.ui5020
-rw-r--r--deluge/ui/gtk3/glade/queuedtorrents.ui211
-rw-r--r--deluge/ui/gtk3/glade/remove_torrent_dialog.ui187
-rw-r--r--deluge/ui/gtk3/glade/torrent_menu.options.ui104
-rw-r--r--deluge/ui/gtk3/glade/torrent_menu.queue.ui69
-rw-r--r--deluge/ui/gtk3/glade/torrent_menu.ui225
-rw-r--r--deluge/ui/gtk3/glade/tray_menu.ui167
-rw-r--r--deluge/ui/gtk3/gtkui.py391
-rw-r--r--deluge/ui/gtk3/ipcinterface.py230
-rw-r--r--deluge/ui/gtk3/listview.py838
-rw-r--r--deluge/ui/gtk3/mainwindow.py381
-rw-r--r--deluge/ui/gtk3/menubar.py614
-rw-r--r--deluge/ui/gtk3/menubar_osx.py87
-rw-r--r--deluge/ui/gtk3/new_release_dialog.py73
-rw-r--r--deluge/ui/gtk3/options_tab.py222
-rw-r--r--deluge/ui/gtk3/path_chooser.py201
-rwxr-xr-xdeluge/ui/gtk3/path_combo_chooser.py1742
-rw-r--r--deluge/ui/gtk3/peers_tab.py394
-rw-r--r--deluge/ui/gtk3/piecesbar.py235
-rw-r--r--deluge/ui/gtk3/pluginmanager.py137
-rw-r--r--deluge/ui/gtk3/preferences.py1527
-rw-r--r--deluge/ui/gtk3/queuedtorrents.py168
-rw-r--r--deluge/ui/gtk3/removetorrentdialog.py93
-rw-r--r--deluge/ui/gtk3/sidebar.py73
-rw-r--r--deluge/ui/gtk3/status_tab.py162
-rw-r--r--deluge/ui/gtk3/statusbar.py578
-rw-r--r--deluge/ui/gtk3/systemtray.py445
-rw-r--r--deluge/ui/gtk3/tab_data_funcs.py96
-rw-r--r--deluge/ui/gtk3/toolbar.py134
-rw-r--r--deluge/ui/gtk3/torrentdetails.py458
-rw-r--r--deluge/ui/gtk3/torrentview.py934
-rw-r--r--deluge/ui/gtk3/torrentview_data_funcs.py285
-rw-r--r--deluge/ui/gtk3/trackers_tab.py74
-rw-r--r--deluge/ui/hostlist.py292
-rw-r--r--deluge/ui/sessionproxy.py278
-rw-r--r--deluge/ui/tracker_icons.py662
-rw-r--r--deluge/ui/ui.py72
-rw-r--r--deluge/ui/ui_entry.py143
-rw-r--r--deluge/ui/web/__init__.py8
-rw-r--r--deluge/ui/web/auth.py257
-rw-r--r--deluge/ui/web/common.py48
-rw-r--r--deluge/ui/web/css/deluge.css568
-rw-r--r--deluge/ui/web/css/ext-all-notheme.css5349
-rw-r--r--deluge/ui/web/css/ext-extensions-debug.css261
-rw-r--r--deluge/ui/web/css/ext-extensions.css1
-rw-r--r--deluge/ui/web/icons/active.pngbin0 -> 503 bytes
-rw-r--r--deluge/ui/web/icons/add.pngbin0 -> 358 bytes
-rw-r--r--deluge/ui/web/icons/add_file.pngbin0 -> 520 bytes
-rw-r--r--deluge/ui/web/icons/add_magnet.pngbin0 -> 589 bytes
-rw-r--r--deluge/ui/web/icons/add_url.pngbin0 -> 815 bytes
-rw-r--r--deluge/ui/web/icons/alert.pngbin0 -> 462 bytes
-rw-r--r--deluge/ui/web/icons/all.pngbin0 -> 533 bytes
-rw-r--r--deluge/ui/web/icons/back.pngbin0 -> 443 bytes
-rw-r--r--deluge/ui/web/icons/bottom.pngbin0 -> 346 bytes
-rw-r--r--deluge/ui/web/icons/checking.pngbin0 -> 489 bytes
-rw-r--r--deluge/ui/web/icons/connection_manager.pngbin0 -> 464 bytes
-rw-r--r--deluge/ui/web/icons/connections.pngbin0 -> 560 bytes
-rw-r--r--deluge/ui/web/icons/create.pngbin0 -> 541 bytes
-rw-r--r--deluge/ui/web/icons/deluge-192.pngbin0 -> 6604 bytes
-rw-r--r--deluge/ui/web/icons/deluge-32.pngbin0 -> 1126 bytes
-rw-r--r--deluge/ui/web/icons/deluge-512.pngbin0 -> 20126 bytes
-rw-r--r--deluge/ui/web/icons/deluge-apple-180.pngbin0 -> 5367 bytes
-rw-r--r--deluge/ui/web/icons/deluge.pngbin0 -> 551 bytes
-rw-r--r--deluge/ui/web/icons/dht.pngbin0 -> 582 bytes
-rw-r--r--deluge/ui/web/icons/document.pngbin0 -> 406 bytes
-rw-r--r--deluge/ui/web/icons/down.pngbin0 -> 427 bytes
-rw-r--r--deluge/ui/web/icons/downloading.pngbin0 -> 462 bytes
-rw-r--r--deluge/ui/web/icons/drive.pngbin0 -> 381 bytes
-rw-r--r--deluge/ui/web/icons/edit_trackers.pngbin0 -> 589 bytes
-rw-r--r--deluge/ui/web/icons/error.pngbin0 -> 730 bytes
-rw-r--r--deluge/ui/web/icons/expand_all.pngbin0 -> 612 bytes
-rw-r--r--deluge/ui/web/icons/favicon.icobin0 -> 15086 bytes
-rw-r--r--deluge/ui/web/icons/find_more.pngbin0 -> 557 bytes
-rw-r--r--deluge/ui/web/icons/forward.pngbin0 -> 436 bytes
-rw-r--r--deluge/ui/web/icons/help.pngbin0 -> 772 bytes
-rw-r--r--deluge/ui/web/icons/high.pngbin0 -> 505 bytes
-rw-r--r--deluge/ui/web/icons/home.pngbin0 -> 550 bytes
-rw-r--r--deluge/ui/web/icons/inactive.pngbin0 -> 431 bytes
-rw-r--r--deluge/ui/web/icons/install_plugin.pngbin0 -> 674 bytes
-rw-r--r--deluge/ui/web/icons/login.pngbin0 -> 469 bytes
-rw-r--r--deluge/ui/web/icons/logout.pngbin0 -> 599 bytes
-rw-r--r--deluge/ui/web/icons/low.pngbin0 -> 358 bytes
-rw-r--r--deluge/ui/web/icons/move.pngbin0 -> 524 bytes
-rw-r--r--deluge/ui/web/icons/no_download.pngbin0 -> 581 bytes
-rw-r--r--deluge/ui/web/icons/normal.pngbin0 -> 436 bytes
-rw-r--r--deluge/ui/web/icons/ok.pngbin0 -> 766 bytes
-rw-r--r--deluge/ui/web/icons/pause.pngbin0 -> 331 bytes
-rw-r--r--deluge/ui/web/icons/preferences.pngbin0 -> 694 bytes
-rw-r--r--deluge/ui/web/icons/queue.pngbin0 -> 432 bytes
-rw-r--r--deluge/ui/web/icons/queued.pngbin0 -> 410 bytes
-rw-r--r--deluge/ui/web/icons/recheck.pngbin0 -> 557 bytes
-rw-r--r--deluge/ui/web/icons/remove.pngbin0 -> 194 bytes
-rw-r--r--deluge/ui/web/icons/seeding.pngbin0 -> 505 bytes
-rw-r--r--deluge/ui/web/icons/start.pngbin0 -> 358 bytes
-rw-r--r--deluge/ui/web/icons/top.pngbin0 -> 325 bytes
-rw-r--r--deluge/ui/web/icons/traffic.pngbin0 -> 394 bytes
-rw-r--r--deluge/ui/web/icons/up.pngbin0 -> 420 bytes
-rw-r--r--deluge/ui/web/icons/update.pngbin0 -> 675 bytes
-rw-r--r--deluge/ui/web/icons/upload_slots.pngbin0 -> 422 bytes
-rw-r--r--deluge/ui/web/icons/warning.pngbin0 -> 521 bytes
-rw-r--r--deluge/ui/web/images/s.gifbin0 -> 43 bytes
-rw-r--r--deluge/ui/web/images/spinner-split.gifbin0 -> 49 bytes
-rw-r--r--deluge/ui/web/images/spinner.gifbin0 -> 3186 bytes
-rw-r--r--deluge/ui/web/index.html48
-rw-r--r--deluge/ui/web/js/deluge-all-debug.js9868
-rw-r--r--deluge/ui/web/js/deluge-all/.order2
-rw-r--r--deluge/ui/web/js/deluge-all/AboutWindow.js129
-rw-r--r--deluge/ui/web/js/deluge-all/AddConnectionWindow.js117
-rw-r--r--deluge/ui/web/js/deluge-all/AddTrackerWindow.js94
-rw-r--r--deluge/ui/web/js/deluge-all/Client.js199
-rw-r--r--deluge/ui/web/js/deluge-all/ConnectionManager.js429
-rw-r--r--deluge/ui/web/js/deluge-all/Deluge.js186
-rw-r--r--deluge/ui/web/js/deluge-all/EditConnectionWindow.js134
-rw-r--r--deluge/ui/web/js/deluge-all/EditTrackerWindow.js83
-rw-r--r--deluge/ui/web/js/deluge-all/EditTrackersWindow.js239
-rw-r--r--deluge/ui/web/js/deluge-all/EventsManager.js118
-rw-r--r--deluge/ui/web/js/deluge-all/FileBrowser.js43
-rw-r--r--deluge/ui/web/js/deluge-all/FilterPanel.js175
-rw-r--r--deluge/ui/web/js/deluge-all/Formatters.js181
-rw-r--r--deluge/ui/web/js/deluge-all/Keys.js138
-rw-r--r--deluge/ui/web/js/deluge-all/LoginWindow.js134
-rw-r--r--deluge/ui/web/js/deluge-all/Menus.js388
-rw-r--r--deluge/ui/web/js/deluge-all/MoveStorage.js85
-rw-r--r--deluge/ui/web/js/deluge-all/MultiOptionsManager.js218
-rw-r--r--deluge/ui/web/js/deluge-all/OptionsManager.js279
-rw-r--r--deluge/ui/web/js/deluge-all/OtherLimitWindow.js82
-rw-r--r--deluge/ui/web/js/deluge-all/Plugin.js106
-rw-r--r--deluge/ui/web/js/deluge-all/RemoveWindow.js77
-rw-r--r--deluge/ui/web/js/deluge-all/Sidebar.js144
-rw-r--r--deluge/ui/web/js/deluge-all/Statusbar.js362
-rw-r--r--deluge/ui/web/js/deluge-all/StatusbarMenu.js79
-rw-r--r--deluge/ui/web/js/deluge-all/Toolbar.js206
-rw-r--r--deluge/ui/web/js/deluge-all/TorrentGrid.js510
-rw-r--r--deluge/ui/web/js/deluge-all/UI.js292
-rw-r--r--deluge/ui/web/js/deluge-all/add/.order1
-rw-r--r--deluge/ui/web/js/deluge-all/add/AddWindow.js321
-rw-r--r--deluge/ui/web/js/deluge-all/add/FilesTab.js99
-rw-r--r--deluge/ui/web/js/deluge-all/add/Infohash.js10
-rw-r--r--deluge/ui/web/js/deluge-all/add/OptionsPanel.js146
-rw-r--r--deluge/ui/web/js/deluge-all/add/OptionsTab.js217
-rw-r--r--deluge/ui/web/js/deluge-all/add/UrlWindow.js98
-rw-r--r--deluge/ui/web/js/deluge-all/add/Window.js29
-rw-r--r--deluge/ui/web/js/deluge-all/data/.order1
-rw-r--r--deluge/ui/web/js/deluge-all/data/PeerRecord.js53
-rw-r--r--deluge/ui/web/js/deluge-all/data/SortTypes.js37
-rw-r--r--deluge/ui/web/js/deluge-all/data/TorrentRecord.js121
-rw-r--r--deluge/ui/web/js/deluge-all/details/DetailsPanel.js81
-rw-r--r--deluge/ui/web/js/deluge-all/details/DetailsTab.js98
-rw-r--r--deluge/ui/web/js/deluge-all/details/FilesTab.js233
-rw-r--r--deluge/ui/web/js/deluge-all/details/OptionsTab.js417
-rw-r--r--deluge/ui/web/js/deluge-all/details/PeersTab.js166
-rw-r--r--deluge/ui/web/js/deluge-all/details/StatusTab.js155
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js203
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/CachePage.js61
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/DaemonPage.js85
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js124
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js99
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js83
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/InterfacePage.js304
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/NetworkPage.js257
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/OtherPage.js100
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/PluginsPage.js277
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js246
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/ProxyField.js225
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/ProxyPage.js62
-rw-r--r--deluge/ui/web/js/deluge-all/preferences/QueuePage.js234
-rw-r--r--deluge/ui/web/js/extjs/ext-all-debug.js52270
-rw-r--r--deluge/ui/web/js/extjs/ext-all.js21
-rw-r--r--deluge/ui/web/js/extjs/ext-base-debug.js3352
-rw-r--r--deluge/ui/web/js/extjs/ext-base.js21
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions-debug.js2931
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/JSLoader.js40
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/Spinner.js474
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/StatusBar.js422
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/form/FileUploadField.js208
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/form/RadioGroupFix.js50
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/form/SpinnerField.js68
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/form/SpinnerFieldFix.js13
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/form/SpinnerGroup.js206
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/form/ToggleField.js75
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/grid/BufferView.js270
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/layout/FormLayoutFix.js39
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/tree/MultiSelectionModelFix.js68
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/tree/TreeGrid.js468
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridColumnResizer.js123
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridColumns.js40
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridLoader.js18
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridNodeUI.js149
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridNodeUIFix.js33
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridRenderColumn.js9
-rw-r--r--deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridSorter.js158
-rw-r--r--deluge/ui/web/js/gettext.js322
-rw-r--r--deluge/ui/web/json_api.py1019
-rw-r--r--deluge/ui/web/pluginmanager.py161
-rw-r--r--deluge/ui/web/render/404.html10
-rw-r--r--deluge/ui/web/render/tab_status.html29
-rw-r--r--deluge/ui/web/server.py806
-rw-r--r--deluge/ui/web/themes/css/xtheme-access.css1933
-rw-r--r--deluge/ui/web/themes/css/xtheme-blue.css1793
-rw-r--r--deluge/ui/web/themes/css/xtheme-gray.css1791
-rw-r--r--deluge/ui/web/themes/images/access/box/corners-blue.gifbin0 -> 1010 bytes
-rw-r--r--deluge/ui/web/themes/images/access/box/corners.gifbin0 -> 1005 bytes
-rw-r--r--deluge/ui/web/themes/images/access/box/l-blue.gifbin0 -> 810 bytes
-rw-r--r--deluge/ui/web/themes/images/access/box/l.gifbin0 -> 810 bytes
-rw-r--r--deluge/ui/web/themes/images/access/box/r-blue.gifbin0 -> 810 bytes
-rw-r--r--deluge/ui/web/themes/images/access/box/r.gifbin0 -> 810 bytes
-rw-r--r--deluge/ui/web/themes/images/access/box/tb-blue.gifbin0 -> 843 bytes
-rw-r--r--deluge/ui/web/themes/images/access/box/tb.gifbin0 -> 839 bytes
-rw-r--r--deluge/ui/web/themes/images/access/button/arrow.gifbin0 -> 833 bytes
-rw-r--r--deluge/ui/web/themes/images/access/button/btn.gifbin0 -> 2871 bytes
-rw-r--r--deluge/ui/web/themes/images/access/button/group-cs.gifbin0 -> 2459 bytes
-rw-r--r--deluge/ui/web/themes/images/access/button/group-lr.gifbin0 -> 861 bytes
-rw-r--r--deluge/ui/web/themes/images/access/button/group-tb.gifbin0 -> 70 bytes
-rw-r--r--deluge/ui/web/themes/images/access/button/s-arrow-b-noline.gifbin0 -> 904 bytes
-rw-r--r--deluge/ui/web/themes/images/access/button/s-arrow-b.gifbin0 -> 943 bytes
-rw-r--r--deluge/ui/web/themes/images/access/button/s-arrow-bo.gifbin0 -> 961 bytes
-rw-r--r--deluge/ui/web/themes/images/access/button/s-arrow-noline.gifbin0 -> 875 bytes
-rw-r--r--deluge/ui/web/themes/images/access/button/s-arrow-o.gifbin0 -> 155 bytes
-rw-r--r--deluge/ui/web/themes/images/access/button/s-arrow.gifbin0 -> 956 bytes
-rw-r--r--deluge/ui/web/themes/images/access/editor/tb-sprite.gifbin0 -> 1994 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/checkbox.gifbin0 -> 2061 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/clear-trigger.gifbin0 -> 2027 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/clear-trigger.psdbin0 -> 41047 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/date-trigger.gifbin0 -> 1620 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/date-trigger.psdbin0 -> 46095 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/error-tip-corners.gifbin0 -> 4183 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/exclamation.gifbin0 -> 614 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/radio.gifbin0 -> 1746 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/search-trigger.gifbin0 -> 1534 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/search-trigger.psdbin0 -> 49761 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/text-bg.gifbin0 -> 66 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/trigger-tpl.gifbin0 -> 908 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/trigger.gifbin0 -> 1451 bytes
-rw-r--r--deluge/ui/web/themes/images/access/form/trigger.psdbin0 -> 44793 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/arrow-left-white.gifbin0 -> 825 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/arrow-right-white.gifbin0 -> 825 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/col-move-bottom.gifbin0 -> 868 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/col-move-top.gifbin0 -> 869 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/columns.gifbin0 -> 962 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/dirty.gifbin0 -> 68 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/done.gifbin0 -> 133 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/drop-no.gifbin0 -> 947 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/drop-yes.gifbin0 -> 860 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/footer-bg.gifbin0 -> 834 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/grid-blue-hd.gifbin0 -> 829 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/grid-blue-split.gifbin0 -> 47 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/grid-hrow.gifbin0 -> 855 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/grid-loading.gifbin0 -> 701 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/grid-split.gifbin0 -> 817 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/grid-vista-hd.gifbin0 -> 829 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/grid3-hd-btn.gifbin0 -> 419 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/grid3-hrow-over.gifbin0 -> 268 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/grid3-hrow.gifbin0 -> 164 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/grid3-special-col-bg.gifbin0 -> 162 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/grid3-special-col-sel-bg.gifbin0 -> 162 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/group-by.gifbin0 -> 917 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/group-collapse.gifbin0 -> 77 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/group-expand-sprite.gifbin0 -> 131 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/group-expand.gifbin0 -> 82 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/hd-pop.gifbin0 -> 839 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/hmenu-asc.gifbin0 -> 931 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/hmenu-desc.gifbin0 -> 930 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/hmenu-lock.gifbin0 -> 955 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/hmenu-lock.pngbin0 -> 484 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/hmenu-unlock.gifbin0 -> 971 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/hmenu-unlock.pngbin0 -> 548 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/invalid_line.gifbin0 -> 46 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/loading.gifbin0 -> 771 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/mso-hd.gifbin0 -> 875 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/nowait.gifbin0 -> 884 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/page-first-disabled.gifbin0 -> 340 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/page-first.gifbin0 -> 96 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/page-last-disabled.gifbin0 -> 340 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/page-last.gifbin0 -> 96 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/page-next-disabled.gifbin0 -> 195 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/page-next.gifbin0 -> 82 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/page-prev-disabled.gifbin0 -> 197 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/page-prev.gifbin0 -> 82 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/pick-button.gifbin0 -> 1036 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/refresh.gifbin0 -> 91 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/row-check-sprite.gifbin0 -> 1083 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/row-expand-sprite.gifbin0 -> 955 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/row-over.gifbin0 -> 823 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/row-sel.gifbin0 -> 823 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/sort-hd.gifbin0 -> 2075 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/sort_asc.gifbin0 -> 74 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/sort_desc.gifbin0 -> 73 bytes
-rw-r--r--deluge/ui/web/themes/images/access/grid/wait.gifbin0 -> 1100 bytes
-rw-r--r--deluge/ui/web/themes/images/access/menu/checked.gifbin0 -> 959 bytes
-rw-r--r--deluge/ui/web/themes/images/access/menu/group-checked.gifbin0 -> 856 bytes
-rw-r--r--deluge/ui/web/themes/images/access/menu/item-over.gifbin0 -> 820 bytes
-rw-r--r--deluge/ui/web/themes/images/access/menu/menu-parent.gifbin0 -> 73 bytes
-rw-r--r--deluge/ui/web/themes/images/access/menu/menu.gifbin0 -> 826 bytes
-rw-r--r--deluge/ui/web/themes/images/access/menu/unchecked.gifbin0 -> 941 bytes
-rw-r--r--deluge/ui/web/themes/images/access/panel/corners-sprite.gifbin0 -> 577 bytes
-rw-r--r--deluge/ui/web/themes/images/access/panel/left-right.gifbin0 -> 52 bytes
-rw-r--r--deluge/ui/web/themes/images/access/panel/light-hd.gifbin0 -> 161 bytes
-rw-r--r--deluge/ui/web/themes/images/access/panel/tool-sprite-tpl.gifbin0 -> 971 bytes
-rw-r--r--deluge/ui/web/themes/images/access/panel/tool-sprites.gifbin0 -> 1981 bytes
-rw-r--r--deluge/ui/web/themes/images/access/panel/tools-sprites-trans.gifbin0 -> 2843 bytes
-rw-r--r--deluge/ui/web/themes/images/access/panel/top-bottom.gifbin0 -> 116 bytes
-rw-r--r--deluge/ui/web/themes/images/access/panel/white-corners-sprite.gifbin0 -> 1366 bytes
-rw-r--r--deluge/ui/web/themes/images/access/panel/white-left-right.gifbin0 -> 52 bytes
-rw-r--r--deluge/ui/web/themes/images/access/panel/white-top-bottom.gifbin0 -> 115 bytes
-rw-r--r--deluge/ui/web/themes/images/access/progress/progress-bg.gifbin0 -> 151 bytes
-rw-r--r--deluge/ui/web/themes/images/access/qtip/close.gifbin0 -> 972 bytes
-rw-r--r--deluge/ui/web/themes/images/access/qtip/tip-anchor-sprite.gifbin0 -> 951 bytes
-rw-r--r--deluge/ui/web/themes/images/access/qtip/tip-sprite.gifbin0 -> 3376 bytes
-rw-r--r--deluge/ui/web/themes/images/access/shared/glass-bg.gifbin0 -> 103 bytes
-rw-r--r--deluge/ui/web/themes/images/access/shared/hd-sprite.gifbin0 -> 673 bytes
-rw-r--r--deluge/ui/web/themes/images/access/shared/left-btn.gifbin0 -> 77 bytes
-rw-r--r--deluge/ui/web/themes/images/access/shared/right-btn.gifbin0 -> 79 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/e-handle-dark.gifbin0 -> 248 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/e-handle.gifbin0 -> 753 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/ne-handle-dark.gifbin0 -> 66 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/ne-handle.gifbin0 -> 115 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/nw-handle-dark.gifbin0 -> 66 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/nw-handle.gifbin0 -> 114 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/s-handle-dark.gifbin0 -> 246 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/s-handle.gifbin0 -> 494 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/se-handle-dark.gifbin0 -> 65 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/se-handle.gifbin0 -> 114 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/square.gifbin0 -> 123 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/sw-handle-dark.gifbin0 -> 66 bytes
-rw-r--r--deluge/ui/web/themes/images/access/sizer/sw-handle.gifbin0 -> 116 bytes
-rw-r--r--deluge/ui/web/themes/images/access/slider/slider-bg.pngbin0 -> 185 bytes
-rw-r--r--deluge/ui/web/themes/images/access/slider/slider-thumb.pngbin0 -> 512 bytes
-rw-r--r--deluge/ui/web/themes/images/access/slider/slider-v-bg.pngbin0 -> 154 bytes
-rw-r--r--deluge/ui/web/themes/images/access/slider/slider-v-thumb.pngbin0 -> 481 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tabs/scroll-left.gifbin0 -> 996 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tabs/scroll-right.gifbin0 -> 999 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tabs/tab-btm-inactive-left-bg.gifbin0 -> 130 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tabs/tab-btm-inactive-right-bg.gifbin0 -> 513 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tabs/tab-btm-left-bg.gifbin0 -> 512 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tabs/tab-btm-right-bg.gifbin0 -> 117 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tabs/tab-close.gifbin0 -> 76 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tabs/tab-strip-bg.gifbin0 -> 827 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tabs/tab-strip-btm-bg.gifbin0 -> 70 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tabs/tabs-sprite.gifbin0 -> 1221 bytes
-rw-r--r--deluge/ui/web/themes/images/access/toolbar/bg.gifbin0 -> 82 bytes
-rw-r--r--deluge/ui/web/themes/images/access/toolbar/btn-arrow-light.gifbin0 -> 916 bytes
-rw-r--r--deluge/ui/web/themes/images/access/toolbar/btn-arrow.gifbin0 -> 919 bytes
-rw-r--r--deluge/ui/web/themes/images/access/toolbar/btn-over-bg.gifbin0 -> 837 bytes
-rw-r--r--deluge/ui/web/themes/images/access/toolbar/gray-bg.gifbin0 -> 832 bytes
-rw-r--r--deluge/ui/web/themes/images/access/toolbar/more.gifbin0 -> 67 bytes
-rw-r--r--deluge/ui/web/themes/images/access/toolbar/s-arrow-bo.gifbin0 -> 186 bytes
-rw-r--r--deluge/ui/web/themes/images/access/toolbar/tb-btn-sprite.gifbin0 -> 1127 bytes
-rw-r--r--deluge/ui/web/themes/images/access/toolbar/tb-xl-btn-sprite.gifbin0 -> 1663 bytes
-rw-r--r--deluge/ui/web/themes/images/access/toolbar/tb-xl-sep.gifbin0 -> 810 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/arrows.gifbin0 -> 183 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/drop-add.gifbin0 -> 1001 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/drop-between.gifbin0 -> 907 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/drop-no.gifbin0 -> 949 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/drop-over.gifbin0 -> 911 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/drop-under.gifbin0 -> 911 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/drop-yes.gifbin0 -> 1016 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/elbow-end-minus-nl.gifbin0 -> 86 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/elbow-end-minus.gifbin0 -> 104 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/elbow-end-plus-nl.gifbin0 -> 89 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/elbow-end-plus.gifbin0 -> 108 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/elbow-end.gifbin0 -> 844 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/elbow-line.gifbin0 -> 846 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/elbow-minus-nl.gifbin0 -> 86 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/elbow-minus.gifbin0 -> 106 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/elbow-plus-nl.gifbin0 -> 89 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/elbow-plus.gifbin0 -> 111 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/elbow.gifbin0 -> 850 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/folder-open.gifbin0 -> 342 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/folder.gifbin0 -> 340 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/leaf.gifbin0 -> 945 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/loading.gifbin0 -> 771 bytes
-rw-r--r--deluge/ui/web/themes/images/access/tree/s.gifbin0 -> 43 bytes
-rw-r--r--deluge/ui/web/themes/images/access/window/icon-error.gifbin0 -> 256 bytes
-rw-r--r--deluge/ui/web/themes/images/access/window/icon-info.gifbin0 -> 172 bytes
-rw-r--r--deluge/ui/web/themes/images/access/window/icon-question.gifbin0 -> 217 bytes
-rw-r--r--deluge/ui/web/themes/images/access/window/icon-warning.gifbin0 -> 173 bytes
-rw-r--r--deluge/ui/web/themes/images/access/window/left-corners.pngbin0 -> 137 bytes
-rw-r--r--deluge/ui/web/themes/images/access/window/left-right.pngbin0 -> 83 bytes
-rw-r--r--deluge/ui/web/themes/images/access/window/right-corners.pngbin0 -> 138 bytes
-rw-r--r--deluge/ui/web/themes/images/access/window/top-bottom.pngbin0 -> 105 bytes
-rw-r--r--deluge/ui/web/themes/images/default/box/corners-blue.gifbin0 -> 1010 bytes
-rw-r--r--deluge/ui/web/themes/images/default/box/corners.gifbin0 -> 1005 bytes
-rw-r--r--deluge/ui/web/themes/images/default/box/l-blue.gifbin0 -> 810 bytes
-rw-r--r--deluge/ui/web/themes/images/default/box/l.gifbin0 -> 810 bytes
-rw-r--r--deluge/ui/web/themes/images/default/box/r-blue.gifbin0 -> 810 bytes
-rw-r--r--deluge/ui/web/themes/images/default/box/r.gifbin0 -> 810 bytes
-rw-r--r--deluge/ui/web/themes/images/default/box/tb-blue.gifbin0 -> 851 bytes
-rw-r--r--deluge/ui/web/themes/images/default/box/tb.gifbin0 -> 839 bytes
-rw-r--r--deluge/ui/web/themes/images/default/button/arrow.gifbin0 -> 828 bytes
-rw-r--r--deluge/ui/web/themes/images/default/button/btn.gifbin0 -> 4298 bytes
-rw-r--r--deluge/ui/web/themes/images/default/button/group-cs.gifbin0 -> 2459 bytes
-rw-r--r--deluge/ui/web/themes/images/default/button/group-lr.gifbin0 -> 861 bytes
-rw-r--r--deluge/ui/web/themes/images/default/button/group-tb.gifbin0 -> 846 bytes
-rw-r--r--deluge/ui/web/themes/images/default/button/s-arrow-b-noline.gifbin0 -> 898 bytes
-rw-r--r--deluge/ui/web/themes/images/default/button/s-arrow-b.gifbin0 -> 937 bytes
-rw-r--r--deluge/ui/web/themes/images/default/button/s-arrow-bo.gifbin0 -> 139 bytes
-rw-r--r--deluge/ui/web/themes/images/default/button/s-arrow-noline.gifbin0 -> 863 bytes
-rw-r--r--deluge/ui/web/themes/images/default/button/s-arrow-o.gifbin0 -> 937 bytes
-rw-r--r--deluge/ui/web/themes/images/default/button/s-arrow.gifbin0 -> 937 bytes
-rw-r--r--deluge/ui/web/themes/images/default/dd/drop-add.gifbin0 -> 1001 bytes
-rw-r--r--deluge/ui/web/themes/images/default/dd/drop-no.gifbin0 -> 949 bytes
-rw-r--r--deluge/ui/web/themes/images/default/dd/drop-yes.gifbin0 -> 1016 bytes
-rw-r--r--deluge/ui/web/themes/images/default/editor/tb-sprite.gifbin0 -> 2072 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/checkbox.gifbin0 -> 2061 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/clear-trigger.gifbin0 -> 1988 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/clear-trigger.psdbin0 -> 11804 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/date-trigger.gifbin0 -> 1603 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/date-trigger.psdbin0 -> 12377 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/error-tip-corners.gifbin0 -> 4183 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/exclamation.gifbin0 -> 996 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/radio.gifbin0 -> 1746 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/search-trigger.gifbin0 -> 2182 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/search-trigger.psdbin0 -> 15601 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/text-bg.gifbin0 -> 819 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/trigger-square.gifbin0 -> 1810 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/trigger-square.psdbin0 -> 36542 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/trigger-tpl.gifbin0 -> 1487 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/trigger.gifbin0 -> 1816 bytes
-rw-r--r--deluge/ui/web/themes/images/default/form/trigger.psdbin0 -> 37599 bytes
-rw-r--r--deluge/ui/web/themes/images/default/gradient-bg.gifbin0 -> 1472 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/arrow-left-white.gifbin0 -> 825 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/arrow-right-white.gifbin0 -> 825 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/col-move-bottom.gifbin0 -> 868 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/col-move-top.gifbin0 -> 869 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/columns.gifbin0 -> 962 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/dirty.gifbin0 -> 832 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/done.gifbin0 -> 133 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/drop-no.gifbin0 -> 947 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/drop-yes.gifbin0 -> 860 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/footer-bg.gifbin0 -> 834 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/grid-blue-hd.gifbin0 -> 829 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/grid-blue-split.gifbin0 -> 817 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/grid-hrow.gifbin0 -> 855 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/grid-loading.gifbin0 -> 701 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/grid-split.gifbin0 -> 817 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/grid-vista-hd.gifbin0 -> 829 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/grid3-hd-btn.gifbin0 -> 1229 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/grid3-hrow-over.gifbin0 -> 823 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/grid3-hrow.gifbin0 -> 836 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/grid3-rowheader.gifbin0 -> 43 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/grid3-special-col-bg.gifbin0 -> 837 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/grid3-special-col-sel-bg.gifbin0 -> 843 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/group-by.gifbin0 -> 917 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/group-collapse.gifbin0 -> 881 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/group-expand-sprite.gifbin0 -> 955 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/group-expand.gifbin0 -> 884 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/hd-pop.gifbin0 -> 839 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/hmenu-asc.gifbin0 -> 931 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/hmenu-desc.gifbin0 -> 930 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/hmenu-lock.gifbin0 -> 955 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/hmenu-lock.pngbin0 -> 484 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/hmenu-unlock.gifbin0 -> 971 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/hmenu-unlock.pngbin0 -> 548 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/invalid_line.gifbin0 -> 815 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/loading.gifbin0 -> 771 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/mso-hd.gifbin0 -> 875 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/nowait.gifbin0 -> 884 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/page-first-disabled.gifbin0 -> 925 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/page-first.gifbin0 -> 925 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/page-last-disabled.gifbin0 -> 923 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/page-last.gifbin0 -> 923 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/page-next-disabled.gifbin0 -> 875 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/page-next.gifbin0 -> 875 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/page-prev-disabled.gifbin0 -> 879 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/page-prev.gifbin0 -> 879 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/pick-button.gifbin0 -> 1036 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/refresh-disabled.gifbin0 -> 577 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/refresh.gifbin0 -> 977 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/row-check-sprite.gifbin0 -> 1083 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/row-expand-sprite.gifbin0 -> 955 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/row-over.gifbin0 -> 823 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/row-sel.gifbin0 -> 823 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/sort-hd.gifbin0 -> 1473 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/sort_asc.gifbin0 -> 830 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/sort_desc.gifbin0 -> 833 bytes
-rw-r--r--deluge/ui/web/themes/images/default/grid/wait.gifbin0 -> 1100 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/collapse.gifbin0 -> 842 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/expand.gifbin0 -> 842 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/gradient-bg.gifbin0 -> 1472 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/mini-bottom.gifbin0 -> 856 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/mini-left.gifbin0 -> 871 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/mini-right.gifbin0 -> 872 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/mini-top.gifbin0 -> 856 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/ns-collapse.gifbin0 -> 842 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/ns-expand.gifbin0 -> 843 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/panel-close.gifbin0 -> 829 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/panel-title-bg.gifbin0 -> 838 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/panel-title-light-bg.gifbin0 -> 835 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/stick.gifbin0 -> 874 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/stuck.gifbin0 -> 92 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/tab-close-on.gifbin0 -> 880 bytes
-rw-r--r--deluge/ui/web/themes/images/default/layout/tab-close.gifbin0 -> 859 bytes
-rw-r--r--deluge/ui/web/themes/images/default/menu/checked.gifbin0 -> 959 bytes
-rw-r--r--deluge/ui/web/themes/images/default/menu/group-checked.gifbin0 -> 891 bytes
-rw-r--r--deluge/ui/web/themes/images/default/menu/item-over.gifbin0 -> 820 bytes
-rw-r--r--deluge/ui/web/themes/images/default/menu/menu-parent.gifbin0 -> 854 bytes
-rw-r--r--deluge/ui/web/themes/images/default/menu/menu.gifbin0 -> 834 bytes
-rw-r--r--deluge/ui/web/themes/images/default/menu/unchecked.gifbin0 -> 941 bytes
-rw-r--r--deluge/ui/web/themes/images/default/panel/corners-sprite.gifbin0 -> 1418 bytes
-rw-r--r--deluge/ui/web/themes/images/default/panel/left-right.gifbin0 -> 815 bytes
-rw-r--r--deluge/ui/web/themes/images/default/panel/light-hd.gifbin0 -> 827 bytes
-rw-r--r--deluge/ui/web/themes/images/default/panel/tool-sprite-tpl.gifbin0 -> 971 bytes
-rw-r--r--deluge/ui/web/themes/images/default/panel/tool-sprites.gifbin0 -> 5421 bytes
-rw-r--r--deluge/ui/web/themes/images/default/panel/tools-sprites-trans.gifbin0 -> 2843 bytes
-rw-r--r--deluge/ui/web/themes/images/default/panel/top-bottom.gifbin0 -> 875 bytes
-rw-r--r--deluge/ui/web/themes/images/default/panel/top-bottom.pngbin0 -> 160 bytes
-rw-r--r--deluge/ui/web/themes/images/default/panel/white-corners-sprite.gifbin0 -> 1366 bytes
-rw-r--r--deluge/ui/web/themes/images/default/panel/white-left-right.gifbin0 -> 815 bytes
-rw-r--r--deluge/ui/web/themes/images/default/panel/white-top-bottom.gifbin0 -> 872 bytes
-rw-r--r--deluge/ui/web/themes/images/default/progress/progress-bg.gifbin0 -> 834 bytes
-rw-r--r--deluge/ui/web/themes/images/default/qtip/bg.gifbin0 -> 1091 bytes
-rw-r--r--deluge/ui/web/themes/images/default/qtip/close.gifbin0 -> 972 bytes
-rw-r--r--deluge/ui/web/themes/images/default/qtip/tip-anchor-sprite.gifbin0 -> 951 bytes
-rw-r--r--deluge/ui/web/themes/images/default/qtip/tip-sprite.gifbin0 -> 4271 bytes
-rw-r--r--deluge/ui/web/themes/images/default/s.gifbin0 -> 43 bytes
-rw-r--r--deluge/ui/web/themes/images/default/shadow-c.pngbin0 -> 71 bytes
-rw-r--r--deluge/ui/web/themes/images/default/shadow-lr.pngbin0 -> 88 bytes
-rw-r--r--deluge/ui/web/themes/images/default/shadow.pngbin0 -> 223 bytes
-rw-r--r--deluge/ui/web/themes/images/default/shared/blue-loading.gifbin0 -> 3236 bytes
-rw-r--r--deluge/ui/web/themes/images/default/shared/calendar.gifbin0 -> 979 bytes
-rw-r--r--deluge/ui/web/themes/images/default/shared/glass-bg.gifbin0 -> 873 bytes
-rw-r--r--deluge/ui/web/themes/images/default/shared/hd-sprite.gifbin0 -> 1099 bytes
-rw-r--r--deluge/ui/web/themes/images/default/shared/large-loading.gifbin0 -> 3236 bytes
-rw-r--r--deluge/ui/web/themes/images/default/shared/left-btn.gifbin0 -> 870 bytes
-rw-r--r--deluge/ui/web/themes/images/default/shared/loading-balls.gifbin0 -> 2118 bytes
-rw-r--r--deluge/ui/web/themes/images/default/shared/right-btn.gifbin0 -> 871 bytes
-rw-r--r--deluge/ui/web/themes/images/default/shared/warning.gifbin0 -> 960 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/e-handle-dark.gifbin0 -> 1062 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/e-handle.gifbin0 -> 1586 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/ne-handle-dark.gifbin0 -> 839 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/ne-handle.gifbin0 -> 854 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/nw-handle-dark.gifbin0 -> 839 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/nw-handle.gifbin0 -> 853 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/s-handle-dark.gifbin0 -> 1060 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/s-handle.gifbin0 -> 1318 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/se-handle-dark.gifbin0 -> 838 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/se-handle.gifbin0 -> 853 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/square.gifbin0 -> 864 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/sw-handle-dark.gifbin0 -> 839 bytes
-rw-r--r--deluge/ui/web/themes/images/default/sizer/sw-handle.gifbin0 -> 855 bytes
-rw-r--r--deluge/ui/web/themes/images/default/slider/slider-bg.pngbin0 -> 191 bytes
-rw-r--r--deluge/ui/web/themes/images/default/slider/slider-thumb.pngbin0 -> 626 bytes
-rw-r--r--deluge/ui/web/themes/images/default/slider/slider-v-bg.pngbin0 -> 161 bytes
-rw-r--r--deluge/ui/web/themes/images/default/slider/slider-v-thumb.pngbin0 -> 601 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/scroll-left.gifbin0 -> 1295 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/scroll-right.gifbin0 -> 1300 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/scroller-bg.gifbin0 -> 1100 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/tab-btm-inactive-left-bg.gifbin0 -> 886 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/tab-btm-inactive-right-bg.gifbin0 -> 1386 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/tab-btm-left-bg.gifbin0 -> 1402 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/tab-btm-over-left-bg.gifbin0 -> 191 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/tab-btm-over-right-bg.gifbin0 -> 638 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/tab-btm-right-bg.gifbin0 -> 863 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/tab-close.gifbin0 -> 896 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/tab-strip-bg.gifbin0 -> 835 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/tab-strip-bg.pngbin0 -> 95 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/tab-strip-btm-bg.gifbin0 -> 826 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tabs/tabs-sprite.gifbin0 -> 2120 bytes
-rw-r--r--deluge/ui/web/themes/images/default/toolbar/bg.gifbin0 -> 904 bytes
-rw-r--r--deluge/ui/web/themes/images/default/toolbar/btn-arrow-light.gifbin0 -> 916 bytes
-rw-r--r--deluge/ui/web/themes/images/default/toolbar/btn-arrow.gifbin0 -> 919 bytes
-rw-r--r--deluge/ui/web/themes/images/default/toolbar/btn-over-bg.gifbin0 -> 837 bytes
-rw-r--r--deluge/ui/web/themes/images/default/toolbar/gray-bg.gifbin0 -> 832 bytes
-rw-r--r--deluge/ui/web/themes/images/default/toolbar/more.gifbin0 -> 845 bytes
-rw-r--r--deluge/ui/web/themes/images/default/toolbar/tb-bg.gifbin0 -> 862 bytes
-rw-r--r--deluge/ui/web/themes/images/default/toolbar/tb-btn-sprite.gifbin0 -> 1127 bytes
-rw-r--r--deluge/ui/web/themes/images/default/toolbar/tb-xl-btn-sprite.gifbin0 -> 1663 bytes
-rw-r--r--deluge/ui/web/themes/images/default/toolbar/tb-xl-sep.gifbin0 -> 810 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/arrows.gifbin0 -> 617 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/drop-add.gifbin0 -> 1001 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/drop-between.gifbin0 -> 907 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/drop-no.gifbin0 -> 949 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/drop-over.gifbin0 -> 911 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/drop-under.gifbin0 -> 911 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/drop-yes.gifbin0 -> 1016 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/elbow-end-minus-nl.gifbin0 -> 898 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/elbow-end-minus.gifbin0 -> 905 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/elbow-end-plus-nl.gifbin0 -> 900 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/elbow-end-plus.gifbin0 -> 907 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/elbow-end.gifbin0 -> 844 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/elbow-line.gifbin0 -> 846 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/elbow-minus-nl.gifbin0 -> 898 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/elbow-minus.gifbin0 -> 908 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/elbow-plus-nl.gifbin0 -> 900 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/elbow-plus.gifbin0 -> 910 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/elbow.gifbin0 -> 850 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/folder-open.gifbin0 -> 956 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/folder.gifbin0 -> 952 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/leaf.gifbin0 -> 945 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/loading.gifbin0 -> 771 bytes
-rw-r--r--deluge/ui/web/themes/images/default/tree/s.gifbin0 -> 43 bytes
-rw-r--r--deluge/ui/web/themes/images/default/window/icon-error.gifbin0 -> 1669 bytes
-rw-r--r--deluge/ui/web/themes/images/default/window/icon-info.gifbin0 -> 1586 bytes
-rw-r--r--deluge/ui/web/themes/images/default/window/icon-question.gifbin0 -> 1607 bytes
-rw-r--r--deluge/ui/web/themes/images/default/window/icon-warning.gifbin0 -> 1483 bytes
-rw-r--r--deluge/ui/web/themes/images/default/window/left-corners.pngbin0 -> 137 bytes
-rw-r--r--deluge/ui/web/themes/images/default/window/left-corners.psdbin0 -> 15576 bytes
-rw-r--r--deluge/ui/web/themes/images/default/window/left-right.pngbin0 -> 84 bytes
-rw-r--r--deluge/ui/web/themes/images/default/window/left-right.psdbin0 -> 24046 bytes
-rw-r--r--deluge/ui/web/themes/images/default/window/right-corners.pngbin0 -> 138 bytes
-rw-r--r--deluge/ui/web/themes/images/default/window/right-corners.psdbin0 -> 15530 bytes
-rw-r--r--deluge/ui/web/themes/images/default/window/top-bottom.pngbin0 -> 119 bytes
-rw-r--r--deluge/ui/web/themes/images/default/window/top-bottom.psdbin0 -> 32128 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/button/btn-arrow.gifbin0 -> 870 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/button/btn-sprite.gifbin0 -> 1222 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/button/btn.gifbin0 -> 3319 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/button/group-cs.gifbin0 -> 2459 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/button/group-lr.gifbin0 -> 861 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/button/group-tb.gifbin0 -> 846 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/button/s-arrow-bo.gifbin0 -> 123 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/button/s-arrow-o.gifbin0 -> 139 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/form/clear-trigger.gifbin0 -> 1425 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/form/date-trigger.gifbin0 -> 929 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/form/search-trigger.gifbin0 -> 2220 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/form/trigger-square.gifbin0 -> 1071 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/form/trigger.gifbin0 -> 1080 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/gradient-bg.gifbin0 -> 1472 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/col-move-bottom.gifbin0 -> 177 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/col-move-top.gifbin0 -> 178 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/grid3-hd-btn.gifbin0 -> 482 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/grid3-hrow-over.gifbin0 -> 56 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/grid3-hrow-over2.gifbin0 -> 107 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/grid3-hrow.gifbin0 -> 836 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/grid3-hrow2.gifbin0 -> 107 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/grid3-special-col-bg.gifbin0 -> 158 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/grid3-special-col-bg2.gifbin0 -> 158 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/grid3-special-col-sel-bg.gifbin0 -> 158 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/group-collapse.gifbin0 -> 136 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/group-expand-sprite.gifbin0 -> 196 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/group-expand.gifbin0 -> 138 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/page-first.gifbin0 -> 327 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/page-last.gifbin0 -> 325 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/page-next.gifbin0 -> 183 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/page-prev.gifbin0 -> 186 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/refresh.gifbin0 -> 570 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/row-expand-sprite.gifbin0 -> 196 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/sort-hd.gifbin0 -> 2731 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/sort_asc.gifbin0 -> 59 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/grid/sort_desc.gifbin0 -> 59 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/menu/group-checked.gifbin0 -> 295 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/menu/item-over-disabled.gifbin0 -> 49 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/menu/item-over.gifbin0 -> 850 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/menu/menu-parent.gifbin0 -> 165 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/panel/corners-sprite.gifbin0 -> 1402 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/panel/left-right.gifbin0 -> 815 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/panel/light-hd.gifbin0 -> 827 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/panel/tool-sprite-tpl.gifbin0 -> 971 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/panel/tool-sprites.gifbin0 -> 5835 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/panel/tools-sprites-trans.gifbin0 -> 1981 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/panel/top-bottom.gifbin0 -> 871 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/panel/top-bottom.pngbin0 -> 160 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/panel/white-corners-sprite.gifbin0 -> 1365 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/panel/white-left-right.gifbin0 -> 815 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/panel/white-top-bottom.gifbin0 -> 860 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/progress/progress-bg.gifbin0 -> 107 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/qtip/bg.gifbin0 -> 1024 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/qtip/close.gifbin0 -> 972 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/qtip/tip-anchor-sprite.gifbin0 -> 164 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/qtip/tip-sprite.gifbin0 -> 3241 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/s.gifbin0 -> 43 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/shared/hd-sprite.gifbin0 -> 305 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/shared/left-btn.gifbin0 -> 106 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/shared/right-btn.gifbin0 -> 107 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/sizer/e-handle.gifbin0 -> 753 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/sizer/ne-handle.gifbin0 -> 128 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/sizer/nw-handle.gifbin0 -> 114 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/sizer/s-handle.gifbin0 -> 494 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/sizer/se-handle.gifbin0 -> 114 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/sizer/square.gifbin0 -> 123 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/sizer/sw-handle.gifbin0 -> 116 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/slider/slider-thumb.pngbin0 -> 376 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/slider/slider-v-thumb.pngbin0 -> 333 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/scroll-left.gifbin0 -> 1260 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/scroll-right.gifbin0 -> 1269 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/scroller-bg.gifbin0 -> 1090 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/tab-btm-inactive-left-bg.gifbin0 -> 881 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/tab-btm-inactive-right-bg.gifbin0 -> 1383 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/tab-btm-left-bg.gifbin0 -> 1402 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/tab-btm-over-left-bg.gifbin0 -> 189 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/tab-btm-over-right-bg.gifbin0 -> 635 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/tab-btm-right-bg.gifbin0 -> 863 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/tab-close.gifbin0 -> 896 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/tab-strip-bg.gifbin0 -> 835 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/tab-strip-bg.pngbin0 -> 95 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/tab-strip-btm-bg.gifbin0 -> 826 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tabs/tabs-sprite.gifbin0 -> 2109 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/toolbar/bg.gifbin0 -> 854 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/toolbar/btn-arrow-light.gifbin0 -> 916 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/toolbar/btn-arrow.gifbin0 -> 919 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/toolbar/btn-over-bg.gifbin0 -> 837 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/toolbar/gray-bg.gifbin0 -> 815 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/toolbar/more.gifbin0 -> 67 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/toolbar/tb-bg.gifbin0 -> 862 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/toolbar/tb-btn-sprite.gifbin0 -> 1021 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tree/arrows.gifbin0 -> 407 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tree/elbow-end-minus-nl.gifbin0 -> 149 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tree/elbow-end-minus.gifbin0 -> 154 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tree/elbow-end-plus-nl.gifbin0 -> 151 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/tree/elbow-end-plus.gifbin0 -> 156 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/window/icon-error.gifbin0 -> 1669 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/window/icon-info.gifbin0 -> 1586 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/window/icon-question.gifbin0 -> 1607 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/window/icon-warning.gifbin0 -> 1483 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/window/left-corners.pngbin0 -> 205 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/window/left-right.pngbin0 -> 75 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/window/right-corners.pngbin0 -> 204 bytes
-rw-r--r--deluge/ui/web/themes/images/gray/window/top-bottom.pngbin0 -> 108 bytes
-rw-r--r--deluge/ui/web/web.py91
1366 files changed, 508400 insertions, 0 deletions
diff --git a/deluge/__init__.py b/deluge/__init__.py
new file mode 100644
index 0000000..1836ded
--- /dev/null
+++ b/deluge/__init__.py
@@ -0,0 +1 @@
+"""Deluge"""
diff --git a/deluge/_libtorrent.py b/deluge/_libtorrent.py
new file mode 100644
index 0000000..f155fee
--- /dev/null
+++ b/deluge/_libtorrent.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""
+This module is used to handle the importing of libtorrent and also controls
+the minimum versions of libtorrent that this version of Deluge supports.
+
+Example:
+ >>> from deluge._libtorrent import lt
+
+"""
+from __future__ import unicode_literals
+
+from deluge.common import VersionSplit, get_version
+
+try:
+ import deluge.libtorrent as lt
+except ImportError:
+ import libtorrent as lt
+
+REQUIRED_VERSION = '1.1.2.0'
+LT_VERSION = lt.__version__
+
+if VersionSplit(LT_VERSION) < VersionSplit(REQUIRED_VERSION):
+ raise ImportError(
+ 'Deluge %s requires libtorrent >= %s' % (get_version(), REQUIRED_VERSION)
+ )
diff --git a/deluge/argparserbase.py b/deluge/argparserbase.py
new file mode 100644
index 0000000..3952e1e
--- /dev/null
+++ b/deluge/argparserbase.py
@@ -0,0 +1,387 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import argparse
+import logging
+import os
+import platform
+import sys
+import textwrap
+
+import deluge.log
+from deluge import common
+from deluge.configmanager import get_config_dir, set_config_dir
+
+
+def find_subcommand(self, args=None, sys_argv=True):
+ """Find if a subcommand has been supplied.
+
+ Args:
+ args (list, optional): The argument list to search through.
+ sys_argv (bool): Use sys.argv[1:] if args is None.
+
+ Returns:
+ int: Index of the subcommand or '-1' if none found.
+
+ """
+ subcommand_found = -1
+ if args is None:
+ args = sys.argv[1:] if sys_argv is None else []
+
+ for x in self._subparsers._actions:
+ if not isinstance(x, argparse._SubParsersAction):
+ continue
+ for sp_name in x._name_parser_map:
+ if sp_name in args:
+ subcommand_found = args.index(sp_name)
+
+ return subcommand_found
+
+
+def set_default_subparser(self, name, abort_opts=None):
+ """Sets the default argparse subparser.
+
+ Args:
+ name (str): The name of the default subparser.
+ abort_opts (list): The arguments to test for in case no subcommand is found.
+ If any of the values are found, the default subparser will
+ not be inserted into sys.argv.
+
+ Returns:
+ list: The arguments found in sys.argv if no subcommand found, else None
+
+ """
+ found_abort_opts = []
+ abort_opts = [] if abort_opts is None else abort_opts
+ test_args = sys.argv[1:]
+ subparser_found = self.find_subcommand(args=test_args)
+
+ for i, arg in enumerate(test_args):
+ if subparser_found == i:
+ break
+ if arg in abort_opts:
+ found_abort_opts.append(arg)
+
+ if subparser_found == -1:
+ if found_abort_opts:
+ # Found one or more of arguments in abort_opts
+ return found_abort_opts
+
+ # insert default in first position, this implies no
+ # global options without a sub_parsers specified
+ sys.argv.insert(1, name)
+
+ return None
+
+
+argparse.ArgumentParser.find_subcommand = find_subcommand
+argparse.ArgumentParser.set_default_subparser = set_default_subparser
+
+
+def _get_version_detail():
+ version_str = '%s\n' % (common.get_version())
+ try:
+ from deluge._libtorrent import LT_VERSION
+
+ version_str += 'libtorrent: %s\n' % LT_VERSION
+ except ImportError:
+ pass
+ version_str += 'Python: %s\n' % platform.python_version()
+ version_str += 'OS: %s %s\n' % (platform.system(), common.get_os_version())
+ return version_str
+
+
+class DelugeTextHelpFormatter(argparse.RawDescriptionHelpFormatter):
+ """Help message formatter which retains formatting of all help text."""
+
+ def _split_lines(self, text, width):
+ """
+ Do not remove whitespaces in string but still wrap text to max width.
+ Instead of passing the entire text to textwrap.wrap, split and pass each
+ line instead. This way list formatting is not mangled by textwrap.wrap.
+ """
+ wrapped_lines = []
+ for l in text.splitlines():
+ wrapped_lines.extend(textwrap.wrap(l, width, subsequent_indent=' '))
+ return wrapped_lines
+
+ def _format_action_invocation(self, action):
+ """
+ Combines the options with comma and displays the argument
+ value only once instead of after both options.
+ Instead of: -s <arg>, --long-opt <arg>
+ Show : -s, --long-opt <arg>
+
+ """
+ if not action.option_strings:
+ metavar, = self._metavar_formatter(action, action.dest)(1)
+ return metavar
+ else:
+ parts = []
+ # if the Optional doesn't take a value, format is:
+ # -s, --long
+ if action.nargs == 0:
+ parts.extend(action.option_strings)
+
+ # if the Optional takes a value, format is:
+ # -s, --long ARGS
+ else:
+ default = action.dest.upper()
+ args_string = self._format_args(action, default)
+ opt = ', '.join(action.option_strings)
+ parts.append('%s %s' % (opt, args_string))
+ return ', '.join(parts)
+
+
+class HelpAction(argparse._HelpAction):
+ def __call__(self, parser, namespace, values, option_string=None):
+ if hasattr(parser, 'subparser'):
+ subparser = getattr(parser, 'subparser')
+ subparser.print_help()
+ else:
+ parser.print_help()
+ parser.exit()
+
+
+class ArgParserBase(argparse.ArgumentParser):
+ def __init__(self, *args, **kwargs):
+ if 'formatter_class' not in kwargs:
+ kwargs['formatter_class'] = lambda prog: DelugeTextHelpFormatter(
+ prog, max_help_position=33, width=90
+ )
+
+ kwargs['add_help'] = kwargs.get('add_help', False)
+ common_help = kwargs.pop('common_help', True)
+ self.log_stream = sys.stdout
+ if 'log_stream' in kwargs:
+ self.log_stream = kwargs['log_stream']
+ del kwargs['log_stream']
+
+ super(ArgParserBase, self).__init__(*args, **kwargs)
+
+ self.common_setup = False
+ self.process_arg_group = False
+ self.group = self.add_argument_group(_('Common Options'))
+ if common_help:
+ self.group.add_argument(
+ '-h', '--help', action=HelpAction, help=_('Print this help message')
+ )
+ self.group.add_argument(
+ '-V',
+ '--version',
+ action='version',
+ version='%(prog)s ' + _get_version_detail(),
+ help=_('Print version information'),
+ )
+ self.group.add_argument(
+ '-v',
+ action='version',
+ version='%(prog)s ' + _get_version_detail(),
+ help=argparse.SUPPRESS,
+ ) # Deprecated arg
+ self.group.add_argument(
+ '-c',
+ '--config',
+ metavar='<config>',
+ help=_('Set the config directory path'),
+ )
+ self.group.add_argument(
+ '-l',
+ '--logfile',
+ metavar='<logfile>',
+ help=_('Output to specified logfile instead of stdout'),
+ )
+ self.group.add_argument(
+ '-L',
+ '--loglevel',
+ choices=[l for k in deluge.log.levels for l in (k, k.upper())],
+ help=_('Set the log level (none, error, warning, info, debug)'),
+ metavar='<level>',
+ )
+ self.group.add_argument(
+ '--logrotate',
+ nargs='?',
+ const='2M',
+ metavar='<max-size>',
+ help=_(
+ 'Enable logfile rotation, with optional maximum logfile size, '
+ 'default: %(const)s (Logfile rotation count is 5)'
+ ),
+ )
+ self.group.add_argument(
+ '-q',
+ '--quiet',
+ action='store_true',
+ help=_('Quieten logging output (Same as `--loglevel none`)'),
+ )
+ self.group.add_argument(
+ '--profile',
+ metavar='<profile-file>',
+ nargs='?',
+ default=False,
+ help=_(
+ 'Profile %(prog)s with cProfile. Outputs to stdout '
+ 'unless a filename is specified'
+ ),
+ )
+
+ def parse_args(self, args=None):
+ """Parse UI arguments and handle common and process group options.
+
+ Notes:
+ Unknown arguments results in usage text printed and system exit.
+
+ Args:
+ args (list, optional): The arguments to parse.
+
+ Returns:
+ argparse.Namespace: The parsed arguments.
+
+ """
+ options = super(ArgParserBase, self).parse_args(args=args)
+ return self._handle_ui_options(options)
+
+ def parse_known_ui_args(self, args, withhold=None):
+ """Parse UI arguments and handle common and process group options without error.
+
+ Args:
+ args (list): The arguments to parse.
+ withhold (list): Values to ignore in the args list.
+
+ Returns:
+ argparse.Namespace: The parsed arguments.
+
+ """
+ if withhold:
+ args = [a for a in args if a not in withhold]
+ options, remaining = super(ArgParserBase, self).parse_known_args(args=args)
+ options.remaining = remaining
+ # Hanlde common and process group options
+ return self._handle_ui_options(options)
+
+ def _handle_ui_options(self, options):
+ """Handle UI common and process group options.
+
+ Args:
+ options (argparse.Namespace): The parsed options.
+
+ Returns:
+ argparse.Namespace: The parsed options.
+
+ """
+ if not self.common_setup:
+ self.common_setup = True
+
+ # Setup the logger
+ if options.quiet:
+ options.loglevel = 'none'
+ if options.loglevel:
+ options.loglevel = options.loglevel.lower()
+
+ logfile_mode = 'w'
+ logrotate = options.logrotate
+ if options.logrotate:
+ logfile_mode = 'a'
+ logrotate = common.parse_human_size(options.logrotate)
+
+ # Setup the logger
+ deluge.log.setup_logger(
+ level=options.loglevel,
+ filename=options.logfile,
+ filemode=logfile_mode,
+ logrotate=logrotate,
+ output_stream=self.log_stream,
+ )
+
+ if options.config:
+ if not set_config_dir(options.config):
+ log = logging.getLogger(__name__)
+ log.error('There was an error setting the config dir! Exiting..')
+ sys.exit(1)
+ else:
+ if not os.path.exists(common.get_default_config_dir()):
+ os.makedirs(common.get_default_config_dir())
+
+ if self.process_arg_group:
+ self.process_arg_group = False
+ # If donotdaemonize is set, skip process forking.
+ if not (common.windows_check() or options.donotdaemonize):
+ if os.fork():
+ os._exit(0)
+ os.setsid()
+ # Do second fork
+ if os.fork():
+ os._exit(0)
+ # Ensure process doesn't keep any directory in use that may prevent a filesystem unmount.
+ os.chdir(get_config_dir())
+
+ # Write pid file before chuid
+ if options.pidfile:
+ with open(options.pidfile, 'wb') as _file:
+ _file.write('%d\n' % os.getpid())
+
+ if not common.windows_check():
+ if options.user:
+ if not options.user.isdigit():
+ import pwd
+
+ options.user = pwd.getpwnam(options.user)[2]
+ os.setuid(options.user)
+ if options.group:
+ if not options.group.isdigit():
+ import grp
+
+ options.group = grp.getgrnam(options.group)[2]
+ os.setuid(options.group)
+
+ return options
+
+ def add_process_arg_group(self):
+ """Adds a grouping of common process args to control a daemon to the parser"""
+
+ self.process_arg_group = True
+ self.group = self.add_argument_group(_('Process Control Options'))
+ self.group.add_argument(
+ '-P',
+ '--pidfile',
+ metavar='<pidfile>',
+ action='store',
+ help=_('Pidfile to store the process id'),
+ )
+ if not common.windows_check():
+ self.group.add_argument(
+ '-d',
+ '--do-not-daemonize',
+ dest='donotdaemonize',
+ action='store_true',
+ help=_('Do not daemonize (fork) this process'),
+ )
+ self.group.add_argument(
+ '-f',
+ '--fork',
+ dest='donotdaemonize',
+ action='store_false',
+ help=argparse.SUPPRESS,
+ ) # Deprecated arg
+ self.group.add_argument(
+ '-U',
+ '--user',
+ metavar='<user>',
+ action='store',
+ help=_('Change to this user on startup (Requires root)'),
+ )
+ self.group.add_argument(
+ '-g',
+ '--group',
+ metavar='<group>',
+ action='store',
+ help=_('Change to this group on startup (Requires root)'),
+ )
diff --git a/deluge/bencode.py b/deluge/bencode.py
new file mode 100644
index 0000000..0c2674b
--- /dev/null
+++ b/deluge/bencode.py
@@ -0,0 +1,158 @@
+# The contents of this file are subject to the Python Software Foundation
+# License Version 2.3 (the License). You may not copy or use this file, in
+# either source code or executable form, except in compliance with the License.
+# You may obtain a copy of the License at http://www.python.org/license.
+#
+# Software distributed under the License is distributed on an AS IS basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+
+# Written by Petru Paler
+# Updated by Calum Lind to support both Python 2 and Python 3.
+
+from __future__ import unicode_literals
+
+from sys import version_info
+
+PY2 = version_info.major == 2
+
+
+class BTFailure(Exception):
+ pass
+
+
+DICT_DELIM = b'd'
+END_DELIM = b'e'
+INT_DELIM = b'i'
+LIST_DELIM = b'l'
+BYTE_SEP = b':'
+
+
+def decode_int(x, f):
+ f += 1
+ newf = x.index(END_DELIM, f)
+ n = int(x[f:newf])
+ if x[f : f + 1] == b'-' and x[f + 1 : f + 2] == b'0':
+ raise ValueError
+ elif x[f : f + 1] == b'0' and newf != f + 1:
+ raise ValueError
+ return (n, newf + 1)
+
+
+def decode_string(x, f):
+ colon = x.index(BYTE_SEP, f)
+ n = int(x[f:colon])
+ if x[f : f + 1] == b'0' and colon != f + 1:
+ raise ValueError
+ colon += 1
+ return (x[colon : colon + n], colon + n)
+
+
+def decode_list(x, f):
+ r, f = [], f + 1
+ while x[f : f + 1] != END_DELIM:
+ v, f = decode_func[x[f : f + 1]](x, f)
+ r.append(v)
+ return (r, f + 1)
+
+
+def decode_dict(x, f):
+ r, f = {}, f + 1
+ while x[f : f + 1] != END_DELIM:
+ k, f = decode_string(x, f)
+ r[k], f = decode_func[x[f : f + 1]](x, f)
+ return (r, f + 1)
+
+
+decode_func = {}
+decode_func[LIST_DELIM] = decode_list
+decode_func[DICT_DELIM] = decode_dict
+decode_func[INT_DELIM] = decode_int
+decode_func[b'0'] = decode_string
+decode_func[b'1'] = decode_string
+decode_func[b'2'] = decode_string
+decode_func[b'3'] = decode_string
+decode_func[b'4'] = decode_string
+decode_func[b'5'] = decode_string
+decode_func[b'6'] = decode_string
+decode_func[b'7'] = decode_string
+decode_func[b'8'] = decode_string
+decode_func[b'9'] = decode_string
+
+
+def bdecode(x):
+ try:
+ r, __ = decode_func[x[0:1]](x, 0)
+ except (LookupError, TypeError, ValueError):
+ raise BTFailure('Not a valid bencoded string')
+ else:
+ return r
+
+
+class Bencached(object):
+
+ __slots__ = ['bencoded']
+
+ def __init__(self, s):
+ self.bencoded = s
+
+
+def encode_bencached(x, r):
+ r.append(x.bencoded)
+
+
+def encode_int(x, r):
+ r.extend((INT_DELIM, str(x).encode('utf8'), END_DELIM))
+
+
+def encode_bool(x, r):
+ encode_int(1 if x else 0, r)
+
+
+def encode_string(x, r):
+ encode_bytes(x.encode('utf8'), r)
+
+
+def encode_bytes(x, r):
+ r.extend((str(len(x)).encode('utf8'), BYTE_SEP, x))
+
+
+def encode_list(x, r):
+ r.append(LIST_DELIM)
+ for i in x:
+ encode_func[type(i)](i, r)
+ r.append(END_DELIM)
+
+
+def encode_dict(x, r):
+ r.append(DICT_DELIM)
+ for k, v in sorted(x.items()):
+ try:
+ k = k.encode('utf8')
+ except AttributeError:
+ pass
+ r.extend((str(len(k)).encode('utf8'), BYTE_SEP, k))
+ encode_func[type(v)](v, r)
+ r.append(END_DELIM)
+
+
+encode_func = {}
+encode_func[Bencached] = encode_bencached
+encode_func[int] = encode_int
+encode_func[list] = encode_list
+encode_func[tuple] = encode_list
+encode_func[dict] = encode_dict
+encode_func[bool] = encode_bool
+encode_func[str] = encode_string
+encode_func[bytes] = encode_bytes
+if PY2:
+ encode_func[long] = encode_int # noqa: F821
+ encode_func[str] = encode_bytes
+ encode_func[unicode] = encode_string # noqa: F821
+
+
+def bencode(x):
+ r = []
+ encode_func[type(x)](x, r)
+ return b''.join(r)
diff --git a/deluge/common.py b/deluge/common.py
new file mode 100644
index 0000000..26e1605
--- /dev/null
+++ b/deluge/common.py
@@ -0,0 +1,1369 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007,2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""Common functions for various parts of Deluge to use."""
+from __future__ import division, print_function, unicode_literals
+
+import base64
+import binascii
+import functools
+import glob
+import locale
+import logging
+import numbers
+import os
+import platform
+import re
+import subprocess
+import sys
+import tarfile
+import time
+from contextlib import closing
+from datetime import datetime
+from io import BytesIO, open
+
+import pkg_resources
+
+from deluge.decorators import deprecated
+from deluge.error import InvalidPathError
+
+try:
+ import chardet
+except ImportError:
+ chardet = None
+
+try:
+ from urllib.parse import unquote_plus, urljoin
+ from urllib.request import pathname2url
+except ImportError:
+ # PY2 fallback
+ from urlparse import urljoin # pylint: disable=ungrouped-imports
+ from urllib import pathname2url, unquote_plus # pylint: disable=ungrouped-imports
+
+# Windows workaround for HTTPS requests requiring certificate authority bundle.
+# see: https://twistedmatrix.com/trac/ticket/9209
+if platform.system() in ('Windows', 'Microsoft'):
+ from certifi import where
+
+ os.environ['SSL_CERT_FILE'] = where()
+
+
+if platform.system() not in ('Windows', 'Microsoft', 'Darwin'):
+ # gi makes dbus available on Window but don't import it as unused.
+ try:
+ import dbus
+ except ImportError:
+ dbus = None
+ try:
+ import distro
+ except ImportError:
+ distro = None
+
+log = logging.getLogger(__name__)
+
+TORRENT_STATE = [
+ 'Allocating',
+ 'Checking',
+ 'Downloading',
+ 'Seeding',
+ 'Paused',
+ 'Error',
+ 'Queued',
+ 'Moving',
+]
+
+# The output formatting for json.dump
+JSON_FORMAT = {'indent': 4, 'sort_keys': True, 'ensure_ascii': False}
+
+PY2 = sys.version_info.major == 2
+
+
+def get_version():
+ """The program version from the egg metadata.
+
+ Returns:
+ str: The version of Deluge.
+ """
+ return pkg_resources.get_distribution('Deluge').version
+
+
+def get_default_config_dir(filename=None):
+ """
+ :param filename: if None, only the config path is returned, if provided,
+ a path including the filename will be returned
+ :type filename: string
+ :returns: a file path to the config directory and optional filename
+ :rtype: string
+
+ """
+
+ if windows_check():
+
+ def save_config_path(resource):
+ app_data_path = os.environ.get('APPDATA')
+ if not app_data_path:
+ try:
+ import winreg
+ except ImportError:
+ import _winreg as winreg # For Python 2.
+ hkey = winreg.OpenKey(
+ winreg.HKEY_CURRENT_USER,
+ 'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders',
+ )
+ app_data_reg = winreg.QueryValueEx(hkey, 'AppData')
+ app_data_path = app_data_reg[0]
+ winreg.CloseKey(hkey)
+ return os.path.join(app_data_path, resource)
+
+ else:
+ from xdg.BaseDirectory import save_config_path
+ if not filename:
+ filename = ''
+ try:
+ return decode_bytes(os.path.join(save_config_path('deluge'), filename))
+ except OSError as ex:
+ log.error('Unable to use default config directory, exiting... (%s)', ex)
+ sys.exit(1)
+
+
+def get_default_download_dir():
+ """
+ :returns: the default download directory
+ :rtype: string
+
+ """
+ download_dir = ''
+ if not windows_check():
+ from xdg.BaseDirectory import xdg_config_home
+
+ try:
+ user_dirs_path = os.path.join(xdg_config_home, 'user-dirs.dirs')
+ with open(user_dirs_path, 'r', encoding='utf8') as _file:
+ for line in _file:
+ if not line.startswith('#') and line.startswith('XDG_DOWNLOAD_DIR'):
+ download_dir = os.path.expandvars(
+ line.partition('=')[2].rstrip().strip('"')
+ )
+ break
+ except IOError:
+ pass
+
+ if not download_dir:
+ download_dir = os.path.join(os.path.expanduser('~'), 'Downloads')
+ return download_dir
+
+
+def archive_files(arc_name, filepaths, message=None, rotate=10):
+ """Compress a list of filepaths into timestamped tarball in config dir.
+
+ The archiving config directory is 'archive'.
+
+ Args:
+ arc_name (str): The archive output filename (appended with timestamp).
+ filepaths (list): A list of the files to be archived into tarball.
+
+ Returns:
+ str: The full archive filepath.
+
+ """
+
+ from deluge.configmanager import get_config_dir
+
+ # Set archive compression to lzma with bz2 fallback.
+ arc_comp = 'xz' if not PY2 else 'bz2'
+
+ archive_dir = os.path.join(get_config_dir(), 'archive')
+ timestamp = datetime.now().replace(microsecond=0).isoformat().replace(':', '-')
+ arc_filepath = os.path.join(
+ archive_dir, arc_name + '-' + timestamp + '.tar.' + arc_comp
+ )
+
+ if not os.path.exists(archive_dir):
+ os.makedirs(archive_dir)
+ else:
+ all_arcs = glob.glob(os.path.join(archive_dir, arc_name) + '*')
+ if len(all_arcs) >= rotate:
+ log.warning(
+ 'Too many existing archives for %s. Deleting oldest archive.', arc_name
+ )
+ os.remove(sorted(all_arcs)[0])
+
+ try:
+ with tarfile.open(arc_filepath, 'w:' + arc_comp) as tar:
+ for filepath in filepaths:
+ if not os.path.isfile(filepath):
+ continue
+ tar.add(filepath, arcname=os.path.basename(filepath))
+ if message:
+ with closing(BytesIO(message.encode('utf8'))) as fobj:
+ tarinfo = tarfile.TarInfo('archive_message.txt')
+ tarinfo.size = len(fobj.getvalue())
+ tarinfo.mtime = time.time()
+ tar.addfile(tarinfo, fileobj=fobj)
+ except OSError:
+ log.error('Problem occurred archiving filepaths: %s', filepaths)
+ return False
+ else:
+ return arc_filepath
+
+
+def windows_check():
+ """
+ Checks if the current platform is Windows
+
+ :returns: True or False
+ :rtype: bool
+
+ """
+ return platform.system() in ('Windows', 'Microsoft')
+
+
+def vista_check():
+ """
+ Checks if the current platform is Windows Vista
+
+ :returns: True or False
+ :rtype: bool
+
+ """
+ return platform.release() == 'Vista'
+
+
+def osx_check():
+ """
+ Checks if the current platform is Mac OS X
+
+ :returns: True or False
+ :rtype: bool
+
+ """
+ return platform.system() == 'Darwin'
+
+
+def linux_check():
+ """
+ Checks if the current platform is Linux
+
+ :returns: True or False
+ :rtype: bool
+
+ """
+ return platform.system() == 'Linux'
+
+
+def get_os_version():
+ """Parse and return the os version information.
+
+ Converts the platform ver tuple to a string.
+
+ Returns:
+ str: The os version info.
+
+ """
+ if windows_check():
+ os_version = platform.win32_ver()
+ elif osx_check():
+ os_version = list(platform.mac_ver())
+ os_version[1] = '' # versioninfo always empty.
+ elif distro:
+ os_version = distro.linux_distribution()
+ else:
+ os_version = (platform.release(),)
+
+ return ' '.join(filter(None, os_version))
+
+
+def get_pixmap(fname):
+ """
+ Provides easy access to files in the deluge/ui/data/pixmaps folder within the Deluge egg
+
+ :param fname: the filename to look for
+ :type fname: string
+ :returns: a path to a pixmap file included with Deluge
+ :rtype: string
+
+ """
+ return resource_filename('deluge', os.path.join('ui', 'data', 'pixmaps', fname))
+
+
+def resource_filename(module, path):
+ """Get filesystem path for a resource.
+
+ This function contains a work-around for pkg_resources.resource_filename
+ not returning the correct path with multiple packages installed.
+
+ So if there's a second deluge package, installed globally and another in
+ develop mode somewhere else, while pkg_resources.get_distribution('Deluge')
+ returns the proper deluge instance, pkg_resources.resource_filename
+ does not, it returns the first found on the python path, which is wrong.
+ """
+ return pkg_resources.get_distribution('Deluge').get_resource_filename(
+ pkg_resources._manager, os.path.join(*(module.split('.') + [path]))
+ )
+
+
+def open_file(path, timestamp=None):
+ """Opens a file or folder using the system configured program.
+
+ Args:
+ path (str): The path to the file or folder to open.
+ timestamp (int, optional): An event request timestamp.
+
+ """
+ if windows_check():
+ os.startfile(path)
+ elif osx_check():
+ subprocess.Popen(['open', path])
+ else:
+ if timestamp is None:
+ timestamp = int(time.time())
+ env = os.environ.copy()
+ env['DESKTOP_STARTUP_ID'] = '%s-%u-%s-xdg_open_TIME%d' % (
+ os.path.basename(sys.argv[0]),
+ os.getpid(),
+ os.uname()[1],
+ timestamp,
+ )
+ subprocess.Popen(['xdg-open', '%s' % path], env=env)
+
+
+def show_file(path, timestamp=None):
+ """Shows (highlights) a file or folder using the system configured file manager.
+
+ Args:
+ path (str): The path to the file or folder to show.
+ timestamp (int, optional): An event request timestamp.
+
+ """
+ if windows_check():
+ subprocess.Popen(['explorer', '/select,', path])
+ elif osx_check():
+ subprocess.Popen(['open', '-R', path])
+ else:
+ if timestamp is None:
+ timestamp = int(time.time())
+ startup_id = '%s_%u_%s-dbus_TIME%d TIMESTAMP=%d' % (
+ os.path.basename(sys.argv[0]),
+ os.getpid(),
+ os.uname()[1],
+ timestamp,
+ timestamp,
+ )
+ if dbus:
+ bus = dbus.SessionBus()
+ filemanager1 = bus.get_object(
+ 'org.freedesktop.FileManager1', '/org/freedesktop/FileManager1'
+ )
+ paths = [urljoin('file:', pathname2url(path))]
+ filemanager1.ShowItems(
+ paths, startup_id, dbus_interface='org.freedesktop.FileManager1'
+ )
+ else:
+ env = os.environ.copy()
+ env['DESKTOP_STARTUP_ID'] = startup_id.replace('dbus', 'xdg-open')
+ # No option in xdg to highlight a file so just open parent folder.
+ subprocess.Popen(['xdg-open', os.path.dirname(path.rstrip('/'))], env=env)
+
+
+def open_url_in_browser(url):
+ """
+ Opens a url in the desktop's default browser
+
+ :param url: the url to open
+ :type url: string
+
+ """
+ import webbrowser
+
+ webbrowser.open(url)
+
+
+# Formatting text functions
+byte_txt = 'B'
+kib_txt = 'KiB'
+mib_txt = 'MiB'
+gib_txt = 'GiB'
+tib_txt = 'TiB'
+kib_txt_short = 'K'
+mib_txt_short = 'M'
+gib_txt_short = 'G'
+tib_txt_short = 'T'
+
+
+def translate_size_units():
+ """For performance reasons these units are translated outside the function"""
+
+ global byte_txt, kib_txt, mib_txt, gib_txt, tib_txt
+ global kib_txt_short, mib_txt_short, gib_txt_short, tib_txt_short
+
+ byte_txt = _('B')
+ kib_txt = _('KiB')
+ mib_txt = _('MiB')
+ gib_txt = _('GiB')
+ tib_txt = _('TiB')
+ kib_txt_short = _('K')
+ mib_txt_short = _('M')
+ gib_txt_short = _('G')
+ tib_txt_short = _('T')
+
+
+def fsize(fsize_b, precision=1, shortform=False):
+ """Formats the bytes value into a string with KiB, MiB or GiB units.
+
+ Args:
+ fsize_b (int): The filesize in bytes.
+ precision (int): The filesize float precision.
+
+ Returns:
+ str: A formatted string in KiB, MiB or GiB units.
+
+ Examples:
+ >>> fsize(112245)
+ '109.6 KiB'
+ >>> fsize(112245, precision=0)
+ '110 KiB'
+
+ Note:
+ This function has been refactored for perfomance with the
+ fsize units being translated outside the function.
+
+ """
+
+ if fsize_b >= 1024 ** 4:
+ return '%.*f %s' % (
+ precision,
+ fsize_b / 1024 ** 4,
+ tib_txt_short if shortform else tib_txt,
+ )
+ elif fsize_b >= 1024 ** 3:
+ return '%.*f %s' % (
+ precision,
+ fsize_b / 1024 ** 3,
+ gib_txt_short if shortform else gib_txt,
+ )
+ elif fsize_b >= 1024 ** 2:
+ return '%.*f %s' % (
+ precision,
+ fsize_b / 1024 ** 2,
+ mib_txt_short if shortform else mib_txt,
+ )
+ elif fsize_b >= 1024:
+ return '%.*f %s' % (
+ precision,
+ fsize_b / 1024,
+ kib_txt_short if shortform else kib_txt,
+ )
+ else:
+ return '%d %s' % (fsize_b, byte_txt)
+
+
+def fpcnt(dec, precision=2):
+ """Formats a string to display a percentage with <precision> places.
+
+ Args:
+ dec (float): The ratio in the range [0.0, 1.0].
+ precision (int): The percentage float precision.
+
+ Returns:
+ str: A formatted string representing a percentage.
+
+ Examples:
+ >>> fpcnt(0.9311)
+ '93.11%'
+ >>> fpcnt(0.9311, precision=0)
+ '93%'
+
+ """
+
+ pcnt = dec * 100
+ if pcnt == 0 or pcnt == 100:
+ precision = 0
+ return '%.*f%%' % (precision, pcnt)
+
+
+def fspeed(bps, precision=1, shortform=False):
+ """Formats a string to display a transfer speed.
+
+ Args:
+ bps (int): The speed in bytes per second.
+
+ Returns:
+ str: A formatted string representing transfer speed.
+
+ Examples:
+ >>> fspeed(43134)
+ '42.1 KiB/s'
+
+ """
+
+ if bps < 1024 ** 2:
+ return '%.*f %s' % (
+ precision,
+ bps / 1024,
+ _('K/s') if shortform else _('KiB/s'),
+ )
+ elif bps < 1024 ** 3:
+ return '%.*f %s' % (
+ precision,
+ bps / 1024 ** 2,
+ _('M/s') if shortform else _('MiB/s'),
+ )
+ elif bps < 1024 ** 4:
+ return '%.*f %s' % (
+ precision,
+ bps / 1024 ** 3,
+ _('G/s') if shortform else _('GiB/s'),
+ )
+ else:
+ return '%.*f %s' % (
+ precision,
+ bps / 1024 ** 4,
+ _('T/s') if shortform else _('TiB/s'),
+ )
+
+
+def fpeer(num_peers, total_peers):
+ """Formats a string to show 'num_peers' ('total_peers').
+
+ Args:
+ num_peers (int): The number of connected peers.
+ total_peers (int): The total number of peers.
+
+ Returns:
+ str: A formatted string 'num_peers (total_peers)' or total_peers < 0, just 'num_peers'.
+
+ Examples:
+ >>> fpeer(10, 20)
+ '10 (20)'
+ >>> fpeer(10, -1)
+ '10'
+
+ """
+ if total_peers > -1:
+ return '{:d} ({:d})'.format(num_peers, total_peers)
+ else:
+ return '{:d}'.format(num_peers)
+
+
+def ftime(secs):
+ """Formats a string to show time in a human readable form.
+
+ Args:
+ secs (int or float): The number of seconds.
+
+ Returns:
+ str: A formatted time string or empty string if value is 0.
+
+ Examples:
+ >>> ftime(23011)
+ '6h 23m'
+
+ Note:
+ This function has been refactored for perfomance.
+
+ """
+
+ # Handle floats by truncating to an int
+ secs = int(secs)
+ if secs <= 0:
+ time_str = ''
+ elif secs < 60:
+ time_str = '{}s'.format(secs)
+ elif secs < 3600:
+ time_str = '{}m {}s'.format(secs // 60, secs % 60)
+ elif secs < 86400:
+ time_str = '{}h {}m'.format(secs // 3600, secs // 60 % 60)
+ elif secs < 604800:
+ time_str = '{}d {}h'.format(secs // 86400, secs // 3600 % 24)
+ elif secs < 31449600:
+ time_str = '{}w {}d'.format(secs // 604800, secs // 86400 % 7)
+ else:
+ time_str = '{}y {}w'.format(secs // 31449600, secs // 604800 % 52)
+
+ return time_str
+
+
+def fdate(seconds, date_only=False, precision_secs=False):
+ """Formats a date time string in the locale's date representation based on the systems timezone.
+
+ Args:
+ seconds (float): Time in seconds since the Epoch.
+ precision_secs (bool): Include seconds in time format.
+
+ Returns:
+ str: A string in the locale's datetime representation or "" if seconds < 0
+
+ """
+
+ if seconds < 0:
+ return ''
+ time_format = '%x %X' if precision_secs else '%x %H:%M'
+ if date_only:
+ time_format = time_format.split()[0]
+ return time.strftime(time_format, time.localtime(seconds))
+
+
+def tokenize(text):
+ """
+ Tokenize a text into numbers and strings.
+
+ Args:
+ text (str): The text to tokenize (a string).
+
+ Returns:
+ list: A list of strings and/or numbers.
+
+ This function is used to implement robust tokenization of user input
+ It automatically coerces integer and floating point numbers, ignores
+ whitespace and knows how to separate numbers from strings even without
+ whitespace.
+ """
+ tokenized_input = []
+ for token in re.split(r'(\d+(?:\.\d+)?)', text):
+ token = token.strip()
+ if re.match(r'\d+\.\d+', token):
+ tokenized_input.append(float(token))
+ elif token.isdigit():
+ tokenized_input.append(int(token))
+ elif token:
+ tokenized_input.append(token)
+ return tokenized_input
+
+
+size_units = [
+ {'prefix': 'b', 'divider': 1, 'singular': 'byte', 'plural': 'bytes'},
+ {'prefix': 'KiB', 'divider': 1024 ** 1},
+ {'prefix': 'MiB', 'divider': 1024 ** 2},
+ {'prefix': 'GiB', 'divider': 1024 ** 3},
+ {'prefix': 'TiB', 'divider': 1024 ** 4},
+ {'prefix': 'PiB', 'divider': 1024 ** 5},
+ {'prefix': 'KB', 'divider': 1000 ** 1},
+ {'prefix': 'MB', 'divider': 1000 ** 2},
+ {'prefix': 'GB', 'divider': 1000 ** 3},
+ {'prefix': 'TB', 'divider': 1000 ** 4},
+ {'prefix': 'PB', 'divider': 1000 ** 5},
+ {'prefix': 'm', 'divider': 1000 ** 2},
+]
+
+
+class InvalidSize(Exception):
+ pass
+
+
+def parse_human_size(size):
+ """
+ Parse a human readable data size and return the number of bytes.
+
+ Args:
+ size (str): The human readable file size to parse (a string).
+
+ Returns:
+ int: The corresponding size in bytes.
+
+ Raises:
+ InvalidSize: when the input can't be parsed.
+
+ """
+ tokens = tokenize(size)
+ if tokens and isinstance(tokens[0], numbers.Number):
+ # If the input contains only a number, it's assumed to be the number of bytes.
+ if len(tokens) == 1:
+ return int(tokens[0])
+ # Otherwise we expect to find two tokens: A number and a unit.
+ if len(tokens) == 2:
+ try:
+ normalized_unit = tokens[1].lower()
+ except AttributeError:
+ pass
+ else:
+ # Try to match the first letter of the unit.
+ for unit in size_units:
+ if normalized_unit.startswith(unit['prefix'].lower()):
+ return int(tokens[0] * unit['divider'])
+ # We failed to parse the size specification.
+ msg = 'Failed to parse size! (input %r was tokenized as %r)'
+ raise InvalidSize(msg % (size, tokens))
+
+
+def is_url(url):
+ """
+ A simple test to check if the URL is valid
+
+ :param url: the url to test
+ :type url: string
+ :returns: True or False
+ :rtype: bool
+
+ :Example:
+
+ >>> is_url('http://deluge-torrent.org')
+ True
+
+ """
+ return url.partition('://')[0] in ('http', 'https', 'ftp', 'udp')
+
+
+def is_infohash(infohash):
+ """
+ A check to determine if a string is a valid infohash.
+
+ Args:
+ infohash (str): The string to check.
+
+ Returns:
+ bool: True if valid infohash, False otherwise.
+
+ """
+ return len(infohash) == 40 and infohash.isalnum()
+
+
+MAGNET_SCHEME = 'magnet:?'
+XT_BTIH_PARAM = 'xt=urn:btih:'
+DN_PARAM = 'dn='
+TR_PARAM = 'tr='
+
+
+def is_magnet(uri):
+ """
+ A check to determine if a uri is a valid bittorrent magnet uri
+
+ :param uri: the uri to check
+ :type uri: string
+ :returns: True or False
+ :rtype: bool
+
+ :Example:
+
+ >>> is_magnet('magnet:?xt=urn:btih:SU5225URMTUEQLDXQWRB2EQWN6KLTYKN')
+ True
+
+ """
+ if not uri:
+ return False
+
+ return uri.startswith(MAGNET_SCHEME) and XT_BTIH_PARAM in uri
+
+
+def get_magnet_info(uri):
+ """Parse torrent information from magnet link.
+
+ Args:
+ uri (str): The magnet link.
+
+ Returns:
+ dict: Information about the magnet link.
+
+ Format of the magnet dict::
+
+ {
+ "name": the torrent name,
+ "info_hash": the torrents info_hash,
+ "files_tree": empty value for magnet links
+ }
+
+ """
+
+ tr0_param = 'tr.'
+ tr0_param_regex = re.compile(r'^tr.(\d+)=(\S+)')
+ if not uri.startswith(MAGNET_SCHEME):
+ return {}
+
+ name = None
+ info_hash = None
+ trackers = {}
+ tier = 0
+ for param in uri[len(MAGNET_SCHEME) :].split('&'):
+ if param.startswith(XT_BTIH_PARAM):
+ xt_hash = param[len(XT_BTIH_PARAM) :]
+ if len(xt_hash) == 32:
+ try:
+ infohash_str = base64.b32decode(xt_hash.upper())
+ except TypeError as ex:
+ log.debug('Invalid base32 magnet hash: %s, %s', xt_hash, ex)
+ break
+ info_hash = binascii.hexlify(infohash_str).decode()
+ elif is_infohash(xt_hash):
+ info_hash = xt_hash.lower()
+ else:
+ break
+ elif param.startswith(DN_PARAM):
+ name = unquote_plus(param[len(DN_PARAM) :])
+ elif param.startswith(TR_PARAM):
+ tracker = unquote_plus(param[len(TR_PARAM) :])
+ trackers[tracker] = tier
+ tier += 1
+ elif param.startswith(tr0_param):
+ try:
+ tier, tracker = re.match(tr0_param_regex, param).groups()
+ trackers[tracker] = tier
+ except AttributeError:
+ pass
+
+ if info_hash:
+ if not name:
+ name = info_hash
+ return {
+ 'name': name,
+ 'info_hash': info_hash,
+ 'files_tree': '',
+ 'trackers': trackers,
+ }
+ else:
+ return {}
+
+
+def create_magnet_uri(infohash, name=None, trackers=None):
+ """Creates a magnet uri
+
+ Args:
+ infohash (str): The info-hash of the torrent.
+ name (str, optional): The name of the torrent.
+ trackers (list or dict, optional): A list of trackers or dict or {tracker: tier} pairs.
+
+ Returns:
+ str: A magnet uri string.
+
+ """
+ try:
+ infohash = binascii.unhexlify(infohash)
+ except TypeError:
+ infohash.encode('utf-8')
+
+ uri = [MAGNET_SCHEME, XT_BTIH_PARAM, base64.b32encode(infohash).decode('utf-8')]
+ if name:
+ uri.extend(['&', DN_PARAM, name])
+ if trackers:
+ try:
+ for tracker in sorted(trackers, key=trackers.__getitem__):
+ uri.extend(['&', 'tr.%d=' % trackers[tracker], tracker])
+ except TypeError:
+ for tracker in trackers:
+ uri.extend(['&', TR_PARAM, tracker])
+
+ return ''.join(uri)
+
+
+def get_path_size(path):
+ """
+ Gets the size in bytes of 'path'
+
+ :param path: the path to check for size
+ :type path: string
+ :returns: the size in bytes of the path or -1 if the path does not exist
+ :rtype: int
+
+ """
+ if not os.path.exists(path):
+ return -1
+
+ if os.path.isfile(path):
+ return os.path.getsize(path)
+
+ dir_size = 0
+ for (p, dummy_dirs, files) in os.walk(path):
+ for _file in files:
+ filename = os.path.join(p, _file)
+ dir_size += os.path.getsize(filename)
+ return dir_size
+
+
+def free_space(path):
+ """
+ Gets the free space available at 'path'
+
+ :param path: the path to check
+ :type path: string
+ :returns: the free space at path in bytes
+ :rtype: int
+
+ :raises InvalidPathError: if the path is not valid
+
+ """
+ if not path or not os.path.exists(path):
+ raise InvalidPathError('%s is not a valid path' % path)
+
+ if windows_check():
+ from win32file import GetDiskFreeSpaceEx
+
+ return GetDiskFreeSpaceEx(path)[0]
+ else:
+ disk_data = os.statvfs(path.encode('utf8'))
+ block_size = disk_data.f_frsize
+ return disk_data.f_bavail * block_size
+
+
+def is_ip(ip):
+ """A test to see if 'ip' is a valid IPv4 or IPv6 address.
+
+ Args:
+ ip (str): The IP to test.
+
+ Returns:
+ bool: Whether IP is valid is not.
+
+ Examples:
+ >>> is_ip("192.0.2.0")
+ True
+ >>> is_ip("2001:db8::")
+ True
+
+ """
+
+ return is_ipv4(ip) or is_ipv6(ip)
+
+
+def is_ipv4(ip):
+ """A test to see if 'ip' is a valid IPv4 address.
+
+ Args:
+ ip (str): The IP to test.
+
+ Returns:
+ bool: Whether IP is valid is not.
+
+ Examples:
+ >>> is_ipv4("192.0.2.0")
+ True
+
+ """
+
+ import socket
+
+ try:
+ if windows_check():
+ return socket.inet_aton(ip)
+ else:
+ return socket.inet_pton(socket.AF_INET, ip)
+ except socket.error:
+ return False
+
+
+def is_ipv6(ip):
+ """A test to see if 'ip' is a valid IPv6 address.
+
+ Args:
+ ip (str): The IP to test.
+
+ Returns:
+ bool: Whether IP is valid is not.
+
+ Examples:
+ >>> is_ipv6("2001:db8::")
+ True
+
+ """
+
+ try:
+ import ipaddress
+ except ImportError:
+ import socket
+
+ try:
+ return socket.inet_pton(socket.AF_INET6, ip)
+ except (socket.error, AttributeError):
+ if windows_check():
+ log.warning('Unable to verify IPv6 Address on Windows.')
+ return True
+ else:
+ try:
+ return ipaddress.IPv6Address(decode_bytes(ip))
+ except ipaddress.AddressValueError:
+ pass
+
+ return False
+
+
+def decode_bytes(byte_str, encoding='utf8'):
+ """Decodes a byte string and return unicode.
+
+ If it cannot decode using `encoding` then it will try latin1,
+ and if that fails, try to detect the string encoding. If that fails,
+ decode with ignore.
+
+ Args:
+ byte_str (bytes): The byte string to decode.
+ encoding (str): The encoding to try first when decoding.
+
+ Returns:
+ str: A unicode string.
+
+ """
+ if not byte_str:
+ return ''
+ elif not isinstance(byte_str, bytes):
+ return byte_str
+
+ encodings = [lambda: ('utf8', 'strict'), lambda: ('iso-8859-1', 'strict')]
+ if chardet:
+ encodings.append(lambda: (chardet.detect(byte_str)['encoding'], 'strict'))
+ encodings.append(lambda: (encoding, 'ignore'))
+
+ if encoding.lower() not in ['utf8', 'utf-8']:
+ encodings.insert(0, lambda: (encoding, 'strict'))
+
+ for l in encodings:
+ try:
+ return byte_str.decode(*l())
+ except UnicodeDecodeError:
+ pass
+ return ''
+
+
+@deprecated
+def decode_string(byte_str, encoding='utf8'):
+ """Deprecated: Use decode_bytes"""
+ return decode_bytes(byte_str, encoding)
+
+
+@deprecated
+def utf8_encoded(str_, encoding='utf8'):
+ """Deprecated: Use encode or decode_bytes if needed"""
+ return decode_bytes(str_, encoding).encode('utf8')
+
+
+def utf8_encode_structure(data):
+ """Recursively convert all unicode keys and values in a data structure to utf8.
+
+ e.g. converting keys and values for a dict with nested dicts and lists etc.
+
+ Args:
+ data (any): This can be any structure, dict, list or tuple.
+
+ Returns:
+ input type: The data with unicode keys and values converted to utf8.
+
+ """
+ if isinstance(data, (list, tuple)):
+ return type(data)([utf8_encode_structure(d) for d in data])
+ elif isinstance(data, dict):
+ return {
+ utf8_encode_structure(k): utf8_encode_structure(v) for k, v in data.items()
+ }
+ elif not isinstance(data, bytes):
+ try:
+ return data.encode('utf8')
+ except AttributeError:
+ pass
+ return data
+
+
+@functools.total_ordering
+class VersionSplit(object):
+ """
+ Used for comparing version numbers.
+
+ :param ver: the version
+ :type ver: string
+
+ """
+
+ def __init__(self, ver):
+ version_re = re.compile(
+ r"""
+ ^
+ (?P<version>\d+\.\d+) # minimum 'N.N'
+ (?P<extraversion>(?:\.\d+)*) # any number of extra '.N' segments
+ (?:
+ (?P<prerel>[abc]|rc) # 'a'=alpha, 'b'=beta, 'c'=release candidate
+ # 'rc'= alias for release candidate
+ (?P<prerelversion>\d+(?:\.\d+)*)
+ )?
+ (?P<postdev>(\.post(?P<post>\d+))?(\.dev(?P<dev>\d+))?)?
+ $""",
+ re.VERBOSE,
+ )
+
+ # Check for PEP 386 compliant version
+ match = re.search(version_re, ver)
+ if match:
+ group = [(x if x is not None else '') for x in match.group(1, 2, 3, 4, 8)]
+ vs = [''.join(group[0:2]), ''.join(group[2:4]), group[4].lstrip('.')]
+ else:
+ ver = ver.lower()
+ vs = ver.replace('_', '-').split('-')
+
+ self.version = [int(x) for x in vs[0].split('.') if x.isdigit()]
+ self.version_string = ''.join(str(x) for x in vs[0].split('.') if x.isdigit())
+ self.suffix = None
+ self.dev = None
+ if len(vs) > 1:
+ if vs[1].startswith(('rc', 'a', 'b', 'c')):
+ self.suffix = vs[1]
+ if vs[-1].startswith('dev'):
+ try:
+ # Store only the dev numeral.
+ self.dev = int(vs[-1].rsplit('dev')[1])
+ except ValueError:
+ # Implicit dev numeral is 0.
+ self.dev = 0
+
+ def get_comparable_versions(self, other):
+ """
+ Returns a 2-tuple of lists for use in the comparison
+ methods.
+ """
+ # PEP 386 versions with .devN precede release version so default
+ # non-dev versions to infinity while dev versions are ints.
+ self.dev = float('inf') if self.dev is None else self.dev
+ other.dev = float('inf') if other.dev is None else other.dev
+ # If there is no suffix we use z because we want final
+ # to appear after alpha, beta, and rc alphabetically.
+ v1 = [self.version, self.suffix or 'z', self.dev]
+ v2 = [other.version, other.suffix or 'z', other.dev]
+
+ return (v1, v2)
+
+ def __eq__(self, other):
+ v1, v2 = self.get_comparable_versions(other)
+ return v1 == v2
+
+ def __lt__(self, other):
+ v1, v2 = self.get_comparable_versions(other)
+ return v1 < v2
+
+
+# Common AUTH stuff
+AUTH_LEVEL_NONE = 0
+AUTH_LEVEL_READONLY = 1
+AUTH_LEVEL_NORMAL = 5
+AUTH_LEVEL_ADMIN = 10
+AUTH_LEVEL_DEFAULT = AUTH_LEVEL_NORMAL
+
+
+def create_auth_file():
+ import stat
+ import deluge.configmanager
+
+ auth_file = deluge.configmanager.get_config_dir('auth')
+ # Check for auth file and create if necessary
+ if not os.path.exists(auth_file):
+ with open(auth_file, 'w', encoding='utf8') as _file:
+ _file.flush()
+ os.fsync(_file.fileno())
+ # Change the permissions on the file so only this user can read/write it
+ os.chmod(auth_file, stat.S_IREAD | stat.S_IWRITE)
+
+
+def create_localclient_account(append=False):
+ import random
+ from hashlib import sha1 as sha
+ import deluge.configmanager
+
+ auth_file = deluge.configmanager.get_config_dir('auth')
+ if not os.path.exists(auth_file):
+ create_auth_file()
+
+ with open(auth_file, 'a' if append else 'w', encoding='utf8') as _file:
+ _file.write(
+ ':'.join(
+ [
+ 'localclient',
+ sha(str(random.random()).encode('utf8')).hexdigest(),
+ str(AUTH_LEVEL_ADMIN),
+ ]
+ )
+ + '\n'
+ )
+ _file.flush()
+ os.fsync(_file.fileno())
+
+
+def get_localhost_auth():
+ """Grabs the localclient auth line from the 'auth' file and creates a localhost uri.
+
+ Returns:
+ tuple: With the username and password to login as.
+ """
+ from deluge.configmanager import get_config_dir
+
+ auth_file = get_config_dir('auth')
+ if not os.path.exists(auth_file):
+ from deluge.common import create_localclient_account
+
+ create_localclient_account()
+
+ with open(auth_file, encoding='utf8') as auth:
+ for line in auth:
+ line = line.strip()
+ if line.startswith('#') or not line:
+ # This is a comment or blank line
+ continue
+
+ lsplit = line.split(':')
+
+ if len(lsplit) == 2:
+ username, password = lsplit
+ elif len(lsplit) == 3:
+ username, password, level = lsplit
+ else:
+ log.error('Your auth file is malformed: Incorrect number of fields!')
+ continue
+
+ if username == 'localclient':
+ return (username, password)
+
+
+def set_env_variable(name, value):
+ """
+ :param name: environment variable name
+ :param value: environment variable value
+
+ This function ensures that changes to an environment variable are applied
+ to each copy of the environment variables used by a process. Starting from
+ Python 2.4, os.environ changes only apply to the copy Python keeps (os.environ)
+ and are no longer automatically applied to the other copies for the process.
+
+ On Microsoft Windows, each process has multiple copies of the environment
+ variables, one managed by the OS and one managed by the C library. We also
+ need to take care of the fact that the C library used by Python is not
+ necessarily the same as the C library used by pygtk and friends. This because
+ the latest releases of pygtk and friends are built with mingw32 and are thus
+ linked against msvcrt.dll. The official gtk+ binaries have always been built
+ in this way.
+
+ Basen on _putenv in TransUtils.py from sourceforge project gramps
+ http://sourceforge.net/p/gramps/code/HEAD/tree/branches/maintenance/gramps32/src/TransUtils.py
+ """
+ # Update Python's copy of the environment variables
+ try:
+ os.environ[name] = value
+ except UnicodeEncodeError:
+ # Python 2
+ os.environ[name] = value.encode('utf8')
+
+ if windows_check():
+ from ctypes import windll
+ from ctypes import cdll
+
+ # Update the copy maintained by Windows (so SysInternals Process Explorer sees it)
+ result = windll.kernel32.SetEnvironmentVariableW(name, value)
+ if result == 0:
+ log.info(
+ "Failed to set Env Var '%s' (kernel32.SetEnvironmentVariableW)", name
+ )
+ else:
+ log.debug(
+ "Set Env Var '%s' to '%s' (kernel32.SetEnvironmentVariableW)",
+ name,
+ value,
+ )
+
+ # Update the copy maintained by msvcrt (used by gtk+ runtime)
+ result = cdll.msvcrt._wputenv('%s=%s' % (name, value))
+ if result != 0:
+ log.info("Failed to set Env Var '%s' (msvcrt._putenv)", name)
+ else:
+ log.debug("Set Env Var '%s' to '%s' (msvcrt._putenv)", name, value)
+
+
+def unicode_argv():
+ """ Gets sys.argv as list of unicode objects on any platform."""
+ if windows_check():
+ # Versions 2.x of Python don't support Unicode in sys.argv on
+ # Windows, with the underlying Windows API instead replacing multi-byte
+ # characters with '?'.
+ from ctypes import POINTER, byref, cdll, c_int, windll
+ from ctypes.wintypes import LPCWSTR, LPWSTR
+
+ get_cmd_linew = cdll.kernel32.GetCommandLineW
+ get_cmd_linew.argtypes = []
+ get_cmd_linew.restype = LPCWSTR
+
+ cmdline_to_argvw = windll.shell32.CommandLineToArgvW
+ cmdline_to_argvw.argtypes = [LPCWSTR, POINTER(c_int)]
+ cmdline_to_argvw.restype = POINTER(LPWSTR)
+
+ cmd = get_cmd_linew()
+ argc = c_int(0)
+ argv = cmdline_to_argvw(cmd, byref(argc))
+ if argc.value > 0:
+ # Remove Python executable and commands if present
+ start = argc.value - len(sys.argv)
+ return [argv[i] for i in range(start, argc.value)]
+ else:
+ # On other platforms, we have to find the likely encoding of the args and decode
+ # First check if sys.stdout or stdin have encoding set
+ encoding = getattr(sys.stdout, 'encoding') or getattr(sys.stdin, 'encoding')
+ # If that fails, check what the locale is set to
+ encoding = encoding or locale.getpreferredencoding()
+ # As a last resort, just default to utf-8
+ encoding = encoding or 'utf-8'
+
+ arg_list = []
+ for arg in sys.argv:
+ try:
+ arg_list.append(arg.decode(encoding))
+ except AttributeError:
+ arg_list.append(arg)
+
+ return arg_list
+
+
+def run_profiled(func, *args, **kwargs):
+ """
+ Profile a function with cProfile
+
+ Args:
+ func (func): The function to profile
+ *args (tuple): The arguments to pass to the function
+ do_profile (bool, optional): If profiling should be performed. Defaults to True.
+ output_file (str, optional): Filename to save profile results. If None, print to stdout.
+ Defaults to None.
+ """
+ if kwargs.get('do_profile', True) is not False:
+ import cProfile
+
+ profiler = cProfile.Profile()
+
+ def on_shutdown():
+ output_file = kwargs.get('output_file', None)
+ if output_file:
+ profiler.dump_stats(output_file)
+ log.info('Profile stats saved to %s', output_file)
+ print('Profile stats saved to %s' % output_file)
+ else:
+ import pstats
+ from io import StringIO
+
+ strio = StringIO()
+ ps = pstats.Stats(profiler, stream=strio).sort_stats('cumulative')
+ ps.print_stats()
+ print(strio.getvalue())
+
+ try:
+ return profiler.runcall(func, *args)
+ finally:
+ on_shutdown()
+ else:
+ return func(*args)
+
+
+def is_process_running(pid):
+ """
+ Verify if the supplied pid is a running process.
+
+ Args:
+ pid (int): The pid to check.
+
+ Returns:
+ bool: True if pid is a running process, False otherwise.
+
+ """
+
+ if windows_check():
+ from win32process import EnumProcesses
+
+ return pid in EnumProcesses()
+ else:
+ try:
+ os.kill(pid, 0)
+ except OSError:
+ return False
+ else:
+ return True
diff --git a/deluge/component.py b/deluge/component.py
new file mode 100644
index 0000000..c7ba83d
--- /dev/null
+++ b/deluge/component.py
@@ -0,0 +1,489 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2010 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import traceback
+from collections import defaultdict
+
+from six import string_types
+from twisted.internet import reactor
+from twisted.internet.defer import DeferredList, fail, maybeDeferred, succeed
+from twisted.internet.task import LoopingCall, deferLater
+
+log = logging.getLogger(__name__)
+
+
+class ComponentAlreadyRegistered(Exception):
+ pass
+
+
+class ComponentException(Exception):
+ def __init__(self, message, tb):
+ super(ComponentException, self).__init__(message)
+ self.message = message
+ self.tb = tb
+
+ def __str__(self):
+ s = super(ComponentException, self).__str__()
+ return '%s\n%s' % (s, ''.join(self.tb))
+
+ def __eq__(self, other):
+ if isinstance(other, self.__class__):
+ return self.message == other.message
+ else:
+ return False
+
+ def __ne__(self, other):
+ return not self.__eq__(other)
+
+
+class Component(object):
+ """Component objects are singletons managed by the :class:`ComponentRegistry`.
+
+ When a new Component object is instantiated, it will be automatically
+ registered with the :class:`ComponentRegistry`.
+
+ The ComponentRegistry has the ability to start, stop, pause and shutdown the
+ components registered with it.
+
+ **Events:**
+
+ **start()** - This method is called when the client has connected to a
+ Deluge core.
+
+ **stop()** - This method is called when the client has disconnected from a
+ Deluge core.
+
+ **update()** - This method is called every 1 second by default while the
+ Componented is in a *Started* state. The interval can be
+ specified during instantiation. The update() timer can be
+ paused by instructing the :class:`ComponentRegistry` to pause
+ this Component.
+
+ **shutdown()** - This method is called when the client is exiting. If the
+ Component is in a "Started" state when this is called, a
+ call to stop() will be issued prior to shutdown().
+
+ **States:**
+
+ A Component can be in one of these 5 states.
+
+ **Started** - The Component has been started by the :class:`ComponentRegistry`
+ and will have it's update timer started.
+
+ **Starting** - The Component has had it's start method called, but it hasn't
+ fully started yet.
+
+ **Stopped** - The Component has either been stopped or has yet to be started.
+
+ **Stopping** - The Component has had it's stop method called, but it hasn't
+ fully stopped yet.
+
+ **Paused** - The Component has had it's update timer stopped, but will
+ still be considered in a Started state.
+
+ """
+
+ def __init__(self, name, interval=1, depend=None):
+ """Initialize component.
+
+ Args:
+ name (str): Name of component.
+ interval (int, optional): The interval in seconds to call the update function.
+ depend (list, optional): The names of components this component depends on.
+
+ """
+ self._component_name = name
+ self._component_interval = interval
+ self._component_depend = depend
+ self._component_state = 'Stopped'
+ self._component_timer = None
+ self._component_starting_deferred = None
+ self._component_stopping_deferred = None
+ _ComponentRegistry.register(self)
+
+ def __del__(self):
+ if _ComponentRegistry:
+ _ComponentRegistry.deregister(self)
+
+ def _component_start_timer(self):
+ if hasattr(self, 'update'):
+ self._component_timer = LoopingCall(self.update)
+ self._component_timer.start(self._component_interval)
+
+ def _component_start(self):
+ def on_start(result):
+ self._component_state = 'Started'
+ self._component_starting_deferred = None
+ self._component_start_timer()
+ return True
+
+ def on_start_fail(result):
+ self._component_state = 'Stopped'
+ self._component_starting_deferred = None
+ log.error(result)
+ return fail(result)
+
+ if self._component_state == 'Stopped':
+ if hasattr(self, 'start'):
+ self._component_state = 'Starting'
+ d = deferLater(reactor, 0, self.start)
+ d.addCallbacks(on_start, on_start_fail)
+ self._component_starting_deferred = d
+ else:
+ d = maybeDeferred(on_start, None)
+ elif self._component_state == 'Starting':
+ return self._component_starting_deferred
+ elif self._component_state == 'Started':
+ d = succeed(True)
+ else:
+ d = fail(
+ ComponentException(
+ 'Trying to start component "%s" but it is '
+ 'not in a stopped state. Current state: %s'
+ % (self._component_name, self._component_state),
+ traceback.format_stack(limit=4),
+ )
+ )
+ return d
+
+ def _component_stop(self):
+ def on_stop(result):
+ self._component_state = 'Stopped'
+ if self._component_timer and self._component_timer.running:
+ self._component_timer.stop()
+ return True
+
+ def on_stop_fail(result):
+ self._component_state = 'Started'
+ self._component_stopping_deferred = None
+ log.error(result)
+ return result
+
+ if self._component_state != 'Stopped' and self._component_state != 'Stopping':
+ if hasattr(self, 'stop'):
+ self._component_state = 'Stopping'
+ d = maybeDeferred(self.stop)
+ d.addCallback(on_stop)
+ d.addErrback(on_stop_fail)
+ self._component_stopping_deferred = d
+ else:
+ d = maybeDeferred(on_stop, None)
+
+ if self._component_state == 'Stopping':
+ return self._component_stopping_deferred
+
+ return succeed(None)
+
+ def _component_pause(self):
+ def on_pause(result):
+ self._component_state = 'Paused'
+
+ if self._component_state == 'Started':
+ if self._component_timer and self._component_timer.running:
+ d = maybeDeferred(self._component_timer.stop)
+ d.addCallback(on_pause)
+ else:
+ d = succeed(None)
+ elif self._component_state == 'Paused':
+ d = succeed(None)
+ else:
+ d = fail(
+ ComponentException(
+ 'Trying to pause component "%s" but it is '
+ 'not in a started state. Current state: %s'
+ % (self._component_name, self._component_state),
+ traceback.format_stack(limit=4),
+ )
+ )
+ return d
+
+ def _component_resume(self):
+ def on_resume(result):
+ self._component_state = 'Started'
+
+ if self._component_state == 'Paused':
+ d = maybeDeferred(self._component_start_timer)
+ d.addCallback(on_resume)
+ else:
+ d = fail(
+ ComponentException(
+ 'Trying to resume component "%s" but it is '
+ 'not in a paused state. Current state: %s'
+ % (self._component_name, self._component_state),
+ traceback.format_stack(limit=4),
+ )
+ )
+ return d
+
+ def _component_shutdown(self):
+ def on_stop(result):
+ if hasattr(self, 'shutdown'):
+ return maybeDeferred(self.shutdown)
+ return succeed(None)
+
+ d = self._component_stop()
+ d.addCallback(on_stop)
+ return d
+
+ def get_state(self):
+ return self._component_state
+
+ def start(self):
+ pass
+
+ def stop(self):
+ pass
+
+ def update(self):
+ pass
+
+ def shutdown(self):
+ pass
+
+
+class ComponentRegistry(object):
+ """The ComponentRegistry holds a list of currently registered :class:`Component` objects.
+
+ It is used to manage the Components by starting, stopping, pausing and shutting them down.
+ """
+
+ def __init__(self):
+ self.components = {}
+ # Stores all of the components that are dependent on a particular component
+ self.dependents = defaultdict(list)
+
+ def register(self, obj):
+ """Register a component object with the registry.
+
+ Note:
+ This is done automatically when a Component object is instantiated.
+
+ Args:
+ obj (Component): A component object to register.
+
+ Raises:
+ ComponentAlreadyRegistered: If a component with the same name is already registered.
+
+ """
+ name = obj._component_name
+ if name in self.components:
+ raise ComponentAlreadyRegistered(
+ 'Component already registered with name %s' % name
+ )
+
+ self.components[obj._component_name] = obj
+ if obj._component_depend:
+ for depend in obj._component_depend:
+ self.dependents[depend].append(name)
+
+ def deregister(self, obj):
+ """Deregister a component from the registry. A stop will be
+ issued to the component prior to deregistering it.
+
+ Args:
+ obj (Component): a component object to deregister
+
+ Returns:
+ Deferred: a deferred object that will fire once the Component has been sucessfully deregistered
+
+ """
+ if obj in self.components.values():
+ log.debug('Deregistering Component: %s', obj._component_name)
+ d = self.stop([obj._component_name])
+
+ def on_stop(result, name):
+ # Component may have been removed, so pop to ensure it doesn't fail
+ self.components.pop(name, None)
+
+ return d.addCallback(on_stop, obj._component_name)
+ else:
+ return succeed(None)
+
+ def start(self, names=None):
+ """Start Components, and their dependencies, that are currently in a Stopped state.
+
+ Note:
+ If no names are specified then all registered components will be started.
+
+ Args:
+ names (list): A list of Components to start and their dependencies.
+
+ Returns:
+ Deferred: Fired once all Components have been successfully started.
+
+ """
+ # Start all the components if names is empty
+ if not names:
+ names = list(self.components)
+ elif isinstance(names, string_types):
+ names = [names]
+
+ def on_depends_started(result, name):
+ return self.components[name]._component_start()
+
+ deferreds = []
+
+ for name in names:
+ if self.components[name]._component_depend:
+ # This component has depends, so we need to start them first.
+ d = self.start(self.components[name]._component_depend)
+ d.addCallback(on_depends_started, name)
+ deferreds.append(d)
+ else:
+ deferreds.append(self.components[name]._component_start())
+
+ return DeferredList(deferreds)
+
+ def stop(self, names=None):
+ """Stop Components that are currently not in a Stopped state.
+
+ Note:
+ If no names are specified then all registered components will be stopped.
+
+ Args:
+ names (list): A list of Components to stop.
+
+ Returns:
+ Deferred: Fired once all Components have been successfully stopped.
+
+ """
+ if not names:
+ names = list(self.components)
+ elif isinstance(names, string_types):
+ names = [names]
+
+ def on_dependents_stopped(result, name):
+ return self.components[name]._component_stop()
+
+ stopped_in_deferred = set()
+ deferreds = []
+
+ for name in names:
+ if name in stopped_in_deferred:
+ continue
+ if name in self.components:
+ if name in self.dependents:
+ # If other components depend on this component, stop them first
+ d = self.stop(self.dependents[name]).addCallback(
+ on_dependents_stopped, name
+ )
+ deferreds.append(d)
+ stopped_in_deferred.update(self.dependents[name])
+ else:
+ deferreds.append(self.components[name]._component_stop())
+
+ return DeferredList(deferreds)
+
+ def pause(self, names=None):
+ """Pause Components that are currently in a Started state.
+
+ Note:
+ If no names are specified then all registered components will be paused.
+
+ Args:
+ names (list): A list of Components to pause.
+
+ Returns:
+ Deferred: Fired once all Components have been successfully paused.
+
+ """
+ if not names:
+ names = list(self.components)
+ elif isinstance(names, string_types):
+ names = [names]
+
+ deferreds = []
+
+ for name in names:
+ if self.components[name]._component_state == 'Started':
+ deferreds.append(self.components[name]._component_pause())
+
+ return DeferredList(deferreds)
+
+ def resume(self, names=None):
+ """Resume Components that are currently in a Paused state.
+
+ Note:
+ If no names are specified then all registered components will be resumed.
+
+ Args:
+ names (list): A list of Components to to resume.
+
+ Returns:
+ Deferred: Fired once all Components have been successfully resumed.
+
+ """
+ if not names:
+ names = list(self.components)
+ elif isinstance(names, string_types):
+ names = [names]
+
+ deferreds = []
+
+ for name in names:
+ if self.components[name]._component_state == 'Paused':
+ deferreds.append(self.components[name]._component_resume())
+
+ return DeferredList(deferreds)
+
+ def shutdown(self):
+ """Shutdown all Components regardless of state.
+
+ This will call stop() on all the components prior to shutting down. This should be called
+ when the program is exiting to ensure all Components have a chance to properly shutdown.
+
+ Returns:
+ Deferred: Fired once all Components have been successfully shut down.
+
+ """
+
+ def on_stopped(result):
+ return DeferredList(
+ [comp._component_shutdown() for comp in self.components.values()]
+ )
+
+ return self.stop(list(self.components)).addCallback(on_stopped)
+
+ def update(self):
+ """Update all Components that are in a Started state."""
+ for component in self.components.items():
+ try:
+ component.update()
+ except BaseException as ex:
+ log.exception(ex)
+
+
+_ComponentRegistry = ComponentRegistry()
+
+deregister = _ComponentRegistry.deregister
+start = _ComponentRegistry.start
+stop = _ComponentRegistry.stop
+pause = _ComponentRegistry.pause
+resume = _ComponentRegistry.resume
+update = _ComponentRegistry.update
+shutdown = _ComponentRegistry.shutdown
+
+
+def get(name):
+ """Return a reference to a component.
+
+ Args:
+ name (str): The Component name to get.
+
+ Returns:
+ Component: The Component object.
+
+ Raises:
+ KeyError: If the Component does not exist.
+
+ """
+ return _ComponentRegistry.components[name]
diff --git a/deluge/config.py b/deluge/config.py
new file mode 100644
index 0000000..c852996
--- /dev/null
+++ b/deluge/config.py
@@ -0,0 +1,569 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""
+Deluge Config Module
+
+This module is used for loading and saving of configuration files.. or anything
+really.
+
+The format of the config file is two json encoded dicts:
+
+<version dict>
+<content dict>
+
+The version dict contains two keys: file and format. The format version is
+controlled by the Config class. It should only be changed when anything below
+it is changed directly by the Config class. An example of this would be if we
+changed the serializer for the content to something different.
+
+The config file version is changed by the 'owner' of the config file. This is
+to signify that there is a change in the naming of some config keys or something
+similar along those lines.
+
+The content is simply the dict to be saved and will be serialized before being
+written.
+
+Converting
+
+Since the format of the config could change, there needs to be a way to have
+the Config object convert to newer formats. To do this, you will need to
+register conversion functions for various versions of the config file. Note that
+this can only be done for the 'config file version' and not for the 'format'
+version as this will be done internally.
+
+"""
+from __future__ import unicode_literals
+
+import json
+import logging
+import os
+import shutil
+from codecs import getwriter
+from io import open
+from tempfile import NamedTemporaryFile
+
+import six.moves.cPickle as pickle # noqa: N813
+
+from deluge.common import JSON_FORMAT, get_default_config_dir
+
+log = logging.getLogger(__name__)
+callLater = None # noqa: N816 Necessary for the config tests
+
+
+def prop(func):
+ """Function decorator for defining property attributes
+
+ The decorated function is expected to return a dictionary
+ containing one or more of the following pairs:
+
+ fget - function for getting attribute value
+ fset - function for setting attribute value
+ fdel - function for deleting attribute
+
+ This can be conveniently constructed by the locals() builtin
+ function; see:
+ http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/205183
+ """
+ return property(doc=func.__doc__, **func())
+
+
+def find_json_objects(s):
+ """Find json objects in a string.
+
+ Args:
+ s (str): the string to find json objects in
+
+ Returns:
+ list: A list of tuples containing start and end locations of json
+ objects in string `s`. e.g. [(start, end), ...]
+
+ """
+ objects = []
+ opens = 0
+ start = s.find('{')
+ offset = start
+
+ if start < 0:
+ return []
+
+ quoted = False
+ for index, c in enumerate(s[offset:]):
+ if c == '"':
+ quoted = not quoted
+ elif quoted:
+ continue
+ elif c == '{':
+ opens += 1
+ elif c == '}':
+ opens -= 1
+ if opens == 0:
+ objects.append((start, index + offset + 1))
+ start = index + offset + 1
+
+ return objects
+
+
+class Config(object):
+ """This class is used to access/create/modify config files.
+
+ Args:
+ filename (str): The config filename.
+ defaults (dict): The default config values to insert before loading the config file.
+ config_dir (str): the path to the config directory.
+ file_version (int): The file format for the default config values when creating
+ a fresh config. This value should be increased whenever a new migration function is
+ setup to convert old config files. (default: 1)
+
+ """
+
+ def __init__(self, filename, defaults=None, config_dir=None, file_version=1):
+ self.__config = {}
+ self.__set_functions = {}
+ self.__change_callbacks = []
+
+ # These hold the version numbers and they will be set when loaded
+ self.__version = {'format': 1, 'file': file_version}
+
+ # This will get set with a reactor.callLater whenever a config option
+ # is set.
+ self._save_timer = None
+
+ if defaults:
+ for key, value in defaults.items():
+ self.set_item(key, value)
+
+ # Load the config from file in the config_dir
+ if config_dir:
+ self.__config_file = os.path.join(config_dir, filename)
+ else:
+ self.__config_file = get_default_config_dir(filename)
+
+ self.load()
+
+ def __contains__(self, item):
+ return item in self.__config
+
+ def __setitem__(self, key, value):
+ """See set_item"""
+
+ return self.set_item(key, value)
+
+ def set_item(self, key, value):
+ """Sets item 'key' to 'value' in the config dictionary.
+
+ Does not allow changing the item's type unless it is None.
+
+ If the types do not match, it will attempt to convert it to the
+ set type before raising a ValueError.
+
+ Args:
+ key (str): Item to change to change.
+ value (any): The value to change item to, must be same type as what is
+ currently in the config.
+
+ Raises:
+ ValueError: Raised when the type of value is not the same as what is
+ currently in the config and it could not convert the value.
+
+ Examples:
+ >>> config = Config('test.conf')
+ >>> config['test'] = 5
+ >>> config['test']
+ 5
+
+ """
+ if key not in self.__config:
+ self.__config[key] = value
+ log.debug('Setting key "%s" to: %s (of type: %s)', key, value, type(value))
+ return
+
+ if self.__config[key] == value:
+ return
+
+ # Change the value type if it is not None and does not match.
+ type_match = isinstance(self.__config[key], (type(None), type(value)))
+ if value is not None and not type_match:
+ try:
+ oldtype = type(self.__config[key])
+ # Don't convert to bytes as requires encoding and value will
+ # be decoded anyway.
+ if oldtype is not bytes:
+ value = oldtype(value)
+ except ValueError:
+ log.warning('Value Type "%s" invalid for key: %s', type(value), key)
+ raise
+
+ if isinstance(value, bytes):
+ value = value.decode('utf8')
+
+ log.debug('Setting key "%s" to: %s (of type: %s)', key, value, type(value))
+ self.__config[key] = value
+
+ global callLater
+ if callLater is None:
+ # Must import here and not at the top or it will throw ReactorAlreadyInstalledError
+ from twisted.internet.reactor import (
+ callLater,
+ ) # pylint: disable=redefined-outer-name
+ # Run the set_function for this key if any
+ try:
+ for func in self.__set_functions[key]:
+ callLater(0, func, key, value)
+ except KeyError:
+ pass
+ try:
+
+ def do_change_callbacks(key, value):
+ for func in self.__change_callbacks:
+ func(key, value)
+
+ callLater(0, do_change_callbacks, key, value)
+ except Exception:
+ pass
+
+ # We set the save_timer for 5 seconds if not already set
+ if not self._save_timer or not self._save_timer.active():
+ self._save_timer = callLater(5, self.save)
+
+ def __getitem__(self, key):
+ """See get_item """
+ return self.get_item(key)
+
+ def get_item(self, key):
+ """Gets the value of item 'key'.
+
+ Args:
+ key (str): The item for which you want it's value.
+
+ Returns:
+ any: The value of item 'key'.
+
+ Raises:
+ ValueError: If 'key' is not in the config dictionary.
+
+ Examples:
+ >>> config = Config('test.conf', defaults={'test': 5})
+ >>> config['test']
+ 5
+
+ """
+ return self.__config[key]
+
+ def get(self, key, default=None):
+ """Gets the value of item 'key' if key is in the config, else default.
+
+ If default is not given, it defaults to None, so that this method
+ never raises a KeyError.
+
+ Args:
+ key (str): the item for which you want it's value
+ default (any): the default value if key is missing
+
+ Returns:
+ any: The value of item 'key' or default.
+
+ Examples:
+ >>> config = Config('test.conf', defaults={'test': 5})
+ >>> config.get('test', 10)
+ 5
+ >>> config.get('bad_key', 10)
+ 10
+
+ """
+ try:
+ return self.get_item(key)
+ except KeyError:
+ return default
+
+ def __delitem__(self, key):
+ """
+ See
+ :meth:`del_item`
+ """
+ self.del_item(key)
+
+ def del_item(self, key):
+ """Deletes item with a specific key from the configuration.
+
+ Args:
+ key (str): The item which you wish to delete.
+
+ Raises:
+ ValueError: If 'key' is not in the config dictionary.
+
+ Examples:
+ >>> config = Config('test.conf', defaults={'test': 5})
+ >>> del config['test']
+
+ """
+
+ del self.__config[key]
+
+ global callLater
+ if callLater is None:
+ # Must import here and not at the top or it will throw ReactorAlreadyInstalledError
+ from twisted.internet.reactor import (
+ callLater,
+ ) # pylint: disable=redefined-outer-name
+
+ # We set the save_timer for 5 seconds if not already set
+ if not self._save_timer or not self._save_timer.active():
+ self._save_timer = callLater(5, self.save)
+
+ def register_change_callback(self, callback):
+ """Registers a callback function for any changed value.
+
+ Will be called when any value is changed in the config dictionary.
+
+ Args:
+ callback (func): The function to call with parameters: f(key, value).
+
+ Examples:
+ >>> config = Config('test.conf', defaults={'test': 5})
+ >>> def cb(key, value):
+ ... print key, value
+ ...
+ >>> config.register_change_callback(cb)
+
+ """
+ self.__change_callbacks.append(callback)
+
+ def register_set_function(self, key, function, apply_now=True):
+ """Register a function to be called when a config value changes.
+
+ Args:
+ key (str): The item to monitor for change.
+ function (func): The function to call when the value changes, f(key, value).
+ apply_now (bool): If True, the function will be called immediately after it's registered.
+
+ Examples:
+ >>> config = Config('test.conf', defaults={'test': 5})
+ >>> def cb(key, value):
+ ... print key, value
+ ...
+ >>> config.register_set_function('test', cb, apply_now=True)
+ test 5
+
+ """
+ log.debug('Registering function for %s key..', key)
+ if key not in self.__set_functions:
+ self.__set_functions[key] = []
+
+ self.__set_functions[key].append(function)
+
+ # Run the function now if apply_now is set
+ if apply_now:
+ function(key, self.__config[key])
+ return
+
+ def apply_all(self):
+ """Calls all set functions.
+
+ Examples:
+ >>> config = Config('test.conf', defaults={'test': 5})
+ >>> def cb(key, value):
+ ... print key, value
+ ...
+ >>> config.register_set_function('test', cb, apply_now=False)
+ >>> config.apply_all()
+ test 5
+
+ """
+ log.debug('Calling all set functions..')
+ for key, value in self.__set_functions.items():
+ for func in value:
+ func(key, self.__config[key])
+
+ def apply_set_functions(self, key):
+ """Calls set functions for `:param:key`.
+
+ Args:
+ key (str): the config key
+
+ """
+ log.debug('Calling set functions for key %s..', key)
+ if key in self.__set_functions:
+ for func in self.__set_functions[key]:
+ func(key, self.__config[key])
+
+ def load(self, filename=None):
+ """Load a config file.
+
+ Args:
+ filename (str): If None, uses filename set in object initialization
+
+ """
+ if not filename:
+ filename = self.__config_file
+
+ try:
+ with open(filename, 'r', encoding='utf8') as _file:
+ data = _file.read()
+ except IOError as ex:
+ log.warning('Unable to open config file %s: %s', filename, ex)
+ return
+
+ objects = find_json_objects(data)
+
+ if not len(objects):
+ # No json objects found, try depickling it
+ try:
+ self.__config.update(pickle.loads(data))
+ except Exception as ex:
+ log.exception(ex)
+ log.warning('Unable to load config file: %s', filename)
+ elif len(objects) == 1:
+ start, end = objects[0]
+ try:
+ self.__config.update(json.loads(data[start:end]))
+ except Exception as ex:
+ log.exception(ex)
+ log.warning('Unable to load config file: %s', filename)
+ elif len(objects) == 2:
+ try:
+ start, end = objects[0]
+ self.__version.update(json.loads(data[start:end]))
+ start, end = objects[1]
+ self.__config.update(json.loads(data[start:end]))
+ except Exception as ex:
+ log.exception(ex)
+ log.warning('Unable to load config file: %s', filename)
+
+ log.debug(
+ 'Config %s version: %s.%s loaded: %s',
+ filename,
+ self.__version['format'],
+ self.__version['file'],
+ self.__config,
+ )
+
+ def save(self, filename=None):
+ """Save configuration to disk.
+
+ Args:
+ filename (str): If None, uses filename set in object initialization
+
+ Returns:
+ bool: Whether or not the save succeeded.
+
+ """
+ if not filename:
+ filename = self.__config_file
+ # Check to see if the current config differs from the one on disk
+ # We will only write a new config file if there is a difference
+ try:
+ with open(filename, 'r', encoding='utf8') as _file:
+ data = _file.read()
+ objects = find_json_objects(data)
+ start, end = objects[0]
+ version = json.loads(data[start:end])
+ start, end = objects[1]
+ loaded_data = json.loads(data[start:end])
+ if self.__config == loaded_data and self.__version == version:
+ # The config has not changed so lets just return
+ if self._save_timer and self._save_timer.active():
+ self._save_timer.cancel()
+ return True
+ except (IOError, IndexError) as ex:
+ log.warning('Unable to open config file: %s because: %s', filename, ex)
+
+ # Save the new config and make sure it's written to disk
+ try:
+ with NamedTemporaryFile(
+ prefix=os.path.basename(filename) + '.', delete=False
+ ) as _file:
+ filename_tmp = _file.name
+ log.debug('Saving new config file %s', filename_tmp)
+ json.dump(self.__version, getwriter('utf8')(_file), **JSON_FORMAT)
+ json.dump(self.__config, getwriter('utf8')(_file), **JSON_FORMAT)
+ _file.flush()
+ os.fsync(_file.fileno())
+ except IOError as ex:
+ log.error('Error writing new config file: %s', ex)
+ return False
+
+ # Resolve symlinked config files before backing up and saving.
+ filename = os.path.realpath(filename)
+
+ # Make a backup of the old config
+ try:
+ log.debug('Backing up old config file to %s.bak', filename)
+ shutil.move(filename, filename + '.bak')
+ except IOError as ex:
+ log.warning('Unable to backup old config: %s', ex)
+
+ # The new config file has been written successfully, so let's move it over
+ # the existing one.
+ try:
+ log.debug('Moving new config file %s to %s', filename_tmp, filename)
+ shutil.move(filename_tmp, filename)
+ except IOError as ex:
+ log.error('Error moving new config file: %s', ex)
+ return False
+ else:
+ return True
+ finally:
+ if self._save_timer and self._save_timer.active():
+ self._save_timer.cancel()
+
+ def run_converter(self, input_range, output_version, func):
+ """Runs a function that will convert file versions.
+
+ Args:
+ input_range (tuple): (int, int) The range of input versions this function will accept.
+ output_version (int): The version this function will convert to.
+ func (func): The function that will do the conversion, it will take the config
+ dict as an argument and return the augmented dict.
+
+ Raises:
+ ValueError: If output_version is less than the input_range.
+
+ """
+ if output_version in input_range or output_version <= max(input_range):
+ raise ValueError('output_version needs to be greater than input_range')
+
+ if self.__version['file'] not in input_range:
+ log.debug(
+ 'File version %s is not in input_range %s, ignoring converter function..',
+ self.__version['file'],
+ input_range,
+ )
+ return
+
+ try:
+ self.__config = func(self.__config)
+ except Exception as ex:
+ log.exception(ex)
+ log.error(
+ 'There was an exception try to convert config file %s %s to %s',
+ self.__config_file,
+ self.__version['file'],
+ output_version,
+ )
+ raise ex
+ else:
+ self.__version['file'] = output_version
+ self.save()
+
+ @property
+ def config_file(self):
+ return self.__config_file
+
+ @prop
+ def config(): # pylint: disable=no-method-argument
+ """The config dictionary"""
+
+ def fget(self):
+ return self.__config
+
+ def fdel(self):
+ return self.save()
+
+ return locals()
diff --git a/deluge/configmanager.py b/deluge/configmanager.py
new file mode 100644
index 0000000..bbb0389
--- /dev/null
+++ b/deluge/configmanager.py
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+
+import deluge.common
+import deluge.log
+from deluge.config import Config
+
+log = logging.getLogger(__name__)
+
+
+class _ConfigManager(object):
+ def __init__(self):
+ log.debug('ConfigManager started..')
+ self.config_files = {}
+ self.__config_directory = None
+
+ @property
+ def config_directory(self):
+ if self.__config_directory is None:
+ self.__config_directory = deluge.common.get_default_config_dir()
+ return self.__config_directory
+
+ def __del__(self):
+ del self.config_files
+
+ def set_config_dir(self, directory):
+ """
+ Sets the config directory.
+
+ :param directory: str, the directory where the config info should be
+
+ :returns bool: True if successfully changed directory, False if not
+ """
+
+ if not directory:
+ return False
+
+ # Ensure absolute dirpath
+ directory = os.path.abspath(directory)
+
+ log.info('Setting config directory to: %s', directory)
+ if not os.path.exists(directory):
+ # Try to create the config folder if it doesn't exist
+ try:
+ os.makedirs(directory)
+ except OSError as ex:
+ log.error('Unable to make config directory: %s', ex)
+ return False
+ elif not os.path.isdir(directory):
+ log.error('Config directory needs to be a directory!')
+ return False
+
+ self.__config_directory = directory
+
+ # Reset the config_files so we don't get config from old config folder
+ # XXX: Probably should have it go through the config_files dict and try
+ # to reload based on the new config directory
+ self.save()
+ self.config_files = {}
+ deluge.log.tweak_logging_levels()
+
+ return True
+
+ def get_config_dir(self):
+ return self.config_directory
+
+ def close(self, config):
+ """Closes a config file."""
+ try:
+ del self.config_files[config]
+ except KeyError:
+ pass
+
+ def save(self):
+ """Saves all the configs to disk."""
+ for value in self.config_files.values():
+ value.save()
+ # We need to return True to keep the timer active
+ return True
+
+ def get_config(self, config_file, defaults=None, file_version=1):
+ """Get a reference to the Config object for this filename"""
+ log.debug('Getting config: %s', config_file)
+ # Create the config object if not already created
+ if config_file not in self.config_files:
+ self.config_files[config_file] = Config(
+ config_file,
+ defaults,
+ config_dir=self.config_directory,
+ file_version=file_version,
+ )
+
+ return self.config_files[config_file]
+
+
+# Singleton functions
+_configmanager = _ConfigManager()
+
+
+def ConfigManager(config, defaults=None, file_version=1): # NOQA: N802
+ return _configmanager.get_config(
+ config, defaults=defaults, file_version=file_version
+ )
+
+
+def set_config_dir(directory):
+ """Sets the config directory, else just uses default"""
+ return _configmanager.set_config_dir(deluge.common.decode_bytes(directory))
+
+
+def get_config_dir(filename=None):
+ if filename is not None:
+ return os.path.join(_configmanager.get_config_dir(), filename)
+ else:
+ return _configmanager.get_config_dir()
+
+
+def close(config):
+ return _configmanager.close(config)
diff --git a/deluge/core/__init__.py b/deluge/core/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deluge/core/__init__.py
diff --git a/deluge/core/alertmanager.py b/deluge/core/alertmanager.py
new file mode 100644
index 0000000..2fe4222
--- /dev/null
+++ b/deluge/core/alertmanager.py
@@ -0,0 +1,152 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""
+
+The AlertManager handles all the libtorrent alerts.
+
+This should typically only be used by the Core. Plugins should utilize the
+`:mod:EventManager` for similar functionality.
+
+"""
+from __future__ import unicode_literals
+
+import logging
+import types
+
+from twisted.internet import reactor
+
+import deluge.component as component
+from deluge._libtorrent import lt
+from deluge.common import decode_bytes
+
+log = logging.getLogger(__name__)
+
+try:
+ SimpleNamespace = types.SimpleNamespace # Python 3.3+
+except AttributeError:
+
+ class SimpleNamespace(object): # Python 2.7
+ def __init__(self, **attr):
+ self.__dict__.update(attr)
+
+
+class AlertManager(component.Component):
+ """AlertManager fetches and processes libtorrent alerts"""
+
+ def __init__(self):
+ log.debug('AlertManager init...')
+ component.Component.__init__(self, 'AlertManager', interval=0.3)
+ self.session = component.get('Core').session
+
+ # Increase the alert queue size so that alerts don't get lost.
+ self.alert_queue_size = 10000
+ self.set_alert_queue_size(self.alert_queue_size)
+
+ alert_mask = (
+ lt.alert.category_t.error_notification
+ | lt.alert.category_t.port_mapping_notification
+ | lt.alert.category_t.storage_notification
+ | lt.alert.category_t.tracker_notification
+ | lt.alert.category_t.status_notification
+ | lt.alert.category_t.ip_block_notification
+ | lt.alert.category_t.performance_warning
+ )
+
+ self.session.apply_settings({'alert_mask': alert_mask})
+
+ # handlers is a dictionary of lists {"alert_type": [handler1,h2,..]}
+ self.handlers = {}
+ self.delayed_calls = []
+
+ def update(self):
+ self.delayed_calls = [dc for dc in self.delayed_calls if dc.active()]
+ self.handle_alerts()
+
+ def stop(self):
+ for delayed_call in self.delayed_calls:
+ if delayed_call.active():
+ delayed_call.cancel()
+ self.delayed_calls = []
+
+ def register_handler(self, alert_type, handler):
+ """
+ Registers a function that will be called when 'alert_type' is pop'd
+ in handle_alerts. The handler function should look like: handler(alert)
+ Where 'alert' is the actual alert object from libtorrent.
+
+ :param alert_type: str, this is string representation of the alert name
+ :param handler: func(alert), the function to be called when the alert is raised
+ """
+ if alert_type not in self.handlers:
+ # There is no entry for this alert type yet, so lets make it with an
+ # empty list.
+ self.handlers[alert_type] = []
+
+ # Append the handler to the list in the handlers dictionary
+ self.handlers[alert_type].append(handler)
+ log.debug('Registered handler for alert %s', alert_type)
+
+ def deregister_handler(self, handler):
+ """
+ De-registers the `:param:handler` function from all alert types.
+
+ :param handler: func, the handler function to deregister
+ """
+ # Iterate through all handlers and remove 'handler' where found
+ for (dummy_key, value) in self.handlers.items():
+ if handler in value:
+ # Handler is in this alert type list
+ value.remove(handler)
+
+ def handle_alerts(self):
+ """
+ Pops all libtorrent alerts in the session queue and handles them appropriately.
+ """
+ alerts = self.session.pop_alerts()
+ if not alerts:
+ return
+
+ num_alerts = len(alerts)
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('Alerts queued: %s', num_alerts)
+ if num_alerts > 0.9 * self.alert_queue_size:
+ log.warning(
+ 'Warning total alerts queued, %s, passes 90%% of queue size.',
+ num_alerts,
+ )
+
+ # Loop through all alerts in the queue
+ for alert in alerts:
+ alert_type = type(alert).__name__
+ # Display the alert message
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('%s: %s', alert_type, decode_bytes(alert.message()))
+ # Call any handlers for this alert type
+ if alert_type in self.handlers:
+ for handler in self.handlers[alert_type]:
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('Handling alert: %s', alert_type)
+ # Copy alert attributes
+ alert_copy = SimpleNamespace(
+ **{
+ attr: getattr(alert, attr)
+ for attr in dir(alert)
+ if not attr.startswith('__')
+ }
+ )
+ self.delayed_calls.append(reactor.callLater(0, handler, alert_copy))
+
+ def set_alert_queue_size(self, queue_size):
+ """Sets the maximum size of the libtorrent alert queue"""
+ log.info('Alert Queue Size set to %s', queue_size)
+ self.alert_queue_size = queue_size
+ component.get('Core').apply_session_setting(
+ 'alert_queue_size', self.alert_queue_size
+ )
diff --git a/deluge/core/authmanager.py b/deluge/core/authmanager.py
new file mode 100644
index 0000000..0d997c1
--- /dev/null
+++ b/deluge/core/authmanager.py
@@ -0,0 +1,289 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2011 Pedro Algarvio <pedro@algarvio.me>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+import shutil
+from io import open
+
+import deluge.component as component
+import deluge.configmanager as configmanager
+from deluge.common import (
+ AUTH_LEVEL_ADMIN,
+ AUTH_LEVEL_DEFAULT,
+ AUTH_LEVEL_NONE,
+ AUTH_LEVEL_NORMAL,
+ AUTH_LEVEL_READONLY,
+ create_localclient_account,
+)
+from deluge.error import AuthenticationRequired, AuthManagerError, BadLoginError
+
+log = logging.getLogger(__name__)
+
+AUTH_LEVELS_MAPPING = {
+ 'NONE': AUTH_LEVEL_NONE,
+ 'READONLY': AUTH_LEVEL_READONLY,
+ 'DEFAULT': AUTH_LEVEL_NORMAL,
+ 'NORMAL': AUTH_LEVEL_DEFAULT,
+ 'ADMIN': AUTH_LEVEL_ADMIN,
+}
+AUTH_LEVELS_MAPPING_REVERSE = {v: k for k, v in AUTH_LEVELS_MAPPING.items()}
+
+
+class Account(object):
+ __slots__ = ('username', 'password', 'authlevel')
+
+ def __init__(self, username, password, authlevel):
+ self.username = username
+ self.password = password
+ self.authlevel = authlevel
+
+ def data(self):
+ return {
+ 'username': self.username,
+ 'password': self.password,
+ 'authlevel': AUTH_LEVELS_MAPPING_REVERSE[self.authlevel],
+ 'authlevel_int': self.authlevel,
+ }
+
+ def __repr__(self):
+ return '<Account username="%(username)s" authlevel=%(authlevel)s>' % {
+ 'username': self.username,
+ 'authlevel': self.authlevel,
+ }
+
+
+class AuthManager(component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'AuthManager', interval=10)
+ self.__auth = {}
+ self.__auth_modification_time = None
+
+ def start(self):
+ self.__load_auth_file()
+
+ def stop(self):
+ self.__auth = {}
+
+ def shutdown(self):
+ pass
+
+ def update(self):
+ auth_file = configmanager.get_config_dir('auth')
+ # Check for auth file and create if necessary
+ if not os.path.isfile(auth_file):
+ log.info('Authfile not found, recreating it.')
+ self.__load_auth_file()
+ return
+
+ auth_file_modification_time = os.stat(auth_file).st_mtime
+ if self.__auth_modification_time != auth_file_modification_time:
+ log.info('Auth file changed, reloading it!')
+ self.__load_auth_file()
+
+ def authorize(self, username, password):
+ """Authorizes users based on username and password.
+
+ Args:
+ username (str): Username
+ password (str): Password
+
+ Returns:
+ int: The auth level for this user.
+
+ Raises:
+ AuthenticationRequired: If aditional details are required to authenticate.
+ BadLoginError: If the username does not exist or password does not match.
+
+ """
+ if not username:
+ raise AuthenticationRequired(
+ 'Username and Password are required.', username
+ )
+
+ if username not in self.__auth:
+ # Let's try to re-load the file.. Maybe it's been updated
+ self.__load_auth_file()
+ if username not in self.__auth:
+ raise BadLoginError('Username does not exist', username)
+
+ if self.__auth[username].password == password:
+ # Return the users auth level
+ return self.__auth[username].authlevel
+ elif not password and self.__auth[username].password:
+ raise AuthenticationRequired('Password is required', username)
+ else:
+ raise BadLoginError('Password does not match', username)
+
+ def has_account(self, username):
+ return username in self.__auth
+
+ def get_known_accounts(self):
+ """Returns a list of known deluge usernames."""
+ self.__load_auth_file()
+ return [account.data() for account in self.__auth.values()]
+
+ def create_account(self, username, password, authlevel):
+ if username in self.__auth:
+ raise AuthManagerError('Username in use.', username)
+ if authlevel not in AUTH_LEVELS_MAPPING:
+ raise AuthManagerError('Invalid auth level: %s' % authlevel)
+ try:
+ self.__auth[username] = Account(
+ username, password, AUTH_LEVELS_MAPPING[authlevel]
+ )
+ self.write_auth_file()
+ return True
+ except Exception as ex:
+ log.exception(ex)
+ raise ex
+
+ def update_account(self, username, password, authlevel):
+ if username not in self.__auth:
+ raise AuthManagerError('Username not known', username)
+ if authlevel not in AUTH_LEVELS_MAPPING:
+ raise AuthManagerError('Invalid auth level: %s' % authlevel)
+ try:
+ self.__auth[username].username = username
+ self.__auth[username].password = password
+ self.__auth[username].authlevel = AUTH_LEVELS_MAPPING[authlevel]
+ self.write_auth_file()
+ return True
+ except Exception as ex:
+ log.exception(ex)
+ raise ex
+
+ def remove_account(self, username):
+ if username not in self.__auth:
+ raise AuthManagerError('Username not known', username)
+ elif username == component.get('RPCServer').get_session_user():
+ raise AuthManagerError(
+ 'You cannot delete your own account while logged in!', username
+ )
+
+ del self.__auth[username]
+ self.write_auth_file()
+ return True
+
+ def write_auth_file(self):
+ filename = 'auth'
+ filepath = os.path.join(configmanager.get_config_dir(), filename)
+ filepath_bak = filepath + '.bak'
+ filepath_tmp = filepath + '.tmp'
+
+ try:
+ if os.path.isfile(filepath):
+ log.debug('Creating backup of %s at: %s', filename, filepath_bak)
+ shutil.copy2(filepath, filepath_bak)
+ except IOError as ex:
+ log.error('Unable to backup %s to %s: %s', filepath, filepath_bak, ex)
+ else:
+ log.info('Saving the %s at: %s', filename, filepath)
+ try:
+ with open(filepath_tmp, 'w', encoding='utf8') as _file:
+ for account in self.__auth.values():
+ _file.write(
+ '%(username)s:%(password)s:%(authlevel_int)s\n'
+ % account.data()
+ )
+ _file.flush()
+ os.fsync(_file.fileno())
+ shutil.move(filepath_tmp, filepath)
+ except IOError as ex:
+ log.error('Unable to save %s: %s', filename, ex)
+ if os.path.isfile(filepath_bak):
+ log.info('Restoring backup of %s from: %s', filename, filepath_bak)
+ shutil.move(filepath_bak, filepath)
+
+ self.__load_auth_file()
+
+ def __load_auth_file(self):
+ save_and_reload = False
+ filename = 'auth'
+ auth_file = configmanager.get_config_dir(filename)
+ auth_file_bak = auth_file + '.bak'
+
+ # Check for auth file and create if necessary
+ if not os.path.isfile(auth_file):
+ create_localclient_account()
+ return self.__load_auth_file()
+
+ auth_file_modification_time = os.stat(auth_file).st_mtime
+ if self.__auth_modification_time is None:
+ self.__auth_modification_time = auth_file_modification_time
+ elif self.__auth_modification_time == auth_file_modification_time:
+ # File didn't change, no need for re-parsing's
+ return
+
+ for _filepath in (auth_file, auth_file_bak):
+ log.info('Opening %s for load: %s', filename, _filepath)
+ try:
+ with open(_filepath, 'r', encoding='utf8') as _file:
+ file_data = _file.readlines()
+ except IOError as ex:
+ log.warning('Unable to load %s: %s', _filepath, ex)
+ file_data = []
+ else:
+ log.info('Successfully loaded %s: %s', filename, _filepath)
+ break
+
+ # Load the auth file into a dictionary: {username: Account(...)}
+ for line in file_data:
+ line = line.strip()
+ if line.startswith('#') or not line:
+ # This line is a comment or empty
+ continue
+ lsplit = line.split(':')
+ if len(lsplit) == 2:
+ username, password = lsplit
+ log.warning(
+ 'Your auth entry for %s contains no auth level, '
+ 'using AUTH_LEVEL_DEFAULT(%s)..',
+ username,
+ AUTH_LEVEL_DEFAULT,
+ )
+ if username == 'localclient':
+ authlevel = AUTH_LEVEL_ADMIN
+ else:
+ authlevel = AUTH_LEVEL_DEFAULT
+ # This is probably an old auth file
+ save_and_reload = True
+ elif len(lsplit) == 3:
+ username, password, authlevel = lsplit
+ else:
+ log.error('Your auth file is malformed: Incorrect number of fields!')
+ continue
+
+ username = username.strip()
+ password = password.strip()
+ try:
+ authlevel = int(authlevel)
+ except ValueError:
+ try:
+ authlevel = AUTH_LEVELS_MAPPING[authlevel]
+ except KeyError:
+ log.error(
+ 'Your auth file is malformed: %r is not a valid auth level',
+ authlevel,
+ )
+ continue
+
+ self.__auth[username] = Account(username, password, authlevel)
+
+ if 'localclient' not in self.__auth:
+ create_localclient_account(True)
+ return self.__load_auth_file()
+
+ if save_and_reload:
+ log.info('Re-writing auth file (upgrade)')
+ self.write_auth_file()
+ self.__auth_modification_time = auth_file_modification_time
diff --git a/deluge/core/core.py b/deluge/core/core.py
new file mode 100644
index 0000000..9a19e30
--- /dev/null
+++ b/deluge/core/core.py
@@ -0,0 +1,1301 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2011 Pedro Algarvio <pedro@algarvio.me>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import glob
+import logging
+import os
+import shutil
+import tempfile
+import threading
+from base64 import b64decode, b64encode
+
+from six import string_types
+from twisted.internet import defer, reactor, task
+from twisted.web.client import Agent, readBody
+
+import deluge.common
+import deluge.component as component
+from deluge import path_chooser_common
+from deluge._libtorrent import LT_VERSION, lt
+from deluge.configmanager import ConfigManager, get_config_dir
+from deluge.core.alertmanager import AlertManager
+from deluge.core.authmanager import (
+ AUTH_LEVEL_ADMIN,
+ AUTH_LEVEL_NONE,
+ AUTH_LEVELS_MAPPING,
+ AUTH_LEVELS_MAPPING_REVERSE,
+ AuthManager,
+)
+from deluge.core.eventmanager import EventManager
+from deluge.core.filtermanager import FilterManager
+from deluge.core.pluginmanager import PluginManager
+from deluge.core.preferencesmanager import PreferencesManager
+from deluge.core.rpcserver import export
+from deluge.core.torrentmanager import TorrentManager
+from deluge.decorators import deprecated
+from deluge.error import (
+ AddTorrentError,
+ DelugeError,
+ InvalidPathError,
+ InvalidTorrentError,
+)
+from deluge.event import (
+ NewVersionAvailableEvent,
+ SessionPausedEvent,
+ SessionResumedEvent,
+ TorrentQueueChangedEvent,
+)
+from deluge.httpdownloader import download_file
+
+try:
+ from urllib.request import urlopen, URLError
+except ImportError:
+ # PY2 fallback
+ from urllib2 import urlopen, URLError
+
+log = logging.getLogger(__name__)
+
+DEPR_SESSION_STATUS_KEYS = {
+ # 'active_requests': None, # In dht_stats_alert, if required.
+ 'allowed_upload_slots': 'ses.num_unchoke_slots',
+ # 'dht_global_nodes': None,
+ 'dht_node_cache': 'dht.dht_node_cache',
+ 'dht_nodes': 'dht.dht_nodes',
+ 'dht_torrents': 'dht.dht_torrents',
+ # 'dht_total_allocations': None,
+ 'down_bandwidth_bytes_queue': 'net.limiter_down_bytes',
+ 'down_bandwidth_queue': 'net.limiter_down_queue',
+ 'has_incoming_connections': 'net.has_incoming_connections',
+ 'num_peers': 'peer.num_peers_connected',
+ 'num_unchoked': 'peer.num_peers_up_unchoked',
+ # 'optimistic_unchoke_counter': None, # lt.settings_pack
+ 'total_dht_download': 'dht.dht_bytes_in',
+ 'total_dht_upload': 'dht.dht_bytes_out',
+ 'total_download': 'net.recv_bytes',
+ 'total_failed_bytes': 'net.recv_failed_bytes',
+ 'total_ip_overhead_download': 'net.recv_ip_overhead_bytes',
+ 'total_ip_overhead_upload': 'net.sent_ip_overhead_bytes',
+ 'total_payload_download': 'net.recv_payload_bytes',
+ 'total_payload_upload': 'net.sent_payload_bytes',
+ 'total_redundant_bytes': 'net.recv_redundant_bytes',
+ 'total_tracker_download': 'net.recv_tracker_bytes',
+ 'total_tracker_upload': 'net.sent_tracker_bytes',
+ 'total_upload': 'net.sent_bytes',
+ # 'unchoke_counter': None, # lt.settings_pack
+ 'up_bandwidth_bytes_queue': 'net.limiter_up_bytes',
+ 'up_bandwidth_queue': 'net.limiter_up_queue',
+ # 'utp_stats': None
+}
+
+# Session status rate keys associated with session status counters.
+SESSION_RATES_MAPPING = {
+ 'dht_download_rate': 'dht.dht_bytes_in',
+ 'dht_upload_rate': 'dht.dht_bytes_out',
+ 'ip_overhead_download_rate': 'net.recv_ip_overhead_bytes',
+ 'ip_overhead_upload_rate': 'net.sent_ip_overhead_bytes',
+ 'payload_download_rate': 'net.recv_payload_bytes',
+ 'payload_upload_rate': 'net.sent_payload_bytes',
+ 'tracker_download_rate': 'net.recv_tracker_bytes',
+ 'tracker_upload_rate': 'net.sent_tracker_bytes',
+ 'download_rate': 'net.recv_bytes',
+ 'upload_rate': 'net.sent_bytes',
+}
+
+DELUGE_VER = deluge.common.get_version()
+
+
+class Core(component.Component):
+ def __init__(
+ self, listen_interface=None, outgoing_interface=None, read_only_config_keys=None
+ ):
+ component.Component.__init__(self, 'Core')
+
+ # Start the libtorrent session.
+ user_agent = 'Deluge/{} libtorrent/{}'.format(DELUGE_VER, LT_VERSION)
+ peer_id = self._create_peer_id(DELUGE_VER)
+ log.debug('Starting session (peer_id: %s, user_agent: %s)', peer_id, user_agent)
+ settings_pack = {
+ 'peer_fingerprint': peer_id,
+ 'user_agent': user_agent,
+ 'ignore_resume_timestamps': True,
+ }
+ self.session = lt.session(settings_pack, flags=0)
+
+ # Load the settings, if available.
+ self._load_session_state()
+
+ # Enable libtorrent extensions
+ # Allows peers to download the metadata from the swarm directly
+ self.session.add_extension('ut_metadata')
+ # Ban peers that sends bad data
+ self.session.add_extension('smart_ban')
+
+ # Create the components
+ self.eventmanager = EventManager()
+ self.preferencesmanager = PreferencesManager()
+ self.alertmanager = AlertManager()
+ self.pluginmanager = PluginManager(self)
+ self.torrentmanager = TorrentManager()
+ self.filtermanager = FilterManager(self)
+ self.authmanager = AuthManager()
+
+ # New release check information
+ self.new_release = None
+
+ # External IP Address from libtorrent
+ self.external_ip = None
+ self.eventmanager.register_event_handler(
+ 'ExternalIPEvent', self._on_external_ip_event
+ )
+
+ # GeoIP instance with db loaded
+ self.geoip_instance = None
+
+ # These keys will be dropped from the set_config() RPC and are
+ # configurable from the command-line.
+ self.read_only_config_keys = read_only_config_keys
+ log.debug('read_only_config_keys: %s', read_only_config_keys)
+
+ # Get the core config
+ self.config = ConfigManager('core.conf')
+ self.config.save()
+
+ # If there was an interface value from the command line, use it, but
+ # store the one in the config so we can restore it on shutdown
+ self._old_listen_interface = None
+ if listen_interface:
+ if deluge.common.is_ip(listen_interface):
+ self._old_listen_interface = self.config['listen_interface']
+ self.config['listen_interface'] = listen_interface
+ else:
+ log.error(
+ 'Invalid listen interface (must be IP Address): %s',
+ listen_interface,
+ )
+
+ self._old_outgoing_interface = None
+ if outgoing_interface:
+ self._old_outgoing_interface = self.config['outgoing_interface']
+ self.config['outgoing_interface'] = outgoing_interface
+
+ # New release check information
+ self.__new_release = None
+
+ # Session status timer
+ self.session_status = {k.name: 0 for k in lt.session_stats_metrics()}
+ self._session_prev_bytes = {k: 0 for k in SESSION_RATES_MAPPING}
+ # Initiate other session status keys.
+ self.session_status.update(self._session_prev_bytes)
+ hit_ratio_keys = ['write_hit_ratio', 'read_hit_ratio']
+ self.session_status.update({k: 0.0 for k in hit_ratio_keys})
+
+ self.session_status_timer_interval = 0.5
+ self.session_status_timer = task.LoopingCall(self.session.post_session_stats)
+ self.alertmanager.register_handler(
+ 'session_stats_alert', self._on_alert_session_stats
+ )
+ self.session_rates_timer_interval = 2
+ self.session_rates_timer = task.LoopingCall(self._update_session_rates)
+
+ def start(self):
+ """Starts the core"""
+ self.session_status_timer.start(self.session_status_timer_interval)
+ self.session_rates_timer.start(self.session_rates_timer_interval, now=False)
+
+ def stop(self):
+ log.debug('Core stopping...')
+
+ if self.session_status_timer.running:
+ self.session_status_timer.stop()
+
+ if self.session_rates_timer.running:
+ self.session_rates_timer.stop()
+
+ # Save the libtorrent session state
+ self._save_session_state()
+
+ # We stored a copy of the old interface value
+ if self._old_listen_interface is not None:
+ self.config['listen_interface'] = self._old_listen_interface
+
+ if self._old_outgoing_interface is not None:
+ self.config['outgoing_interface'] = self._old_outgoing_interface
+
+ # Make sure the config file has been saved
+ self.config.save()
+
+ def shutdown(self):
+ pass
+
+ def apply_session_setting(self, key, value):
+ self.apply_session_settings({key: value})
+
+ def apply_session_settings(self, settings):
+ """Apply libtorrent session settings.
+
+ Args:
+ settings (dict): A dict of lt session settings to apply.
+
+ """
+ self.session.apply_settings(settings)
+
+ @staticmethod
+ def _create_peer_id(version):
+ """Create a peer_id fingerprint.
+
+ This creates the peer_id and modifies the release char to identify
+ pre-release and development version. Using ``D`` for dev, daily or
+ nightly builds, ``a, b, r`` for pre-releases and ``s`` for
+ stable releases.
+
+ Examples:
+ ``--<client><client><major><minor><micro><release>--``
+ ``--DE200D--`` (development version of 2.0.0)
+ ``--DE200s--`` (stable release of v2.0.0)
+ ``--DE201b--`` (beta pre-release of v2.0.1)
+
+ Args:
+ version (str): The version string in PEP440 dotted notation.
+
+ Returns:
+ str: The formattted peer_id with Deluge prefix e.g. '--DE200s--'
+
+ """
+ split = deluge.common.VersionSplit(version)
+ # Fill list with zeros to length of 4 and use lt to create fingerprint.
+ version_list = split.version + [0] * (4 - len(split.version))
+ peer_id = lt.generate_fingerprint('DE', *version_list)
+
+ def substitute_chr(string, idx, char):
+ """Fast substitute single char in string."""
+ return string[:idx] + char + string[idx + 1 :]
+
+ if split.dev:
+ release_chr = 'D'
+ elif split.suffix:
+ # a (alpha), b (beta) or r (release candidate).
+ release_chr = split.suffix[0].lower()
+ else:
+ release_chr = 's'
+ peer_id = substitute_chr(peer_id, 6, release_chr)
+
+ return peer_id
+
+ def _save_session_state(self):
+ """Saves the libtorrent session state"""
+ filename = 'session.state'
+ filepath = get_config_dir(filename)
+ filepath_bak = filepath + '.bak'
+ filepath_tmp = filepath + '.tmp'
+
+ try:
+ if os.path.isfile(filepath):
+ log.debug('Creating backup of %s at: %s', filename, filepath_bak)
+ shutil.copy2(filepath, filepath_bak)
+ except IOError as ex:
+ log.error('Unable to backup %s to %s: %s', filepath, filepath_bak, ex)
+ else:
+ log.info('Saving the %s at: %s', filename, filepath)
+ try:
+ with open(filepath_tmp, 'wb') as _file:
+ _file.write(lt.bencode(self.session.save_state()))
+ _file.flush()
+ os.fsync(_file.fileno())
+ shutil.move(filepath_tmp, filepath)
+ except (IOError, EOFError) as ex:
+ log.error('Unable to save %s: %s', filename, ex)
+ if os.path.isfile(filepath_bak):
+ log.info('Restoring backup of %s from: %s', filename, filepath_bak)
+ shutil.move(filepath_bak, filepath)
+
+ def _load_session_state(self):
+ """Loads the libtorrent session state
+
+ Returns:
+ dict: A libtorrent sesion state, empty dict if unable to load it.
+
+ """
+ filename = 'session.state'
+ filepath = get_config_dir(filename)
+ filepath_bak = filepath + '.bak'
+
+ for _filepath in (filepath, filepath_bak):
+ log.debug('Opening %s for load: %s', filename, _filepath)
+ try:
+ with open(_filepath, 'rb') as _file:
+ state = lt.bdecode(_file.read())
+ except (IOError, EOFError, RuntimeError) as ex:
+ log.warning('Unable to load %s: %s', _filepath, ex)
+ else:
+ log.info('Successfully loaded %s: %s', filename, _filepath)
+ self.session.load_state(state)
+
+ def _on_alert_session_stats(self, alert):
+ """The handler for libtorrent session stats alert"""
+ self.session_status.update(alert.values)
+ self._update_session_cache_hit_ratio()
+
+ def _update_session_cache_hit_ratio(self):
+ """Calculates the cache read/write hit ratios for session_status."""
+ blocks_written = self.session_status['disk.num_blocks_written']
+ blocks_read = self.session_status['disk.num_blocks_read']
+
+ if blocks_written:
+ self.session_status['write_hit_ratio'] = (
+ blocks_written - self.session_status['disk.num_write_ops']
+ ) / blocks_written
+ else:
+ self.session_status['write_hit_ratio'] = 0.0
+
+ if blocks_read:
+ self.session_status['read_hit_ratio'] = (
+ self.session_status['disk.num_blocks_cache_hits'] / blocks_read
+ )
+ else:
+ self.session_status['read_hit_ratio'] = 0.0
+
+ def _update_session_rates(self):
+ """Calculate session status rates.
+
+ Uses polling interval and counter difference for session_status rates.
+ """
+ for rate_key, prev_bytes in list(self._session_prev_bytes.items()):
+ new_bytes = self.session_status[SESSION_RATES_MAPPING[rate_key]]
+ self.session_status[rate_key] = (
+ new_bytes - prev_bytes
+ ) / self.session_rates_timer_interval
+ # Store current value for next update.
+ self._session_prev_bytes[rate_key] = new_bytes
+
+ def get_new_release(self):
+ log.debug('get_new_release')
+ try:
+ self.new_release = (
+ urlopen('http://download.deluge-torrent.org/version-2.0')
+ .read()
+ .decode()
+ .strip()
+ )
+ except URLError as ex:
+ log.debug('Unable to get release info from website: %s', ex)
+ else:
+ self.check_new_release()
+
+ def check_new_release(self):
+ if self.new_release:
+ log.debug('new_release: %s', self.new_release)
+ if deluge.common.VersionSplit(
+ self.new_release
+ ) > deluge.common.VersionSplit(deluge.common.get_version()):
+ component.get('EventManager').emit(
+ NewVersionAvailableEvent(self.new_release)
+ )
+ return self.new_release
+ return False
+
+ # Exported Methods
+ @export
+ def add_torrent_file_async(self, filename, filedump, options, save_state=True):
+ """Adds a torrent file to the session asynchonously.
+
+ Args:
+ filename (str): The filename of the torrent.
+ filedump (str): A base64 encoded string of torrent file contents.
+ options (dict): The options to apply to the torrent upon adding.
+ save_state (bool): If the state should be saved after adding the file.
+
+ Returns:
+ Deferred: The torrent ID or None.
+
+ """
+ try:
+ filedump = b64decode(filedump)
+ except TypeError as ex:
+ log.error('There was an error decoding the filedump string: %s', ex)
+
+ try:
+ d = self.torrentmanager.add_async(
+ filedump=filedump,
+ options=options,
+ filename=filename,
+ save_state=save_state,
+ )
+ except RuntimeError as ex:
+ log.error('There was an error adding the torrent file %s: %s', filename, ex)
+ raise
+ else:
+ return d
+
+ @export
+ def prefetch_magnet_metadata(self, magnet, timeout=30):
+ """Download magnet metadata without adding to Deluge session.
+
+ Used by UIs to get magnet files for selection before adding to session.
+
+ Args:
+ magnet (str): The magnet uri.
+ timeout (int): Number of seconds to wait before cancelling request.
+
+ Returns:
+ Deferred: A tuple of (torrent_id (str), metadata (dict)) for the magnet.
+
+ """
+
+ def on_metadata(result, result_d):
+ """Return result of torrent_id and metadata"""
+ result_d.callback(result)
+ return result
+
+ d = self.torrentmanager.prefetch_metadata(magnet, timeout)
+ # Use a seperate callback chain to handle existing prefetching magnet.
+ result_d = defer.Deferred()
+ d.addBoth(on_metadata, result_d)
+ return result_d
+
+ @export
+ def add_torrent_file(self, filename, filedump, options):
+ """Adds a torrent file to the session.
+
+ Args:
+ filename (str): The filename of the torrent.
+ filedump (str): A base64 encoded string of the torrent file contents.
+ options (dict): The options to apply to the torrent upon adding.
+
+ Returns:
+ str: The torrent_id or None.
+ """
+ try:
+ filedump = b64decode(filedump)
+ except Exception as ex:
+ log.error('There was an error decoding the filedump string: %s', ex)
+
+ try:
+ return self.torrentmanager.add(
+ filedump=filedump, options=options, filename=filename
+ )
+ except RuntimeError as ex:
+ log.error('There was an error adding the torrent file %s: %s', filename, ex)
+ raise
+
+ @export
+ def add_torrent_files(self, torrent_files):
+ """Adds multiple torrent files to the session asynchonously.
+
+ Args:
+ torrent_files (list of tuples): Torrent files as tuple of (filename, filedump, options).
+
+ Returns:
+ Deferred
+
+ """
+
+ @defer.inlineCallbacks
+ def add_torrents():
+ errors = []
+ last_index = len(torrent_files) - 1
+ for idx, torrent in enumerate(torrent_files):
+ try:
+ yield self.add_torrent_file_async(
+ torrent[0], torrent[1], torrent[2], save_state=idx == last_index
+ )
+ except AddTorrentError as ex:
+ log.warning('Error when adding torrent: %s', ex)
+ errors.append(ex)
+ defer.returnValue(errors)
+
+ return task.deferLater(reactor, 0, add_torrents)
+
+ @export
+ def add_torrent_url(self, url, options, headers=None):
+ """
+ Adds a torrent from a url. Deluge will attempt to fetch the torrent
+ from url prior to adding it to the session.
+
+ :param url: the url pointing to the torrent file
+ :type url: string
+ :param options: the options to apply to the torrent on add
+ :type options: dict
+ :param headers: any optional headers to send
+ :type headers: dict
+
+ :returns: a Deferred which returns the torrent_id as a str or None
+ """
+ log.info('Attempting to add url %s', url)
+
+ def on_download_success(filename):
+ # We got the file, so add it to the session
+ with open(filename, 'rb') as _file:
+ data = _file.read()
+ try:
+ os.remove(filename)
+ except OSError as ex:
+ log.warning('Could not remove temp file: %s', ex)
+ return self.add_torrent_file(filename, b64encode(data), options)
+
+ def on_download_fail(failure):
+ # Log the error and pass the failure onto the client
+ log.error('Failed to add torrent from url %s', url)
+ return failure
+
+ tmp_fd, tmp_file = tempfile.mkstemp(prefix='deluge_url.', suffix='.torrent')
+ os.close(tmp_fd)
+ d = download_file(url, tmp_file, headers=headers, force_filename=True)
+ d.addCallbacks(on_download_success, on_download_fail)
+ return d
+
+ @export
+ def add_torrent_magnet(self, uri, options):
+ """
+ Adds a torrent from a magnet link.
+
+ :param uri: the magnet link
+ :type uri: string
+ :param options: the options to apply to the torrent on add
+ :type options: dict
+
+ :returns: the torrent_id
+ :rtype: string
+
+ """
+ log.debug('Attempting to add by magnet uri: %s', uri)
+
+ return self.torrentmanager.add(magnet=uri, options=options)
+
+ @export
+ def remove_torrent(self, torrent_id, remove_data):
+ """Removes a single torrent from the session.
+
+ Args:
+ torrent_id (str): The torrent ID to remove.
+ remove_data (bool): If True, also remove the downloaded data.
+
+ Returns:
+ bool: True if removed successfully.
+
+ Raises:
+ InvalidTorrentError: If the torrent ID does not exist in the session.
+
+ """
+ log.debug('Removing torrent %s from the core.', torrent_id)
+ return self.torrentmanager.remove(torrent_id, remove_data)
+
+ @export
+ def remove_torrents(self, torrent_ids, remove_data):
+ """Remove multiple torrents from the session.
+
+ Args:
+ torrent_ids (list): The torrent IDs to remove.
+ remove_data (bool): If True, also remove the downloaded data.
+
+ Returns:
+ list: An empty list if no errors occurred otherwise the list contains
+ tuples of strings, a torrent ID and an error message. For example:
+
+ [('<torrent_id>', 'Error removing torrent')]
+
+ """
+ log.info('Removing %d torrents from core.', len(torrent_ids))
+
+ def do_remove_torrents():
+ errors = []
+ for torrent_id in torrent_ids:
+ try:
+ self.torrentmanager.remove(
+ torrent_id, remove_data=remove_data, save_state=False
+ )
+ except InvalidTorrentError as ex:
+ errors.append((torrent_id, str(ex)))
+ # Save the session state
+ self.torrentmanager.save_state()
+ if errors:
+ log.warning(
+ 'Failed to remove %d of %d torrents.', len(errors), len(torrent_ids)
+ )
+ return errors
+
+ return task.deferLater(reactor, 0, do_remove_torrents)
+
+ @export
+ def get_session_status(self, keys):
+ """Gets the session status values for 'keys', these keys are taking
+ from libtorrent's session status.
+
+ See: http://www.rasterbar.com/products/libtorrent/manual.html#status
+
+ :param keys: the keys for which we want values
+ :type keys: list
+ :returns: a dictionary of {key: value, ...}
+ :rtype: dict
+
+ """
+ if not keys:
+ return self.session_status
+
+ status = {}
+ for key in keys:
+ try:
+ status[key] = self.session_status[key]
+ except KeyError:
+ if key in DEPR_SESSION_STATUS_KEYS:
+ new_key = DEPR_SESSION_STATUS_KEYS[key]
+ log.debug(
+ 'Deprecated session status key %s, please use %s', key, new_key
+ )
+ status[key] = self.session_status[new_key]
+ else:
+ log.warning('Session status key not valid: %s', key)
+ return status
+
+ @export
+ def force_reannounce(self, torrent_ids):
+ log.debug('Forcing reannouncment to: %s', torrent_ids)
+ for torrent_id in torrent_ids:
+ self.torrentmanager[torrent_id].force_reannounce()
+
+ @export
+ def pause_torrent(self, torrent_id):
+ """Pauses a torrent"""
+ log.debug('Pausing: %s', torrent_id)
+ if not isinstance(torrent_id, string_types):
+ self.pause_torrents(torrent_id)
+ else:
+ self.torrentmanager[torrent_id].pause()
+
+ @export
+ def pause_torrents(self, torrent_ids=None):
+ """Pauses a list of torrents"""
+ if not torrent_ids:
+ torrent_ids = self.torrentmanager.get_torrent_list()
+ for torrent_id in torrent_ids:
+ self.pause_torrent(torrent_id)
+
+ @export
+ def connect_peer(self, torrent_id, ip, port):
+ log.debug('adding peer %s to %s', ip, torrent_id)
+ if not self.torrentmanager[torrent_id].connect_peer(ip, port):
+ log.warning('Error adding peer %s:%s to %s', ip, port, torrent_id)
+
+ @export
+ def move_storage(self, torrent_ids, dest):
+ log.debug('Moving storage %s to %s', torrent_ids, dest)
+ for torrent_id in torrent_ids:
+ if not self.torrentmanager[torrent_id].move_storage(dest):
+ log.warning('Error moving torrent %s to %s', torrent_id, dest)
+
+ @export
+ def pause_session(self):
+ """Pause the entire session"""
+ if not self.session.is_paused():
+ self.session.pause()
+ component.get('EventManager').emit(SessionPausedEvent())
+
+ @export
+ def resume_session(self):
+ """Resume the entire session"""
+ if self.session.is_paused():
+ self.session.resume()
+ for torrent_id in self.torrentmanager.torrents:
+ self.torrentmanager[torrent_id].update_state()
+ component.get('EventManager').emit(SessionResumedEvent())
+
+ @export
+ def is_session_paused(self):
+ """Returns the activity of the session"""
+ return self.session.is_paused()
+
+ @export
+ def resume_torrent(self, torrent_id):
+ """Resumes a torrent"""
+ log.debug('Resuming: %s', torrent_id)
+ if not isinstance(torrent_id, string_types):
+ self.resume_torrents(torrent_id)
+ else:
+ self.torrentmanager[torrent_id].resume()
+
+ @export
+ def resume_torrents(self, torrent_ids=None):
+ """Resumes a list of torrents"""
+ if not torrent_ids:
+ torrent_ids = self.torrentmanager.get_torrent_list()
+ for torrent_id in torrent_ids:
+ self.resume_torrent(torrent_id)
+
+ def create_torrent_status(
+ self,
+ torrent_id,
+ torrent_keys,
+ plugin_keys,
+ diff=False,
+ update=False,
+ all_keys=False,
+ ):
+ try:
+ status = self.torrentmanager[torrent_id].get_status(
+ torrent_keys, diff, update=update, all_keys=all_keys
+ )
+ except KeyError:
+ import traceback
+
+ traceback.print_exc()
+ # Torrent was probaly removed meanwhile
+ return {}
+
+ # Ask the plugin manager to fill in the plugin keys
+ if len(plugin_keys) > 0 or all_keys:
+ status.update(self.pluginmanager.get_status(torrent_id, plugin_keys))
+ return status
+
+ @export
+ def get_torrent_status(self, torrent_id, keys, diff=False):
+ torrent_keys, plugin_keys = self.torrentmanager.separate_keys(
+ keys, [torrent_id]
+ )
+ return self.create_torrent_status(
+ torrent_id,
+ torrent_keys,
+ plugin_keys,
+ diff=diff,
+ update=True,
+ all_keys=not keys,
+ )
+
+ @export
+ def get_torrents_status(self, filter_dict, keys, diff=False):
+ """
+ returns all torrents , optionally filtered by filter_dict.
+ """
+ torrent_ids = self.filtermanager.filter_torrent_ids(filter_dict)
+ d = self.torrentmanager.torrents_status_update(torrent_ids, keys, diff=diff)
+
+ def add_plugin_fields(args):
+ status_dict, plugin_keys = args
+ # Ask the plugin manager to fill in the plugin keys
+ if len(plugin_keys) > 0:
+ for key in status_dict:
+ status_dict[key].update(
+ self.pluginmanager.get_status(key, plugin_keys)
+ )
+ return status_dict
+
+ d.addCallback(add_plugin_fields)
+ return d
+
+ @export
+ def get_filter_tree(self, show_zero_hits=True, hide_cat=None):
+ """
+ returns {field: [(value,count)] }
+ for use in sidebar(s)
+ """
+ return self.filtermanager.get_filter_tree(show_zero_hits, hide_cat)
+
+ @export
+ def get_session_state(self):
+ """Returns a list of torrent_ids in the session."""
+ # Get the torrent list from the TorrentManager
+ return self.torrentmanager.get_torrent_list()
+
+ @export
+ def get_config(self):
+ """Get all the preferences as a dictionary"""
+ return self.config.config
+
+ @export
+ def get_config_value(self, key):
+ """Get the config value for key"""
+ return self.config.get(key)
+
+ @export
+ def get_config_values(self, keys):
+ """Get the config values for the entered keys"""
+ return {key: self.config.get(key) for key in keys}
+
+ @export
+ def set_config(self, config):
+ """Set the config with values from dictionary"""
+ # Load all the values into the configuration
+ for key in config:
+ if self.read_only_config_keys and key in self.read_only_config_keys:
+ continue
+ self.config[key] = config[key]
+
+ @export
+ def get_listen_port(self):
+ """Returns the active listen port"""
+ return self.session.listen_port()
+
+ @export
+ def get_proxy(self):
+ """Returns the proxy settings
+
+ Returns:
+ dict: Contains proxy settings.
+
+ Notes:
+ Proxy type names:
+ 0: None, 1: Socks4, 2: Socks5, 3: Socks5 w Auth, 4: HTTP, 5: HTTP w Auth, 6: I2P
+
+ """
+
+ settings = self.session.get_settings()
+ proxy_type = settings['proxy_type']
+ proxy_hostname = (
+ settings['i2p_hostname'] if proxy_type == 6 else settings['proxy_hostname']
+ )
+ proxy_port = settings['i2p_port'] if proxy_type == 6 else settings['proxy_port']
+ proxy_dict = {
+ 'type': proxy_type,
+ 'hostname': proxy_hostname,
+ 'username': settings['proxy_username'],
+ 'password': settings['proxy_password'],
+ 'port': proxy_port,
+ 'proxy_hostnames': settings['proxy_hostnames'],
+ 'proxy_peer_connections': settings['proxy_peer_connections'],
+ 'proxy_tracker_connections': settings['proxy_tracker_connections'],
+ }
+
+ return proxy_dict
+
+ @export
+ def get_available_plugins(self):
+ """Returns a list of plugins available in the core"""
+ return self.pluginmanager.get_available_plugins()
+
+ @export
+ def get_enabled_plugins(self):
+ """Returns a list of enabled plugins in the core"""
+ return self.pluginmanager.get_enabled_plugins()
+
+ @export
+ def enable_plugin(self, plugin):
+ return self.pluginmanager.enable_plugin(plugin)
+
+ @export
+ def disable_plugin(self, plugin):
+ return self.pluginmanager.disable_plugin(plugin)
+
+ @export
+ def force_recheck(self, torrent_ids):
+ """Forces a data recheck on torrent_ids"""
+ for torrent_id in torrent_ids:
+ self.torrentmanager[torrent_id].force_recheck()
+
+ @export
+ def set_torrent_options(self, torrent_ids, options):
+ """Sets the torrent options for torrent_ids
+
+ Args:
+ torrent_ids (list): A list of torrent_ids to set the options for.
+ options (dict): A dict of torrent options to set. See torrent.TorrentOptions class for valid keys.
+ """
+ if 'owner' in options and not self.authmanager.has_account(options['owner']):
+ raise DelugeError('Username "%s" is not known.' % options['owner'])
+
+ if isinstance(torrent_ids, string_types):
+ torrent_ids = [torrent_ids]
+
+ for torrent_id in torrent_ids:
+ self.torrentmanager[torrent_id].set_options(options)
+
+ @export
+ def set_torrent_trackers(self, torrent_id, trackers):
+ """Sets a torrents tracker list. trackers will be [{"url", "tier"}]"""
+ return self.torrentmanager[torrent_id].set_trackers(trackers)
+
+ @deprecated
+ @export
+ def set_torrent_max_connections(self, torrent_id, value):
+ """Deprecated: Use set_torrent_options with 'max_connections'"""
+ self.set_torrent_options([torrent_id], {'max_connections': value})
+
+ @deprecated
+ @export
+ def set_torrent_max_upload_slots(self, torrent_id, value):
+ """Deprecated: Use set_torrent_options with 'max_upload_slots'"""
+ self.set_torrent_options([torrent_id], {'max_upload_slots': value})
+
+ @deprecated
+ @export
+ def set_torrent_max_upload_speed(self, torrent_id, value):
+ """Deprecated: Use set_torrent_options with 'max_upload_speed'"""
+ self.set_torrent_options([torrent_id], {'max_upload_speed': value})
+
+ @deprecated
+ @export
+ def set_torrent_max_download_speed(self, torrent_id, value):
+ """Deprecated: Use set_torrent_options with 'max_download_speed'"""
+ self.set_torrent_options([torrent_id], {'max_download_speed': value})
+
+ @deprecated
+ @export
+ def set_torrent_file_priorities(self, torrent_id, priorities):
+ """Deprecated: Use set_torrent_options with 'file_priorities'"""
+ self.set_torrent_options([torrent_id], {'file_priorities': priorities})
+
+ @deprecated
+ @export
+ def set_torrent_prioritize_first_last(self, torrent_id, value):
+ """Deprecated: Use set_torrent_options with 'prioritize_first_last'"""
+ self.set_torrent_options([torrent_id], {'prioritize_first_last_pieces': value})
+
+ @deprecated
+ @export
+ def set_torrent_auto_managed(self, torrent_id, value):
+ """Deprecated: Use set_torrent_options with 'auto_managed'"""
+ self.set_torrent_options([torrent_id], {'auto_managed': value})
+
+ @deprecated
+ @export
+ def set_torrent_stop_at_ratio(self, torrent_id, value):
+ """Deprecated: Use set_torrent_options with 'stop_at_ratio'"""
+ self.set_torrent_options([torrent_id], {'stop_at_ratio': value})
+
+ @deprecated
+ @export
+ def set_torrent_stop_ratio(self, torrent_id, value):
+ """Deprecated: Use set_torrent_options with 'stop_ratio'"""
+ self.set_torrent_options([torrent_id], {'stop_ratio': value})
+
+ @deprecated
+ @export
+ def set_torrent_remove_at_ratio(self, torrent_id, value):
+ """Deprecated: Use set_torrent_options with 'remove_at_ratio'"""
+ self.set_torrent_options([torrent_id], {'remove_at_ratio': value})
+
+ @deprecated
+ @export
+ def set_torrent_move_completed(self, torrent_id, value):
+ """Deprecated: Use set_torrent_options with 'move_completed'"""
+ self.set_torrent_options([torrent_id], {'move_completed': value})
+
+ @deprecated
+ @export
+ def set_torrent_move_completed_path(self, torrent_id, value):
+ """Deprecated: Use set_torrent_options with 'move_completed_path'"""
+ self.set_torrent_options([torrent_id], {'move_completed_path': value})
+
+ @export
+ def get_path_size(self, path):
+ """Returns the size of the file or folder 'path' and -1 if the path is
+ unaccessible (non-existent or insufficient privs)"""
+ return deluge.common.get_path_size(path)
+
+ @export
+ def create_torrent(
+ self,
+ path,
+ tracker,
+ piece_length,
+ comment,
+ target,
+ webseeds,
+ private,
+ created_by,
+ trackers,
+ add_to_session,
+ ):
+
+ log.debug('creating torrent..')
+ threading.Thread(
+ target=self._create_torrent_thread,
+ args=(
+ path,
+ tracker,
+ piece_length,
+ comment,
+ target,
+ webseeds,
+ private,
+ created_by,
+ trackers,
+ add_to_session,
+ ),
+ ).start()
+
+ def _create_torrent_thread(
+ self,
+ path,
+ tracker,
+ piece_length,
+ comment,
+ target,
+ webseeds,
+ private,
+ created_by,
+ trackers,
+ add_to_session,
+ ):
+ from deluge import metafile
+
+ metafile.make_meta_file(
+ path,
+ tracker,
+ piece_length,
+ comment=comment,
+ target=target,
+ webseeds=webseeds,
+ private=private,
+ created_by=created_by,
+ trackers=trackers,
+ )
+ log.debug('torrent created!')
+ if add_to_session:
+ options = {}
+ options['download_location'] = os.path.split(path)[0]
+ with open(target, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ self.add_torrent_file(os.path.split(target)[1], filedump, options)
+
+ @export
+ def upload_plugin(self, filename, filedump):
+ """This method is used to upload new plugins to the daemon. It is used
+ when connecting to the daemon remotely and installing a new plugin on
+ the client side. 'plugin_data' is a xmlrpc.Binary object of the file data,
+ ie, plugin_file.read()"""
+
+ try:
+ filedump = b64decode(filedump)
+ except TypeError as ex:
+ log.error('There was an error decoding the filedump string!')
+ log.exception(ex)
+ return
+
+ with open(os.path.join(get_config_dir(), 'plugins', filename), 'wb') as _file:
+ _file.write(filedump)
+ component.get('CorePluginManager').scan_for_plugins()
+
+ @export
+ def rescan_plugins(self):
+ """
+ Rescans the plugin folders for new plugins
+ """
+ component.get('CorePluginManager').scan_for_plugins()
+
+ @export
+ def rename_files(self, torrent_id, filenames):
+ """
+ Rename files in torrent_id. Since this is an asynchronous operation by
+ libtorrent, watch for the TorrentFileRenamedEvent to know when the
+ files have been renamed.
+
+ :param torrent_id: the torrent_id to rename files
+ :type torrent_id: string
+ :param filenames: a list of index, filename pairs
+ :type filenames: ((index, filename), ...)
+
+ :raises InvalidTorrentError: if torrent_id is invalid
+
+ """
+ if torrent_id not in self.torrentmanager.torrents:
+ raise InvalidTorrentError('torrent_id is not in session')
+
+ def rename():
+ self.torrentmanager[torrent_id].rename_files(filenames)
+
+ return task.deferLater(reactor, 0, rename)
+
+ @export
+ def rename_folder(self, torrent_id, folder, new_folder):
+ """
+ Renames the 'folder' to 'new_folder' in 'torrent_id'. Watch for the
+ TorrentFolderRenamedEvent which is emitted when the folder has been
+ renamed successfully.
+
+ :param torrent_id: the torrent to rename folder in
+ :type torrent_id: string
+ :param folder: the folder to rename
+ :type folder: string
+ :param new_folder: the new folder name
+ :type new_folder: string
+
+ :raises InvalidTorrentError: if the torrent_id is invalid
+
+ """
+ if torrent_id not in self.torrentmanager.torrents:
+ raise InvalidTorrentError('torrent_id is not in session')
+
+ return self.torrentmanager[torrent_id].rename_folder(folder, new_folder)
+
+ @export
+ def queue_top(self, torrent_ids):
+ log.debug('Attempting to queue %s to top', torrent_ids)
+ # torrent_ids must be sorted in reverse before moving to preserve order
+ for torrent_id in sorted(
+ torrent_ids, key=self.torrentmanager.get_queue_position, reverse=True
+ ):
+ try:
+ # If the queue method returns True, then we should emit a signal
+ if self.torrentmanager.queue_top(torrent_id):
+ component.get('EventManager').emit(TorrentQueueChangedEvent())
+ except KeyError:
+ log.warning('torrent_id: %s does not exist in the queue', torrent_id)
+
+ @export
+ def queue_up(self, torrent_ids):
+ log.debug('Attempting to queue %s to up', torrent_ids)
+ torrents = (
+ (self.torrentmanager.get_queue_position(torrent_id), torrent_id)
+ for torrent_id in torrent_ids
+ )
+ torrent_moved = True
+ prev_queue_position = None
+ # torrent_ids must be sorted before moving.
+ for queue_position, torrent_id in sorted(torrents):
+ # Move the torrent if and only if there is space (by not moving it we preserve the order)
+ if torrent_moved or queue_position - prev_queue_position > 1:
+ try:
+ torrent_moved = self.torrentmanager.queue_up(torrent_id)
+ except KeyError:
+ log.warning(
+ 'torrent_id: %s does not exist in the queue', torrent_id
+ )
+ # If the torrent moved, then we should emit a signal
+ if torrent_moved:
+ component.get('EventManager').emit(TorrentQueueChangedEvent())
+ else:
+ prev_queue_position = queue_position
+
+ @export
+ def queue_down(self, torrent_ids):
+ log.debug('Attempting to queue %s to down', torrent_ids)
+ torrents = (
+ (self.torrentmanager.get_queue_position(torrent_id), torrent_id)
+ for torrent_id in torrent_ids
+ )
+ torrent_moved = True
+ prev_queue_position = None
+ # torrent_ids must be sorted before moving.
+ for queue_position, torrent_id in sorted(torrents, reverse=True):
+ # Move the torrent if and only if there is space (by not moving it we preserve the order)
+ if torrent_moved or prev_queue_position - queue_position > 1:
+ try:
+ torrent_moved = self.torrentmanager.queue_down(torrent_id)
+ except KeyError:
+ log.warning(
+ 'torrent_id: %s does not exist in the queue', torrent_id
+ )
+ # If the torrent moved, then we should emit a signal
+ if torrent_moved:
+ component.get('EventManager').emit(TorrentQueueChangedEvent())
+ else:
+ prev_queue_position = queue_position
+
+ @export
+ def queue_bottom(self, torrent_ids):
+ log.debug('Attempting to queue %s to bottom', torrent_ids)
+ # torrent_ids must be sorted before moving to preserve order
+ for torrent_id in sorted(
+ torrent_ids, key=self.torrentmanager.get_queue_position
+ ):
+ try:
+ # If the queue method returns True, then we should emit a signal
+ if self.torrentmanager.queue_bottom(torrent_id):
+ component.get('EventManager').emit(TorrentQueueChangedEvent())
+ except KeyError:
+ log.warning('torrent_id: %s does not exist in the queue', torrent_id)
+
+ @export
+ def glob(self, path):
+ return glob.glob(path)
+
+ @export
+ def test_listen_port(self):
+ """
+ Checks if the active port is open
+
+ :returns: True if the port is open, False if not
+ :rtype: bool
+
+ """
+ port = self.get_listen_port()
+ url = 'https://deluge-torrent.org/test_port.php?port=%s' % port
+ agent = Agent(reactor, connectTimeout=30)
+ d = agent.request(b'GET', url.encode())
+
+ def on_get_page(body):
+ return bool(int(body))
+
+ def on_error(failure):
+ log.warning('Error testing listen port: %s', failure)
+
+ d.addCallback(readBody).addCallback(on_get_page)
+ d.addErrback(on_error)
+
+ return d
+
+ @export
+ def get_free_space(self, path=None):
+ """
+ Returns the number of free bytes at path
+
+ :param path: the path to check free space at, if None, use the default download location
+ :type path: string
+
+ :returns: the number of free bytes at path
+ :rtype: int
+
+ :raises InvalidPathError: if the path is invalid
+
+ """
+ if not path:
+ path = self.config['download_location']
+ try:
+ return deluge.common.free_space(path)
+ except InvalidPathError:
+ return -1
+
+ def _on_external_ip_event(self, external_ip):
+ self.external_ip = external_ip
+
+ @export
+ def get_external_ip(self):
+ """
+ Returns the external ip address recieved from libtorrent.
+ """
+ return self.external_ip
+
+ @export
+ def get_libtorrent_version(self):
+ """
+ Returns the libtorrent version.
+
+ :returns: the version
+ :rtype: string
+
+ """
+ return LT_VERSION
+
+ @export
+ def get_completion_paths(self, args):
+ """
+ Returns the available path completions for the input value.
+ """
+ return path_chooser_common.get_completion_paths(args)
+
+ @export(AUTH_LEVEL_ADMIN)
+ def get_known_accounts(self):
+ return self.authmanager.get_known_accounts()
+
+ @export(AUTH_LEVEL_NONE)
+ def get_auth_levels_mappings(self):
+ return (AUTH_LEVELS_MAPPING, AUTH_LEVELS_MAPPING_REVERSE)
+
+ @export(AUTH_LEVEL_ADMIN)
+ def create_account(self, username, password, authlevel):
+ return self.authmanager.create_account(username, password, authlevel)
+
+ @export(AUTH_LEVEL_ADMIN)
+ def update_account(self, username, password, authlevel):
+ return self.authmanager.update_account(username, password, authlevel)
+
+ @export(AUTH_LEVEL_ADMIN)
+ def remove_account(self, username):
+ return self.authmanager.remove_account(username)
diff --git a/deluge/core/daemon.py b/deluge/core/daemon.py
new file mode 100644
index 0000000..d7ab813
--- /dev/null
+++ b/deluge/core/daemon.py
@@ -0,0 +1,205 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""The Deluge daemon"""
+from __future__ import unicode_literals
+
+import logging
+import os
+import socket
+
+from twisted.internet import reactor
+
+import deluge.component as component
+from deluge.common import get_version, is_ip, is_process_running, windows_check
+from deluge.configmanager import get_config_dir
+from deluge.core.core import Core
+from deluge.core.rpcserver import RPCServer, export
+from deluge.error import DaemonRunningError
+
+if windows_check():
+ from win32api import SetConsoleCtrlHandler
+ from win32con import CTRL_CLOSE_EVENT, CTRL_SHUTDOWN_EVENT
+
+log = logging.getLogger(__name__)
+
+
+def is_daemon_running(pid_file):
+ """
+ Check for another running instance of the daemon using the same pid file.
+
+ Args:
+ pid_file: The location of the file with pid, port values.
+
+ Returns:
+ bool: True is daemon is running, False otherwise.
+
+ """
+
+ try:
+ with open(pid_file) as _file:
+ pid, port = [int(x) for x in _file.readline().strip().split(';')]
+ except (EnvironmentError, ValueError):
+ return False
+
+ if is_process_running(pid):
+ # Ensure it's a deluged process by trying to open a socket to it's port.
+ _socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ try:
+ _socket.connect(('127.0.0.1', port))
+ except socket.error:
+ # Can't connect, so pid is not a deluged process.
+ return False
+ else:
+ # This is a deluged process!
+ _socket.close()
+ return True
+
+
+class Daemon(object):
+ """The Deluge Daemon class"""
+
+ def __init__(
+ self,
+ listen_interface=None,
+ outgoing_interface=None,
+ interface=None,
+ port=None,
+ standalone=False,
+ read_only_config_keys=None,
+ ):
+ """
+ Args:
+ listen_interface (str, optional): The IP address to listen to
+ BitTorrent connections on.
+ outgoing_interface (str, optional): The network interface name or
+ IP address to open outgoing BitTorrent connections on.
+ interface (str, optional): The IP address the daemon will
+ listen for UI connections on.
+ port (int, optional): The port the daemon will listen for UI
+ connections on.
+ standalone (bool, optional): If True the client is in Standalone
+ mode otherwise, if False, start the daemon as separate process.
+ read_only_config_keys (list of str, optional): A list of config
+ keys that will not be altered by core.set_config() RPC method.
+ """
+ self.standalone = standalone
+ self.pid_file = get_config_dir('deluged.pid')
+ log.info('Deluge daemon %s', get_version())
+ if is_daemon_running(self.pid_file):
+ raise DaemonRunningError(
+ 'Deluge daemon already running with this config directory!'
+ )
+
+ # Twisted catches signals to terminate, so just have it call the shutdown method.
+ reactor.addSystemEventTrigger('before', 'shutdown', self._shutdown)
+
+ # Catch some Windows specific signals
+ if windows_check():
+
+ def win_handler(ctrl_type):
+ """Handle the Windows shutdown or close events."""
+ log.debug('windows handler ctrl_type: %s', ctrl_type)
+ if ctrl_type == CTRL_CLOSE_EVENT or ctrl_type == CTRL_SHUTDOWN_EVENT:
+ self._shutdown()
+ return 1
+
+ SetConsoleCtrlHandler(win_handler)
+
+ # Start the core as a thread and join it until it's done
+ self.core = Core(
+ listen_interface=listen_interface,
+ outgoing_interface=outgoing_interface,
+ read_only_config_keys=read_only_config_keys,
+ )
+
+ if port is None:
+ port = self.core.config['daemon_port']
+ self.port = port
+
+ if interface and not is_ip(interface):
+ log.error('Invalid UI interface (must be IP Address): %s', interface)
+ interface = None
+
+ self.rpcserver = RPCServer(
+ port=port,
+ allow_remote=self.core.config['allow_remote'],
+ listen=not standalone,
+ interface=interface,
+ )
+
+ log.debug(
+ 'Listening to UI on: %s:%s and bittorrent on: %s Making connections out on: %s',
+ interface,
+ port,
+ listen_interface,
+ outgoing_interface,
+ )
+
+ def start(self):
+ # Register the daemon and the core RPCs
+ self.rpcserver.register_object(self.core)
+ self.rpcserver.register_object(self)
+
+ # Make sure we start the PreferencesManager first
+ component.start('PreferencesManager')
+
+ if not self.standalone:
+ log.info('Deluge daemon starting...')
+ # Create pid file to track if deluged is running, also includes the port number.
+ pid = os.getpid()
+ log.debug('Storing pid %s & port %s in: %s', pid, self.port, self.pid_file)
+ with open(self.pid_file, 'w') as _file:
+ _file.write('%s;%s\n' % (pid, self.port))
+
+ component.start()
+
+ try:
+ reactor.run()
+ finally:
+ log.debug('Remove pid file: %s', self.pid_file)
+ os.remove(self.pid_file)
+ log.info('Deluge daemon shutdown successfully')
+
+ @export()
+ def shutdown(self, *args, **kwargs):
+ log.debug('Deluge daemon shutdown requested...')
+ reactor.callLater(0, reactor.stop)
+
+ def _shutdown(self, *args, **kwargs):
+ log.info('Deluge daemon shutting down, waiting for components to shutdown...')
+ if not self.standalone:
+ return component.shutdown()
+
+ @export()
+ def get_method_list(self):
+ """Returns a list of the exported methods."""
+ return self.rpcserver.get_method_list()
+
+ @export()
+ def get_version(self):
+ """Returns the daemon version"""
+ return get_version()
+
+ @export(1)
+ def authorized_call(self, rpc):
+ """Determines if session auth_level is authorized to call RPC.
+
+ Args:
+ rpc (str): A RPC, e.g. core.get_torrents_status
+
+ Returns:
+ bool: True if authorized to call RPC, otherwise False.
+ """
+ if rpc not in self.get_method_list():
+ return False
+
+ return self.rpcserver.get_session_auth_level() >= self.rpcserver.get_rpc_auth_level(
+ rpc
+ )
diff --git a/deluge/core/daemon_entry.py b/deluge/core/daemon_entry.py
new file mode 100644
index 0000000..8b3746c
--- /dev/null
+++ b/deluge/core/daemon_entry.py
@@ -0,0 +1,143 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2010 Pedro Algarvio <pedro@algarvio.me>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+from __future__ import print_function, unicode_literals
+
+import os
+import sys
+from logging import DEBUG, FileHandler, getLogger
+
+from twisted.internet.error import CannotListenError
+
+from deluge.argparserbase import ArgParserBase
+from deluge.common import run_profiled
+from deluge.configmanager import get_config_dir
+from deluge.i18n import setup_mock_translation
+
+
+def add_daemon_options(parser):
+ group = parser.add_argument_group(_('Daemon Options'))
+ group.add_argument(
+ '-u',
+ '--ui-interface',
+ metavar='<ip-addr>',
+ action='store',
+ help=_('IP address to listen for UI connections'),
+ )
+ group.add_argument(
+ '-p',
+ '--port',
+ metavar='<port>',
+ action='store',
+ type=int,
+ help=_('Port to listen for UI connections on'),
+ )
+ group.add_argument(
+ '-i',
+ '--interface',
+ metavar='<ip-addr>',
+ dest='listen_interface',
+ action='store',
+ help=_('IP address to listen for BitTorrent connections'),
+ )
+ group.add_argument(
+ '-o',
+ '--outgoing-interface',
+ metavar='<interface>',
+ dest='outgoing_interface',
+ action='store',
+ help=_(
+ 'The network interface name or IP address for outgoing BitTorrent connections.'
+ ),
+ )
+ group.add_argument(
+ '--read-only-config-keys',
+ metavar='<comma-separated-keys>',
+ action='store',
+ help=_('Config keys to be unmodified by `set_config` RPC'),
+ type=str,
+ default='',
+ )
+ parser.add_process_arg_group()
+
+
+def start_daemon(skip_start=False):
+ """
+ Entry point for daemon script
+
+ Args:
+ skip_start (bool): If starting daemon should be skipped.
+
+ Returns:
+ deluge.core.daemon.Daemon: A new daemon object
+
+ """
+ setup_mock_translation()
+
+ # Setup the argument parser
+ parser = ArgParserBase()
+ add_daemon_options(parser)
+
+ options = parser.parse_args()
+
+ # Check for any daemons running with this same config
+ from deluge.core.daemon import is_daemon_running
+
+ pid_file = get_config_dir('deluged.pid')
+ if is_daemon_running(pid_file):
+ print(
+ 'Cannot run multiple daemons with same config directory.\n'
+ 'If you believe this is an error, force starting by deleting: %s' % pid_file
+ )
+ sys.exit(1)
+
+ log = getLogger(__name__)
+
+ # If no logfile specified add logging to default location (as well as stdout)
+ if not options.logfile:
+ options.logfile = get_config_dir('deluged.log')
+ file_handler = FileHandler(options.logfile)
+ log.addHandler(file_handler)
+
+ def run_daemon(options):
+ try:
+ from deluge.core.daemon import Daemon
+
+ daemon = Daemon(
+ listen_interface=options.listen_interface,
+ outgoing_interface=options.outgoing_interface,
+ interface=options.ui_interface,
+ port=options.port,
+ read_only_config_keys=options.read_only_config_keys.split(','),
+ )
+ if skip_start:
+ return daemon
+ else:
+ daemon.start()
+ except CannotListenError as ex:
+ log.error(
+ 'Cannot start deluged, listen port in use.\n'
+ ' Check for other running daemons or services using this port: %s:%s',
+ ex.interface,
+ ex.port,
+ )
+ sys.exit(1)
+ except Exception as ex:
+ log.error('Unable to start deluged: %s', ex)
+ if log.isEnabledFor(DEBUG):
+ log.exception(ex)
+ sys.exit(1)
+ finally:
+ log.info('Exiting...')
+ if options.pidfile:
+ os.remove(options.pidfile)
+
+ return run_profiled(
+ run_daemon, options, output_file=options.profile, do_profile=options.profile
+ )
diff --git a/deluge/core/eventmanager.py b/deluge/core/eventmanager.py
new file mode 100644
index 0000000..5ba2989
--- /dev/null
+++ b/deluge/core/eventmanager.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+
+log = logging.getLogger(__name__)
+
+
+class EventManager(component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'EventManager')
+ self.handlers = {}
+
+ def emit(self, event):
+ """
+ Emits the event to interested clients.
+
+ :param event: DelugeEvent
+ """
+ # Emit the event to the interested clients
+ component.get('RPCServer').emit_event(event)
+ # Call any handlers for the event
+ if event.name in self.handlers:
+ for handler in self.handlers[event.name]:
+ # log.debug('Running handler %s for event %s with args: %s', event.name, handler, event.args)
+ try:
+ handler(*event.args)
+ except Exception as ex:
+ log.error(
+ 'Event handler %s failed in %s with exception %s',
+ event.name,
+ handler,
+ ex,
+ )
+
+ def register_event_handler(self, event, handler):
+ """
+ Registers a function to be called when a `:param:event` is emitted.
+
+ :param event: str, the event name
+ :param handler: function, to be called when `:param:event` is emitted
+
+ """
+ if event not in self.handlers:
+ self.handlers[event] = []
+
+ if handler not in self.handlers[event]:
+ self.handlers[event].append(handler)
+
+ def deregister_event_handler(self, event, handler):
+ """
+ Deregisters an event handler function.
+
+ :param event: str, the event name
+ :param handler: function, currently registered to handle `:param:event`
+
+ """
+ if event in self.handlers and handler in self.handlers[event]:
+ self.handlers[event].remove(handler)
diff --git a/deluge/core/filtermanager.py b/deluge/core/filtermanager.py
new file mode 100644
index 0000000..9d89646
--- /dev/null
+++ b/deluge/core/filtermanager.py
@@ -0,0 +1,281 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from six import string_types
+
+import deluge.component as component
+from deluge.common import TORRENT_STATE
+
+log = logging.getLogger(__name__)
+
+STATE_SORT = ['All', 'Active'] + TORRENT_STATE
+
+
+# Special purpose filters:
+def filter_keywords(torrent_ids, values):
+ # Cleanup
+ keywords = ','.join([v.lower() for v in values])
+ keywords = keywords.split(',')
+
+ for keyword in keywords:
+ torrent_ids = filter_one_keyword(torrent_ids, keyword)
+ return torrent_ids
+
+
+def filter_one_keyword(torrent_ids, keyword):
+ """
+ search torrent on keyword.
+ searches title,state,tracker-status,tracker,files
+ """
+ all_torrents = component.get('TorrentManager').torrents
+
+ for torrent_id in torrent_ids:
+ torrent = all_torrents[torrent_id]
+ if keyword in torrent.filename.lower():
+ yield torrent_id
+ elif keyword in torrent.state.lower():
+ yield torrent_id
+ elif torrent.trackers and keyword in torrent.trackers[0]['url']:
+ yield torrent_id
+ elif keyword in torrent_id:
+ yield torrent_id
+ # Want to find broken torrents (search on "error", or "unregistered")
+ elif keyword in torrent.tracker_status.lower():
+ yield torrent_id
+ else:
+ for t_file in torrent.get_files():
+ if keyword in t_file['path'].lower():
+ yield torrent_id
+ break
+
+
+def filter_by_name(torrent_ids, search_string):
+ all_torrents = component.get('TorrentManager').torrents
+ try:
+ search_string, match_case = search_string[0].split('::match')
+ except ValueError:
+ search_string = search_string[0]
+ match_case = False
+
+ if match_case is False:
+ search_string = search_string.lower()
+
+ for torrent_id in torrent_ids:
+ torrent_name = all_torrents[torrent_id].get_name()
+ if match_case is False:
+ torrent_name = all_torrents[torrent_id].get_name().lower()
+ else:
+ torrent_name = all_torrents[torrent_id].get_name()
+
+ if search_string in torrent_name:
+ yield torrent_id
+
+
+def tracker_error_filter(torrent_ids, values):
+ filtered_torrent_ids = []
+ tm = component.get('TorrentManager')
+
+ # If this is a tracker_host, then we need to filter on it
+ if values[0] != 'Error':
+ for torrent_id in torrent_ids:
+ if values[0] == tm[torrent_id].get_status(['tracker_host'])['tracker_host']:
+ filtered_torrent_ids.append(torrent_id)
+ return filtered_torrent_ids
+
+ # Check torrent's tracker_status for 'Error:' and return those torrent_ids
+ for torrent_id in torrent_ids:
+ if 'Error:' in tm[torrent_id].get_status(['tracker_status'])['tracker_status']:
+ filtered_torrent_ids.append(torrent_id)
+ return filtered_torrent_ids
+
+
+class FilterManager(component.Component):
+ """FilterManager
+
+ """
+
+ def __init__(self, core):
+ component.Component.__init__(self, 'FilterManager')
+ log.debug('FilterManager init..')
+ self.core = core
+ self.torrents = core.torrentmanager
+ self.registered_filters = {}
+ self.register_filter('keyword', filter_keywords)
+ self.register_filter('name', filter_by_name)
+ self.tree_fields = {}
+
+ self.register_tree_field('state', self._init_state_tree)
+
+ def _init_tracker_tree():
+ return {'Error': 0}
+
+ self.register_tree_field('tracker_host', _init_tracker_tree)
+
+ self.register_filter('tracker_host', tracker_error_filter)
+
+ def _init_users_tree():
+ return {'': 0}
+
+ self.register_tree_field('owner', _init_users_tree)
+
+ def filter_torrent_ids(self, filter_dict):
+ """
+ returns a list of torrent_id's matching filter_dict.
+ core filter method
+ """
+ if not filter_dict:
+ return self.torrents.get_torrent_list()
+
+ # Sanitize input: filter-value must be a list of strings
+ for key, value in filter_dict.items():
+ if isinstance(value, string_types):
+ filter_dict[key] = [value]
+
+ # Optimized filter for id
+ if 'id' in filter_dict:
+ torrent_ids = list(filter_dict['id'])
+ del filter_dict['id']
+ else:
+ torrent_ids = self.torrents.get_torrent_list()
+
+ # Return if there's nothing more to filter
+ if not filter_dict:
+ return torrent_ids
+
+ # Special purpose, state=Active.
+ if 'state' in filter_dict:
+ # We need to make sure this is a list for the logic below
+ filter_dict['state'] = list(filter_dict['state'])
+
+ if 'state' in filter_dict and 'Active' in filter_dict['state']:
+ filter_dict['state'].remove('Active')
+ if not filter_dict['state']:
+ del filter_dict['state']
+ torrent_ids = self.filter_state_active(torrent_ids)
+
+ if not filter_dict:
+ return torrent_ids
+
+ # Registered filters
+ for field, values in list(filter_dict.items()):
+ if field in self.registered_filters:
+ # Filters out doubles
+ torrent_ids = list(
+ set(self.registered_filters[field](torrent_ids, values))
+ )
+ del filter_dict[field]
+
+ if not filter_dict:
+ return torrent_ids
+
+ torrent_keys, plugin_keys = self.torrents.separate_keys(
+ list(filter_dict), torrent_ids
+ )
+ # Leftover filter arguments, default filter on status fields.
+ for torrent_id in list(torrent_ids):
+ status = self.core.create_torrent_status(
+ torrent_id, torrent_keys, plugin_keys
+ )
+ for field, values in filter_dict.items():
+ if field in status and status[field] in values:
+ continue
+ elif torrent_id in torrent_ids:
+ torrent_ids.remove(torrent_id)
+ return torrent_ids
+
+ def get_filter_tree(self, show_zero_hits=True, hide_cat=None):
+ """
+ returns {field: [(value,count)] }
+ for use in sidebar.
+ """
+ torrent_ids = self.torrents.get_torrent_list()
+ tree_keys = list(self.tree_fields)
+ if hide_cat:
+ for cat in hide_cat:
+ tree_keys.remove(cat)
+
+ torrent_keys, plugin_keys = self.torrents.separate_keys(tree_keys, torrent_ids)
+ items = {field: self.tree_fields[field]() for field in tree_keys}
+
+ for torrent_id in list(torrent_ids):
+ status = self.core.create_torrent_status(
+ torrent_id, torrent_keys, plugin_keys
+ ) # status={key:value}
+ for field in tree_keys:
+ value = status[field]
+ items[field][value] = items[field].get(value, 0) + 1
+
+ if 'tracker_host' in items:
+ items['tracker_host']['All'] = len(torrent_ids)
+ items['tracker_host']['Error'] = len(
+ tracker_error_filter(torrent_ids, ('Error',))
+ )
+
+ if not show_zero_hits:
+ for cat in ['state', 'owner', 'tracker_host']:
+ if cat in tree_keys:
+ self._hide_state_items(items[cat])
+
+ # Return a dict of tuples:
+ sorted_items = {field: sorted(items[field].items()) for field in tree_keys}
+
+ if 'state' in tree_keys:
+ sorted_items['state'].sort(key=self._sort_state_item)
+
+ return sorted_items
+
+ def _init_state_tree(self):
+ init_state = {}
+ init_state['All'] = len(self.torrents.get_torrent_list())
+ for state in TORRENT_STATE:
+ init_state[state] = 0
+ init_state['Active'] = len(
+ self.filter_state_active(self.torrents.get_torrent_list())
+ )
+ return init_state
+
+ def register_filter(self, filter_id, filter_func, filter_value=None):
+ self.registered_filters[filter_id] = filter_func
+
+ def deregister_filter(self, filter_id):
+ del self.registered_filters[filter_id]
+
+ def register_tree_field(self, field, init_func=lambda: {}):
+ self.tree_fields[field] = init_func
+
+ def deregister_tree_field(self, field):
+ if field in self.tree_fields:
+ del self.tree_fields[field]
+
+ def filter_state_active(self, torrent_ids):
+ for torrent_id in list(torrent_ids):
+ status = self.torrents[torrent_id].get_status(
+ ['download_payload_rate', 'upload_payload_rate']
+ )
+ if status['download_payload_rate'] or status['upload_payload_rate']:
+ pass
+ else:
+ torrent_ids.remove(torrent_id)
+ return torrent_ids
+
+ def _hide_state_items(self, state_items):
+ """For hide(show)-zero hits"""
+ for value, count in list(state_items.items()):
+ if value != 'All' and count == 0:
+ del state_items[value]
+
+ def _sort_state_item(self, item):
+ try:
+ return STATE_SORT.index(item[0])
+ except ValueError:
+ return 99
diff --git a/deluge/core/pluginmanager.py b/deluge/core/pluginmanager.py
new file mode 100644
index 0000000..7d2f3a1
--- /dev/null
+++ b/deluge/core/pluginmanager.py
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+
+"""PluginManager for Core"""
+from __future__ import unicode_literals
+
+import logging
+
+from twisted.internet import defer
+
+import deluge.component as component
+import deluge.pluginmanagerbase
+from deluge.event import PluginDisabledEvent, PluginEnabledEvent
+
+log = logging.getLogger(__name__)
+
+
+class PluginManager(deluge.pluginmanagerbase.PluginManagerBase, component.Component):
+ """PluginManager handles the loading of plugins and provides plugins with
+ functions to access parts of the core."""
+
+ def __init__(self, core):
+ component.Component.__init__(self, 'CorePluginManager')
+
+ self.status_fields = {}
+
+ # Call the PluginManagerBase constructor
+ deluge.pluginmanagerbase.PluginManagerBase.__init__(
+ self, 'core.conf', 'deluge.plugin.core'
+ )
+
+ def start(self):
+ # Enable plugins that are enabled in the config
+ self.enable_plugins()
+
+ def stop(self):
+ # Disable all enabled plugins
+ self.disable_plugins()
+
+ def shutdown(self):
+ self.stop()
+
+ def update_plugins(self):
+ for plugin in self.plugins:
+ if hasattr(self.plugins[plugin], 'update'):
+ try:
+ self.plugins[plugin].update()
+ except Exception as ex:
+ log.exception(ex)
+
+ def enable_plugin(self, name):
+ d = defer.succeed(True)
+ if name not in self.plugins:
+ d = deluge.pluginmanagerbase.PluginManagerBase.enable_plugin(self, name)
+
+ def on_enable_plugin(result):
+ if result is True and name in self.plugins:
+ component.get('EventManager').emit(PluginEnabledEvent(name))
+ return result
+
+ d.addBoth(on_enable_plugin)
+ return d
+
+ def disable_plugin(self, name):
+ d = defer.succeed(True)
+ if name in self.plugins:
+ d = deluge.pluginmanagerbase.PluginManagerBase.disable_plugin(self, name)
+
+ def on_disable_plugin(result):
+ if name not in self.plugins:
+ component.get('EventManager').emit(PluginDisabledEvent(name))
+ return result
+
+ d.addBoth(on_disable_plugin)
+ return d
+
+ def get_status(self, torrent_id, fields):
+ """Return the value of status fields for the selected torrent_id."""
+ status = {}
+ if len(fields) == 0:
+ fields = list(self.status_fields)
+ for field in fields:
+ try:
+ status[field] = self.status_fields[field](torrent_id)
+ except KeyError:
+ pass
+ return status
+
+ def register_status_field(self, field, function):
+ """Register a new status field. This can be used in the same way the
+ client requests other status information from core."""
+ log.debug('Registering status field %s with PluginManager', field)
+ self.status_fields[field] = function
+
+ def deregister_status_field(self, field):
+ """Deregisters a status field"""
+ log.debug('Deregistering status field %s with PluginManager', field)
+ try:
+ del self.status_fields[field]
+ except Exception:
+ log.warning('Unable to deregister status field %s', field)
diff --git a/deluge/core/preferencesmanager.py b/deluge/core/preferencesmanager.py
new file mode 100644
index 0000000..db9556a
--- /dev/null
+++ b/deluge/core/preferencesmanager.py
@@ -0,0 +1,482 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2010 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+
+from __future__ import unicode_literals
+
+import logging
+import os
+import platform
+import random
+import threading
+
+from twisted.internet.task import LoopingCall
+
+import deluge.common
+import deluge.component as component
+import deluge.configmanager
+from deluge._libtorrent import lt
+from deluge.event import ConfigValueChangedEvent
+
+try:
+ import GeoIP
+except ImportError:
+ GeoIP = None
+
+try:
+ from urllib.parse import quote_plus
+ from urllib.request import urlopen
+except ImportError:
+ from urllib import quote_plus
+ from urllib2 import urlopen
+
+log = logging.getLogger(__name__)
+
+DEFAULT_PREFS = {
+ 'send_info': False,
+ 'info_sent': 0.0,
+ 'daemon_port': 58846,
+ 'allow_remote': False,
+ 'pre_allocate_storage': False,
+ 'download_location': deluge.common.get_default_download_dir(),
+ 'listen_ports': [6881, 6891],
+ 'listen_interface': '',
+ 'outgoing_interface': '',
+ 'random_port': True,
+ 'listen_random_port': None,
+ 'listen_use_sys_port': False,
+ 'listen_reuse_port': True,
+ 'outgoing_ports': [0, 0],
+ 'random_outgoing_ports': True,
+ 'copy_torrent_file': False,
+ 'del_copy_torrent_file': False,
+ 'torrentfiles_location': deluge.common.get_default_download_dir(),
+ 'plugins_location': os.path.join(deluge.configmanager.get_config_dir(), 'plugins'),
+ 'prioritize_first_last_pieces': False,
+ 'sequential_download': False,
+ 'dht': True,
+ 'upnp': True,
+ 'natpmp': True,
+ 'utpex': True,
+ 'lsd': True,
+ 'enc_in_policy': 1,
+ 'enc_out_policy': 1,
+ 'enc_level': 2,
+ 'max_connections_global': 200,
+ 'max_upload_speed': -1.0,
+ 'max_download_speed': -1.0,
+ 'max_upload_slots_global': 4,
+ 'max_half_open_connections': (
+ lambda: deluge.common.windows_check()
+ and (lambda: deluge.common.vista_check() and 4 or 8)()
+ or 50
+ )(),
+ 'max_connections_per_second': 20,
+ 'ignore_limits_on_local_network': True,
+ 'max_connections_per_torrent': -1,
+ 'max_upload_slots_per_torrent': -1,
+ 'max_upload_speed_per_torrent': -1,
+ 'max_download_speed_per_torrent': -1,
+ 'enabled_plugins': [],
+ 'add_paused': False,
+ 'max_active_seeding': 5,
+ 'max_active_downloading': 3,
+ 'max_active_limit': 8,
+ 'dont_count_slow_torrents': False,
+ 'queue_new_to_top': False,
+ 'stop_seed_at_ratio': False,
+ 'remove_seed_at_ratio': False,
+ 'stop_seed_ratio': 2.00,
+ 'share_ratio_limit': 2.00,
+ 'seed_time_ratio_limit': 7.00,
+ 'seed_time_limit': 180,
+ 'auto_managed': True,
+ 'move_completed': False,
+ 'move_completed_path': deluge.common.get_default_download_dir(),
+ 'move_completed_paths_list': [],
+ 'download_location_paths_list': [],
+ 'path_chooser_show_chooser_button_on_localhost': True,
+ 'path_chooser_auto_complete_enabled': True,
+ 'path_chooser_accelerator_string': 'Tab',
+ 'path_chooser_max_popup_rows': 20,
+ 'path_chooser_show_hidden_files': False,
+ 'new_release_check': True,
+ 'proxy': {
+ 'type': 0,
+ 'hostname': '',
+ 'username': '',
+ 'password': '',
+ 'port': 8080,
+ 'proxy_hostnames': True,
+ 'proxy_peer_connections': True,
+ 'proxy_tracker_connections': True,
+ 'force_proxy': False,
+ 'anonymous_mode': False,
+ },
+ 'peer_tos': '0x00',
+ 'rate_limit_ip_overhead': True,
+ 'geoip_db_location': '/usr/share/GeoIP/GeoIP.dat',
+ 'cache_size': 512,
+ 'cache_expiry': 60,
+ 'auto_manage_prefer_seeds': False,
+ 'shared': False,
+ 'super_seeding': False,
+}
+
+
+class PreferencesManager(component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'PreferencesManager')
+ self.config = deluge.configmanager.ConfigManager('core.conf', DEFAULT_PREFS)
+ if 'proxies' in self.config:
+ log.warning(
+ 'Updating config file for proxy, using "peer" values to fill new "proxy" setting'
+ )
+ self.config['proxy'].update(self.config['proxies']['peer'])
+ log.warning('New proxy config is: %s', self.config['proxy'])
+ del self.config['proxies']
+ if 'i2p_proxy' in self.config and self.config['i2p_proxy']['hostname']:
+ self.config['proxy'].update(self.config['i2p_proxy'])
+ self.config['proxy']['type'] = 6
+ del self.config['i2p_proxy']
+ if 'anonymous_mode' in self.config:
+ self.config['proxy']['anonymous_mode'] = self.config['anonymous_mode']
+ del self.config['anonymous_mode']
+ if 'proxy' in self.config:
+ for key in DEFAULT_PREFS['proxy']:
+ if key not in self.config['proxy']:
+ self.config['proxy'][key] = DEFAULT_PREFS['proxy'][key]
+
+ self.core = component.get('Core')
+ self.new_release_timer = None
+
+ def start(self):
+ # Set the initial preferences on start-up
+ for key in DEFAULT_PREFS:
+ self.do_config_set_func(key, self.config[key])
+
+ self.config.register_change_callback(self._on_config_value_change)
+
+ def stop(self):
+ if self.new_release_timer and self.new_release_timer.running:
+ self.new_release_timer.stop()
+
+ # Config set functions
+ def do_config_set_func(self, key, value):
+ on_set_func = getattr(self, '_on_set_' + key, None)
+ if on_set_func:
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('Config key: %s set to %s..', key, value)
+ on_set_func(key, value)
+
+ def _on_config_value_change(self, key, value):
+ if self.get_state() == 'Started':
+ self.do_config_set_func(key, value)
+ component.get('EventManager').emit(ConfigValueChangedEvent(key, value))
+
+ def _on_set_torrentfiles_location(self, key, value):
+ if self.config['copy_torrent_file']:
+ try:
+ os.makedirs(value)
+ except OSError as ex:
+ log.debug('Unable to make directory: %s', ex)
+
+ def _on_set_listen_ports(self, key, value):
+ self.__set_listen_on()
+
+ def _on_set_listen_interface(self, key, value):
+ self.__set_listen_on()
+
+ def _on_set_outgoing_interface(self, key, value):
+ """Set interface name or IP address for outgoing BitTorrent connections."""
+ value = value.strip() if value else ''
+ self.core.apply_session_settings({'outgoing_interfaces': value})
+
+ def _on_set_random_port(self, key, value):
+ self.__set_listen_on()
+
+ def __set_listen_on(self):
+ """ Set the ports and interface address to listen for incoming connections on."""
+ if self.config['random_port']:
+ if not self.config['listen_random_port']:
+ self.config['listen_random_port'] = random.randrange(49152, 65525)
+ listen_ports = [
+ self.config['listen_random_port']
+ ] * 2 # use single port range
+ else:
+ self.config['listen_random_port'] = None
+ listen_ports = self.config['listen_ports']
+
+ if self.config['listen_interface']:
+ interface = self.config['listen_interface'].strip()
+ else:
+ interface = '0.0.0.0'
+
+ log.debug(
+ 'Listen Interface: %s, Ports: %s with use_sys_port: %s',
+ interface,
+ listen_ports,
+ self.config['listen_use_sys_port'],
+ )
+ interfaces = [
+ '%s:%s' % (interface, port)
+ for port in range(listen_ports[0], listen_ports[1] + 1)
+ ]
+ self.core.apply_session_settings(
+ {
+ 'listen_system_port_fallback': self.config['listen_use_sys_port'],
+ 'listen_interfaces': ''.join(interfaces),
+ }
+ )
+
+ def _on_set_outgoing_ports(self, key, value):
+ self.__set_outgoing_ports()
+
+ def _on_set_random_outgoing_ports(self, key, value):
+ self.__set_outgoing_ports()
+
+ def __set_outgoing_ports(self):
+ port = (
+ 0
+ if self.config['random_outgoing_ports']
+ else self.config['outgoing_ports'][0]
+ )
+ if port:
+ num_ports = (
+ self.config['outgoing_ports'][1] - self.config['outgoing_ports'][0]
+ )
+ num_ports = num_ports if num_ports > 1 else 5
+ else:
+ num_ports = 0
+ log.debug('Outgoing port set to %s with range: %s', port, num_ports)
+ self.core.apply_session_settings(
+ {'outgoing_port': port, 'num_outgoing_ports': num_ports}
+ )
+
+ def _on_set_peer_tos(self, key, value):
+ try:
+ self.core.apply_session_setting('peer_tos', int(value, 16))
+ except ValueError as ex:
+ log.error('Invalid tos byte: %s', ex)
+
+ def _on_set_dht(self, key, value):
+ lt_bootstraps = self.core.session.get_settings()['dht_bootstrap_nodes']
+ # Update list of lt bootstraps, using set to remove duplicates.
+ dht_bootstraps = set(
+ lt_bootstraps.split(',')
+ + [
+ 'router.bittorrent.com:6881',
+ 'router.utorrent.com:6881',
+ 'router.bitcomet.com:6881',
+ 'dht.transmissionbt.com:6881',
+ 'dht.aelitis.com:6881',
+ ]
+ )
+ self.core.apply_session_settings(
+ {'dht_bootstrap_nodes': ','.join(dht_bootstraps), 'enable_dht': value}
+ )
+
+ def _on_set_upnp(self, key, value):
+ self.core.apply_session_setting('enable_upnp', value)
+
+ def _on_set_natpmp(self, key, value):
+ self.core.apply_session_setting('enable_natpmp', value)
+
+ def _on_set_lsd(self, key, value):
+ self.core.apply_session_setting('enable_lsd', value)
+
+ def _on_set_utpex(self, key, value):
+ if value:
+ self.core.session.add_extension('ut_pex')
+
+ def _on_set_enc_in_policy(self, key, value):
+ self._on_set_encryption(key, value)
+
+ def _on_set_enc_out_policy(self, key, value):
+ self._on_set_encryption(key, value)
+
+ def _on_set_enc_level(self, key, value):
+ self._on_set_encryption(key, value)
+
+ def _on_set_encryption(self, key, value):
+ # Convert Deluge enc_level values to libtorrent enc_level values.
+ pe_enc_level = {
+ 0: lt.enc_level.plaintext,
+ 1: lt.enc_level.rc4,
+ 2: lt.enc_level.both,
+ }
+ self.core.apply_session_settings(
+ {
+ 'out_enc_policy': lt.enc_policy(self.config['enc_out_policy']),
+ 'in_enc_policy': lt.enc_policy(self.config['enc_in_policy']),
+ 'allowed_enc_level': lt.enc_level(
+ pe_enc_level[self.config['enc_level']]
+ ),
+ 'prefer_rc4': True,
+ }
+ )
+
+ def _on_set_max_connections_global(self, key, value):
+ self.core.apply_session_setting('connections_limit', value)
+
+ def _on_set_max_upload_speed(self, key, value):
+ # We need to convert Kb/s to B/s
+ value = -1 if value < 0 else int(value * 1024)
+ self.core.apply_session_setting('upload_rate_limit', value)
+
+ def _on_set_max_download_speed(self, key, value):
+ # We need to convert Kb/s to B/s
+ value = -1 if value < 0 else int(value * 1024)
+ self.core.apply_session_setting('download_rate_limit', value)
+
+ def _on_set_max_upload_slots_global(self, key, value):
+ self.core.apply_session_setting('unchoke_slots_limit', value)
+
+ def _on_set_max_half_open_connections(self, key, value):
+ self.core.apply_session_setting('half_open_limit', value)
+
+ def _on_set_max_connections_per_second(self, key, value):
+ self.core.apply_session_setting('connection_speed', value)
+
+ def _on_set_ignore_limits_on_local_network(self, key, value):
+ self.core.apply_session_setting('ignore_limits_on_local_network', value)
+
+ def _on_set_share_ratio_limit(self, key, value):
+ # This value is a float percentage in deluge, but libtorrent needs int percentage.
+ self.core.apply_session_setting('share_ratio_limit', int(value * 100))
+
+ def _on_set_seed_time_ratio_limit(self, key, value):
+ # This value is a float percentage in deluge, but libtorrent needs int percentage.
+ self.core.apply_session_setting('seed_time_ratio_limit', int(value * 100))
+
+ def _on_set_seed_time_limit(self, key, value):
+ # This value is stored in minutes in deluge, but libtorrent wants seconds
+ self.core.apply_session_setting('seed_time_limit', int(value * 60))
+
+ def _on_set_max_active_downloading(self, key, value):
+ self.core.apply_session_setting('active_downloads', value)
+
+ def _on_set_max_active_seeding(self, key, value):
+ self.core.apply_session_setting('active_seeds', value)
+
+ def _on_set_max_active_limit(self, key, value):
+ self.core.apply_session_setting('active_limit', value)
+
+ def _on_set_dont_count_slow_torrents(self, key, value):
+ self.core.apply_session_setting('dont_count_slow_torrents', value)
+
+ def _on_set_send_info(self, key, value):
+ """sends anonymous stats home"""
+ log.debug('Sending anonymous stats..')
+
+ class SendInfoThread(threading.Thread):
+ def __init__(self, config):
+ self.config = config
+ threading.Thread.__init__(self)
+
+ def run(self):
+ import time
+
+ now = time.time()
+ # check if we've done this within the last week or never
+ if (now - self.config['info_sent']) >= (60 * 60 * 24 * 7):
+ try:
+ url = (
+ 'http://deluge-torrent.org/stats_get.php?processor='
+ + platform.machine()
+ + '&python='
+ + platform.python_version()
+ + '&deluge='
+ + deluge.common.get_version()
+ + '&os='
+ + platform.system()
+ + '&plugins='
+ + quote_plus(':'.join(self.config['enabled_plugins']))
+ )
+ urlopen(url)
+ except IOError as ex:
+ log.debug('Network error while trying to send info: %s', ex)
+ else:
+ self.config['info_sent'] = now
+
+ if value:
+ SendInfoThread(self.config).start()
+
+ def _on_set_new_release_check(self, key, value):
+ if value:
+ log.debug('Checking for new release..')
+ threading.Thread(target=self.core.get_new_release).start()
+ if self.new_release_timer and self.new_release_timer.running:
+ self.new_release_timer.stop()
+ # Set a timer to check for a new release every 3 days
+ self.new_release_timer = LoopingCall(
+ self._on_set_new_release_check, 'new_release_check', True
+ )
+ self.new_release_timer.start(72 * 60 * 60, False)
+ else:
+ if self.new_release_timer and self.new_release_timer.running:
+ self.new_release_timer.stop()
+
+ def _on_set_proxy(self, key, value):
+ # Initialise with type none and blank hostnames.
+ proxy_settings = {
+ 'proxy_type': lt.proxy_type_t.none,
+ 'i2p_hostname': '',
+ 'proxy_hostname': '',
+ 'proxy_hostnames': value['proxy_hostnames'],
+ 'proxy_peer_connections': value['proxy_peer_connections'],
+ 'proxy_tracker_connections': value['proxy_tracker_connections'],
+ 'force_proxy': value['force_proxy'],
+ 'anonymous_mode': value['anonymous_mode'],
+ }
+
+ if value['type'] == lt.proxy_type_t.i2p_proxy:
+ proxy_settings.update(
+ {
+ 'proxy_type': lt.proxy_type_t.i2p_proxy,
+ 'i2p_hostname': value['hostname'],
+ 'i2p_port': value['port'],
+ }
+ )
+ elif value['type'] != lt.proxy_type_t.none:
+ proxy_settings.update(
+ {
+ 'proxy_type': value['type'],
+ 'proxy_hostname': value['hostname'],
+ 'proxy_port': value['port'],
+ 'proxy_username': value['username'],
+ 'proxy_password': value['password'],
+ }
+ )
+
+ self.core.apply_session_settings(proxy_settings)
+
+ def _on_set_rate_limit_ip_overhead(self, key, value):
+ self.core.apply_session_setting('rate_limit_ip_overhead', value)
+
+ def _on_set_geoip_db_location(self, key, geoipdb_path):
+ # Load the GeoIP DB for country look-ups if available
+ if os.path.exists(geoipdb_path):
+ try:
+ self.core.geoip_instance = GeoIP.open(
+ geoipdb_path, GeoIP.GEOIP_STANDARD
+ )
+ except AttributeError:
+ log.warning('GeoIP Unavailable')
+ else:
+ log.warning('Unable to find GeoIP database file: %s', geoipdb_path)
+
+ def _on_set_cache_size(self, key, value):
+ self.core.apply_session_setting('cache_size', value)
+
+ def _on_set_cache_expiry(self, key, value):
+ self.core.apply_session_setting('cache_expiry', value)
+
+ def _on_auto_manage_prefer_seeds(self, key, value):
+ self.core.apply_session_setting('auto_manage_prefer_seeds', value)
diff --git a/deluge/core/rpcserver.py b/deluge/core/rpcserver.py
new file mode 100644
index 0000000..adb5219
--- /dev/null
+++ b/deluge/core/rpcserver.py
@@ -0,0 +1,646 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008,2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""RPCServer Module"""
+from __future__ import unicode_literals
+
+import logging
+import os
+import stat
+import sys
+import traceback
+from collections import namedtuple
+from types import FunctionType
+
+from OpenSSL import crypto
+from twisted.internet import defer, reactor
+from twisted.internet.protocol import Factory, connectionDone
+
+import deluge.component as component
+import deluge.configmanager
+from deluge.core.authmanager import (
+ AUTH_LEVEL_ADMIN,
+ AUTH_LEVEL_DEFAULT,
+ AUTH_LEVEL_NONE,
+)
+from deluge.crypto_utils import get_context_factory
+from deluge.error import (
+ DelugeError,
+ IncompatibleClient,
+ NotAuthorizedError,
+ WrappedException,
+ _ClientSideRecreateError,
+)
+from deluge.event import ClientDisconnectedEvent
+from deluge.transfer import DelugeTransferProtocol
+
+RPC_RESPONSE = 1
+RPC_ERROR = 2
+RPC_EVENT = 3
+
+log = logging.getLogger(__name__)
+
+
+def export(auth_level=AUTH_LEVEL_DEFAULT):
+ """
+ Decorator function to register an object's method as an RPC. The object
+ will need to be registered with an :class:`RPCServer` to be effective.
+
+ :param func: the function to export
+ :type func: function
+ :param auth_level: the auth level required to call this method
+ :type auth_level: int
+
+ """
+
+ def wrap(func, *args, **kwargs):
+ func._rpcserver_export = True
+ func._rpcserver_auth_level = auth_level
+
+ rpc_text = '**RPC exported method** (*Auth level: %s*)' % auth_level
+
+ # Append the RPC text while ensuring correct docstring formatting.
+ if func.__doc__:
+ if func.__doc__.endswith(' '):
+ indent = func.__doc__.split('\n')[-1]
+ func.__doc__ += '\n{}'.format(indent)
+ else:
+ func.__doc__ += '\n\n'
+ func.__doc__ += rpc_text
+ else:
+ func.__doc__ = rpc_text
+
+ return func
+
+ if isinstance(auth_level, FunctionType):
+ func = auth_level
+ auth_level = AUTH_LEVEL_DEFAULT
+ return wrap(func)
+ else:
+ return wrap
+
+
+def format_request(call):
+ """
+ Format the RPCRequest message for debug printing
+
+ :param call: the request
+ :type call: a RPCRequest
+
+ :returns: a formatted string for printing
+ :rtype: str
+
+ """
+ try:
+ s = call[1] + '('
+ if call[2]:
+ s += ', '.join([str(x) for x in call[2]])
+ if call[3]:
+ if call[2]:
+ s += ', '
+ s += ', '.join([key + '=' + str(value) for key, value in call[3].items()])
+ s += ')'
+ except UnicodeEncodeError:
+ return 'UnicodeEncodeError, call: %s' % call
+ else:
+ return s
+
+
+class DelugeRPCProtocol(DelugeTransferProtocol):
+ def __init__(self):
+ super(DelugeRPCProtocol, self).__init__()
+ # namedtuple subclass with auth_level, username for the connected session.
+ self.AuthLevel = namedtuple('SessionAuthlevel', 'auth_level, username')
+
+ def message_received(self, request):
+ """
+ This method is called whenever a message is received from a client. The
+ only message that a client sends to the server is a RPC Request message.
+ If the RPC Request message is valid, then the method is called in
+ :meth:`dispatch`.
+
+ :param request: the request from the client.
+ :type data: tuple
+
+ """
+ if not isinstance(request, tuple):
+ log.debug('Received invalid message: type is not tuple')
+ return
+
+ if len(request) < 1:
+ log.debug('Received invalid message: there are no items')
+ return
+
+ for call in request:
+ if len(call) != 4:
+ log.debug(
+ 'Received invalid rpc request: number of items ' 'in request is %s',
+ len(call),
+ )
+ continue
+ # log.debug('RPCRequest: %s', format_request(call))
+ reactor.callLater(0, self.dispatch, *call)
+
+ def sendData(self, data): # NOQA: N802
+ """
+ Sends the data to the client.
+
+ :param data: the object that is to be sent to the client. This should
+ be one of the RPC message types.
+ :type data: object
+
+ """
+ try:
+ self.transfer_message(data)
+ except Exception as ex:
+ log.warning('Error occurred when sending message: %s.', ex)
+ log.exception(ex)
+ raise
+
+ def connectionMade(self): # NOQA: N802
+ """
+ This method is called when a new client connects.
+ """
+ peer = self.transport.getPeer()
+ log.info('Deluge Client connection made from: %s:%s', peer.host, peer.port)
+ # Set the initial auth level of this session to AUTH_LEVEL_NONE
+ self.factory.authorized_sessions[self.transport.sessionno] = self.AuthLevel(
+ AUTH_LEVEL_NONE, ''
+ )
+
+ def connectionLost(self, reason=connectionDone): # NOQA: N802
+ """
+ This method is called when the client is disconnected.
+
+ :param reason: the reason the client disconnected.
+ :type reason: str
+
+ """
+
+ # We need to remove this session from various dicts
+ del self.factory.authorized_sessions[self.transport.sessionno]
+ if self.transport.sessionno in self.factory.session_protocols:
+ del self.factory.session_protocols[self.transport.sessionno]
+ if self.transport.sessionno in self.factory.interested_events:
+ del self.factory.interested_events[self.transport.sessionno]
+
+ if self.factory.state == 'running':
+ component.get('EventManager').emit(
+ ClientDisconnectedEvent(self.factory.session_id)
+ )
+ log.info('Deluge client disconnected: %s', reason.value)
+
+ def valid_session(self):
+ return self.transport.sessionno in self.factory.authorized_sessions
+
+ def dispatch(self, request_id, method, args, kwargs):
+ """
+ This method is run when a RPC Request is made. It will run the local method
+ and will send either a RPC Response or RPC Error back to the client.
+
+ :param request_id: the request_id from the client (sent in the RPC Request)
+ :type request_id: int
+ :param method: the local method to call. It must be registered with
+ the :class:`RPCServer`.
+ :type method: str
+ :param args: the arguments to pass to `method`
+ :type args: list
+ :param kwargs: the keyword-arguments to pass to `method`
+ :type kwargs: dict
+
+ """
+
+ def send_error():
+ """
+ Sends an error response with the contents of the exception that was raised.
+ """
+ exc_type, exc_value, dummy_exc_trace = sys.exc_info()
+ formated_tb = traceback.format_exc()
+ try:
+ self.sendData(
+ (
+ RPC_ERROR,
+ request_id,
+ exc_type.__name__,
+ exc_value._args,
+ exc_value._kwargs,
+ formated_tb,
+ )
+ )
+ except AttributeError:
+ # This is not a deluge exception (object has no attribute '_args), let's wrap it
+ log.warning(
+ 'An exception occurred while sending RPC_ERROR to '
+ 'client. Wrapping it and resending. Error to '
+ 'send(causing exception goes next):\n%s',
+ formated_tb,
+ )
+ try:
+ raise WrappedException(
+ str(exc_value), exc_type.__name__, formated_tb
+ )
+ except WrappedException:
+ send_error()
+ except Exception as ex:
+ log.error(
+ 'An exception occurred while sending RPC_ERROR to client: %s', ex
+ )
+
+ if method == 'daemon.info':
+ # This is a special case and used in the initial connection process
+ self.sendData((RPC_RESPONSE, request_id, deluge.common.get_version()))
+ return
+ elif method == 'daemon.login':
+ # This is a special case and used in the initial connection process
+ # We need to authenticate the user here
+ log.debug('RPC dispatch daemon.login')
+ try:
+ client_version = kwargs.pop('client_version', None)
+ if client_version is None:
+ raise IncompatibleClient(deluge.common.get_version())
+ ret = component.get('AuthManager').authorize(*args, **kwargs)
+ if ret:
+ self.factory.authorized_sessions[
+ self.transport.sessionno
+ ] = self.AuthLevel(ret, args[0])
+ self.factory.session_protocols[self.transport.sessionno] = self
+ except Exception as ex:
+ send_error()
+ if not isinstance(ex, _ClientSideRecreateError):
+ log.exception(ex)
+ else:
+ self.sendData((RPC_RESPONSE, request_id, (ret)))
+ if not ret:
+ self.transport.loseConnection()
+ return
+
+ # Anything below requires a valid session
+ if not self.valid_session():
+ return
+
+ if method == 'daemon.set_event_interest':
+ log.debug('RPC dispatch daemon.set_event_interest')
+ # This special case is to allow clients to set which events they are
+ # interested in receiving.
+ # We are expecting a sequence from the client.
+ try:
+ if self.transport.sessionno not in self.factory.interested_events:
+ self.factory.interested_events[self.transport.sessionno] = []
+ self.factory.interested_events[self.transport.sessionno].extend(args[0])
+ except Exception:
+ send_error()
+ else:
+ self.sendData((RPC_RESPONSE, request_id, (True)))
+ return
+
+ if method not in self.factory.methods:
+ try:
+ # Raise exception to be sent back to client
+ raise AttributeError('RPC call on invalid function: %s' % method)
+ except AttributeError:
+ send_error()
+ return
+
+ log.debug('RPC dispatch %s', method)
+ try:
+ method_auth_requirement = self.factory.methods[method]._rpcserver_auth_level
+ auth_level = self.factory.authorized_sessions[
+ self.transport.sessionno
+ ].auth_level
+ if auth_level < method_auth_requirement:
+ # This session is not allowed to call this method
+ log.debug(
+ 'Session %s is attempting an unauthorized method call!',
+ self.transport.sessionno,
+ )
+ raise NotAuthorizedError(auth_level, method_auth_requirement)
+ # Set the session_id in the factory so that methods can know
+ # which session is calling it.
+ self.factory.session_id = self.transport.sessionno
+ ret = self.factory.methods[method](*args, **kwargs)
+ except Exception as ex:
+ send_error()
+ # Don't bother printing out DelugeErrors, because they are just
+ # for the client
+ if not isinstance(ex, DelugeError):
+ log.exception('Exception calling RPC request: %s', ex)
+ else:
+ # Check if the return value is a deferred, since we'll need to
+ # wait for it to fire before sending the RPC_RESPONSE
+ if isinstance(ret, defer.Deferred):
+
+ def on_success(result):
+ try:
+ self.sendData((RPC_RESPONSE, request_id, result))
+ except Exception:
+ send_error()
+ return result
+
+ def on_fail(failure):
+ try:
+ failure.raiseException()
+ except Exception:
+ send_error()
+ return failure
+
+ ret.addCallbacks(on_success, on_fail)
+ else:
+ self.sendData((RPC_RESPONSE, request_id, ret))
+
+
+class RPCServer(component.Component):
+ """
+ This class is used to handle rpc requests from the client. Objects are
+ registered with this class and their methods are exported using the export
+ decorator.
+
+ :param port: the port the RPCServer will listen on
+ :type port: int
+ :param interface: the interface to listen on, this may override the `allow_remote` setting
+ :type interface: str
+ :param allow_remote: set True if the server should allow remote connections
+ :type allow_remote: bool
+ :param listen: if False, will not start listening.. This is only useful in Classic Mode
+ :type listen: bool
+ """
+
+ def __init__(self, port=58846, interface='', allow_remote=False, listen=True):
+ component.Component.__init__(self, 'RPCServer')
+
+ self.factory = Factory()
+ self.factory.protocol = DelugeRPCProtocol
+ self.factory.session_id = -1
+ self.factory.state = 'running'
+
+ # Holds the registered methods
+ self.factory.methods = {}
+ # Holds the session_ids and auth levels
+ self.factory.authorized_sessions = {}
+ # Holds the protocol objects with the session_id as key
+ self.factory.session_protocols = {}
+ # Holds the interested event list for the sessions
+ self.factory.interested_events = {}
+
+ self.listen = listen
+ if not listen:
+ return
+
+ if allow_remote:
+ hostname = ''
+ else:
+ hostname = 'localhost'
+
+ if interface:
+ hostname = interface
+
+ log.info('Starting DelugeRPC server %s:%s', hostname, port)
+
+ # Check for SSL keys and generate some if needed
+ check_ssl_keys()
+
+ cert = os.path.join(deluge.configmanager.get_config_dir('ssl'), 'daemon.cert')
+ pkey = os.path.join(deluge.configmanager.get_config_dir('ssl'), 'daemon.pkey')
+
+ try:
+ reactor.listenSSL(
+ port, self.factory, get_context_factory(cert, pkey), interface=hostname
+ )
+ except Exception as ex:
+ log.debug('Daemon already running or port not available.: %s', ex)
+ raise
+
+ def register_object(self, obj, name=None):
+ """
+ Registers an object to export it's rpc methods. These methods should
+ be exported with the export decorator prior to registering the object.
+
+ :param obj: the object that we want to export
+ :type obj: object
+ :param name: the name to use, if None, it will be the class name of the object
+ :type name: str
+ """
+ if not name:
+ name = obj.__class__.__name__.lower()
+
+ for d in dir(obj):
+ if d[0] == '_':
+ continue
+ if getattr(getattr(obj, d), '_rpcserver_export', False):
+ log.debug('Registering method: %s', name + '.' + d)
+ self.factory.methods[name + '.' + d] = getattr(obj, d)
+
+ def deregister_object(self, obj):
+ """
+ Deregisters an objects exported rpc methods.
+
+ :param obj: the object that was previously registered
+
+ """
+ for key, value in self.factory.methods.items():
+ if value.__self__ == obj:
+ del self.factory.methods[key]
+
+ def get_object_method(self, name):
+ """
+ Returns a registered method.
+
+ :param name: the name of the method, usually in the form of 'object.method'
+ :type name: str
+
+ :returns: method
+
+ :raises KeyError: if `name` is not registered
+
+ """
+ return self.factory.methods[name]
+
+ def get_method_list(self):
+ """
+ Returns a list of the exported methods.
+
+ :returns: the exported methods
+ :rtype: list
+ """
+ return list(self.factory.methods)
+
+ def get_session_id(self):
+ """
+ Returns the session id of the current RPC.
+
+ :returns: the session id, this will be -1 if no connections have been made
+ :rtype: int
+
+ """
+ return self.factory.session_id
+
+ def get_session_user(self):
+ """
+ Returns the username calling the current RPC.
+
+ :returns: the username of the user calling the current RPC
+ :rtype: string
+
+ """
+ if not self.listen:
+ return 'localclient'
+ session_id = self.get_session_id()
+ if session_id > -1 and session_id in self.factory.authorized_sessions:
+ return self.factory.authorized_sessions[session_id].username
+ else:
+ # No connections made yet
+ return ''
+
+ def get_session_auth_level(self):
+ """
+ Returns the auth level of the user calling the current RPC.
+
+ :returns: the auth level
+ :rtype: int
+ """
+ if not self.listen or not self.is_session_valid(self.get_session_id()):
+ return AUTH_LEVEL_ADMIN
+ return self.factory.authorized_sessions[self.get_session_id()].auth_level
+
+ def get_rpc_auth_level(self, rpc):
+ """
+ Returns the auth level requirement for an exported rpc.
+
+ :returns: the auth level
+ :rtype: int
+ """
+ return self.factory.methods[rpc]._rpcserver_auth_level
+
+ def is_session_valid(self, session_id):
+ """
+ Checks if the session is still valid, eg, if the client is still connected.
+
+ :param session_id: the session id
+ :type session_id: int
+
+ :returns: True if the session is valid
+ :rtype: bool
+
+ """
+ return session_id in self.factory.authorized_sessions
+
+ def emit_event(self, event):
+ """
+ Emits the event to interested clients.
+
+ :param event: the event to emit
+ :type event: :class:`deluge.event.DelugeEvent`
+ """
+ log.debug('intevents: %s', self.factory.interested_events)
+ # Find sessions interested in this event
+ for session_id, interest in self.factory.interested_events.items():
+ if event.name in interest:
+ log.debug('Emit Event: %s %s', event.name, event.args)
+ # This session is interested so send a RPC_EVENT
+ self.factory.session_protocols[session_id].sendData(
+ (RPC_EVENT, event.name, event.args)
+ )
+
+ def emit_event_for_session_id(self, session_id, event):
+ """
+ Emits the event to specified session_id.
+
+ :param session_id: the event to emit
+ :type session_id: int
+ :param event: the event to emit
+ :type event: :class:`deluge.event.DelugeEvent`
+ """
+ if not self.is_session_valid(session_id):
+ log.debug(
+ 'Session ID %s is not valid. Not sending event "%s".',
+ session_id,
+ event.name,
+ )
+ return
+ if session_id not in self.factory.interested_events:
+ log.debug(
+ 'Session ID %s is not interested in any events. Not sending event "%s".',
+ session_id,
+ event.name,
+ )
+ return
+ if event.name not in self.factory.interested_events[session_id]:
+ log.debug(
+ 'Session ID %s is not interested in event "%s". Not sending it.',
+ session_id,
+ event.name,
+ )
+ return
+ log.debug(
+ 'Sending event "%s" with args "%s" to session id "%s".',
+ event.name,
+ event.args,
+ session_id,
+ )
+ self.factory.session_protocols[session_id].sendData(
+ (RPC_EVENT, event.name, event.args)
+ )
+
+ def stop(self):
+ self.factory.state = 'stopping'
+
+
+def check_ssl_keys():
+ """
+ Check for SSL cert/key and create them if necessary
+ """
+ ssl_dir = deluge.configmanager.get_config_dir('ssl')
+ if not os.path.exists(ssl_dir):
+ # The ssl folder doesn't exist so we need to create it
+ os.makedirs(ssl_dir)
+ generate_ssl_keys()
+ else:
+ for f in ('daemon.pkey', 'daemon.cert'):
+ if not os.path.exists(os.path.join(ssl_dir, f)):
+ generate_ssl_keys()
+ break
+
+
+def generate_ssl_keys():
+ """
+ This method generates a new SSL key/cert.
+ """
+ from deluge.common import PY2
+
+ digest = 'sha256' if not PY2 else b'sha256'
+
+ # Generate key pair
+ pkey = crypto.PKey()
+ pkey.generate_key(crypto.TYPE_RSA, 2048)
+
+ # Generate cert request
+ req = crypto.X509Req()
+ subj = req.get_subject()
+ setattr(subj, 'CN', 'Deluge Daemon')
+ req.set_pubkey(pkey)
+ req.sign(pkey, digest)
+
+ # Generate certificate
+ cert = crypto.X509()
+ cert.set_serial_number(0)
+ cert.gmtime_adj_notBefore(0)
+ cert.gmtime_adj_notAfter(60 * 60 * 24 * 365 * 3) # Three Years
+ cert.set_issuer(req.get_subject())
+ cert.set_subject(req.get_subject())
+ cert.set_pubkey(req.get_pubkey())
+ cert.sign(pkey, digest)
+
+ # Write out files
+ ssl_dir = deluge.configmanager.get_config_dir('ssl')
+ with open(os.path.join(ssl_dir, 'daemon.pkey'), 'wb') as _file:
+ _file.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey))
+ with open(os.path.join(ssl_dir, 'daemon.cert'), 'wb') as _file:
+ _file.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
+ # Make the files only readable by this user
+ for f in ('daemon.pkey', 'daemon.cert'):
+ os.chmod(os.path.join(ssl_dir, f), stat.S_IREAD | stat.S_IWRITE)
diff --git a/deluge/core/torrent.py b/deluge/core/torrent.py
new file mode 100644
index 0000000..a8e178f
--- /dev/null
+++ b/deluge/core/torrent.py
@@ -0,0 +1,1501 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""Internal Torrent class
+
+Attributes:
+ LT_TORRENT_STATE_MAP (dict): Maps the torrent state from libtorrent to Deluge state.
+
+"""
+
+from __future__ import division, unicode_literals
+
+import logging
+import os
+import socket
+
+from twisted.internet.defer import Deferred, DeferredList
+
+import deluge.component as component
+from deluge._libtorrent import lt
+from deluge.common import decode_bytes
+from deluge.configmanager import ConfigManager, get_config_dir
+from deluge.core.authmanager import AUTH_LEVEL_ADMIN
+from deluge.decorators import deprecated
+from deluge.event import (
+ TorrentFolderRenamedEvent,
+ TorrentStateChangedEvent,
+ TorrentTrackerStatusEvent,
+)
+
+try:
+ from urllib.parse import urlparse
+except ImportError:
+ # PY2 fallback
+ from urlparse import urlparse # pylint: disable=ungrouped-imports
+
+try:
+ from future_builtins import zip
+except ImportError:
+ # Ignore on Py3.
+ pass
+
+log = logging.getLogger(__name__)
+
+LT_TORRENT_STATE_MAP = {
+ 'queued_for_checking': 'Checking',
+ 'checking_files': 'Checking',
+ 'downloading_metadata': 'Downloading',
+ 'downloading': 'Downloading',
+ 'finished': 'Seeding',
+ 'seeding': 'Seeding',
+ 'allocating': 'Allocating',
+ 'checking_resume_data': 'Checking',
+}
+
+
+def sanitize_filepath(filepath, folder=False):
+ """Returns a sanitized filepath to pass to libtorrent rename_file().
+
+ The filepath will have backslashes substituted along with whitespace
+ padding and duplicate slashes stripped.
+
+ Args:
+ folder (bool): A trailing slash is appended to the returned filepath.
+ """
+
+ def clean_filename(filename):
+ """Strips whitespace and discards dotted filenames"""
+ filename = filename.strip()
+ if filename.replace('.', '') == '':
+ return ''
+ return filename
+
+ if '\\' in filepath or '/' in filepath:
+ folderpath = filepath.replace('\\', '/').split('/')
+ folderpath = [clean_filename(x) for x in folderpath]
+ newfilepath = '/'.join([path for path in folderpath if path])
+ else:
+ newfilepath = clean_filename(filepath)
+
+ if folder is True:
+ newfilepath += '/'
+
+ return newfilepath
+
+
+def convert_lt_files(files):
+ """Indexes and decodes files from libtorrent get_files().
+
+ Args:
+ files (list): The libtorrent torrent files.
+
+ Returns:
+ list of dict: The files.
+
+ The format for the file dict::
+
+ {
+ "index": int,
+ "path": str,
+ "size": int,
+ "offset": int
+ }
+ """
+ filelist = []
+ for index, _file in enumerate(files):
+ try:
+ file_path = _file.path.decode('utf8')
+ except AttributeError:
+ file_path = _file.path
+
+ filelist.append(
+ {
+ 'index': index,
+ 'path': file_path.replace('\\', '/'),
+ 'size': _file.size,
+ 'offset': _file.offset,
+ }
+ )
+
+ return filelist
+
+
+class TorrentOptions(dict):
+ """TorrentOptions create a dict of the torrent options.
+
+ Attributes:
+ add_paused (bool): Add the torrrent in a paused state.
+ auto_managed (bool): Set torrent to auto managed mode, i.e. will be started or queued automatically.
+ download_location (str): The path for the torrent data to be stored while downloading.
+ file_priorities (list of int): The priority for files in torrent, range is [0..7] however
+ only [0, 1, 4, 7] are normally used and correspond to [Skip, Low, Normal, High]
+ mapped_files (dict): A mapping of the renamed filenames in 'index:filename' pairs.
+ max_connections (int): Sets maximum number of connections this torrent will open.
+ This must be at least 2. The default is unlimited (-1).
+ max_download_speed (float): Will limit the download bandwidth used by this torrent to the
+ limit you set.The default is unlimited (-1) but will not exceed global limit.
+ max_upload_slots (int): Sets the maximum number of peers that are
+ unchoked at the same time on this torrent. This defaults to infinite (-1).
+ max_upload_speed (float): Will limit the upload bandwidth used by this torrent to the limit
+ you set. The default is unlimited (-1) but will not exceed global limit.
+ move_completed (bool): Move the torrent when downloading has finished.
+ move_completed_path (str): The path to move torrent to when downloading has finished.
+ name (str): The display name of the torrent.
+ owner (str): The user this torrent belongs to.
+ pre_allocate_storage (bool): When adding the torrent should all files be pre-allocated.
+ prioritize_first_last_pieces (bool): Prioritize the first and last pieces in the torrent.
+ remove_at_ratio (bool): Remove the torrent when it has reached the stop_ratio.
+ seed_mode (bool): Assume that all files are present for this torrent (Only used when adding a torent).
+ sequential_download (bool): Download the pieces of the torrent in order.
+ shared (bool): Enable the torrent to be seen by other Deluge users.
+ stop_at_ratio (bool): Stop the torrent when it has reached stop_ratio.
+ stop_ratio (float): The seeding ratio to stop (or remove) the torrent at.
+ super_seeding (bool): Enable super seeding/initial seeding.
+ """
+
+ def __init__(self):
+ super(TorrentOptions, self).__init__()
+ config = ConfigManager('core.conf').config
+ options_conf_map = {
+ 'add_paused': 'add_paused',
+ 'auto_managed': 'auto_managed',
+ 'download_location': 'download_location',
+ 'max_connections': 'max_connections_per_torrent',
+ 'max_download_speed': 'max_download_speed_per_torrent',
+ 'max_upload_slots': 'max_upload_slots_per_torrent',
+ 'max_upload_speed': 'max_upload_speed_per_torrent',
+ 'move_completed': 'move_completed',
+ 'move_completed_path': 'move_completed_path',
+ 'pre_allocate_storage': 'pre_allocate_storage',
+ 'prioritize_first_last_pieces': 'prioritize_first_last_pieces',
+ 'remove_at_ratio': 'remove_seed_at_ratio',
+ 'sequential_download': 'sequential_download',
+ 'shared': 'shared',
+ 'stop_at_ratio': 'stop_seed_at_ratio',
+ 'stop_ratio': 'stop_seed_ratio',
+ 'super_seeding': 'super_seeding',
+ }
+ for opt_k, conf_k in options_conf_map.items():
+ self[opt_k] = config[conf_k]
+ self['file_priorities'] = []
+ self['mapped_files'] = {}
+ self['name'] = ''
+ self['owner'] = ''
+ self['seed_mode'] = False
+
+
+class TorrentError(object):
+ def __init__(self, error_message, was_paused=False, restart_to_resume=False):
+ self.error_message = error_message
+ self.was_paused = was_paused
+ self.restart_to_resume = restart_to_resume
+
+
+class Torrent(object):
+ """Torrent holds information about torrents added to the libtorrent session.
+
+ Args:
+ handle: The libtorrent torrent handle.
+ options (dict): The torrent options.
+ state (TorrentState): The torrent state.
+ filename (str): The filename of the torrent file.
+ magnet (str): The magnet uri.
+
+ Attributes:
+ torrent_id (str): The torrent_id for this torrent
+ handle: Holds the libtorrent torrent handle
+ magnet (str): The magnet uri used to add this torrent (if available).
+ status: Holds status info so that we don"t need to keep getting it from libtorrent.
+ torrent_info: store the torrent info.
+ has_metadata (bool): True if the metadata for the torrent is available, False otherwise.
+ status_funcs (dict): The function mappings to get torrent status
+ prev_status (dict): Previous status dicts returned for this torrent. We use this to return
+ dicts that only contain changes from the previous.
+ {session_id: status_dict, ...}
+ waiting_on_folder_rename (list of dict): A list of Deferreds for file indexes we're waiting for file_rename
+ alerts on. This is so we can send one folder_renamed signal instead of multiple file_renamed signals.
+ [{index: Deferred, ...}, ...]
+ options (dict): The torrent options.
+ filename (str): The filename of the torrent file in case it is required.
+ is_finished (bool): Keep track if torrent is finished to prevent some weird things on state load.
+ statusmsg (str): Status message holds error/extra info about the torrent.
+ state (str): The torrent's state
+ trackers (list of dict): The torrent's trackers
+ tracker_status (str): Status message of currently connected tracker
+ tracker_host (str): Hostname of the currently connected tracker
+ forcing_recheck (bool): Keep track if we're forcing a recheck of the torrent
+ forcing_recheck_paused (bool): Keep track if we're forcing a recheck of the torrent so that
+ we can re-pause it after its done if necessary
+ forced_error (TorrentError): Keep track if we have forced this torrent to be in Error state.
+ """
+
+ def __init__(self, handle, options, state=None, filename=None, magnet=None):
+ self.torrent_id = str(handle.info_hash())
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('Creating torrent object %s', self.torrent_id)
+
+ # Get the core config
+ self.config = ConfigManager('core.conf')
+ self.rpcserver = component.get('RPCServer')
+
+ self.handle = handle
+
+ self.magnet = magnet
+ self.status = self.handle.status()
+
+ self.torrent_info = self.handle.get_torrent_info()
+ self.has_metadata = self.status.has_metadata
+
+ self.options = TorrentOptions()
+ self.options.update(options)
+
+ # Load values from state if we have it
+ if state:
+ self.set_trackers(state.trackers)
+ self.is_finished = state.is_finished
+ self.filename = state.filename
+ else:
+ self.set_trackers()
+ self.is_finished = False
+ self.filename = filename
+
+ self.forced_error = None
+ self.statusmsg = None
+ self.state = None
+ self.moving_storage_dest_path = None
+ self.tracker_status = ''
+ self.tracker_host = None
+ self.forcing_recheck = False
+ self.forcing_recheck_paused = False
+ self.status_funcs = None
+ self.prev_status = {}
+ self.waiting_on_folder_rename = []
+
+ self.update_status(self.handle.status())
+ self._create_status_funcs()
+ self.set_options(self.options)
+ self.update_state()
+
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('Torrent object created.')
+
+ def on_metadata_received(self):
+ """Process the metadata received alert for this torrent"""
+ self.has_metadata = True
+ self.torrent_info = self.handle.get_torrent_info()
+ if self.options['prioritize_first_last_pieces']:
+ self.set_prioritize_first_last_pieces(True)
+ self.write_torrentfile()
+
+ # --- Options methods ---
+ def set_options(self, options):
+ """Set the torrent options.
+
+ Args:
+ options (dict): Torrent options, see TorrentOptions class for valid keys.
+ """
+
+ # Skip set_prioritize_first_last if set_file_priorities is in options as it also calls the method.
+ if 'file_priorities' in options and 'prioritize_first_last_pieces' in options:
+ self.options['prioritize_first_last_pieces'] = options.pop(
+ 'prioritize_first_last_pieces'
+ )
+
+ for key, value in options.items():
+ if key in self.options:
+ options_set_func = getattr(self, 'set_' + key, None)
+ if options_set_func:
+ options_set_func(value)
+ else:
+ # Update config options that do not have funcs
+ self.options[key] = value
+
+ def get_options(self):
+ """Get the torrent options.
+
+ Returns:
+ dict: the torrent options.
+ """
+ return self.options
+
+ def set_max_connections(self, max_connections):
+ """Sets maximum number of connections this torrent will open.
+
+ Args:
+ max_connections (int): Maximum number of connections
+
+ Note:
+ The minimum value for handle.max_connections is 2 (or -1 for unlimited connections).
+ This is enforced by libtorrent and values 0 or 1 raise an assert with lt debug builds.
+ """
+
+ if max_connections == 0:
+ max_connections = -1
+ elif max_connections == 1:
+ max_connections = 2
+
+ self.options['max_connections'] = max_connections
+ self.handle.set_max_connections(max_connections)
+
+ def set_max_upload_slots(self, max_slots):
+ """Sets maximum number of upload slots for this torrent.
+
+ Args:
+ max_slots (int): Maximum upload slots
+ """
+ self.options['max_upload_slots'] = max_slots
+ self.handle.set_max_uploads(max_slots)
+
+ def set_max_upload_speed(self, m_up_speed):
+ """Sets maximum upload speed for this torrent.
+
+ Args:
+ m_up_speed (float): Maximum upload speed in KiB/s.
+ """
+ self.options['max_upload_speed'] = m_up_speed
+ if m_up_speed < 0:
+ value = -1
+ else:
+ value = int(m_up_speed * 1024)
+ self.handle.set_upload_limit(value)
+
+ def set_max_download_speed(self, m_down_speed):
+ """Sets maximum download speed for this torrent.
+
+ Args:
+ m_up_speed (float): Maximum download speed in KiB/s.
+ """
+ self.options['max_download_speed'] = m_down_speed
+ if m_down_speed < 0:
+ value = -1
+ else:
+ value = int(m_down_speed * 1024)
+ self.handle.set_download_limit(value)
+
+ @deprecated
+ def set_prioritize_first_last(self, prioritize):
+ """Deprecated: Use set_prioritize_first_last_pieces."""
+ self.set_prioritize_first_last_pieces(prioritize)
+
+ def set_prioritize_first_last_pieces(self, prioritize):
+ """Prioritize the first and last pieces in the torrent.
+
+ Args:
+ prioritize (bool): Prioritize the first and last pieces.
+
+ """
+ if not self.has_metadata:
+ return
+
+ self.options['prioritize_first_last_pieces'] = prioritize
+ if not prioritize:
+ # If we are turning off this option, call set_file_priorities to
+ # reset all the piece priorities
+ self.set_file_priorities(self.options['file_priorities'])
+ return
+
+ # A list of priorities for each piece in the torrent
+ priorities = self.handle.piece_priorities()
+
+ def get_file_piece(idx, byte_offset):
+ return self.torrent_info.map_file(idx, byte_offset, 0).piece
+
+ for idx in range(self.torrent_info.num_files()):
+ file_size = self.torrent_info.files().file_size(idx)
+ two_percent_bytes = int(0.02 * file_size)
+ # Get the pieces for the byte offsets
+ first_start = get_file_piece(idx, 0)
+ first_end = get_file_piece(idx, two_percent_bytes) + 1
+ last_start = get_file_piece(idx, file_size - two_percent_bytes)
+ last_end = get_file_piece(idx, max(file_size - 1, 0)) + 1
+
+ # Set the pieces in first and last ranges to priority 7
+ # if they are not marked as do not download
+ priorities[first_start:first_end] = [
+ p and 7 for p in priorities[first_start:first_end]
+ ]
+ priorities[last_start:last_end] = [
+ p and 7 for p in priorities[last_start:last_end]
+ ]
+
+ # Setting the priorites for all the pieces of this torrent
+ self.handle.prioritize_pieces(priorities)
+
+ def set_sequential_download(self, set_sequencial):
+ """Sets whether to download the pieces of the torrent in order.
+
+ Args:
+ set_sequencial (bool): Enable sequencial downloading.
+ """
+ self.options['sequential_download'] = set_sequencial
+ self.handle.set_sequential_download(set_sequencial)
+
+ def set_auto_managed(self, auto_managed):
+ """Set auto managed mode, i.e. will be started or queued automatically.
+
+ Args:
+ auto_managed (bool): Enable auto managed.
+ """
+ self.options['auto_managed'] = auto_managed
+ if not (self.status.paused and not self.status.auto_managed):
+ self.handle.auto_managed(auto_managed)
+ self.update_state()
+
+ def set_super_seeding(self, super_seeding):
+ """Set super seeding/initial seeding.
+
+ Args:
+ super_seeding (bool): Enable super seeding.
+ """
+ self.options['super_seeding'] = super_seeding
+ self.handle.super_seeding(super_seeding)
+
+ def set_stop_ratio(self, stop_ratio):
+ """The seeding ratio to stop (or remove) the torrent at.
+
+ Args:
+ stop_ratio (float): The seeding ratio.
+ """
+ self.options['stop_ratio'] = stop_ratio
+
+ def set_stop_at_ratio(self, stop_at_ratio):
+ """Stop the torrent when it has reached stop_ratio.
+
+ Args:
+ stop_at_ratio (bool): Stop the torrent.
+ """
+ self.options['stop_at_ratio'] = stop_at_ratio
+
+ def set_remove_at_ratio(self, remove_at_ratio):
+ """Remove the torrent when it has reached the stop_ratio.
+
+ Args:
+ remove_at_ratio (bool): Remove the torrent.
+ """
+ self.options['remove_at_ratio'] = remove_at_ratio
+
+ def set_move_completed(self, move_completed):
+ """Set whether to move the torrent when downloading has finished.
+
+ Args:
+ move_completed (bool): Move the torrent.
+
+ """
+ self.options['move_completed'] = move_completed
+
+ def set_move_completed_path(self, move_completed_path):
+ """Set the path to move torrent to when downloading has finished.
+
+ Args:
+ move_completed_path (str): The move path.
+ """
+ self.options['move_completed_path'] = move_completed_path
+
+ def set_file_priorities(self, file_priorities):
+ """Sets the file priotities.
+
+ Args:
+ file_priorities (list of int): List of file priorities.
+ """
+ if not self.has_metadata:
+ return
+
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug(
+ 'Setting %s file priorities to: %s', self.torrent_id, file_priorities
+ )
+
+ if file_priorities and len(file_priorities) == len(self.get_files()):
+ self.handle.prioritize_files(file_priorities)
+ else:
+ log.debug('Unable to set new file priorities.')
+ file_priorities = self.handle.file_priorities()
+
+ if 0 in self.options['file_priorities']:
+ # Previously marked a file 'skip' so check for any 0's now >0.
+ for index, priority in enumerate(self.options['file_priorities']):
+ if priority == 0 and file_priorities[index] > 0:
+ # Changed priority from skip to download so update state.
+ self.is_finished = False
+ self.update_state()
+ break
+
+ # Store the priorities.
+ self.options['file_priorities'] = file_priorities
+
+ # Set the first/last priorities if needed.
+ if self.options['prioritize_first_last_pieces']:
+ self.set_prioritize_first_last_pieces(True)
+
+ @deprecated
+ def set_save_path(self, download_location):
+ """Deprecated: Use set_download_location."""
+ self.set_download_location(download_location)
+
+ def set_download_location(self, download_location):
+ """The location for downloading torrent data."""
+ self.options['download_location'] = download_location
+
+ def set_owner(self, account):
+ """Sets the owner of this torrent.
+
+ Args:
+ account (str): The new owner account name.
+
+ Notes:
+ Only a user with admin level auth can change this value.
+
+ """
+
+ if self.rpcserver.get_session_auth_level() == AUTH_LEVEL_ADMIN:
+ self.options['owner'] = account
+
+ # End Options methods #
+
+ def set_trackers(self, trackers=None):
+ """Sets the trackers for this torrent.
+
+ Args:
+ trackers (list of dicts): A list of trackers.
+ """
+ if trackers is None:
+ self.trackers = [tracker for tracker in self.handle.trackers()]
+ self.tracker_host = None
+ return
+
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('Setting trackers for %s: %s', self.torrent_id, trackers)
+
+ tracker_list = []
+
+ for tracker in trackers:
+ new_entry = lt.announce_entry(str(tracker['url']))
+ new_entry.tier = tracker['tier']
+ tracker_list.append(new_entry)
+ self.handle.replace_trackers(tracker_list)
+
+ # Print out the trackers
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('Trackers set for %s:', self.torrent_id)
+ for tracker in self.handle.trackers():
+ log.debug(' [tier %s]: %s', tracker['tier'], tracker['url'])
+ # Set the tracker list in the torrent object
+ self.trackers = trackers
+ if len(trackers) > 0:
+ # Force a re-announce if there is at least 1 tracker
+ self.force_reannounce()
+ self.tracker_host = None
+
+ def set_tracker_status(self, status):
+ """Sets the tracker status.
+
+ Args:
+ status (str): The tracker status.
+
+ Emits:
+ TorrentTrackerStatusEvent upon tracker status change.
+
+ """
+
+ self.tracker_host = None
+
+ if self.tracker_status != status:
+ self.tracker_status = status
+ component.get('EventManager').emit(
+ TorrentTrackerStatusEvent(self.torrent_id, self.tracker_status)
+ )
+
+ def merge_trackers(self, torrent_info):
+ """Merges new trackers in torrent_info into torrent"""
+ log.info(
+ 'Adding any new trackers to torrent (%s) already in session...',
+ self.torrent_id,
+ )
+ if not torrent_info:
+ return
+ # Don't merge trackers if either torrent has private flag set.
+ if torrent_info.priv() or self.get_status(['private'])['private']:
+ log.info('Adding trackers aborted: Torrent has private flag set.')
+ else:
+ for tracker in torrent_info.trackers():
+ self.handle.add_tracker({'url': tracker.url, 'tier': tracker.tier})
+ # Update torrent.trackers from libtorrent handle.
+ self.set_trackers()
+
+ def update_state(self):
+ """Updates the state, based on libtorrent's torrent state"""
+ status = self.handle.status()
+ session_paused = component.get('Core').session.is_paused()
+ old_state = self.state
+ self.set_status_message()
+ status_error = status.errc.message() if status.errc.value() else ''
+
+ if self.forced_error:
+ self.state = 'Error'
+ self.set_status_message(self.forced_error.error_message)
+ elif status_error:
+ self.state = 'Error'
+ # auto-manage status will be reverted upon resuming.
+ self.handle.auto_managed(False)
+ self.set_status_message(decode_bytes(status_error))
+ elif status.moving_storage:
+ self.state = 'Moving'
+ elif not session_paused and status.paused and status.auto_managed:
+ self.state = 'Queued'
+ elif session_paused or status.paused:
+ self.state = 'Paused'
+ else:
+ self.state = LT_TORRENT_STATE_MAP.get(str(status.state), str(status.state))
+
+ if self.state != old_state:
+ component.get('EventManager').emit(
+ TorrentStateChangedEvent(self.torrent_id, self.state)
+ )
+
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug(
+ 'State from lt was: %s | Session is paused: %s\nTorrent state set from "%s" to "%s" (%s)',
+ 'error' if status_error else status.state,
+ session_paused,
+ old_state,
+ self.state,
+ self.torrent_id,
+ )
+ if self.forced_error:
+ log.debug(
+ 'Torrent Error state message: %s', self.forced_error.error_message
+ )
+
+ def set_status_message(self, message=None):
+ """Sets the torrent status message.
+
+ Calling method without a message will reset the message to 'OK'.
+
+ Args:
+ message (str, optional): The status message.
+
+ """
+ if not message:
+ message = 'OK'
+ self.statusmsg = message
+
+ def force_error_state(self, message, restart_to_resume=True):
+ """Forces the torrent into an error state.
+
+ For setting an error state not covered by libtorrent.
+
+ Args:
+ message (str): The error status message.
+ restart_to_resume (bool, optional): Prevent resuming clearing the error, only restarting
+ session can resume.
+ """
+ status = self.handle.status()
+ self.handle.auto_managed(False)
+ self.forced_error = TorrentError(message, status.paused, restart_to_resume)
+ if not status.paused:
+ self.handle.pause()
+ self.update_state()
+
+ def clear_forced_error_state(self, update_state=True):
+ if not self.forced_error:
+ return
+
+ if self.forced_error.restart_to_resume:
+ log.error('Restart deluge to clear this torrent error')
+
+ if not self.forced_error.was_paused and self.options['auto_managed']:
+ self.handle.auto_managed(True)
+ self.forced_error = None
+ self.set_status_message('OK')
+ if update_state:
+ self.update_state()
+
+ def get_eta(self):
+ """Get the ETA for this torrent.
+
+ Returns:
+ int: The ETA in seconds.
+
+ """
+ status = self.status
+ eta = 0
+ if (
+ self.is_finished
+ and self.options['stop_at_ratio']
+ and status.upload_payload_rate
+ ):
+ # We're a seed, so calculate the time to the 'stop_share_ratio'
+ eta = (
+ int(status.all_time_download * self.options['stop_ratio'])
+ - status.all_time_upload
+ ) // status.upload_payload_rate
+ elif status.download_payload_rate:
+ left = status.total_wanted - status.total_wanted_done
+ if left > 0:
+ eta = left // status.download_payload_rate
+
+ # Limit to 1 year, avoid excessive values and prevent GTK int overflow.
+ return eta if eta < 31557600 else -1
+
+ def get_ratio(self):
+ """Get the ratio of upload/download for this torrent.
+
+ Returns:
+ float: The ratio or -1.0 (for infinity).
+
+ """
+ if self.status.total_done > 0:
+ return self.status.all_time_upload / self.status.total_done
+ else:
+ return -1.0
+
+ def get_files(self):
+ """Get the files this torrent contains.
+
+ Returns:
+ list of dict: The files.
+
+ """
+ if not self.has_metadata:
+ return []
+
+ files = self.torrent_info.files()
+ return convert_lt_files(files)
+
+ def get_orig_files(self):
+ """Get the original filenames of files in this torrent.
+
+ Returns:
+ list of dict: The files with original filenames.
+
+ """
+ if not self.has_metadata:
+ return []
+
+ files = self.torrent_info.orig_files()
+ return convert_lt_files(files)
+
+ def get_peers(self):
+ """Get the peers for this torrent.
+
+ A list of peers and various information about them.
+
+ Returns:
+ list of dict: The peers.
+
+ The format for the peer dict::
+
+ {
+ "client": str,
+ "country": str,
+ "down_speed": int,
+ "ip": str,
+ "progress": float,
+ "seed": bool,
+ "up_speed": int
+ }
+ """
+ ret = []
+ peers = self.handle.get_peer_info()
+
+ for peer in peers:
+ # We do not want to report peers that are half-connected
+ if peer.flags & peer.connecting or peer.flags & peer.handshake:
+ continue
+
+ client = decode_bytes(peer.client)
+
+ try:
+ country = component.get('Core').geoip_instance.country_code_by_addr(
+ peer.ip[0]
+ )
+ except AttributeError:
+ country = ''
+ else:
+ try:
+ country = ''.join(
+ [char if char.isalpha() else ' ' for char in country]
+ )
+ except TypeError:
+ country = ''
+
+ ret.append(
+ {
+ 'client': client,
+ 'country': country,
+ 'down_speed': peer.payload_down_speed,
+ 'ip': '%s:%s' % (peer.ip[0], peer.ip[1]),
+ 'progress': peer.progress,
+ 'seed': peer.flags & peer.seed,
+ 'up_speed': peer.payload_up_speed,
+ }
+ )
+
+ return ret
+
+ def get_queue_position(self):
+ """Get the torrents queue position
+
+ Returns:
+ int: queue position
+ """
+ return self.handle.queue_position()
+
+ def get_file_priorities(self):
+ """Return the file priorities"""
+ if not self.handle.has_metadata():
+ return []
+
+ if not self.options['file_priorities']:
+ # Ensure file_priorities option is populated.
+ self.set_file_priorities([])
+
+ return self.options['file_priorities']
+
+ def get_file_progress(self):
+ """Calculates the file progress as a percentage.
+
+ Returns:
+ list of floats: The file progress (0.0 -> 1.0), empty list if n/a.
+ """
+ if not self.has_metadata:
+ return []
+ return [
+ progress / _file.size if _file.size else 0.0
+ for progress, _file in zip(
+ self.handle.file_progress(), self.torrent_info.files()
+ )
+ ]
+
+ def get_tracker_host(self):
+ """Get the hostname of the currently connected tracker.
+
+ If no tracker is connected, it uses the 1st tracker.
+
+ Returns:
+ str: The tracker host
+ """
+ if self.tracker_host:
+ return self.tracker_host
+
+ tracker = self.status.current_tracker
+ if not tracker and self.trackers:
+ tracker = self.trackers[0]['url']
+
+ if tracker:
+ url = urlparse(tracker.replace('udp://', 'http://'))
+ if hasattr(url, 'hostname'):
+ host = url.hostname or 'DHT'
+ # Check if hostname is an IP address and just return it if that's the case
+ try:
+ socket.inet_aton(host)
+ except socket.error:
+ pass
+ else:
+ # This is an IP address because an exception wasn't raised
+ return url.hostname
+
+ parts = host.split('.')
+ if len(parts) > 2:
+ if parts[-2] in ('co', 'com', 'net', 'org') or parts[-1] == 'uk':
+ host = '.'.join(parts[-3:])
+ else:
+ host = '.'.join(parts[-2:])
+ self.tracker_host = host
+ return host
+ return ''
+
+ def get_magnet_uri(self):
+ """Returns a magnet uri for this torrent"""
+ return lt.make_magnet_uri(self.handle)
+
+ def get_name(self):
+ """The name of the torrent (distinct from the filenames).
+
+ Note:
+ Can be manually set in options through `name` key. If the key is
+ reset to empty string "" it will return the original torrent name.
+
+ Returns:
+ str: the name of the torrent.
+
+ """
+ if self.options['name']:
+ return self.options['name']
+
+ if self.has_metadata:
+ # Use the top-level folder as torrent name.
+ filename = decode_bytes(self.torrent_info.file_at(0).path)
+ name = filename.replace('\\', '/', 1).split('/', 1)[0]
+ else:
+ name = decode_bytes(self.handle.name())
+
+ if not name:
+ name = self.torrent_id
+
+ return name
+
+ def get_progress(self):
+ """The progress of this torrent's current task.
+
+ Returns:
+ float: The progress percentage (0 to 100).
+
+ """
+
+ def get_size(files, path):
+ """Returns total size of 'files' currently located in 'path'"""
+ files = [os.path.join(path, f) for f in files]
+ return sum(os.stat(f).st_size for f in files if os.path.exists(f))
+
+ if self.state == 'Error':
+ progress = 100.0
+ elif self.state == 'Moving':
+ # Check if torrent has downloaded any data yet.
+ if self.status.total_done:
+ torrent_files = [f['path'] for f in self.get_files()]
+ dest_path_size = get_size(torrent_files, self.moving_storage_dest_path)
+ progress = dest_path_size / self.status.total_done * 100
+ else:
+ progress = 100.0
+ else:
+ progress = self.status.progress * 100
+
+ return progress
+
+ def get_time_since_transfer(self):
+ """The time since either upload/download from peers"""
+ time_since = (self.status.time_since_download, self.status.time_since_upload)
+ try:
+ return min(x for x in time_since if x != -1)
+ except ValueError:
+ return -1
+
+ def get_status(self, keys, diff=False, update=False, all_keys=False):
+ """Returns the status of the torrent based on the keys provided
+
+ Args:
+ keys (list of str): the keys to get the status on
+ diff (bool): Will return a diff of the changes since the last
+ call to get_status based on the session_id
+ update (bool): If True the status will be updated from libtorrent
+ if False, the cached values will be returned
+
+ Returns:
+ dict: a dictionary of the status keys and their values
+ """
+ if update:
+ self.update_status(self.handle.status())
+
+ if all_keys:
+ keys = list(self.status_funcs)
+
+ status_dict = {}
+
+ for key in keys:
+ status_dict[key] = self.status_funcs[key]()
+
+ if diff:
+ session_id = self.rpcserver.get_session_id()
+ if session_id in self.prev_status:
+ # We have a previous status dict, so lets make a diff
+ status_diff = {}
+ for key, value in status_dict.items():
+ if key in self.prev_status[session_id]:
+ if value != self.prev_status[session_id][key]:
+ status_diff[key] = value
+ else:
+ status_diff[key] = value
+
+ self.prev_status[session_id] = status_dict
+ return status_diff
+
+ self.prev_status[session_id] = status_dict
+ return status_dict
+
+ return status_dict
+
+ def update_status(self, status):
+ """Updates the cached status.
+
+ Args:
+ status (libtorrent.torrent_status): a libtorrent torrent status
+ """
+ self.status = status
+
+ def _create_status_funcs(self):
+ """Creates the functions for getting torrent status"""
+ self.status_funcs = {
+ 'active_time': lambda: self.status.active_time,
+ 'seeding_time': lambda: self.status.seeding_time,
+ 'finished_time': lambda: self.status.finished_time,
+ 'all_time_download': lambda: self.status.all_time_download,
+ 'storage_mode': lambda: self.status.storage_mode.name.split('_')[
+ 2
+ ], # sparse or allocate
+ 'distributed_copies': lambda: max(0.0, self.status.distributed_copies),
+ 'download_payload_rate': lambda: self.status.download_payload_rate,
+ 'file_priorities': self.get_file_priorities,
+ 'hash': lambda: self.torrent_id,
+ 'auto_managed': lambda: self.options['auto_managed'],
+ 'is_auto_managed': lambda: self.options['auto_managed'],
+ 'is_finished': lambda: self.is_finished,
+ 'max_connections': lambda: self.options['max_connections'],
+ 'max_download_speed': lambda: self.options['max_download_speed'],
+ 'max_upload_slots': lambda: self.options['max_upload_slots'],
+ 'max_upload_speed': lambda: self.options['max_upload_speed'],
+ 'message': lambda: self.statusmsg,
+ 'move_on_completed_path': lambda: self.options[
+ 'move_completed_path'
+ ], # Deprecated: move_completed_path
+ 'move_on_completed': lambda: self.options[
+ 'move_completed'
+ ], # Deprecated: Use move_completed
+ 'move_completed_path': lambda: self.options['move_completed_path'],
+ 'move_completed': lambda: self.options['move_completed'],
+ 'next_announce': lambda: self.status.next_announce.seconds,
+ 'num_peers': lambda: self.status.num_peers - self.status.num_seeds,
+ 'num_seeds': lambda: self.status.num_seeds,
+ 'owner': lambda: self.options['owner'],
+ 'paused': lambda: self.status.paused,
+ 'prioritize_first_last': lambda: self.options[
+ 'prioritize_first_last_pieces'
+ ],
+ # Deprecated: Use prioritize_first_last_pieces
+ 'prioritize_first_last_pieces': lambda: self.options[
+ 'prioritize_first_last_pieces'
+ ],
+ 'sequential_download': lambda: self.options['sequential_download'],
+ 'progress': self.get_progress,
+ 'shared': lambda: self.options['shared'],
+ 'remove_at_ratio': lambda: self.options['remove_at_ratio'],
+ 'save_path': lambda: self.options[
+ 'download_location'
+ ], # Deprecated: Use download_location
+ 'download_location': lambda: self.options['download_location'],
+ 'seeds_peers_ratio': lambda: -1.0
+ if self.status.num_incomplete == 0
+ else ( # Use -1.0 to signify infinity
+ self.status.num_complete / self.status.num_incomplete
+ ),
+ 'seed_rank': lambda: self.status.seed_rank,
+ 'state': lambda: self.state,
+ 'stop_at_ratio': lambda: self.options['stop_at_ratio'],
+ 'stop_ratio': lambda: self.options['stop_ratio'],
+ 'time_added': lambda: self.status.added_time,
+ 'total_done': lambda: self.status.total_done,
+ 'total_payload_download': lambda: self.status.total_payload_download,
+ 'total_payload_upload': lambda: self.status.total_payload_upload,
+ 'total_peers': lambda: self.status.num_incomplete,
+ 'total_seeds': lambda: self.status.num_complete,
+ 'total_uploaded': lambda: self.status.all_time_upload,
+ 'total_wanted': lambda: self.status.total_wanted,
+ 'total_remaining': lambda: self.status.total_wanted
+ - self.status.total_wanted_done,
+ 'tracker': lambda: self.status.current_tracker,
+ 'tracker_host': self.get_tracker_host,
+ 'trackers': lambda: self.trackers,
+ 'tracker_status': lambda: self.tracker_status,
+ 'upload_payload_rate': lambda: self.status.upload_payload_rate,
+ 'comment': lambda: decode_bytes(self.torrent_info.comment())
+ if self.has_metadata
+ else '',
+ 'creator': lambda: decode_bytes(self.torrent_info.creator())
+ if self.has_metadata
+ else '',
+ 'num_files': lambda: self.torrent_info.num_files()
+ if self.has_metadata
+ else 0,
+ 'num_pieces': lambda: self.torrent_info.num_pieces()
+ if self.has_metadata
+ else 0,
+ 'piece_length': lambda: self.torrent_info.piece_length()
+ if self.has_metadata
+ else 0,
+ 'private': lambda: self.torrent_info.priv() if self.has_metadata else False,
+ 'total_size': lambda: self.torrent_info.total_size()
+ if self.has_metadata
+ else 0,
+ 'eta': self.get_eta,
+ 'file_progress': self.get_file_progress,
+ 'files': self.get_files,
+ 'orig_files': self.get_orig_files,
+ 'is_seed': lambda: self.status.is_seeding,
+ 'peers': self.get_peers,
+ 'queue': lambda: self.status.queue_position,
+ 'ratio': self.get_ratio,
+ 'completed_time': lambda: self.status.completed_time,
+ 'last_seen_complete': lambda: self.status.last_seen_complete,
+ 'name': self.get_name,
+ 'pieces': self._get_pieces_info,
+ 'seed_mode': lambda: self.status.seed_mode,
+ 'super_seeding': lambda: self.status.super_seeding,
+ 'time_since_download': lambda: self.status.time_since_download,
+ 'time_since_upload': lambda: self.status.time_since_upload,
+ 'time_since_transfer': self.get_time_since_transfer,
+ }
+
+ def pause(self):
+ """Pause this torrent.
+
+ Returns:
+ bool: True is successful, otherwise False.
+
+ """
+ # Turn off auto-management so the torrent will not be unpaused by lt queueing
+ self.handle.auto_managed(False)
+ if self.state == 'Error':
+ log.debug('Unable to pause torrent while in Error state')
+ elif self.status.paused:
+ # This torrent was probably paused due to being auto managed by lt
+ # Since we turned auto_managed off, we should update the state which should
+ # show it as 'Paused'. We need to emit a torrent_paused signal because
+ # the torrent_paused alert from libtorrent will not be generated.
+ self.update_state()
+ component.get('EventManager').emit(
+ TorrentStateChangedEvent(self.torrent_id, 'Paused')
+ )
+ else:
+ try:
+ self.handle.pause()
+ except RuntimeError as ex:
+ log.debug('Unable to pause torrent: %s', ex)
+
+ def resume(self):
+ """Resumes this torrent."""
+ if self.status.paused and self.status.auto_managed:
+ log.debug('Resume not possible for auto-managed torrent!')
+ elif self.forced_error and self.forced_error.was_paused:
+ log.debug(
+ 'Resume skipped for forced_error torrent as it was originally paused.'
+ )
+ elif (
+ self.status.is_finished
+ and self.options['stop_at_ratio']
+ and self.get_ratio() >= self.options['stop_ratio']
+ ):
+ log.debug('Resume skipped for torrent as it has reached "stop_seed_ratio".')
+ else:
+ # Check if torrent was originally being auto-managed.
+ if self.options['auto_managed']:
+ self.handle.auto_managed(True)
+ try:
+ self.handle.resume()
+ except RuntimeError as ex:
+ log.debug('Unable to resume torrent: %s', ex)
+
+ # Clear torrent error state.
+ if self.forced_error and not self.forced_error.restart_to_resume:
+ self.clear_forced_error_state()
+ elif self.state == 'Error' and not self.forced_error:
+ self.handle.clear_error()
+
+ def connect_peer(self, peer_ip, peer_port):
+ """Manually add a peer to the torrent
+
+ Args:
+ peer_ip (str) : Peer IP Address
+ peer_port (int): Peer Port
+
+ Returns:
+ bool: True is successful, otherwise False
+ """
+ try:
+ self.handle.connect_peer((peer_ip, peer_port), 0)
+ except RuntimeError as ex:
+ log.debug('Unable to connect to peer: %s', ex)
+ return False
+ return True
+
+ def move_storage(self, dest):
+ """Move a torrent's storage location
+
+ Args:
+ dest (str): The destination folder for the torrent data
+
+ Returns:
+ bool: True if successful, otherwise False
+
+ """
+ dest = decode_bytes(dest)
+
+ if not os.path.exists(dest):
+ try:
+ os.makedirs(dest)
+ except OSError as ex:
+ log.error(
+ 'Could not move storage for torrent %s since %s does '
+ 'not exist and could not create the directory: %s',
+ self.torrent_id,
+ dest,
+ ex,
+ )
+ return False
+
+ try:
+ # lt needs utf8 byte-string. Otherwise if wstrings enabled, unicode string.
+ # Keyword argument flags=2 (dont_replace) dont overwrite target files but delete source.
+ try:
+ self.handle.move_storage(dest.encode('utf8'), flags=2)
+ except TypeError:
+ self.handle.move_storage(dest, flags=2)
+ except RuntimeError as ex:
+ log.error('Error calling libtorrent move_storage: %s', ex)
+ return False
+ self.moving_storage_dest_path = dest
+ self.update_state()
+ return True
+
+ def save_resume_data(self, flush_disk_cache=False):
+ """Signals libtorrent to build resume data for this torrent.
+
+ Args:
+ flush_disk_cache (bool): Avoids potential issue with file timestamps
+ and is only needed when stopping the session.
+
+ Returns:
+ None: The response with resume data is returned in a libtorrent save_resume_data_alert.
+
+ """
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('Requesting save_resume_data for torrent: %s', self.torrent_id)
+ flags = lt.save_resume_flags_t.flush_disk_cache if flush_disk_cache else 0
+ # Don't generate fastresume data if torrent is in a Deluge Error state.
+ if self.forced_error:
+ component.get('TorrentManager').waiting_on_resume_data[
+ self.torrent_id
+ ].errback(UserWarning('Skipped creating resume_data while in Error state'))
+ else:
+ self.handle.save_resume_data(flags)
+
+ def write_torrentfile(self, filedump=None):
+ """Writes the torrent file to the state dir and optional 'copy of' dir.
+
+ Args:
+ filedump (str, optional): bencoded filedump of a torrent file.
+
+ """
+
+ def write_file(filepath, filedump):
+ """Write out the torrent file"""
+ log.debug('Writing torrent file to: %s', filepath)
+ try:
+ with open(filepath, 'wb') as save_file:
+ save_file.write(filedump)
+ except IOError as ex:
+ log.error('Unable to save torrent file to: %s', ex)
+
+ filepath = os.path.join(get_config_dir(), 'state', self.torrent_id + '.torrent')
+
+ if filedump is None:
+ lt_ct = lt.create_torrent(self.torrent_info)
+ filedump = lt.bencode(lt_ct.generate())
+
+ write_file(filepath, filedump)
+
+ # If the user has requested a copy of the torrent be saved elsewhere we need to do that.
+ if self.config['copy_torrent_file']:
+ if not self.filename:
+ self.filename = self.get_name() + '.torrent'
+ filepath = os.path.join(self.config['torrentfiles_location'], self.filename)
+ write_file(filepath, filedump)
+
+ def delete_torrentfile(self, delete_copies=False):
+ """Deletes the .torrent file in the state directory in config"""
+ torrent_files = [
+ os.path.join(get_config_dir(), 'state', self.torrent_id + '.torrent')
+ ]
+ if delete_copies:
+ torrent_files.append(
+ os.path.join(self.config['torrentfiles_location'], self.filename)
+ )
+
+ for torrent_file in torrent_files:
+ log.debug('Deleting torrent file: %s', torrent_file)
+ try:
+ os.remove(torrent_file)
+ except OSError as ex:
+ log.warning('Unable to delete the torrent file: %s', ex)
+
+ def force_reannounce(self):
+ """Force a tracker reannounce"""
+ try:
+ self.handle.force_reannounce()
+ except RuntimeError as ex:
+ log.debug('Unable to force reannounce: %s', ex)
+ return False
+ return True
+
+ def scrape_tracker(self):
+ """Scrape the tracker
+
+ A scrape request queries the tracker for statistics such as total
+ number of incomplete peers, complete peers, number of downloads etc.
+ """
+ try:
+ self.handle.scrape_tracker()
+ except RuntimeError as ex:
+ log.debug('Unable to scrape tracker: %s', ex)
+ return False
+ return True
+
+ def force_recheck(self):
+ """Forces a recheck of the torrent's pieces"""
+ if self.forced_error:
+ self.forcing_recheck_paused = self.forced_error.was_paused
+ self.clear_forced_error_state(update_state=False)
+ else:
+ self.forcing_recheck_paused = self.status.paused
+
+ try:
+ self.handle.force_recheck()
+ self.handle.resume()
+ self.forcing_recheck = True
+ except RuntimeError as ex:
+ log.debug('Unable to force recheck: %s', ex)
+ self.forcing_recheck = False
+ return self.forcing_recheck
+
+ def rename_files(self, filenames):
+ """Renames files in the torrent.
+
+ Args:
+ filenames (list): A list of (index, filename) pairs.
+ """
+ for index, filename in filenames:
+ # Make sure filename is a sanitized unicode string.
+ filename = sanitize_filepath(decode_bytes(filename))
+ # lt needs utf8 byte-string. Otherwise if wstrings enabled, unicode string.
+ try:
+ self.handle.rename_file(index, filename.encode('utf8'))
+ except (UnicodeDecodeError, TypeError):
+ self.handle.rename_file(index, filename)
+
+ def rename_folder(self, folder, new_folder):
+ """Renames a folder within a torrent.
+
+ This basically does a file rename on all of the folders children.
+
+ Args:
+ folder (str): The orignal folder name
+ new_folder (str): The new folder name
+
+ Returns:
+ twisted.internet.defer.Deferred: A deferred which fires when the rename is complete
+ """
+ log.debug('Attempting to rename folder: %s to %s', folder, new_folder)
+
+ # Empty string means remove the dir and move its content to the parent
+ if len(new_folder) > 0:
+ new_folder = sanitize_filepath(new_folder, folder=True)
+
+ def on_file_rename_complete(dummy_result, wait_dict, index):
+ """File rename complete"""
+ wait_dict.pop(index, None)
+
+ wait_on_folder = {}
+ self.waiting_on_folder_rename.append(wait_on_folder)
+ for _file in self.get_files():
+ if _file['path'].startswith(folder):
+ # Keep track of filerenames we're waiting on
+ wait_on_folder[_file['index']] = Deferred().addBoth(
+ on_file_rename_complete, wait_on_folder, _file['index']
+ )
+ new_path = _file['path'].replace(folder, new_folder, 1)
+ try:
+ self.handle.rename_file(_file['index'], new_path.encode('utf8'))
+ except (UnicodeDecodeError, TypeError):
+ self.handle.rename_file(_file['index'], new_path)
+
+ def on_folder_rename_complete(dummy_result, torrent, folder, new_folder):
+ """Folder rename complete"""
+ component.get('EventManager').emit(
+ TorrentFolderRenamedEvent(torrent.torrent_id, folder, new_folder)
+ )
+ # Empty folders are removed after libtorrent folder renames
+ self.remove_empty_folders(folder)
+ torrent.waiting_on_folder_rename = [
+ _dir for _dir in torrent.waiting_on_folder_rename if _dir
+ ]
+ component.get('TorrentManager').save_resume_data((self.torrent_id,))
+
+ d = DeferredList(list(wait_on_folder.values()))
+ d.addBoth(on_folder_rename_complete, self, folder, new_folder)
+ return d
+
+ def remove_empty_folders(self, folder):
+ """Recursively removes folders but only if they are empty.
+
+ This cleans up after libtorrent folder renames.
+
+ Args:
+ folder (str): The folder to recursively check
+ """
+ # Removes leading slashes that can cause join to ignore download_location
+ download_location = self.options['download_location']
+ folder_full_path = os.path.normpath(
+ os.path.join(download_location, folder.lstrip('\\/'))
+ )
+
+ try:
+ if not os.listdir(folder_full_path):
+ os.removedirs(folder_full_path)
+ log.debug('Removed Empty Folder %s', folder_full_path)
+ else:
+ for root, dirs, dummy_files in os.walk(folder_full_path, topdown=False):
+ for name in dirs:
+ try:
+ os.removedirs(os.path.join(root, name))
+ log.debug(
+ 'Removed Empty Folder %s', os.path.join(root, name)
+ )
+ except OSError as ex:
+ log.debug(ex)
+
+ except OSError as ex:
+ log.debug('Cannot Remove Folder: %s', ex)
+
+ def cleanup_prev_status(self):
+ """Checks the validity of the keys in the prev_status dict.
+
+ If the key is no longer valid, the dict will be deleted.
+ """
+ # Dict will be modified so iterate over generated list
+ for key in list(self.prev_status):
+ if not self.rpcserver.is_session_valid(key):
+ del self.prev_status[key]
+
+ def _get_pieces_info(self):
+ """Get the pieces for this torrent."""
+ if not self.has_metadata or self.status.is_seeding:
+ pieces = None
+ else:
+ pieces = []
+ for piece, avail_piece in zip(
+ self.status.pieces, self.handle.piece_availability()
+ ):
+ if piece:
+ pieces.append(3) # Completed.
+ elif avail_piece:
+ pieces.append(
+ 1
+ ) # Available, just not downloaded nor being downloaded.
+ else:
+ pieces.append(
+ 0
+ ) # Missing, no known peer with piece, or not asked for yet.
+
+ for peer_info in self.handle.get_peer_info():
+ if peer_info.downloading_piece_index >= 0:
+ pieces[
+ peer_info.downloading_piece_index
+ ] = 2 # Being downloaded from peer.
+
+ return pieces
diff --git a/deluge/core/torrentmanager.py b/deluge/core/torrentmanager.py
new file mode 100644
index 0000000..a7df501
--- /dev/null
+++ b/deluge/core/torrentmanager.py
@@ -0,0 +1,1699 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""TorrentManager handles Torrent objects"""
+from __future__ import unicode_literals
+
+import datetime
+import logging
+import operator
+import os
+import time
+from collections import namedtuple
+from tempfile import gettempdir
+
+import six.moves.cPickle as pickle # noqa: N813
+from twisted.internet import defer, error, reactor, threads
+from twisted.internet.defer import Deferred, DeferredList
+from twisted.internet.task import LoopingCall
+
+import deluge.component as component
+from deluge._libtorrent import lt
+from deluge.common import archive_files, decode_bytes, get_magnet_info, is_magnet
+from deluge.configmanager import ConfigManager, get_config_dir
+from deluge.core.authmanager import AUTH_LEVEL_ADMIN
+from deluge.core.torrent import Torrent, TorrentOptions, sanitize_filepath
+from deluge.error import AddTorrentError, InvalidTorrentError
+from deluge.event import (
+ ExternalIPEvent,
+ PreTorrentRemovedEvent,
+ SessionStartedEvent,
+ TorrentAddedEvent,
+ TorrentFileCompletedEvent,
+ TorrentFileRenamedEvent,
+ TorrentFinishedEvent,
+ TorrentRemovedEvent,
+ TorrentResumedEvent,
+)
+
+log = logging.getLogger(__name__)
+
+LT_DEFAULT_ADD_TORRENT_FLAGS = (
+ lt.add_torrent_params_flags_t.flag_paused
+ | lt.add_torrent_params_flags_t.flag_auto_managed
+ | lt.add_torrent_params_flags_t.flag_update_subscribe
+ | lt.add_torrent_params_flags_t.flag_apply_ip_filter
+)
+
+
+class TorrentState: # pylint: disable=old-style-class
+ """Create a torrent state.
+
+ Note:
+ This must be old style class to avoid breaking torrent.state file.
+
+ """
+
+ def __init__(
+ self,
+ torrent_id=None,
+ filename=None,
+ trackers=None,
+ storage_mode='sparse',
+ paused=False,
+ save_path=None,
+ max_connections=-1,
+ max_upload_slots=-1,
+ max_upload_speed=-1.0,
+ max_download_speed=-1.0,
+ prioritize_first_last=False,
+ sequential_download=False,
+ file_priorities=None,
+ queue=None,
+ auto_managed=True,
+ is_finished=False,
+ stop_ratio=2.00,
+ stop_at_ratio=False,
+ remove_at_ratio=False,
+ move_completed=False,
+ move_completed_path=None,
+ magnet=None,
+ owner=None,
+ shared=False,
+ super_seeding=False,
+ name=None,
+ ):
+ # Build the class atrribute list from args
+ for key, value in locals().items():
+ if key == 'self':
+ continue
+ setattr(self, key, value)
+
+ def __eq__(self, other):
+ return isinstance(other, TorrentState) and self.__dict__ == other.__dict__
+
+ def __ne__(self, other):
+ return not self == other
+
+
+class TorrentManagerState: # pylint: disable=old-style-class
+ """TorrentManagerState holds a list of TorrentState objects.
+
+ Note:
+ This must be old style class to avoid breaking torrent.state file.
+
+ """
+
+ def __init__(self):
+ self.torrents = []
+
+ def __eq__(self, other):
+ return (
+ isinstance(other, TorrentManagerState) and self.torrents == other.torrents
+ )
+
+ def __ne__(self, other):
+ return not self == other
+
+
+class TorrentManager(component.Component):
+ """TorrentManager contains a list of torrents in the current libtorrent session.
+
+ This object is also responsible for saving the state of the session for use on restart.
+
+ """
+
+ callLater = reactor.callLater # noqa: N815
+
+ def __init__(self):
+ component.Component.__init__(
+ self,
+ 'TorrentManager',
+ interval=5,
+ depend=['CorePluginManager', 'AlertManager'],
+ )
+ log.debug('TorrentManager init...')
+ # Set the libtorrent session
+ self.session = component.get('Core').session
+ # Set the alertmanager
+ self.alerts = component.get('AlertManager')
+ # Get the core config
+ self.config = ConfigManager('core.conf')
+
+ # Make sure the state folder has been created
+ self.state_dir = os.path.join(get_config_dir(), 'state')
+ if not os.path.exists(self.state_dir):
+ os.makedirs(self.state_dir)
+ self.temp_file = os.path.join(self.state_dir, '.safe_state_check')
+
+ # Create the torrents dict { torrent_id: Torrent }
+ self.torrents = {}
+ self.queued_torrents = set()
+ self.is_saving_state = False
+ self.save_resume_data_file_lock = defer.DeferredLock()
+ self.torrents_loading = {}
+ self.prefetching_metadata = {}
+
+ # This is a map of torrent_ids to Deferreds used to track needed resume data.
+ # The Deferreds will be completed when resume data has been saved.
+ self.waiting_on_resume_data = {}
+
+ # Keep track of torrents finished but moving storage
+ self.waiting_on_finish_moving = []
+
+ # Keeps track of resume data
+ self.resume_data = {}
+
+ self.torrents_status_requests = []
+ self.status_dict = {}
+ self.last_state_update_alert_ts = 0
+
+ # Keep the previous saved state
+ self.prev_saved_state = None
+
+ # Register set functions
+ set_config_keys = [
+ 'max_connections_per_torrent',
+ 'max_upload_slots_per_torrent',
+ 'max_upload_speed_per_torrent',
+ 'max_download_speed_per_torrent',
+ ]
+
+ for config_key in set_config_keys:
+ on_set_func = getattr(self, ''.join(['on_set_', config_key]))
+ self.config.register_set_function(config_key, on_set_func)
+
+ # Register alert functions
+ alert_handles = [
+ 'external_ip_alert',
+ 'performance_alert',
+ 'add_torrent_alert',
+ 'metadata_received_alert',
+ 'torrent_finished_alert',
+ 'torrent_paused_alert',
+ 'torrent_checked_alert',
+ 'torrent_resumed_alert',
+ 'tracker_reply_alert',
+ 'tracker_announce_alert',
+ 'tracker_warning_alert',
+ 'tracker_error_alert',
+ 'file_renamed_alert',
+ 'file_error_alert',
+ 'file_completed_alert',
+ 'storage_moved_alert',
+ 'storage_moved_failed_alert',
+ 'state_update_alert',
+ 'state_changed_alert',
+ 'save_resume_data_alert',
+ 'save_resume_data_failed_alert',
+ 'fastresume_rejected_alert',
+ ]
+
+ for alert_handle in alert_handles:
+ on_alert_func = getattr(
+ self, ''.join(['on_alert_', alert_handle.replace('_alert', '')])
+ )
+ self.alerts.register_handler(alert_handle, on_alert_func)
+
+ # Define timers
+ self.save_state_timer = LoopingCall(self.save_state)
+ self.save_resume_data_timer = LoopingCall(self.save_resume_data)
+ self.prev_status_cleanup_loop = LoopingCall(self.cleanup_torrents_prev_status)
+
+ def start(self):
+ # Check for old temp file to verify safe shutdown
+ if os.path.isfile(self.temp_file):
+ self.archive_state('Bad shutdown detected so archiving state files')
+ os.remove(self.temp_file)
+
+ with open(self.temp_file, 'a'):
+ os.utime(self.temp_file, None)
+
+ # Try to load the state from file
+ self.load_state()
+
+ # Save the state periodically
+ self.save_state_timer.start(200, False)
+ self.save_resume_data_timer.start(190, False)
+ self.prev_status_cleanup_loop.start(10)
+
+ @defer.inlineCallbacks
+ def stop(self):
+ # Stop timers
+ if self.save_state_timer.running:
+ self.save_state_timer.stop()
+
+ if self.save_resume_data_timer.running:
+ self.save_resume_data_timer.stop()
+
+ if self.prev_status_cleanup_loop.running:
+ self.prev_status_cleanup_loop.stop()
+
+ # Save state on shutdown
+ yield self.save_state()
+
+ self.session.pause()
+
+ result = yield self.save_resume_data(flush_disk_cache=True)
+ # Remove the temp_file to signify successfully saved state
+ if result and os.path.isfile(self.temp_file):
+ os.remove(self.temp_file)
+
+ def update(self):
+ for torrent_id, torrent in self.torrents.items():
+ # XXX: Should the state check be those that _can_ be stopped at ratio
+ if torrent.options['stop_at_ratio'] and torrent.state not in (
+ 'Checking',
+ 'Allocating',
+ 'Paused',
+ 'Queued',
+ ):
+ # If the global setting is set, but the per-torrent isn't...
+ # Just skip to the next torrent.
+ # This is so that a user can turn-off the stop at ratio option on a per-torrent basis
+ if not torrent.options['stop_at_ratio']:
+ continue
+ if (
+ torrent.get_ratio() >= torrent.options['stop_ratio']
+ and torrent.is_finished
+ ):
+ if torrent.options['remove_at_ratio']:
+ self.remove(torrent_id)
+ break
+ if not torrent.handle.status().paused:
+ torrent.pause()
+
+ def __getitem__(self, torrent_id):
+ """Return the Torrent with torrent_id.
+
+ Args:
+ torrent_id (str): The torrent_id.
+
+ Returns:
+ Torrent: A torrent object.
+
+ """
+ return self.torrents[torrent_id]
+
+ def get_torrent_list(self):
+ """Creates a list of torrent_ids, owned by current user and any marked shared.
+
+ Returns:
+ list: A list of torrent_ids.
+
+ """
+ torrent_ids = list(self.torrents)
+ if component.get('RPCServer').get_session_auth_level() == AUTH_LEVEL_ADMIN:
+ return torrent_ids
+
+ current_user = component.get('RPCServer').get_session_user()
+ for torrent_id in torrent_ids[:]:
+ torrent_status = self.torrents[torrent_id].get_status(['owner', 'shared'])
+ if torrent_status['owner'] != current_user and not torrent_status['shared']:
+ torrent_ids.pop(torrent_ids.index(torrent_id))
+ return torrent_ids
+
+ def get_torrent_info_from_file(self, filepath):
+ """Retrieves torrent_info from the file specified.
+
+ Args:
+ filepath (str): The filepath to extract torrent info from.
+
+ Returns:
+ lt.torrent_info: A libtorrent torrent_info dict or None if invalid file or data.
+
+ """
+ # Get the torrent data from the torrent file
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('Attempting to extract torrent_info from %s', filepath)
+ try:
+ torrent_info = lt.torrent_info(filepath)
+ except RuntimeError as ex:
+ log.warning('Unable to open torrent file %s: %s', filepath, ex)
+ else:
+ return torrent_info
+
+ def prefetch_metadata(self, magnet, timeout):
+ """Download the metadata for a magnet uri.
+
+ Args:
+ magnet (str): A magnet uri to download the metadata for.
+ timeout (int): Number of seconds to wait before cancelling.
+
+ Returns:
+ Deferred: A tuple of (torrent_id (str), metadata (dict))
+
+ """
+
+ torrent_id = get_magnet_info(magnet)['info_hash']
+ if torrent_id in self.prefetching_metadata:
+ return self.prefetching_metadata[torrent_id].defer
+
+ add_torrent_params = {}
+ add_torrent_params['save_path'] = gettempdir()
+ add_torrent_params['url'] = magnet.strip().encode('utf8')
+ add_torrent_params['flags'] = (
+ (
+ LT_DEFAULT_ADD_TORRENT_FLAGS
+ | lt.add_torrent_params_flags_t.flag_duplicate_is_error
+ | lt.add_torrent_params_flags_t.flag_upload_mode
+ )
+ ^ lt.add_torrent_params_flags_t.flag_auto_managed
+ ^ lt.add_torrent_params_flags_t.flag_paused
+ )
+
+ torrent_handle = self.session.add_torrent(add_torrent_params)
+
+ d = Deferred()
+ # Cancel the defer if timeout reached.
+ defer_timeout = self.callLater(timeout, d.cancel)
+ d.addBoth(self.on_prefetch_metadata, torrent_id, defer_timeout)
+ Prefetch = namedtuple('Prefetch', 'defer handle')
+ self.prefetching_metadata[torrent_id] = Prefetch(defer=d, handle=torrent_handle)
+ return d
+
+ def on_prefetch_metadata(self, torrent_info, torrent_id, defer_timeout):
+ # Cancel reactor.callLater.
+ try:
+ defer_timeout.cancel()
+ except error.AlreadyCalled:
+ pass
+
+ log.debug('remove prefetch magnet from session')
+ try:
+ torrent_handle = self.prefetching_metadata.pop(torrent_id).handle
+ except KeyError:
+ pass
+ else:
+ self.session.remove_torrent(torrent_handle, 1)
+
+ metadata = None
+ if isinstance(torrent_info, lt.torrent_info):
+ log.debug('prefetch metadata received')
+ metadata = lt.bdecode(torrent_info.metadata())
+
+ return torrent_id, metadata
+
+ def _build_torrent_options(self, options):
+ """Load default options and update if needed."""
+ _options = TorrentOptions()
+ if options:
+ _options.update(options)
+ options = _options
+
+ if not options['owner']:
+ options['owner'] = component.get('RPCServer').get_session_user()
+ if not component.get('AuthManager').has_account(options['owner']):
+ options['owner'] = 'localclient'
+
+ return options
+
+ def _build_torrent_params(
+ self, torrent_info=None, magnet=None, options=None, resume_data=None
+ ):
+ """Create the add_torrent_params dict for adding torrent to libtorrent."""
+ add_torrent_params = {}
+ if torrent_info:
+ add_torrent_params['ti'] = torrent_info
+ name = torrent_info.name()
+ if not name:
+ name = (
+ torrent_info.file_at(0).path.replace('\\', '/', 1).split('/', 1)[0]
+ )
+ add_torrent_params['name'] = name
+ torrent_id = str(torrent_info.info_hash())
+ elif magnet:
+ magnet_info = get_magnet_info(magnet)
+ if magnet_info:
+ add_torrent_params['url'] = magnet.strip().encode('utf8')
+ add_torrent_params['name'] = magnet_info['name']
+ torrent_id = magnet_info['info_hash']
+ else:
+ raise AddTorrentError(
+ 'Unable to add magnet, invalid magnet info: %s' % magnet
+ )
+
+ # Check for existing torrent in session.
+ if torrent_id in self.get_torrent_list():
+ # Attempt merge trackers before returning.
+ self.torrents[torrent_id].merge_trackers(torrent_info)
+ raise AddTorrentError('Torrent already in session (%s).' % torrent_id)
+ elif torrent_id in self.torrents_loading:
+ raise AddTorrentError('Torrent already being added (%s).' % torrent_id)
+ elif torrent_id in self.prefetching_metadata:
+ # Cancel and remove metadata fetching torrent.
+ self.prefetching_metadata[torrent_id].defer.cancel()
+
+ # Check for renamed files and if so, rename them in the torrent_info before adding.
+ if options['mapped_files'] and torrent_info:
+ for index, fname in options['mapped_files'].items():
+ fname = sanitize_filepath(decode_bytes(fname))
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('renaming file index %s to %s', index, fname)
+ try:
+ torrent_info.rename_file(index, fname.encode('utf8'))
+ except TypeError:
+ torrent_info.rename_file(index, fname)
+ add_torrent_params['ti'] = torrent_info
+
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('options: %s', options)
+
+ # Fill in the rest of the add_torrent_params dictionary.
+ add_torrent_params['save_path'] = options['download_location'].encode('utf8')
+ if options['name']:
+ add_torrent_params['name'] = options['name']
+ if options['pre_allocate_storage']:
+ add_torrent_params['storage_mode'] = lt.storage_mode_t.storage_mode_allocate
+ if resume_data:
+ add_torrent_params['resume_data'] = resume_data
+
+ # Set flags: enable duplicate_is_error & override_resume_data, disable auto_managed.
+ add_torrent_params['flags'] = (
+ LT_DEFAULT_ADD_TORRENT_FLAGS
+ | lt.add_torrent_params_flags_t.flag_duplicate_is_error
+ | lt.add_torrent_params_flags_t.flag_override_resume_data
+ ) ^ lt.add_torrent_params_flags_t.flag_auto_managed
+ if options['seed_mode']:
+ add_torrent_params['flags'] |= lt.add_torrent_params_flags_t.flag_seed_mode
+ if options['super_seeding']:
+ add_torrent_params[
+ 'flags'
+ ] |= lt.add_torrent_params_flags_t.flag_super_seeding
+
+ return torrent_id, add_torrent_params
+
+ def add(
+ self,
+ torrent_info=None,
+ state=None,
+ options=None,
+ save_state=True,
+ filedump=None,
+ filename=None,
+ magnet=None,
+ resume_data=None,
+ ):
+ """Adds a torrent to the torrent manager.
+
+ Args:
+ torrent_info (lt.torrent_info, optional): A libtorrent torrent_info object.
+ state (TorrentState, optional): The torrent state.
+ options (dict, optional): The options to apply to the torrent on adding.
+ save_state (bool, optional): If True save the session state after adding torrent, defaults to True.
+ filedump (str, optional): bencoded filedump of a torrent file.
+ filename (str, optional): The filename of the torrent file.
+ magnet (str, optional): The magnet uri.
+ resume_data (lt.entry, optional): libtorrent fast resume data.
+
+ Returns:
+ str: If successful the torrent_id of the added torrent, None if adding the torrent failed.
+
+ Emits:
+ TorrentAddedEvent: Torrent with torrent_id added to session.
+
+ """
+ if not torrent_info and not filedump and not magnet:
+ raise AddTorrentError(
+ 'You must specify a valid torrent_info, torrent state or magnet.'
+ )
+
+ if filedump:
+ try:
+ torrent_info = lt.torrent_info(lt.bdecode(filedump))
+ except RuntimeError as ex:
+ raise AddTorrentError(
+ 'Unable to add torrent, decoding filedump failed: %s' % ex
+ )
+
+ options = self._build_torrent_options(options)
+ __, add_torrent_params = self._build_torrent_params(
+ torrent_info, magnet, options, resume_data
+ )
+
+ # We need to pause the AlertManager momentarily to prevent alerts
+ # for this torrent being generated before a Torrent object is created.
+ component.pause('AlertManager')
+
+ try:
+ handle = self.session.add_torrent(add_torrent_params)
+ if not handle.is_valid():
+ raise InvalidTorrentError('Torrent handle is invalid!')
+ except (RuntimeError, InvalidTorrentError) as ex:
+ component.resume('AlertManager')
+ raise AddTorrentError('Unable to add torrent to session: %s' % ex)
+
+ torrent = self._add_torrent_obj(
+ handle, options, state, filename, magnet, resume_data, filedump, save_state
+ )
+ return torrent.torrent_id
+
+ def add_async(
+ self,
+ torrent_info=None,
+ state=None,
+ options=None,
+ save_state=True,
+ filedump=None,
+ filename=None,
+ magnet=None,
+ resume_data=None,
+ ):
+ """Adds a torrent to the torrent manager using libtorrent async add torrent method.
+
+ Args:
+ torrent_info (lt.torrent_info, optional): A libtorrent torrent_info object.
+ state (TorrentState, optional): The torrent state.
+ options (dict, optional): The options to apply to the torrent on adding.
+ save_state (bool, optional): If True save the session state after adding torrent, defaults to True.
+ filedump (str, optional): bencoded filedump of a torrent file.
+ filename (str, optional): The filename of the torrent file.
+ magnet (str, optional): The magnet uri.
+ resume_data (lt.entry, optional): libtorrent fast resume data.
+
+ Returns:
+ Deferred: If successful the torrent_id of the added torrent, None if adding the torrent failed.
+
+ Emits:
+ TorrentAddedEvent: Torrent with torrent_id added to session.
+
+ """
+ if not torrent_info and not filedump and not magnet:
+ raise AddTorrentError(
+ 'You must specify a valid torrent_info, torrent state or magnet.'
+ )
+
+ if filedump:
+ try:
+ torrent_info = lt.torrent_info(lt.bdecode(filedump))
+ except RuntimeError as ex:
+ raise AddTorrentError(
+ 'Unable to add torrent, decoding filedump failed: %s' % ex
+ )
+
+ options = self._build_torrent_options(options)
+ torrent_id, add_torrent_params = self._build_torrent_params(
+ torrent_info, magnet, options, resume_data
+ )
+
+ d = Deferred()
+ self.torrents_loading[torrent_id] = (
+ d,
+ options,
+ state,
+ filename,
+ magnet,
+ resume_data,
+ filedump,
+ save_state,
+ )
+ try:
+ self.session.async_add_torrent(add_torrent_params)
+ except RuntimeError as ex:
+ raise AddTorrentError('Unable to add torrent to session: %s' % ex)
+ return d
+
+ def _add_torrent_obj(
+ self,
+ handle,
+ options,
+ state,
+ filename,
+ magnet,
+ resume_data,
+ filedump,
+ save_state,
+ ):
+ # For magnets added with metadata, filename is used so set as magnet.
+ if not magnet and is_magnet(filename):
+ magnet = filename
+ filename = None
+
+ # Create a Torrent object and add to the dictionary.
+ torrent = Torrent(handle, options, state, filename, magnet)
+ self.torrents[torrent.torrent_id] = torrent
+
+ # Resume AlertManager if paused for adding torrent to libtorrent.
+ component.resume('AlertManager')
+
+ # Store the orignal resume_data, in case of errors.
+ if resume_data:
+ self.resume_data[torrent.torrent_id] = resume_data
+
+ # Add to queued torrents set.
+ self.queued_torrents.add(torrent.torrent_id)
+ if self.config['queue_new_to_top']:
+ self.queue_top(torrent.torrent_id)
+
+ # Resume the torrent if needed.
+ if not options['add_paused']:
+ torrent.resume()
+
+ # Emit torrent_added signal.
+ from_state = state is not None
+ component.get('EventManager').emit(
+ TorrentAddedEvent(torrent.torrent_id, from_state)
+ )
+
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('Torrent added: %s', str(handle.info_hash()))
+ if log.isEnabledFor(logging.INFO):
+ name_and_owner = torrent.get_status(['name', 'owner'])
+ log.info(
+ 'Torrent %s from user "%s" %s',
+ name_and_owner['name'],
+ name_and_owner['owner'],
+ from_state and 'loaded' or 'added',
+ )
+
+ # Write the .torrent file to the state directory.
+ if filedump:
+ torrent.write_torrentfile(filedump)
+
+ # Save the session state.
+ if save_state:
+ self.save_state()
+
+ return torrent
+
+ def add_async_callback(
+ self,
+ handle,
+ d,
+ options,
+ state,
+ filename,
+ magnet,
+ resume_data,
+ filedump,
+ save_state,
+ ):
+ torrent = self._add_torrent_obj(
+ handle, options, state, filename, magnet, resume_data, filedump, save_state
+ )
+
+ d.callback(torrent.torrent_id)
+
+ def remove(self, torrent_id, remove_data=False, save_state=True):
+ """Remove a torrent from the session.
+
+ Args:
+ torrent_id (str): The torrent ID to remove.
+ remove_data (bool, optional): If True, remove the downloaded data, defaults to False.
+ save_state (bool, optional): If True, save the session state after removal, defaults to True.
+
+ Returns:
+ bool: True if removed successfully, False if not.
+
+ Emits:
+ PreTorrentRemovedEvent: Torrent is about to be removed from session.
+ TorrentRemovedEvent: Torrent with torrent_id removed from session.
+
+ Raises:
+ InvalidTorrentError: If the torrent_id is not in the session.
+
+ """
+ try:
+ torrent = self.torrents[torrent_id]
+ except KeyError:
+ raise InvalidTorrentError('torrent_id %s not in session.' % torrent_id)
+
+ torrent_name = torrent.get_status(['name'])['name']
+
+ # Emit the signal to the clients
+ component.get('EventManager').emit(PreTorrentRemovedEvent(torrent_id))
+
+ try:
+ self.session.remove_torrent(torrent.handle, 1 if remove_data else 0)
+ except RuntimeError as ex:
+ log.warning('Error removing torrent: %s', ex)
+ return False
+
+ # Remove fastresume data if it is exists
+ self.resume_data.pop(torrent_id, None)
+
+ # Remove the .torrent file in the state and copy location, if user requested.
+ delete_copies = (
+ self.config['copy_torrent_file'] and self.config['del_copy_torrent_file']
+ )
+ torrent.delete_torrentfile(delete_copies)
+
+ # Remove from set if it wasn't finished
+ if not torrent.is_finished:
+ try:
+ self.queued_torrents.remove(torrent_id)
+ except KeyError:
+ log.debug('%s is not in queued torrents set.', torrent_id)
+ raise InvalidTorrentError(
+ '%s is not in queued torrents set.' % torrent_id
+ )
+
+ # Remove the torrent from deluge's session
+ del self.torrents[torrent_id]
+
+ if save_state:
+ self.save_state()
+
+ # Emit the signal to the clients
+ component.get('EventManager').emit(TorrentRemovedEvent(torrent_id))
+ log.info(
+ 'Torrent %s removed by user: %s',
+ torrent_name,
+ component.get('RPCServer').get_session_user(),
+ )
+ return True
+
+ def fixup_state(self, state):
+ """Fixup an old state by adding missing TorrentState options and assigning default values.
+
+ Args:
+ state (TorrentManagerState): A torrentmanager state containing torrent details.
+
+ Returns:
+ TorrentManagerState: A fixedup TorrentManager state.
+
+ """
+ if state.torrents:
+ t_state_tmp = TorrentState()
+ if dir(state.torrents[0]) != dir(t_state_tmp):
+ self.archive_state('Migration of TorrentState required.')
+ try:
+ for attr in set(dir(t_state_tmp)) - set(dir(state.torrents[0])):
+ for t_state in state.torrents:
+ setattr(t_state, attr, getattr(t_state_tmp, attr, None))
+ except AttributeError as ex:
+ log.error(
+ 'Unable to update state file to a compatible version: %s', ex
+ )
+ return state
+
+ def open_state(self):
+ """Open the torrents.state file containing a TorrentManager state with session torrents.
+
+ Returns:
+ TorrentManagerState: The TorrentManager state.
+
+ """
+ torrents_state = os.path.join(self.state_dir, 'torrents.state')
+ state = None
+ for filepath in (torrents_state, torrents_state + '.bak'):
+ log.info('Loading torrent state: %s', filepath)
+ if not os.path.isfile(filepath):
+ continue
+
+ try:
+ with open(filepath, 'rb') as _file:
+ state = pickle.load(_file)
+ except (IOError, EOFError, pickle.UnpicklingError) as ex:
+ message = 'Unable to load {}: {}'.format(filepath, ex)
+ log.error(message)
+ if not filepath.endswith('.bak'):
+ self.archive_state(message)
+ else:
+ log.info('Successfully loaded %s', filepath)
+ break
+
+ return state if state else TorrentManagerState()
+
+ def load_state(self):
+ """Load all the torrents from TorrentManager state into session.
+
+ Emits:
+ SessionStartedEvent: Emitted after all torrents are added to the session.
+
+ """
+ start = datetime.datetime.now()
+ state = self.open_state()
+ state = self.fixup_state(state)
+
+ # Reorder the state.torrents list to add torrents in the correct queue order.
+ state.torrents.sort(
+ key=operator.attrgetter('queue'), reverse=self.config['queue_new_to_top']
+ )
+ resume_data = self.load_resume_data_file()
+
+ deferreds = []
+ for t_state in state.torrents:
+ # Populate the options dict from state
+ options = TorrentOptions()
+ for option in options:
+ try:
+ options[option] = getattr(t_state, option)
+ except AttributeError:
+ pass
+ # Manually update unmatched attributes
+ options['download_location'] = t_state.save_path
+ options['pre_allocate_storage'] = t_state.storage_mode == 'allocate'
+ options['prioritize_first_last_pieces'] = t_state.prioritize_first_last
+ options['add_paused'] = t_state.paused
+
+ magnet = t_state.magnet
+ torrent_info = self.get_torrent_info_from_file(
+ os.path.join(self.state_dir, t_state.torrent_id + '.torrent')
+ )
+
+ try:
+ d = self.add_async(
+ torrent_info=torrent_info,
+ state=t_state,
+ options=options,
+ save_state=False,
+ magnet=magnet,
+ resume_data=resume_data.get(t_state.torrent_id),
+ )
+ except AddTorrentError as ex:
+ log.warning(
+ 'Error when adding torrent "%s" to session: %s',
+ t_state.torrent_id,
+ ex,
+ )
+ else:
+ deferreds.append(d)
+
+ deferred_list = DeferredList(deferreds, consumeErrors=False)
+
+ def on_complete(result):
+ log.info(
+ 'Finished loading %d torrents in %s',
+ len(state.torrents),
+ str(datetime.datetime.now() - start),
+ )
+ component.get('EventManager').emit(SessionStartedEvent())
+
+ deferred_list.addCallback(on_complete)
+
+ def create_state(self):
+ """Create a state of all the torrents in TorrentManager.
+
+ Returns:
+ TorrentManagerState: The TorrentManager state.
+
+ """
+ state = TorrentManagerState()
+ # Create the state for each Torrent and append to the list
+ for torrent in self.torrents.values():
+ if self.session.is_paused():
+ paused = torrent.handle.is_paused()
+ elif torrent.forced_error:
+ paused = torrent.forced_error.was_paused
+ elif torrent.state == 'Paused':
+ paused = True
+ else:
+ paused = False
+
+ torrent_state = TorrentState(
+ torrent.torrent_id,
+ torrent.filename,
+ torrent.trackers,
+ torrent.get_status(['storage_mode'])['storage_mode'],
+ paused,
+ torrent.options['download_location'],
+ torrent.options['max_connections'],
+ torrent.options['max_upload_slots'],
+ torrent.options['max_upload_speed'],
+ torrent.options['max_download_speed'],
+ torrent.options['prioritize_first_last_pieces'],
+ torrent.options['sequential_download'],
+ torrent.options['file_priorities'],
+ torrent.get_queue_position(),
+ torrent.options['auto_managed'],
+ torrent.is_finished,
+ torrent.options['stop_ratio'],
+ torrent.options['stop_at_ratio'],
+ torrent.options['remove_at_ratio'],
+ torrent.options['move_completed'],
+ torrent.options['move_completed_path'],
+ torrent.magnet,
+ torrent.options['owner'],
+ torrent.options['shared'],
+ torrent.options['super_seeding'],
+ torrent.options['name'],
+ )
+ state.torrents.append(torrent_state)
+ return state
+
+ def save_state(self):
+ """Run the save state task in a separate thread to avoid blocking main thread.
+
+ Note:
+ If a save task is already running, this call is ignored.
+
+ """
+ if self.is_saving_state:
+ return defer.succeed(None)
+ self.is_saving_state = True
+ d = threads.deferToThread(self._save_state)
+
+ def on_state_saved(arg):
+ self.is_saving_state = False
+ if self.save_state_timer.running:
+ self.save_state_timer.reset()
+
+ d.addBoth(on_state_saved)
+ return d
+
+ def _save_state(self):
+ """Save the state of the TorrentManager to the torrents.state file."""
+ state = self.create_state()
+
+ # If the state hasn't changed, no need to save it
+ if self.prev_saved_state == state:
+ return
+
+ filename = 'torrents.state'
+ filepath = os.path.join(self.state_dir, filename)
+ filepath_bak = filepath + '.bak'
+ filepath_tmp = filepath + '.tmp'
+
+ try:
+ log.debug('Creating the temporary file: %s', filepath_tmp)
+ with open(filepath_tmp, 'wb', 0) as _file:
+ pickle.dump(state, _file, protocol=2)
+ _file.flush()
+ os.fsync(_file.fileno())
+ except (OSError, pickle.PicklingError) as ex:
+ log.error('Unable to save %s: %s', filename, ex)
+ return
+
+ try:
+ log.debug('Creating backup of %s at: %s', filename, filepath_bak)
+ if os.path.isfile(filepath_bak):
+ os.remove(filepath_bak)
+ if os.path.isfile(filepath):
+ os.rename(filepath, filepath_bak)
+ except OSError as ex:
+ log.error('Unable to backup %s to %s: %s', filepath, filepath_bak, ex)
+ return
+
+ try:
+ log.debug('Saving %s to: %s', filename, filepath)
+ os.rename(filepath_tmp, filepath)
+ self.prev_saved_state = state
+ except OSError as ex:
+ log.error('Failed to set new state file %s: %s', filepath, ex)
+ if os.path.isfile(filepath_bak):
+ log.info('Restoring backup of state from: %s', filepath_bak)
+ os.rename(filepath_bak, filepath)
+
+ def save_resume_data(self, torrent_ids=None, flush_disk_cache=False):
+ """Saves torrents resume data.
+
+ Args:
+ torrent_ids (list of str): A list of torrents to save the resume data for, defaults
+ to None which saves all torrents resume data.
+ flush_disk_cache (bool, optional): If True flushes the disk cache which avoids potential
+ issue with file timestamps, defaults to False. This is only needed when stopping the session.
+
+ Returns:
+ t.i.d.DeferredList: A list of twisted Deferred callbacks to be invoked when save is complete.
+
+ """
+ if torrent_ids is None:
+ torrent_ids = (
+ tid
+ for tid, t in self.torrents.items()
+ if t.handle.need_save_resume_data()
+ )
+
+ def on_torrent_resume_save(dummy_result, torrent_id):
+ """Recieved torrent resume_data alert so remove from waiting list"""
+ self.waiting_on_resume_data.pop(torrent_id, None)
+
+ deferreds = []
+ for torrent_id in torrent_ids:
+ d = self.waiting_on_resume_data.get(torrent_id)
+ if not d:
+ d = Deferred().addBoth(on_torrent_resume_save, torrent_id)
+ self.waiting_on_resume_data[torrent_id] = d
+ deferreds.append(d)
+ self.torrents[torrent_id].save_resume_data(flush_disk_cache)
+
+ def on_all_resume_data_finished(dummy_result):
+ """Saves resume data file when no more torrents waiting for resume data.
+
+ Returns:
+ bool: True if fastresume file is saved.
+
+ This return value determines removal of `self.temp_file` in `self.stop()`.
+
+ """
+ # Use flush_disk_cache as a marker for shutdown so fastresume is
+ # saved even if torrents are waiting.
+ if not self.waiting_on_resume_data or flush_disk_cache:
+ return self.save_resume_data_file(queue_task=flush_disk_cache)
+
+ return DeferredList(deferreds).addBoth(on_all_resume_data_finished)
+
+ def load_resume_data_file(self):
+ """Load the resume data from file for all torrents.
+
+ Returns:
+ dict: A dict of torrents and their resume_data.
+
+ """
+ filename = 'torrents.fastresume'
+ filepath = os.path.join(self.state_dir, filename)
+ filepath_bak = filepath + '.bak'
+ old_data_filepath = os.path.join(get_config_dir(), filename)
+
+ for _filepath in (filepath, filepath_bak, old_data_filepath):
+ log.info('Opening %s for load: %s', filename, _filepath)
+ try:
+ with open(_filepath, 'rb') as _file:
+ resume_data = lt.bdecode(_file.read())
+ except (IOError, EOFError, RuntimeError) as ex:
+ if self.torrents:
+ log.warning('Unable to load %s: %s', _filepath, ex)
+ resume_data = None
+ else:
+ # lt.bdecode returns the dict keys as bytes so decode them.
+ resume_data = {k.decode(): v for k, v in resume_data.items()}
+ log.info('Successfully loaded %s: %s', filename, _filepath)
+ break
+
+ # If the libtorrent bdecode doesn't happen properly, it will return None
+ # so we need to make sure we return a {}
+ if resume_data is None:
+ return {}
+ else:
+ return resume_data
+
+ def save_resume_data_file(self, queue_task=False):
+ """Save resume data to file in a separate thread to avoid blocking main thread.
+
+ Args:
+ queue_task (bool): If True and a save task is already running then queue
+ this save task to run next. Default is to not queue save tasks.
+
+ Returns:
+ Deferred: Fires with arg, True if save task was successful, False if
+ not and None if task was not performed.
+
+ """
+ if not queue_task and self.save_resume_data_file_lock.locked:
+ return defer.succeed(None)
+
+ def on_lock_aquired():
+ d = threads.deferToThread(self._save_resume_data_file)
+
+ def on_resume_data_file_saved(arg):
+ if self.save_resume_data_timer.running:
+ self.save_resume_data_timer.reset()
+ return arg
+
+ d.addBoth(on_resume_data_file_saved)
+ return d
+
+ return self.save_resume_data_file_lock.run(on_lock_aquired)
+
+ def _save_resume_data_file(self):
+ """Saves the resume data file with the contents of self.resume_data"""
+ if not self.resume_data:
+ return True
+
+ filename = 'torrents.fastresume'
+ filepath = os.path.join(self.state_dir, filename)
+ filepath_bak = filepath + '.bak'
+ filepath_tmp = filepath + '.tmp'
+
+ try:
+ log.debug('Creating the temporary file: %s', filepath_tmp)
+ with open(filepath_tmp, 'wb', 0) as _file:
+ _file.write(lt.bencode(self.resume_data))
+ _file.flush()
+ os.fsync(_file.fileno())
+ except (OSError, EOFError) as ex:
+ log.error('Unable to save %s: %s', filename, ex)
+ return False
+
+ try:
+ log.debug('Creating backup of %s at: %s', filename, filepath_bak)
+ if os.path.isfile(filepath_bak):
+ os.remove(filepath_bak)
+ if os.path.isfile(filepath):
+ os.rename(filepath, filepath_bak)
+ except OSError as ex:
+ log.error('Unable to backup %s to %s: %s', filepath, filepath_bak, ex)
+ return False
+
+ try:
+ log.debug('Saving %s to: %s', filename, filepath)
+ os.rename(filepath_tmp, filepath)
+ except OSError as ex:
+ log.error('Failed to set new file %s: %s', filepath, ex)
+ if os.path.isfile(filepath_bak):
+ log.info('Restoring backup from: %s', filepath_bak)
+ os.rename(filepath_bak, filepath)
+ else:
+ # Sync the rename operations for the directory
+ if hasattr(os, 'O_DIRECTORY'):
+ dirfd = os.open(os.path.dirname(filepath), os.O_DIRECTORY)
+ os.fsync(dirfd)
+ os.close(dirfd)
+ return True
+
+ def archive_state(self, message):
+ log.warning(message)
+ arc_filepaths = []
+ for filename in ('torrents.fastresume', 'torrents.state'):
+ filepath = os.path.join(self.state_dir, filename)
+ arc_filepaths.extend([filepath, filepath + '.bak'])
+
+ archive_files('state', arc_filepaths, message=message)
+
+ def get_queue_position(self, torrent_id):
+ """Get queue position of torrent"""
+ return self.torrents[torrent_id].get_queue_position()
+
+ def queue_top(self, torrent_id):
+ """Queue torrent to top"""
+ if self.torrents[torrent_id].get_queue_position() == 0:
+ return False
+
+ self.torrents[torrent_id].handle.queue_position_top()
+ return True
+
+ def queue_up(self, torrent_id):
+ """Queue torrent up one position"""
+ if self.torrents[torrent_id].get_queue_position() == 0:
+ return False
+
+ self.torrents[torrent_id].handle.queue_position_up()
+ return True
+
+ def queue_down(self, torrent_id):
+ """Queue torrent down one position"""
+ if self.torrents[torrent_id].get_queue_position() == (
+ len(self.queued_torrents) - 1
+ ):
+ return False
+
+ self.torrents[torrent_id].handle.queue_position_down()
+ return True
+
+ def queue_bottom(self, torrent_id):
+ """Queue torrent to bottom"""
+ if self.torrents[torrent_id].get_queue_position() == (
+ len(self.queued_torrents) - 1
+ ):
+ return False
+
+ self.torrents[torrent_id].handle.queue_position_bottom()
+ return True
+
+ def cleanup_torrents_prev_status(self):
+ """Run cleanup_prev_status for each registered torrent"""
+ for torrent in self.torrents.values():
+ torrent.cleanup_prev_status()
+
+ def on_set_max_connections_per_torrent(self, key, value):
+ """Sets the per-torrent connection limit"""
+ log.debug('max_connections_per_torrent set to %s...', value)
+ for key in self.torrents:
+ self.torrents[key].set_max_connections(value)
+
+ def on_set_max_upload_slots_per_torrent(self, key, value):
+ """Sets the per-torrent upload slot limit"""
+ log.debug('max_upload_slots_per_torrent set to %s...', value)
+ for key in self.torrents:
+ self.torrents[key].set_max_upload_slots(value)
+
+ def on_set_max_upload_speed_per_torrent(self, key, value):
+ """Sets the per-torrent upload speed limit"""
+ log.debug('max_upload_speed_per_torrent set to %s...', value)
+ for key in self.torrents:
+ self.torrents[key].set_max_upload_speed(value)
+
+ def on_set_max_download_speed_per_torrent(self, key, value):
+ """Sets the per-torrent download speed limit"""
+ log.debug('max_download_speed_per_torrent set to %s...', value)
+ for key in self.torrents:
+ self.torrents[key].set_max_download_speed(value)
+
+ # --- Alert handlers ---
+ def on_alert_add_torrent(self, alert):
+ """Alert handler for libtorrent add_torrent_alert"""
+ if not alert.handle.is_valid():
+ log.warning('Torrent handle is invalid!')
+ return
+
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ except RuntimeError as ex:
+ log.warning('Failed to get torrent id from handle: %s', ex)
+ return
+
+ try:
+ add_async_params = self.torrents_loading.pop(torrent_id)
+ except KeyError as ex:
+ log.warning('Torrent id not in torrents loading list: %s', ex)
+ return
+
+ self.add_async_callback(alert.handle, *add_async_params)
+
+ def on_alert_torrent_finished(self, alert):
+ """Alert handler for libtorrent torrent_finished_alert"""
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ torrent = self.torrents[torrent_id]
+ except (RuntimeError, KeyError):
+ return
+
+ # If total_download is 0, do not move, it's likely the torrent wasn't downloaded, but just added.
+ # Get fresh data from libtorrent, the cache isn't always up to date
+ total_download = torrent.get_status(['total_payload_download'], update=True)[
+ 'total_payload_download'
+ ]
+
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('Finished %s ', torrent_id)
+ log.debug(
+ 'Torrent settings: is_finished: %s, total_download: %s, move_completed: %s, move_path: %s',
+ torrent.is_finished,
+ total_download,
+ torrent.options['move_completed'],
+ torrent.options['move_completed_path'],
+ )
+
+ torrent.update_state()
+ if not torrent.is_finished and total_download:
+ # Move completed download to completed folder if needed
+ if (
+ torrent.options['move_completed']
+ and torrent.options['download_location']
+ != torrent.options['move_completed_path']
+ ):
+ self.waiting_on_finish_moving.append(torrent_id)
+ torrent.move_storage(torrent.options['move_completed_path'])
+ else:
+ torrent.is_finished = True
+ component.get('EventManager').emit(TorrentFinishedEvent(torrent_id))
+ else:
+ torrent.is_finished = True
+
+ # Torrent is no longer part of the queue
+ try:
+ self.queued_torrents.remove(torrent_id)
+ except KeyError:
+ # Sometimes libtorrent fires a TorrentFinishedEvent twice
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug('%s is not in queued torrents set.', torrent_id)
+
+ # Only save resume data if it was actually downloaded something. Helps
+ # on startup with big queues with lots of seeding torrents. Libtorrent
+ # emits alert_torrent_finished for them, but there seems like nothing
+ # worth really to save in resume data, we just read it up in
+ # self.load_state().
+ if total_download:
+ self.save_resume_data((torrent_id,))
+
+ def on_alert_torrent_paused(self, alert):
+ """Alert handler for libtorrent torrent_paused_alert"""
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ torrent = self.torrents[torrent_id]
+ except (RuntimeError, KeyError):
+ return
+ torrent.update_state()
+ # Write the fastresume file if we are not waiting on a bulk write
+ if torrent_id not in self.waiting_on_resume_data:
+ self.save_resume_data((torrent_id,))
+
+ def on_alert_torrent_checked(self, alert):
+ """Alert handler for libtorrent torrent_checked_alert"""
+ try:
+ torrent = self.torrents[str(alert.handle.info_hash())]
+ except (RuntimeError, KeyError):
+ return
+
+ # Check to see if we're forcing a recheck and set it back to paused if necessary.
+ if torrent.forcing_recheck:
+ torrent.forcing_recheck = False
+ if torrent.forcing_recheck_paused:
+ torrent.handle.pause()
+
+ torrent.update_state()
+
+ def on_alert_tracker_reply(self, alert):
+ """Alert handler for libtorrent tracker_reply_alert"""
+ try:
+ torrent = self.torrents[str(alert.handle.info_hash())]
+ except (RuntimeError, KeyError):
+ return
+
+ # Set the tracker status for the torrent
+ torrent.set_tracker_status('Announce OK')
+
+ # Check for peer information from the tracker, if none then send a scrape request.
+ if (
+ alert.handle.status().num_complete == -1
+ or alert.handle.status().num_incomplete == -1
+ ):
+ torrent.scrape_tracker()
+
+ def on_alert_tracker_announce(self, alert):
+ """Alert handler for libtorrent tracker_announce_alert"""
+ try:
+ torrent = self.torrents[str(alert.handle.info_hash())]
+ except (RuntimeError, KeyError):
+ return
+
+ # Set the tracker status for the torrent
+ torrent.set_tracker_status('Announce Sent')
+
+ def on_alert_tracker_warning(self, alert):
+ """Alert handler for libtorrent tracker_warning_alert"""
+ try:
+ torrent = self.torrents[str(alert.handle.info_hash())]
+ except (RuntimeError, KeyError):
+ return
+ # Set the tracker status for the torrent
+ torrent.set_tracker_status('Warning: %s' % decode_bytes(alert.message()))
+
+ def on_alert_tracker_error(self, alert):
+ """Alert handler for libtorrent tracker_error_alert"""
+ try:
+ torrent = self.torrents[str(alert.handle.info_hash())]
+ except (RuntimeError, KeyError):
+ return
+
+ error_message = decode_bytes(alert.error_message())
+ if not error_message:
+ error_message = decode_bytes(alert.error.message())
+ log.debug(
+ 'Tracker Error Alert: %s [%s]', decode_bytes(alert.message()), error_message
+ )
+ torrent.set_tracker_status('Error: ' + error_message)
+
+ def on_alert_storage_moved(self, alert):
+ """Alert handler for libtorrent storage_moved_alert"""
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ torrent = self.torrents[torrent_id]
+ except (RuntimeError, KeyError):
+ return
+
+ torrent.set_download_location(os.path.normpath(alert.storage_path()))
+ torrent.set_move_completed(False)
+ torrent.update_state()
+
+ if torrent_id in self.waiting_on_finish_moving:
+ self.waiting_on_finish_moving.remove(torrent_id)
+ torrent.is_finished = True
+ component.get('EventManager').emit(TorrentFinishedEvent(torrent_id))
+
+ def on_alert_storage_moved_failed(self, alert):
+ """Alert handler for libtorrent storage_moved_failed_alert"""
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ torrent = self.torrents[torrent_id]
+ except (RuntimeError, KeyError):
+ return
+
+ log.warning('on_alert_storage_moved_failed: %s', decode_bytes(alert.message()))
+ # Set an Error message and pause the torrent
+ alert_msg = decode_bytes(alert.message()).split(':', 1)[1].strip()
+ torrent.force_error_state('Failed to move download folder: %s' % alert_msg)
+
+ if torrent_id in self.waiting_on_finish_moving:
+ self.waiting_on_finish_moving.remove(torrent_id)
+ torrent.is_finished = True
+ component.get('EventManager').emit(TorrentFinishedEvent(torrent_id))
+
+ def on_alert_torrent_resumed(self, alert):
+ """Alert handler for libtorrent torrent_resumed_alert"""
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ torrent = self.torrents[torrent_id]
+ except (RuntimeError, KeyError):
+ return
+ torrent.update_state()
+ component.get('EventManager').emit(TorrentResumedEvent(torrent_id))
+
+ def on_alert_state_changed(self, alert):
+ """Alert handler for libtorrent state_changed_alert.
+
+ Emits:
+ TorrentStateChangedEvent: The state has changed.
+
+ """
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ torrent = self.torrents[torrent_id]
+ except (RuntimeError, KeyError):
+ return
+
+ torrent.update_state()
+ # Torrent may need to download data after checking.
+ if torrent.state in ('Checking', 'Downloading'):
+ torrent.is_finished = False
+ self.queued_torrents.add(torrent_id)
+
+ def on_alert_save_resume_data(self, alert):
+ """Alert handler for libtorrent save_resume_data_alert"""
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ except RuntimeError:
+ return
+ if torrent_id in self.torrents:
+ # libtorrent add_torrent expects bencoded resume_data.
+ self.resume_data[torrent_id] = lt.bencode(alert.resume_data)
+
+ if torrent_id in self.waiting_on_resume_data:
+ self.waiting_on_resume_data[torrent_id].callback(None)
+
+ def on_alert_save_resume_data_failed(self, alert):
+ """Alert handler for libtorrent save_resume_data_failed_alert"""
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ except RuntimeError:
+ return
+
+ if torrent_id in self.waiting_on_resume_data:
+ self.waiting_on_resume_data[torrent_id].errback(
+ Exception(decode_bytes(alert.message()))
+ )
+
+ def on_alert_fastresume_rejected(self, alert):
+ """Alert handler for libtorrent fastresume_rejected_alert"""
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ torrent = self.torrents[torrent_id]
+ except (RuntimeError, KeyError):
+ return
+
+ alert_msg = decode_bytes(alert.message())
+ log.error('on_alert_fastresume_rejected: %s', alert_msg)
+ if alert.error.value() == 134:
+ if not os.path.isdir(torrent.options['download_location']):
+ error_msg = 'Unable to locate Download Folder!'
+ else:
+ error_msg = 'Missing or invalid torrent data!'
+ else:
+ error_msg = (
+ 'Problem with resume data: %s' % alert_msg.split(':', 1)[1].strip()
+ )
+ torrent.force_error_state(error_msg, restart_to_resume=True)
+
+ def on_alert_file_renamed(self, alert):
+ """Alert handler for libtorrent file_renamed_alert.
+
+ Emits:
+ TorrentFileRenamedEvent: Files in the torrent have been renamed.
+
+ """
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ torrent = self.torrents[torrent_id]
+ except (RuntimeError, KeyError):
+ return
+
+ new_name = decode_bytes(alert.new_name())
+ log.debug('index: %s name: %s', alert.index, new_name)
+
+ # We need to see if this file index is in a waiting_on_folder dict
+ for wait_on_folder in torrent.waiting_on_folder_rename:
+ if alert.index in wait_on_folder:
+ wait_on_folder[alert.index].callback(None)
+ break
+ else:
+ # This is just a regular file rename so send the signal
+ component.get('EventManager').emit(
+ TorrentFileRenamedEvent(torrent_id, alert.index, new_name)
+ )
+ self.save_resume_data((torrent_id,))
+
+ def on_alert_metadata_received(self, alert):
+ """Alert handler for libtorrent metadata_received_alert"""
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ except RuntimeError:
+ return
+
+ try:
+ torrent = self.torrents[torrent_id]
+ except KeyError:
+ pass
+ else:
+ return torrent.on_metadata_received()
+
+ # Try callback to prefetch_metadata method.
+ try:
+ d = self.prefetching_metadata[torrent_id].defer
+ except KeyError:
+ pass
+ else:
+ torrent_info = alert.handle.get_torrent_info()
+ return d.callback(torrent_info)
+
+ def on_alert_file_error(self, alert):
+ """Alert handler for libtorrent file_error_alert"""
+ try:
+ torrent = self.torrents[str(alert.handle.info_hash())]
+ except (RuntimeError, KeyError):
+ return
+ torrent.update_state()
+
+ def on_alert_file_completed(self, alert):
+ """Alert handler for libtorrent file_completed_alert
+
+ Emits:
+ TorrentFileCompletedEvent: When an individual file completes downloading.
+
+ """
+ try:
+ torrent_id = str(alert.handle.info_hash())
+ except RuntimeError:
+ return
+ if torrent_id in self.torrents:
+ component.get('EventManager').emit(
+ TorrentFileCompletedEvent(torrent_id, alert.index)
+ )
+
+ def on_alert_state_update(self, alert):
+ """Alert handler for libtorrent state_update_alert
+
+ Result of a session.post_torrent_updates() call and contains the torrent status
+ of all torrents that changed since last time this was posted.
+
+ """
+ self.last_state_update_alert_ts = time.time()
+
+ for t_status in alert.status:
+ try:
+ torrent_id = str(t_status.info_hash)
+ except RuntimeError:
+ continue
+ if torrent_id in self.torrents:
+ self.torrents[torrent_id].update_status(t_status)
+
+ self.handle_torrents_status_callback(self.torrents_status_requests.pop())
+
+ def on_alert_external_ip(self, alert):
+ """Alert handler for libtorrent external_ip_alert
+
+ Note:
+ The alert.message IPv4 address format is:
+ 'external IP received: 0.0.0.0'
+ and IPv6 address format is:
+ 'external IP received: 0:0:0:0:0:0:0:0'
+ """
+
+ external_ip = decode_bytes(alert.message()).split(' ')[-1]
+ log.info('on_alert_external_ip: %s', external_ip)
+ component.get('EventManager').emit(ExternalIPEvent(external_ip))
+
+ def on_alert_performance(self, alert):
+ """Alert handler for libtorrent performance_alert"""
+ log.warning(
+ 'on_alert_performance: %s, %s',
+ decode_bytes(alert.message()),
+ alert.warning_code,
+ )
+ if alert.warning_code == lt.performance_warning_t.send_buffer_watermark_too_low:
+ max_send_buffer_watermark = 3 * 1024 * 1024 # 3MiB
+ settings = self.session.get_settings()
+ send_buffer_watermark = settings['send_buffer_watermark']
+
+ # If send buffer is too small, try increasing its size by 512KiB (up to max_send_buffer_watermark)
+ if send_buffer_watermark < max_send_buffer_watermark:
+ value = send_buffer_watermark + (500 * 1024)
+ log.info(
+ 'Increasing send_buffer_watermark from %s to %s Bytes',
+ send_buffer_watermark,
+ value,
+ )
+ component.get('Core').apply_session_setting(
+ 'send_buffer_watermark', value
+ )
+ else:
+ log.warning(
+ 'send_buffer_watermark reached maximum value: %s Bytes',
+ max_send_buffer_watermark,
+ )
+
+ def separate_keys(self, keys, torrent_ids):
+ """Separates the input keys into torrent class keys and plugins keys"""
+ if self.torrents:
+ for torrent_id in torrent_ids:
+ if torrent_id in self.torrents:
+ status_keys = list(self.torrents[torrent_id].status_funcs)
+ leftover_keys = list(set(keys) - set(status_keys))
+ torrent_keys = list(set(keys) - set(leftover_keys))
+ return torrent_keys, leftover_keys
+ return [], []
+
+ def handle_torrents_status_callback(self, status_request):
+ """Build the status dictionary with torrent values"""
+ d, torrent_ids, keys, diff = status_request
+ status_dict = {}.fromkeys(torrent_ids)
+ torrent_keys, plugin_keys = self.separate_keys(keys, torrent_ids)
+
+ # Get the torrent status for each torrent_id
+ for torrent_id in torrent_ids:
+ if torrent_id not in self.torrents:
+ # The torrent_id does not exist in the dict.
+ # Could be the clients cache (sessionproxy) isn't up to speed.
+ del status_dict[torrent_id]
+ else:
+ status_dict[torrent_id] = self.torrents[torrent_id].get_status(
+ torrent_keys, diff, all_keys=not keys
+ )
+ self.status_dict = status_dict
+ d.callback((status_dict, plugin_keys))
+
+ def torrents_status_update(self, torrent_ids, keys, diff=False):
+ """Returns status dict for the supplied torrent_ids async.
+
+ Note:
+ If torrent states was updated recently post_torrent_updates is not called and
+ instead cached state is used.
+
+ Args:
+ torrent_ids (list of str): The torrent IDs to get the status of.
+ keys (list of str): The keys to get the status on.
+ diff (bool, optional): If True, will return a diff of the changes since the
+ last call to get_status based on the session_id, defaults to False.
+
+ Returns:
+ dict: A status dictionary for the requested torrents.
+
+ """
+ d = Deferred()
+ now = time.time()
+ # If last update was recent, use cached data instead of request updates from libtorrent
+ if (now - self.last_state_update_alert_ts) < 1.5:
+ reactor.callLater(
+ 0, self.handle_torrents_status_callback, (d, torrent_ids, keys, diff)
+ )
+ else:
+ # Ask libtorrent for status update
+ self.torrents_status_requests.insert(0, (d, torrent_ids, keys, diff))
+ self.session.post_torrent_updates()
+ return d
diff --git a/deluge/crypto_utils.py b/deluge/crypto_utils.py
new file mode 100644
index 0000000..7672efa
--- /dev/null
+++ b/deluge/crypto_utils.py
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007,2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, print_function, unicode_literals
+
+from OpenSSL.crypto import FILETYPE_PEM
+from twisted.internet.ssl import (
+ AcceptableCiphers,
+ Certificate,
+ CertificateOptions,
+ KeyPair,
+ TLSVersion,
+)
+
+# A TLS ciphers list.
+# Sources for more information on TLS ciphers:
+# - https://wiki.mozilla.org/Security/Server_Side_TLS
+# - https://www.ssllabs.com/projects/best-practices/index.html
+# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
+#
+# This list was inspired by the `urllib3` library
+# - https://github.com/urllib3/urllib3/blob/master/urllib3/util/ssl_.py#L79
+#
+# The general intent is:
+# - prefer cipher suites that offer perfect forward secrecy (ECDHE),
+# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common,
+# - disable NULL authentication, MD5 MACs and DSS for security reasons.
+TLS_CIPHERS = ':'.join(
+ [
+ 'ECDH+AESGCM',
+ 'ECDH+CHACHA20',
+ 'AES256-GCM-SHA384',
+ 'AES128-GCM-SHA256',
+ '!DSS' '!aNULL',
+ '!eNULL',
+ '!MD5',
+ ]
+)
+
+# This value tells OpenSSL to disable all SSL/TLS renegotiation.
+SSL_OP_NO_RENEGOTIATION = 0x40000000
+
+
+def get_context_factory(cert_path, pkey_path):
+ """OpenSSL context factory.
+
+ Generates an OpenSSL context factory using Twisted's CertificateOptions class.
+ This will keep a server cipher order.
+
+ Args:
+ cert_path (string): The path to the certificate file
+ pkey_path (string): The path to the private key file
+
+ Returns:
+ twisted.internet.ssl.CertificateOptions: An OpenSSL context factory
+ """
+
+ with open(cert_path) as cert:
+ certificate = Certificate.loadPEM(cert.read()).original
+ with open(pkey_path) as pkey:
+ private_key = KeyPair.load(pkey.read(), FILETYPE_PEM).original
+ ciphers = AcceptableCiphers.fromOpenSSLCipherString(TLS_CIPHERS)
+ cert_options = CertificateOptions(
+ privateKey=private_key,
+ certificate=certificate,
+ raiseMinimumTo=TLSVersion.TLSv1_2,
+ acceptableCiphers=ciphers,
+ )
+ ctx = cert_options.getContext()
+ ctx.use_certificate_chain_file(cert_path)
+ ctx.set_options(SSL_OP_NO_RENEGOTIATION)
+
+ return cert_options
diff --git a/deluge/decorators.py b/deluge/decorators.py
new file mode 100644
index 0000000..b101712
--- /dev/null
+++ b/deluge/decorators.py
@@ -0,0 +1,164 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2010 John Garland <johnnybg+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import inspect
+import re
+import warnings
+from functools import wraps
+
+
+def proxy(proxy_func):
+ """
+ Factory class which returns a decorator that passes
+ the decorated function to a proxy function
+
+ :param proxy_func: the proxy function
+ :type proxy_func: function
+ """
+
+ def decorator(func):
+ @wraps(func)
+ def wrapper(*args, **kwargs):
+ return proxy_func(func, *args, **kwargs)
+
+ return wrapper
+
+ return decorator
+
+
+def overrides(*args):
+ """
+ Decorater function to specify when class methods override
+ super class methods.
+
+ When used as
+ @overrides
+ def funcname
+
+ the argument will be the funcname function.
+
+ When used as
+ @overrides(BaseClass)
+ def funcname
+
+ the argument will be the BaseClass
+
+ """
+ stack = inspect.stack()
+ if inspect.isfunction(args[0]):
+ return _overrides(stack, args[0])
+ else:
+ # One or more classes are specifed, so return a function that will be
+ # called with the real function as argument
+ def ret_func(func, **kwargs):
+ return _overrides(stack, func, explicit_base_classes=args)
+
+ return ret_func
+
+
+def _overrides(stack, method, explicit_base_classes=None):
+ # stack[0]=overrides, stack[1]=inside class def'n, stack[2]=outside class def'n
+ classes = {}
+ derived_class_locals = stack[2][0].f_locals
+
+ # Find all super classes
+ m = re.search(r'class\s(.+)\((.+)\)\s*\:', stack[2][4][0])
+ class_name = m.group(1)
+ base_classes = m.group(2)
+
+ # Handle multiple inheritance
+ base_classes = [s.strip() for s in base_classes.split(',')]
+ check_classes = base_classes
+
+ if not base_classes:
+ raise ValueError(
+ 'overrides decorator: unable to determine base class of class "%s"'
+ % class_name
+ )
+
+ def get_class(cls_name):
+ if '.' not in cls_name:
+ return derived_class_locals[cls_name]
+ else:
+ components = cls_name.split('.')
+ # obj is either a module or a class
+ obj = derived_class_locals[components[0]]
+ for c in components[1:]:
+ assert inspect.ismodule(obj) or inspect.isclass(obj)
+ obj = getattr(obj, c)
+ return obj
+
+ if explicit_base_classes:
+ # One or more base classes are explicitly given, check only those classes
+ override_classes = re.search(r'\s*@overrides\((.+)\)\s*', stack[1][4][0]).group(
+ 1
+ )
+ override_classes = [c.strip() for c in override_classes.split(',')]
+ check_classes = override_classes
+
+ for c in base_classes + check_classes:
+ classes[c] = get_class(c)
+
+ # Verify that the excplicit override class is one of base classes
+ if explicit_base_classes:
+ from itertools import product
+
+ for bc, cc in product(base_classes, check_classes):
+ if issubclass(classes[bc], classes[cc]):
+ break
+ else:
+ raise Exception(
+ 'Excplicit override class "%s" is not a super class of: %s'
+ % (explicit_base_classes, class_name)
+ )
+ if not all(hasattr(classes[cls], method.__name__) for cls in check_classes):
+ for cls in check_classes:
+ if not hasattr(classes[cls], method.__name__):
+ raise Exception(
+ 'Function override "%s" not found in superclass: %s\n%s'
+ % (
+ method.__name__,
+ cls,
+ 'File: %s:%s' % (stack[1][1], stack[1][2]),
+ )
+ )
+
+ if not any(hasattr(classes[cls], method.__name__) for cls in check_classes):
+ raise Exception(
+ 'Function override "%s" not found in any superclass: %s\n%s'
+ % (
+ method.__name__,
+ check_classes,
+ 'File: %s:%s' % (stack[1][1], stack[1][2]),
+ )
+ )
+ return method
+
+
+def deprecated(func):
+ """This is a decorator which can be used to mark function as deprecated.
+
+ It will result in a warning being emmitted when the function is used.
+
+ """
+
+ @wraps(func)
+ def depr_func(*args, **kwargs):
+ warnings.simplefilter('always', DeprecationWarning) # Turn off filter
+ warnings.warn(
+ 'Call to deprecated function {}.'.format(func.__name__),
+ category=DeprecationWarning,
+ stacklevel=2,
+ )
+ warnings.simplefilter('default', DeprecationWarning) # Reset filter
+ return func(*args, **kwargs)
+
+ return depr_func
diff --git a/deluge/error.py b/deluge/error.py
new file mode 100644
index 0000000..8705fdf
--- /dev/null
+++ b/deluge/error.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2011 Pedro Algarvio <pedro@algarvio.me>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+
+from __future__ import unicode_literals
+
+
+class DelugeError(Exception):
+ def __new__(cls, *args, **kwargs):
+ inst = super(DelugeError, cls).__new__(cls, *args, **kwargs)
+ inst._args = args
+ inst._kwargs = kwargs
+ return inst
+
+ def __init__(self, message=None):
+ super(DelugeError, self).__init__(message)
+ self.message = message
+
+ def __str__(self):
+ return self.message
+
+
+class DaemonRunningError(DelugeError):
+ pass
+
+
+class InvalidTorrentError(DelugeError):
+ pass
+
+
+class AddTorrentError(DelugeError):
+ pass
+
+
+class InvalidPathError(DelugeError):
+ pass
+
+
+class WrappedException(DelugeError):
+ def __init__(self, message, exception_type, traceback):
+ super(WrappedException, self).__init__(message)
+ self.type = exception_type
+ self.traceback = traceback
+
+ def __str__(self):
+ return '%s\n%s' % (self.message, self.traceback)
+
+
+class _ClientSideRecreateError(DelugeError):
+ pass
+
+
+class IncompatibleClient(_ClientSideRecreateError):
+ def __init__(self, daemon_version):
+ self.daemon_version = daemon_version
+ msg = (
+ 'Your deluge client is not compatible with the daemon. '
+ 'Please upgrade your client to %(daemon_version)s'
+ ) % {'daemon_version': self.daemon_version}
+ super(IncompatibleClient, self).__init__(message=msg)
+
+
+class NotAuthorizedError(_ClientSideRecreateError):
+ def __init__(self, current_level, required_level):
+ msg = ('Auth level too low: %(current_level)s < %(required_level)s') % {
+ 'current_level': current_level,
+ 'required_level': required_level,
+ }
+ super(NotAuthorizedError, self).__init__(message=msg)
+ self.current_level = current_level
+ self.required_level = required_level
+
+
+class _UsernameBasedPasstroughError(_ClientSideRecreateError):
+ def __init__(self, message, username):
+ super(_UsernameBasedPasstroughError, self).__init__(message)
+ self.username = username
+
+
+class BadLoginError(_UsernameBasedPasstroughError):
+ pass
+
+
+class AuthenticationRequired(_UsernameBasedPasstroughError):
+ pass
+
+
+class AuthManagerError(_UsernameBasedPasstroughError):
+ pass
diff --git a/deluge/event.py b/deluge/event.py
new file mode 100644
index 0000000..c5d5ff9
--- /dev/null
+++ b/deluge/event.py
@@ -0,0 +1,324 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""
+Event module.
+
+This module describes the types of events that can be generated by the daemon
+and subsequently emitted to the clients.
+
+"""
+from __future__ import unicode_literals
+
+import six
+
+known_events = {}
+
+
+class DelugeEventMetaClass(type):
+ """
+ This metaclass simply keeps a list of all events classes created.
+ """
+
+ def __init__(cls, name, bases, dct): # pylint: disable=bad-mcs-method-argument
+ super(DelugeEventMetaClass, cls).__init__(name, bases, dct)
+ if name != 'DelugeEvent':
+ known_events[name] = cls
+
+
+class DelugeEvent(six.with_metaclass(DelugeEventMetaClass, object)):
+ """
+ The base class for all events.
+
+ :prop name: this is the name of the class which is in-turn the event name
+ :type name: string
+ :prop args: a list of the attribute values
+ :type args: list
+
+ """
+
+ def _get_name(self):
+ return self.__class__.__name__
+
+ def _get_args(self):
+ if not hasattr(self, '_args'):
+ return []
+ return self._args
+
+ name = property(fget=_get_name)
+ args = property(fget=_get_args)
+
+
+class TorrentAddedEvent(DelugeEvent):
+ """
+ Emitted when a new torrent is successfully added to the session.
+ """
+
+ def __init__(self, torrent_id, from_state):
+ """
+ :param torrent_id: the torrent_id of the torrent that was added
+ :type torrent_id: string
+ :param from_state: was the torrent loaded from state? Or is it a new torrent.
+ :type from_state: bool
+ """
+ self._args = [torrent_id, from_state]
+
+
+class TorrentRemovedEvent(DelugeEvent):
+ """
+ Emitted when a torrent has been removed from the session.
+ """
+
+ def __init__(self, torrent_id):
+ """
+ :param torrent_id: the torrent_id
+ :type torrent_id: string
+ """
+ self._args = [torrent_id]
+
+
+class PreTorrentRemovedEvent(DelugeEvent):
+ """
+ Emitted when a torrent is about to be removed from the session.
+ """
+
+ def __init__(self, torrent_id):
+ """
+ :param torrent_id: the torrent_id
+ :type torrent_id: string
+ """
+ self._args = [torrent_id]
+
+
+class TorrentStateChangedEvent(DelugeEvent):
+ """
+ Emitted when a torrent changes state.
+ """
+
+ def __init__(self, torrent_id, state):
+ """
+ :param torrent_id: the torrent_id
+ :type torrent_id: string
+ :param state: the new state
+ :type state: string
+ """
+ self._args = [torrent_id, state]
+
+
+class TorrentTrackerStatusEvent(DelugeEvent):
+ """
+ Emitted when a torrents tracker status changes.
+ """
+
+ def __init__(self, torrent_id, status):
+ """
+ Args:
+ torrent_id (str): the torrent_id
+ status (str): the new status
+ """
+ self._args = [torrent_id, status]
+
+
+class TorrentQueueChangedEvent(DelugeEvent):
+ """
+ Emitted when the queue order has changed.
+ """
+
+ pass
+
+
+class TorrentFolderRenamedEvent(DelugeEvent):
+ """
+ Emitted when a folder within a torrent has been renamed.
+ """
+
+ def __init__(self, torrent_id, old, new):
+ """
+ :param torrent_id: the torrent_id
+ :type torrent_id: string
+ :param old: the old folder name
+ :type old: string
+ :param new: the new folder name
+ :type new: string
+ """
+ self._args = [torrent_id, old, new]
+
+
+class TorrentFileRenamedEvent(DelugeEvent):
+ """
+ Emitted when a file within a torrent has been renamed.
+ """
+
+ def __init__(self, torrent_id, index, name):
+ """
+ :param torrent_id: the torrent_id
+ :type torrent_id: string
+ :param index: the index of the file
+ :type index: int
+ :param name: the new filename
+ :type name: string
+ """
+ self._args = [torrent_id, index, name]
+
+
+class TorrentFinishedEvent(DelugeEvent):
+ """
+ Emitted when a torrent finishes downloading.
+ """
+
+ def __init__(self, torrent_id):
+ """
+ :param torrent_id: the torrent_id
+ :type torrent_id: string
+ """
+ self._args = [torrent_id]
+
+
+class TorrentResumedEvent(DelugeEvent):
+ """
+ Emitted when a torrent resumes from a paused state.
+ """
+
+ def __init__(self, torrent_id):
+ """
+ :param torrent_id: the torrent_id
+ :type torrent_id: string
+ """
+ self._args = [torrent_id]
+
+
+class TorrentFileCompletedEvent(DelugeEvent):
+ """
+ Emitted when a file completes.
+ """
+
+ def __init__(self, torrent_id, index):
+ """
+ :param torrent_id: the torrent_id
+ :type torrent_id: string
+ :param index: the file index
+ :type index: int
+ """
+ self._args = [torrent_id, index]
+
+
+class TorrentStorageMovedEvent(DelugeEvent):
+ """
+ Emitted when the storage location for a torrent has been moved.
+ """
+
+ def __init__(self, torrent_id, path):
+ """
+ :param torrent_id: the torrent_id
+ :type torrent_id: string
+ :param path: the new location
+ :type path: string
+ """
+ self._args = [torrent_id, path]
+
+
+class CreateTorrentProgressEvent(DelugeEvent):
+ """
+ Emitted when creating a torrent file remotely.
+ """
+
+ def __init__(self, piece_count, num_pieces):
+ self._args = [piece_count, num_pieces]
+
+
+class NewVersionAvailableEvent(DelugeEvent):
+ """
+ Emitted when a more recent version of Deluge is available.
+ """
+
+ def __init__(self, new_release):
+ """
+ :param new_release: the new version that is available
+ :type new_release: string
+ """
+ self._args = [new_release]
+
+
+class SessionStartedEvent(DelugeEvent):
+ """
+ Emitted when a session has started. This typically only happens once when
+ the daemon is initially started.
+ """
+
+ pass
+
+
+class SessionPausedEvent(DelugeEvent):
+ """
+ Emitted when the session has been paused.
+ """
+
+ pass
+
+
+class SessionResumedEvent(DelugeEvent):
+ """
+ Emitted when the session has been resumed.
+ """
+
+ pass
+
+
+class ConfigValueChangedEvent(DelugeEvent):
+ """
+ Emitted when a config value changes in the Core.
+ """
+
+ def __init__(self, key, value):
+ """
+ :param key: the key that changed
+ :type key: string
+ :param value: the new value of the `:param:key`
+ """
+ self._args = [key, value]
+
+
+class PluginEnabledEvent(DelugeEvent):
+ """
+ Emitted when a plugin is enabled in the Core.
+ """
+
+ def __init__(self, plugin_name):
+ self._args = [plugin_name]
+
+
+class PluginDisabledEvent(DelugeEvent):
+ """
+ Emitted when a plugin is disabled in the Core.
+ """
+
+ def __init__(self, plugin_name):
+ self._args = [plugin_name]
+
+
+class ClientDisconnectedEvent(DelugeEvent):
+ """
+ Emitted when a client disconnects.
+ """
+
+ def __init__(self, session_id):
+ self._args = [session_id]
+
+
+class ExternalIPEvent(DelugeEvent):
+ """
+ Emitted when the external ip address is received from libtorrent.
+ """
+
+ def __init__(self, external_ip):
+ """
+ Args:
+ external_ip (str): The IP address.
+ """
+ self._args = [external_ip]
diff --git a/deluge/httpdownloader.py b/deluge/httpdownloader.py
new file mode 100644
index 0000000..b4acd07
--- /dev/null
+++ b/deluge/httpdownloader.py
@@ -0,0 +1,330 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import cgi
+import logging
+import os.path
+import zlib
+
+from twisted.internet import reactor
+from twisted.internet.defer import Deferred
+from twisted.python.failure import Failure
+from twisted.web import client, http
+from twisted.web._newclient import HTTPClientParser
+from twisted.web.error import PageRedirect
+from twisted.web.http_headers import Headers
+from twisted.web.iweb import IAgent
+from zope.interface import implementer
+
+from deluge.common import get_version
+
+log = logging.getLogger(__name__)
+
+
+class CompressionDecoder(client.GzipDecoder):
+ """A compression decoder for gzip, x-gzip and deflate."""
+
+ def deliverBody(self, protocol): # NOQA: N802
+ self.original.deliverBody(CompressionDecoderProtocol(protocol, self.original))
+
+
+class CompressionDecoderProtocol(client._GzipProtocol):
+ """A compression decoder protocol for CompressionDecoder."""
+
+ def __init__(self, protocol, response):
+ super(CompressionDecoderProtocol, self).__init__(protocol, response)
+ self._zlibDecompress = zlib.decompressobj(32 + zlib.MAX_WBITS)
+
+
+class BodyHandler(HTTPClientParser, object):
+ """An HTTP parser that saves the response to a file."""
+
+ def __init__(self, request, finished, length, agent, encoding=None):
+ """BodyHandler init.
+
+ Args:
+ request (t.w.i.IClientRequest): The parser request.
+ finished (Deferred): A Deferred to handle the finished response.
+ length (int): The length of the response.
+ agent (t.w.i.IAgent): The agent from which the request was sent.
+ """
+ super(BodyHandler, self).__init__(request, finished)
+ self.agent = agent
+ self.finished = finished
+ self.total_length = length
+ self.current_length = 0
+ self.data = b''
+ self.encoding = encoding
+
+ def dataReceived(self, data): # NOQA: N802
+ self.current_length += len(data)
+ self.data += data
+ if self.agent.part_callback:
+ self.agent.part_callback(data, self.current_length, self.total_length)
+
+ def connectionLost(self, reason): # NOQA: N802
+ if self.encoding:
+ self.data = self.data.decode(self.encoding).encode('utf8')
+ with open(self.agent.filename, 'wb') as _file:
+ _file.write(self.data)
+ self.finished.callback(self.agent.filename)
+ self.state = u'DONE'
+ HTTPClientParser.connectionLost(self, reason)
+
+
+@implementer(IAgent)
+class HTTPDownloaderAgent(object):
+ """A File Downloader Agent."""
+
+ def __init__(
+ self,
+ agent,
+ filename,
+ part_callback=None,
+ force_filename=False,
+ allow_compression=True,
+ handle_redirect=True,
+ ):
+ """HTTPDownloaderAgent init.
+
+ Args:
+ agent (t.w.c.Agent): The agent which will send the requests.
+ filename (str): The filename to save the file as.
+ force_filename (bool): Forces use of the supplied filename,
+ regardless of header content.
+ part_callback (func): A function to be called when a part of data
+ is received, it's signature should be:
+ func(data, current_length, total_length)
+ """
+
+ self.handle_redirect = handle_redirect
+ self.agent = agent
+ self.filename = filename
+ self.part_callback = part_callback
+ self.force_filename = force_filename
+ self.allow_compression = allow_compression
+ self.decoder = None
+
+ def request_callback(self, response):
+ finished = Deferred()
+
+ if not self.handle_redirect and response.code in (
+ http.MOVED_PERMANENTLY,
+ http.FOUND,
+ http.SEE_OTHER,
+ http.TEMPORARY_REDIRECT,
+ ):
+ location = response.headers.getRawHeaders(b'location')[0]
+ error = PageRedirect(response.code, location=location)
+ finished.errback(Failure(error))
+ else:
+ headers = response.headers
+ body_length = int(headers.getRawHeaders(b'content-length', default=[0])[0])
+
+ if headers.hasHeader(b'content-disposition') and not self.force_filename:
+ content_disp = headers.getRawHeaders(b'content-disposition')[0].decode(
+ 'utf-8'
+ )
+ content_disp_params = cgi.parse_header(content_disp)[1]
+ if 'filename' in content_disp_params:
+ new_file_name = content_disp_params['filename']
+ new_file_name = sanitise_filename(new_file_name)
+ new_file_name = os.path.join(
+ os.path.split(self.filename)[0], new_file_name
+ )
+
+ count = 1
+ fileroot = os.path.splitext(new_file_name)[0]
+ fileext = os.path.splitext(new_file_name)[1]
+ while os.path.isfile(new_file_name):
+ # Increment filename if already exists
+ new_file_name = '%s-%s%s' % (fileroot, count, fileext)
+ count += 1
+
+ self.filename = new_file_name
+
+ cont_type = headers.getRawHeaders(b'content-type')[0].decode()
+ params = cgi.parse_header(cont_type)[1]
+ encoding = params.get('charset', None)
+ response.deliverBody(
+ BodyHandler(response.request, finished, body_length, self, encoding)
+ )
+
+ return finished
+
+ def request(self, method, uri, headers=None, body_producer=None):
+ """Issue a new request to the wrapped agent.
+
+ Args:
+ method (bytes): The HTTP method to use.
+ uri (bytes): The url to download from.
+ headers (t.w.h.Headers, optional): Any extra headers to send.
+ body_producer (t.w.i.IBodyProducer, optional): Request body data.
+
+ Returns:
+ Deferred: The filename of the of the downloaded file.
+ """
+ if headers is None:
+ headers = Headers()
+
+ if not headers.hasHeader(b'User-Agent'):
+ version = get_version()
+ user_agent = 'Deluge/%s (https://deluge-torrent.org)' % version
+ headers.addRawHeader('User-Agent', user_agent)
+
+ d = self.agent.request(
+ method=method, uri=uri, headers=headers, bodyProducer=body_producer
+ )
+ d.addCallback(self.request_callback)
+ return d
+
+
+def sanitise_filename(filename):
+ """Sanitises a filename to use as a download destination file.
+
+ Logs any filenames that could be considered malicious.
+
+ filename (str): The filename to sanitise.
+
+ Returns:
+ str: The sanitised filename.
+ """
+
+ # Remove any quotes
+ filename = filename.strip('\'"')
+
+ if os.path.basename(filename) != filename:
+ # Dodgy server, log it
+ log.warning(
+ 'Potentially malicious server: trying to write to file: %s', filename
+ )
+ # Only use the basename
+ filename = os.path.basename(filename)
+
+ filename = filename.strip()
+ if filename.startswith('.') or ';' in filename or '|' in filename:
+ # Dodgy server, log it
+ log.warning(
+ 'Potentially malicious server: trying to write to file: %s', filename
+ )
+
+ return filename
+
+
+def _download_file(
+ url,
+ filename,
+ callback=None,
+ headers=None,
+ force_filename=False,
+ allow_compression=True,
+ handle_redirects=True,
+):
+ """Downloads a file from a specific URL and returns a Deferred.
+
+ A callback function can be specified to be called as parts are received.
+
+ Args:
+ url (str): The url to download from.
+ filename (str): The filename to save the file as.
+ callback (func): A function to be called when partial data is received,
+ it's signature should be: func(data, current_length, total_length)
+ headers (dict): Any optional headers to send.
+ force_filename (bool): Force using the filename specified rather than
+ one the server may suggest.
+ allow_compression (bool): Allows gzip & deflate decoding.
+
+ Returns:
+ Deferred: The filename of the downloaded file.
+
+ Raises:
+ t.w.e.PageRedirect
+ t.w.e.Error: for all other HTTP response errors
+ """
+
+ agent = client.Agent(reactor)
+
+ if allow_compression:
+ enc_accepted = ['gzip', 'x-gzip', 'deflate']
+ decoders = [(enc.encode(), CompressionDecoder) for enc in enc_accepted]
+ agent = client.ContentDecoderAgent(agent, decoders)
+ if handle_redirects:
+ agent = client.RedirectAgent(agent)
+
+ agent = HTTPDownloaderAgent(
+ agent, filename, callback, force_filename, allow_compression, handle_redirects
+ )
+
+ # The Headers init expects dict values to be a list.
+ if headers:
+ for name, value in list(headers.items()):
+ if not isinstance(value, list):
+ headers[name] = [value]
+
+ return agent.request(b'GET', url.encode(), Headers(headers))
+
+
+def download_file(
+ url,
+ filename,
+ callback=None,
+ headers=None,
+ force_filename=False,
+ allow_compression=True,
+ handle_redirects=True,
+):
+ """Downloads a file from a specific URL and returns a Deferred.
+
+ A callback function can be specified to be called as parts are received.
+
+ Args:
+ url (str): The url to download from.
+ filename (str): The filename to save the file as.
+ callback (func): A function to be called when partial data is received,
+ it's signature should be: func(data, current_length, total_length).
+ headers (dict): Any optional headers to send.
+ force_filename (bool): Force the filename specified rather than one the
+ server may suggest.
+ allow_compression (bool): Allows gzip & deflate decoding.
+ handle_redirects (bool): HTTP redirects handled automatically or not.
+
+ Returns:
+ Deferred: The filename of the downloaded file.
+
+ Raises:
+ t.w.e.PageRedirect: If handle_redirects is False.
+ t.w.e.Error: For all other HTTP response errors.
+ """
+
+ def on_download_success(result):
+ log.debug('Download success!')
+ return result
+
+ def on_download_fail(failure):
+ log.warning(
+ 'Error occurred downloading file from "%s": %s',
+ url,
+ failure.getErrorMessage(),
+ )
+ result = failure
+ return result
+
+ d = _download_file(
+ url,
+ filename,
+ callback=callback,
+ headers=headers,
+ force_filename=force_filename,
+ allow_compression=allow_compression,
+ handle_redirects=handle_redirects,
+ )
+ d.addCallbacks(on_download_success, on_download_fail)
+ return d
diff --git a/deluge/i18n/__init__.py b/deluge/i18n/__init__.py
new file mode 100644
index 0000000..701d2af
--- /dev/null
+++ b/deluge/i18n/__init__.py
@@ -0,0 +1,15 @@
+from .util import (
+ I18N_DOMAIN,
+ get_languages,
+ set_language,
+ setup_mock_translation,
+ setup_translation,
+)
+
+__all__ = [
+ 'I18N_DOMAIN',
+ 'set_language',
+ 'get_languages',
+ 'setup_translation',
+ 'setup_mock_translation',
+]
diff --git a/deluge/i18n/ar.po b/deluge/i18n/ar.po
new file mode 100644
index 0000000..c258fa9
--- /dev/null
+++ b/deluge/i18n/ar.po
@@ -0,0 +1,6147 @@
+# Arabic translation for deluge
+# Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2017-09-03 16:20+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Arabic <ar@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr ""
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr ""
+
+#: deluge/common.py:410
+msgid "K"
+msgstr ""
+
+#: deluge/common.py:411
+msgid "M"
+msgstr ""
+
+#: deluge/common.py:412
+msgid "G"
+msgstr ""
+
+#: deluge/common.py:413
+msgid "T"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr ""
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr ""
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr ""
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
diff --git a/deluge/i18n/ast.po b/deluge/i18n/ast.po
new file mode 100644
index 0000000..6cb59c3
--- /dev/null
+++ b/deluge/i18n/ast.po
@@ -0,0 +1,4653 @@
+# Asturian translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2010-10-03 20:07+0000\n"
+"Last-Translator: Iñigo Varela <malditoastur@gmail.com>\n"
+"Language-Team: Asturian <ast@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Nome del host:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Puertu:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Nome d'usuariu:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Dende:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Habilitáu"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Seleicione una carpeta"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Llugar de descarga</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Velocidá de xuba máxima:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Másimes Conexones:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Puertos de xuba máximos:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Velocidá de descarga máxima:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Anchor de banda</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Parar compartición en proporción:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Esaniciar en proporción"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Arriba"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Abaxo"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Cola</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Opciones"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Etiqueta inválida, carauteres validos:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Etiqueta erma"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "La etiqueta yá esiste"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Etiqueta desconocía"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Torrent desconocíu"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Etiqueta"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "_Opciones d'etiqueta"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "Desanicia_r etiqueta"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_Añader etiqueta"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Opciones d'etiquetes"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Opciones d'etiquetes</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Puertos de xuba:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Velocidá de xuba:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Velocidá de descarga:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Conexones:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Aplicar preferencies máximes por torrent:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Máximu"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Autoxestionáu"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Aplicar preferencies de cola:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Cola"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Mover completaos a:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Aplicar preferencies de la llocalización:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Llocalización"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 llinia por rastreador)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Aplicar automáticamente la etiqueta:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Rastreadores"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Amestar etiqueta"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Amestar etiqueta</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Nome:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Use la barra llateral p'amestar, editar y desaniciar etiquetes. </i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Etiquetes</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Xeneral</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Preferencies</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Llista IP d'Emule (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "Archivu de testu de SafePeer (comprimíu en zip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "Archivu de testu de PeerGuardian (descomprimíu)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Llíder non válidu"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Códigu máxicu non válidu"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Versión non válida"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Llista de bloquéu"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Díes"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Comprebar por una nueva llista cada:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Importar llista de bloquéu al entamu"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+"Descargar l'archivu de llista de bloqueo si ye necesario ya importar "
+"l'archivu."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Verificar descarga ya importalu"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Descargar un nuevu ficheru de llista de bloquéu ya importalu."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Forciar descarga ya importalu."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Preferencies</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Tipu:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Data:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Tamañu del archivu:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Info</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Anunciu correutu"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Anunciu unviáu"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Avisu"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Fallu"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Direición"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Cliente"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Progresu"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Velocidá de descarga"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Velocidá d'unvíu"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrents na cola"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrents na cola"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Illimitada"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Activáu"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Otru ..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Descarga:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Unvíu:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Abaxo"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Arriba"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Afitar velocidá máxima de descarga"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Afitar velocidá máxima de xuba"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torrent completu"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Descargues"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Rede"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Anchor de banda"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Interfaz"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Otres"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Demoniu"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Proxy"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Plugins"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Plugin"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Seleiciona el complementu"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Complementu Eggs"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Nome de ficheru"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Tamañu"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Escueya un ficheru .torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Ficheros torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Tolos ficheros"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Parte"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Rastreador"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Escueye un ficheru"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Escueye una carpeta"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Atroxar ficheru .torrent"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Non coneutáu"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Conexones"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Velocidá de Baxada"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Velocidá de Subida"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Tráficu del protocolu Descarga/Xuba"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "Nodos DHT"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "¡Nun hai conexones entrantes!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Afitar máximu númberu de conexones"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrents"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Dengún"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Ensin etiqueta"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Sirvidor"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Activáu"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Off"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Definir illimitáu"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Escueye un direutoriu al que mover los archivos"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Afitar máximu númberu de biligueres de xuba"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Prioridá"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Detalles:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Nome"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Descargáu"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Xubío"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Collacies/os estendiendo'l archivu"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Collacies/os compartiendo"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Tiempu estimáu"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Rellación"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Disp"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Amestáu"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Ficheru"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Amestar torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Criar torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Editar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Asistente de conexón"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "Vista"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Barra Ferramientes"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "Barra _llateral"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "_Barra d'estáu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "Pest_añes"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "Co_lumnes"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "_Barra llateral"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Amosar _Zero visites"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Amosar ras_treadores"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Aida"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Entrugues frecuentes"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Amestar torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Amésta-y un \"Torrent\""
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Desaniciar torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Esanicia'l \"Torrent\""
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Pausar los torrents seleicionados"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Pausar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Siguir colos torrents seleicionados"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Siguir"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Coloca Esti \"Torrent\" delantre"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Xubir cola"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Alluga Esti \"Torrent\" darrera"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Baxar cola"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Preferencies"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Asistente de conexón"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Estenderexar too"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Non descargar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "Prioridá _normal"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "Prioridá al_ta"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Prioridá _más alta"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Autoxestionáu:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Rangu de semiente:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Tiempu compartíu:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Tiempu activu:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "Estáu del Rastreador"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Disponibilidá:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "Collacies/os compartiendo"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "Collacies/os estendiendo l'archivu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "Peazos"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Tiempu restante estimáu:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "Prósimu Anunciu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "Rellación de datos compartios: baxada/xuba"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Xubío:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Descargao:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Añadíu na data:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Estáu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>Númberu de ficheros:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "Rastreador"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "Tamañu Total"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Nome:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Ruta:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Estáu:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Detalles"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Ficheros"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Pares"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Mover completaos:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Priv&aacute;u"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Priorizar primeru/caberu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_Editar rastreadores"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Opciones"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "¿Esaniciar torrent?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>¿Daveres quier esaniciar el torrent seleicionáu?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>¡El .torrent asociáu sedrá esaniciáu!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>¡La información descargada sedra esaniciada!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Esaniciar torrents seleicionaos"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Nueva versión"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>¡Hai una nueva versión afayaíza!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Versión afayaíza:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Versión autual:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Non amosar esti diálogu nel futuru"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Dir al sitiu web"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Añader un par pola so IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Seleicionar todo"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Pausar too"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Siguir torrents seleicionaos."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Rea_nudar todo"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Amestar torrents"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_Esaniciar"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrents</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Fi_cheros"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Completu"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Compautu"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Asignación d'espaciu</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Velocidá de descarga máxima:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Velocidá de xuba máxima:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Amestar n'estáu de _pausa"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Priorizar primeros/caberos trozos"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Revertir a predeterminaos"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Aplicar a toos"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Amestar URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Dende URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Amestar Infohash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>De Infohash</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Rastreadores:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Criar torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Criar torrent</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Car_peta"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Camín remotu"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Ficheros</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Autor:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Comentarios:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Info"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Comparticiones web"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Tamañu de la parte:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Conseñar como priváu"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Amestar esti torrent a la sesión"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Escribe'l camín remotu"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Camín remotu</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Camín:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Creando torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Atroxar .torrent como"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Atroxar ficheru .torrent</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Torrents na cola"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Amestar torrents na cola</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Amestar torrents automáticamente al coneutase"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "etiqueta"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Amestar par"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Amestar par</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "nome de máquina:puertu"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Amestar equipu"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Asistente de conexón</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Aniciar demoniu llocal"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Coneutar automáticamente al equipu seleicionado al aniciar"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Aniciar localhost automáticamente si ye necesario"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Non amosar esti diálogu al entamu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Descargues</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Auto agregar .torrents de:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Descargar a:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Copia d'archivos .torrent a:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Carpetes</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Usar asignación completa"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Asignación completa reserva suficiente espaciu en discu p'atroxar los datos "
+"d'esta miente previén la fragmentación del discu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Usar Asignación Compauta"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+"Asignación Compauta namái emplega llugar nel discu a midida que lo necesita"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Priorizar primeru y caberu trozu del torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Priorizar primera y cabera parte de los archivos del torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Rede</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Utilizar puertos al debalu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge escoyerá automáticamente un nuevu puertu cada vegada."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Puertu activu:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "A:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Comprobar puertos activos"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Puertos d'entrada</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Puertos de salida</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"El byte TOS definíu na cabecera IP de tol paquete unviáu a compartidores "
+"(incluyendo compartidores web). Espérase un valor hexadecimal."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Byte TOS del compartidor:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Plug and Play Universal"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "Protocolu de mapéu de puertu NAT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Intercambéu de collacios"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery alcuentra pares llocales na so rede"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+"Una tabla hash distribuyía pue meyorar la cantidá de conexones actives."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Extres de rede</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Entrante:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Nivel:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Forciáu\n"
+"Habilitáu\n"
+"Deshabilitáu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Negociáu\n"
+"Fluxu completu\n"
+"Nengún"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Saliente:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Cifrar fluxu dafechu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Encriptación</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Anchu de banda</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Másimos intentos de conexón per segundu:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Másimes conexones half-open:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Velocidá máxima de xuba pa tolos torrents. Use -1 si deseya illimitada."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Velocidá másima de xuba (KB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "Númberu másimu de conexones permitíes. Use -1 si deseya illimitaos."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Conexones másimes:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"La cantidá másima de slots pa tolos torrents. Use -1 si deseya illimitada."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Másimu númberu de puestos de xuba:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Velocidá másima de descarga pa tolos torrents. Use -1 si deseya illimitada."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Velocidá másima de descarga (KB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "inorar llímites na rede llocal"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Sobrecarga d'IP na llende de tasa"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Si ta marcáu, la sobrecarga TCP/IP estimada restaráse de les llendes de la "
+"tasa, pa evitar pasar les llendes col tráficu total."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "Usu global del anchu de banda"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"La cantidá másima de puestos de xuba por torrent. Use -1 si deseya "
+"illimitaos."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"El númberu másimu de conexones por torrent. Use -1 si deseya illimitaes."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "Usu del anchor de banda por torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Interface</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Habilitar"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"EL mou clásicu soverará la mayoría de les funcionalidaes de demoniu y fadrá "
+"apaecer a Deluge como una aplicación individual. Úselu si nun deseya tener "
+"ventaxes d'executar Deluge como un demoniu. Necesita reaniciar Deluge pa "
+"qu'esta preferencia tenga efeutu."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Mou clásicu</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Amosar velocidá na barra de títulu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Ventana principal</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Amosar siempres"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Enfocar el diálogu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Diálogu d'Amestar torrents</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Activa el iconu del sistema na bandexa."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Minimiza pa la bandexa al zarrar"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Abrir minimizáu nel área de notificación"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Protexer con contraseña l'área de notificación"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Ãrea de notificación</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Otru</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Ser avisáu de nueves versiones"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge revisará los nuesos servidores y diráte si hai asoleyada una nueva "
+"versión"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Autualizaciones</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Aidanos a meyorar Deluge unviándonos la so versión de Python, versión de "
+"PyGTK, Sistema Operativu y tipu de procesador. De xuru que nenguna otra "
+"información ye unviada."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Si, unviar estadístiques anónimes"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Información del sistema</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Demoniu</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Puertu del demoniu:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Puertu</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Permitir conexones remotes"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Conexones</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Revisar davezu el sitiu web pa nueves versiones"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Otru</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Cola</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Allugar nuevos torrents al tope de la cola"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Total activos compartiendo:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Total activos:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Total activos descargando:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Non cuntar torrents seles"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Torrents activos</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Llimite de proporción de compartición:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Proporción de tiempu de compartición:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Tiempu de compartición (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Dexa de compartir cuando la proporción de compartición aporte a:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Esaniciar torrent cuando s'algame la proporción compartida"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Compartiendo</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Proxy</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Host:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Nengún\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 (c/autent.)\n"
+"HTTP\n"
+"HTTP (c/autent.)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Par</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Semiente Web</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Rastreador</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Complementos</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Versión:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Páxina principal:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Corréu electrónicu del autor:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Instalar complementu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "Gueta_r complementos"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "Amo_sar Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Reanudar too"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_Llímite de velocidá de descarga"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_Llímite de velocidá de xuba"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Colar y apagar demoniu"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Abrir Carpeta"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "_Siguir"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Opc_iones"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Cola"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "Aut_ualizar el rastreador"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "Esanicia_r torrent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "_Forciar verificación"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "Mover atroxu"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "Llímite de _conexón"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Llímite de puertos de _xuba"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Autoxestionáu"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>¿Desaniciar el torrent escoyíu?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Si desanicies los datos, perderanse permanentemente."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Editar rastreadores"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Editar rastreadores</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Amestar rastreador"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Amestar rastreadores</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Editar rastreador"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Editar rastreador</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Rastreador:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Desaniciar colos _datos"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Desaniciar _Torrent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Mover atroxamientu"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Mover atroxamientuo</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Destín:"
+
+#~ msgid "Details"
+#~ msgstr "Detalles"
+
+#~ msgid "Download"
+#~ msgstr "Baxada"
+
+#~ msgid "Add"
+#~ msgstr "Amestar"
+
+#~ msgid "Remove"
+#~ msgstr "Esborrar"
+
+#~ msgid "Clear"
+#~ msgstr "Llimpiar"
+
+#~ msgid "Availability"
+#~ msgstr "Disponibilidá"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Velocidá:</b>"
+
+#~ msgid "Select All"
+#~ msgstr "Seleicionar too"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Esaniciar ficheru .torrent"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Server"
+#~ msgstr "Servidor"
+
+#~ msgid "Port"
+#~ msgstr "Puertu"
+
+#~ msgid "Username"
+#~ msgstr "Nome d'Usuariu"
+
+#~ msgid "Password"
+#~ msgstr "Contraseña"
+
+#~ msgid "_Quit"
+#~ msgstr "_Colar"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge ta bloquiáu"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge ta protexíu con contraseña.\n"
+#~ "P'amosar la ventana de Deluge, por favor introduza la so contraseña"
+
+#~ msgid "Unknown"
+#~ msgstr "Desconocíu"
+
+#~ msgid "Graph"
+#~ msgstr "Gráficu"
+
+#~ msgid "New Password"
+#~ msgstr "Nueva contraseña"
+
+#~ msgid "Image Only"
+#~ msgstr "Namái imaxe"
+
+#~ msgid "Text and image"
+#~ msgstr "Testu ya imaxe"
+
+#~ msgid "Template"
+#~ msgstr "Plantía"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Escueye una url o un torrent, pero non los dos"
+
+#~ msgid "translate something"
+#~ msgstr "traducir daqué"
+
+#~ msgid "Text Only"
+#~ msgstr "Namái Testu"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "el refrescu tien de ser > 0"
+
+#~ msgid "# Of Files"
+#~ msgstr "# d'archivos"
+
+#~ msgid "Ava"
+#~ msgstr "Afay"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Esaniciar ficheros descargaos"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Auto refrescar:"
+
+#~ msgid "Disable"
+#~ msgstr "Deshabilitar"
+
+#~ msgid "Config"
+#~ msgstr "Config"
+
+#~ msgid "Eta"
+#~ msgstr "T.Est."
+
+#~ msgid "Pieces"
+#~ msgstr "Partes"
+
+#~ msgid "Logout"
+#~ msgstr "Desconeutar"
+
+#~ msgid "Queue Position"
+#~ msgstr "Posición en la cola"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Contraseña non válida, téntelo otra vegada"
+
+#~ msgid "Next Announce"
+#~ msgstr "Siguiente anunciu"
+
+#~ msgid "Pause all"
+#~ msgstr "Pausar too"
+
+#~ msgid "Login"
+#~ msgstr "Coneutase"
+
+#~ msgid "Speed"
+#~ msgstr "Velocidá"
+
+#~ msgid "Submit"
+#~ msgstr "Unviar"
+
+#~ msgid "Set"
+#~ msgstr "Afitar"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Autualizar páx. cada:"
+
+#~ msgid "Resume all"
+#~ msgstr "Reanudar too"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Afitar tiempu d'espera"
+
+#~ msgid "Start"
+#~ msgstr "Entamar"
+
+#~ msgid "Torrent list"
+#~ msgstr "Llista de torrent"
+
+#~ msgid "Reannounce"
+#~ msgstr "Reanunciar"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Xubir torrent"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Total Size"
+#~ msgstr "Tamañu total"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Estáu del rastreador"
+
+#~ msgid "seconds"
+#~ msgstr "segundos"
+
+#~ msgid "Type"
+#~ msgstr "Tipu"
+
+#~ msgid "Disabled"
+#~ msgstr "Deshabilitáu"
+
+#~ msgid "From"
+#~ msgstr "Dende"
+
+#~ msgid "Filters"
+#~ msgstr "Fieltros"
+
+#~ msgid "General"
+#~ msgstr "Xeneral"
+
+#~ msgid "File"
+#~ msgstr "Ficheru"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Conexones másimes"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Priorizar primera y cabera pieza"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Másima velocidá de descarga"
+
+#~ msgid "Save"
+#~ msgstr "Guardar"
+
+#~ msgid "No data"
+#~ msgstr "Ensin datos"
+
+#~ msgid "Ports"
+#~ msgstr "Puertos"
+
+#~ msgid "To"
+#~ msgstr "A"
+
+#~ msgid "Random"
+#~ msgstr "Aleatoriu"
+
+#~ msgid "Extra's"
+#~ msgstr "Extres"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Llinia Principal DHT"
+
+#~ msgid "Level"
+#~ msgstr "Nivel"
+
+#~ msgid "Forced"
+#~ msgstr "Forciáu"
+
+#~ msgid "Encryption"
+#~ msgstr "Cifráu"
+
+#~ msgid "Handshake"
+#~ msgstr "Alcuerdu"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Guardar archivos .torrent en"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Atroxar toles descargues en"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Másima velocidá de descarga (Kib/s)"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Illimitáu"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = illimitáu"
+
+#~ msgid "Move To"
+#~ msgstr "Mover a"
+
+#~ msgid "Button style"
+#~ msgstr "Estilu de los botones"
+
+#~ msgid "Current Password"
+#~ msgstr "Contraseña autual"
+
+#~ msgid "Error in Path."
+#~ msgstr "Erru na ruta"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Nueva contraseña (Confirmar)"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "La contraseña vieya ye inválida"
+
+#~ msgid "Yes"
+#~ msgstr "Sí"
+
+#~ msgid "No"
+#~ msgstr "Non"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Escueya una opción válida. Esa eleición nun ye una de les opciones "
+#~ "disponibles"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Ingrese una llista de valores"
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Escueya una opción valida. %s nun ye una de las opciones válides."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Ingrese un valor válidu"
+
+#~ msgid "This field is required."
+#~ msgstr "Esti campu requierse."
+
+#~ msgid "Enter a number."
+#~ msgstr "Ingrese un númberu"
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Tea xuru que nun hai más que %s díxitos en total."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Ingrese una direición de corréu lletrónicu válida."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Ingrese una data válida."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Tea xuru de que nun hai más que %s llugares decimales."
+
+#~ msgid "Connect"
+#~ msgstr "Coneutar"
+
+#~ msgid "Statistics"
+#~ msgstr "Estadístiques"
+
+#~ msgid "Delete"
+#~ msgstr "Esborrar"
+
+#~ msgid "Move"
+#~ msgstr "Mover"
+
+#~ msgid "Stop"
+#~ msgstr "Detener"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Amestar n'estáu de pausa"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Asignación compauta"
+
+#~ msgid "Download Location"
+#~ msgstr "Llocalización de descarga"
+
+#~ msgid "no uri"
+#~ msgstr "nun hai uri"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Error nes opciones del torrent."
+
+#~ msgid "Per Torrent"
+#~ msgstr "Por torrent"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Máximes Conexones parcialmente abiertes"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Peer-Exchange"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Máximos tentos de conexón per segundu"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr ""
+#~ "Reaniciar demoniu ya interfaz web dempués de camudar estes preferencies"
+
+#~ msgid "Inbound"
+#~ msgstr "Entrante"
+
+#~ msgid "Either"
+#~ msgstr "Cualesquier"
+
+#~ msgid "Outbound"
+#~ msgstr "Saliente"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Amestar carpeta automáticamente"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Total de torrents activos"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Esaniciar torrent cuando s'algame la proporción"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Terminar de compartir cuando s'algame la proporción"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Total de descargues actives"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Complementos habilitaos"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Total de comparticiones actives"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Nueva contraseña nun ye igual a Nueva contraseña (confirmar)"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Estos cambeos foren guardaos"
+
+#~ msgid "Cache templates"
+#~ msgstr "Atroxar en memoria les plantíes"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Tea xuru de qu'esti valor tien máximu %(max)d carauteres (ésti tien "
+#~ "%(length)d)."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Tea xuru de qu'esti valor tien mínimu %(min)d carauteres (ésti tien "
+#~ "%(length)d)."
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Parar semáu en proporción"
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Tea xuru de qu'esti valor seya menor o igual a %s."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Tea xuru de qu'esti valor seya mayor o igual a %s."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Ingrese un númberu enteru"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Correxir los erros d'arriba ya téntelo otra vegada"
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr ""
+#~ "Nengún ficheru foi unviáu. Verifique'l tipu de codificación nel formulariu."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Xuba una imaxe válida. El ficheru qu'unvió nun yera una imaxe o yera una "
+#~ "imaxe defeutuosa."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "EL ficheru unviáu ta ermu."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Nengún ficheru foi unviáu."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Ingrese una hora válida."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Ingrese una data y hora valides."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr ""
+#~ "Tea xuru de que nun heba más de %s díxitos enantes del puntu decimal."
+
+#~ msgid "Recheck"
+#~ msgstr "Verificar"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Queue Top"
+#~ msgstr "Tope de la cola"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Fondu de la cola"
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr ""
+#~ "Seleicione una opción válida. %(value)s nun ye una de les opciones "
+#~ "disponibles."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Esta URL paez ser un vínculo frañau."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Ingrese una URL válida."
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Esta carpeta nun esiste."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Ingrese una direición IPv4 válida."
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "El torrent pasó la proporción de parada."
+
+#~ msgid "Other.."
+#~ msgstr "Otru.."
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Verificar tolos díes"
+
+#~ msgid "BlockList"
+#~ msgstr "BlockList"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Descargando %.2f%%"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Importar al aniciar el demoniu"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Tiempu de tentu de descarga"
+
+#~ msgid "Import Now"
+#~ msgstr "Importar agora"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Tiempu d'espera (segundos)"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Rangos bloquiaos: %s"
+
+#~ msgid "Inactive"
+#~ msgstr "Inactivu"
+
+#~ msgid "Refresh status"
+#~ msgstr "Autualizar estáu"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Importando %s"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "page 6"
+#~ msgstr "páxina 6"
+
+#~ msgid "page 7"
+#~ msgstr "páxina 7"
+
+#~ msgid "page 8"
+#~ msgstr "páxina 8"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Amestar torrents</b></big>"
+
+#~ msgid "From Session"
+#~ msgstr "De sesión"
+
+#~ msgid "Community"
+#~ msgstr "Comunidá"
+
+#~ msgid "FAQ"
+#~ msgstr "FAQ"
+
+#~ msgid "Homepage"
+#~ msgstr "Páxina cabezalera"
+
+#~ msgid "Active time"
+#~ msgstr "Tiempu activu"
+
+#~ msgid "Admin"
+#~ msgstr "Alministrador"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Fieltrar utilizando una pallabra clave"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Coneutar al demoniu"
+
+#~ msgid "Connected to"
+#~ msgstr "Coneutáu a"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : Llista de torrents"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Ingresu a Deluge"
+
+#~ msgid "False"
+#~ msgstr "Falsu"
+
+#~ msgid "Seed rank"
+#~ msgstr "Rangu de compartición"
+
+#~ msgid "Restart"
+#~ msgstr "Reaniciar"
+
+#~ msgid "True"
+#~ msgstr "Braero"
+
+#~ msgid "Seeding time"
+#~ msgstr "Tiempu de compartición"
+
+#~ msgid "Update"
+#~ msgstr "Autualizar"
+
+#~ msgid "Keyword"
+#~ msgstr "Pallabra clave"
+
+#~ msgid "Label torrent"
+#~ msgstr "Etiqueta del torrent"
+
+#~ msgid "Move torrent"
+#~ msgstr "Mover torrent"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Non coneutáu a un demoniu"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Incluyendo %i archivos"
+
+#~ msgid "page 12"
+#~ msgstr "páxina 12"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 10"
+#~ msgstr "páxina 10"
+
+#~ msgid "page 11"
+#~ msgstr "páxina 11"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "Show trackers"
+#~ msgstr "Amosar rastreadores"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "esto inda nun fai un res..\n"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Rellación de datos compartios: baxada/xuba"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Másima velocidá de xuba (Kib/s)"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Puertos máximos de xuba"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Másima velocidá de xuba"
+
+#~ msgid "Upload"
+#~ msgstr "Xuba"
+
+#~ msgid "Files"
+#~ msgstr "Ficheros"
+
+#~ msgid "About"
+#~ msgstr "Tocante a"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "max_download_speed"
+#~ msgstr "max_download_speed"
+
+#~ msgid "apply_max"
+#~ msgstr "apply_max"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Error al axustar opciones d'etiqueta"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "max_upload_slots"
+
+#~ msgid "max_connections"
+#~ msgstr "max_connections"
+
+#~ msgid "apply_queue"
+#~ msgstr "apply_queue"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "is_auto_managed"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "stop_at_ratio"
+
+#~ msgid "stop_ratio"
+#~ msgstr "stop_ratio"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "remove_at_ratio"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "apply_move_completed"
+
+#~ msgid "move_completed"
+#~ msgstr "move_completed"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "max_upload_speed"
+
+#~ msgid "move_completed_path"
+#~ msgstr "move_completed_path"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "auto_add_trackers"
+
+#~ msgid "auto_add"
+#~ msgstr "auto_add"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Trabayu progresando.."
+
+#~ msgid "no label"
+#~ msgstr "ensin etiqueta"
+
+#~ msgid "State"
+#~ msgstr "Estáu"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Esti corréu electrónicu ye pa informate de que Deluge finó la descarga de "
+#~ "%s, qu'inclúi %i ficheros.\n"
+#~ "Pa dexar de recibir estos avisos, namái desactiva la notificación por corréu "
+#~ "nes preferencies de Deluge.\n"
+#~ "\n"
+#~ "Gracies,\n"
+#~ "Deluge"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP con Autorización"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 con Autorización"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Auto añader activáu"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Sobrecarga IP na llende de tasa"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Refrescu automáticu (segundos)"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Amosar gueta de pallabra clave"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Amosar barra llateral"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Amosar cero visites"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... y desaniciar tolos ficheros"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Reaniciar manualmente interfaz web p'aplicar cambeos"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Nun s'alcontró una clave en '%s'"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Nun s'alcontró un certificáu en '%s'"
+
+#~ msgid "Sidebar"
+#~ msgstr "Barra llateral"
+
+#~ msgid "Cancel"
+#~ msgstr "Encaboxar"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Llende de conexón"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "Velocidá llende de descarga"
+
+#~ msgid "Disk Space"
+#~ msgstr "Espaciu en discu"
+
+#~ msgid "Do not download"
+#~ msgstr "Nun descargar"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... y desaniciar el ficheru Torrent"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... y desaniciar los ficheros descargaos"
+
+#~ msgid "From Url"
+#~ msgstr "Dende Url"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Forzar comprobación nueva"
+
+#~ msgid "Ok"
+#~ msgstr "Aceptar"
+
+#~ msgid "Normal priority"
+#~ msgstr "Prioridá normal"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Denguna conexón entrante"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "Velocidá llende de xuba"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Anovar rastreador"
+
+#~ msgid "High priority"
+#~ msgstr "Prioridá Alta"
+
+#~ msgid "Search"
+#~ msgstr "Guetar"
+
+#~ msgid "Highest priority"
+#~ msgstr "Prioridá Máxima"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Llende de biligueres de xuba"
+
+#~ msgid "Test config value"
+#~ msgstr "Probar valor de configuración"
+
+#~ msgid "Stats"
+#~ msgstr "Estadístiques"
+
+#~ msgid "All Finished!"
+#~ msgstr "¡Finó todo!"
+
+#~ msgid "Force Download"
+#~ msgstr "Forciar descarga"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Asistente de configuración Deluge"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr "Este asistente va aidate a configurar Deluge al to gustu."
+
+#~ msgid "Graphs"
+#~ msgstr "Gráfiques"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Semilles/Pares"
+
+#~ msgid "Test config value:"
+#~ msgstr "Probar valor de configuración:"
diff --git a/deluge/i18n/be.po b/deluge/i18n/be.po
new file mode 100644
index 0000000..86a60cc
--- /dev/null
+++ b/deluge/i18n/be.po
@@ -0,0 +1,3922 @@
+# Belarusian translation for deluge
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2009-01-11 20:41+0000\n"
+"Last-Translator: FoBoS <Unknown>\n"
+"Language-Team: Belarusian <be@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "КБ/Ñ"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Ðазва хаÑта:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Порт:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Ð†Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Пароль:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "З:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Уключаны"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Выбраць каталог"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Каталог запампоўкі</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñць раздачы:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць злучÑннÑÑž:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць Ñлотаў раздачы:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñць запампоўкі:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Ðбмежаванні</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Спыніць раздачу на Ñ€Ñйтынгу:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Выдаліць на Ñ€Ñйтынгу"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Чарга</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Ðалады"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Ðбмежаванне хуткаÑці запампоўкі:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Ðбмежаванне хуткаÑці раздачы:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "ÐÐºÑ‚Ñ‹ÑžÐ½Ñ‹Ñ Ñ‚Ð¾Ñ€Ñнты:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Ðбмежаванні</ b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "ÐÑÐ²ÐµÑ€Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ°. Ð”Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ñ‹Ñ Ñімвалы: [a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "ПуÑÑ‚Ð°Ñ Ð¼ÐµÑ‚ÐºÐ°"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Метка ўжо Ñ–Ñнуе"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð¼ÐµÑ‚ÐºÐ°"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "ÐевÑдомы торÑнт"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Метка"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "_Ðалады меткі"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_Выдаліць метку"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_Дадаць метку"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Ðалады меткі"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Ðалады меткі</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Слаты раздачы:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "ХуткаÑць раздачы:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "ХуткаÑць запампоўкі:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "ЗлучÑнні:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "ПрымÑніць макÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹ да кожнага торÑнту"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "МакÑімум"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Ðўтаматычнае кіраванне"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "ПрымÑніць налады чаргі"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Чарга"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "ПерамÑшчаць Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹ Ñž:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "ПрымÑніць налады размÑшчÑннÑ:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "РазмÑшчÑнне"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(кожны Ñ‚Ñ€Ñкер у аÑобным радку)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Ðўтаматычна ўжываць метку:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "ТрÑкеры"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Дадаць метку"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Дадаць метку</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Ðазва:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>ВыкарыÑтоўвайце бакавую панÑль Ð´Ð»Ñ Ð´Ð°Ð´Ð°Ð½Ð½Ñ, Ð²Ñ‹Ð¿Ñ€Ð°ÑžÐ»ÐµÐ½Ð½Ñ Ñ– Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ "
+"метак.</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Меткі</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "РаÑпакаваць у:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Стварыць падкаталог з назвай торÑнту"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"ГÑÑ‚Ð°Ñ Ð½Ð°Ð»Ð°Ð´Ð° дазволіць Ñтварыць падкаталог з назвай торÑнту ўнутры выбранага "
+"каталога Ñ– перамÑÑціць туды раÑÐ¿Ð°ÐºÐ°Ð²Ð°Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>ÐгульныÑ</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Уключыць вÑб-інтÑрфейÑ"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "ВыкарыÑтоўваць SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "ПраÑлухоўваць порт:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Ðалады</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Ð¡Ð¿Ñ–Ñ IP Emule (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Ñ‚ÑкÑÑ‚ (zip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Ñ‚ÑкÑÑ‚ (без ÑціÑку)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "ÐÑправільны пачатак"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "ÐÑправільны адбітак"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "ÐÑÐ¿Ñ€Ð°Ð²Ñ–Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Чорны ÑпіÑ"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL-адраÑ:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Дзён"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "ПравÑраць ÑÐ¿Ñ–Ñ ÐºÐ¾Ð¶Ð½Ñ‹Ñ:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Дабавіць чорны ÑÐ¿Ñ–Ñ Ð¿Ñ€Ñ‹ запуÑку"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Спампаваць файл чорнага ÑпіÑу, калі неабходна, Ñ– дабавіць Ñго."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Праверыць і запампанаваць"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Спампаваць новы файл чорнага ÑпіÑу Ñ– дабавіць Ñго"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "ПрымуÑова Ñпампаваць Ñ– дабавіць"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Чорны ÑÐ¿Ñ–Ñ Ð°Ð¿Ð¾ÑˆÐ½Ñй верÑÑ–Ñ–"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Ðалады</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Тып:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Дата:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Памер файла:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>ІнфармацыÑ</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Запампоўка торÑнту Ñкончана"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "ТорÑнт дададзены"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Выканаць"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "ПадзеÑ"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Загад"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "Дадаць загад"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Загады</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "ÐÐ½Ð¾Ð½Ñ ÑƒÐ´Ð°Ð»Ð° выкананы"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "ÐÐ½Ð¾Ð½Ñ Ð°Ð´Ð¿Ñ€Ð°ÑžÐ»ÐµÐ½Ñ‹"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "ПапÑÑ€Ñджаньне"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Памылка"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "ÐфганіÑтан"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "ÐландÑÐºÑ–Ñ Ð°Ñтравы"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "ÐлбаніÑ"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Ðлжыр"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "УÑходнÑе Самоа"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Ðндора"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Ðнгола"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "ÐнгільÑ"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Ðнтарктыда"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Ðнтыгуа Ñ– Барбуда"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Ðргенціна"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "ÐрменіÑ"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Ðруба"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "ÐÑžÑтраліÑ"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "ÐÑžÑтрыÑ"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Ðзербайджан"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "БагамÑÐºÑ–Ñ Ð°Ñтравы"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "БахрÑйн"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "БангладÑш"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "БарбадаÑ"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "БеларуÑÑŒ"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "БельгіÑ"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "БÑліз"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Бенін"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "БÑÑ€Ð¼ÑƒÐ´Ð·ÐºÑ–Ñ Ð°Ñтравы"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Бутан"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "БалівіÑ"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "БоÑÐ½Ñ–Ñ Ñ– Герцагавіна"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "БатÑвана"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "ВоÑтраў Буве"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "БразіліÑ"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "БрытанÑÐºÐ°Ñ Ñ‚ÑÑ€Ñ‹Ñ‚Ð¾Ñ€Ñ‹Ñ Ñž ІндыйÑкім акіÑне"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "БрунÑй ДаруÑÑалам"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "БалгарыÑ"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Буркіна ФаÑо"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Бурундзі"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Камбоджа"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Камерун"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Канада"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Каба Ð’ÑрдÑ"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Кайманавы аÑтравы"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "ЦÑнтральнаафрыканÑÐºÐ°Ñ Ð ÑÑпубліка"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Чад"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Чылі"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Кітай"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "ВоÑтраў РаÑтва"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "КакоÑÐ°Ð²Ñ‹Ñ Ð°Ñтравы (ÐÑтравы Килинг)"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "КалумбіÑ"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "КаморÑÐºÑ–Ñ Ð°Ñтравы"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Конга"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "ДÑÐ¼Ð°ÐºÑ€Ð°Ñ‚Ñ‹Ñ‡Ð½Ð°Ñ Ð ÑÑпубліка Конга"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "ÐÑтравы Кука"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "КоÑта Рыка"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Кот д'Івуар"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "ХарватыÑ"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Куба"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Кіпр"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "ЧÑшÑÐºÐ°Ñ Ñ€ÑÑпубліка"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "ДаніÑ"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Джыбуці"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Дамініка"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "ДамініканÑÐºÐ°Ñ Ð ÑÑпубліка"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Эквадор"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Егіпет"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "Сальвадор"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "ЭкватарыÑÐ»ÑŒÐ½Ð°Ñ Ð“Ð²Ñ–Ð½ÐµÑ"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "ЭрытрÑÑ"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "ЭÑтоніÑ"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "ЭфіопіÑ"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Ð¤Ð°Ð»ÑŒÐºÐ»ÐµÐ½Ð´Ð·ÐºÑ–Ñ (МальвінÑкіÑ) аÑтравы"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "ФарÑÑ€ÑÐºÑ–Ñ Ð°Ñтравы"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Фіджы"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "ФінлÑндыÑ"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "ФранцыÑ"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "ФранцузÑÐºÐ°Ñ Ð“Ð²Ñ–Ñна"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "ФранцузÑÐºÐ°Ñ ÐŸÐ°Ð»Ñ–Ð½ÐµÐ·Ñ–Ñ"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "ФранцузÑÐºÑ–Ñ ÐŸÐ°ÑžÐ´Ð½Ñ‘Ð²Ñ‹Ñ Ð¢Ñрыторыі"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Габон"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "ГамбіÑ"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "ГрузіÑ"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "ГерманіÑ"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Ð’ÑлікабрытаніÑ"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Гана"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Гібралтар"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "ГрÑцыÑ"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "ГрÑнландыÑ"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "ГрÑнада"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "ГвадÑлупа"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Гуам"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "ГватÑмала"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "ГернÑÑ–"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "ГвінеÑ"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "ГвінеÑ-БіÑаў"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "ГаÑна"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Гаіці"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "ВоÑтраў Херд Ñ– аÑтравы МакДональд"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Ватыкан (ПапÑкі ПаÑад)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "ГандураÑ"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Ганконг"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "ВенгрыÑ"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "ІÑландыÑ"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "ІндыÑ"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "ІнданÑзіÑ"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "ІÑламÑÐºÐ°Ñ Ð ÑÑпубліка Іран"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Ірак"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "ІрландыÑ"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "ВоÑтраў ÐœÑн"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Ізраіль"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "ІталіÑ"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Ямайка"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "ЯпоніÑ"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "ДжÑÑ€ÑÑ–"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "ІарданіÑ"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "КазахÑтан"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "КеніÑ"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Кірыбаці"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "КарÑйÑÐºÐ°Ñ Ðародна-ДÑÐ¼Ð°ÐºÑ€Ð°Ñ‚Ñ‹Ñ‡Ð½Ð°Ñ Ð ÑÑпубліка"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "РÑÑпубліка КарÑÑ"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Кувейт"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "КіргізіÑ"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "ЛаоÑÐºÐ°Ñ Ðародна-ДÑÐ¼Ð°ÐºÑ€Ð°Ñ‚Ñ‹Ñ‡Ð½Ð°Ñ Ð ÑÑпубліка"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "ЛатвіÑ"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Ліван"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "ЛеÑота"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "ЛіберыÑ"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "ЛівійÑÐºÐ°Ñ ÐрабÑÐºÐ°Ñ Ð”Ð¶Ð°Ð¼Ð°Ñ…Ñ–Ñ€Ñ‹Ñ"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "ЛіхтÑнштайн"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Літва"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "ЛюкÑембург"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Макао"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "МакедоніÑ"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "МадагаÑкар"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Малаві"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "МалайзіÑ"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "МальдыўÑÐºÑ–Ñ Ð°Ñтравы"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Малі"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Мальта"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Маршалавы аÑтравы"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Марцініка"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "МаўрытаніÑ"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Маўрыкій"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Маёта"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "МекÑіка"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "ФÑдÑÑ€Ð°Ñ‚Ñ‹ÑžÐ½Ñ‹Ñ Ð¨Ñ‚Ð°Ñ‚Ñ‹ МікранÑзіі"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Малдова"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Манака"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "МанголіÑ"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "ЧарнагорыÑ"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "МанÑÑрат"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Марока"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Мазамбік"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Ðœ'Ñнма"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "ÐамібіÑ"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Ðауру"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "ÐÑпал"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "ÐідÑрланды"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "ÐідÑрландÑÐºÑ–Ñ ÐнтыльÑÐºÑ–Ñ Ð°Ñтравы"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "ÐÐ¾Ð²Ð°Ñ ÐšÐ°Ð»ÐµÐ´Ð¾Ð½Ñ–Ñ"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "ÐÐ¾Ð²Ð°Ñ Ð—ÐµÐ»Ð°Ð½Ð´Ñ‹Ñ"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Ðікарагуа"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Ðігер"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "ÐігерыÑ"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Ðіуе"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "ВоÑтраў Ðорфалк"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "ÐŸÐ°ÑžÐ½Ð¾Ñ‡Ð½Ñ‹Ñ ÐœÐ°Ñ€Ñ‹ÑнÑÐºÑ–Ñ Ð°Ñтравы"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "ÐарвегіÑ"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Ðман"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "ПакіÑтан"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Палау"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "ПалеÑтынÑÐºÐ°Ñ Ñ‚ÑрыторыÑ, акупаванаÑ"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Панама"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Папуа - ÐÐ¾Ð²Ð°Ñ Ð“Ð²Ñ–Ð½ÐµÑ"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Парагвай"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Перу"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Філіпіны"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "ПіткÑрн"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Польшча"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "ПартугаліÑ"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "ПуÑрта Рыка"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Катар"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "РÑюньён"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "РумыніÑ"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "РаÑійÑÐºÐ°Ñ Ð¤ÐµÐ´ÑрацыÑ"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Руанда"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "СÑнт-Бартелеми"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "ВоÑтраў СвÑтой Елены"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "СÑнт-ÐšÑ–Ñ‚Ñ Ñ– ÐÑвіÑ"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "СÑнт-ЛюÑÑ–Ñ"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "СÑнт-Марцін"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "СÑнт-П'ер Ñ– Мікелон"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "СÑнт-ВінÑÑнт Ñ– ГрÑнадзіны"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Самоа"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "Сан-Марына"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Сан-Томе Ñ– ПрынÑыпі"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "СаудаўÑÐºÐ°Ñ ÐравіÑ"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Сенегал"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "СербіÑ"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "СейшÑльÑÐºÑ–Ñ Ð°Ñтравы"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Сьера-ЛеонÑ"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Сінгапур"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "СлавакіÑ"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "СлавеніÑ"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Саламонавы ÐÑтравы"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Самалі"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Паўднёва-ÐфрыканÑÐºÐ°Ñ Ð ÑÑпубліка"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "ÐŸÐ°ÑžÐ´Ð½Ñ‘Ð²Ð°Ñ Ð”Ð¶Ð¾Ñ€Ð´Ð¶Ñ‹Ñ Ñ– ÐŸÐ°ÑžÐ´Ð½Ñ‘Ð²Ñ‹Ñ Ð¡ÑÐ½Ð´Ð²Ñ–Ñ‡Ð°Ð²Ñ‹Ñ Ð²Ñ‹Ñпы"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "ІÑпаніÑ"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Шры-Ланка"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Судан"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Сурынам"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "ШпіцбÑрген Ñ– Ян-Майен"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Свазіленд"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "ШвецыÑ"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "ШвейцарыÑ"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "СірыйÑÐºÐ°Ñ ÐрабÑÐºÐ°Ñ Ð ÑÑпубліка"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "КітайÑÐºÐ°Ñ Ð¿Ñ€Ð°Ð²Ñ–Ð½Ñ†Ñ‹Ñ Ð¢Ð°Ð¹Ð²Ð°Ð½ÑŒ"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "ТаджыкіÑтан"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Ð—Ð»ÑƒÑ‡Ð°Ð½Ð°Ñ Ð ÑÑпубліка ТанзаніÑ"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Тайланд"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "УÑходні Тымор"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Тога"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Такелаў"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Тонга"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Трынідад і Табага"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "ТуніÑ"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "ТурцыÑ"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "ТуркменіÑтан"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "ÐÑтравы ТÑÑ€ÐºÑ Ñ– КайкаÑ"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Тувалу"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Уганда"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Украіна"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Ð—Ð»ÑƒÑ‡Ð°Ð½Ñ‹Ñ ÐрабÑÐºÑ–Ñ Ð­Ð¼Ñ–Ñ€Ð°Ñ‚Ñ‹"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Ð—Ð»ÑƒÑ‡Ð°Ð½Ñ‹Ñ Ð¨Ñ‚Ð°Ñ‚Ñ‹ Ðмерыкі"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Ð—Ð½ÐµÑˆÐ½Ñ–Ñ ÐœÐ°Ð»Ñ‹Ñ ÐÑтравы (ЗШÐ)"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Уругвай"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "УзбекіÑтан"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Вануату"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "ВенеÑуÑла"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "В'етнам"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "ВіргінÑÐºÑ–Ñ Ð°Ñтравы (БрытаніÑ)"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "ВіргінÑÐºÑ–Ñ Ð°Ñтравы (ЗШÐ)"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "ÐÑтравы Ð£Ð¾Ð»Ñ–Ñ Ñ– Футуна"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "ЗаходнÑÑ Ð¡Ð°Ñ…Ð°Ñ€Ð°"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Емен"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "ЗамбіÑ"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "ЗімбабвÑ"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "ÐÑ Ñž Ñеціве"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "У Ñеціве"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Падключаны"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "ДÑман не Ñ–Ñнуе"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "ДÑман не запушчаны"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "ЗапуÑк ÑÑрвера Ñž PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "ÐдраÑ"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Кліент"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Стан"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Запампоўка"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Раздача"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "ТорÑнт"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " ТорÑнты паÑтаўлены Ñž чаргу"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " ТарÑнт паÑтаўлены Ñž чаргу"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Без абмежаваннÑÑž"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Ðктыўна"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Iншае..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Запампоўка"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Раздача"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Запампоўка"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Раздача"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "УÑталÑваць макÑімальную хуткаÑць запампоўкі"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "УÑталÑваць макÑімальную хуткаÑць раздачы"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "ТорÑнт завершаны"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"ГÑтым ліÑтом інфармуем ваÑ, што Deluge Ñкончыў запампоўку %(name)s, ÑÐºÐ°Ñ "
+"ўмÑшчае %(num_files)i файлаў.\n"
+"Каб Ñпыніць атрыманне гÑÑ‚Ñ‹Ñ… паведамленнÑÑž, проÑта адключыце апавÑшчÑнне па "
+"Ñлектроннай пошце Ñž наладах Deluge.\n"
+"\n"
+"ДзÑкуй,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Запампоўкі"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Сеціва"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Ðбмежаванні"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "ІнтÑрфейÑ"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Іншае"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "ДÑман"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "ПрокÑÑ–"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "КÑш"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Модулі"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Модуль"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Выберыце модуль"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Модулі Egg"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Ðазва файла"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Памер"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "ÐÑправільны файл"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "ТорÑнт ўжо Ñ–Ñнуе"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Ð’Ñ‹ не можаце дадаць адзін Ñ– той жа торÑнт двойчы."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Ðемагчыма ÑžÑталÑваць прыÑрытÑÑ‚ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Выберыце файл .torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "ТорÑнт файлы"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "УÑе файлы"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "ÐÑправільны URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Збой запампоўкі"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Узровень"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "ТрÑкер"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Выберыце файл"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Выберыце каталог"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Захаваць файл .torrent"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Ðе падключаны"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "ЗлучÑнні"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "ХуткаÑць запампоўкі"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "ХуткаÑць раздачы"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Трафік пратакола - Запампоўка/Ðддача"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "Вузлы DHT"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Ð£Ð²Ð°Ñ…Ð¾Ð´Ð½Ñ‹Ñ Ð¿Ð°Ð´ÐºÐ»ÑŽÑ‡Ñнні адÑутнічаюць!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць злучÑннÑÑž"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "ТорÑнты"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "ÐдÑутнічае"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Збой Ð´Ð°Ð´Ð°Ð½Ð½Ñ Ñ…Ð¾Ñту"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Ðдключыць клаÑічны Ñ€Ñжым?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Падобна, што дÑман працÑÑу Deluge (deluged) ужо запушчаны.\n"
+"\n"
+"Вам неабходна альбо Ñпыніць дÑман, альбо адключыць КлаÑічны Ñ€Ñжым, каб "
+"працÑгнуць."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Збой загрузкі Ñдра"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"ÐдбыўÑÑ Ð·Ð±Ð¾Ð¹ запуÑку кампанента Ñдра, Ñкі патрабуецца Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ†Ñ‹ Deluge у "
+"клаÑічным Ñ€Ñжыме.\n"
+"\n"
+"ДÑталі глÑдзіце ніжÑй."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr "Збой запуÑку Ñž клаÑічным Ñ€Ñжыме. ПрацÑгнуць, адключыўшы Ñго?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Збой запуÑку дÑмана"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"ÐдбыўÑÑ Ð·Ð±Ð¾Ð¹ пры запуÑку дÑмана. ПаÑпрабуйце запуÑціць Ñго з канÑолі, каб "
+"убачыць памылку."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Укл."
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Ðдкл."
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Ðеабмежавана"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Выберыце каталог Ð´Ð»Ñ Ð¿ÐµÑ€Ð°Ð½Ð¾Ñу файлаў"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "УÑталÑваць макÑімальную колькаÑць Ñлотаў раздачы"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "ПрыÑрытÑÑ‚"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Ð”Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ‹Ñ Ð·Ð²ÐµÑткі:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Ðазва"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Сіды"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Піры"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ЗаÑталаÑÑ"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "РÑйтынг"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "ДаÑтупна"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Даданы"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Файл"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Дадаць торÑнт"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Стварыць торÑнт"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_ЗмÑніць"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "МенеджÑÑ€ _падключÑннÑÑž"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_ТорÑнт"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_ВыглÑд"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "ПанÑль _прыладаў"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Ð‘Ð°ÐºÐ°Ð²Ð°Ñ Ð¿Ð°Ð½Ñль"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Радок _Ñтану"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "_Укладкі"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Калонкі"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "_Ð‘Ð°ÐºÐ°Ð²Ð°Ñ Ð¿Ð°Ð½Ñль"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Паказваць _пуÑÑ‚Ñ‹Ñ Ñлементы"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Паказваць _Ñ‚Ñ€Ñкеры"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Даведка"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "ЧаÑÑ‚Ñ‹Ñ Ð¿Ñ‹Ñ‚Ð°Ð½Ð½Ñ–"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Дадаць торÑнт"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Дадаць торÑнт"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Выдаліць торÑнт"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Прыпыніць Ð²Ñ‹Ð»ÑƒÑ‡Ð°Ð½Ñ‹Ñ Ñ‚Ð¾Ñ€Ñнты"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Паўза"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "ПрацÑгнуць Ð²Ñ‹Ð±Ñ€Ð°Ð½Ñ‹Ñ Ñ‚Ð¾Ñ€Ñнты"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "ПрацÑгнуць"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "ПеранеÑьці торÑнт уверх"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "ВышÑй"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "ПеранеÑьці торÑнт уніз"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "ÐіжÑй"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Ðалады"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Кіраванне злучÑньнÑмі"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Разгарнуць уÑÑ‘"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Ðе запампоўваць"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Звычайны прыÑрытÑÑ‚"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Ð’Ñ‹Ñокі прыÑрытÑÑ‚"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "_ÐайвышÑйшы прыÑрытÑÑ‚"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Ðўтаматычнае кіраванне:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Узровень раздачы:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Ð§Ð°Ñ Ñ€Ð°Ð·Ð´Ð°Ñ‡Ñ‹:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Ð§Ð°Ñ Ð°ÐºÑ‚Ñ‹ÑžÐ½Ð°Ñці:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Стан Ñ‚Ñ€Ñкеру:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>ДаÑтупнаÑць:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Піры</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Піры:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>ЧаÑткі:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>ЗаÑтаецца чаÑу:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>ÐаÑтупны анонÑ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>РÑйтынг:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Ðддадзена:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Запампована:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Дата даданнÑ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Стан"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>ÐпіÑанне:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>КолькаÑць файлаў:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Ð¥Ñш:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>ТрÑкер:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Ðгульны памер:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Ðазва:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>ШлÑÑ…:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Стан:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_ПадрабÑзнаÑьці"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Файлы"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "Піры"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "ПерамÑшчаць завершаныÑ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Прыватны"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "ПрыÑрытÑÑ‚ першай/апошнÑй"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_ЗмÑніць Ñ‚Ñ€Ñкеры"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Ðалады"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Выдаліць торÑнт?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big> <b>Ð’Ñ‹ ўпÑўнены, што жадаеце выдаліць выбраны торÑнт?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>ЗвÑзаны файл .torrent будзе выдалены!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Ð—Ð°Ð¿Ð°Ð¼Ð¿Ð¾Ð²Ð°Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹ будуць выдалены!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Выдаліць вылучаны торÑнт"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>ДаÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>ДаÑÑ‚ÑƒÐ¿Ð½Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>ЦÑперашнÑÑ Ð²ÐµÑ€ÑÑ–Ñ:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Больш не паказваць гÑтае акно"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_ПерайÑці на вÑб-Ñайт"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Дадаць піра па IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Вылучыць уÑе"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Прыпыніць уÑÑ‘"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Ðднавіць Ð²Ñ‹Ð»ÑƒÑ‡Ð°Ð½Ñ‹Ñ Ñ‚Ð¾Ñ€Ñнты."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Ðднавіц_ÑŒ уÑÑ‘"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Дадаць торÑнты"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_СÑылка"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Ð¥Ñш _файлаў"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_Выдаліць"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>ТорÑнты</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "_Файлы"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Поўнае"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Кампактнае"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>РÑзерваванне</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñць запампоўкі:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñць раздачы:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Дадаць у _Ñпыненым Ñтане"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "ПрыÑрытÑÑ‚ у першай/апошнÑй чаÑтак"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Ð’Ñрнуцца да налад па змаўчанню"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "ПрымÑніць да ÑžÑÑ–Ñ…"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Дадаць адраÑ"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>З URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Дадаць Ñ…Ñш файлаў"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>З Ñ…Ñша файлаў</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Ð¥Ñш файлаў"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "ТрÑкеры:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Стварыць торÑнт"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Стварыць торÑнт</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "_Каталог"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Ðддалены шлÑÑ…"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Файлы</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Ðўтар:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Каментарыі:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "ІнфармацыÑ"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Ð’Ñб-Ñіды"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Памер чаÑткі:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "УÑталÑваць ÑьцÑг прыватнаÑьці"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Дадаць гÑÑ‚Ñ‹ торÑнт да ÑеÑÑ–Ñ–"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Калі лаÑка, увÑдзіце аддалены шлÑÑ…"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Ðддалены шлÑÑ…</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "ШлÑÑ…:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "СтварÑнне торÑнту"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Захаваць .torrent Ñк"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Захаваць .torrent файл</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "ТорÑнты Ñž чарзе"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Даданне падпарадкаваных торÑнтаў</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Ðўтаматычна дадаваць торÑнты пры злучÑнні"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "метка"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Дадаць піра"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Дадаць піра</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "назва_вузла:порт"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Дадаць хоÑÑ‚"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Кіраванне злучÑньнÑмі</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_ЗапуÑціць лакальны дÑман"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Ðўтаматычна падлучыцца да выбранага вузлу пры запуÑку"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Ðўтаматычна запуÑціць дÑман, калі Ñ‚Ñ€Ñба"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Ðе паказваць гÑта паведамленне пры запуÑку"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Запампоўкі</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Ðўтаматычна дадаваць .torrent-файлы з:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Запампоўваць у:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "КапіÑваць файлы .torrent Ñž:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Каталогі</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Поўнае"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Поўнае Ñ€Ñзерваванне выдзÑлÑе Ñтолькі меÑца, колькі Ñ‚Ñ€Ñба Ð´Ð»Ñ Ð·Ð°Ð¿Ð°Ð¼Ð¿Ð¾ÑžÐºÑ– "
+"торÑнту, Ñ– прадухілÑе фрагментацию дыÑка"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Кампактнае"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Кампактнае Ñ€Ñзерваванне вылучае меÑца пад торÑнт па неабходнаÑці"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "ПрыÑрытÑÑ‚ у першай Ñ– апошнÑй чаÑтак торÑнта"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "ПрыÑрытÑÑ‚ у першай Ñ– апошнÑй чаÑтак файлаў торÑнта"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Дадаваць торÑнты Ñž Ñпыненым Ñтане"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Сеціва</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "ВыкарыÑтоўваць Ð²Ñ‹Ð¿Ð°Ð´ÐºÐ¾Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ñ‚Ñ‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge кожны раз будзе аўтаматычна выбіраць новы порт."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Ðктыўны порт:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Да:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Праверыць актыўны порт"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Ð£Ð²Ð°Ñ…Ð¾Ð´Ð½Ñ‹Ñ Ð¿Ð°Ñ€Ñ‚Ñ‹</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Ð’Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ñ Ð¿Ð°Ñ€Ñ‚Ñ‹</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"УвÑдзіце IP-Ð°Ð´Ñ€Ð°Ñ Ñ–Ð½Ñ‚ÑрфейÑу Ð´Ð»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ð½Ñ‹Ñ… bittorrent-злучÑннÑÑž. Пакіньце "
+"пуÑтым, калі хочаце выкарыÑтоўваць па змаўчанні."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>ІнтÑрфейÑ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"TOS-байт, Ñкі знаходзіцца Ñž загалоўку IP-пакета, адÑылаецца пірам (уключаючы "
+"вÑб-Ñідаў). ЗначÑнне шаÑнаццатковае."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "TOS-байт піра:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "Пратакол Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ñ‚Ð¾Ñž NAT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Ðбмен пірамі"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery знаходзіць лакальных піраў у вашай Ñетцы."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+"Ð Ð°Ð·Ð¼ÐµÑ€ÐºÐ°Ð²Ð°Ð½Ð°Ñ Ñ…Ñш-табліца (DHT) можа павÑлічыць колькаÑць актыўных злучÑннÑÑž."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Ð”Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ‹Ñ ÑÐµÑ‚ÐºÐ°Ð²Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´ÐºÑ–</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Уваходнае:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Узровень:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"ПрымуÑова\n"
+"Уключана\n"
+"Выключана"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"СінхранізацыÑ\n"
+"УвеÑÑŒ паток\n"
+"Ðдзін з двух"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Выходнае:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Шыфраваць увеÑÑŒ паток"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Шыфраванне</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>ПрапуÑÐºÐ½Ð°Ñ Ð·Ð´Ð¾Ð»ÑŒÐ½Ð°Ñць</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць Ñпробаў злучÑÐ½Ð½Ñ Ñž Ñекунду:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "МакÑімальную колькаÑць паў-адкрытых злучÑннÑÑž:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñць запампоўкі Ð´Ð»Ñ ÑžÑÑ–Ñ… торÑнтаў. Ð”Ð»Ñ Ð½ÐµÐ°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð°Ð¹ "
+"уÑталюйце -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñць раздачы (КБ/Ñ):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+"МакÑімальна Ð´Ð°Ð¿ÑƒÑˆÑ‡Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць злучÑннÑÑž. Ð”Ð»Ñ Ð½ÐµÐ°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð°Ð¹ уÑталюйце -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "МакÑімальную колькаÑць злучÑннÑÑž:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць Ñлотаў раздачы. Ð”Ð»Ñ Ð½ÐµÐ°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð°Ð¹ уÑталюйце -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць Ñлотаў раздачы:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñць прыёму Ð´Ð»Ñ ÑžÑÑ–Ñ… торÑнтаў. Ð”Ð»Ñ Ð½ÐµÐ°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð°Ð¹ уÑталюйце -"
+"1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñць прыёму (КБ/Ñ):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Ігнараваць абмежаванні Ñž лакальнай Ñетцы"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "ÐбмÑжоўваць хуткаÑць з улікам выдаткаў пратаколу IP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Калі ўключана, Ð¿Ñ€Ñ‹Ð±Ð»Ñ–Ð·Ð½Ñ‹Ñ Ð²Ñ‹Ð´Ð°Ñ‚ÐºÑ– TCP/IP улічваюцца абмежавальнікамі "
+"хуткаÑці, каб пазбегнуць перавышÑÐ½Ð½Ñ Ñумарнага трафіку"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>ÐÐ³ÑƒÐ»ÑŒÐ½Ð°Ñ Ð²Ñ‹ÐºÐ°Ñ€Ñ‹Ñтанне канала</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць Ñлотаў Ð´Ð»Ñ Ñ€Ð°Ð·Ð´Ð°Ñ‡Ñ‹ на торÑнт. Ð”Ð»Ñ Ð½ÐµÐ°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð°Ð¹ "
+"уÑталюйце -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць злучÑннÑÑž на торÑнт. Ð”Ð»Ñ Ð½ÐµÐ°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð°Ð¹ уÑталюйце -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>ВыкарыÑтаньне канала на торÑнт</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>ІнтÑрфейÑ</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Уключыць"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"КлаÑічны Ñ€Ñжым адключыць функцыÑнальнаÑць дÑмана Ñ– зробіць Deluge адзінай "
+"праграмай. Уключыце гÑÑ‚Ñ‹ Ñ€Ñжым, калі не выкарыÑтоўваеце перавагі дÑмана. "
+"Змены будуць ÑƒÐ¶Ñ‹Ñ‚Ñ‹Ñ Ð¿Ñ€Ñ‹ наÑтупным запуÑку Deluge."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>КлаÑічны Ñ€Ñжым</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Паказваць хуткаÑць у загалоўку праграмы"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Галоўнае акно</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "ЗаўÑёды адлюÑтроўваць"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Зрабіць дыÑлогавае акно актыўным"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>ДыÑлог Ð´Ð°Ð´Ð°Ð½Ð½Ñ Ñ‚Ð¾Ñ€Ñнта</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Уключыць значок у ÑÑ–ÑÑ‚Ñмным Ñ‚Ñ€ÑÑ–"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Згортваць у воблаÑць апавÑшчÑннÑÑž пры закрыцці"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Згортваць у воблаÑць апавÑшчÑннÑÑž пры запуÑку"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Ðбараніць паролем воблаÑць апавÑшчÑннÑÑž"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>ВоблаÑць апавÑшчÑннÑÑž</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Іншае</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "ÐпавÑшчаць аб выпуÑку новых верÑій"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge будзе правÑраць Ñвае ÑÑрвÑры Ñ– паведаміць, калі даÑтупна абнаўленне"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Ðбнаўленні</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Дапамажыце нам зрабіць Deluge лепшым, адправіўшы верÑÑ–ÑŽ ÑžÑталÑванага Python, "
+"PyGTK, ÐС Ñ– тып працÑÑара. ÐÑ–ÑÐºÐ°Ñ Ñ–Ð½ÑˆÐ°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð½Ðµ адÑылаецца."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "ÐдÑылаць ананімную ÑтатыÑтыку"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð°Ð± ÑÑ–ÑÑ‚Ñме</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "РазмÑшчÑнне:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Калі Deluge не зможа знайÑці базу файлаў па паказаным шлÑху, то Ð´Ð»Ñ "
+"вызначÑÐ½Ð½Ñ ÐºÑ€Ð°Ñ–Ð½Ñ‹ пира будзе выкарыÑтоўвацца DNS."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>База файлаў GeoIP</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "ÐÑацыÑваць magnet ÑÑылкі з Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>ДÑман</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Порт дÑмана:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Порт</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Дазволіць Ð·Ð½ÐµÑˆÐ½Ñ–Ñ Ð·Ð»ÑƒÑ‡Ñнні"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>ЗлучÑнні</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "ПерыÑдычна правÑраць вÑб-Ñайт на наÑўнаÑць аднаўленьнÑÑž"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Іншае</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Чарга</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Дадаваць Ð½Ð¾Ð²Ñ‹Ñ Ñ‚Ð¾Ñ€Ñнты Ñž пачатак чаргі"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "УÑÑго актыўных раздач:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "УÑÑго актыўных:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "УÑÑго актыўных запамповак:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Ðе ўлічваць Ð¿Ð°Ð²Ð¾Ð»ÑŒÐ½Ñ‹Ñ Ñ‚Ð¾Ñ€Ñнты"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>ÐÐºÑ‚Ñ‹ÑžÐ½Ñ‹Ñ Ñ‚Ð¾Ñ€Ñнты</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Ðбмежаванне Ñ€Ñйтынгу раздачы:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "КаÑфіцыент чаÑу раздачы:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "ПрацÑглаÑць раздачы (хвілін)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Спыніць раздачу пры Ñ€Ñйтынгу:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Выдаліць торÑнт, калі Ñ€Ñйтынг даÑÑгне гÑтага значÑннÑ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Раздача</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>ПрокÑÑ–</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "ХоÑÑ‚:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"ÐÑма\n"
+"Socks v4\n"
+"Socks v5\n"
+"Socks v5 (з аўтарызацыÑй)\n"
+"HTTP\n"
+"HTTP (з аўтарызацыÑй)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Пір</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "b>Ð’Ñб-Ñід</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>ТрÑкер</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>КÑш</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Памер кÑшу (у блоках па 16 КБ):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Ð§Ð°Ñ (у Ñекундах) ад апошнÑга кÑшыраваннага запіÑу чаÑткі Ñž кÑше запіÑу да "
+"таго, Ñк прымуÑова Ñкідаць кÑш гÑтай чаÑткі на дыÑк. Па змаўчанні 60 Ñекунд."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Ð§Ð°Ñ Ð¶Ñ‹Ñ†Ñ†Ñ ÐºÑшу (Ñекунд):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"КолькаÑць блокаў па 16 КБ, запіÑаных на дыÑк з моманту пачатку ÑеÑÑ–Ñ–."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Блокаў запіÑана:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"ÐÐ³ÑƒÐ»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць выкананых аперацый запіÑу з моманту запуÑку ÑеÑÑ–Ñ–."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Ðперацый запіÑу:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"СуадноÑнаÑць (блокаў_запіÑана - аперацый_запіÑу) / блокаў_запіÑана "
+"прадÑтаўлÑе ÑуадноÑнаÑць колькаÑці захаваных аперацый запіÑу да Ñ–Ñ… агульнай "
+"колькаÑці, г.зн. ÑфектыўнаÑць кÑша запіÑу."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "ПрацÑнт Ñ‚Ñ€Ð°Ð¿Ð»ÐµÐ½Ð½Ñ Ñž кÑш:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>ЗапіÑ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"КолькаÑць блокаў, запытаных рухавіком BitTorrent (ад піраў) Ñ– Ñчытаных з "
+"дыÑка ці з кÑшу."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Блокаў Ñчытана:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "КолькаÑць блокаў, Ñчытаных з кÑшу."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "Счытана блокаў з кÑшу:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "КаÑфіцыент ÑфектыўнаÑці кÑшу ÑчытываннÑ."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "ПрацÑнт ÑÑ‡Ñ‹Ñ‚Ñ‹Ð²Ð°Ð½ÑŒÐ½Ñ Ð· кÑшу:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+"ÐÐ³ÑƒÐ»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць аперацый ÑчытывааннÑ, выкананых з пачатку гÑтай ÑеÑÑ–Ñ–."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Ðперацый ÑчытываннÑ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Счытыванне</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"КолькаÑць блокаў па 16 КБ, ÑÐºÑ–Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð·Ñцца зараз у дыÑкавым кÑше. Уключае "
+"кÑш ÑÑ‡Ñ‹Ñ‚Ñ‹Ð²Ð°Ð½Ð½Ñ Ñ– запіÑу."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Памер кÑша:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Памер кÑша ÑчытываннÑ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Памер</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>СтатуÑ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Модулі</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "ВерÑÑ–Ñ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "ХатнÑÑ Ñтаронка:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Email аўтара:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_УÑталÑваць модуль"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Ðбнавіць модулі"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_ЗнайÑці ÑÑˆÑ‡Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ–"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "Паказать Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "Ðд_навіць уÑÑ‘"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "ПеранеÑьці _файлы"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "Ðбмежаванне хуткаÑці _запампоўкі"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "ВыйÑці Ñ– Ñпыніць дÑман"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Ðдкрыць каталог"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "_Ðднавіць"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "_Ðалады"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Чарга"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Ðбнавіць Ñ‚Ñ€Ñкер"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Выдаліць торÑнт"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "Пераправерыць файлы"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "ПеранеÑьці _файлы"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "_Ðбмежаванне злучÑннÑÑž"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Ðбмежаванне Ñлотаў раз_дачы"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Ðўтаматычнае кіраванне"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Выдаліць вылучаны торÑнт?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð±ÑƒÐ´Ð·Ðµ незваротна выдалена."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "ЗмÑніць Ñ‚Ñ€Ñкеры"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>ЗмÑніць Ñ‚Ñ€Ñкеры</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Дадаць Ñ‚Ñ€Ñкер"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Дадаць Ñ‚Ñ€Ñкеры</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "ЗмÑніць Ñ‚Ñ€Ñкер"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>ЗмÑніць Ñ‚Ñ€Ñкер</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "ТрÑкер:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Выдаліць з _файламі"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Выдаліць _торÑнт"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "ПерамÑÑціць файлы"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>ПерамÑÑціць файлы</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "ПрызначÑнне:"
+
+#~ msgid "Graphs"
+#~ msgstr "Графікі"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "гÑта пакуль нічога не робіць...\n"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "ÐÑправільны URL - %s."
+
+#~ msgid "Downloading.."
+#~ msgstr "Запампоўка..."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Збой запампоўкі : %s"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Ð”Ð»Ñ Ð¿Ñ€Ð°Ñ†Ñгу ўвÑдзіце пароль</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge абаронены паролем!</big></b"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Ðе падключаны..."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "ГÑÑ‚Ð°Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ð° з'ÑўлÑецца Ñвабодным праграмным забеÑпÑчÑннем; вы можаце "
+#~ "раÑпаўÑюджваць Ñго Ñ–/або мадыфікаваць Ñе Ñž адпаведнаÑці з умовамі GNU "
+#~ "General Public License, апублікаванай Фондам Свабоднага Праграмнага "
+#~ "забеÑпÑчÑннÑ; альбо верÑÑ–Ñ– 3, альбо (па вашаму выбару) любой больш познÑй "
+#~ "верÑÑ–Ñ–. ГÑÑ‚Ð°Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ð° раÑпаўÑюджваецца Ñž надзеі, што Ñна будзе карыÑнай, "
+#~ "але без Ñкіх-небудзь ГÐРÐÐТЫЙ, нават без пÑўных гарантый КÐМЕРЦЫЙÐÐЙ "
+#~ "каштоўнаÑці або ПРЫДÐТÐÐСЬЦІ Ð´Ð»Ñ Ð¿Ñўнай мÑÑ‚Ñ‹. ГлÑдзіце GNU General Public "
+#~ "License Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆ падрабÑзнай інфармацыі. Ð’Ñ‹ павінны былі атрымаць копію GNU "
+#~ "General Public License разам з гÑтай праграмай, калі не, гл. "
+#~ "<http://www.gnu.org/licenses>. ÐÐºÑ€Ð°Ð¼Ñ Ñ‚Ð°Ð³Ð¾, у ÑкаÑці адмыÑловага выключÑннÑ, "
+#~ "праваўладальнікі даюць дазвол на ÑувÑзь кода чаÑтак гÑтай праграмы з "
+#~ "бібліÑÑ‚Ñкай OpenSSL. Ð’Ñ‹ павінны прытрымлівацца GNU General Public License "
+#~ "пры выкарыÑтанні любога кода гÑтай праграмы, не звÑзанага з бібліÑÑ‚Ñкай "
+#~ "OpenSSL. Калі вы зьмÑніце файл(Ñ‹) з улікам гÑтага выключÑннÑ, вы можаце "
+#~ "перанеÑці Ñго Ñ– на вашу верÑÑ–ÑŽ файла(аў), але вы не абавÑзаны гÑта рабіць. "
+#~ "Калі вы не жадаеце гÑтага рабіць, выдаліце гÑта выключÑнне з вашай верÑÑ–Ñ–. "
+#~ "Калі вы выдаліце гÑта выключÑнне з уÑÑ–Ñ… зыходных файлаў у праграме, то "
+#~ "выдаліце Ñго Ñ– тут."
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "УмÑшчае %i файлаў"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "Filters"
+#~ msgstr "Фільтры"
+
+#~ msgid "no label"
+#~ msgstr "без меткі"
+
+#~ msgid "State"
+#~ msgstr "Стан"
+
+#~ msgid "Other.."
+#~ msgstr "Іншае..."
+
+#~ msgid "Homepage"
+#~ msgstr "ХатнÑÑ Ñтаронка"
+
+#~ msgid "Community"
+#~ msgstr "СупольнаÑць"
+
+#~ msgid "FAQ"
+#~ msgstr "Пытанні і адказы"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>ХуткаÑць:</b>"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "_Quit"
+#~ msgstr "В_ыхад"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "page 6"
+#~ msgstr "Ñтаронка 6"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 7"
+#~ msgstr "Ñтаронка 7"
+
+#~ msgid "page 8"
+#~ msgstr "Ñтаронка 8"
+
+#~ msgid "page 10"
+#~ msgstr "Ñтаронка 10"
+
+#~ msgid "page 11"
+#~ msgstr "Ñтаронка 11"
+
+#~ msgid "page 12"
+#~ msgstr "Ñтаронка 12"
diff --git a/deluge/i18n/bg.po b/deluge/i18n/bg.po
new file mode 100644
index 0000000..64416ab
--- /dev/null
+++ b/deluge/i18n/bg.po
@@ -0,0 +1,4664 @@
+# Bulgarian translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2009-11-07 14:34+0000\n"
+"Last-Translator: Hristo Numerov <hristo.num@gmail.com>\n"
+"Language-Team: Bulgarian <bg@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Спиране на Ñийдването при доÑтигане на Ñъотношение:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Премахване при доÑтигане на Ñъотношение"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Опции на етикети"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Опции на етикети<b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Потвърди по торент за макÑимум връзки:"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Приложи наÑтройки за опашката"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Приложи наÑтройки за мÑÑтото:"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(един ред за вÑеки тракер)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Ðвтоматично приложи етикет:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Тракери"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Използвай Ñтраничната колона за добавÑне, редактиране и премахване на "
+"етикети. <i>\n"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>ОÑновни</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "ИзтеглениÑ"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "КБ/Ñек"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Име на хоÑÑ‚:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Порт:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "ПотребителÑко име:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Парола:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "От:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Включено"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "ÐаÑтройки"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Изберете Папка"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>ÐœÑÑто за изтеглÑнето</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "МакÑимална ÑкороÑÑ‚ на качване:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "МакÑимален брой връзки:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "МакÑ. меÑта за качване:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "МакÑимална ÑкороÑÑ‚ на изтеглÑне:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>СкороÑÑ‚ на връзката</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Горе"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Ðай-долу"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Опашка</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "ÐаÑтройки"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Лимит за ÑвалÑне:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Лимит за качване:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Ðктивни торенти:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Ðеправилен етикет, разрешените Ñимволи Ñа a-z, 0-9, _ и -"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Празен етикет"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Етикетът вече ÑъщеÑтвува"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Ðепознат еткет"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Ðепознат торент"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Етикет"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "_ÐаÑтройки на етикет"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_Премахване на етикет"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_ДобавÑне на етикет"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Слотове за качване:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "СкороÑÑ‚ на качване:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "СкороÑÑ‚ на изтеглÑне:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Връзки:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "МакÑимално"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Ðвтоматично управление"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Опашка"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "ПремеÑтване на приключилите в:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "МеÑтоположение"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "ДобавÑне на етикет"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>ДобавÑне на етикет</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Име:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Етикети</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Извличане в:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Създаване на под-папка Ñ Ð¸Ð¼ÐµÑ‚Ð¾ на торента"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Това ще Ñъздаде под-папка Ñ Ð¸Ð¼ÐµÑ‚Ð¾ на торента в избраната папка и ще поÑтави "
+"извлечените файлове в неÑ."
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Включи уеб интерфейÑÑŠÑ‚"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Включи SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Порт:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>ÐаÑтройки</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "IP-ÑпиÑък от Emule (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer, текÑÑ‚ (компреÑиран)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian, текÑÑ‚ (некомпреÑиран)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (компреÑиран Ñ GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Ðеправилно начало"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Ðеправилен магичеÑки код"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Ðеправилна верÑиÑ"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Черен ÑпиÑък"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Дни"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Проверка за нов ÑпиÑък на вÑеки:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Приложи ÑпиÑъка Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð°Ð½Ð¸ при Ñтартиране"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Свали ÑпиÑъка Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð°Ð½Ð¸, при необходимоÑÑ‚, и добави файла."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Проверка на изтегленото и внаÑÑне"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Изтегли нов ÑпиÑък в блокирани адреÑи и го зареди."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Принудително изтеглÑне и внаÑÑне"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "СпиÑъкът Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð°Ð½Ð¸ адреÑи е актуален"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>ÐаÑтройки</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Вид:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Дата:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Размер на файла:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Данни</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Торентът е завършен"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Торентът е добавен"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Изпълни"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Събитие"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Команда"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Добави команда</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Команди</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "УÑпешно обÑвÑване"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "ОбÑвлението е изпратено"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Внимание"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Грешка"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "ÐфганиÑтан"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "ÐйландÑки ОÑтрови"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "ÐлбаниÑ"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Ðлжир"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "ÐмериканÑка Самоа"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Ðндора"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Ðнгола"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Ðнгила"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Ðнтарктида"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Ðнтигуа и Барбуда"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Ðржентина"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "ÐрмениÑ"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Ðруба"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "ÐвÑтралиÑ"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "ÐвÑтриÑ"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Ðзербейджан"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "БахамÑки оÑтрови"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Бахрейн"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Бангладеш"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "БарбадоÑ"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "БеларуÑ"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "БелгиÑ"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Белийз"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Бенин"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "БермудÑки оÑтрови"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Бутан"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "БоливиÑ"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "БоÑна и Херцеговина"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "БотÑвана"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "ОÑтров Буве"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "БразилиÑ"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "БританÑка Ñ‚ÐµÑ€Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð² ИндийÑÐºÐ¸Ñ Ð¾ÐºÐµÐ°Ð½"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Бруней ДареÑÑалам"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "БългариÑ"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Буркина ФаÑо"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Бурунди"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Камбоджа"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Камерун"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Канада"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Капо Верде"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Кайманови оÑтрови"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "ЦентралноафриканÑка Република"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Чад"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Чили"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Китай"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Коледни оÑтрови"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "КокоÑови оÑтрови"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "КолумбиÑ"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "КоморÑки оÑтрови"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Конго"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Демократична република Конго"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "ОÑтрови Кук"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "КоÑта Рика"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "БрÑг на Ñлоновата коÑÑ‚"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "ХърватÑка"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Куба"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Кипър"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Чешка република"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "ДаниÑ"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Джибути"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Доминика"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "ДоминиканÑка република"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Еквадор"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Египет"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "Ел Салвадор"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Екваториална ГвинеÑ"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "ЕритреÑ"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "ЕÑтониÑ"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "ЕтиопиÑ"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "ФолклендÑки ОÑтрови (Малвини)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "ФарьорÑки оÑтрови"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Фиджи"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "ФинландиÑ"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "ФранциÑ"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "ФренÑка Гвиана"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "ФренÑка ПолинезиÑ"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "ФренÑки южни територии"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Габон"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "ГамбиÑ"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "ГрузиÑ"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "ГерманиÑ"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "ВеликобританиÑ"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Гана"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Гибралтар"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "ГърциÑ"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "ГренландиÑ"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Гренада"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Гваделупа"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Гуам"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Гватемала"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "ГърнÑи"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "ГвинеÑ"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "ГвинеÑ-БиÑау"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "ГаÑна"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Хаити"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "ОÑтрови Хърд и МакДоналд"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Ватикана"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "ХондураÑ"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Хонг Конг"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "УнгариÑ"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "ИÑландиÑ"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "ИндиÑ"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "ИндонезиÑ"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Иран, ИÑлÑмÑка република"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Ирак"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "ИрландиÑ"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "ОÑтров Ман"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Израел"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "ИталиÑ"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Ямайка"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "ЯпониÑ"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "ДжърÑи (оÑтров)"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "ЙорданиÑ"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "КазахÑтан"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "КениÑ"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Кирибати"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "КореÑ, Демократична народна република"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "КореÑ, Република"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Кувейт"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "КиргизÑтан"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "ЛаоÑка народнодемократична република"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "ЛатвиÑ"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Ливан"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "ЛеÑото"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "ЛибериÑ"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "ЛибийÑка ÐрабÑка ДжамахириÑ"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Лихтенщайн"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Литва"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "ЛюкÑембург"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Макао"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "МакедониÑ"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "МадагаÑкар"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Малави"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "МалайзиÑ"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "МалдивÑки оÑтрови"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Мали"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Малта"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Маршалови оÑтрови"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Мартиника"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "МавританиÑ"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Мавриций"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Майот"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "МекÑико"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "МикронезиÑ"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Молдова"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Монако"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "МонголиÑ"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Черна гора"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "МонÑерат"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Мароко"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Мозамбик"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Мианмар"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "ÐамибиÑ"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Ðауру"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Ðепал"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "ХоландиÑ"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "ХоландÑки Ðнтили"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Ðова КаледониÑ"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Ðова ЗеландиÑ"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Ðикарагуа"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Ðигер"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "ÐигериÑ"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Ðиуе"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "ОÑтров Ðорфолк"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Северни МарианÑки оÑтрови"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "ÐорвегиÑ"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Оман"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "ПакиÑтан"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Палау"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "ПалеÑтинÑка териториÑ, Окупирана"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Панама"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Папуа Ðова ГвинеÑ"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Парагвай"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Перу"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Филипини"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "ОÑтрови Питкерн"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Полша"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "ПортугалиÑ"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Пуерто Рико"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Катар"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Реюнион"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "РумъниÑ"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "РуÑка ФедерациÑ"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Руанда"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Сен Бартелми"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Света Елена"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Сейнт ÐšÐ¸Ñ‚Ñ Ð¸ ÐевиÑ"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Сейнт ЛуÑиÑ"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Сен Мартен"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Сен Пиер и Микелон"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Сейнт ВинÑънт и Гренадини"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Самоа"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "Сан Марино"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Сао Томе и ПринÑипи"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "СаудитÑка ÐрабиÑ"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Сенегал"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "СърбиÑ"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Сейшели"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Сиера Леоне"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Сингапур"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "СловакиÑ"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "СловениÑ"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Соломонови оÑтрови"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "СомалиÑ"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Република Южна Ðфрика"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Южна Ð”Ð¶Ð¾Ñ€Ð´Ð¶Ð¸Ñ Ð¸ Южни Сандвичеви оÑтрови"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "ИÑпаниÑ"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Шри Ланка"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Судан"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Суринам"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Шпицберген и Ян Майен"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Свазиленд"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "ШвециÑ"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "ШвейцариÑ"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "СирийÑка ÐрабÑка Република"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Тайван, КитайÑка провинциÑ"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "ТаджикиÑтан"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "ТанзаниÑ"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Тайланд"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Източен Тимор"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Того"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Токелау"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Тонга"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Тринидад и Тобаго"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "ТуниÑ"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "ТурциÑ"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "ТуркмениÑтан"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Ð¢ÑŠÑ€ÐºÑ Ð¸ КайкоÑ"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Тувалу"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Уганда"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Украйна"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Обединени ÐрабÑки ЕмирÑтва"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Съединени ÐмерканÑки Щати"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Малки далечни оÑтрови на СÐЩ"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Уругвай"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "УзбекиÑтан"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Вануату"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Венецуела"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Виетнам"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "БританÑки ВирджинÑки оÑтрови"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "ÐмериканÑки ВирджинÑки оÑтрови"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Ð£Ð¾Ð»Ð¸Ñ Ð¸ Футуна"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Западна Сахара"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Йемен"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "ЗамбиÑ"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Зимбабве"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Изключен"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Включен"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Свързан"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Демон-уÑлугата не ÑъщеÑтвува"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Демона не Ñе изпълнÑва"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "ÐдреÑ"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Клиент"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Ðапредък"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "СвалÑне"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Качване"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Торент"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " торента на опашката"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " торент на опашката"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Ðеограничено"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Включено"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Друго..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "ИзтеглÑне:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Качване:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Ðадолу"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Ðагоре"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Зададена макÑимална ÑкороÑÑ‚ на изтеглÑне"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Зададена макÑимална ÑкороÑÑ‚ на качване"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Торентът е приключен"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Получавате този емейл, защото Deluge приключи изтеглÑнето на %(name)s , "
+"който включва %(num_files)i файла.\n"
+"За да Ñпрете изпращането на тези пощи, изключете емейл нотификациÑта в "
+"преференциите на Deluge.\n"
+"\n"
+"Поздрави,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Мрежа"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "СкороÑÑ‚ на връзката"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "ИнтерфейÑ"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Друго"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Демон"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "ПоÑредник"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Кеш-памет"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "ПриÑтавки"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "ПриÑтавка"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Изберете приÑтавката"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "ИнÑталатори (eggs) на приÑтавки"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Име на файл"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Размер"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Ðевалиден файл"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Дублиран торент"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Ðе можете да добавÑте два пъти един и Ñъщ торент."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "ÐеуÑпешно задаване на файлов приоритет!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Избор на торент-файл"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Торент-файлове"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Ð’Ñички файлове"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Ðевалиден URL адреÑ"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "ИзтеглÑнето неуÑпешно"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Редица"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Тракер"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Изберете файл"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Изберете папка"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Запазване на торент-файла"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "ÐÑма връзка"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Връзки"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "ÑкороÑÑ‚ на ÑвалÑне"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "ÑкороÑÑ‚ на качване"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Трафик от протокола"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "Възли на DHT"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "ÐÑма входÑщи връзки!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Зададен макÑимален брой връзки"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Торенти"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Етикети"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "ИзтеглÑне"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "РазпръÑкване"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Ðа пауза"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Проверка"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "Ðа опашка"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Без"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Без етикет"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "ХоÑÑ‚"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Изключване на КлаÑичеÑкиÑÑ‚ режим?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Изглежда Deluge демона (deluged) вече е Ñтартиран.\n"
+"\n"
+"Или Ñ‚Ñ€Ñбва да го Ñпрете или да изключите КлаÑичеÑÐºÐ¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼ за да продължите."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Грешка при зареждане на Ñдрото"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Грешка при зареждане на демона"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"Грешка при зареждане процеÑа на демона. Опитайте да го заредите от команден "
+"ред, за да видите Ñъобщението за грешка."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Вкл"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Изкл."
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Без ограничение"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Изберете папка, в коÑто да Ñе премеÑÑ‚ÑÑ‚ файловете"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Зададен макÑимален брой меÑта за качване"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "ВажноÑÑ‚"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "ПодробноÑти:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Име"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Изтеглено"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Качени"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Качв."
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Потр."
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ОÑтава"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Съотн."
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Ðалично"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Добавено"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Файл"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_ДобавÑне на торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Създаване на торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Редактиране"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Управление на връзките"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "П_реглед"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "Лента Ñ _инÑтрументи"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Странична лента"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Лента за ÑÑŠÑ_тоÑнието"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "_Подпрозорци"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Колони"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "Страни_чна лента"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Показване торентите _без трафик"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Показване на _Ñървърите"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Помощ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "ЧеÑто задавани въпроÑи"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "ДобавÑне на торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "ДобавÑне на торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Премахване на торента"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Премахване на торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Спиране на пауза на избраните торенти"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Спиране"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "ВъзобновÑване на избраните торенти"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Продължаване"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Ðагоре в опашката"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Ðагоре в опашката"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Ðадолу в опашката"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Ðадолу в опашката"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "ÐаÑтройки"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Управление на връзките"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "РазширÑване на _вÑички"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "Да _не Ñе изтеглÑ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Ðормален приоритет"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_ВиÑок приоритет"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Ðа_й-виÑок приоритет"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Ðвтомат. управл.:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Ранг разпръÑкване:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>РазпръÑкване:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Включено:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>СъÑтоÑние на ÑледÑÑ‰Ð¸Ñ Ñървър:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>ÐаличноÑÑ‚:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Потребители:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Качващи:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Парчета:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>ОÑтаващо време:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Следващо обÑвÑване:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Коеф. на ÑподелÑне:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Качено:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Изтеглено:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Добавено на:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_СъÑтоÑние"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Коментари:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>Брой файлове:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Хеш-код:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>СледÑщ Ñървър:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Общ размер:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Име:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Път:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>СъÑтоÑние:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "По_дробноÑти"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Файлове"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Потребители"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "ПремеÑтване на готовите в:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Лично"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Първо началото и краÑ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_Редактиране на ÑледÑщите Ñървъри"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_ÐаÑтройки"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Да Ñе премахне ли торентът?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>ÐаиÑтина ли иÑкате да премахнете Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ñ€ÐµÐ½Ñ‚?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>Съответните торент-файлове ще бъдат изтрити!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Изтеглените данни ще бъдат изтрити!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Премахване на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ñ€ÐµÐ½Ñ‚"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Ðова верÑиÑ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Има нова верÑиÑ!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Ðалична верÑиÑ:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Текуща верÑиÑ:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Да не Ñе показва този прозорец за в бъдеще"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "Отиване на _уеб-Ñтраницата"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "ДобавÑне на потребител по IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "Избиране на _вÑички"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Спиране на вÑички"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "ВъзобновÑване на избраните торенти."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Продължаване на _вÑички"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "ДобавÑне на торенти"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "П_ремахване"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Торенти</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "_Файлове"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Пълно"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Компактно"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Запълване</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "МакÑ. ÑкороÑÑ‚ изтеглÑне:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "МакÑ. ÑкороÑÑ‚ качване:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "ДобавÑне в _ÑпрÑно ÑÑŠÑтоÑние"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Първо началото и краÑ"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Връщане към подразбиране"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Прилагане за вÑички"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "ДобавÑне на URL-адреÑ"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>От URL-адреÑ</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "ДобавÑне на хеш-код"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>От хеш-код</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Хеш-код:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Сървъри:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Създаване на торент"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Създаване на торент</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Пап_ка"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Отдалечен път"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Файлове</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Ðвтор:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Коментари:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Данни"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Качващи"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Размер на чаÑтите:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "ОтбелÑзване като лично"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "ДобавÑне на този торент към ÑеÑиÑта"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Въведете отдалечен път"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Отдалечен път</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Път:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Създаване на торент"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Запазване на торент-файла като"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Запазване на торент-файл</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Торенти на опашка"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>ДобавÑне на торентите от опашката</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Ðвтоматично добавÑне на торенти при Ñвързване"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "етикет"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "ДобавÑне на потребител"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>ДобавÑне на потребител</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "хоÑÑ‚:порт"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "ДобавÑне на хоÑÑ‚"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Управление на връзките</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Зареждане на Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ Ð´ÐµÐ¼Ð¾Ð½"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Ðвтоматично Ñвързване към Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ…Ð¾ÑÑ‚ при зареждане"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Ðвтоматично зареждане на локалната уÑлуга при нужда"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Да не Ñе показва този прозорец при зареждане"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>ИзтеглÑниÑ</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Ðвтоматично добавÑне от:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "СвалÑне в:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Торент-файловете в:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Папки</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "ЦÑлоÑтно запълване"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"ЦÑлоÑтното запълване Ð·Ð°Ð´ÐµÐ»Ñ Ñ†Ñлото мÑÑто, нужно на торента за избÑгване на "
+"фрагментациÑ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "ПоÑтепенно запълване"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "ПоÑтепенно запълване"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Първо на началото и краÑ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "ИзтеглÑне първо на началната и крайна чаÑÑ‚ на файловете"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "ДобавÑне на торентите в ÑпрÑно ÑÑŠÑтоÑние"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Мрежа</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Ползване на Ñлучайни портове"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge автоматично ще избира вÑеки път различен порт."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Използван порт:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "До:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Проверка на Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñ€Ñ‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>ВходÑщи портове</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>ИзходÑщи портове</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Въведете IP адреÑа на интерфиÑа който ще Ñлуша за нови bittorrent връзки. "
+"Ðко оÑтавите полето празно, ще използвам наÑтроики по подразбиране."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>ИнтерфейÑ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"СтойноÑÑ‚ на TOS байта в IP хедъра на пакетите, изпращани до вÑички пиъри "
+"(включително и по web). ШеÑтнадеÑетична ÑтойноÑÑ‚."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Байт за TOS на потребител:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play (UPNP)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "Протокол за пренаÑочване на портове"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "РазмÑна между потребители"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD (откриване в локална мрежа)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Откриване на потребители в локалната ви мрежа"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT (децентрализирана размÑна)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Разпределената хеш-таблица (DHT) може да подобри активните връзки."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Мрежови разширениÑ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "ВходÑщ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Степен:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Задължително\n"
+"Включено\n"
+"Изключено"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"РъкоÑтиÑкане\n"
+"ЦÑл поток\n"
+"И двете"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "ИзходÑщ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Шифриране на Ñ†ÐµÐ»Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾Ðº"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Шифриране</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>СкороÑÑ‚ на връзката</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "МакÑимум опити за Ñвързване за Ñекунда:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "МакÑимум полу-отворени връзки:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"МакÑималната ÑкороÑÑ‚ на качване за вÑички торенти. Задайте -1 за "
+"неограничена."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "МакÑимална ÑкороÑÑ‚ на качване (КБ/Ñек):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "МакÑимален позволен брой връзки. Задайте -1 за неограничен."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "МакÑимален брой връзки:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"МакÑималниÑÑ‚ брой Ñлотове за качване за вÑички торенти. Задайте -1 за "
+"неограничен брой такива."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "МакÑимум Ñлотове за качване:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"МакÑимална ÑкороÑÑ‚ на изтеглÑне за вÑички торенти. Задайте -1 за "
+"неограничена."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "МакÑимална ÑкороÑÑ‚ на изтеглÑне (КБ/Ñек):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Пренебрегване на ограничениÑта в локалната мрежа"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Общо ползвана ÑкроÑÑ‚</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"МакÑимален брой меÑта за качване по торенти. Задайте -1 за неограничен."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "МакÑимален брой връзки за торент. Задайте -1 за неограничен."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Ползвана ÑкороÑÑ‚ по торенти</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>ИнтерфейÑ</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Включване"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"КлаÑичеÑкиÑÑ‚ режим ще Ñкрие повечето от функционалноÑтта на Ñървър и Deluge "
+"ще прилича на отделна програма. Използвайте го, ако нÑмате намерение да Ñе "
+"възползвате от програмата като демон. ТрÑбва да презаредите програмата, за "
+"да влезе в Ñила промÑната в тази наÑтройка."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>КлаÑичеÑки режим</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Обща ÑкороÑÑ‚ в заглавието на прозореца"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>ОÑновен прозорец</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Да Ñе показва винаги"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Показване прозореца на преден план"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Екран за добавÑне на торенти</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Икона в ÑиÑÑ‚ÐµÐ¼Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Свиване в ÑиÑÑ‚ÐµÐ¼Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ» при затварÑне"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Зареждане в ÑиÑÑ‚ÐµÐ¼Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Защита Ñ Ð¿Ð°Ñ€Ð¾Ð»Ð° на ÑиÑÑ‚ÐµÐ¼Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>СиÑтемен панел</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Друго</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Съобщаване за нови верÑии"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr "Програмата ще проверÑва Ñървърите ни за по-нова ÑÐ²Ð¾Ñ Ð²ÐµÑ€ÑиÑ."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>ОбновлениÑ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Помогнете ни да подобрим Deluge, като ни изпращате верÑиите Ñи на Python, "
+"PyGTK, операционната ÑиÑтева и вида на процеÑора. Ðикакви други данни не Ñе "
+"изпращат."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Да, нека Ñе изпращат анонимно ÑтатиÑтики"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Данни за ÑиÑтемата</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "МеÑтоположение:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Ðко Deluge не открие файл Ñ Ð±Ð°Ð·Ð°Ñ‚Ð° данни на това меÑтоположение, ще Ñе опита "
+"да използва DNS за намирането на дръжавата на пиъра."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP база данни</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Свържи Magnet линкове към Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Демон</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Порт на демона:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Порт</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "ПзволÑване на отдалечени връзки"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Връзки</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Периодична проверка на Ñайта за нови верÑии"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Друго</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Опашка</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Ðовите торенти — най-горе на опашката"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Общо включени разпръÑкваниÑ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Общо включени:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Общо включени изтеглÑниÑ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Да не Ñе броÑÑ‚ бавните торенти"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Включени торенти</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Степен на ÑподелÑне:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Степен на продължителноÑÑ‚:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Време на разпръÑкване (мин):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Спиране разпръÑкването при Ñъотношение:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Премахване при Ñъотношение:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>РазпръÑкване</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>ПоÑредник</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "ÐдреÑ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Без поÑредник\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸ÐºÐ°Ñ†Ð¸Ñ\n"
+"HTTP\n"
+"HTTP Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸ÐºÐ°Ñ†Ð¸Ñ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Потребител</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Сървър</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Кеш памет</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Големина на кеша (в блокове по 16 KiB):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "ИзчиÑтване от кеша (в Ñекунди):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"ÐžÐ±Ñ‰Ð¸Ñ Ð±Ñ€Ð¾Ð¹ на блоковете от по 16 KiB запиÑани на диÑка откакто е започнала "
+"ÑеÑиÑта."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "ЗапиÑани блокове:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"ÐžÐ±Ñ‰Ð¸Ñ Ð±Ñ€Ð¾Ð¹ на изпълнениете операции за Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ‚ÐºÐ°ÐºÑ‚Ð¾ е започнала ÑеÑиÑта."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>ЗапиÑ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Прочетени блокове:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+"ÐžÐ±Ñ‰Ð¸Ñ Ð±Ñ€Ð¾Ð¹ на изпълнените операции за четене откакто е започнала ÑеÑиÑта."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "ЧетениÑ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Четене</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"ÐžÐ±Ñ‰Ð¸Ñ Ð±Ñ€Ð¾Ð¹ на блоковете от по 16 KiB прочетени от диÑка откакто е започнала "
+"ÑеÑиÑта."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Големина на кеша:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Големина на кеша при четене:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Големина</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>СъÑтоÑние</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>ПриÑтавки</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "ВерÑиÑ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Страница в Интернет:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Е-поща на автора:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_ИнÑталиране на приÑтавката"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_ПретърÑване за приÑтавки"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_ТърÑене на още приÑтавки"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Показване на Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Продължаване на вÑички"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "Ограничение ÑкороÑтта на _изтеглÑне"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "Ограничение ÑкороÑтта на _качване"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Изход и Ñпиране на демона"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_ОтварÑне на папка"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "_ВъзобновÑване"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "ÐаÑÑ‚_ройки"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Ðа опашка"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_ОбновÑване на ÑледÑÑ‰Ð¸Ñ Ñървър"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Премахване на торента"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "_Проверка на изтегленото"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "ПремеÑтване на _хранилището"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "Ограничение на _връзките"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Ограничение _меÑтата на качване"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Ðвтоматично управление"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Да Ñе премахне ли избраниÑÑ‚ торент?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Ðко премахнете изтегленото, то нÑма да може да Ñе възÑтанови поÑле."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Редактиране на ÑледÑщите Ñървъри"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Редактиране на ÑледÑщите Ñървъри</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "ДобавÑне на ÑледÑщ Ñървър"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>ДобавÑне на ÑледÑщи Ñървъри</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Редактиране на ÑледÑÑ‰Ð¸Ñ Ñървър"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Редактиране на ÑледÑÑ‰Ð¸Ñ Ñървър</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "СледÑщ Ñървър:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Премахване Ñ _изтегленото"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Премахване на _торента"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "ПремеÑтване на хранилището"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>ПремеÑтване на хранилището</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Ðазначение:"
+
+#~ msgid "Unknown"
+#~ msgstr "Ðепознат"
+
+#~ msgid "Upload"
+#~ msgstr "Качване"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Коефицент на ÑподелÑне"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "макÑимални връзки"
+
+#~ msgid "seconds"
+#~ msgstr "Ñекунди"
+
+#~ msgid "Download"
+#~ msgstr "ИзтеглÑне"
+
+#~ msgid "Update Tracker"
+#~ msgstr "ОбновÑване на тракера"
+
+#~ msgid "Next Announce"
+#~ msgstr "Следващо обÑвÑване"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð½Ð° тракера"
+
+#~ msgid "Total Size"
+#~ msgstr "Общ размер"
+
+#~ msgid "Pieces"
+#~ msgstr "ЧаÑти"
+
+#~ msgid "Details"
+#~ msgstr "ПодробноÑти"
+
+#~ msgid "Files"
+#~ msgstr "Файлове"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>СкороÑÑ‚:</b>"
+
+#~ msgid "Availability"
+#~ msgstr "ÐаличноÑÑ‚"
+
+#~ msgid "Remove"
+#~ msgstr "Премахване"
+
+#~ msgid "Add"
+#~ msgstr "ДобавÑне"
+
+#~ msgid "Clear"
+#~ msgstr "ИзчиÑтване"
+
+#~ msgid "Speed"
+#~ msgstr "СкороÑÑ‚"
+
+#~ msgid "Select All"
+#~ msgstr "Избиране на вÑички"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Изтриване на торент-файла"
+
+#~ msgid "Server"
+#~ msgstr "Сървър"
+
+#~ msgid "Username"
+#~ msgstr "ПотребителÑко име"
+
+#~ msgid "Password"
+#~ msgstr "Парола"
+
+#~ msgid "Port"
+#~ msgstr "Порт"
+
+#~ msgid "_Quit"
+#~ msgstr "_ЗатварÑне"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Програмата е заключена"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge има защита Ñ Ð¿Ð°Ñ€Ð¾Ð»Ð°.\n"
+#~ "За да Ñе покаже прозореца на Deluge, въведете паролата"
+
+#~ msgid "Filters"
+#~ msgstr "Филтри"
+
+#~ msgid "Graph"
+#~ msgstr "Графика"
+
+#~ msgid "New Password"
+#~ msgstr "Ðова парола"
+
+#~ msgid "Template"
+#~ msgstr "Шаблон"
+
+#~ msgid "Image Only"
+#~ msgstr "Само изображениÑ"
+
+#~ msgid "Text Only"
+#~ msgstr "Само текÑÑ‚"
+
+#~ msgid "Text and image"
+#~ msgstr "ТекÑÑ‚ и изображениÑ"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Изтриване на изтеглените файлове"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Ðвтоматично обновÑване"
+
+#~ msgid "Disable"
+#~ msgstr "Изключване"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "ОбновÑване на Ñтраницата на вÑеки"
+
+#~ msgid "Set"
+#~ msgstr "Задаване"
+
+#~ msgid "Type"
+#~ msgstr "Вид"
+
+#~ msgid "Disabled"
+#~ msgstr "Изключено"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Logout"
+#~ msgstr "Изход"
+
+#~ msgid "Login"
+#~ msgstr "Вход"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Качване на торент"
+
+#~ msgid "Torrent list"
+#~ msgstr "СпиÑък Ñ Ñ‚Ð¾Ñ€ÐµÐ½Ñ‚Ð¸"
+
+#~ msgid "Start"
+#~ msgstr "Стартирай"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Изберете Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ торент-файл, не и двете."
+
+#~ msgid "About"
+#~ msgstr "ОтноÑно"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Паролата е неправилна, опитайте отново"
+
+#~ msgid "Resume all"
+#~ msgstr "Продължаване на вÑички"
+
+#~ msgid "Reannounce"
+#~ msgstr "Повторно обÑвÑване"
+
+#~ msgid "Queue Position"
+#~ msgstr "ÐœÑÑто в опашката"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "обновÑването Ñ‚Ñ€Ñбва да е по-голÑмо от 0"
+
+#~ msgid "Submit"
+#~ msgstr "Изпращане"
+
+#~ msgid "Ava"
+#~ msgstr "ÐаличноÑÑ‚"
+
+#~ msgid "# Of Files"
+#~ msgstr "Брой файлове"
+
+#~ msgid "Config"
+#~ msgstr "ÐаÑтройка"
+
+#~ msgid "Eta"
+#~ msgstr "ОÑтаващо време"
+
+#~ msgid "Admin"
+#~ msgstr "ÐдминиÑтратор"
+
+#~ msgid "Connect"
+#~ msgstr "Свързване"
+
+#~ msgid "File"
+#~ msgstr "Файл"
+
+#~ msgid "Keyword"
+#~ msgstr "Ключова дума"
+
+#~ msgid "Move"
+#~ msgstr "ПремеÑтване"
+
+#~ msgid "Save"
+#~ msgstr "Запазване"
+
+#~ msgid "Move torrent"
+#~ msgstr "ПремеÑтване на торент"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "МакÑимална ÑкороÑÑ‚ на изтеглÑне"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Грешка в наÑтройките на торента."
+
+#~ msgid "No data"
+#~ msgstr "ЛипÑват данни"
+
+#~ msgid "Ports"
+#~ msgstr "Портове"
+
+#~ msgid "From"
+#~ msgstr "От"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "ДобавÑне в ÑпрÑно ÑÑŠÑтоÑние"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "МакÑимален брой качваниÑ"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "МакÑимална ÑкороÑÑ‚ на качване"
+
+#~ msgid "To"
+#~ msgstr "До"
+
+#~ msgid "Random"
+#~ msgstr "Произволно"
+
+#~ msgid "Encryption"
+#~ msgstr "Шифроване"
+
+#~ msgid "Level"
+#~ msgstr "Ðиво"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 — без ограничение"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Запазване на торент-файловете в"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Ðвтоматично добавÑне на папка"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Запазване на вÑички изтеглÑÐ½Ð¸Ñ Ð²"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 — без ограничение"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Включени приÑтавки"
+
+#~ msgid "Current Password"
+#~ msgstr "Текуща парола"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Тези промени Ñа запазени"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Пправете грешките и опитайте отново"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Ðовата парола и потвърждението й Ñе различават"
+
+#~ msgid "Move To"
+#~ msgstr "ПремеÑтване в"
+
+#~ msgid "Error in Path."
+#~ msgstr "Грешка в пътÑ."
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Ðова парола (потвърждение)"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Старата парола е грешна"
+
+#~ msgid "No"
+#~ msgstr "Ðе"
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Въведете правилна ÑтойноÑÑ‚."
+
+#~ msgid "This field is required."
+#~ msgstr "Това поле е задължително."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Въведете правилен чаÑ"
+
+#~ msgid "Enter a number."
+#~ msgstr "Въведете чиÑло"
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Въведете цÑло чиÑло"
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Въведете правилна дата"
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Въведете правилен URL-адреÑ"
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "ИзпратениÑÑ‚ файл е празен."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Ðе е изпратен файл."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "Ðе е изпратен файл. Проверете вида кодиране на формата."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Въведете правилен Ð°Ð´Ñ€ÐµÑ Ð½Ð° е-поща"
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Въведете правилен IPv4-адреÑ"
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Въведете правилни дата и чаÑ"
+
+#~ msgid "Recheck"
+#~ msgstr "Повторна проверка"
+
+#~ msgid "Statistics"
+#~ msgstr "СтатиÑтики"
+
+#~ msgid "Delete"
+#~ msgstr "Изтриване"
+
+#~ msgid "Queue Top"
+#~ msgstr "Ðай-горе на опашката"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Ðай-долу на опашката"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Папката не ÑъщеÑтвува."
+
+#~ msgid "Other.."
+#~ msgstr "Друго..."
+
+#~ msgid "Import Now"
+#~ msgstr "ВнаÑÑне Ñега"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "МакÑимално изчакване (Ñекунди)"
+
+#~ msgid "Inactive"
+#~ msgstr "Изключено"
+
+#~ msgid "Refresh status"
+#~ msgstr "ОбновÑване на ÑÑŠÑтоÑнието"
+
+#~ msgid "page 6"
+#~ msgstr "Ñтраница 6"
+
+#~ msgid "page 7"
+#~ msgstr "Ñтраница 7"
+
+#~ msgid "page 8"
+#~ msgstr "Ñтраница 8"
+
+#~ msgid "page 10"
+#~ msgstr "Ñтраница 10"
+
+#~ msgid "page 11"
+#~ msgstr "Ñтраница 11"
+
+#~ msgid "page 12"
+#~ msgstr "Ñтраница 12"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>ДобавÑне на торенти</b></big>"
+
+#~ msgid "FAQ"
+#~ msgstr "ЧеÑто задавани въпроÑи"
+
+#~ msgid "Community"
+#~ msgstr "ОбщноÑÑ‚"
+
+#~ msgid "Yes"
+#~ msgstr "Да"
+
+#~ msgid "Button style"
+#~ msgstr "Вид на бутоните"
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Изберете валиден вариант. %s не е Ñред валидните възможноÑти."
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Въведете ÑпиÑък ÑÑŠÑ ÑтойноÑти."
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr "Изберете валиден вариант. Избраното не е Ñред валидните възможноÑти."
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Брой опити за изтеглÑне"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "ВнаÑÑне на %s"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "no uri"
+#~ msgstr "липÑва адреÑ"
+
+#~ msgid "Extra's"
+#~ msgstr "ДопълнениÑ"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Блокиран обхват: %s"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "ИзтеглÑне първо на началото и краÑ"
+
+#~ msgid "translate something"
+#~ msgstr "превеждане"
+
+#~ msgid "State"
+#~ msgstr "СъÑтоÑние"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Общо работещи торенти"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Disk Space"
+#~ msgstr "ДиÑково проÑтранÑтво"
+
+#~ msgid "Search"
+#~ msgstr "ТърÑене"
+
+#~ msgid "Restart"
+#~ msgstr "РеÑтартиране"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "Homepage"
+#~ msgstr "Страница в Интернет"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Грешка при задаване наÑтройките на етикет"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Проверка на вÑеки (в дни)"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "ВнаÑÑне при Ñтартиране на демона"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "ИзтеглÑне %.2f%%"
+
+#~ msgid "Normal priority"
+#~ msgstr "Ðормален приоритет"
+
+#~ msgid "High priority"
+#~ msgstr "ВиÑок приоритет"
+
+#~ msgid "Highest priority"
+#~ msgstr "Ðай-виÑок приоритет"
+
+#~ msgid "no label"
+#~ msgstr "без етикет"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Торентът е отвъд коефициента на Ñпиране."
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "Stop"
+#~ msgstr "Спиране"
+
+#~ msgid "Inbound"
+#~ msgstr "ВходÑщ"
+
+#~ msgid "Either"
+#~ msgstr "И двете"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸ÐºÐ°Ñ†Ð¸Ñ"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸ÐºÐ°Ñ†Ð¸Ñ"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Outbound"
+#~ msgstr "ИзходÑщ"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "МакÑ. ÑкороÑÑ‚ на качване (Кб/Ñек)"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "МакÑ. ÑкороÑÑ‚ на изтеглÑне (Кб/Ñек)"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "МакÑ. полу-отворени връзки"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "МакÑ. опити за Ñвързване в Ñекунда"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Включено автоматично добавÑне"
+
+#~ msgid "Per Torrent"
+#~ msgstr "За торент"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "РеÑтартирайте демона и уеб-интерфейÑа Ñлед промÑна на тези наÑтройки"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Общо включени изтеглÑниÑ"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Общо включени разпръÑкваниÑ"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Спиране разпръÑкването при Ñъотношение"
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Уверете Ñе, че тази ÑтойноÑÑ‚ е по-малка или равна на %s."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Уверете Ñе, че тази ÑтойноÑÑ‚ е Ñ Ð½Ðµ по-малко от %(min)d Ñимвола (Ñега е Ñ "
+#~ "%(length)d)."
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Уверете Ñе, че тази ÑтойноÑÑ‚ е Ñ Ð½Ðµ повече от %(max)d Ñимвола (Ñега е Ñ "
+#~ "%(length)d)."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Уверете Ñе, че има не повече от %s знака Ñлед точката."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr "Уверете Ñе, че има не повече от %s знака преди точката."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Уверете Ñе, че общиÑÑ‚ брой на цифрите не е по-голÑм от %s."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Уверете Ñе, че тази ÑтойноÑÑ‚ е по-голÑма или равна на %s."
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Ðвтоматично обновÑване (Ñек.)"
+
+#~ msgid "Sidebar"
+#~ msgstr "Странична лента"
+
+#~ msgid "Show trackers"
+#~ msgstr "Показване на ÑледÑщите Ñървъри"
+
+#~ msgid "Download Location"
+#~ msgstr "МеÑтоположение на изтеглÑнето"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "...и изтриване на торент-файла"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "...и изтриване на изтеглените файлове"
+
+#~ msgid "... and delete All files"
+#~ msgstr "...и изтриване на вÑички файлове"
+
+#~ msgid "Cancel"
+#~ msgstr "Отказване"
+
+#~ msgid "Do not download"
+#~ msgstr "Да не Ñе изтеглÑ"
+
+#~ msgid "False"
+#~ msgstr "Грешно"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Филтриране по ключова дума"
+
+#~ msgid "Ok"
+#~ msgstr "Добре"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Без връзка Ñ Ð´ÐµÐ¼Ð¾Ð½Ð°"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Без входÑщи връзки"
+
+#~ msgid "Seed rank"
+#~ msgstr "Ранг разпръÑкване"
+
+#~ msgid "True"
+#~ msgstr "Ð’Ñрно"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "това още не функционира...\n"
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Изглежда този Ð°Ð´Ñ€ÐµÑ Ðµ невалидна препратка."
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Ðе е открит ключ на '%s'"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Ðе е открит Ñертифитак на '%s'"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Свързване към демона"
+
+#~ msgid "Connected to"
+#~ msgstr "Свързан към"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Ограничение на връзката"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "Ограничеине ÑкороÑÑ‚ на изтеглÑне"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge: СпиÑък Ñ Ñ‚Ð¾Ñ€ÐµÐ½Ñ‚Ð¸"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Ограничение меÑта за качване"
+
+#~ msgid "From Url"
+#~ msgstr "От URL-адреÑ"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Вход в Deluge"
+
+#~ msgid "From Session"
+#~ msgstr "От ÑеÑиÑта"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 КБ\n"
+#~ "64 КБ\n"
+#~ "128 КБ\n"
+#~ "256 КБ\n"
+#~ "512 КБ"
+
+#~ msgid "Handshake"
+#~ msgstr "РъкоÑтиÑкане"
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Качете валидно изображение. Файлът, който те качили, или не е изображение, "
+#~ "или е повреден."
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Презаредете ръчно уеб-интерфейÑа, за да Ñе приложат промените."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr "Изберете валиден вариант. %(value)s не е Ñред наличните възможноÑти."
+
+#~ msgid "Label torrent"
+#~ msgstr "ПоÑтавÑне етикет на торента"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Компактно запълване"
+
+#~ msgid "Active time"
+#~ msgstr "Време на активноÑÑ‚"
+
+#~ msgid "Seeding time"
+#~ msgstr "Време на разпръÑкване"
+
+#~ msgid "apply_max"
+#~ msgstr "apply_max"
+
+#~ msgid "max_download_speed"
+#~ msgstr "max_download_speed"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "max_upload_speed"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "max_upload_slots"
+
+#~ msgid "max_connections"
+#~ msgstr "max_connections"
+
+#~ msgid "apply_queue"
+#~ msgstr "apply_queue"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "is_auto_managed"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "stop_at_ratio"
+
+#~ msgid "stop_ratio"
+#~ msgstr "stop_ratio"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "remove_at_ratio"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "apply_move_completed"
+
+#~ msgid "move_completed"
+#~ msgstr "move_completed"
+
+#~ msgid "move_completed_path"
+#~ msgstr "move_completed_path"
+
+#~ msgid "auto_add"
+#~ msgstr "auto_add"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "auto_add_trackers"
+
+#~ msgid "BlockList"
+#~ msgstr "Черен ÑпиÑък"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Това пиÑмо ви информира, че Deluge приключи Ñ Ð¸Ð·Ñ‚ÐµÐ³Ð»Ñнето на %s , "
+#~ " което включва %i файла.\n"
+#~ "За да не получавате повече такива пиÑма, изключете уведомлението "
+#~ "по поща от наÑтройките на Deluge.\n"
+#~ "\n"
+#~ "Благодарим ви\n"
+#~ "Deluge"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "РазмÑна между потребители"
+
+#~ msgid "Forced"
+#~ msgstr "Задължително"
+
+#~ msgid "Cache templates"
+#~ msgstr "ЗапомнÑне на шаблоните"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Показване на Ñтраничната лента"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Показване на торенти без трафик"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Показване Ñ‚ÑŠÑ€Ñенето по ключови думи"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Проверка на изтегленото"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Работи Ñе в момента..."
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Включително %i файла"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Спиране при Ñъотношение"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Премахване при Ñъотношение"
+
+#~ msgid "Global"
+#~ msgstr "Общо"
+
+#~ msgid "General"
+#~ msgstr "Общо"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s не е валиден URL адреÑ"
+
+#~ msgid "Downloading.."
+#~ msgstr "ИзтеглÑне.."
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "ÐÑма връзка.."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "Тази програма е Ñвободен Ñофтуер: можете да Ñ Ñ€Ð°Ð·Ð¿Ñ€Ð¾ÑтранÑвате и/или "
+#~ "променÑте под уÑловиÑта на Ð’Ñеобщ Публичен Лиценз ГÐУ, както е публикуван от "
+#~ "ФондациÑта за Свободен Софтуер, както верÑÐ¸Ñ 3 на лиценза, така и (по ваш "
+#~ "избор) вÑÑка Ñледваща верÑиÑ.\r\n"
+#~ "Тази програма Ñе разпроÑтранÑва Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°Ñ‚Ð°, че ще бъде полезна, но БЕЗ "
+#~ "ÐИКÐКВРГÐРÐÐЦИЯ; без дори подразбиращата Ñе Ð³Ð°Ñ€Ð°Ð½Ñ†Ð¸Ñ Ð½Ð°Ð»Ð¾Ð¶ÐµÐ½Ð° от "
+#~ "ПРОДÐÐ’ÐЕМОСТТРили ПОДХОЖДÐÐЕ ЗРОПРЕДЕЛЕÐРЦЕЛ. Вижте Ð’ÑÐµÐ¾Ð±Ñ‰Ð¸Ñ ÐŸÑƒÐ±Ð»Ð¸Ñ‡ÐµÐ½ "
+#~ "Лиценз ГÐУ за повече информациÑ.\r\n"
+#~ "Вие Ñ‚Ñ€Ñбва да Ñте получили копие на Ð’Ñеобщ Публичен Лиценз ГÐУ Ñ Ð²Ð°ÑˆÐµÑ‚Ð¾ "
+#~ "копие на програмата. Ðко не, вижте <http://www.gnu.org/licenses/>"
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "ÐеуÑпешно изтеглÑне : %s"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "Лимит на ÑкороÑта на качване"
+
+#~ msgid "Update"
+#~ msgstr "Ðктуализиране"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Задаване време на изчакване"
+
+#~ msgid "Pause all"
+#~ msgstr "Пауза на вÑички"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Програмата Deluge е защитена Ñ Ð¿Ð°Ñ€Ð¾Ð»Ð°!</big></b>"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Въведете паролата Ñи, за да Ñе продължи</i>"
diff --git a/deluge/i18n/bn.po b/deluge/i18n/bn.po
new file mode 100644
index 0000000..94fb950
--- /dev/null
+++ b/deluge/i18n/bn.po
@@ -0,0 +1,3725 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2009-01-17 08:45+0000\n"
+"Last-Translator: shaiful <Unknown>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+"X-Poedit-Country: BANGLADESH\n"
+"X-Poedit-Language: Bengali\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "কি.বাইট/সেকেনà§à¦¡"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "পাসওয়ারà§à¦¡:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "লেবেল অপশন"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>লেবেল অপশন</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "আপলোড সà§à¦²à¦Ÿ:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "আপলোডের গতি:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "ডাউনলোডের গতি:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "সংয়োগসমূহ:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "পà§à¦°à¦¤à¦¿ টোরেনà§à¦Ÿ à¦à¦° জনà§à¦¯ সরà§à¦¬à§‹à¦šà§à¦š মানসমূহ পà§à¦°à§Ÿà§‹à¦—:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "সরà§à¦¬à§‹à¦šà§à¦š"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿà¦­à¦¾à¦¬à§‡ পরিচালিত"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "অবসà§à¦¥à¦¾à¦¨"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à§Ÿà¦­à¦¾à¦¬à§‡ লেবেল পà§à¦°à§Ÿà§‹à¦—:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr "<i>পাশের বারটি বà§à¦¯à¦¬à¦¹à¦¾à¦° করে লেবেল য়োগ, সমà§à¦ªà¦¾à¦¦à¦¨ অথবা বাদ দিন</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>লেবেল</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "দিন"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "তারিখ:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "টরেনà§à¦Ÿ সমà§à¦ªà§‚রà§à¦£"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "টরেনà§à¦Ÿ যোগ করা হয়েছে"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "চালান"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "ঘটনা"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "আদেশ"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>আদেশ যোগ করà§à¦¨<b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>আদেশগà§à¦²à¦¿<b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "অগà§à¦°à¦—তি"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "বà§à¦¯à¦¾à¦¨à§à¦¡à¦‰à¦‡à¦¡à§à¦¥"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "আকার"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "Save"
+#~ msgstr "সংরকà§à¦·à¦£"
+
+#~ msgid "True"
+#~ msgstr "সতà§à¦¯"
+
+#~ msgid "Update"
+#~ msgstr "সামà§à¦ªà§à¦°à¦¤à¦¿à¦•à§€à¦•à¦°à¦¨"
+
+#~ msgid "Upload"
+#~ msgstr "আপলোড"
+
+#~ msgid "seconds"
+#~ msgstr "সেকেনà§à¦¡"
diff --git a/deluge/i18n/bs.po b/deluge/i18n/bs.po
new file mode 100644
index 0000000..4de7f3d
--- /dev/null
+++ b/deluge/i18n/bs.po
@@ -0,0 +1,3744 @@
+# Bosnian translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-04-12 10:26+0000\n"
+"Last-Translator: Sanel <Unknown>\n"
+"Language-Team: Bosnian <bs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "KorisniÄko ime:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Lozinka:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Od:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Lokacija Preuzimanja</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Limit preuzimanja:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Limit slanja:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Aktivni torrenti:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Spore postavke</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Pogrešna oznaka, validni znakovi: [a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Prazna Oznaka"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Oznaka već postoji"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Nepoznata Oznaka"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Nepoznat Torrent"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Opcije Oznaka"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Opcije Oznaka</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Slotovi otpremanja:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Brzina Otpremanja:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Brzina Preuzimanja:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Veze:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maksimum"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Red"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Primijeni postavke lokacije:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Lokacija"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Automatski primijeni oznaku:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Dodaj Oznaku"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Dodaj Oznaku</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Ime:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr "<i>Koristi panel sa strane da dodaš,urediš i izbrišes oznake. </i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Oznake</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Izdvoji u:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Kreiraj sub-mapu sa imenom torrenta"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Ova opcija će kreirati pod-mapu koristeći ime torrenta u izabranom folderu "
+"izdvajanja i datoteke će biti izdvojene u ovu mapu."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Općenito</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Omogući web izgled"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Omogući SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Slušam port:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Postavke</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Opcije</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Vrsta:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Informacija</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torrent završen"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Dodan torrent"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Izvrši"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Događaj"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Naredba"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Dodaj komandu</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Komande</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Nijedan"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Detalji:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Datoteka"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Pogled"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Kolone"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Dodaj Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Ukloni Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Postavke"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Detalji"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Opcije"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Izaberi Sve"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Dodaj Torente"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_Ukloni"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torenti</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Da_toteke"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Pun"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Kompaktan"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Alokacija</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Primijeni Na Sve"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Dodaj URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Autor:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Preuzimanja</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Preuzmi u:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Mape</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "upotrijebi Punu Alokaciju"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Upotrijebi Kompaktnu Alokaciju"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Mreža</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Do:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Nivo:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Maksimalna Brzina Otpremanja (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Maksimalna rzina Preuzimanja (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Omogući"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>KlasiÄan NaÄin</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Glavni Prozor</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Uvijek pokaži"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Ostalo</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Dopune</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Dozvoli Udaljene Veze"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Veze</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Ostalo</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Aktivni Torenti</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Proksi</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Server:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>PrikljuÄci</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Verzija:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "OgraniÄenje Brzine _Preuzimanja"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "OgraniÄenje Brzine _Otpremanja"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Otvori Mapu"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Nast_avi"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Opc_ije"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Ukloni Torent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Ukloni _Torent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Dodaj Torente</b></big>"
+
+#~ msgid "page 6"
+#~ msgstr "6. strana"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 7"
+#~ msgstr "7. strana"
+
+#~ msgid "page 8"
+#~ msgstr "8. strana"
+
+#~ msgid "page 10"
+#~ msgstr "10. strana"
+
+#~ msgid "page 11"
+#~ msgstr "11. strana"
+
+#~ msgid "page 12"
+#~ msgstr "12. strana"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-uredi"
diff --git a/deluge/i18n/ca.po b/deluge/i18n/ca.po
new file mode 100644
index 0000000..59395eb
--- /dev/null
+++ b/deluge/i18n/ca.po
@@ -0,0 +1,6384 @@
+# Catalan translation for deluge
+# Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2018-05-04 18:02+0000\n"
+"Last-Translator: Robert Antoni Buj Gelonch <Unknown>\n"
+"Language-Team: Catalan <ca@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr "B"
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr "KiB"
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr "MiB"
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr "GiB"
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr "TiB"
+
+#: deluge/common.py:410
+msgid "K"
+msgstr "K"
+
+#: deluge/common.py:411
+msgid "M"
+msgstr "M"
+
+#: deluge/common.py:412
+msgid "G"
+msgstr "G"
+
+#: deluge/common.py:413
+msgid "T"
+msgstr "T"
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr "K/s"
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr "M/s"
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr "MiB/s"
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr "G/s"
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr "GiB/s"
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr "T/s"
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr "TiB/s"
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr "Opcions comunes"
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr "Imprimeix aquest missatge d'ajuda"
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr "Imprimeix la informació de la versió"
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr "Estableix el camí del directori de configuració"
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr "Estableix el nivell de registre (none, error, warning, info, debug)"
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr "Opcions del control del procés"
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr "Pidfile per emmagatzemar l'id. de procés"
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr "Opcions del dimoni"
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr "Adreça IP per escoltar connexions de la interfície gràfica"
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr "Port per escoltar connexions de la interfície gràfica"
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr "Adreça IP per escoltar connexions de BitTorrent"
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr "Tot"
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr "S'està comprovant"
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr "S'està baixant"
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr "S'està compartint"
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr "En pausa"
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr "S'ha enviat a la cua"
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr "Error"
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr "Nom"
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr "Progrés"
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr "Estat"
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr "Mida"
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr "Baixat"
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr "Pujat"
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr "Restant"
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr "Relació"
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr "Velocitat de baixada"
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr "Velocitat de pujada"
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr "Límit de baixada"
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr "Límit de pujada"
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr "Connexions màx."
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr "Clients"
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr "Rastrejador"
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr "Última activitat"
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr "Completat"
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr "Compartit"
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr "Baixada seqüencial"
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr "Suprimeix a la relació"
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr "Propietari"
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr "Avís"
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr "Interfície"
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr "Baixades"
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr "Amplada de banda"
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr "Cua"
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr "Xarxa"
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr "Servidor intermediari"
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr "Memòria cau"
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr "Altres"
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr "Dimoni"
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr "Connectors"
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr "Baixa"
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr "Normal"
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr "Alta"
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr "Afganistan"
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr "Illes Aland"
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr "Albània"
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr "Algèria"
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr "Samoa Americana"
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr "Antàrtica"
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr "Antigua i Barbuda"
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr "Argentina"
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr "Armènia"
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr "Austràlia"
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr "Àustria"
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr "Azerbaidjan"
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr "Bahames"
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr "Bahrain"
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr "Bangla Desh"
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr "Bielorússia"
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr "Bèlgica"
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr "Benín"
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr "Bermudes"
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr "Bolívia"
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr "Bòsnia i Hercegovina"
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr "Illa Bouvet"
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr "Brasil"
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr "Territori britànic de l'oceà Ãndic"
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr "Brunei Darussalam"
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr "Bulgària"
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr "Cambodja"
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr "Camerun"
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr "Canadà"
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr "Cap Verd"
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr "Illes Caiman"
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr "República Centreafricana"
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr "Txad"
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr "Xile"
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr "Xina"
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr "Illa Christmas"
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr "Illes Cocos (Keeling)"
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr "Colòmbia"
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr "Comores"
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr "Congo"
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr "República Democràtica del Congo"
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr "Illes Cook"
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr "Costa d'ivori"
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr "Croàcia"
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr "Cuba"
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr "Xipre"
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr "República Txeca"
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr "Dinamarca"
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr "Djibouti"
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr "Dominica"
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr "República Dominicana"
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr "Equador"
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr "Egipte"
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr "Guinea Equatorial"
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr "Estònia"
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr "Etiòpia"
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr "Illes Malvines (Falkland)"
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr "Illes Fèroe"
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr "Fiji"
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr "Finlàndia"
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr "França"
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr "Guaiana Francesa"
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr "Polinèsia Francesa"
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr "Territoris Francesos del Sud"
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr "Gàmbia"
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr "Geòrgia"
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr "Alemanya"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Grècia"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Groenlàndia"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadalupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Guinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Guinea Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guyana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haití"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Illes Heard i McDonald"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Santa Seu (Estat del Vaticà)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Hondures"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Hongria"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Islàndia"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "Ãndia"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonèsia"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "República Islàmica d'Iran"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Iraq"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Irlanda"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Illa de Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Israel"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Itàlia"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaica"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japó"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordània"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazakhstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenya"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "República de Corea"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuwait"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kirguizistan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "República Democràtica Popular de Laos"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Letònia"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Líban"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Libèria"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Lituània"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luxemburg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macau"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagascar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malàisia"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldives"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Illes Marshall"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinica"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauritània"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Maurici"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Mèxic"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldàvia"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Mònaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongòlia"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Montenegro"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Marroc"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Moçambic"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Myanmar"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namíbia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Països Baixos"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Antilles Holandeses"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Nova Caledònia"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Nova Zelanda"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Níger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigèria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Illa Norfolk"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Illes Marianes del Nord"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Noruega"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Territori Palestí, Ocupat"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panamà"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua Nova Guinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguai"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Perú"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filipines"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Illes Pitcairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Polònia"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugal"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Qatar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Romania"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Federació Russa"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Ruanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Sant Bartomeu"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Santa Elena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Santa Llúcia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "São Tomé i Príncipe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Aràbia Saudita"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Sèrbia"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seychelles"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapur"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Eslovàquia"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Eslovènia"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Illes Salomó"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somàlia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Sud-àfrica"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Illes Geòrgia del Sud i Sandwich del Sud"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Espanya"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Surinam"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard i Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Swazilàndia"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Suècia"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Suïssa"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Síria"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr "Taiwan"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tadjikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "República Unida de Tanzània"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Tailàndia"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Timor Oriental"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinitat i Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunísia"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Turquia"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Illes Turques i Caicos"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ucraïna"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Unió dels Emirats Àrabs"
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Regne Unit"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Estats Units"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Illes Perifèriques Menors dels EUA"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Uruguai"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Uzbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Veneçuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Illes Verges Britàniques"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Illes Verges Nord-americanes"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis i Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Sàhara Occidental"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Iemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zàmbia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbàbue"
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr "Opcions de la interfície gràfica"
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr "Opcions del servidor web"
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr "Nom d'usuari:"
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr "Contrasenya:"
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr "Habilitat"
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr "Rastrejadors"
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr "Cap etiqueta"
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr "Mou els completats a:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr "Copia els fitxers .torrent a:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr "Connexions:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr "Velocitat de baixada:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr "Velocitat de pujada:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr "De:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr "Nom d'amfitrió:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr "Paràmetres"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr "Connexions"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr "<b>General</b>"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr "Clients:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr "Nom:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr "Atura la compartició a la relació:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr "Suprimeix a la relació"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr "Capdamunt"
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr "Capdavall"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr "Opcions"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr "Client de BitTorrent"
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr "Client de BitTorrent Deluge"
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr "Baixeu i compartiu fitxers a través de BitTorrent"
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr "Ordre"
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr "Carpetes"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr "Llistat de les IP d'Emule (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr "Text de SafePeer (amb compressió zip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "Text de PeerGuardian (sense compressió)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr "P2B de PeerGuardian (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr "Llista de bloqueig"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr "Versió no vàlida"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr "Dies"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr "<b>Paràmetres</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr "<b>Opcions</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr "Tipus:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr "Data:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr "Mida del fitxer:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr "<b>Informació</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr "<b>Llista blanca</b>"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr "Torrent completat"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr "Torrent afegit"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr "Torrent suprimit"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr "Executa"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr "Esdeveniment"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr "<b>Afegeix una ordre</b>"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr "<b>Ordres</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr "Opció incompatible"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr "Camí"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr "No existeix el camí."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr "Selecciona una carpeta"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr "Suprimeix el .torrent després d'afegir-lo"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ".afegit"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr "Estableix la carpeta de la baixada"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr "<b>Carpeta de la baixada</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr "Etiqueta: "
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr "<b>Etiqueta</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr "Principal"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr "<b>Propietari</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr "Velocitat màxima de pujada:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr "Nombre màxim de connexions:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr "Nombre màxim de ranures de pujada:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr "Velocitat màxima de baixada:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Amplada de banda</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr "Envia a la cua:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr "<b>Cua</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr "minuts"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr "1 minut"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr "1 segon"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr "segons"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr "Estadístiques"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr "Resolució"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr "Color de baixada:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr "Color de pujada:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr "<b>Gràfica de connexions</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr "<b>Gràfica d'amplada de banda</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr "Nodes DHT:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr "Torrents DHT:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr "<b>Colors de la gràfica</b>"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr "Interfície gràfica web"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr "Habilita la interfície web"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr "Habilita SSL"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr "Etiqueta buida"
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr "Ja existeix l'etiqueta"
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr "Etiqueta desconeguda"
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr "Torrent desconegut"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr "_Opcions de l'etiqueta"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr "Sup_rimeix l'etiqueta"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr "_Afegeix una etiqueta"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr "Opcions de les etiquetes"
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr "Etiqueta"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr "<b>Opcions de les etiquetes</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr "Aplica els paràmetres màxims a cadascun dels torrents:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr "Màxim"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr "Aplica els paràmetres de la carpeta:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 línia per rastrejador)</i>"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr "Aplica automàticament l'etiqueta:"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr "Afegeix una etiqueta"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr "<b>Afegeix una etiqueta</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr "<b>Etiquetes</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr "Notificacions"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr "S'ha finalitzat el torrent «%(name)s»"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr "<b>Notificacions de la interfície gràfica</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr "<b>Destinataris</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr "El servidor requereix TLS/SSL"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr "<b>Notificacions per correu electrònic</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr "Subscripcions"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr "Personalització del so"
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr "Extractor"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr "Extreu a:"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr "Planificador"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr "Límit de baixada:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr "Límit de pujada:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr "Torrents actius:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Paràmetres de lentitud</b>"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr "Fitxer"
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
+
+#~ msgid "<b><i><big>Notifications</big></i></b>"
+#~ msgstr "<b><i><big>Notificacions</big></i></b>"
+
+#~ msgid "Czech"
+#~ msgstr "txec"
+
+#~ msgid "Bosnian"
+#~ msgstr "bosnià"
+
+#~ msgid "Belarusian"
+#~ msgstr "bielorús"
+
+#~ msgid "Bulgarian"
+#~ msgstr "búlgar"
+
+#~ msgid "Breton"
+#~ msgstr "francès"
+
+#~ msgid "Bengali"
+#~ msgstr "bengalí"
+
+#~ msgid "Catalan"
+#~ msgstr "català"
+
+#~ msgid "Arabic"
+#~ msgstr "àrab"
+
+#~ msgid "Asturian"
+#~ msgstr "asturià"
+
+#~ msgid "Danish"
+#~ msgstr "danès"
+
+#~ msgid "Welsh"
+#~ msgstr "gal·lès"
+
+#~ msgid "German"
+#~ msgstr "alemany"
+
+#~ msgid "English (Australia)"
+#~ msgstr "anglès (Austràlia)"
+
+#~ msgid "English (Canada)"
+#~ msgstr "anglès (Canadà)"
+
+#~ msgid "Greek"
+#~ msgstr "grec"
+
+#~ msgid "English"
+#~ msgstr "anglès"
+
+#~ msgid "Spanish"
+#~ msgstr "espanyol"
+
+#~ msgid "English (United Kingdom)"
+#~ msgstr "anglès (Regne Unit)"
+
+#~ msgid "Esperanto"
+#~ msgstr "esperanto"
+
+#~ msgid "French"
+#~ msgstr "francès"
+
+#~ msgid "Finnish"
+#~ msgstr "finès"
+
+#~ msgid "Basque"
+#~ msgstr "basc"
+
+#~ msgid "Estonian"
+#~ msgstr "estonià"
+
+#~ msgid "Persian"
+#~ msgstr "persa"
+
+#~ msgid "Irish"
+#~ msgstr "irlandès"
+
+#~ msgid "Hebrew"
+#~ msgstr "hebreu"
+
+#~ msgid "Galician"
+#~ msgstr "gallec"
+
+#~ msgid "Indonesian"
+#~ msgstr "indonesi"
+
+#~ msgid "Icelandic"
+#~ msgstr "islandès"
+
+#~ msgid "Italian"
+#~ msgstr "italià"
+
+#~ msgid "Hindi"
+#~ msgstr "hindi"
+
+#~ msgid "Croatian"
+#~ msgstr "croat"
+
+#~ msgid "Hungarian"
+#~ msgstr "hongarès"
+
+#~ msgid "Interlingua"
+#~ msgstr "interlingua"
+
+#~ msgid "Kannada"
+#~ msgstr "kannarès"
+
+#~ msgid "Georgian"
+#~ msgstr "georgià"
+
+#~ msgid "Khmer"
+#~ msgstr "khmer"
+
+#~ msgid "Kazakh"
+#~ msgstr "kazakh"
+
+#~ msgid "Korean"
+#~ msgstr "coreà"
+
+#~ msgid "Latin"
+#~ msgstr "llatí"
+
+#~ msgid "Luxembourgish"
+#~ msgstr "luxemburguès"
+
+#~ msgid "Inuktitut"
+#~ msgstr "inuktitut"
+
+#~ msgid "Japanese"
+#~ msgstr "japonés"
+
+#~ msgid "Kurdish"
+#~ msgstr "kurd"
+
+#~ msgid "Macedonian"
+#~ msgstr "macedoni"
+
+#~ msgid "Latvian"
+#~ msgstr "letó"
+
+#~ msgid "Lithuanian"
+#~ msgstr "lituà"
+
+#~ msgid "Nepali"
+#~ msgstr "nepalès"
+
+#~ msgid "Burmese"
+#~ msgstr "birmà"
+
+#~ msgid "Malayalam"
+#~ msgstr "malaiàlam"
+
+#~ msgid "Mongolian"
+#~ msgstr "mongol"
+
+#~ msgid "Russian"
+#~ msgstr "rus"
+
+#~ msgid "Romanian"
+#~ msgstr "romanès"
+
+#~ msgid "Portuguese"
+#~ msgstr "portuguès"
+
+#~ msgid "Polish"
+#~ msgstr "polonès"
+
+#~ msgid "Dutch"
+#~ msgstr "holandès"
+
+#~ msgid "Norwegian Nynorsk"
+#~ msgstr "noruec nynorsk"
+
+#~ msgid "Serbian"
+#~ msgstr "serbi"
+
+#~ msgid "Slovenian"
+#~ msgstr "eslovè"
+
+#~ msgid "Slovak"
+#~ msgstr "eslovac"
+
+#~ msgid "Swahili"
+#~ msgstr "swahili"
+
+#~ msgid "Tamil"
+#~ msgstr "tàmil"
+
+#~ msgid "Telugu"
+#~ msgstr "telugu"
+
+#~ msgid "Albanian"
+#~ msgstr "albanès"
+
+#~ msgid "Swedish"
+#~ msgstr "suec"
+
+#~ msgid "Vietnamese"
+#~ msgstr "vietnamita"
+
+#~ msgid "Urdu"
+#~ msgstr "urdú"
+
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "xinès (simplificat)"
+
+#~ msgid "Turkish"
+#~ msgstr "turc"
+
+#~ msgid "Ukrainian"
+#~ msgstr "ucraïnès"
+
+#~ msgid "Udmurt"
+#~ msgstr "udmurt"
+
+#~ msgid "Tagalog"
+#~ msgstr "tagal"
+
+#~ msgid "Thai"
+#~ msgstr "tai"
+
+#~ msgid "Traditional Chinese"
+#~ msgstr "xinès tradicional"
+
+#~ msgid "Simplified Chinese"
+#~ msgstr "xinès simplificat"
+
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "xinès (Hong Kong)"
+
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "xinès (Taiwan)"
+
+#~ msgid "Ignore"
+#~ msgstr "Ignora"
diff --git a/deluge/i18n/cs.po b/deluge/i18n/cs.po
new file mode 100644
index 0000000..aa97c60
--- /dev/null
+++ b/deluge/i18n/cs.po
@@ -0,0 +1,6147 @@
+# Czech translation for deluge
+# Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2017-11-29 20:13+0000\n"
+"Last-Translator: Pavel Borecki <Unknown>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr "B"
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr "KiB"
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr "MiB"
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr "GiB"
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr "TiB"
+
+#: deluge/common.py:410
+msgid "K"
+msgstr "K"
+
+#: deluge/common.py:411
+msgid "M"
+msgstr "M"
+
+#: deluge/common.py:412
+msgid "G"
+msgstr "G"
+
+#: deluge/common.py:413
+msgid "T"
+msgstr "T"
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr "MiB/s"
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr "GiB/s"
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr "TiB/s"
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr ""
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr "<b>Obecné</b>"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr ""
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr "Vyberte složku"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
diff --git a/deluge/i18n/cy.po b/deluge/i18n/cy.po
new file mode 100644
index 0000000..3a14068
--- /dev/null
+++ b/deluge/i18n/cy.po
@@ -0,0 +1,3820 @@
+# Welsh translation for deluge
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-05-15 16:34+0000\n"
+"Last-Translator: Me <Glich.Glich@googlemail.com>\n"
+"Language-Team: Welsh <cy@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Cyfrinair:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Dewiswch Blygell"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Lleoliad Lawrlwytho</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Enw:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Rhybudd"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Gwall"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Cynnydd"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Digyfwng"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Arall..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Lawr"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Fyny"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Lawrlwythiadau"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Rhwydwaith"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Ystod"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Arall"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Ategion"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Enw Ffeil"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Maint"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Pob ffeil"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Cysylltiadau"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Diffodd"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Blaenoriaeth"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Enw"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Lawrlwytho"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Partneriaid"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ETA"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Cymhareb"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Ffeil"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Ychwanegu Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Golygu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Golwg"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Bar Offer"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Colofnau"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Cymorth"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Ychwanegu Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Tynnu Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Seibio"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Ail-ddechrau"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Blaenoriaethau"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Darnau:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Datgan Nesa:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Uwchlwythwyd:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Lawrlwythwyd:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># o ffeiliau:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Maint Llawn:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Enw:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Llwybr:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Manylion"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Seibio Popeth"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Lefel:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Amgryptiad</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Cyflymder Lawrlwytho Cyflymaf (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Galluogi"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "Add"
+#~ msgstr "Ychwanegu"
+
+#~ msgid "Remove"
+#~ msgstr "Tynnu"
+
+#~ msgid "Clear"
+#~ msgstr "Clirio"
+
+#~ msgid "Availability"
+#~ msgstr "Argaeledd"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Cyflymder:</b>"
+
+#~ msgid "Details"
+#~ msgstr "Manylion"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Dileu ffeil .torrent"
+
+#~ msgid "Select All"
+#~ msgstr "Dewis Popeth"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Server"
+#~ msgstr "Gwasanaethwr"
+
+#~ msgid "Port"
+#~ msgstr "Porth"
+
+#~ msgid "Username"
+#~ msgstr "Enw Defnyddiwr"
+
+#~ msgid "Password"
+#~ msgstr "Cyfrinair"
+
+#~ msgid "_Quit"
+#~ msgstr "_Gadael"
+
+#~ msgid "Unknown"
+#~ msgstr "Anhysbys"
+
+#~ msgid "Download"
+#~ msgstr "Lawrlwytho"
+
+#~ msgid "Upload"
+#~ msgstr "Lanlwytho"
+
+#~ msgid "Graph"
+#~ msgstr "Graff"
+
+#~ msgid "Files"
+#~ msgstr "Ffeiliau"
+
+#~ msgid "Template"
+#~ msgstr "Templed"
+
+#~ msgid "About"
+#~ msgstr "Manylion"
+
+#~ msgid "Logout"
+#~ msgstr "Allgofnodi"
+
+#~ msgid "Disable"
+#~ msgstr "Analluogi"
+
+#~ msgid "Login"
+#~ msgstr "Mewngofnodi"
+
+#~ msgid "Set"
+#~ msgstr "Gosod"
+
+#~ msgid "Submit"
+#~ msgstr "Cyflwyno"
+
+#~ msgid "Total Size"
+#~ msgstr "Maint Cyflawn"
+
+#~ msgid "Start"
+#~ msgstr "Cychwyn"
+
+#~ msgid "Speed"
+#~ msgstr "Cyflymder"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "seconds"
+#~ msgstr "eiliadau"
+
+#~ msgid "Type"
+#~ msgstr "Math"
+
+#~ msgid "From"
+#~ msgstr "Oddi wrth"
+
+#~ msgid "Filters"
+#~ msgstr "Ffiltrau"
diff --git a/deluge/i18n/da.po b/deluge/i18n/da.po
new file mode 100644
index 0000000..60403ed
--- /dev/null
+++ b/deluge/i18n/da.po
@@ -0,0 +1,6390 @@
+# Danish translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2019-01-17 20:26+0000\n"
+"Last-Translator: scootergrisen <scootergrisen@gmail.com>\n"
+"Language-Team: Danish <da@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr "B"
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr "KiB"
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr "MiB"
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr "GiB"
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr "TiB"
+
+#: deluge/common.py:410
+msgid "K"
+msgstr "K"
+
+#: deluge/common.py:411
+msgid "M"
+msgstr "M"
+
+#: deluge/common.py:412
+msgid "G"
+msgstr "G"
+
+#: deluge/common.py:413
+msgid "T"
+msgstr "T"
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr "K/s"
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr "M/s"
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr "MiB/s"
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr "G/s"
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr "GiB/s"
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr "T/s"
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr "TiB/s"
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr "Fælles valgmuligheder"
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr "Udskriv denne hjælpemeddelelse"
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr "Udskriv versionsinformation"
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr "Sæt stien til konfigurationsmappen"
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr "Output til en angivet logfil i stedet for stdout"
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr "Sæt log-niveauet (none, error, warning, info, debug)"
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr "Stille logningsoutput (Samme som `--loglevel none`)"
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+"Profilen %(prog)s med cProfile. Outputter til stdout medmindre der angives "
+"et filnavn"
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr "Processtyring-valgmuligheder"
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr "Pidfil som proces-id'et skal gemmes i"
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr "Dæmonisér (fork) ikke processen"
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr "Skift til denne bruger ved opstart (kræver root)"
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr "Skift til denne gruppe ved opstart (kræver root)"
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr "Dæmon-valgmuligheder"
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr "IP-adresse hvor der skal lyttes efter brugerfladeforbindelser"
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr "Port hvor der skal lyttes efter brugerfladeforbindelser"
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr "IP-adresse hvor der skal lyttes efter BitTorrent-forbindelser"
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr "Alle"
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr "Aktive"
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr "Undersøger"
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr "Henter"
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr "Udgiver"
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr "Sat på pause"
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr "Sat i kø"
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr "Fejl"
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr "Navn"
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr "Fremgang"
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr "Status"
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr "Størrelse"
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr "Hentet"
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr "Sendt"
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr "Forhold"
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr "Downloadhastighed"
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr "Sendehastighed"
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr "Ned-grænse"
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr "Op-grænse"
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr "Maks. forbindelser"
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr "Maks. uploadpladser"
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr "Modparter"
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr "Tilgængelig"
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr "Seedere:Modparter"
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr "Tilføjet"
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr "Tracker"
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr "Downloadmappe"
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr "Sidste aktivitet"
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr "Anslået tid til afslutning"
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr "Priortér første/sidste"
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr "Automatisk håndteret"
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr "Stop ved forhold"
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr "Stopforhold"
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr "Fjern ved forhold"
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr "Sti til flyt fuldførte"
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr "Ejer"
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr "Stykker"
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr "Advarsel"
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr "Bekendtgørelse OK"
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr "Bekendtgørelse sendt"
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr "Brugerflade"
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr "Downloads"
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr "BÃ¥ndbredde"
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr "Kø"
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr "Netværk"
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr "Proxy"
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr "Cache"
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr "Øvrige"
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr "Dæmon"
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr "Plugins"
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr "Lav"
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr "Normal"
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr "Høj"
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr "Afghanistan"
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr "Ålands Øerne"
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr "Albanien"
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr "Algeriet"
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr "Amerikansk Samoa"
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr "Antarktis"
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr "Antigua og Barbuda"
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr "Argentina"
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr "Armenien"
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr "Australien"
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr "Østrig"
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr "Azerbajdjan"
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr "Bahamas"
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr "Bahrain"
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr "Bangladesh"
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr "Hviderusland"
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr "Belgien"
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr "Bermuda"
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr "Bolivia"
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnien-Hercegovina"
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr "Bouvetøen"
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr "Brasilien"
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr "Britisk-Indisk havområde"
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr "Brunei"
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr "Bulgarien"
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr "Cambodja"
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr "Cameroun"
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr "Canada"
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr "Kap Verde"
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr "Caymanøerne"
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr "Centralafrikanske Republik"
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr "Tchad"
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr "Chile"
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr "Kina"
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr "Christmas Island (Indiske Ocean)"
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr "Cocos (Keeling) Islands"
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr "Colombia"
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr "Comoros"
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr "Kongo"
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr "Kongo, den demokratiske republik"
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr "Cook-øerne"
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr "Elfenbenskysten"
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr "Kroatien"
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr "Cuba"
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr "Cypern"
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr "Tjekkiet"
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr "Danmark"
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr "Djibouti"
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr "Dominica"
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr "Dominikanske Republik"
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr "Ecuador"
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr "Egypten"
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr "Ækvatorialguinea"
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr "Estland"
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr "Etiopien"
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falkland-øerne"
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr "Færøerne"
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr "Fiji"
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr "Finland"
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr "Frankrig"
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr "Fransk Guinea"
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr "Fransk Polynesien"
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr "Franske Sydlige Territorier"
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr "Georgien"
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr "Tyskland"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Grækenland"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Grønland"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadeloupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Guinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Guinea-Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guyana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Heard-øen og McDonald-øerne"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Vatikanstaten"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Ungarn"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Island"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "Indien"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonesien"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Iran"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Irak"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Irland"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Isle of Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Israel"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italien"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaica"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japan"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordan"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kasakhstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenya"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Korea, Den Demokratiske Folkerepublik"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Korea, Republikken"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuwait"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kirgisistan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Lao, Folkets Demokratiske Republik"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Letland"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Libanon"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberia"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libyske Arabiske Jamahiriya"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Litauen"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luxembourg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Makedonien, Den Tidligere Jugoslaviske Republik"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagaskar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malaysia"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldiverne"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Marshalløerne"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinique"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauretanien"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Mexico"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Mikronesiens Forenede Stater"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldavien"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongoliet"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Montenegro"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Marokko"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambique"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Burma"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Holland"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Hollandske Antiller"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Ny Kaledonien"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "New Zealand"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Norfolk Island"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Nordmarianerne"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norge"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palæstinensiske Territorie, Det Besatte"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua Ny Guinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguay"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filippinerne"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Polen"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugal"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Qatar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Réunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Rumænien"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Rusland"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Rwanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "St Barthelemy"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Sankt Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Sankt Kitts og Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Sankt Lucia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Sankt Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Sankt Pierre og Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Saint Vincent og Grenadinerne"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Sao Tomé og Principe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Saudi Arabien"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbien"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seychellerne"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapore"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slovakiet"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slovenien"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Salomon-øerne"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Sydafrikanske republik"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Sydgeorgien og Sydsandwichøerne"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Spanien"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Surinam"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard og Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Swaziland"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Sverige"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Svejts"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Den arabiske republik Syrien"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr "Taiwan"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tajikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzania, Den Forenede Republik"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Thailand"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Timor-Leste"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad og Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunesien"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Tyrkiet"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Turks- og Caicosøerne"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukraine"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Forenende Arabiske Emirater"
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Storbritannien"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "USA"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "USA, mindre omliggende øer"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Uruguay"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Uzbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Britiske Jomfruøer"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Amerikanske Jomfruøer"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis- og Futuna-øerne"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Vestsahara"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Yemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabwe"
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr "Brugerflade-valgmuligheder"
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr "Webserver-valgmuligheder"
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr "IP-adresse som webserveren skal lytte på"
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr "Port som webserveren skal lytte på"
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr "Tving webserveren til at bruge SSL"
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr "Tving webserveren til at deaktivere SSL"
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr "Dæmon findes ikke"
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr "Dæmon kører ikke"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr "Filnavn"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr "Niveau"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr "Vælg en fil"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr "Vælg en mappe"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr "Gem .torrent-fil"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr "Torrent-filer"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr "Alle filer"
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr "Indtast din adgangskode for at vise Deluge..."
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr "Indtast din adgangskode for at afslutte Deluge..."
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr "Ophavsret %(year_start)s-%(year_end)s Deluge-teamet"
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+"Et modpart-til-modpart-fildelingsprogram\n"
+"som anvender BitTorrent-protokollen."
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr "Klient:"
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr "Nuværende udviklere:"
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr "Tidligere udviklere og bidragere:"
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+"Dette program er fri software; du kan distribuere og/eller modificere det "
+"under reglerne i GNU General Public License, udgivet af The Free Software "
+"Foundation; enten version 3 af licensen eller (efter dit valg) en hvilken "
+"som helst senere version.\n"
+"\n"
+"Dette program er distribueret i håb om, at det ville være brugbart, men UDEN "
+"NOGEN GARANTI; selv uden den implicitte garanti, SALGBARHED eller EGNETHED "
+"TIL ET BESTEMT FORMÃ…L. Se GNU General Public License for flere detaljer.\n"
+"\n"
+"Du burde have modtaget en udgave af GNU General Public License sammen med "
+"dette program; hvis ikke, se <http://www.gnu.org/licenses>.\n"
+"\n"
+"Ydermere som en særlig undtagelse giver opretshaverne tilladelse til at "
+"linke til koden eller portioner af dette program via OpenSSL-arkivet. Du "
+"skal overhold GNU General Public License i alle henseender for al brug af "
+"koden ud over OpenSSL.\n"
+"\n"
+"Hvis du modificerer en eller flere filer under denne undtagelse, må du "
+"udvide denne undtagelse til din version af filen/filerne, men du er ikke "
+"tvunget til dette. Hvis du ikke ønsker at gøre dette, slet udsagn om "
+"undtagelsen fra din version. Hvis du sletter denne undtagelse fra alle "
+"kildefiler i programmet, slet det da også her."
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr "Server:"
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr "libtorrent:"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr "Ugyldig fil"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr "Vælg en .torrent-fil"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr "Ugyldig URL"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr "er ikke et gyldigt URL."
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr "Downloader..."
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr "Download mislykkedes"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr "Fejlslagne download(s):"
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr "Detaljer:"
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr "Brugernavn:"
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr "Adgangskode:"
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr "Beskyttet med adgangskode"
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr "Andet..."
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr "Frakoblet"
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr "DHT-knuder"
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr "Fri diskplads"
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr "Ja"
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr "Nej"
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr "Prioritet"
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr "_Alle"
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr "_Status"
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr "_Detaljer"
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr "Fi_ler"
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr "Mod_parter"
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr "_Valgmuligheder"
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr "Ikke tilsluttet..."
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr "Ubegrænset"
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr "Ned"
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr "Op"
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr "Frakoblet"
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr "Tilkoblet"
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr "Forbundet"
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr "Status"
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr "Vært"
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr "Version"
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr "_Stop dæmon"
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr "Kan ikke starte dæmon!"
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr "Fejl ved tilføjelse af vært"
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr "Brugernavn"
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr "Niveau"
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr "Slået til"
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr "Plugin"
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr "Vælg pluginet"
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr "Plugin-æg"
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr "Tilstande"
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr "Trackere"
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr "Ingen"
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr "Admin"
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr "Etiketter"
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr "Ingen Etiket"
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr "<i>Klientversion</i>"
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr " Torrents sat i kø"
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr " Torrent-fil sat i kø"
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr "Sæt ubegrænset"
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr "Til"
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr "Fra"
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr "Slå fra"
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr "Adresse"
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr "Klient"
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr "GTK-valgmuligheder"
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr "Opretter torrent"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr "Torrentoverførsler i kø"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr "_Fjern"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr "Tilføj automatisk torrents ved forbindelse"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr "_Filer"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr "_Tilføj torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr "_Opret torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr "Afslut og _stop dæmon"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr "_Rediger"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr "_Forbindelseshåndtering"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr "_Vis"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr "_Værktøjslinje"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr "_Sidepanel"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr "Status_bjælke"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr "F_aneblade"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr "_Kolonner"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr "S_idepanel"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr "Vis _nul træffere"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr "Vis _trackere"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr "_Hjælp"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr "_Hjemmeside"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr "_OSS"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr "Ofte stillede spørgsmål"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr "_Fællesskab"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr "Tilføj torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr "Tilføj torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr "Fjern torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr "Fjern torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr "Sæt valgte torrents på pause"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr "Pause"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr "Genoptag valgte torrents"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr "Genoptag"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr "Skub torrent frem i køen"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr "Flyt op i køen"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr "Skub torrent tilbage i køen"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr "Flyt ned i køen"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr "Indstillinger"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr "Forbindelseshåndtering"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr "Tvungen"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr "Slået fra"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr "HÃ¥ndtryk"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr "Begge"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr "HTTP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr "Vis sessionshastighed i titelbjælken"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr "Giv fokus til vindue når der tilføjes torrent"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr "Slå statusikon til"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr "Minimer til statusområdet ved lukning"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr "Start i statusområde"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr "Beskyt statusikonet med en adgangskode"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr "Flyt fuldførte til:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr "Kopi af .torrent-filer i:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr "Slet kopi af torrent-fil når den fjernes"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr "Slet kopi af torrent-filen, når torrenten er fjernet"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr "Hent til:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Prioritér første og sidste stykker af torrent"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Prioritér første og sidste stykker af filer"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr "Tilføj torrent i Pause-tilstand"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr "Tilføj torrent-valgmuligheder"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr "Vis altid"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr "Bring dialogen i fokus"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "Største antal tilladte forbindelser. Sæt til -1 for ubegrænset."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr "Forbindelser:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Største antal sendepladser for alle torrents. Sæt til -1 for ubegrænset."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr "Uploadpladser:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Den højeste downloadhastighed for alle torrents. Sæt til -1 for ubegrænset."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr "Modtagehastighed:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Den højeste uploadhastighed for alle torrents. Sæt til -1 for ubegrænset."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr "Sendehastighed:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr "Ignorer begrænsninger på det lokale netværk"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr "Ratebegræns IP-overhead"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Hvis dette felt er markeret bliver den anslåede TCP/IP-overhead drænet fra "
+"ratebegrænserne, for at undgå at den samlet trafik overskrider grænserne"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"Det højeste antal sendepladser pr. torrent. Sæt til -1 for ubegrænset."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"Det højeste antal af forbindelser pr. torrent. Sæt til -1 for ubegrænset."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+"Den maksimale uploadhastighed pr. torrent. Sæt den til -1 for ubegrænset."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr "Tilfældig"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr "Aktiv port:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr "Test aktiv port"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr "Fra:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr "Til:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr "Niveau:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr "Kryptering"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr "Universel Plug and Play"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT Port Mapping protokol"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr "Modpartsudveksling"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery finder modparter på det lokale netværk."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+"Distribueret hashtabel vil muligvis forbedre antallet af aktive forbindelser."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr "Modpartens TOS-byte:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr "Værtsnavn:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr "Proxy-modparter"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Cache-størrelse (16 KiB-blokke):"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Antal sekunder fra den sidste cachede skrivning til et stykke i write-"
+"cachen, til den tvinges til at blive flushed til disken. "
+"Standardindstillingen er 60 sekunder."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr "Cache-udløbstid (sekunder):"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr "Indstillinger"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"Det totale antal af 16 KiB blokke der er blevet skrevet til disken siden "
+"denne session blev startet."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr "Blokke Skrevet:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"Det totale antal af skrive-operationer der er blevet udført siden denne "
+"session blev startet."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr "Skrivninger:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"Forholdet (blocks_written - wries) / blocks_written repræsenterer antallet "
+"af gemte skrive-operationer pr. samlede skrive-operationer, dvs. en slags "
+"cache hit-forhold for skrive-cachen."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr "Skrive-cache hit-forhold:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Antal blokke, der blev anmodet om af BitTorrent-motoren (fra modparter), der "
+"blev uddelt fra disken eller cache."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr "Blokke Læst:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr "Antal blokke der blev uddelt fra cachen."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr "Blokke læse-hit:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr "Cache hit-forhold for skrive-cachen."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr "Læse-cache hit-forhold:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+"Det samlede antal læse-operationer som er blevet udført siden denne session "
+"startede."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr "Læsninger:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Antal 16 KiB-blokke i disk-cachen på nuværende tidspunkt. Dette omfatter "
+"både læse- og skrive-cache."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr "Cachestørrelse:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr "Læse-cachestørrelse:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Hjælp os med at forbedre Deluge ved at sende os oplysninger om din Python-"
+"version, PyGTK-version, operativsystem og processor. Ingen andre oplysninger "
+"vil blive sendt."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr "Ja, send venligst anonyme statistikker"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr "Placering:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Hvis Deluge ikke kan finde databasefilen på dette sted vil det falde tilbage "
+"til at bruge DNS til at løse modparternes land."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr "Dæmonport:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr "Port"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr "Tillad fjernforbindelser"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr "Forbindelser"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr "Søger periodisk efter nye udgivelser på webstedet"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr "Version:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr "Forfatter:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr "Hjemmeside:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr "Udviklers e-mail:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr "Oplysninger"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr "Tilføj modpart"
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr "værtsnavn:port"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr "<b>Generelt</b>"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr "Afbryd"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr "Tilføj"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr "Fjern"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr "Tilføj infohash"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr "Infohash:"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr "Trackere:"
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr "Tilføj vært"
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr "Destination:"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr "Ny udgivelse"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr "_GÃ¥ til websted"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr "Vis ikke denne dialog i fremtiden"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr "Seedere:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr "Modparter:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr "Navn:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr "Kommentarer:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr "Flyt fuldførte:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr "Stands udgivelse ved forholdstal:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr "Fjern ved forholdstal"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr "_Rediger trackere"
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr "Øverst"
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr "Nederst"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr "Tilføj torrents"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr "Tilføj i _pauset tilstand"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr "Priotér første/sidste stykker"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr "Spring over tjek af filhash"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr "Anvend på alle"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr "Gendan standarder"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr "_Vis Deluge"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr "Hastighedsgrænse for _download"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr "Hastighedsgrænse for _upload"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr "Afslut og luk dæmon ned"
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr "Rediger trackere"
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr "_Tilføj modpart"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr "Tilføj en modpart vha. dens IP"
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr "Rediger tracker"
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr "Indtast fjernsti"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr "Sti:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr "Opret en torrent"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr "Mappe"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr "_Fjernsti"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr "Filer"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr "Webseedere"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr "Stykkestørrelse:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr "Sæt privatflag"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr "Tilføj denne torrent til sessionen"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr "Valgmuligheder"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr "Gem .torrent som"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr "_Pause"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr "_Genoptag"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr "Genoptag valgte torrents."
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr "_Indstillinger"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr "_Kø"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr "_Opdater tracker"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr "_Fjern torrent"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr "_Gennemtving gentjek"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr "etiket"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr "_Vælg alle"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr "Sæt alle på _pause"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr "Gen_optag alle"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr "_Forbindelsesbegrænsning"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr "Sende_pladsbegrænsning"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr "_Automatisk håndteret"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr "Tilføj tracker"
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr "Tilføj URL"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr "Deluge-dæmoner"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr "Opret automatisk forbindelse til valgte dæmon"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr "Opstart-valgmuligheder"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr "Udvid all_e"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr "BitTorrent-klient"
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr "Deluge BitTorrent-klient"
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr "Download og del filer over BitTorrent"
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr "Konsol-valgmuligheder"
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr "Konsol-kommandoer"
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr "Beskrivelse"
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr "Følgende konsol-kommandoer til tilgængelige:"
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr "Kommando"
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr "Dæmonvært og -port"
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr "Adgangskode"
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr "Vis mere detaljerede information inklusiv filer og modparter."
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr "Vælg vært"
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr "Afslut"
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr "Slet vært"
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr "Generelle valgmuligheder"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr "Sprog"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr "Kommandolinjetilstand"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr "Mapper"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr "Download til"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr "Flyt fuldførte til"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr "Fra"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr "Til"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr "Brug tilfældige porte"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr "Indkommende"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr "Udgående"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr "Største antal forbindelser"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr "Højeste antal sendepladser"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr "Maximalt antal Halvåbne Forbindelser"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr "Maksimalt antal forbindelsesforsøg i sekundet"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr "Begræns IP Overhead"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr "Dæmonport"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr "Delingsforhold"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr "Type"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr "Anvend"
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr "Vælg sprog"
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr "IP-adressen \"%s\" er dårligt udformet"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP-liste (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer-tekst (zip-pakket)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian-tekst (ukomprimeret)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr "Blokerede IP-områder/hvidlistede områder"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr "Blokeringsliste"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr "DÃ¥rlig IP-adresse"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr "Ugyldig leder"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr "Ugyldig magisk kode"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr "Ugyldig version"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr "Dage"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr "Led efter ny liste hver:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr "Importér blokeringsliste ved opstart"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr "<b>Indstillinger</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Hent blokeringsliste om nødvendigt og importér filen."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr "Undersøg download og import"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr "Hent og importér ny blokeringsliste."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr "Gennemtving download og import"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr "Blocklist er opdateret"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr "<b>Valgmuligheder</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr "Type:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr "Dato:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr "Filstørrelse:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr "<b>Oplysninger</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr "<b>Hvidliste</b>"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr "Torrent Færdig"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr "Torrent tilføjet"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr "Torrent fjernet"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr "Udfør"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr "Begivenhed"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr "<b>Tilføj Kommando</b>"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr "<b>Kommandoer</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr "Inkompatibelt tilvalg"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr "Tilføj automatisk"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr "Dobbeltklik for at skifte"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr "Dobbeltklik for at redigere"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr "Sti"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr "Overvågningsmappe eksisterer ikke."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr "Stien eksisterer ikke."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr "Indstillinger for overvågningsmappe"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+"Hvis en .torrent-fil tilføjes denne mappen,\n"
+"så tilføjes den i denne session."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr "Vælg en mappe"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr "Slå overvågningsmappe til"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr "<b>Overvågningsmappe</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr "Slet .torrent efter tilføjelse"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+"Når torrenten tilføjes til sessionen,\n"
+"slettes .torrent'en."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr "Vedhæft endelse efter tilføjelse:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ".tilføjet"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr "<b>Torrent-filhandling</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr "Sæt downloadmappe"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr "Mappen hvor torrent-dataen downloades til."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr "<b>Downloadmappe</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr "Sæt mappe til flyt fuldførte"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr "<b>Flyt fuldførte</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr "Etiket: "
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr "<b>Etiket</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr "Hoved"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr "<b>Ejer</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr "Højeste sendehastighed:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr "Største antal forbindelser:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr "Højeste antal sendepladser:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr "Højeste modtagehastighed:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr "<b>BÃ¥ndbredde</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr "Autohåndteret:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr "Tilføj pausede:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr "Sæt i kø til:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr "<b>Kø</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr "<b>Overvågningsmapper</b>"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr "minutter"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr "1 minut"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr "1 sekund"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr "sekunder"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr "Statistik"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr "Opløsning"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr "Seedere/modparter"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr "Downloadfarve:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr "Uploadfarve:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr "<b>Forbindelsesgraf</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr "<b>BÃ¥ndbreddegraf</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr "DHT-torrents:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr "<b>Seedere/modparter</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr "<b>Graffarver</b>"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr "WebUi"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+"Deluge web-grænseflade er ikke installeret. Installér venligst\n"
+"grænsefladen og prøv igen"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr "Aktivér Web-grænseflade"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr "Aktiver SSL"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr "Lytteport:"
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Ugyldig etiket, gyldige symboler:[a-z0-9_-]"
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr "Tom etiket"
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr "Etiket findes allerede"
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr "Ukendt etiket"
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr "Ukendt torrent"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr "Etiket-_valgmuligheder"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr "_Fjern etiket"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr "_Tilføj etiket"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr "Etiket-valgmuligheder"
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr "Etiket"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr "tracker1.org"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr "<b>Etiket-valgmuligheder</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr "Anvend max-indstillinger pr. torrent:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr "Maksimum"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr "Anvend køindstillinger:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr "Anvend mappeindstillinger:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 linje pr. tracker)</i>"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr "Anvend automatisk etiket:"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr "Tilføj etiket"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr "<b>Tilføj etiket</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Brug sidepanelet til at tilføje, redigere og fjerne etiketter. </i>\n"
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr "<b>Etiketter</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr "Notifikations-blink vist"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr "Pop op-notifikation er ikke slået til."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr "Notifikations-pop op vist"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr "Lydnotifikation ikke slået til"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr "pygame er ikke installeret"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr "Lydnotifikation fejlede %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr "Lydpåmindelse lykkedes"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr "Afsluttet torrent"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+"Torrenten \"%(name)s\" inklusiv %(num_files)i fil(er) er færdige med at "
+"downloade."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr "Notifikationer"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr "Vælg lydfil"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr "Der opstod en fejl under afsendelse af notifikations-e-mail: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr "Serveren svarede ikke ordentligt på HELO-hilsen: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr "Serveren afviste kombinationen af brugernavn/adgangskode: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr "Notifikations-e-mail sendt."
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr "Afsluttede torrent \"%(name)s\""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+"Denne e-mail er blevet endt for at informere dig om at Deluge er færdig med "
+"at downloade \"%(name)s\" , som inkluderer %(num_files)i filer.\n"
+"For ikke længere at modtage disse meddelelser skal de blot slå e-mail-"
+"notifikationer fra i Deluge's indstillinger.\n"
+"Tak,\n"
+"Deluge"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr "Blink for bakkeikon slået til"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr "Pop op'er slået til"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr "Lyd aktiveret"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr "<b>UI-notifikationer</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr "<b>Modtagere</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr "Server kræver TLS/SSL"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr "<b>E-mail-notifikationer</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+"Denne konfiguration betyder ikke, at du faktisk vil modtage notifikationer "
+"for alle disse hændelser."
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr "Abonnementer"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr "Lydtilpasning"
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr "Udtrækker"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr "Udpak til:"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr "Opret undermappe med samme navn som torrenten"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Denne valgmulighed vil oprette en undermappe med samme navn som torrenten i "
+"den valgte udpakningsmappe og placere de udpakkede filer i den."
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr "Planlægger"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr "Grænse for download:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr "Grænse for upload:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr "Aktive torrents:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr "Aktive downloads:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr "Aktive seeds:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Langsomme Indstillinger</b>"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr "Log ud"
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr "Gem"
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr "Vært:"
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr "Flyt"
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr "Log på"
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr "Sæt højeste antal forbindelser"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr "Modtagehastighed"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr "Sæt højeste modtagehastighed"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr "Sendehastighed"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr "Sæt højeste sendehastighed"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr "Protokol Traffik Download/Upload"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr "Tilslut"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr "Stop dæmon"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr "Start dæmon"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr "Filtre"
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr "Modtagehastighedsgrænse"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr "Upload hastighedsbegrænsning:"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr "Forbindelsesbegrænsning"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr "Sendepladsbegrænsning"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr "Opdatér tracker"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr "Gennemtving Gentjek"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr "Detaljer"
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr "Kommentar:"
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr "Status:"
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr "Flyt fuldførte:"
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr "Generelt"
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr "Privat"
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr "Indlæser"
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr "Sand"
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr "Giv besked om nye versioner"
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr "Største antal forbindelser:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Højeste downloadhastighed (KiB/s):"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Højeste uploadhastighed (KiB/s):"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr "Højeste antal halvåbne forbindelser:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Højeste antal forbindelsesforsøg per sekund:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr "Højeste antal sendepladser:"
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr "Tving brug af proxy"
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr "Server"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr "Tilføj fra Url"
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr "Adresse"
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr "Cookies"
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr "Fil"
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr "Infohash"
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr "Uploader din torrent..."
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr "Ikke en gyldig torrent"
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr "Mappe til flyt fuldførte"
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr "Maks. downloadhastighed"
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr "Maks. uploadhastighed"
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr "Tilføj i pauset tilstand"
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr "Modtag"
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr "Dato tilføjet:"
+
+#~ msgid "pynotify is not installed"
+#~ msgstr "pynotify er ikke installeret"
+
+#~ msgid "pynotify failed to show notification"
+#~ msgstr "pynotify kunne ikke vise notifikation"
+
+#~ msgid "<b><i><big>Notifications</big></i></b>"
+#~ msgstr "<b><i><big>Notifikationer</big></i></b>"
+
+#~ msgid "_Normal Priority"
+#~ msgstr "_Normal prioritet"
+
+#~ msgid "_High Priority"
+#~ msgstr "_Høj prioritet"
+
+#~ msgid "Associate Magnet links with Deluge"
+#~ msgstr "Associer Magnet-links med Deluge"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulgarsk"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabisk"
+
+#~ msgid "German"
+#~ msgstr "Tysk"
+
+#~ msgid "Danish"
+#~ msgstr "Dansk"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosnisk"
+
+#~ msgid "Czech"
+#~ msgstr "Tjekkisk"
+
+#~ msgid "Belarusian"
+#~ msgstr "Hviderussisk"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengalsk"
+
+#~ msgid "Greek"
+#~ msgstr "Græsk"
+
+#~ msgid "English (Australia)"
+#~ msgstr "Engelsk (Australien)"
+
+#~ msgid "English (Canada)"
+#~ msgstr "Engelsk (Canada)"
+
+#~ msgid "English"
+#~ msgstr "Engelsk"
+
+#~ msgid "Spanish"
+#~ msgstr "Spansk"
+
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Engelsk (Storbritannien)"
+
+#~ msgid "Esperanto"
+#~ msgstr "Esperanto"
+
+#~ msgid "Afrikaans"
+#~ msgstr "Afrikaans"
+
+#~ msgid "Irish"
+#~ msgstr "Irsk"
+
+#~ msgid "French"
+#~ msgstr "Fransk"
+
+#~ msgid "Finnish"
+#~ msgstr "Finsk"
+
+#~ msgid "Persian"
+#~ msgstr "Persisk"
+
+#~ msgid "Croatian"
+#~ msgstr "Kroatisk"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonesisk"
+
+#~ msgid "Icelandic"
+#~ msgstr "Islandsk"
+
+#~ msgid "Italian"
+#~ msgstr "Italiensk"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Japanese"
+#~ msgstr "Japansk"
+
+#~ msgid "Macedonian"
+#~ msgstr "Makedonsk"
+
+#~ msgid "Korean"
+#~ msgstr "Koreansk"
+
+#~ msgid "Latin"
+#~ msgstr "Latinsk"
+
+#~ msgid "Kurdish"
+#~ msgstr "Kurdisk"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongolsk"
+
+#~ msgid "Polish"
+#~ msgstr "Polsk"
+
+#~ msgid "Burmese"
+#~ msgstr "Burmesisk"
+
+#~ msgid "Slovenian"
+#~ msgstr "Slovensk"
+
+#~ msgid "Slovak"
+#~ msgstr "Slovakisk"
+
+#~ msgid "Russian"
+#~ msgstr "Russisk"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugisisk"
+
+#~ msgid "Serbian"
+#~ msgstr "Serbisk"
+
+#~ msgid "Albanian"
+#~ msgstr "Albansk"
+
+#~ msgid "Traditional Chinese"
+#~ msgstr "Kinesisk (traditionel)"
+
+#~ msgid "Simplified Chinese"
+#~ msgstr "Kinesisk (forenklet)"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamesisk"
+
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Kinesisk (Hong Kong)"
+
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Kinesisk (forenklet)"
+
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Kinesisk (Taiwan)"
+
+#~ msgid "Ignore"
+#~ msgstr "Ignorer"
+
+#~ msgid "Estonian"
+#~ msgstr "Estisk"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hebraisk"
+
+#~ msgid "Hungarian"
+#~ msgstr "Ungarsk"
+
+#~ msgid "Dutch"
+#~ msgstr "Hollandsk"
diff --git a/deluge/i18n/de.po b/deluge/i18n/de.po
new file mode 100644
index 0000000..7d63348
--- /dev/null
+++ b/deluge/i18n/de.po
@@ -0,0 +1,4777 @@
+# German translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2011-03-23 12:46+0000\n"
+"Last-Translator: Jens Maucher <Unknown>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Max. Sende-Geschwindigkeit:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Max. Empfangs-Geschwindigkeit:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Verteilen stoppen bei Verhältnis:"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+"Ungültige Bezeichnung. Gültige Zeichen sind a-z, 0-9. \"_\" und \"-\"."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Intervall zum Prüfen auf neue Liste:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Lade die Schwarzeliste wenn nötig herunter und importiere die Datei."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Überprüfe lokale Daten und importiere"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Lade die Schwarzeliste erneut herunter und importiere sie."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Zeitpunkt"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "Verbindungs-Verwaltung"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Statusleiste"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Höchste Priorität"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "Alle au_swählen"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "_Dateien"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Auf sichere Werte zurücksetzten"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ".torrent speichern als"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Torrents beim Starten automatisch hinzufügen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Zeige Wasserkopf-Bandbreite"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Wenn ausgewählt, wird der geschätzte TCP/IP-Wasserkopf von den Limits der "
+"Bandbreiten abgezogen. Das vermeidet, eine Volumenbegrenzung ungewollt zu "
+"überschreiten."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Der <i>Klassische Modus</i> verbirgt den Dienst und wird Deluge wie eine "
+"gewöhnliche Anwendung erscheinen lassen. Diese Einstellung sollte verwendet "
+"werden, wenn Deluge nicht als Dienst läuft. Um diese Einstellung zu "
+"aktivieren, muss Deluge neu gestartet werden."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Dem Dialog den Fokus geben"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Suche regelmäßig nach neuen Versionen."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Langsame Torrents nicht mitzählen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Verhältnis der Zeit als Seeder zur Download-Zeit:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Verteilen stoppen, wenn Verhältnis erreicht:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Entferne Torrent, wenn gewünschtes Verteilverhältnis erreicht ist"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Email-Adresse des Autors:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Installiere Plugin"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Beenden & Dienst stoppen"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Fortsetzen"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "Neu-Prü_fung erzwingen"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "Verbindungslimit"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Limit für Upload-Kanäle"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gedit"
+
+#~ msgid "max_download_speed"
+#~ msgstr "max_empfangs_geschwindigkeit"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "max_sende_kanäle"
+
+#~ msgid "max_connections"
+#~ msgstr "max_verbindungen"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "max_sende_geschwindigkeit"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Importiere beim Start des Dienstes"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Blockierte Bereiche: %s"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Berechne Wasserkopf-Bandbreite"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Stelle sicher, dass dieser Wert maximal %(max)d Zeichen hat (es hat "
+#~ "%(length)d)."
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Um die Änderungen zu übernehmen, starte das WebUI manuell neu."
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr "MB"
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr "GB"
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr "pygame ist nicht installiert"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr "Klangdatei auswählen"
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr "Klänge wiedergeben"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Hostname:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Benutzername:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Passwort:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr "<b>Empfänger</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr "Server verlangt TLS/SSL"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Von:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Aktiviert"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr "<b>E-Mail Benachrichtigung</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr "Pfad existiert nicht."
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Ordner auswählen"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Download-Ziel</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr "Hauptmenü"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Max. Verbindungen:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Maximale Uploads:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Bandbreite</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Entfernen bei Verhältnis"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Anfang"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Unten"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Warteschlange</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Optionen"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Limit beim Herunterladen:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Limit beim Hochladen:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Aktive Torrents"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Langsame Einstellungen</b>"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Leeres Label"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Label existiert bereits"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Unbekanntes Label"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Unbekannter Torrent"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Label-_Optionen"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "Entfe_rne Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "Füge L_abel hinzu"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Label-Optionen"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Label-Optionen</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Sende-Kanäle:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Upload-Geschwindigkeit:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Download-Geschwindigkeit:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Verbindungen:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Verwende Beschränkung pro Torrent:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maximum"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Automatisch verwaltet"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Verwende Einstellungen der Warteliste:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Warteschlange"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Verschiebe vollständige nach:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Verwende Einstellungen vom Standort:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Standort"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(Je eine Zeile pro Tracker)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Verwende automatisch folgendes Label:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Tracker"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Label hinzufügen"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Label hinzufügen</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Name:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr "<i>Benutzen Sie die Seitenleiste um die Labels zu bearbeiten.</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Labels</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Entpacken nach:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Erstelle Torrent Unterverzeichnis"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Diese Einstellung erstellt ein Unterverzeichnis benannt nach dem Dateinamen "
+"des Torrents innerhalb des Entpackverzeichnisses und speichert die "
+"entpackten Dateien darin ab."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Allgemein</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Web UI aktivieren"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "SSL aktivieren"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Dienst-Port:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Einstellungen</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule-IP-Liste (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer-Text (ZIP-Format)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian-Text (unkomprimiert)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (gzip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Ungültiger Anfang"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "magischer Code ungültig"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Ungültige Version"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Blockierliste"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "Adresse (URL):"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Tage"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Importiere Blockliste beim Start"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Erzwinge Herunterladen und Importieren"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Blockliste ist auf dem neusten Stand"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Optionen</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Typ:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Dateigröße:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Information</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torrent vollständig"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torrent hinzugefügt"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Ausführen"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Ereignis"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Befehl"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Befehl hinzufügen</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Befehle</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Ankündigung OK"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Anfrage gesendet"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Warnung!"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Fehler"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Afghanistan"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Ã…land"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Albanien"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Algerien"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Amerikanisch-Samoa"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antarktis"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antigua und Barbuda"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Argentinien"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Armenien"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "Australien"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Österreich"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Aserbaidschan"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Bahamas"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bahrain"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Bangladesch"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Weißrussland"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Belgien"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermudas"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Bolivien"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnien-Herzegovina"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Bouvet-Insel"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brasilien"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Britische Gebiete im Indischen Ozean"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Sultanat Brunei"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Bulgarien"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Kambodscha"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Kamerun"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Kanada"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Cap Verdische Inseln"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Cayman-Inseln"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Zentralafrikanische Republik"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Tschad"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Chile"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "China"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Weihnachtsinsel"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Kokosinseln"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Kolumbien"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Komoren"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Kongo"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Demokratische Republik Kongo"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Cookinseln"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Elfenbeinküste"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "Kroatien"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Kuba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Zypern"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Tschechische Republik"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Dänemark"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Dschibuti"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominica"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Dominikanische Republik"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Equador"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Ägypten"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Äquatorialguinea"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Estland"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Äthiopien"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falklandinseln"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Färöer"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fidschi"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Finnland"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Frankreich"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "Französisch-Guayana"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "Französisch-Polynesien"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "Französische Süd- und Antarktisgebiete"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabun"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Georgien"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "Deutschland"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Vereinigtes Königreich"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Griechenland"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Grönland"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadeloupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Guinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Guinea-Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guyana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Heard und McDonaldinseln"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Staat Vatikanstadt"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hongkong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Ungarn"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Island"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "Indien"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonesien"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Iran"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Irak"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Irland"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Isle of Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Israel"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italien"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaika"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japan"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordanien"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kasachstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenia"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Nordkorea"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Südkorea"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuwait"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kirgisistan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Laos"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Lettland"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Libanon"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberia"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libyen"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Litauen"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luxemburg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Mazedonien"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagaskar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malaysia"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Malediven"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Marshallinseln"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinique"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauretanien"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Mexiko"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Mikronesien, Föderierte Staaten von"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldawien"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolei"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Montenegro"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Marokko"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mosambik"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Myanmar (Birma)"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Niederlande"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Niederländische Antillen"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Neukaledonien"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Neuseeland"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Norfolkinsel"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Nördliche Marianen"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norwegen"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palästinensische Autonomiegebiete"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua-Neuguinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguay"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Philippinen"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairninseln"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Polen"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugal"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Katar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Réunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Rumänien"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Russland"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Ruanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Saint-Barthélemy"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "St. Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "St. Kitts und Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "St. Lucia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Saint-Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint-Pierre und Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "St. Vincent und die Grenadinen"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "São Tomé und Príncipe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Saudi-Arabien"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbien"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seychellen"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapur"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slowakei"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slowenien"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Salomonen"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Südafrika"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Südgeorgien und die Südlichen Sandwichinseln"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Spanien"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Suriname"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard und Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Swasiland"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Schweden"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Schweiz"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Syrien"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Taiwan, Republik China"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tadschikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tansania, Vereinigte Republik"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Thailand"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Osttimor"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad und Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunesien"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Türkei"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Turks- und Caicosinseln"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukraine"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Vereinigte Arabische Emirate"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Vereinigte Staaten"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Vereinigte Staaten, Kleinere Inselbesitzungen"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Uruguay"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Usbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Britische Jungferninseln"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Amerikanische Jungferninseln"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis und Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Westsahara"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Jemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Sambia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Simbabwe"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Offline"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Online"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Verbunden"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Daemon existiert nicht"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Daemon läuft nicht"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Starte Server mit Prozess-ID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Adresse"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Client"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Fortschritt"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Download"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Upload"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrents in der Warteschlange"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrent in der Warteschlange"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Unbegrenzt"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Aktiviert"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Weitere..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Runter:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Rauf:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Runter"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Rauf"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Setze maximale Empfangsgeschwindigkeit"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Setze maximale Sendegeschwindigkeit"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torrent fertig"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Diese e-mail wurde verschickt um sie zu informieren, dass Deluge mit dem "
+"Download von %(name)s fertig ist. Es sind %(num_files)i enthalten.\n"
+"Um solche e-mails nicht mehr zu erhalten, deaktivieren Sie e-mail "
+"Benachrichtigungen in den Einstellungen von Deluge.\n"
+"\n"
+"Vielen Dank,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr "Kategorien"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Downloads"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Netzwerk"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Bandbreite"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Schnittstelle"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Sonstige"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Daemon"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Proxy"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Cache"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Erweiterungen"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Erweiterung"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Modul auswählen"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Modul-Pakete"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Dateiname"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Größe"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Ungültige Datei"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Doppelter Torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Sie können den selben Torrent nicht zweimal hinzufügen."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Kann Priorität der Datei nicht setzen!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Wählen Sie eine .torrent-Datei"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Torrent-Dateien"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Alle Dateien"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Ungültige URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Download Fehlgeschlagen"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Rang"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Tracker"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Wähle eine Datei"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Ordner wählen"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Sichere .torrent-Datei"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Nicht verbunden"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Verbindungen"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Downloadgeschwindigkeit"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Uploadgeschwindigkeit"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Bandbreitenverbrauch vom Protokoll in Sende- und Empfangsrichtung"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT Knoten"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr "Freier Speicherplatz"
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Keine ankommenden Verbindungen!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Setze maximale Verbindungsanzahl"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrents"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Kategorien"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Alle"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Herunterladen"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Seeding"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Angehalten"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Hashen"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "In Warteschlange"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr "Aktiv"
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Keine"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Kein Lesezeichen"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr "Status"
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Hostname"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr "Version"
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr "Daemon _stop"
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr "Daemon _starten"
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Fehler beim Hinzufügen des Hosts"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Klassischen Modus deaktivieren?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Es wurde ein laufender Deluge Daemon-Prozess (deluged) gefunden.\n"
+"\n"
+"Sie müssen entweder diesen Daemon beenden, oder den Klassischen Modus "
+"deaktivieren um fortzusetzen."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Fehler beim Starten des Kerns"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"Es trat ein Fehler beim Starten des Kerns, der für das Ausführen von Deluge "
+"im Klassischen Modus notwendig ist, auf.\n"
+"\n"
+"Weitere Informationen sind aus folgenden Details zu entnehmen."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Es trat ein Fehler beim Start des Klassischen Modus auf. Möchten Sie den "
+"Klassischen Modus deaktivieren, um fortzusetzen?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Fehler beim Starten des Dämons"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"Bei Starten des Dämon Prozesses ist ein Fehler aufgetreten. Versuche ihn "
+"von einer Konsole aus zu starten um zu sehen ob ein Fehler vorliegt."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "An"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Aus"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Setze auf unbegrenzt"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Zielordner wählen"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Setze maximale Sende-Kanäle"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr "Normale Priorität"
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr "Hohe Priorität"
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr "Höchste Priorität"
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Priorität"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Details:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Name"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Heruntergeladen"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Hochgeladen"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Seeder"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Peers"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Verbleibende Zeit"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Verhältnis"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Verfügb."
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Hinzugefügt"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr "Pfad speichern"
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Datei"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Torrent hinzufügen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "Erstelle Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Bearbeiten"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Ansicht"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Werkzeugleiste"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Seitenleiste"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "T_abs"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Spalten"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "Se_itenleiste"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Zeige Null-Treffer"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Zeige _Tracker"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Hilfe"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr "_FAQ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Häufig gestellte Fragen (engl. FAQ)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Torrent hinzufügen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Torrent hinzufügen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Torrent entfernen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Torrent entfernen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Ausgewählte Torrents pausieren"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Pausieren"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Ausgewählte Torrents fortsetzten"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Fortsetzen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "In Warteschlange aufwärts"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "nach oben"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "In Warteschlange abwärts"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "nach unten"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Einstellungen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Verbindungsmanager"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Alles ausklappen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "Nicht herunterla_den"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Normale Priorität"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Hohe Priorität"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Automatisch Verwaltet:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Verteil-Rang:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Verteil-Zeit:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Aktive Zeit:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Tracker-Status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Verfügbarkeit:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Peers:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Seeder:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Teile:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Verbleibend:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Nächste Ankündigung:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Tauschverhältnis:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Hochgeladen:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Heruntergeladen:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Hinzugefügt:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Status"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Kommentare:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>Dateianzahl:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Gesamtgröße:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Name:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Pfad:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Details"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Dateien"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Peers"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Verschiebe Vollständige:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Privat"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Bevorzuge Anfang/Ende"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_Bearbeite Tracker"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Optionen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Entferne Torrent?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+"<big><b>Bist du sicher, dass du den markierten Torrent entfernen "
+"willst?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>Die entsprechende .torrent Datei wird gelöscht!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Die heruntergeladenen Daten werden gelöscht!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Entferne markierten Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Neue Version"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Neue Version verfügbar!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Verfügbare Version:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Aktuelle Version:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Diesen Dialog in Zukunft nicht mehr anzeigen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Gehe zu Website"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Gegenstelle nach IP hinzufügen"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Alle pausieren"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Ausgewählte Torrents fortsetzen."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Alle Torrents fortsetzen."
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Torrents hinzufügen"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Datei-Quersumme"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "Entfe_rnen"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrents</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Voll"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Kompakt"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Speicherzuweisung</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Max. Downloadgeschwindigkeit:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Max. Uploadgeschwindigkeit:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "_Pausiert hinzufügen"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Bevorzuge Anfangs-/Endstücke"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Für alle anwenden"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "URL hinzufügen"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Aus URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Datei-Quersumme hinzufügen"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Nach Datei-Quersumme</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Datei-Quersumme:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Torrent erstellen"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Torrent erstellen</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Or_dner"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "Entfe_rnter Dateipfad"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Dateien</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Autor:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Kommentare:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Informationen"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Webseeds"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Stückgröße:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Als Privat markieren"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Dieses Torrent der Sitzung hinzufügen"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Entfernten Dateipfad eingeben"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Entfernter Dateipfad</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Pfad:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Erstelle Torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Speichere .torrent-Datei</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Torrents in der Warteschlange"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Torrents aus der Warteschlange hinzufügen</b></big>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "Label"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Gegenstelle hinzufügen"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Gegenstelle hinzufügen</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "Hostname:Port"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Host hinzufügen"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Verbindungsmanager</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "Lokalen Dienst _starten"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Verbinde beim Start automatisch mit ausgewählten Host"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Starte localhost automatisch wenn nötig"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Zeige dieses Fenster nicht beim Start"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Downloads</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Automatisches Hinzufügen von .torrents von:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Herunterladen nach:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Kopie von .torrent Dateien erstellen in:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Ordner</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Volle Zuweisung verwenden"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Die Methode \"Vollständig\" reserviert den benötigten Speicherplatz für den "
+"Torrent bereits vorher und verhindert so die Fragmentierung des Dateisystems"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Kompakte Speicher Zuweisung verwenden"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+"Die kompakte Zuweisung belegt nur soviel Speicherplatz, wie gerade benötigt "
+"wird."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Bevorzuge Anfangs- und Endstücke eines Torrents"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Erste und letzte Stücke von Dateien in Torrents bevorzugen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Torrents im pausierten Zustand hinzufügen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Netzwerk</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Benutze Zufallsports"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge wählt automatisch jedes Mal einen anderen Port."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Aktiver Port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Bis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Aktiven Port testen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Ankommende Kanäle</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Ausgehende Kanäle</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Geben sie die IP-Adresse der Schnittstelle ein, an der Deluge auf eingehende "
+"bittorrent-Verbindungen warten soll. Falls sie Standard-Verhalten wünschen, "
+"lassen sie dieses Feld leer."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>Schnittstelle</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"Das TOS-Byte beschreibt die Art der gesendeten Daten mit einem Hex-Wert. Es "
+"wird in der IP-Kopfzeile jedes Paketes an die Gegenstellen (einschließlich "
+"Web-Seeds) gesendet."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "TOS-Byte für Peers:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universelles Plug-and-Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT-Port-Mapping-Protokoll"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Austausch von Gegenstellen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Lokale Dienst-Suche findet Gegenstellen in Ihrem lokalen Netzwerk."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+"Verteilte Hashtabelle (DHT) verbessert möglicherweise die Anzahl aktiver "
+"Verbindungen."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Netzwerk-Extras</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Eingehend:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Ebene:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Erzwungen\n"
+"Aktiviert\n"
+"Deaktiviert"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Protokoll\n"
+"Daten\n"
+"Beides"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Ausgehend:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Gesamten Datenstrom verschlüsseln"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Verschlüsselung</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Bandbreite</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Maximale Verbindungsversuche pro Sekunde:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Maximale Anzahl halboffener Verbindungen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Die maximale Uploadrate für alle Torrents. Auf -1 setzen für unendlich."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Maximale Uploadrate (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "max. Anzahl von Verbindungen. Setze -1 für unendlich."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Maximale Verbindungen:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Das Maximum an Upload-Slots für alle Torrents. Für keine Begrenzung auf -1 "
+"setzen."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Maximale Anzahl an Upload-Slots:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Die maximale Download-Rate für alle Torrents. Auf -1 setzen für unendlich."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Maximale Download-Rate (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Ignoriere Limits im lokalen Netzwerk"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Gesamte Bandbreitennutzung</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr "Maximale Anzahl an Upload-Slots pro Torrent. -1 für unbegrenzt."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "Maximale Anzahl an Verbindungen pro Torrent. -1 für unbegrenzt."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Bandbreite pro Torrent</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Oberfläche</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Aktivieren"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Klassischer Modus</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Zeige die Geschwindigkeit in der Fensterleiste"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Hauptfenster</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Immer zeigen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Torrent Hinzufügen Dialog</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Symbol im Benachrichtigungsfeld anzeigen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Beim Schließen in das Benachrichtigungsfeld minimieren"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Starte im Tray"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Schütze Benachrichtigungsfeld mit Passwort"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Benachrichtigungsfeld</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Anderer</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Ãœber Updates informiert werden"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge prüft, ob eine neue Versionen vorhanden ist und weist Sie "
+"gegebenenfalls darauf hin."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Updates</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Helfen Sie uns Deluge zu verbessern indem Sie uns Ihre Python- und PyGTK-"
+"Version, Ihr Betriebssytem und Prozessor-Typ senden. Garantiert keine andere "
+"Information wird übermittelt."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Ja, sende anonymisierte Statistiken"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>System-Informationen</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Ort:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Falls Deluge die Datenbank-Datei an diesem Ort nicht finden kann, greift es "
+"auf DNS zurück um das Land des Peers zu ermitteln."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP Datenbank</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Verknüpfe Magnet Links mit Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Daemon</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Daemon port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Port</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Entfernte Verbindungen erlauben"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Verbindungen</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Andere</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Warteschlange</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Neue Torrents oben einreihen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Aktives Verteilen gesamt:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Aktiv gesamt:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Aktives Downloaden gesamt:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Aktive Torrents</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Limit für Verteilungs-Verhältnis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Seed Dauer (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Seede</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Proxy</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Host:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Keine\n"
+"SOCKSv4\n"
+"SOCKSv5\n"
+"SOCKSv5 mit Auth.\n"
+"HTTP\n"
+"HTTP mit Auth."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Gegentelle</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Web-Seed</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Tracker</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Cache</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Cache-Größe (16 KiB Blöcke):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Die maximale Anzahl von Sekunden seit der letzten Änderung eines Fragments "
+"im Schreib-Cache, bis das Schreiben auf die Festplatte erzwungen wird. "
+"Standard-Wert ist 60 Sekunden."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Cache Lebensdauer (Sekunden):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"Die Gesamtanzahl der 16 KiB Blöcke, die seit dem Start dieser Sitzung auf "
+"die Festplatte geschrieben wurden."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Blöcke geschrieben:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"Die Gesamtanzahl der durchgeführten Schreibeoperationen seit Beginn dieser "
+"Sitzung."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Schreib-Zugriffe:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"Das Verhältnis (Blöcke_geschrieben - Schreibzugriffe) / Blöcke_geschrieben "
+"repräsentiert den Anteil an durch den Cache ersparten Schreibzugriffen."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "Schreib-Cache Trefferquote:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Schreiben</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Die Anzahl der von Peers verlangten Blöcke, die von Festplatte oder Cache "
+"versandt wurden."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Blöcke gelesen:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "Die Anzahl von Blöcken, die aus dem Cache versandt wurden."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "Blöcke gelesen (Cache):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "Die Trefferquote für den Lese-Cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "Lese-Cache Trefferquote:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+"Die Gesamtanzahl der durchgeführten Leseoperationen seit Beginn dieser "
+"Sitzung."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Lese-Zugriffe:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Lesen</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Die Gesamtanzahl von 16 KiB Blöcken, die derzeit in den Lese- und Schreib-"
+"Caches enthalten sind."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Cache-Größe:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Größe vom Lese-Cache:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Größe</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Status</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Plugins</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Version:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Internetseite:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "e_rneut nach Plugins suchen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_Weitere Plugins suchen"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Zeige Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Alle fortsetzen"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "Maximale Downloadgeschwindigkeit"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "Limit für _Upload-Geschwindigkeit"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Ordner öffnen"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Opt_ionen"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Warteschlange"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "Akt_ualisiere Tracker"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Entferne Torrent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "_Speicher verschieben"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Automatisch verwaltet"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Ausgewähltes Torrent wirklich entfernen?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Das Entfernen dieser Daten ist unwiderruflich."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Bearbeite Tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Bearbeite Tracker</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Tracker hinzufügen"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Tracker hinzufügen</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Tracker bearbeiten"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Tracker bearbeiten</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Mit lokalen _Daten entfernen."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "_Torrent entfernen"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Speicher verschieben"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Speicher verschieben</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Ziel:"
+
+#~ msgid "seconds"
+#~ msgstr "Sekunden"
+
+#~ msgid "Unknown"
+#~ msgstr "Unbekannt"
+
+#~ msgid "Download"
+#~ msgstr "Download"
+
+#~ msgid "Upload"
+#~ msgstr "Upload"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Tracker aktualisieren"
+
+#~ msgid "Total Size"
+#~ msgstr "Gesamtgröße"
+
+#~ msgid "Pieces"
+#~ msgstr "Teile"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Tauschverhältnis"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Tracker-Status"
+
+#~ msgid "Next Announce"
+#~ msgstr "Nächster Announce"
+
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgid "No"
+#~ msgstr "Nein"
+
+#~ msgid "Remove"
+#~ msgstr "Entfernen"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Mainline DHT"
+
+#~ msgid "Details"
+#~ msgstr "Details"
+
+#~ msgid "Files"
+#~ msgstr "Dateien"
+
+#~ msgid "General"
+#~ msgstr "Allgemeine Einstellungen"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Maximale gleichzeitige Verbindungen"
+
+#~ msgid "Start"
+#~ msgstr "Start"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge ist gesperrt"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge ist passwortgeschützt.\n"
+#~ "Um Deluge anzuzeigen, geben Sie bitte Ihr Passwort ein."
+
+#~ msgid "Clear"
+#~ msgstr "Leeren"
+
+#~ msgid "Add"
+#~ msgstr "Hinzufügen"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Geschwindigkeit:</b>"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Entferne .torrent-Datei"
+
+#~ msgid "Select All"
+#~ msgstr "_Alles auswählen"
+
+#~ msgid "Username"
+#~ msgstr "Benutzername"
+
+#~ msgid "Password"
+#~ msgstr "Passwort"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "_Quit"
+#~ msgstr "_Beenden"
+
+#~ msgid "Availability"
+#~ msgstr "Verfügbarkeit"
+
+#~ msgid "Graph"
+#~ msgstr "Diagramm"
+
+#~ msgid "Filters"
+#~ msgstr "Filter"
+
+#~ msgid "New Password"
+#~ msgstr "Neues Passwort"
+
+#~ msgid "Template"
+#~ msgstr "Template"
+
+#~ msgid "Image Only"
+#~ msgstr "Nur Bild"
+
+#~ msgid "Text and image"
+#~ msgstr "Text und Bild"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Lösche heruntergeladene Dateien."
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Automatische Aktualisierung:"
+
+#~ msgid "About"
+#~ msgstr "Ãœber"
+
+#~ msgid "translate something"
+#~ msgstr "übersetze etwas"
+
+#~ msgid "Text Only"
+#~ msgstr "Nur Text"
+
+#~ msgid "Url"
+#~ msgstr "URL"
+
+#~ msgid "Submit"
+#~ msgstr "Eintragen"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Lade Seite neu alle:"
+
+#~ msgid "Disabled"
+#~ msgstr "Deaktivert"
+
+#~ msgid "From"
+#~ msgstr "Von"
+
+#~ msgid "Type"
+#~ msgstr "Art"
+
+#~ msgid "Ava"
+#~ msgstr "Ava"
+
+#~ msgid "Torrent list"
+#~ msgstr "Torrentliste"
+
+#~ msgid "Resume all"
+#~ msgstr "Alle fortsetzen"
+
+#~ msgid "Reannounce"
+#~ msgstr "Manueller Announce"
+
+#~ msgid "Pause all"
+#~ msgstr "Alle anhalten"
+
+#~ msgid "Logout"
+#~ msgstr "Abmelden"
+
+#~ msgid "Disable"
+#~ msgstr "Deaktivieren"
+
+#~ msgid "Config"
+#~ msgstr "Konfiguration"
+
+#~ msgid "Login"
+#~ msgstr "Anmeldung"
+
+#~ msgid "Eta"
+#~ msgstr "Verbleibend"
+
+#~ msgid "Queue Position"
+#~ msgstr "Warteschlangen-Positition"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Wählen Sie eine URL oder einen Torrent, nicht beides."
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "Aktualisierungsintervall muss > 0 sein"
+
+#~ msgid "# Of Files"
+#~ msgstr "Anzahl an Dateien"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Passwort ist ungültig. Versuchen Sie es noch einmal."
+
+#~ msgid "Set"
+#~ msgstr "Einstellen"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Aktualisierungsintervall einstellen"
+
+#~ msgid "Speed"
+#~ msgstr "Geschwindigkeit"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Torrent hochladen"
+
+#~ msgid "File"
+#~ msgstr "Datei"
+
+#~ msgid "Save"
+#~ msgstr "Speichern"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Bevorzuge Anfangs- und Endstücke"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Maximale Upload-Geschwindigkeit"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Maximale Download-Geschwindigkeit"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Fehler in den Torrentoptionen"
+
+#~ msgid "No data"
+#~ msgstr "Keine Daten"
+
+#~ msgid "Ports"
+#~ msgstr "Ports"
+
+#~ msgid "Encryption"
+#~ msgstr "Verschlüsselung"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Maximale Download-Geschwindigkeit (Kib/s)"
+
+#~ msgid "Level"
+#~ msgstr "Level"
+
+#~ msgid "Forced"
+#~ msgstr "Erzwungen"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1=Unbeschränkt"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Speichere .torrent Dateien in"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Pro Torrent"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Speichere alle Downloads in"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Maximale halb-offene Verbindungen"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Maximale Upload-Geschwindigkeit (Kib/s)"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "Starte Daemon und WebUI nach der Änderung dieser Einstellungen neu"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = unbeschränkt"
+
+#~ msgid "Button style"
+#~ msgstr "Knopfstil"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Aktiviere Plugins"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Neues Password und Neues Passwort(Bestätigung) stimmen nicht überein"
+
+#~ msgid "Move To"
+#~ msgstr "Verschieben nach"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Diese Änderungen wurden gespeichert"
+
+#~ msgid "Current Password"
+#~ msgstr "Aktuelles Passwort"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Neues Passwort (Bestätigung)"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Altes Passwort ist ungültig"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Korregiere die obigen Fehler und versuche es nochmal"
+
+#~ msgid "Random"
+#~ msgstr "Zufällig"
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Wähle eine gültige Option. %s gehört nicht zu den gültigen Optionen."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Gebe einen gültigen Wert ein"
+
+#~ msgid "This field is required."
+#~ msgstr "Dieses Feld wird benötigt."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Gebe ein gültiges Datum ein."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Gebe eine gültige Zeit ein."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Gebe ein/e gültige/s Zeit/Datum ein."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Der Wert muss größer oder gleich %s sein."
+
+#~ msgid "Enter a number."
+#~ msgstr "Gebe eine Zahl ein."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Gebe eine ganze Zahl ein."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Der Wert muss kleiner oder gleich %s sein."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr "Der Wert darf nicht mehr als %s stellen vor dem Komma haben."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Der Wert darf nicht mehr als %s Stellen haben."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Der Wert darf nicht mehr als %s Nachkommastellen haben."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Gebe eine gültige E-Mail-Adresse ein."
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Dieser Ordner existiert nicht."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Gebe eine gültige IPv4-Adresse ein."
+
+#~ msgid "Move"
+#~ msgstr "Verschieben"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Connect"
+#~ msgstr "Verbinden"
+
+#~ msgid "Delete"
+#~ msgstr "Löschen"
+
+#~ msgid "Stop"
+#~ msgstr "Anhalten"
+
+#~ msgid "Queue Top"
+#~ msgstr "Anfang der Warteschlange"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Ende der Warteschlange"
+
+#~ msgid "Statistics"
+#~ msgstr "Statistiken"
+
+#~ msgid "Other.."
+#~ msgstr "Andere.."
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Lade %.2f%% herunter"
+
+#~ msgid "BlockList"
+#~ msgstr "Blockliste"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Timeout(Sekunden)"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Überprüfe alle (Tage)"
+
+#~ msgid "Import Now"
+#~ msgstr "Jetzt importieren"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Importiere %s"
+
+#~ msgid "Inactive"
+#~ msgstr "Inaktiv"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-verbinden"
+
+#~ msgid "page 7"
+#~ msgstr "Seite 7"
+
+#~ msgid "page 8"
+#~ msgstr "Seite 8"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Torrents hinzufügen</b></big>"
+
+#~ msgid "Community"
+#~ msgstr "Community"
+
+#~ msgid "FAQ"
+#~ msgstr "FAQ"
+
+#~ msgid "Homepage"
+#~ msgstr "Homepage"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Entferne Torrent wenn die Ratio erreicht wird"
+
+#~ msgid "Active time"
+#~ msgstr "Aktiv-Zeit"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Zu Dienst verbinden"
+
+#~ msgid "Admin"
+#~ msgstr "Administrator"
+
+#~ msgid "Connected to"
+#~ msgstr "Verbunden mit"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge: Torrent Liste"
+
+#~ msgid "Label torrent"
+#~ msgstr "Torrent kennzeichnen"
+
+#~ msgid "Move torrent"
+#~ msgstr "Torrent verschieben"
+
+#~ msgid "Restart"
+#~ msgstr "Neustarten"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Anhand Stichwort filtern"
+
+#~ msgid "Keyword"
+#~ msgstr "Stichwort"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge Anmeldung"
+
+#~ msgid "False"
+#~ msgstr "Falsch"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Mit keinem Dienst verbunden"
+
+#~ msgid "To"
+#~ msgstr "Nach"
+
+#~ msgid "True"
+#~ msgstr "Wahr"
+
+#~ msgid "Update"
+#~ msgstr "Aktualisieren"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Pausiert hinzufügen"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Maximale Upload Kanäle"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Kompakte Speicherbelegung"
+
+#~ msgid "Download Location"
+#~ msgstr "Download Ort"
+
+#~ msgid "no uri"
+#~ msgstr "keine URI"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Maximale Verbindungs-Versuche pro Sekunde"
+
+#~ msgid "Extra's"
+#~ msgstr "Extras"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Peer-Austausch"
+
+#~ msgid "UpNP"
+#~ msgstr "UPnP"
+
+#~ msgid "Handshake"
+#~ msgstr "Handschlag"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Aktive Torrents gesamt"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Verteilen stoppen wenn Verhältnis diesen Wert erreicht"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Aktives Verteilen gesamt"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Aktives Downloaden gesamt"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Verteilen stoppen bei Verhältnis"
+
+#~ msgid "Error in Path."
+#~ msgstr "Fehler im Pfad."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "Dieses Programm ist freie Software. Sie können es unter den Bedingungen der "
+#~ "GNU General Public License, wie von der Free Software Foundation "
+#~ "veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 3 "
+#~ "der Lizenz oder (nach Ihrer Option) jeder späteren Version. Die "
+#~ "Veröffentlichung von diesem Programm erfolgt in der Hoffnung, dass es Ihnen "
+#~ "von Nutzen sein wird, aber OHNE JEGLICHE GARANTIE, sogar ohne die implizite "
+#~ "Garantie der MARKTREIFE oder der VERWENDBARKEIT FÃœR EINEN BESTIMMTEN ZWECK. "
+#~ "Details finden Sie in der GNU General Public License. Sie sollten ein "
+#~ "Exemplar der GNU General Public License zusammen mit diesem Programm "
+#~ "erhalten haben. Falls nicht, besuchen Sie bitte "
+#~ "<http://www.gnu.org/licenses>."
+
+#~ msgid "Refresh status"
+#~ msgstr "Erneuerungs-Status"
+
+#~ msgid "Seed rank"
+#~ msgstr "Verteilungs-Rate"
+
+#~ msgid "Seeding time"
+#~ msgstr "Verteilungs-Zeit"
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Geben Sie eine gültige URL ein."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Die übermittelte Datei ist leer."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Es wurde keine Datei übermittelt."
+
+#~ msgid "Outbound"
+#~ msgstr "Ausgehend"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "»Auto hinzufügen« Ordner"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Gebe eine Liste von Werten ein."
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Treffe eine gültige Auswahl. Die getroffene Auswahl steht nicht zur "
+#~ "Verfügung."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr ""
+#~ "Es wurde keine Datei übermittelt. Überprüfe die Codierung des Formulars."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Laden Sie ein gültiges Bild hoch. Die hochgeladene Datei war entweder kein "
+#~ "Bild, oder beschädigt."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Diese URL scheint ein kaputter Link zu sein."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr "Treffe eine gültige Wahl. %(value)s ist keine Verfügbare Auswahl."
+
+#~ msgid "page 6"
+#~ msgstr "Seite 6"
+
+#~ msgid "From Session"
+#~ msgstr "Aus der Sitzung"
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Dieser Wert muss mindestens %(min)d Zeichen haben (hat nur %(length)d)."
+
+#~ msgid "Cache templates"
+#~ msgstr "Cache-Vorlagen"
+
+#~ msgid "Recheck"
+#~ msgstr "Erneut prüfen"
+
+#~ msgid "Either"
+#~ msgstr "Beides"
+
+#~ msgid "Inbound"
+#~ msgstr "Eingehend"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Automatisches Hinzufügen aktiviert"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Aktualisieren (sekunden)"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Verhältnis hat Limit überschritten"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Anzahl Downloadversuche"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker-name.org\n"
+#~ "tracker.index.com\n"
+#~ "Das hier macht noch nichts ...\n"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 11"
+#~ msgstr "Seite 11"
+
+#~ msgid "page 10"
+#~ msgstr "Seite 10"
+
+#~ msgid "page 12"
+#~ msgstr "Seite 12"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Fehler beim Setzen der Optionen der Lesezeichen"
+
+#~ msgid "apply_queue"
+#~ msgstr "verwende_warteschlange"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "ist_automatisch_verwaltet"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "stoppe_bei_verhältnis"
+
+#~ msgid "stop_ratio"
+#~ msgstr "stopp_verhältnis"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "entferne_bei_verhältnis"
+
+#~ msgid "apply_max"
+#~ msgstr "verwende_maximal"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "verwende_verschieben_von_feritigen"
+
+#~ msgid "move_completed"
+#~ msgstr "verschiebe_feritige"
+
+#~ msgid "move_completed_path"
+#~ msgstr "verschiebe_fertige_dateipfad"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "automatisches_hinzufügen_von_trackern"
+
+#~ msgid "auto_add"
+#~ msgstr "automatisch_hinzufügen"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Arbeit schreitet fort ..."
+
+#~ msgid "State"
+#~ msgstr "Status"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Beziehe %i Dateien mit ein"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Diese Email soll Sie darüber informieren, dass Deluge das Empfangen vom "
+#~ "Torrent %s beendet hat, welches %i Dateien enthält.\n"
+#~ "Um das Empfangen dieser Benachrichtigungen zu beenden, schalten Sie bitte "
+#~ "Email-Benachrichtigungen in den Einstellungen aus.\n"
+#~ "\n"
+#~ "Danke,\n"
+#~ "Deluge."
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Zeige Schlüsselwort-Suche"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Zeige Seitenleiste"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Zeige Null-Treffer"
+
+#~ msgid "Https"
+#~ msgstr "HTTPS"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Schlüssel unter \"%s\" nicht gefunden"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Zertifikat unter \"%s\" nicht gefunden."
+
+#~ msgid "Show trackers"
+#~ msgstr "Zeige Tracker"
+
+#~ msgid "Sidebar"
+#~ msgstr "Seitenleiste"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... und lösche Torrent-Datei"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Verbindungslimit"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "Empfangslimit"
+
+#~ msgid "Disk Space"
+#~ msgstr "Speicherplatz"
+
+#~ msgid "Do not download"
+#~ msgstr "Nicht herunterladen"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... und lösche heruntergeladene Dateien"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... und lösche alle Dateien"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Erzwinge erneute Überprüfung"
+
+#~ msgid "Cancel"
+#~ msgstr "Abbrechen"
+
+#~ msgid "Ok"
+#~ msgstr "OK"
+
+#~ msgid "Normal priority"
+#~ msgstr "Normale Priorität"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Keine eingehenden Verbindungen"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "Limit der Sende-Geschwindigkeits"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Limit an Sende-Kanälen"
+
+#~ msgid "High priority"
+#~ msgstr "Hohe Priorität"
+
+#~ msgid "From Url"
+#~ msgstr "Nach URL"
+
+#~ msgid "Search"
+#~ msgstr "Suche"
+
+#~ msgid "Highest priority"
+#~ msgstr "Höchste Priorität"
+
+#~ msgid "Graphs"
+#~ msgstr "Graphen"
+
+#~ msgid "Test config value:"
+#~ msgstr "Probiere Einstellungswert:"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Seeds/Peers"
+
+#~ msgid "All Finished!"
+#~ msgstr "Fertig!"
+
+#~ msgid "Test config value"
+#~ msgstr "Teste Einstellung"
+
+#~ msgid "Stats"
+#~ msgstr "Statistiken"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr ""
+#~ "Dieser Assistent wird Ihnen helfen, Deluge nach Ihren Wünschen einzurichten."
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Deluge-Einrichtungsassistent"
+
+#~ msgid "Force Download"
+#~ msgstr "Download erzwingen"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s ist keine gültige URL."
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Nicht verbunden.."
+
+#~ msgid "Downloading.."
+#~ msgstr "Download läuft.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Download fehlgeschlagen: %s"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+
+#~ msgid "no label"
+#~ msgstr "Kein Label"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Passwort eingeben um fortzufahren</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge ist Passwortgeschützt!</big></b>"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB\n"
+#~ "1 MiB\n"
+#~ "2 MiB\n"
+#~ "4 MiB\n"
+#~ "8 MiB\n"
+#~ msgstr ""
+#~ "32 KB\n"
+#~ "64 KB\n"
+#~ "128 KB\n"
+#~ "256 KB\n"
+#~ "512 KB\n"
+#~ "1 MB\n"
+#~ "2 MB\n"
+#~ "4 MB\n"
+#~ "8 MB\n"
diff --git a/deluge/i18n/el.po b/deluge/i18n/el.po
new file mode 100644
index 0000000..6be3f58
--- /dev/null
+++ b/deluge/i18n/el.po
@@ -0,0 +1,4733 @@
+# Greek, Modern (1453-) translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2010-04-02 13:00+0000\n"
+"Last-Translator: Spiros Georgaras <sng@hellug.gr>\n"
+"Language-Team: Greek, Modern (1453-) <el@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Όνομα υπολογιστή:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "ΘÏÏα:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Όνομα χÏήστη:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Κωδικός Ï€Ïόσβασης:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Από:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "ΕνεÏγό"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Ρυθμίσεις"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Επιλογή φακέλου"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Τοποθεσία αποθήκευσης λήψεων</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Μέγιστη ταχÏτητα αποστολής:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Μέγιστος αÏιθμός συνδέσεων:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Μέγιστος αÏιθμός θυÏίδων αποστολής:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Μέγιστη ταχÏτητα λήψης:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>ΕÏÏος ζώνης δικτÏου</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Διακοπή διαμοίÏασης στην αναλογία:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "ΑφαίÏεση σε αναλογία"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "ΚοÏυφή"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Κάτω"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>ΟυÏά</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Επιλογές"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Μέγιστη ταχÏτητα λήψης:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Μέγιστη ταχÏτητα αποστολής:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "ΕνεÏγά torrent:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Ρυθμίσεις λειτουÏγίας χαμηλής ταχÏτητας</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Μη έγκυÏη ετικέτα, έγκυÏοι χαÏακτήÏες: [a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Κενή ετικέτα"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Η ετικέτα υπάÏχει ήδη"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Άγνωστη ετικέτα"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Άγνωστο torrent"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Ετικέτα"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Επιλογές _ετικέτας"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_ΑφαίÏεση ετικέτας"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_ΠÏοσθήκη ετικέτας"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Επιλογές ετικέτας"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Επιλογές ετικέτας</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "ΘυÏίδες αποστολής:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "ΤαχÏτητα αποστολής:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "ΤαχÏτητα λήψης:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Συνδέσεις:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "ΕφαÏμογή μέγιστων Ïυθμίσεων ανά torrent:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Μέγιστο"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Με αυτόματη διαχείÏιση"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "ΕφαÏμογή Ïυθμίσεων αναμονής:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "ΣειÏά αναμονής"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Μετακίνηση ολοκληÏωμένων σε:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "ΕφαÏμογή τοπικών Ïυθμίσεων:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Τοποθεσία"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 σειÏά ανά ιχνηλάτη)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Αυτόματος οÏισμός ετικέτας:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Ανιχνευτές"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "ΠÏοσθήκη ετικέτας"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>ΠÏοσθήκη ετικέτας</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Όνομα:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>ΧÏησιμοποιήστε την πλευÏική μπάÏα για να Ï€Ïοσθέσετε, επεξεÏγαστείτε και "
+"να αφαιÏέσετε ετικέτες. <i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Ετικέτες</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Αποσυμπίεση σε:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "ΔημιουÏγία υποφακέλου ονόματος του torrent"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Η επιλογή αυτή θα δημιουÏγήσει έναν υποφάκελο με το όνομα του Torrent μέσα "
+"από τον επιλεγμένο φάκελο εξαγωγής και θα τοποθετήσει εκεί τα αÏχεία που θα "
+"εξαχθοÏν."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Γενικά</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "ΕνεÏγοποίηση διεπαφής δικτÏου"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "ΕνεÏγοποίηση SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "ΘÏÏα ακÏόασης:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Ρυθμίσεις</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Λίστα IP του Emule (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "Κείμενο SafePeer (συμπιεσμένο)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "Κείμενο PeerGuardian (ασυμπίεστο)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Μη έγκυÏος ηγέτης"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Μη έγκυÏος μαγικός κωδικός"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Μη έγκυÏη έκδοση"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Λίστα αποκλεισμένων"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "ΗμέÏες"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Έλεγχος για νέα λίστα κάθε:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Εισαγωγή λίστας αποκλεισμένων κατά την εκκίνηση"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+"Λήψη του αÏχείου με τη λίστα αποκλεισμένων αν είναι απαÏαίτητο και εισαγωγή "
+"του αÏχείου."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Έλεγχος λήψης και εισαγωγής"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Λήψη και εισαγωγή νέου αÏχείου με τη λίστα αποκλεισμένων."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Εξαναγκασμός λήψης και εισαγωγής"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Η λίστα αποκλεισμένων είναι ενημεÏωμένη"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Επιλογές</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "ΤÏπος:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "ΗμεÏομηνία:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Μέγεθος αÏχείου:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>ΠληÏοφοÏίες</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Το torrent oλοκληÏώθηκε"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Το torrent Ï€Ïοστέθηκε"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Εκτέλεση"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Συμβάν"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Εντολή"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>ΠÏοσθήκη εντολής</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Εντολές</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Ανακοίνωση ΟΚ"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Η ανακοίνωση στάλθηκε"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "ΠÏοειδοποιήση"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Σφάλμα"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Αφγανιστάν"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Îήσοι Όλαντ"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Αλβανία"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "ΑλγεÏία"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "ΑμεÏικανική Σαμόα"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "ΑνδόÏα"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Ανγκόλα"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Ανγκουίλα"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "ΑνταÏκτική"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Αντίγκουα και ΜπαÏμποÏντα"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "ΑÏγεντινή"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "ΑÏμενία"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "ΑÏοÏμπα"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "ΑυστÏαλία"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "ΑυστÏία"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "ΑζεÏμπαϊτζάν"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Μπαχάμες"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "ΜπαχÏέιν"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Μπανγκλαντές"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "ΜπαÏμπέιντος"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "ΛευκοÏωσία"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Βέλγιο"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Μπελίζε"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Μπενίν"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "ΒεÏμοÏδες"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Μπουτάν"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Βολιβία"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Βοσνία και ΕÏζεγοβίνη"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Μποτσουάνα"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Îήσος Μπουβέ"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Î’Ïαζιλία"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Î’Ïετανικά Εδάφη Î™Î½Î´Î¹ÎºÎ¿Ï Î©ÎºÎµÎ±Î½Î¿Ï"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "ΜπÏουνέι ÎταÏουσαλάμ"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "ΒουλγαÏία"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "ΜπουÏκίνα Φάσο"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "ΜπουÏοÏντι"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Καμπότζη"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "ΚαμεÏοÏν"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Καναδάς"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "ΠÏάσινο ΑκÏωτήÏιο"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Îήσοι Καϋμάν"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "ΚεντÏοαφÏικανική ΔημοκÏατία"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Τσαντ"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Χιλή"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Κίνα"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Îήσος των ΧÏιστουγέννων"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Îήσοι Κόκος (Κήλινγκ)"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Κολομβία"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "ΚομόÏες"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Κονγκό"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Κονγκό, Λαϊκή ΔημοκÏατία του"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Îήσοι Κουκ"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Κόστα Ρίκα"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Ακτή ΕλεφαντοστοÏ"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "ΚÏοατία"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "ΚοÏβα"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "ΚÏÏ€Ïος"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "ΔημοκÏατία της Τσεχίας"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Δανία"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Τζιμπουτί"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Îτομίνικα"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Δομινικανή ΔημοκÏατία"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "ΙσημεÏινός (ΕκουαδόÏ)"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Αίγυπτος"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "Ελ ΣαλβαδόÏ"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "ΙσημεÏινή Γουινέα"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "ΕÏυθÏαία"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Εσθονία"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Αιθιοπία"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Îήσοι Φώκλαντ (Μαλβίνες)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Îήσοι ΦεÏόε"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Φίτζι"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Φινλανδία"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Γαλλία"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "Γαλλική Γουιάνα"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "Γαλλική Πολυνησία"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "Γαλλικά Îότια Εδάφη"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Γκαμπόν"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Γκάμπια"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "ΓεωÏγία"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "ΓεÏμανία"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Ηνωμένο Βασίλειο"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Γκάνα"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "ΓιβÏαλτάÏ"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Ελλάδα"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "ΓÏοιλανδία"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "ΓÏενάδα"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "ΓουαδελοÏπη"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Γκουάμ"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Γουατεμάλα"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "ΓκέÏνσεϊ"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Γουινέα"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Γουινέα-Μπισάου"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Γουιάνα"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Αϊτή"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Îήσος ΧεÏντ και Îήσοι Μακντόναλντ"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Αγία ΈδÏα (ΚÏάτος της Πόλης του ΒατικανοÏ)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "ΟνδοÏÏα"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Χονγκ Κονγκ"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "ΟυγγαÏία"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Ισλανδία"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "Ινδία"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Ινδονησία"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "ΙÏάν, Ισλαμική ΔημοκÏατία του"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "ΙÏάκ"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "ΙÏλανδία"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Îήσος του Μαν"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "ΙσÏαήλ"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Ιταλία"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Τζαμάικα"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Ιαπωνία"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "ΤζέÏσεϊ"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "ΙοÏδανία"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Καζακστάν"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Κένυα"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "ΚιÏιμπάτι"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "ΚοÏέα, Λαϊκη ΔημοκÏατία της"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "ΚοÏέα, ΔημοκÏατία της"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Κουβέιτ"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "ΚιÏγιστάν"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Λαϊκή ΔημοκÏατία του Λάος"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Λετονία"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Λίβανος"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Λεσόθο"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "ΛιβεÏία"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "ΛιβÏη, ΑÏαβική ΤζαμαχιÏία"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Λιχτενστάιν"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Λιθουανία"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "ΛουξεμβοÏÏγο"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Μακάο"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "ΠÏώην Γιουγκοσλαβική ΔημοκÏατία της Μακεδονίας"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "ΜαδαγασκάÏη"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Μαλάουι"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Μαλαισία"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Μαλδίβες"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Μάλι"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Μάλτα"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Îήσοι ΜάÏσαλ"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "ΜαÏτινίκα"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "ΜαυÏιτανία"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "ΜαυÏίκιος"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Μαγιότ"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Μεξικό"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "ΜικÏονησία, Ομόσπονδες Πολιτείες της"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Μολδαβία"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Μονακό"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Μογγολία"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "ΜαυÏοβοÏνιο"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "ΜοντσεÏάτ"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "ΜαÏόκο"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Μοζαμβίκη"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "ΜιανμάÏ"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Îαμίμπια"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "ÎαουÏοÏ"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Îεπάλ"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Ολλανδία"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Ολλανδικές Αντίλλες"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Îέα Καληδονία"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Îέα Ζηλανδία"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "ÎικαÏάγουα"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "ÎίγηÏας"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "ÎιγηÏία"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "ÎιοÏε"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Îήσος ÎÏŒÏφολκ"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Îήσοι Î’ÏŒÏειες ΜαÏιάνες"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "ÎοÏβηγία"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Ομάν"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Πακιστάν"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Παλάου"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Παλαιστινιακά Εδάφη, Κατεχόμενα"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Παναμάς"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "ΠαποÏα Îέα Γουινέα"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "ΠαÏαγουάη"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "ΠεÏοÏ"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Φιλιππίνες"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Îήσοι ΠίτκαιÏν"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Πολωνία"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "ΠοÏτογαλία"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "ΠουέÏτο Ρίκο"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "ΚατάÏ"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Ρεϊνιόν"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Ρουμανία"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Ρωσική Ομοσπονδία"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Ρουάντα"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Άγιος ΒαÏθολομαίος"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Îήσος Αγίας Ελένης"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Άγιος ΧÏιστόφοÏος και Îέβις"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Αγία Λουκία"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Άγιος ΜαÏτίνος"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Îήσοι Αγίου ΠέτÏου και Μιχαήλ"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Άγιος Βικέντιος και ΓÏεναδίνες"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Σαμόα"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "Σαν ΜαÏίνο"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Σάο Τομέ και ΠÏίνσιπε"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Σαουδική ΑÏαβία"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Σενεγάλη"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "ΣεÏβία"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Σεϋχέλλες"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "ΣιέÏα Λεόνε"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "ΣινγκαποÏÏη"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Σλοβακία"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Σλοβενία"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Îήσοι Σολομώντα"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Σομαλία"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Îότια ΑφÏική"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Îότια ΤζόÏτζια και Îότιοι νήσοι Σάντουιτς"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Ισπανία"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "ΣÏι Λάνκα"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Σουδάν"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "ΣουÏινάμ"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Îήσοι ΣβάλμπαÏντ και Γιαν Μαγιέν"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Σουαζιλάνδη"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Σουηδία"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Ελβετία"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "ΑÏαβική ΔημοκÏατία της ΣυÏίας"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Ταϊβάν, ΕπαÏχία της Κίνας"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Τατζικιστάν"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Ηνωμένη ΔημοκÏατία της Τανζανίας"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Ταϊλάνδη"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "ΤιμόÏ, Ανατολικό"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Τόγκο"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Τοκελάου"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Τόνγκα"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "ΤÏινιντάντ και Τομπάγκο"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Τυνησία"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "ΤουÏκία"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "ΤουÏκμενιστάν"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Îήσοι ΤεÏκς και Κάικος"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Τουβάλου"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Ουγκάντα"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "ΟυκÏανία"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Ενωμένα ΑÏαβικά ΕμιÏάτα"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Ηνωμένες Πολιτείες της ΑμεÏικής"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Ελάσσονες Îήσοι ΗΠΑ"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "ΟυÏουγουάη"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Ουζμπεκιστάν"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Βανουάτου"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Βενεζουέλα"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Βιετνάμ"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "ΠαÏθένοι Îήσοι, Î’Ïετανικές"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "ΠαÏθένοι Îήσοι, Η.Π.A."
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Îήσοι Γουόλις και ΦουτοÏνα"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Δυτική ΣαχάÏα"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Υεμένη"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Ζάμπια"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Ζιμπάμπουε"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Εκτός σÏνδεσης"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Σε σÏνδεση"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Συνδεδεμένος"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Ο δαίμονας δεν υπάÏχει"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Ο δαίμονας δεν εκτελείται"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Εκκίνηση διακομιστή στο PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "ΔιεÏθυνση"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Πελάτης"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "ΠÏόοδος"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "ΤαχÏτητα λήψης"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "ΤαχÏτητα αποστολής"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrent στην ουÏά"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrent στην ουÏά"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "ΧωÏίς πεÏιοÏισμό"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "ΕνεÏγοποιημένο"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Άλλο..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Κάτω:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Πάνω:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Κάτω"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Πάνω"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "ΟÏισμός της μέγιστης ταχÏτητας λήψης"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "ΟÏισμός της μέγιστης ταχÏτητας αποστολής"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "ΟλοκλήÏωση torrent"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Με αυτό το email σας πληÏοφοÏÏŽ ότι το Deluge ολοκλήÏωσε την λήψη του/των "
+"%(name)s, που πεÏιλαμβάνει/-ουν %(num_files)i αÏχεία.\n"
+"Για να σταματήσετε να λαμβάνετε αυτές τις ειδοποιήσεις, αÏκεί να "
+"απενεÏγοποιήστε την ειδοποίηση μέσω email στις Ï€Ïοτιμήσεις του Deluge.\n"
+"\n"
+"ΕυχαÏιστώ,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Λήψεις"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Δίκτυο"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "ΕÏÏος ζώνης"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Διεπαφή"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Άλλο"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Δαίμονας"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Διαμεσολαβητής"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "ΠÏοσωÏινή μνήμη"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "ΠÏόσθετα"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "ΠÏόσθετο"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Επιλογή Ï€Ïόσθετου"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "ΠÏόσθετο Eggs"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "'Ονομα αÏχείου"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Μέγεθος"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Μη έγκυÏο αÏχείο"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Διπλό Torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Δεν μποÏείτε να Ï€Ïοσθέσετε το ίδιο torrent δÏο φοÏές."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Αποτυχία οÏÎ¹ÏƒÎ¼Î¿Ï Ï€ÏοτεÏαιότητας αÏχείου!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Επιλογή αÏχείου .torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "ΑÏχεία Τorrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Όλα τα αÏχεία"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Μη έγκυÏη διεÏθυνση"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Η λήψη απέτυχε"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Βαθμίδα"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Ιχνηλάτης"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Επιλογή αÏχείου"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Επιλογή φακέλου"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Αποθήκευση αÏχείου .torrent"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Δεν συνδέθηκε"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Συνδέσεις"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "ΤαχÏτητα λήψης"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "ΤαχÏτητα αποστολής"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Κίνηση Ï€Ïωτοκόλλου Λήψη/Αποστολή"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "Κόμβοι DHT"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Καμία εισεÏχόμενη σÏνδεση!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "ΟÏισμός μέγιστου αÏÎ¹Î¸Î¼Î¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎµÏ‰Î½"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Ετικέτες"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Όλα"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Γίνεται λήψη"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "ΔιαμοιÏάζεται"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Σε παÏση"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Έλεγχος"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "Στην ουÏά"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Κανένα"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "ΧωÏίς ετικέτα"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Υπολογιστής"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Σφάλμα κατά την Ï€Ïοσθήκη υπολογιστή"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "ΑπενεÏγοποίηση της κλασικής λειτουÏγίας;"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Απ' ÏŒ,τι φαίνεται, εκτελείται ήδη μια διεÏγασία του δαίμονα Deluge "
+"(deluged).\n"
+"\n"
+"Θα χÏειαστεί να σταματήσετε τον δαίμονα ή να απενεÏγοποιήσετε την Κλασική "
+"ΛειτουÏγία για να συνεχίσετε."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Σφάλμα στην εκκίνηση του πυÏήνα"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"ΠÏοέκυψε ένα σφάλμα κατά την εκκίνηση του στοιχείου πυÏήνα, το οποίο είναι "
+"απαÏαίτητο για την κλασική λειτουÏγία του Deluge.\n"
+"\n"
+"ΠαÏακαλώ δείτε τις λεπτομέÏειες παÏακάτω για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Καθώς Ï€Ïοέκυψε ένα σφάλμα κατά την εκκίνηση στην κλασική λειτουÏγία. "
+"Επιθυμείτε να συνεχίσετε απενεÏγοποιώντας την;"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Σφάλμα εκκίνησης διεÏγασίας"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"ΠαÏουσιάστηκε σφάλμα κατά την εκκίνηση του δαίμονα. ΠÏοσπαθήστε να τον "
+"εκτελέσετε από τη γÏαμμή εντολών για να δείτε αν υπάÏχει κάποιο σφάλμα."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "ΕνεÏγό"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "ΑνενεÏγό"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "ΧωÏίς πεÏιοÏισμό"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Επιλογή Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Î³Î¹Î± τη μετακίνηση των αÏχείων"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "ΟÏισμός Μέγιστών ΘυÏών Αποστολής"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "ΠÏοτεÏαιότητα"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "ΛεπτομέÏειες:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Όνομα"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Λήφθηκαν"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Απεσταλμένα"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "ΔιαμοιÏαστές"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Ομότιμοι χÏήστες"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Εκτιμ. χÏ. αναμονής"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Αναλογία"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Διαθεσ"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "ΠÏοστέθηκε"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_ΑÏχείο"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_ΠÏοσθήκη Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_ΔημιουÏγία Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_ΕπεξεÏγασία"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "ΔιαχειÏιστής _σÏνδεσης"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_ΠÏοβολή"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_ΓÏαμμή εÏγαλείων"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_ΠλευÏική στήλη"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "_ΜπάÏα κατάστασης"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "_ΚαÏτέλες"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Στήλες"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "_ΠλευÏική στήλη"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Εμφάνιση _μηδενικών εγγÏαφών"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Εμφάνιση _ιχνηλατών"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Βοήθεια"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Συχνές εÏωτήσεις"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "ΠÏοσθήκη Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "ΠÏοσθήκη Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "ΑφαίÏεση torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "ΔιαγÏαφή Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "ΠαÏση των επιλεγμένων Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "ΠαÏση"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Συνέχιση των επιλεγμένων Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Συνέχιση"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Μετακίνηση του Torrent ψηλότεÏα στην σειÏά αναμονής"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Πάνω στην ουÏά"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Μετακίνηση του Torrent χαμηλότεÏα στην σειÏά αναμονής"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Κάτω στην ουÏά"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "ΠÏοτιμήσεις"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "ΔιαχειÏιστής σÏνδεσης"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "Ανάπτυξη όλων"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Îα μην γίνει λήψη"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Κανονική Ï€ÏοτεÏαιότητα"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Υψηλή Ï€ÏοτεÏαιότητα"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "ΥψηλότεÏη Ï€ÏοτεÏαιότητα"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Αυτόματη διαχείÏιση:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Θέση διαμοιÏασμοÏ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>ΧÏόνος διαμοιÏασμοÏ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>ΕνεÏγός χÏόνος:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Κατάσταση ιχνηλάτη:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Διαθεσιμότητα:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Υπολογιστές:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>ΧÏήστες που διανέμουν:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Κομμάτια:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Υπολειπόμενος χÏόνος:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Επόμενη ανακοίνωση:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Αναλογία διαμοιÏασμοÏ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Απεσταλμένα:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Ληφθέντα:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>ΗμεÏομηνία Ï€Ïοσθήκης:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Κατάσταση"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Σχόλια:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>ΑÏιθμός αÏχείων:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>ΚατακεÏματισμός:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Ιχνηλάτης:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Συνολικό μέγεθος:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Όνομα:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>ΔιαδÏομή:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Κατάσταση:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_ΛεπτομέÏειες"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_ΑÏχεία"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Υπολογιστές"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Όταν ολοκληÏωθεί να μετακινηθεί στο:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Ιδιωτικό"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "ΠÏοτεÏαιότητα Ï€Ïώτων/τελευταίων κομματιών"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_ΕπεξεÏγασία ιχνηλατών"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Επιλογές"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "ΔιαγÏαφή Torrent;"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+"<big><b>Είστε σίγουÏος ότι θέλετε να διαγÏάψετε το επιλεγμένο Torrent "
+";</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>Το σχετιζόμενο .torrent θα διαγÏαφεί!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Τα ληφθέντα δεδομένα θα διαγÏαφοÏν!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "ΑφαίÏεση eπιλεγμένου Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Îέα έκδοση"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Îέα έκδοση διαθέσιμη!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Διαθέσιμη έκδοση:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>ΤÏέχουσα έκδοση:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Îα μην εμφανίζεται στο μέλλον αυτό το παÏάθυÏο διαλόγου"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Μετάβαση στην ιστοσελίδα"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "ΠÏόσθεση ενός υπολογιστή με την IP του"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Επιλογή όλων"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_ΠαÏση όλων"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Συνέχιση επιλεγμένων Torrent."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Συνέ_χιση όλων"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "ΠÏοσθήκη Torrent"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "ΠλήÏοφοÏίες _κατακεÏματισμοÏ"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_ΑφαίÏεση"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrent</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "ΑÏ_χεία"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "ΠλήÏης"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Συμπαγής"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Ανάθεση χώÏου</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Μέγιστη ταχÏτητα λήψης:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Μέγιστη ταχÏτητα αποστολής:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "ΠÏοσθήκη σε _κατάσταση παÏσης"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "ΠÏοτεÏαιότητα Ï€Ïώτων/τελευταίων τμημάτων"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "ΕπαναφοÏά στα Ï€ÏοκαθοÏισμένα"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "ΕφαÏμογή σε όλα"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "ΠÏοσθήκη URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Από URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "ΠÏοσθήκη πληÏοφοÏίων κατακεÏματισμοÏ"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Από πληÏοφοÏίες κατακεÏματισμοÏ</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "ΠληÏοφοÏίες κατακεÏματισμοÏ:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Ιχνηλάτες:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "ΔημιουÏγία Torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>ΔημιουÏγία Torrent</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Φάκε_λος"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "Απομακ_Ïυσμένη διαδÏομή"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>ΑÏχεία</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "ΔημιουÏγός:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Σχόλια:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "ΠληÏοφοÏίες"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "ΔιαμοιÏαστές Web"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Μέγεθος κοματιοÏ:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "ΟÏισμός ιδιωτικής σημαίας"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "ΠÏόσθεση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… Torrent στη συνεδÏία"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Εισαγωγή απομακÏυσμένης διαδÏομής"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>ΑπομακÏυσμένη διαδÏομή</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "ΔιαδÏομή:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "ΔημιουÏγία Torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Αποθήκευση .torrent ως"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Αποθήκευση αÏχείου .torrent </b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Torrent στην ΟυÏά"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>ΠÏοσθήκη Torrent στην ΟυÏά</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Αυτόματη Ï€Ïοσθήκη Torrent κατά τη σÏνδεση"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "ετικέτα"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "ΠÏοσθήκη υπολογιστή"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>ΠÏοσθήκη υπολογιστή</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "υπολογιστής:θÏÏα"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "ΠÏοσθήκη υπολογιστή"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>ΔιαχειÏιστής σÏνδεσης</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Εκκίνηση Ï„Î¿Ï€Î¹ÎºÎ¿Ï Î´Î±Î¯Î¼Î¿Î½Î±"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Αυτόματη σÏνδεση στην επιλεγμένη θÏÏα κατά την εκκίνηση"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Αυτόματη εκκίνηση του Ï„Î¿Ï€Î¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î® αν είναι απαÏαίτητο"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Μη εμφάνιση του διαλόγου Î±Ï…Ï„Î¿Ï ÎºÎ±Ï„Î¬ την εκκίνηση"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Λήψεις</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Αυτόματη Ï€Ïοσθήκη .torrent από:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Αποθήκευση σε:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "ΑντιγÏαφή των αÏχείων .torrent σε:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Φάκελοι</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "ΧÏήση πλήÏους ανάθεσης χώÏου"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Η πλήÏης ανάθεση χώÏου στο δίσκο αναθέτει εκ των Ï€ÏοτέÏων όλο τον απαÏαίτητο "
+"χώÏο στο torrent και αποτÏέπει τον κατακεÏματισμό του δίσκου"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "ΧÏήση συμπαγοÏÏ‚ ανάθεσης χώÏου"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+"Η συμπαγής ανάθεση χώÏου στο δίσκου αναθέτει στο torrent μόνο τον απαÏαίτητο "
+"σε κάθε στιγμή χώÏο."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Îα δοθεί Ï€ÏοτεÏαιότητα στα Ï€Ïώτα και τελευταία τμήματα του torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+"Îα δοθεί Ï€ÏοτεÏαιότητα στα Ï€Ïώτα και τα τελευταία τμήματα αÏχείων Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… "
+"torrent."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "ΠÏοσθήκη των Torrent σε κατάσταση πάυσης"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Δίκτυο</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "ΧÏήση τυχαίων θυÏών:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Το Deluge θα επιλέγει αυτόματα διαφοÏετική θÏÏα κάθε φοÏά."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "ΕνεÏγή θÏÏα:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Έως:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Έλεγχος ενεÏγής θÏÏας"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>ΕισεÏχόμενες θÏÏες</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>ΕξεÏχόμενες θÏÏες</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Εισάγετε την διεÏθυνση IP της διεπαφής, στην οποία θέλετε να γίνεται ακÏόαση "
+"για εισεÏχόμενες συνδέσεις BitTorrent. Αφήστε το πεδίο κενό αν επιθυμείτε να "
+"χÏησιμοποιήσετε την Ï€ÏοκαθοÏισμένη διεπαφή."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "Διεπαφή"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"Το TOS byte που βÏίσκεται στην κεφαλίδα IP του κάθε πακέτου στέλνεται στους "
+"διαμοιÏαστές (συμπεÏιλαμβανομένων και των διαμοιÏαστών web). Αναμένεται μια "
+"δεκαεξαδική τιμή."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "ΔιαμοιÏαστές TOS Byte:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT Port Mapping Protocol"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Ανταλλαγή Î¼ÎµÏ„Î±Î¾Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„ÏŽÎ½"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+"Η υπηÏεσία αναζήτησης τοπικών υπηÏεσιών βÏίσκει τοπικοÏÏ‚ υπολογιστές στο "
+"δίκτυό σας."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+"Ο κατανεμημένος πίνακας κατακεÏÎ¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï (DHT) πιθανώς να βελτιώσει τον "
+"αÏιθμό των ενεÏγών συνδέσεων."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Επιπλέον Ïυθμίσεις δικτÏου</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "ΕισεÏχόμενα:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Επίπεδο:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Εξαναγκασμένο\n"
+"ΕνεÏγοποιημένο\n"
+"ΑπενεÏγοποιημένο"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"ΧαιÏετισμός\n"
+"ΠλήÏης Ροή\n"
+"Οποιοδήποτε"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "ΕξεÏχόμενα:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "ΚÏυπτογÏάφηση ολόκληÏης της Ïοής"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b> ΚÏυπτογÏάφηση </b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>ΕÏÏος ζώνης</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Μέγιστος αÏιθμός Ï€Ïοσπαθειών σÏνδεσης ανά δευτεÏόλεπτο:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Μέγιστος αÏιθμός ημι-ανοικτών συνδέσεων:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Η μέγιστη ταχÏτητα αποστολής για όλα τα Torrent. Εισάγετε -1 για απεÏιόÏιστη."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Μέγιστη ταχÏτητα αποστολής (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+"Ο μέγιστος επιτÏεπτός αÏιθμός συνδέσεων. Εισάγετε -1 για απεÏιόÏιστο."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Μέγιστος αÏιθμός συνδέσεων:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Ο μέγιστος αÏιθμός θυÏίδων αποστολής για όλα τα Torrent. Εισάγετε -1 για "
+"απεÏιόÏιστες."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Μέγιστος αÏιθμός θυÏίδων αποστολής:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Η μέγιστη ταχÏτητα λήψης για όλα τα Torrent. Εισάγετε -1 για απεÏιόÏιστη."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Μέγιστη ταχÏτητα λήψης (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Αγνόηση οÏίων για το τοπικό δίκτυο"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "ΚαθοÏισμός οÏίου επίβαÏου IP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Αν επιλεγεί, το εκτιμώμενο επίβαÏο TCP/IP δε συμπεÏιλαμβάνεται στην τιμή του "
+"πεÏιοÏισμοÏ, για να αποφευχθεί η υπέÏβαση του οÏίου με τη συνολική κίνηση."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Καθολική χÏήση εÏÏους ζώνης</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"Ο μέγιστος αÏιθμός θυÏίδων αποστολής ανά torrent. Εισάγετε -1 για "
+"απεÏιόÏιστες."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"Ο μέγιστος αÏιθμός συνδέσεων ανά Torrent. Εισάγετε -1 για απεÏιόÏιστες."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>ΧÏήση εÏÏους ζώνης ανά Torrent</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Διεπαφή</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "ΕνεÏγοποίηση"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Η κλασσική λειτουÏγία θα κÏÏψει τις πεÏισσότεÏες υθμίσεις του δαίμονα και θα "
+"κάνει το Deluge να φαίνεται ότι είναι μια απλή εφαÏμογή. ΧÏησιμοποιήστε το "
+"αν δεν θέλετε να Ï„Ïέχετε το Deluge σαν δαίμονα. ΠÏέπει να επανεκκινήσετε το "
+"Deluge για να εφαÏμοσθεί αυτή η ÏÏθμιση."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Κλασσική λειτουÏγία</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Εμφάνιση της ταχÏτητας της συνεδÏίας στην γÏαμμή τίτλου"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>ΚÏÏιο παÏάθυÏο</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Εμφάνιση πάντα"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Εστίαση διαλόγου"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Διάλογος εισαγωγής Torrent</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Εικονίδιο στη μπάÏα συστήματος"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Ελαχιστοποίηση στη μπάÏα συστήματος κατά την έξοδο"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Εκκίνηση στην μπάÏα συστήματος"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "ΠÏοστασία μεγιστοποίησης από την μπάÏα με κωδικό"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>ΜπάÏα συστήματος</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Άλλα</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "ΕνημέÏωση για νέες εκδόσεις"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Το Deluge θα ελέγχει τους εξυπηÏετητές μας και θα σας ενημεÏώνει εάν υπάÏχει "
+"νεότεÏη διαθέσιμη έκδοση"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>ΕνημεÏώσεις</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Βοηθήστε μας να βελτιώσουμε το Deluge στέλνοντας μας την έκδοση Python, την "
+"έκδοση PyGTK, το λειτουÏγικό σÏστημα και τον Ï„Ïπο επεξεÏγαστή. Σε καμία "
+"πεÏίπτωση δεν στέλνονται άλλες πληÏοφοÏίες."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Îαι, παÏακαλώ στείλε στατιστικά ανώνυμα"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>ΠληÏοφοÏίες συστήματος</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Τοποθεσία:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Αν το Deluge δεν μποÏεί να βÏει το αÏχείο της βάσης δεδομένων σε αυτή την "
+"τοποθεσία, θα Ï€Ïοσπαθήσει να εντοπίσει την τοποθεσία (κÏάτος) του "
+"υπολογιστή μέσω του DNS."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>Βάση δεδομένων GeoIP</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Συσχετισμός των συνδέσμων Magnet με το Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Δαίμονας</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "ΘÏÏα δαίμονα:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>ΘÏÏα</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Αποδοχή απομακÏυσμένων συνδέσεων"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Συνδέσεις</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "ΠεÏιοδικός έλεγχος της ιστοσελίδας για νέες εκδόσεις"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Άλλα</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>ΟυÏά</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Τοποθέτηση των νέων Torrent στην κοÏυφή της ουÏάς"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Συνολικός αÏιθμός ενεÏγών Torrent που διαμοιÏάζονται:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Συνολικός αÏιθμός ενεÏγών Torrent:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Συνολικός αÏιθμός ενεÏγών Torrent που λαμβάνονται:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Îα μην καταμετÏώνται τα αÏγά Torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>ΕνεÏγά Torrent</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "ÎŒÏιο αναλογίας διαμοιÏασμοÏ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "ÎŒÏιο χÏόνου διαμοιÏασμοÏ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "ΧÏόνος διαμοιÏÎ±ÏƒÎ¼Î¿Ï (λεπτά):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Διακοπή διαμοιÏÎ±ÏƒÎ¼Î¿Ï ÏŒÏ„Î±Î½ η αναλογία φτάσει:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "ΑφαίÏεση του torrent όταν συμπληÏωθεί η αναλογία"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>ΔιαμοιÏασμός</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Διαμεσολαβητής</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Υπολογιστής:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Κανένα\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Υπολογιστής</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>ΔιαμοιÏαστής Web</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Ιχνηλάτης</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>ΠÏοσωÏινή μνήμη</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Μέγεθος Ï€ÏοσωÏινής μνήμης (μπλοκ των 16 KiB):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Ο αÏιθμός των δευτεÏολέπτων που Ï€Ïέπει να πεÏάσει μετά την τελευταία εγγÏαφή "
+"στην Ï€ÏοσωÏινή μνήμη, για να γίνει εγγÏαφή στο δίσκο. Η Ï€ÏοκαθοÏισμένη τιμή "
+"είναι 60 δευτεÏόλεπτα."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Λήξη Ï€ÏοσωÏινής μνήμης (δευτεÏόλεπτα):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"Συνολικά μπλοκ των 16 KiB που γÏάφτηκαν στον δίσκο από την έναÏξη αυτής της "
+"συνεδÏίας."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "ΓÏαμμένα μπλοκ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"Ο συνολικός αÏιθμός εκτελεσθέντων λειτουÏγιών εγγÏαφής από την έναÏξη αυτής "
+"της συνεδÏίας."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "ΕγγÏαφές:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>ΕγγÏαφή</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Ο αÏιθμός των μπλοκ που ζητήθηκαν από τη μηχανή bittorrent (από "
+"απομακÏυσμένους υπολογιτές), και που εξυπηÏετήθηκαν από το δίσκο ή την "
+"λανθάνουσα μνήμη."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Αναγνωσμένα μπλοκ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "Ο αÏιθμός των μπλοκ που εξυπηÏετήθηκαν από την λανθάνιυσα μνήμη."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+"Ο συνολικός αÏιθμός λοευτουÏγιών ανάγνωσης που εκτελέστηκαν μέχÏι την "
+"εκκίνηση αυτής της συνεδÏίας."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Αναγνώσεις:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Ανάγνωση</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Ο αÏιθμός των μπλοκ των 16 KiB που βÏίσκονται στην Ï€ÏοσωÏινή μνήμη. "
+"ΠεÏιλαμβάνει τη μνήμη εγγÏαφής και ανάγνωσης."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Μέγεθος Ï€ÏοσωÏινής μνήμης:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Μέγεθος Ï€ÏοσωÏινής μνήμης ανάγνωσης:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Μέγεθος</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Κατάσταση</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>ΠÏόσθετα</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Έκδοση:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Ιστοσελίδα:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Email συγγÏαφέα:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Εγκατάσταση Ï€Ïόσθετου"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Επανάληψη σάÏωσης Ï€Ïόσθετων"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_ΕÏÏεση πεÏισσότεÏων Ï€Ïόσθετων"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Εμφάνιση του Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Συνέχιση όλων"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "ÎŒÏιο ταχÏτητας _λήψης"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "ÎŒÏιο ταχÏτητας _αποστολής"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Έξοδος & τεÏματισμός δαίμονα"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "Ά_νοιγμα φακέλου"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Συνέχιση"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Επ_ιλογές"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Τοποθέτηση στην ουÏά"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_ΕνημέÏωση ιχνηλάτη"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_ΑφαίÏεση Torrent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "_Εξαναγκασμός επανελέγχου"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "Μετακίνηση _αÏχείων"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "ÎŒÏιο _συνδέσεων"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "ÎŒÏιο _θυÏίδων αποστολής"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Αυτόματη διαχείÏιση"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>ΔιαγÏαφή του επιλεγμένου Torrent;</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Αν διαγÏάψετε τα δεδομένα, θα χαθοÏν για πάντα."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "ΕπεξεÏγασία ιχνηλατών"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>ΕπεξεÏγασία ιχνηλατών</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "ΠÏοσθήκη ιχνηλάτη"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>ΠÏοσθήκη ιχνηλατών</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "ΕπεξεÏγασία ιχνηλάτη"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>ΕπεξεÏγασία ιχνηλάτη</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Ιχνηλάτης:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "ΔιαγÏαφή Torrent και _δεδομένων"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "ΔιαγÏαφή _Torrent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Μετακίνηση αÏχείων"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Μετακίνηση αÏχείων</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "ΠÏοοÏισμός:"
+
+#~ msgid "Unknown"
+#~ msgstr "Άγνωστο"
+
+#~ msgid "seconds"
+#~ msgstr "δευτεÏόλεπτα"
+
+#~ msgid "Download"
+#~ msgstr "Λαμβάνεται"
+
+#~ msgid "Upload"
+#~ msgstr "Αποστέλεται"
+
+#~ msgid "Yes"
+#~ msgstr "Îαι"
+
+#~ msgid "No"
+#~ msgstr "Όχι"
+
+#~ msgid "Update Tracker"
+#~ msgstr "ΕνημέÏωση του Ιχνηλάτη"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Mainline DHT"
+
+#~ msgid "Remove"
+#~ msgstr "ΑφαίÏεση"
+
+#~ msgid "Details"
+#~ msgstr "ΛεπτομέÏειες"
+
+#~ msgid "Files"
+#~ msgstr "ΑÏχεία"
+
+#~ msgid "General"
+#~ msgstr "Γενικά"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Μέγιστος ΑÏιθμός Συνδέσεων"
+
+#~ msgid "Start"
+#~ msgstr "ΈναÏξη"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Το Deluge είναι κλειδωμένο"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Το Deluge Ï€ÏοστατεÏται με κωδικό.\n"
+#~ "Για να εμφανίσετε το παÏάθυÏο του Deluge, παÏακαλοÏμε εισάγετε τον κωδικό σας"
+
+#~ msgid "Availability"
+#~ msgstr "Διαθεσιμότητα"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>ΤαχÏτητα:</b>"
+
+#~ msgid "Select All"
+#~ msgstr "Επιλογή Όλων"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "ΔιαγÏαφή .torrent αÏχείου"
+
+#~ msgid "Add"
+#~ msgstr "ΠÏοσθήκη"
+
+#~ msgid "Port"
+#~ msgstr "ΘÏÏα"
+
+#~ msgid "Server"
+#~ msgstr "ΕξυπηÏετητής"
+
+#~ msgid "Pieces"
+#~ msgstr "Κομάτια"
+
+#~ msgid "Username"
+#~ msgstr "Όνομα ΧÏήστη"
+
+#~ msgid "Password"
+#~ msgstr "Κωδικός ΧÏήστη"
+
+#~ msgid "_Quit"
+#~ msgstr "_'Εξοδος"
+
+#~ msgid "Graph"
+#~ msgstr "ΓÏάφημα"
+
+#~ msgid "Speed"
+#~ msgstr "ΤαχÏτητα"
+
+#~ msgid "Filters"
+#~ msgstr "ΦίλτÏα"
+
+#~ msgid "Clear"
+#~ msgstr "ΚαθαÏισμός"
+
+#~ msgid "New Password"
+#~ msgstr "Îέος Κωδικός"
+
+#~ msgid "Template"
+#~ msgstr "ΠÏότυπο"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Επιλέξτε είτε url είτε torrent, όχι και τα δÏο"
+
+#~ msgid "Image Only"
+#~ msgstr "Μόνο Εικόνα"
+
+#~ msgid "Text Only"
+#~ msgstr "Μόνο κείμενο"
+
+#~ msgid "Text and image"
+#~ msgstr "Κείμενο και Εικόνα"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "ΑÏτοματη ανανέωση:"
+
+#~ msgid "About"
+#~ msgstr "ΠεÏί"
+
+#~ msgid "Config"
+#~ msgstr "ΡÏθμιση"
+
+#~ msgid "Logout"
+#~ msgstr "Έξοδος"
+
+#~ msgid "Disable"
+#~ msgstr "ΑπενεÏγοποίηση"
+
+#~ msgid "Login"
+#~ msgstr "ΣÏνδεση"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Αναλογία διαμοιÏασμοÏ"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "η ανανέωση Ï€Ïέπει να είναι > 0"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "ΔιαγÏαφή ληφθέντων αÏχείων"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Ο κωδικός που εισάγατε είναι μη έγκυÏος, Ï€Ïοσπαθήστε ξανά"
+
+#~ msgid "Next Announce"
+#~ msgstr "Îέα ανακοίνωση"
+
+#~ msgid "Set"
+#~ msgstr "ΟÏισμός"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Ανανέωση σελίδας κάθε:"
+
+#~ msgid "Set Timeout"
+#~ msgstr "ΟÏισμός χÏÎ¿Î½Î¹ÎºÎ¿Ï Ï€ÎµÏιθωÏίου"
+
+#~ msgid "Pause all"
+#~ msgstr "ΠαÏση όλων"
+
+#~ msgid "Resume all"
+#~ msgstr "ΕπαναφοÏά όλων"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Αποστολή torrent"
+
+#~ msgid "Submit"
+#~ msgstr "Υποβολή"
+
+#~ msgid "Total Size"
+#~ msgstr "Συνολικό μέγεθος"
+
+#~ msgid "Torrent list"
+#~ msgstr "Λίστα torrent"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Κατάσταση ιχνηλάτη"
+
+#~ msgid "Type"
+#~ msgstr "ΤÏπος"
+
+#~ msgid "From"
+#~ msgstr "Από"
+
+#~ msgid "Disabled"
+#~ msgstr "ΑπενεÏγοποιημένο"
+
+#~ msgid "Url"
+#~ msgstr "Ιστοσελίδα"
+
+#~ msgid "Eta"
+#~ msgstr "ΕΧΑ"
+
+#~ msgid "Reannounce"
+#~ msgstr "Ανακοίνωση εκ νέου"
+
+#~ msgid "# Of Files"
+#~ msgstr "# ΑÏχείων"
+
+#~ msgid "File"
+#~ msgstr "ΑÏχείο"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Μέγιστη Πάνω ΤαχÏτητα"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Μέγιστη Κάτω ΤαχÏτητα"
+
+#~ msgid "Download Location"
+#~ msgstr "ΠÏοοÏισμός Αποθήκευσης"
+
+#~ msgid "Save"
+#~ msgstr "Αποθήκευση"
+
+#~ msgid "Extra's"
+#~ msgstr "Επιπλέον"
+
+#~ msgid "Ava"
+#~ msgstr "Διαθ"
+
+#~ msgid "Queue Position"
+#~ msgstr "Θέση στην ουÏά"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "ΠÏοσθήκη σε Κατάσταση ΠαÏσης"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "ΠÏοτεÏαιότητα στο Ï€Ïώτο και το τελευταίο κομμάτι"
+
+#~ msgid "To"
+#~ msgstr "ΠÏος"
+
+#~ msgid "Random"
+#~ msgstr "Τυχαία"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Σφάλμα στις Ïυθμίσεις του torrent"
+
+#~ msgid "Ports"
+#~ msgstr "ΘÏÏες"
+
+#~ msgid "No data"
+#~ msgstr "ΧωÏίς δεδομένα"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Ανταλλαγή Peers"
+
+#~ msgid "Forced"
+#~ msgstr "Εξαναγκασμένο"
+
+#~ msgid "Encryption"
+#~ msgstr "ΚÏυπτογÏάφηση"
+
+#~ msgid "Handshake"
+#~ msgstr "ΧαιÏετισμός"
+
+#~ msgid "Inbound"
+#~ msgstr "ΕισεÏχόμενο"
+
+#~ msgid "Outbound"
+#~ msgstr "ΕξεÏχόμενο"
+
+#~ msgid "Level"
+#~ msgstr "Επίπεδο"
+
+#~ msgid "Global"
+#~ msgstr "Καθολικό"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = ΑπεÏιόÏιστο"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Μέγιστη ΤαχÏτητα Λήψης (Kib/s)"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Μέγιστες Μισάνοιχτες Συνδέσεις"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Αυτόματη ΠÏοσθήκη ενεÏγοποιημένη"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "Επανεκίνηση δαίμονα και διεπαφής μετά την αλλαγή των Ïυθμίσεων"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Αυτόματη ΠÏοσθήκη φακέλου"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Αποθήκευση αÏχείων .torrent στο"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Αποθήκευση όλων των λήψεων στο"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Ανά Torrent"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Μέγιστες ΠÏοσπάθειες ΣÏνδεσης ανά ΔευτεÏόλεπτο"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Συνολικά ενεÏγά που διαμοιÏάζονται"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Σταμάτημα διαμοιÏÎ±ÏƒÎ¼Î¿Ï ÏŒÏ„Î±Î½ η αναλογία φτάσει"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Συνολικά ενεÏγά torrents"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Συνολικά ενεÏγά που λαμβάνονται"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = απεÏιόÏιστο"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "ΑφαίÏεση torrent όταν η αναλογία φτάσει"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "ΕνεÏγοποιημένα ΠÏόσθετα"
+
+#~ msgid "Cache templates"
+#~ msgstr "ΠÏοσωÏινή αποθήκευση Ï€ÏοτÏπων"
+
+#~ msgid "Button style"
+#~ msgstr "Στυλ κουμπιοÏ"
+
+#~ msgid "Current Password"
+#~ msgstr "ΤÏέχων Κωδικός"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Îέος Κωδικός (Επιβεβαίωση)"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Σταμάτημα διαμοιÏÎ±ÏƒÎ¼Î¿Ï ÏƒÎµ αναλογία"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Οι αλλαγές αποθηκεÏτηκαν"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "ΔιοÏθώστε τα παÏαπάνω σφάλματα και Ï€Ïοσπαθήστε ξανά"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Μη έγκυÏος παλίος κωδικός"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Ο νέος κωδικός δεν είναι ίδιος με την επιβεβαίωση"
+
+#~ msgid "Move To"
+#~ msgstr "Μετακίνηση στο"
+
+#~ msgid "Error in Path."
+#~ msgstr "Σφάλμα στο Μονοπάτι."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Εισάγετε έγκυÏη τιμή."
+
+#~ msgid "This field is required."
+#~ msgstr "Αυτό το πεδίο είναι απαÏαίτητο."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Επιλέξτε μια έγκυÏη επιλογή. Η %s δεν ανήκει στις διαθέσιμες."
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Εισαγωγή λίστας τιμών"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Επιλέξτε μια έγκυÏη επιλογή. Αυτή η επιλογή δεν ανήκει στις διαθέσιμες."
+
+#~ msgid "translate something"
+#~ msgstr "μετάφÏαση"
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Εισάγετε μια έγκυÏη ημεÏομηνία."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Επιβεβαιώστε ότι δεν υπάÏχουν πεÏισσότεÏα από %s δεκαδικά ψηφία."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Επιβεβαιώστε ότι δεν υπάÏχουν συνολικά πεÏισσότεÏα από %s ψηφία."
+
+#~ msgid "Enter a number."
+#~ msgstr "Εισάγετε αÏιθμό."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Επιβεβαιώστε ότι η τιμή είναι μεγαλÏτεÏη ή ίση του %s."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Επιβεβαιώστε ότι η τιμή είναι μικÏότεÏη ή ίση του %s."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Εισάγετε ολόκληÏο αÏιθμό."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Επιβεβαιώστε ότι η τιμή έχει τουλάχιστον %(min)d χαÏακτήσες (έχει "
+#~ "%(length)d)."
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Επιβεβαιώστε ότι η τιμή έχει το Ï€Î¿Î»Ï %(max)d χαÏακτήσες (έχει %(length)d)."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr ""
+#~ "Επιβεβαιώστε ότι δεν υπάÏχουν πεÏισσότεÏα από %s ψηφία Ï€Ïιν την υποδιαστολή."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Ανεβάστε μια έγκυÏη εικόνα. Το αÏχείο που ανεβάσατε, είτε δεν είναι εικόνα, "
+#~ "είτε είναι φθαÏμένη εικόνα."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Εισάγετε μια έγκυÏη ÏŽÏα."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Εισάγετε μια έγκυÏη ημεÏομηνία/ÏŽÏα."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Εισάγετε μια έγκυÏη διεÏθυνση e-mail."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr ""
+#~ "Κανένα αÏχείο δεν υποβλήθηκε. Ελέγξτε τον Ï„Ïπο κωδικοποίησης στη φόÏμα."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Κανένα αÏχείο δεν υποβλήθηκε."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Το αÏχείο που υποβλήθηκε είναι άδειο."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Εισάγετε έναν έγκυÏο σÏνδεσμο."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Ο σÏνδεσμος φαίνεται να είναι μη έγκυÏος."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr ""
+#~ "Επιλέξτε μια έγκυÏη επιλογή. %(value)s δεν ανήκει στις διαθέσιμες επιλογές."
+
+#~ msgid "Statistics"
+#~ msgstr "Στατιστικά"
+
+#~ msgid "Delete"
+#~ msgstr "ΔιαγÏαφή"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Ο φάκελος δεν υπάÏχει."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Εισάγετε μια έγκυÏη διεÏθυνση IPv4."
+
+#~ msgid "Connect"
+#~ msgstr "ΣÏνδεση"
+
+#~ msgid "Queue Top"
+#~ msgstr "ΚοÏυφή στην ουÏά"
+
+#~ msgid "Stop"
+#~ msgstr "Διακοπή"
+
+#~ msgid "Recheck"
+#~ msgstr "Επανέλεγχος"
+
+#~ msgid "Move"
+#~ msgstr "Μετακίνηση"
+
+#~ msgid "Other.."
+#~ msgstr "Άλλο.."
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Το torrent έχει ξεπεÏάσει την αναλογία τεÏματισμοÏ."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "Το Ï€ÏόγÏαμμα αυτό είναι ελεÏθεÏο λογισμικό, μποÏείτε να το αναδιανείμετε "
+#~ "ή/και να το Ï„Ïοποποιήσετε κάτω από τους ÏŒÏους της Γενικής Άδειας ΧÏήσης GNU "
+#~ "(GNU General Public License) όπως δημοσιεÏεται από το ΊδÏυμα ΕλεÏθεÏου "
+#~ "Î›Î¿Î³Î¹ÏƒÎ¼Î¹ÎºÎ¿Ï (Free Software Foundation), είτε την έκδοση 3 της Άδειας είτε "
+#~ "(στην επιλογή σας) οποιαδήποτε μετέπειτα έκδοση. Το Ï€ÏόγÏαμμα διανείμεται με "
+#~ "την ελπίδα ότι θα είναι χÏήσιμο, αλλά ΧΩΡΙΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ, χωÏίς καν τη "
+#~ "δεδομένη εγγÏηση ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ή ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΣΥΓΚΕΚΡΙΜΕÎΟ ΣΚΟΠΟ. "
+#~ "Δείτε την Γενική Άδεια ΧÏήσης GNU (GNU General Public License) για "
+#~ "πεÏισσότεÏες λεπτομέÏειες. Θα Ï€Ïέπει να έχετε λάβει ένα αντίγÏαφο της "
+#~ "Γενικής Άδειας ΧÏήσης GNU μαζί με το Ï€ÏόγÏαμμα αυτό, αν όχι, δείτε το "
+#~ "<http://www.εεgnu.org/licenses>."
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "ΧÏονικό ÏŒÏιο (δευτεÏόλ.)"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Ελέγχος κάθε (μέÏες)"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Γίνεται λήψη %.2f%%"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Εισαγωγή %s"
+
+#~ msgid "Import Now"
+#~ msgstr "Εισαγωγή ΤώÏα"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "ΑÏιθμός Ï€Ïοσπαθειών για λήψη"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Εισαγωγή στην εκκίνηση του δαίμονα"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "ΜπλοκαÏισμένα Διαστήματα: %s"
+
+#~ msgid "Inactive"
+#~ msgstr "ΑνενεÏγό"
+
+#~ msgid "Refresh status"
+#~ msgstr "Κατάσταση ανανέωσης"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-σÏνδεση"
+
+#~ msgid "page 6"
+#~ msgstr "σελίδα 6"
+
+#~ msgid "page 7"
+#~ msgstr "σελίδα 7"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Μέγιστη ΤαχÏτητα Αποστολής"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Μέγιστος ΑÏιθμός ΘυÏίδων Αποστολής"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Συμπαγής Ανάθεση ΧώÏου"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Τέλος ΟυÏάς"
+
+#~ msgid "Either"
+#~ msgstr "Οποιοδήποτε"
+
+#~ msgid "BlockList"
+#~ msgstr "Λίστα ΜπλοκαÏισμένων"
+
+#~ msgid "page 8"
+#~ msgstr "σελίδα 8"
+
+#~ msgid "From Session"
+#~ msgstr "Από τη ΣυνεδÏία"
+
+#~ msgid "Homepage"
+#~ msgstr "ΑÏχική σελίδα"
+
+#~ msgid "Community"
+#~ msgstr "Κοινότητα"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-επεξεÏγασία"
+
+#~ msgid "no uri"
+#~ msgstr "χωÏίς uri"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Αυτόματη ανανέωση (δευτεÏόλεπτα)"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 11"
+#~ msgstr "σελίδα 11"
+
+#~ msgid "page 10"
+#~ msgstr "σελίδα 10"
+
+#~ msgid "page 12"
+#~ msgstr "σελίδα 12"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "max_connections"
+#~ msgstr "μέγιστες_συνδέσεις"
+
+#~ msgid "apply_queue"
+#~ msgstr "εφαÏμογή_αναμονής"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "είναι_αυτοÏυθμιζόμενο"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "παÏση_στο_ποσοστό"
+
+#~ msgid "stop_ratio"
+#~ msgstr "ποσοστό_παÏσης"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "μέγιστη_ταχÏτητα_αποστολής"
+
+#~ msgid "max_download_speed"
+#~ msgstr "μέγιστη_ταχÏτητα_λήψης"
+
+#~ msgid "apply_max"
+#~ msgstr "εφαÏμογή_μέγιστων"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Λάθος οÏίζοντας τις επολογές ετικέτων"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "μέγιστες_θÏÏες_αποστολής"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "διαγÏαφή_όταν_φτάσει_στο_ποσοστό"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "η_μεταφοÏά_ολοκληÏώθηκε"
+
+#~ msgid "move_completed"
+#~ msgstr "μεταφοÏά_ολοκληÏώθηκε"
+
+#~ msgid "move_completed_path"
+#~ msgstr "μεταφοÏά_ολοκληÏώθηκε_στην_διαδÏομή"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "αυτόματη_Ï€Ïόσθεση_trackers"
+
+#~ msgid "auto_add"
+#~ msgstr "αυτόματη_Ï€Ïόσθεση"
+
+#~ msgid "Work in progress.."
+#~ msgstr "ΕÏγασία σε εξέλιξη.."
+
+#~ msgid "no label"
+#~ msgstr "χωÏίς ετικέτα"
+
+#~ msgid "State"
+#~ msgstr "Κατάσταση"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "ΣυμπεÏιλαμβάνω %i αÏχεία"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Αυτό το email στάλθηκε για να σας πληÏοφοÏήσει ότι το Deluge έχει τελειώσει "
+#~ "την λήψη του %s, το οποίο πεÏιλαμβάνει %i αÏχεία.\n"
+#~ "Για να σταματήσετε να λαμβάνετε ειδοποιήσεις, απλά απενεÏγοποιήστε την "
+#~ "ενημέÏωση με email από τις Ï€Ïοτιμήσεις του Deluge.\n"
+#~ "\n"
+#~ "Σας ευχαÏιστοÏμε,\n"
+#~ "Deluge"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr ""
+#~ "ΧειÏοκίνητα επανεκκινήστε την διεπαφή web για να εφαÏμοστοÏν οι Ïυθμίσεις."
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Το κλειδί δεν βÏέθηκε στο '%s'"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Το πιστοποιητικό δεν βÏέθηκε στο '%s'"
+
+#~ msgid "Show trackers"
+#~ msgstr "Εμφάνηση trackers"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Εμφάνιση λέξεων αναζήτησης"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Εμφάνιση πλαϊνής μπάÏας"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Εμφάνιση μηδενικών κλήσεων"
+
+#~ msgid "Sidebar"
+#~ msgstr "Πλαϊνή ΜπάÏα"
+
+#~ msgid "Cancel"
+#~ msgstr "ΆκυÏο"
+
+#~ msgid "Admin"
+#~ msgstr "ΔιαχειÏιστής"
+
+#~ msgid "Active time"
+#~ msgstr "ΕνεÏγός χÏόνος"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... και διαγÏαφή του αÏχείου Torrent"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... και διαγÏαφή των ληφθέντων αÏχείων"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... και διαγÏαφή Όλων των αÏχείων"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Συνδέθηκε στην ΥπηÏεσία"
+
+#~ msgid "Connected to"
+#~ msgstr "Συνδέθηκε σε"
+
+#~ msgid "Connection Limit"
+#~ msgstr "ÎŒÏιο ΣÏνδεσης"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "ÎŒÏιο ΣÏνδεσης Λήψης"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : Λίστα Torrent"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge είσοδος"
+
+#~ msgid "Disk Space"
+#~ msgstr "ΧώÏος δίσκου"
+
+#~ msgid "Do not download"
+#~ msgstr "Îα μη γίνει λήψη"
+
+#~ msgid "False"
+#~ msgstr "Σφάλμα"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "ΧωÏίς εισεÏχόμενες συνδέσεις"
+
+#~ msgid "Move torrent"
+#~ msgstr "Μετακίνηση torrent"
+
+#~ msgid "Label torrent"
+#~ msgstr "Ετικέτα torrent"
+
+#~ msgid "High priority"
+#~ msgstr "Υψηλή Ï€ÏοτεÏαιότητα"
+
+#~ msgid "From Url"
+#~ msgstr "Από URL"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Εξαναγκασμένος επανέλεγχος"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "ΦίλτÏο σε μια λέξη κλειδί"
+
+#~ msgid "Keyword"
+#~ msgstr "Λέξη κλειδί"
+
+#~ msgid "Highest priority"
+#~ msgstr "Ύψιστη Ï€ÏοτεÏαιότητα"
+
+#~ msgid "Seed rank"
+#~ msgstr "Βαθμός διαμοιÏασμοÏ"
+
+#~ msgid "Seeding time"
+#~ msgstr "ΧÏόνος διαμοιÏασμοÏ"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Normal priority"
+#~ msgstr "Κανονική Ï€ÏοτεÏαιότητα"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Δεν συνδέθηκε με την υπηÏεσία"
+
+#~ msgid "Search"
+#~ msgstr "Αναζήτηση"
+
+#~ msgid "Restart"
+#~ msgstr "Επανεκκίνηση"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "ÎŒÏιο ΤαχÏτητας Αποστολής"
+
+#~ msgid "True"
+#~ msgstr "Αληθές"
+
+#~ msgid "Update"
+#~ msgstr "ΕνημέÏωση"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "ÎŒÏιο ΘυÏών Αποστολής"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "ΚαθοÏισμός OÏίου EπίβαÏου IP"
+
+#~ msgid "Stats"
+#~ msgstr "Στατιστικά"
+
+#~ msgid "Force Download"
+#~ msgstr "Εξαναγκασμός Λήψης"
+
+#~ msgid "Graphs"
+#~ msgstr "ΓÏαφήματα"
+
+#~ msgid "Downloading.."
+#~ msgstr "Λήψη..."
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "Το %s δεν είναι έγκυÏο URL."
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Αποσυνδεδεμένο"
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Αποτυχία λήψης του: %s"
+
+#~ msgid "Test config value"
+#~ msgstr "Τιμή δοκιμαστικής διαμόÏφωσης"
+
+#~ msgid "All Finished!"
+#~ msgstr "Όλα τελείωσαν!"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Αυτόματος εγκαταστάτης του Deluge"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr ""
+#~ "Αυτός ο εγκαταστάτης θα σας βοηθήσει να στήσετε το Deluge κατά την Ï€Ïοτίμησή "
+#~ "σας"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "ΤÏοφοδότες/ΔιαμοιÏαστές"
+
+#~ msgid "Test config value:"
+#~ msgstr "Τιμή δοκιμαστικής διαμόÏφωσης:"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Εισάγετε τον κωδικό σας για να συνεχίσετε</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Το Deluge Ï€ÏοστατεÏεται με κωδικό!</big></b>"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>ΠÏοσθήκη Torrent</b></big>"
+
+#~ msgid "FAQ"
+#~ msgstr "Συχνές εÏωτήσεις"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "Αυτό δεν κάνει ακόμα τίποτα...\n"
diff --git a/deluge/i18n/en_AU.po b/deluge/i18n/en_AU.po
new file mode 100644
index 0000000..6b461d1
--- /dev/null
+++ b/deluge/i18n/en_AU.po
@@ -0,0 +1,4734 @@
+# English (Australia) translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2009-02-07 23:18+0000\n"
+"Last-Translator: John Garland <Unknown>\n"
+"Language-Team: English (Australia) <en_AU@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Hostname:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Username:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Password:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "From:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Enabled"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Settings"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Select A Folder"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Download Location</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Max Upload Speed:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Max Connections:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Max Upload Slots:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Max Download Speed:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Bandwidth</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Stop seed at ratio:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Remove at ratio"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Top"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Bottom"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Queue</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Options"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Download Limit:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Upload Limit:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Active Torrents:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Slow Settings</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Invalid label, valid characters:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Empty Label"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Label already exists"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Unknown Label"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Unknown Torrent"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Label _Options"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_Remove Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_Add Label"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Label Options"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Label Options</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Upload Slots:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Upload Speed:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Download Speed:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Connections:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Apply per torrent max settings:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maximum"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Auto Managed"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Apply Queue settings:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Queue"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Move completed to:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Apply location settings:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Location"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 line per tracker)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Automatically apply label:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Trackers"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Add Label"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Add Label</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Name:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Labels</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Extract to:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Create torrent name sub-folder"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>General</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Enable web interface"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Enable SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Listening port:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Settings</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP list (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Text (Zipped)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Text (Uncompressed)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Invalid leader"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Invalid magic code"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Invalid version"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Blocklist"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Days"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Check for new list every:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Import blocklist on startup"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Download the blocklist file if necessary and import the file."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Check Download and Import"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Download a new blocklist file and import it."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Force Download and Import"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Blocklist is up to date"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Options</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Type:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Date:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "File Size:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Info</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torrent Complete"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torrent Added"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Execute"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Event"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Command"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Add Command</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Commands</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Announce OK"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Announce Sent"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Warning"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Error"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Afghanistan"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Aland Islands"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Albania"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Algeria"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "American Samoa"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antarctica"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antigua and Barbuda"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Argentina"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Armenia"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "Australia"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Austria"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Azerbaijan"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Bahamas"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bahrain"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Bangladesh"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Belarus"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Belgium"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermuda"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Bolivia"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnia and Herzegovina"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Bouvet Island"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brazil"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "British Indian Ocean Territory"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Brunei Darussalam"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Bulgaria"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Cambodia"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Cameroon"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Canada"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Cape Verde"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Cayman Islands"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Central African Republic"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Chad"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Chile"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "China"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Christmas Island"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Cocos (Keeling) Islands"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Colombia"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Comoros"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Congo"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Congo, The Democratic Republic of the"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Cook Islands"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Cote d'Ivoire"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "Croatia"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Cuba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Cyprus"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Czech Republic"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Denmark"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Djibouti"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominica"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Dominican Republic"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Ecuador"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Egypt"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Equatorial Guinea"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Estonia"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Ethiopia"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falkland Islands (Malvinas)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Faroe Islands"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fiji"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Finland"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "France"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "French Guiana"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "French Polynesia"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "French Southern Territories"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Georgia"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "Germany"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "United Kingdom"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Greece"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Greenland"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadeloupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Guinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Guinea-Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guyana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Heard Island and McDonald Islands"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Holy See (Vatican City State)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Hungary"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Iceland"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "India"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonesia"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Iran, Islamic Republic of"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Iraq"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Ireland"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Isle of Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Israel"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italy"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaica"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japan"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordan"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazakhstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenya"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Korea, Democratic People's Republic of"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Korea, Republic of"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuwait"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kyrgyzstan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Lao People's Democratic Republic"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Latvia"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Lebanon"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberia"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libyan Arab Jamahiriya"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Lithuania"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luxembourg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Macedonia, The Former Yugoslav Republic of"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagascar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malaysia"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldives"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Marshall Islands"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinique"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauritania"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Mexico"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Micronesia, Federated States of"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldova"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolia"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Montenegro"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Morocco"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambique"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Myanmar"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Netherlands"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Netherlands Antilles"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "New Caledonia"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "New Zealand"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Norfolk Island"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Northern Mariana Islands"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norway"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palestinian Territory, Occupied"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua New Guinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguay"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Philippines"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Poland"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugal"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Qatar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Romania"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Russian Federation"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Rwanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Saint Barthelemy"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Saint Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Saint Kitts and Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Saint Lucia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Saint Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint Pierre and Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Saint Vincent and the Grenadines"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Sao Tome and Principe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Saudi Arabia"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbia"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seychelles"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapore"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slovakia"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slovenia"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Solomon Islands"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "South Africa"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "South Georgia and the South Sandwich Islands"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Spain"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Suriname"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard and Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Swaziland"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Sweden"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Switzerland"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Syrian Arab Republic"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Taiwan, Province of China"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tajikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzania, United Republic of"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Thailand"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Timor-Leste"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad and Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunisia"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Turkey"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Turks and Caicos Islands"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukraine"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "United Arab Emirates"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "United States"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "United States Minor Outlying Islands"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Uruguay"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Uzbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Virgin Islands, British"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Virgin Islands, U.S."
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis and Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Western Sahara"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Yemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabwe"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Offline"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Online"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Connected"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Daemon doesn't exist"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Daemon not running"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Starting server in PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Address"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Client"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Progress"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Down Speed"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Up Speed"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrents Queued"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrent Queued"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Unlimited"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Activated"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Other..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Down:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Up:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Down"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Up"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Set Maximum Download Speed"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Set Maximum Upload Speed"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torrent complete"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+"which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Downloads"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Network"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Bandwidth"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Interface"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Other"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Daemon"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Proxy"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Cache"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Plugins"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Plugin"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Select the Plugin"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Plugin Eggs"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Filename"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Size"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Invalid File"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Duplicate Torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "You cannot add the same torrent twice."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Unable to set file priority!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Choose a .torrent file"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Torrent files"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "All files"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Invalid URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Download Failed"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Tier"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Tracker"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Choose a file"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Choose a folder"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Save .torrent file"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Not Connected"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Connections"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Download Speed"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Upload Speed"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Protocol Traffic Download/Upload"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT Nodes"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "No Incoming Connections!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Set Maximum Connections"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrents"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Labels"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "All"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Downloading"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Seeding"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Paused"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Checking"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "Queued"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "None"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "No Label"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Host"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Error Adding Host"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Turn off Classic Mode?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Error Starting Core"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"Please see the details below for more information."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Error Starting Daemon"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "On"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Off"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Set Unlimited"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Choose a directory to move files to"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Set Maximum Upload Slots"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Priority"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Details:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Name"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Downloaded"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Uploaded"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Seeders"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Peers"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ETA"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Ratio"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Avail"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Added"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_File"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Add Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Create Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Edit"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Connection Manager"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_View"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Toolbar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Sidebar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Status_bar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "T_abs"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Columns"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "S_idebar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Show _Zero Hits"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Show _Trackers"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Help"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Frequently Asked Questions"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Add torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Add Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Remove torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Remove Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Pause the selected torrents"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Pause"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Resume the selected torrents"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Resume"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Queue Torrent Up"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Queue Up"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Queue Torrent Down"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Queue Down"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Preferences"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Connection Manager"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Expand All"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Do Not Download"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Normal Priority"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_High Priority"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Hi_ghest Priority"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Auto Managed:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Seed Rank:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Seeding Time:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Active Time:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Tracker Status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Availability:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Peers:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Seeders:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Pieces:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>ETA:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Next Announce:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Share Ratio:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Uploaded:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Downloaded:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Date Added:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Status"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Comments:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># of files:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Total Size:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Name:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Path:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Details"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Files"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Peers"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Move completed:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Private"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Prioritise First/Last"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_Edit Trackers"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Options"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Remove Torrent?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>The associated .torrent will be deleted!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>The downloaded data will be deleted!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Remove Selected Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "New Release"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>New Release Available!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Available Version:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Current Version:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Do not show this dialog in the future"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Goto Website"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Add a peer by its IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Select All"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Pause All"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Resume selected torrents."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Resu_me All"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Add Torrents"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_Remove"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrents</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Fi_les"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Full"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Compact"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Allocation</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Max Down Speed:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Max Up Speed:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Add In _Paused State"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Prioritise First/Last Pieces"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Revert To Defaults"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Apply To All"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Add URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>From URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Add Infohash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>From Infohash</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Trackers:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Create Torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Create Torrent</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Fol_der"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Remote Path"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Files</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Author:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Comments:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Info"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Webseeds"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Piece Size:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Set Private Flag"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Add this torrent to the session"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Enter Remote Path"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Remote Path</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Path:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Creating Torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Save .torrent as"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Save .torrent file</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Queued Torrents"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Add Queued Torrents</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Automatically add torrents on connect"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "label"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Add Peer"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Add Peer</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "hostname:port"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Add Host"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Connection Manager</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Start local daemon"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Automatically connect to selected host on start-up"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Automatically start localhost if needed"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Do not show this dialog on start-up"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Downloads</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Auto add .torrents from:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Download to:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Copy of .torrent files to:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Folders</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Use Full Allocation"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Use Compact Allocation"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Compact allocation only allocates space as needed"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Prioritize first and last pieces of torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Prioritize first and last pieces of files in torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Add torrents in Paused state"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Network</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Use Random Ports"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge will automatically choose a different port to use every time."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Active Port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "To:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Test Active Port"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Incoming Ports</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Outgoing Ports</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>Interface</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Peer TOS Byte:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT Port Mapping Protocol"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Peer Exchange"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery finds local peers on your network."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Distributed hash table may improve the amount of active connections."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Network Extras</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Inbound:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Level:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Outbound:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Encrypt entire stream"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Encryption</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Bandwidth</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Maximum Connection Attempts per Second:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Maximum Half-Open Connections:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr "The maximum upload speed for all torrents. Set -1 for unlimited."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Maximum Upload Speed (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "The maximum number of connections allowed. Set -1 for unlimited."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Maximum Connections:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr "The maximum upload slots for all torrents. Set -1 for unlimited."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Maximum Upload Slots:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr "The maximum download speed for all torrents. Set -1 for unlimited."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Maximum Download Speed (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Ignore limits on local network"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Rate limit IP overhead"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Global Bandwidth Usage</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr "The maximum upload slots per torrent. Set -1 for unlimited."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"The maximum number of connections per torrent. Set -1 for unlimited."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Per Torrent Bandwidth Usage</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Interface</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Enable"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Classic Mode</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Show session speed in titlebar"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Main Window</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Always show"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Bring the dialog to focus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Add Torrents Dialog</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Enable system tray icon"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Minimize to tray on close"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Start in tray"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Password protect system tray"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>System Tray</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Other</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Be alerted about new releases"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Updates</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Yes, please send anonymous statistics"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>System Information</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Location:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP Database</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Associate Magnet links with Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Daemon</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Daemon port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Port</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Allow Remote Connections"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Connections</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Periodically check the website for new releases"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Other</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Queue</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Queue new torrents to top"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Total active seeding:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Total active:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Total active downloading:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Do not count slow torrents"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Active Torrents</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Share Ratio Limit:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Seed Time Ratio:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Seed Time (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Stop seeding when share ratio reaches:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Remove torrent when share ratio reached"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Seeding</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Proxy</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Host:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Peer</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Web Seed</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Tracker</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Cache</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Cache Size (16 KiB blocks):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Cache Expiry (seconds):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Blocks Written:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"The total number of write operations performed since this session was "
+"started."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Writes:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "Write Cache Hit Ratio:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Write</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Blocks Read:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "The number of blocks that were served from cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "Blocks Read Hit:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "The cache hit ratio for the read cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "Read Cache Hit Ratio:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+"The total number of read operations performed since this session was started."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Reads:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Read</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Cache Size:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Read Cache Size:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Size</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Status</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Plugins</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Version:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Homepage:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Author Email:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Install Plugin"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Rescan Plugins"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_Find More Plugins"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Show Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Resume All"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_Download Speed Limit"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_Upload Speed Limit"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Quit & Shutdown Daemon"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Open Folder"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Resu_me"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Opt_ions"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Queue"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Update Tracker"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Remove Torrent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "_Force Re-check"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "Move _Storage"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "_Connection Limit"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Upload _Slot Limit"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Auto Managed"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Remove the selected torrent?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "If you remove the data, it will be lost permanently."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Edit Trackers"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Edit Trackers</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Add Tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Add Trackers</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Edit Tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Edit Tracker</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Remove With _Data"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Remove _Torrent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Move Storage"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Move Storage</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Destination:"
+
+#~ msgid "Details"
+#~ msgstr "Details"
+
+#~ msgid "Files"
+#~ msgstr "Files"
+
+#~ msgid "Download"
+#~ msgstr "Download"
+
+#~ msgid "Upload"
+#~ msgstr "Upload"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Share Ratio"
+
+#~ msgid "General"
+#~ msgstr "General"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Maximum Connections"
+
+#~ msgid "Unknown"
+#~ msgstr "Unknown"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Speed:</b>"
+
+#~ msgid "Clear"
+#~ msgstr "Clear"
+
+#~ msgid "Availability"
+#~ msgstr "Availability"
+
+#~ msgid "Add"
+#~ msgstr "Add"
+
+#~ msgid "Remove"
+#~ msgstr "Remove"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Delete .torrent file"
+
+#~ msgid "Speed"
+#~ msgstr "Speed"
+
+#~ msgid "Select All"
+#~ msgstr "Select All"
+
+#~ msgid "Username"
+#~ msgstr "Username"
+
+#~ msgid "Password"
+#~ msgstr "Password"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "_Quit"
+#~ msgstr "_Quit"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge is locked"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+
+#~ msgid "Filters"
+#~ msgstr "Filters"
+
+#~ msgid "Graph"
+#~ msgstr "Graph"
+
+#~ msgid "Pieces"
+#~ msgstr "Pieces"
+
+#~ msgid "New Password"
+#~ msgstr "New Password"
+
+#~ msgid "Template"
+#~ msgstr "Template"
+
+#~ msgid "# Of Files"
+#~ msgstr "# Of Files"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Delete downloaded files."
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Auto refresh:"
+
+#~ msgid "About"
+#~ msgstr "About"
+
+#~ msgid "Disable"
+#~ msgstr "Disable"
+
+#~ msgid "Config"
+#~ msgstr "Config"
+
+#~ msgid "Set"
+#~ msgstr "Set"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Refresh page every:"
+
+#~ msgid "Resume all"
+#~ msgstr "Resume all"
+
+#~ msgid "Reannounce"
+#~ msgstr "Reannounce"
+
+#~ msgid "Pause all"
+#~ msgstr "Pause all"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Upload torrent"
+
+#~ msgid "Url"
+#~ msgstr "URL"
+
+#~ msgid "Submit"
+#~ msgstr "Submit"
+
+#~ msgid "Total Size"
+#~ msgstr "Total Size"
+
+#~ msgid "Torrent list"
+#~ msgstr "Torrent list"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Set Timeout"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Tracker Status"
+
+#~ msgid "seconds"
+#~ msgstr "seconds"
+
+#~ msgid "Logout"
+#~ msgstr "Logout"
+
+#~ msgid "Ava"
+#~ msgstr "Ava"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Password is invalid,try again"
+
+#~ msgid "Next Announce"
+#~ msgstr "Next Announce"
+
+#~ msgid "Login"
+#~ msgstr "Login"
+
+#~ msgid "Eta"
+#~ msgstr "ETA"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Choose a url or a torrent, not both."
+
+#~ msgid "translate something"
+#~ msgstr "translate something"
+
+#~ msgid "Image Only"
+#~ msgstr "Image Only"
+
+#~ msgid "Text Only"
+#~ msgstr "Text Only"
+
+#~ msgid "Text and image"
+#~ msgstr "Text and image"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "refresh must be > 0"
+
+#~ msgid "Type"
+#~ msgstr "Type"
+
+#~ msgid "Disabled"
+#~ msgstr "Disabled"
+
+#~ msgid "From"
+#~ msgstr "From"
+
+#~ msgid "Queue Position"
+#~ msgstr "Queue Position"
+
+#~ msgid "Start"
+#~ msgstr "Start"
+
+#~ msgid "File"
+#~ msgstr "File"
+
+#~ msgid "Save"
+#~ msgstr "Save"
+
+#~ msgid "Download Location"
+#~ msgstr "Download Location"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Add In Paused State"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Prioritise first and last pieces"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Maximum Upload Slots"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Maximum Up Speed"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Maximum Down Speed"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Compact Allocation"
+
+#~ msgid "no uri"
+#~ msgstr "no uri"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Error in torrent options."
+
+#~ msgid "No data"
+#~ msgstr "No data"
+
+#~ msgid "Ports"
+#~ msgstr "Ports"
+
+#~ msgid "To"
+#~ msgstr "To"
+
+#~ msgid "Random"
+#~ msgstr "Random"
+
+#~ msgid "Extra's"
+#~ msgstr "Extra's"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Peer-Exchange"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Mainline DHT"
+
+#~ msgid "Inbound"
+#~ msgstr "Inbound"
+
+#~ msgid "Either"
+#~ msgstr "Either"
+
+#~ msgid "Level"
+#~ msgstr "Level"
+
+#~ msgid "Outbound"
+#~ msgstr "Outbound"
+
+#~ msgid "Forced"
+#~ msgstr "Forced"
+
+#~ msgid "Encryption"
+#~ msgstr "Encryption"
+
+#~ msgid "Handshake"
+#~ msgstr "Handshake"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Unlimited"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Save .torrent files to"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Auto Add folder"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Per Torrent"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Store all downoads in"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Maximum Half-Open Connections"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Maximum Connection Attempts per Second"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Maximum Download Speed (Kib/s)"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "Restart daemon and webui after changing these settings"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Maximum Upload Speed (Kib/s)"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Total active torrents"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = unlimited"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Remove torrent when ratio reached"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Stop seeding when ratio reaches"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Total active seeding"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Total active downloading"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Enabled Plugins"
+
+#~ msgid "Button style"
+#~ msgstr "Button style"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "New Password is not equal to New Password(confirm)"
+
+#~ msgid "Move To"
+#~ msgstr "Move To"
+
+#~ msgid "Error in Path."
+#~ msgstr "Error in Path."
+
+#~ msgid "These changes were saved"
+#~ msgstr "These changes were saved"
+
+#~ msgid "Cache templates"
+#~ msgstr "Cache templates"
+
+#~ msgid "Current Password"
+#~ msgstr "Current Password"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "New Password (Confirm)"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Old password is invalid"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Correct the errors above and try again"
+
+#~ msgid "Yes"
+#~ msgstr "Yes"
+
+#~ msgid "No"
+#~ msgstr "No"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Stop seed at ratio"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Enter a list of values."
+
+#~ msgid "This field is required."
+#~ msgstr "This field is required."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Select a valid choice. %s is not one of the available choices."
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Ensure this value has at most %(max)d characters (it has %(length)d)."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Enter a valid value."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Ensure this value is greater than or equal to %s."
+
+#~ msgid "Enter a number."
+#~ msgstr "Enter a number."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Enter a whole number."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Ensure this value is less than or equal to %s."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Ensure that there are no more than %s digits in total."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Ensure that there are no more than %s decimal places."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Enter a valid time."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "This URL appears to be a broken link."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Enter a valid URL."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "The submitted file is empty."
+
+#~ msgid "No file was submitted."
+#~ msgstr "No file was submitted."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "No file was submitted. Check the encoding type on the form."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Enter a valid e-mail address."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Enter a valid date/time."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Enter a valid date."
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Connect"
+#~ msgstr "Connect"
+
+#~ msgid "Statistics"
+#~ msgstr "Statistics"
+
+#~ msgid "Delete"
+#~ msgstr "Delete"
+
+#~ msgid "Stop"
+#~ msgstr "Stop"
+
+#~ msgid "Queue Top"
+#~ msgstr "Queue Top"
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr ""
+#~ "Select a valid choice. %(value)s is not one of the available choices."
+
+#~ msgid "This folder does not exist."
+#~ msgstr "This folder does not exist."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Enter a valid IPv4 address."
+
+#~ msgid "Move"
+#~ msgstr "Move"
+
+#~ msgid "Recheck"
+#~ msgstr "Recheck"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Queue Bottom"
+
+#~ msgid "Other.."
+#~ msgstr "Other.."
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torrent is past stop ratio."
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Timeout (seconds)"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Check for every (days)"
+
+#~ msgid "BlockList"
+#~ msgstr "BlockList"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Importing %s"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Downloading %.2f%%"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Import on daemon startup"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Times to attempt download"
+
+#~ msgid "Import Now"
+#~ msgstr "Import Now"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Blocked Ranges: %s"
+
+#~ msgid "Inactive"
+#~ msgstr "Inactive"
+
+#~ msgid "Refresh status"
+#~ msgstr "Refresh status"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "page 6"
+#~ msgstr "page 6"
+
+#~ msgid "page 7"
+#~ msgstr "page 7"
+
+#~ msgid "page 8"
+#~ msgstr "page 8"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Add Torrents</b></big>"
+
+#~ msgid "From Session"
+#~ msgstr "From Session"
+
+#~ msgid "Community"
+#~ msgstr "Community"
+
+#~ msgid "FAQ"
+#~ msgstr "FAQ"
+
+#~ msgid "Homepage"
+#~ msgstr "Homepage"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Auto Add enabled"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+
+#~ msgid "Test config value:"
+#~ msgstr "Test config value:"
+
+#~ msgid "Graphs"
+#~ msgstr "Graphs"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Seeds/Peers"
+
+#~ msgid "page 12"
+#~ msgstr "page 12"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 10"
+#~ msgstr "page 10"
+
+#~ msgid "page 11"
+#~ msgstr "page 11"
+
+#~ msgid "All Finished!"
+#~ msgstr "All Finished!"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Deluge Setup Wizard"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr "This wizard will help you set up Deluge to your liking."
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Including %i files"
+
+#~ msgid "Test config value"
+#~ msgstr "Test config value"
+
+#~ msgid "Stats"
+#~ msgstr "Stats"
+
+#~ msgid "no label"
+#~ msgstr "no label"
+
+#~ msgid "State"
+#~ msgstr "State"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "Show trackers"
+#~ msgstr "Show trackers"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Show zero hits"
+
+#~ msgid "Sidebar"
+#~ msgstr "Sidebar"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Show sidebar"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Connect to Daemon"
+
+#~ msgid "Admin"
+#~ msgstr "Admin"
+
+#~ msgid "Active time"
+#~ msgstr "Active time"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : Torrent List"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Show keyword search"
+
+#~ msgid "Connected to"
+#~ msgstr "Connected to"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge Login"
+
+#~ msgid "False"
+#~ msgstr "False"
+
+#~ msgid "Seed rank"
+#~ msgstr "Seed rank"
+
+#~ msgid "Restart"
+#~ msgstr "Restart"
+
+#~ msgid "True"
+#~ msgstr "True"
+
+#~ msgid "Seeding time"
+#~ msgstr "Seeding time"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Filter on a keyword"
+
+#~ msgid "Keyword"
+#~ msgstr "Keyword"
+
+#~ msgid "Label torrent"
+#~ msgstr "Label torrent"
+
+#~ msgid "Move torrent"
+#~ msgstr "Move torrent"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Not Connected to a daemon"
+
+#~ msgid "Update"
+#~ msgstr "Update"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Auto refresh (seconds)"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Rate Limit IP Overhead"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Error setting label options"
+
+#~ msgid "apply_max"
+#~ msgstr "apply_max"
+
+#~ msgid "max_download_speed"
+#~ msgstr "max_download_speed"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "max_upload_speed"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "max_upload_slots"
+
+#~ msgid "max_connections"
+#~ msgstr "max_connections"
+
+#~ msgid "move_completed_path"
+#~ msgstr "move_completed_path"
+
+#~ msgid "stop_ratio"
+#~ msgstr "stop_ratio"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "stop_at_ratio"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "is_auto_managed"
+
+#~ msgid "apply_queue"
+#~ msgstr "apply_queue"
+
+#~ msgid "move_completed"
+#~ msgstr "move_completed"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "apply_move_completed"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "remove_at_ratio"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "auto_add_trackers"
+
+#~ msgid "auto_add"
+#~ msgstr "auto_add"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Work in progress.."
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Manually restart webui to apply changes."
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Certificate not found at '%s'"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... and delete All files"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Key not found at '%s'"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... and delete Torrent file"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "D/L Speed Limit"
+
+#~ msgid "Disk Space"
+#~ msgstr "Disk Space"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... and delete Downloaded files"
+
+#~ msgid "Cancel"
+#~ msgstr "Cancel"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Connection Limit"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Normal priority"
+#~ msgstr "Normal priority"
+
+#~ msgid "Highest priority"
+#~ msgstr "Highest priority"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "No Incoming Connections"
+
+#~ msgid "Search"
+#~ msgstr "Search"
+
+#~ msgid "Do not download"
+#~ msgstr "Do not download"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Force Recheck"
+
+#~ msgid "From Url"
+#~ msgstr "From Url"
+
+#~ msgid "High priority"
+#~ msgstr "High priority"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Upload Slot Limit"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Update Tracker"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "U/L Speed Limit"
+
+#~ msgid "Force Download"
+#~ msgstr "Force Download"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s is not a valid URL."
+
+#~ msgid "Downloading.."
+#~ msgstr "Downloading.."
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Failed to download : %s"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Enter your password to continue</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge is password protected!</big></b>"
diff --git a/deluge/i18n/en_CA.po b/deluge/i18n/en_CA.po
new file mode 100644
index 0000000..d397d25
--- /dev/null
+++ b/deluge/i18n/en_CA.po
@@ -0,0 +1,4736 @@
+# English (Canada) translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2009-09-25 16:58+0000\n"
+"Last-Translator: Itai Molenaar <Unknown>\n"
+"Language-Team: English (Canada) <en_CA@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Hostname:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Username:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Password:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "From:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Enabled"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Settings"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Select A Folder"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Download Location</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Max Upload Speed:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Max Connections:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Max Upload Slots:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Max Download Speed:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Bandwidth</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Stop seed at ratio:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Remove at ratio"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Top"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Bottom"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Queue</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Options"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Download Limit:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Upload Limit:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Active Torrents:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Slow Settings</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Invalid label, valid characters:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Empty Label"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Label already exists"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Unknown Label"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Unknown Torrent"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Label _Options"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_Remove Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_Add Label"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Label Options"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Label Options</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Upload Slots:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Upload Speed:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Download Speed:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Connections:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Apply per torrent max settings:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maximum"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Auto Managed"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Apply Queue settings:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Queue"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Move completed to:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Apply location settings:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Location"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 line per tracker)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Automatically apply label:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Trackers"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Add Label"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Add Label</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Name:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Labels</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Extract to:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Create torrent name sub-folder"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>General</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Enable web interface"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Enable SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Listening port:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Settings</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP list (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Text (Zipped)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Text (Uncompressed)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Invalid leader"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Invalid magic code"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Invalid version"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Blocklist"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Days"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Check for new list every:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Import blocklist on startup"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Download the blocklist file if necessary and import the file."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Check Download and Import"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Download a new blocklist file and import it."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Force Download and Import"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Blocklist is up to date"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Options</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Type:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Date:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "File Size:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Info</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torrent Complete"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torrent Added"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Execute"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Event"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Command"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Add Command</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Commands</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Announce OK"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Announce Sent"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Warning"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Error"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Afghanistan"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Aland Islands"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Albania"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Algeria"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "American Samoa"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antarctica"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antigua and Barbuda"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Argentina"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Armenia"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "Australia"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Austria"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Azerbaijan"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Bahamas"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bahrain"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Bangladesh"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Belarus"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Belgium"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermuda"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Bolivia"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnia and Herzegovina"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Bouvet Island"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brazil"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "British Indian Ocean Territory"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Brunei Darussalam"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Bulgaria"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Cambodia"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Cameroon"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Canada"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Cape Verde"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Cayman Islands"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Central African Republic"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Chad"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Chile"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "China"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Christmas Island"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Cocos (Keeling) Islands"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Colombia"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Comoros"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Congo"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Congo, The Democratic Republic of the"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Cook Islands"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Cote d'Ivoire"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "Croatia"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Cuba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Cyprus"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Czech Republic"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Denmark"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Djibouti"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominica"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Dominican Republic"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Ecuador"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Egypt"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Equatorial Guinea"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Estonia"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Ethiopia"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falkland Islands (Malvinas)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Faroe Islands"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fiji"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Finland"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "France"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "French Guiana"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "French Polynesia"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "French Southern Territories"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Georgia"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "Germany"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "United Kingdom"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Greece"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Greenland"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadeloupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Guinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Guinea-Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guyana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Heard Island and McDonald Islands"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Holy See (Vatican City State)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Hungary"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Iceland"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "India"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonesia"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Iran, Islamic Republic of"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Iraq"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Ireland"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Isle of Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Israel"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italy"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaica"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japan"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordan"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazakhstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenya"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Korea, Democratic People's Republic of"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Korea, Republic of"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuwait"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kyrgyzstan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Lao People's Democratic Republic"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Latvia"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Lebanon"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberia"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libyan Arab Jamahiriya"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Lithuania"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luxembourg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Macedonia, The Former Yugoslav Republic of"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagascar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malaysia"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldives"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Marshall Islands"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinique"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauritania"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Mexico"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Micronesia, Federated States of"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldova"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolia"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Montenegro"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Morocco"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambique"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Myanmar"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Netherlands"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Netherlands Antilles"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "New Caledonia"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "New Zealand"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Norfolk Island"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Northern Mariana Islands"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norway"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palestinian Territory, Occupied"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua New Guinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguay"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Philippines"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Poland"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugal"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Qatar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Romania"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Russian Federation"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Rwanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Saint Barthelemy"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Saint Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Saint Kitts and Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Saint Lucia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Saint Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint Pierre and Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Saint Vincent and the Grenadines"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Sao Tome and Principe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Saudi Arabia"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbia"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seychelles"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapore"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slovakia"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slovenia"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Solomon Islands"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "South Africa"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "South Georgia and the South Sandwich Islands"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Spain"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Suriname"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard and Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Swaziland"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Sweden"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Switzerland"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Syrian Arab Republic"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Taiwan, Province of China"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tajikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzania, United Republic of"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Thailand"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Timor-Leste"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad and Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunisia"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Turkey"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Turks and Caicos Islands"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukraine"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "United Arab Emirates"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "United States"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "United States Minor Outlying Islands"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Uruguay"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Uzbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Viet Nam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Virgin Islands, British"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Virgin Islands, U.S."
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis and Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Western Sahara"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Yemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabwe"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Offline"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Online"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Connected"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Daemon doesn't exist"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Daemon not running"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Starting server in PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Address"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Client"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Progress"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Down Speed"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Up Speed"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrents Queued"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrent Queued"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Unlimited"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Activated"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Other..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Down:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Up:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Down"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Up"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Set Maximum Download Speed"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Set Maximum Upload Speed"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torrent complete"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Downloads"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Network"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Bandwidth"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Interface"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Other"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Daemon"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Proxy"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Cache"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Plugins"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Plugin"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Select the Plugin"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Plugin Eggs"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Filename"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Size"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Invalid File"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Duplicate Torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "You cannot add the same torrent twice."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Unable to set file priority!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Choose a .torrent file"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Torrent files"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "All files"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Invalid URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Download Failed"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Tier"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Tracker"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Choose a file"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Choose a folder"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Save .torrent file"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Not Connected"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Connections"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Download Speed"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Upload Speed"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Protocol Traffic Download / Upload"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT Nodes"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "No Incoming Connections!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Set Maximum Connections"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrents"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Labels"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "All"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Downloading"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Seeding"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Paused"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Checking"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "Queued"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "None"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "No Label"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Host"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Error Adding Host"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Turn off Classic Mode?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Error Starting Core"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Error Starting Daemon"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "On"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Off"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Set Unlimited"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Choose a directory to move files to"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Set Maximum Upload Slots"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Priority"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Details:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Name"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Downloaded"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Uploaded"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Seeders"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Peers"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ETA"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Ratio"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Avail"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Added"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_File"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Add Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Create Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Edit"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Connection Manager"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_View"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Toolbar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Sidebar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Status_bar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "T_abs"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Columns"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "S_idebar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Show _Zero Hits"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Show _Trackers"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Help"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Frequently Asked Questions"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Add torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Add Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Remove torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Remove Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Pause the selected torrents"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Pause"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Resume the selected torrents"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Resume"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Queue Torrent Up"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Queue Up"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Queue Torrent Down"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Queue Down"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Preferences"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Connection Manager"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Expand All"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Do Not Download"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Normal Priority"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_High Priority"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Hi_ghest Priority"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Auto Managed:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Seed Rank:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Seeding Time:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Active Time:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Tracker Status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Availability:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Peers:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Seeders:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Pieces:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>ETA:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Next Announce:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Share Ratio:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Uploaded:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Downloaded:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Date Added:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Status"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Comments:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># of files:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Total Size:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Name:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Path:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Details"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Files"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Peers"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Move completed:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Private"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Prioritize First/Last"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_Edit Trackers"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Options"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Remove Torrent?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>The associated .torrent will be deleted!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>The downloaded data will be deleted!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Remove Selected Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "New Release"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>New Release Available!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Available Version:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Current Version:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Do not show this dialog in the future"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Goto Website"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Add a peer by its IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Select All"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Pause All"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Resume selected torrents."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Resu_me All"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Add Torrents"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_Remove"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrents</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Fi_les"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Full"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Compact"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Allocation</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Max Down Speed:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Max Up Speed:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Add In _Paused State"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Prioritise First/Last Pieces"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Revert To Defaults"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Apply To All"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Add URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>From URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Add Infohash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>From Infohash</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Trackers:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Create Torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Create Torrent</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Fol_der"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Remote Path"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Files</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Author:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Comments:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Info"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Webseeds"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Piece Size:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Set Private Flag"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Add this torrent to the session"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Enter Remote Path"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Remote Path</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Path:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Creating Torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Save .torrent as"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Save .torrent file</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Queued Torrents"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Add Queued Torrents</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Automatically add torrents on connect"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "label"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Add Peer"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Add Peer</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "hostname:port"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Add Host"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Connection Manager</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Start local daemon"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Automatically connect to selected host on start-up"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Automatically start localhost if needed"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Do not show this dialog on start-up"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Downloads</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Auto add .torrents from:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Download to:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Copy .torrent files to:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Folders</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Use Full Allocation"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Use Compact Allocation"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Compact allocation only allocates space as needed"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Prioritise first and last pieces of torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Prioritize first and last pieces of files in torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Add torrents in Paused state"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Network</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Use Random Ports"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge will automatically choose a different port to use every time."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Active Port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "To:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Test Active Port"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Incoming Ports</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Outgoing Ports</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>Interface</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Peer TOS Byte:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT Port Mapping Protocol"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Peer Exchange"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery finds local peers on your network."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Distributed hash table may improve the amount of active connections."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Network Extras</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Inbound:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Level:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Outbound:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Encrypt entire stream"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Encryption</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Bandwidth</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Maximum Connection Attempts per Second:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Maximum Half-Open Connections:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr "The maximum upload speed for all torrents. Set -1 for unlimited."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Maximum Upload Speed (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "The maximum number of connections allowed. Set -1 for unlimited."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Maximum Connections:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr "The maximum upload slots for all torrents. Set -1 for unlimited."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Maximum Upload Slots:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr "The maximum download speed for all torrents. Set -1 for unlimited."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Maximum Download Speed (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Ignore limits on local network"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Rate limit IP overhead"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Global Bandwidth Usage</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr "The maximum upload slots per torrent. Set -1 for unlimited."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"The maximum number of connections per torrent. Set -1 for unlimited."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Per Torrent Bandwidth Usage</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Interface</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Enable"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Classic Mode</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Show session speed in titlebar"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Main Window</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Always show"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Bring the dialog to focus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Add Torrents Dialog</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Enable system tray icon"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Minimize to tray on close"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Start in tray"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Password protect system tray"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>System Tray</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Other</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Be alerted about new releases"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Updates</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Yes, please send anonymous statistics"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>System Information</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Location:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP Database</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Associate Magnet links with Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Daemon</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Daemon port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Port</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Allow Remote Connections"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Connections</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Periodically check the website for new releases"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Other</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Queue</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Queue new torrents to top"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Total active seeding:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Total active:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Total active downloading:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Do not count slow torrents"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Active Torrents</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Share Ratio Limit:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Seed Time Ratio:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Seed Time (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Stop seeding when share ratio reaches:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Remove torrent when share ratio reached"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Seeding</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Proxy</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Host:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Peer</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Web Seed</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Tracker</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Cache</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Cache Size (16 KiB blocks):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Cache Expiry (seconds):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Blocks Written:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"The total number of write operations performed since this session was "
+"started."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Writes:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "Write Cache Hit Ratio:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Write</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Blocks Read:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "The number of blocks that were served from cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "Blocks Read Hit:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "The cache hit ratio for the read cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "Read Cache Hit Ratio:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+"The total number of read operations performed since this session was started."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Reads:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Read</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Cache Size:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Read Cache Size:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Size</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Status</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Plugins</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Version:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Homepage:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Author Email:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Install Plugin"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Rescan Plugins"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_Find More Plugins"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Show Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Resume All"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_Download Speed Limit"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_Upload Speed Limit"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Quit & Shutdown Daemon"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Open Folder"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Resu_me"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Opt_ions"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Queue"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Update Tracker"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Remove Torrent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "_Force Re-check"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "Move _Storage"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "_Connection Limit"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Upload _Slot Limit"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Auto Managed"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Remove the selected torrent?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "If you remove the data, it will be lost permanently."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Edit Trackers"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Edit Trackers</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Add Tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Add Trackers</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Edit Tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Edit Tracker</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Remove With _Data"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Remove _Torrent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Move Storage"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Move Storage</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Destination:"
+
+#~ msgid "Unknown"
+#~ msgstr "Unknown"
+
+#~ msgid "seconds"
+#~ msgstr "seconds"
+
+#~ msgid "Download"
+#~ msgstr "Download"
+
+#~ msgid "Upload"
+#~ msgstr "Upload"
+
+#~ msgid "Yes"
+#~ msgstr "Yes"
+
+#~ msgid "No"
+#~ msgstr "No"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Update Tracker"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Mainline DHT"
+
+#~ msgid "Remove"
+#~ msgstr "Remove"
+
+#~ msgid "Details"
+#~ msgstr "Details"
+
+#~ msgid "Files"
+#~ msgstr "Files"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Share Ratio"
+
+#~ msgid "General"
+#~ msgstr "General"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Maximum Connections"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Speed:</b>"
+
+#~ msgid "Availability"
+#~ msgstr "Availability"
+
+#~ msgid "Add"
+#~ msgstr "Add"
+
+#~ msgid "Clear"
+#~ msgstr "Clear"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Delete .torrent file"
+
+#~ msgid "Speed"
+#~ msgstr "Speed"
+
+#~ msgid "Select All"
+#~ msgstr "Select All"
+
+#~ msgid "Username"
+#~ msgstr "Username"
+
+#~ msgid "Password"
+#~ msgstr "Password"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "_Quit"
+#~ msgstr "_Quit"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge is locked"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+
+#~ msgid "Filters"
+#~ msgstr "Filters"
+
+#~ msgid "Graph"
+#~ msgstr "Graph"
+
+#~ msgid "Pieces"
+#~ msgstr "Pieces"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Choose an url or a torrent, not both."
+
+#~ msgid "translate something"
+#~ msgstr "Translate something"
+
+#~ msgid "Image Only"
+#~ msgstr "Image Only"
+
+#~ msgid "Text Only"
+#~ msgstr "Text Only"
+
+#~ msgid "Text and image"
+#~ msgstr "Text and image"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "Refresh must be > 0"
+
+#~ msgid "# Of Files"
+#~ msgstr "# Of Files"
+
+#~ msgid "Next Announce"
+#~ msgstr "Next Announce"
+
+#~ msgid "Pause all"
+#~ msgstr "Pause all"
+
+#~ msgid "Logout"
+#~ msgstr "Logout"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Password is invalid, please try again"
+
+#~ msgid "Login"
+#~ msgstr "Login"
+
+#~ msgid "Eta"
+#~ msgstr "ETA"
+
+#~ msgid "Url"
+#~ msgstr "URL"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Upload torrent"
+
+#~ msgid "Total Size"
+#~ msgstr "Total Size"
+
+#~ msgid "Torrent list"
+#~ msgstr "Torrent list"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Tracker Status"
+
+#~ msgid "Ava"
+#~ msgstr "Ava"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Delete downloaded files."
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Auto refresh:"
+
+#~ msgid "About"
+#~ msgstr "About"
+
+#~ msgid "Disable"
+#~ msgstr "Disable"
+
+#~ msgid "Config"
+#~ msgstr "Config"
+
+#~ msgid "Type"
+#~ msgstr "Type"
+
+#~ msgid "Disabled"
+#~ msgstr "Disabled"
+
+#~ msgid "From"
+#~ msgstr "From"
+
+#~ msgid "New Password"
+#~ msgstr "New Password"
+
+#~ msgid "Template"
+#~ msgstr "Template"
+
+#~ msgid "Set"
+#~ msgstr "Set"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Refresh page every:"
+
+#~ msgid "Submit"
+#~ msgstr "Submit"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Set Timeout"
+
+#~ msgid "Resume all"
+#~ msgstr "Resume all"
+
+#~ msgid "Queue Position"
+#~ msgstr "Queue Position"
+
+#~ msgid "Start"
+#~ msgstr "Start"
+
+#~ msgid "Reannounce"
+#~ msgstr "Reannounce"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Maxiumum Upload Speed (Kib/s)"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Maximum Download Speed (Kib/s)"
+
+#~ msgid "Delete"
+#~ msgstr "Delete"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Maximum Upload Slots"
+
+#~ msgid "BlockList"
+#~ msgstr "BlockList"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Downloading %.2f%%"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Importing %s"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Times to attempt download"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Import on daemon startup"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Check for every (days)"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Timeout (seconds)"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Blocked Ranges: %s"
+
+#~ msgid "Import Now"
+#~ msgstr "Import Now"
+
+#~ msgid "Inactive"
+#~ msgstr "Inactive"
+
+#~ msgid "Refresh status"
+#~ msgstr "Refresh status"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+
+#~ msgid "Other.."
+#~ msgstr "Other..."
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torrent is past stop ratio."
+
+#~ msgid "These changes were saved"
+#~ msgstr "These changes were saved"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Correct the errors above and try again"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Statistics"
+#~ msgstr "Statistics"
+
+#~ msgid "Connect"
+#~ msgstr "Connect"
+
+#~ msgid "Stop"
+#~ msgstr "Stop"
+
+#~ msgid "Ports"
+#~ msgstr "Ports"
+
+#~ msgid "Queue Top"
+#~ msgstr "Queue Top"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Queue Bottom"
+
+#~ msgid "To"
+#~ msgstr "To"
+
+#~ msgid "Recheck"
+#~ msgstr "Recheck"
+
+#~ msgid "Move"
+#~ msgstr "Move"
+
+#~ msgid "Random"
+#~ msgstr "Random"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Extra's"
+#~ msgstr "Extras"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Peer-Exchange"
+
+#~ msgid "Forced"
+#~ msgstr "Forced"
+
+#~ msgid "Encryption"
+#~ msgstr "Encryption"
+
+#~ msgid "Handshake"
+#~ msgstr "Handshake"
+
+#~ msgid "Either"
+#~ msgstr "Either"
+
+#~ msgid "Inbound"
+#~ msgstr "Inbound"
+
+#~ msgid "Outbound"
+#~ msgstr "Outbound"
+
+#~ msgid "Level"
+#~ msgstr "Level"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Unlimited"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Maximum Half-Open Connections"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Maximum Connection Attempts per Second"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Auto Add enabled"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "Restart daemon and webui after changing these settings"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Store all downoads in"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Auto Add folder"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Save .torrent files to"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Per Torrent"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Prioritize first and last pieces"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Total active seeding"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Stop seeding when ratio reaches"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Total active torrents"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Total active downloading"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = unlimited"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Remove torrent when ratio reached"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Enabled Plugins"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Ensure this value has at most %(max)d characters (it has %(length)d)."
+
+#~ msgid "This folder does not exist."
+#~ msgstr "This folder does not exist."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Enter a valid value."
+
+#~ msgid "This field is required."
+#~ msgstr "This field is required."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Select a valid choice. %s is not one of the available choices."
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Enter a list of values."
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Enter a valid date."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Ensure that there are no more than %s decimal places."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Ensure that there are no more than %s digits in total."
+
+#~ msgid "Enter a number."
+#~ msgstr "Enter a number."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Ensure this value is greater than or equal to %s."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Ensure this value is less than or equal to %s."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Enter a whole number."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Enter a valid time."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Enter a valid IPv4 address."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Enter a valid e-mail address."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Enter a valid date/time."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "No file was submitted. Check the encoding type on the form."
+
+#~ msgid "No file was submitted."
+#~ msgstr "No file was submitted."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "The submitted file is empty."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Enter a valid URL."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "This URL appears to be a broken link."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr ""
+#~ "Select a valid choice. %(value)s is not one of the available choices."
+
+#~ msgid "Move To"
+#~ msgstr "Move To"
+
+#~ msgid "Error in Path."
+#~ msgstr "Error in Path."
+
+#~ msgid "no uri"
+#~ msgstr "no uri"
+
+#~ msgid "Cache templates"
+#~ msgstr "Cache templates"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Old password is invalid"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Maximum Up Speed"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Maximum Down Speed"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "New Password (Confirm)"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Error in torrent options."
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Stop seed at ratio"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Add In Paused State"
+
+#~ msgid "Download Location"
+#~ msgstr "Download Location"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Compact Allocation"
+
+#~ msgid "No data"
+#~ msgstr "No data"
+
+#~ msgid "File"
+#~ msgstr "File"
+
+#~ msgid "Save"
+#~ msgstr "Save"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Add Torrents</b></big>"
+
+#~ msgid "From Session"
+#~ msgstr "From Session"
+
+#~ msgid "page 6"
+#~ msgstr "page 6"
+
+#~ msgid "page 7"
+#~ msgstr "page 7"
+
+#~ msgid "page 8"
+#~ msgstr "page 8"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "Homepage"
+#~ msgstr "Homepage"
+
+#~ msgid "FAQ"
+#~ msgstr "FAQ"
+
+#~ msgid "Community"
+#~ msgstr "Community"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "New Password is not equal to New Password(confirm)"
+
+#~ msgid "Button style"
+#~ msgstr "Button style"
+
+#~ msgid "Current Password"
+#~ msgstr "Current Password"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Auto refresh (seconds)"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Rate Limit IP Overhead"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet.\n"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 11"
+#~ msgstr "page 11"
+
+#~ msgid "page 10"
+#~ msgstr "page 10"
+
+#~ msgid "page 12"
+#~ msgstr "page 12"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "max_upload_slots"
+
+#~ msgid "max_connections"
+#~ msgstr "max_connections"
+
+#~ msgid "apply_queue"
+#~ msgstr "apply_queue"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "is_auto_managed"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "stop_at_ratio"
+
+#~ msgid "stop_ratio"
+#~ msgstr "stop_ratio"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "max_upload_speed"
+
+#~ msgid "max_download_speed"
+#~ msgstr "max_download_speed"
+
+#~ msgid "apply_max"
+#~ msgstr "apply_max"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Error setting label options"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "remove_at_ratio"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "apply_move_completed"
+
+#~ msgid "move_completed"
+#~ msgstr "move_completed"
+
+#~ msgid "move_completed_path"
+#~ msgstr "move_completed_path"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Work in progress.."
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "auto_add_trackers"
+
+#~ msgid "auto_add"
+#~ msgstr "auto_add"
+
+#~ msgid "no label"
+#~ msgstr "no label"
+
+#~ msgid "State"
+#~ msgstr "State"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Including %i files"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "This email is to inform you that Deluge has finished downloading %s , which "
+#~ "includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email notification in "
+#~ "Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 w/ Auth."
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Https"
+#~ msgstr "HTTPS"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Manually restart webUI to apply changes."
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Key not found at '%s'"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Certificate not found at '%s'"
+
+#~ msgid "Show trackers"
+#~ msgstr "Show trackers"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Show keyword search"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Show zero hits"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Show sidebar"
+
+#~ msgid "Sidebar"
+#~ msgstr "Sidebar"
+
+#~ msgid "Admin"
+#~ msgstr "Admin"
+
+#~ msgid "Active time"
+#~ msgstr "Active time"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... and delete .torrent file"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... and delete downloaded files"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... and delete all files"
+
+#~ msgid "Cancel"
+#~ msgstr "Cancel"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Connect to daemon"
+
+#~ msgid "Connected to"
+#~ msgstr "Connected to"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Connection Limit"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "D/L Speed Limit"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : Torrent List"
+
+#~ msgid "Disk Space"
+#~ msgstr "Disk Space"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge Login"
+
+#~ msgid "From Url"
+#~ msgstr "From URL"
+
+#~ msgid "Do not download"
+#~ msgstr "Do not download"
+
+#~ msgid "High priority"
+#~ msgstr "High priority"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Force Recheck"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Filter on a keyword"
+
+#~ msgid "False"
+#~ msgstr "False"
+
+#~ msgid "Keyword"
+#~ msgstr "Keyword"
+
+#~ msgid "Highest priority"
+#~ msgstr "Highest priority"
+
+#~ msgid "Ok"
+#~ msgstr "OK"
+
+#~ msgid "Normal priority"
+#~ msgstr "Normal priority"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Not connected to a daemon"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "No Incoming Connections"
+
+#~ msgid "Move torrent"
+#~ msgstr "Move torrent"
+
+#~ msgid "Label torrent"
+#~ msgstr "Label torrent"
+
+#~ msgid "Search"
+#~ msgstr "Search"
+
+#~ msgid "Restart"
+#~ msgstr "Restart"
+
+#~ msgid "Seeding time"
+#~ msgstr "Seeding time"
+
+#~ msgid "Seed rank"
+#~ msgstr "Seed rank"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "U/L Speed Limit"
+
+#~ msgid "True"
+#~ msgstr "True"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Upload Slot Limit"
+
+#~ msgid "Update"
+#~ msgstr "Update"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP w/ auth."
+
+#~ msgid "Test config value"
+#~ msgstr "Test config value"
+
+#~ msgid "Stats"
+#~ msgstr "Stats"
+
+#~ msgid "All Finished!"
+#~ msgstr "All Finished!"
+
+#~ msgid "Force Download"
+#~ msgstr "Force Download"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Deluge Setup Wizard"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr "This wizard will help you set up Deluge to your liking."
+
+#~ msgid "Graphs"
+#~ msgstr "Graphs"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Seeds/Peers"
+
+#~ msgid "Test config value:"
+#~ msgstr "Test config value:"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s is not a valid URL."
+
+#~ msgid "Downloading.."
+#~ msgstr "Downloading.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Failed to download : %s"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Enter your password to continue</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge is password protected!</big></b>"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
diff --git a/deluge/i18n/en_GB.po b/deluge/i18n/en_GB.po
new file mode 100644
index 0000000..2a2d3f3
--- /dev/null
+++ b/deluge/i18n/en_GB.po
@@ -0,0 +1,6185 @@
+# English (United Kingdom) translation for deluge
+# Copyright (c) 2018 Rosetta Contributors and Canonical Ltd 2018
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2018-10-27 13:12+0000\n"
+"Last-Translator: Stephan Woidowski <swoidowski@t-online.de>\n"
+"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr "B"
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr "KiB"
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr "MiB"
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr "GiB"
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr "TiB"
+
+#: deluge/common.py:410
+msgid "K"
+msgstr "K"
+
+#: deluge/common.py:411
+msgid "M"
+msgstr "M"
+
+#: deluge/common.py:412
+msgid "G"
+msgstr "G"
+
+#: deluge/common.py:413
+msgid "T"
+msgstr "T"
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr "K/s"
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr "M/s"
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr "MiB/s"
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr "G/s"
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr "GiB/s"
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr "T/s"
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr "TiB/s"
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr "Daemon Options"
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr "IP address to listen for UI connections"
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr "Port to listen for UI connections on"
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr "IP address to listen for BitTorrent connections"
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr "Config keys to be unmodified by `set_config` RPC"
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr "Active"
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr "Error"
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr "Owner"
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr "Username:"
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr "Password:"
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr "Enabled"
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr "Copy of .torrent files to:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr "Delete copy of torrent file on remove"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr "From:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr "Hostname:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr "Settings"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr "<b>General</b>"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr "Stop seed at ratio:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr "Remove at ratio"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr ""
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr "The IP address \"%s\" is badly formed"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP list (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Text (Zipped)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Text (Uncompressed)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr "Blocked IP Ranges /Whitelisted IP Ranges"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr "Blocklist"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr "Bad IP address"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr "Invalid leader"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr "Invalid magic code"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr "Invalid version"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr "Days"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr "Check for new list every:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr "Import blocklist on startup"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr "<b>Settings</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Download the blocklist file if necessary and import the file."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr "Check Download and Import"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr "Download a new blocklist file and import it."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr "Force Download and Import"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr "Blocklist is up to date"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr "<b>Options</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr "Type:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr "Date:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr "File Size:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr "<b>Info</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr "<b>Whitelist</b>"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr "Incompatible Option"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr "AutoAdd"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr "Double-click to toggle"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr "Double-click to edit"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr "Path"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr "Watch folder does not exist."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr "Path does not exist."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr "Watch Folder Properties"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr "Select A Folder"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr "Enable this watch folder"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr "<b>Watch Folder</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr "Delete .torrent after adding"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr "Append extension after adding:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ".added"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr "<b>Torrent File Action</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr "Set download folder"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr "This folder will be where the torrent data is downloaded to."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr "<b>Download Folder</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr "Set move completed folder"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr "<b>Move Completed</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr "Label: "
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr "<b>Label</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr "Main"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr "The user selected here will be the owner of the torrent."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr "<b>Owner</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr "Max Upload Speed:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr "Max Connections:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr "Max Upload Slots:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr "Max Download Speed:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Bandwidth</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr "Auto Managed:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr "WebUi"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr "Enable web interface"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr "Enable SSL"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr "Listening port:"
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr "Notification Blink shown"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr "Popup notification is not enabled."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr "Notification popup shown"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr "Sound notification not enabled"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr "pygame is not installed"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr "Sound notification failed %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr "Sound notification Success"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr "Finished Torrent"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr "Notifications"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr "Choose Sound File"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr "There was an error sending the notification email: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr "Server did not reply properly to HELO greeting: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr "Server refused username/password combination: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr "Notification email sent."
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr "Finished Torrent \"%(name)s\""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr "Tray icon blinks enabled"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr "Popups enabled"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr "Sound enabled"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr "<b>Recipients</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr "Server requires TLS/SSL"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr "<b>Email Notifications</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr "Sound Customization"
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr "Extractor"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr "Extract to:"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr "Create torrent name sub-folder"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
+
+#~ msgid "pynotify is not installed"
+#~ msgstr "pynotify is not installed"
+
+#~ msgid "pynotify failed to show notification"
+#~ msgstr "pynotify failed to show notification"
+
+#~ msgid "<b><i><big>Notifications</big></i></b>"
+#~ msgstr "<b><i><big>Notifications</big></i></b>"
diff --git a/deluge/i18n/eo.po b/deluge/i18n/eo.po
new file mode 100644
index 0000000..53f31f9
--- /dev/null
+++ b/deluge/i18n/eo.po
@@ -0,0 +1,3741 @@
+# Esperanto translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2011-04-25 13:24+0000\n"
+"Last-Translator: Kristjan SCHMIDT <Unknown>\n"
+"Language-Team: Esperanto <eo@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "AlÅutrapido"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "ElÅutrapido"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "De:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Elekti dosierujon"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Mark-agordoj"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Mark-agordoj</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Konektoj:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maksimume"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Atendovico"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Situo"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Aldoni etikedon"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Aldoni etikedon</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Nomo:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Etikedoj</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Äœenerale</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Agordoj</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "Adreso (URL):"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Tagoj"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Opcioj</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Dato:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Dosiergrando:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "ElÅutrapido"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "AlÅutrapido"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Malsupren"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Supren"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "ElÅutoj"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Reto"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Kromprogramoj"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Grando"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Fontoj"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Samtavolanoj"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Dosiero"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Aldoni torenton"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Redakti"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torento"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Vidi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Ilobreto"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Kolumnoj"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Helpo"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Aldoni torenton"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Forigi torenton"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "PaÅ­zigi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Reaktivigi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Supren en la atendovico"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Malsupren en la atendovico"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Agordoj"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Servila stato:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Havebleco:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Samtavolanoj:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Fontoj:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Pecoj:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Restanta tempo:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Sekva konekto:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>AlÅutite:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>ElÅutite:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>Dosiernombro:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Kunordiga servilo:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Nomo:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Vojo:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Stato:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Detaloj"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torentoj</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Spacokupado</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Uzu plenan spacdisponigon"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Kun plena disponigo ĉiom el la bezonata spaco por torento antaÅ­okupiÄas "
+"dekomence por eviti diskfragmentiÄon"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Uzu kompaktan spacdisponigon"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Kun kompakta disponigo la diskospaco nur okupiÄas laÅ­bezone"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Provu elÅuti la unuan kaj lastan pecojn unue"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Diluvo aŭtomate elektos malsaman porton ĉiufoje."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Aktiva pordo:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Al:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Provi aktivan pordon"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Konektado de samtavolanoj"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Nivelo:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Ĉifrado</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Fontsendas</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "Remove"
+#~ msgstr "Forigi"
+
+#~ msgid "Clear"
+#~ msgstr "ViÅi"
+
+#~ msgid "Add"
+#~ msgstr "Aldoni"
+
+#~ msgid "Availability"
+#~ msgstr "Disponebleco"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Rapido:</b>"
+
+#~ msgid "Details"
+#~ msgstr "Detaloj"
+
+#~ msgid "Select All"
+#~ msgstr "Elekti ĉiujn"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "ForviÅi .torrent-dosieron"
+
+#~ msgid "0000"
+#~ msgstr "0000"
diff --git a/deluge/i18n/es.po b/deluge/i18n/es.po
new file mode 100644
index 0000000..5cda5ba
--- /dev/null
+++ b/deluge/i18n/es.po
@@ -0,0 +1,6315 @@
+# Spanish translation for deluge
+# Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2019-03-18 23:01+0000\n"
+"Last-Translator: Pabla <Unknown>\n"
+"Language-Team: Spanish <es@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr "B"
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr "KiB"
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr "MiB"
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr "GiB"
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr "TiB"
+
+#: deluge/common.py:410
+msgid "K"
+msgstr "k"
+
+#: deluge/common.py:411
+msgid "M"
+msgstr "M"
+
+#: deluge/common.py:412
+msgid "G"
+msgstr "G"
+
+#: deluge/common.py:413
+msgid "T"
+msgstr "T"
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr "K/s"
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr "M/s"
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr "MiB/s"
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr "G/s"
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr "GiB/s"
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr "T/s"
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr "TiB/s"
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr "Opciones comunes"
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr "Dirección IP que supervisar en busca de conexiones de IU"
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr "Puerto que supervisar en busca de conexiones de IU"
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr "Dirección IP que supervisar en busca de conexiones BitTorrent"
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr "Error"
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr "Propietario"
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr "Interfaz"
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr "Descargas"
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr "Red"
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr "Antememoria"
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr "Complementos"
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr "Normal"
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr "Afganistán"
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr "Albania"
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr "Argelia"
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr "Antártida"
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr "Antigua y Barbuda"
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr "Argentina"
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr "Armenia"
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr "Australia"
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr "Austria"
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr "Azerbaiyán"
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr "Bahamas"
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr "Baréin"
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr "Bangladés"
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr "Bielorrusia"
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr "Bélgica"
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr "Belice"
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr "Benín"
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr "Bermudas"
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr "Bután"
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr "Bolivia"
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnia y Herzegovina"
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr "Botsuana"
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr "Brasil"
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr "Territorio Británico del Océano Ãndico"
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr "Brunéi"
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr "Bulgaria"
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr "Camboya"
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr "Camerún"
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr "Canadá"
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr "Cabo Verde"
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr "Islas Caimán"
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr "Chad"
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr "Chile"
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr "China"
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr "Colombia"
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr "Congo"
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr "Congo, República Democrática del"
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr "Islas Cook"
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr "Costa de Marfil"
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr "Croacia"
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr "Cuba"
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr "Chipre"
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr "Chequia"
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr "Dinamarca"
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr "Yibuti"
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr "República Dominicana"
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr "Ecuador"
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr "Egipto"
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr "Guinea Ecuatorial"
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr "Estonia"
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr "Etiopía"
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr "Islas Malvinas (Falkland)"
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr "Fiyi"
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr "Finlandia"
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr "Francia"
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr "Guayana Francesa"
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr "Polinesia francesa"
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr "Territorios franceses del sur"
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr "Gabón"
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr "Georgia"
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr "Alemania"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Grecia"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Groenlandia"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Guinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Guinea-Bisáu"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guyana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haití"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Santa Sede (Ciudad del Vaticano)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Hungría"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Islandia"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "India"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonesia"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Irán, República Islámica de"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Irak"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Irlanda"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Isla de Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Israel"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italia"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaica"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japón"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordania"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazajistán"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenia"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Corea, República Democrática Popular de"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Corea, República de"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuwait"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kirguistán"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Laos, República Democrática Popular de"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Letonia"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Líbano"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesoto"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberia"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Lituania"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luxemburgo"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Macedonia, Antigua República Yugoslava de"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagascar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malaui"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malasia"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldivas"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Malí"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinica"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauritania"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauricio"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "México"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Micronesia, Estados Federados de"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldavia"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Mónaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolia"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Montenegro"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Marruecos"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambique"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Birmania"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Naurú"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Países Bajos"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Nueva Caledonia"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Nueva Zelanda"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Níger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niué"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Islas Marianas del Norte"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Noruega"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Omán"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistán"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Paláu"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palestina, Territorio ocupado de"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panamá"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papúa Nueva Guinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguay"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Perú"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filipinas"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Polonia"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugal"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Catar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reunión"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Rumania"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Federación Rusa"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Ruanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "San Bartolomé"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Santa Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "San Cristóbal y Nieves"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Santa Lucía"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "San Martín"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "San Pedro y Miquelón"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "San Vicente y las Granadinas"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Santo Tomé y Príncipe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Arabia Saudita"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbia"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leona"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapur"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Eslovaquia"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Eslovenia"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Sudáfrica"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "España"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudán"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Surinam"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Suazilandia"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Suecia"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Suiza"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr "Taiwán"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tayikistán"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzania, República Unificada de"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr "Nombre de usuario:"
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr "Activado"
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr "Sin etiqueta"
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr "Ventana principal"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr "Indicador de aplicación"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr "Conexiones:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr "Velocidad de descarga:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr "Velocidad de carga:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr "Desde:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr "Puerto:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr "Configuración"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr "Conexiones"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr "<b>General</b>"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr "_Ir al sitio web"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr "Versión disponible:"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr "Versión del servidor"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr "Versión actual:"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr "Nombre:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr "Opciones"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr "Guardar .torrent como"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr "etiqueta"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr "Orden"
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr "Carpetas"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr "La dirección IP «%s» tiene un formato incorrecto"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr "Lista de bloqueos"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr "Líder no válido"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr "Código mágico no válido"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr "Versión no válida"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr "Días"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr "Comprobar listas nuevas cada:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr "Importar lista de bloqueos al iniciar"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr "<b>Configuración</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+"Descargar el archivo de lista de bloqueos si es necesario e importar el "
+"archivo."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr "Forzar descarga e importación"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr "La lista de bloqueos está actualizada"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr "<b>Opciones</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr "Tipo:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr "Fecha:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr "Tamaño del archivo:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr "<b>Información</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr "<b>Lista blanca</b>"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr "Torrent completo"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr "Torrent añadido"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr "Ejecutar"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr "Suceso"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr "<b>Añadir orden</b>"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr "<b>Órdenes</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr "Opción incompatible"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr "Ruta"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr "La ruta no existe."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+"Si un archivo .torrent se añade a este directorio,\n"
+"se añadirá a la sesión."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr "Seleccionar una carpeta"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+"Una vez que se añada el torrent a la sesión,\n"
+"se eliminará el archivo .torrent."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr "Establecer carpeta de descargas"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr "En esta carpeta se descargarán los datos del torrent."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr "<b>Carpeta de descargas</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr "Etiqueta: "
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr "<b>Etiqueta</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr "Principal"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr "<b>Propietario</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr "Conexiones máximas:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr "<b>Cola</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr "minutos"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr "1 minuto"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr "1 segundo"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr "segundos"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr "Estadísticas"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr "Resolución"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr "Color de descarga:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr "Color de carga:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr "<b>Gráfico de conexiones</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr "Nodos DHT:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr "Nodos DHT en antememoria:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr "Torrents DHT:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr "<b>Colores de gráfico</b>"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+"No se ha instalado la interfaz web de Deluge.\n"
+"Instálela y vuelva a intentar la acción."
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr "Activar interfaz web"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr "Activar SSL"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr "Puerto que supervisar:"
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr "Etiqueta vacía"
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr "La etiqueta ya existe"
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr "Etiqueta desconocida"
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr "Torrent desconocido"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr "_Opciones de etiqueta"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr "Quita_r etiqueta"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr "_Añadir etiqueta"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr "Etiqueta"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr "Máximo"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr "Aplicar automáticamente la etiqueta:"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr "Añadir etiqueta"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr "<b>Añadir etiqueta</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr "<b>Etiquetas</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr "pygame no está instalado"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr "Torrent finalizado"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+"Ha terminado la descarga del torrent «%(name)s», con %(num_files)i archivos."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr "Notificaciones"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr "Seleccione un archivo de sonido"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr "El servidor no respondió correctamente al saludo HELO: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr "El servidor rechazó la combinación usuario/contraseña: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr "Se ha enviado una notificación por correo."
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+"Este mensaje es para informarle que Deluge ha terminado de descargar "
+"«%(name)s», que incluye %(num_files)i archivos.\n"
+"Para dejar de recibir estas alertas, basta con desactivarlas en las "
+"preferencias de Deluge.\n"
+"\n"
+"Atentamente,\n"
+"Deluge."
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr "Ventanas emergentes activadas"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr "Sonido activado"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr "<b>Notificaciones de IU</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr "<b>Destinatarios</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr "El servidor requiere TLS/SSL"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr "<b>Notificaciones por correo</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr "Suscripciones"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr "Personalización de sonido"
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr "Extractor"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr "Extraer en:"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr "Crear subcarpeta con el nombre del torrent"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Esta opción creará una subcarpeta con el nombre del torrent dentro de la "
+"carpeta de extracción seleccionada y pondrá los archivos extraídos allí."
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr "Planificador"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr "Límite de descarga:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr "Límite de carga:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr "Torrents activos:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr "Descargas activas:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr "URL"
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr "Archivo"
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr "Se está cargando el torrent…"
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr "El torrent no es válido"
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr "Descargar"
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr "Tiempo estimado:"
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
+
+#~ msgid "pynotify is not installed"
+#~ msgstr "pynotify no está instalado"
+
+#~ msgid "pynotify failed to show notification"
+#~ msgstr "pynotify no pudo mostrar la notificación"
+
+#~ msgid "<b><i><big>Notifications</big></i></b>"
+#~ msgstr "<b><i><big>Notificaciones</big></i></b>"
+
+#~ msgid "Belarusian"
+#~ msgstr "Bielorruso"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosnio"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Búlgaro"
+
+#~ msgid "Breton"
+#~ msgstr "Bretón"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengalí"
+
+#~ msgid "Afrikaans"
+#~ msgstr "Afrikáans"
+
+#~ msgid "Arabic"
+#~ msgstr "Ãrabe"
+
+#~ msgid "Asturian"
+#~ msgstr "Asturiano"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Azerí"
+
+#~ msgid "German"
+#~ msgstr "Alemán"
+
+#~ msgid "Danish"
+#~ msgstr "Danés"
+
+#~ msgid "Catalan"
+#~ msgstr "Catalán"
+
+#~ msgid "Czech"
+#~ msgstr "Checo"
+
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Inglés (Reino Unido)"
+
+#~ msgid "English (Australia)"
+#~ msgstr "Inglés (Australia)"
+
+#~ msgid "English (Canada)"
+#~ msgstr "Inglés (Canadá)"
+
+#~ msgid "Greek"
+#~ msgstr "Griego"
+
+#~ msgid "English"
+#~ msgstr "Inglés"
+
+#~ msgid "Spanish"
+#~ msgstr "Español"
+
+#~ msgid "Finnish"
+#~ msgstr "Finés"
+
+#~ msgid "Persian"
+#~ msgstr "Persa"
+
+#~ msgid "Basque"
+#~ msgstr "Euskera"
+
+#~ msgid "Estonian"
+#~ msgstr "Estonio"
+
+#~ msgid "Esperanto"
+#~ msgstr "Esperanto"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hebreo"
+
+#~ msgid "Frisian"
+#~ msgstr "Frisón"
+
+#~ msgid "French"
+#~ msgstr "Francés"
+
+#~ msgid "Galician"
+#~ msgstr "Gallego"
+
+#~ msgid "Croatian"
+#~ msgstr "Croata"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonesio"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindi"
+
+#~ msgid "Hungarian"
+#~ msgstr "Húngaro"
+
+#~ msgid "Japanese"
+#~ msgstr "Japonés"
+
+#~ msgid "Khmer"
+#~ msgstr "Camboyano"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kazajo"
+
+#~ msgid "Korean"
+#~ msgstr "Coreano"
+
+#~ msgid "Kannada"
+#~ msgstr "Canarés"
+
+#~ msgid "Icelandic"
+#~ msgstr "Islandés"
+
+#~ msgid "Italian"
+#~ msgstr "Italiano"
+
+#~ msgid "Georgian"
+#~ msgstr "Georgiano"
+
+#~ msgid "Ignore"
+#~ msgstr "Ignorar"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugués"
+
+#~ msgid "Piedmontese"
+#~ msgstr "Piamontés"
+
+#~ msgid "Polish"
+#~ msgstr "Polaco"
+
+#~ msgid "Punjabi"
+#~ msgstr "Panyabí"
+
+#~ msgid "Dutch"
+#~ msgstr "Neerlandés"
+
+#~ msgid "Ossetic"
+#~ msgstr "Osetio"
diff --git a/deluge/i18n/et.po b/deluge/i18n/et.po
new file mode 100644
index 0000000..a6142e4
--- /dev/null
+++ b/deluge/i18n/et.po
@@ -0,0 +1,4708 @@
+# Estonian translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2009-11-18 08:22+0000\n"
+"Last-Translator: René Pärts <Unknown>\n"
+"Language-Team: Estonian <et@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Hostinimi:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Kasutajanimi:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Parool:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Alates:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Lubatud"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Seaded"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Vali kaust"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Allalaadimise koht</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Maksimaalne üleslaadimise kiirus:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Maks. ühendusi:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Maksimum üleslaeadimis slotid:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Maksimaalne laadimis kiirus:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Ãœlekandekiirus</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Peata jagmine alates suhtest:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Eemalda suhtega"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Ãœles"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Alla"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Järjekord</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Eelistused"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Allalaadimise limiit"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Ãœleslaadimis limiit:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Aktiivsed torrentid:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Aeglustamise seaded</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Vigane silt, kehtivad märgid:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Tühi silt"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Silt juba olemas"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Tundmatu silt"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Tundmatu torrent"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Silt"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "_Sildi valikud"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_Eemalda silt"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "Lis_a silt"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Siltide valikud"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Siltide valikud</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Ãœleslaadimise pesad:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Kiirus Ãœles:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Kiirus Alla:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Ãœhendused:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Rakenda igale torrendile maksimum sätted:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maksimaalne"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Automaatselt hallatud"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Nõustu Järjekorra sätetega"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Järjekord"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Liiguta lõpetatud torrentid kausta:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Rakenda asukoha seadistus:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Asukoht"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(iga jälgija eraldi real)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Automaatselt rakenda märgis:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Jälgijad"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Lisa silt"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Lisa silt</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Nimi:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Siltide lisamiseks, muutmiseks ja eemaldamiseks kasuta külgriba</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Sildid</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Paki lahti:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Loo torrendi nimeline alamkataloog"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"See seadistus loob alamkataloogi torrendi nimega valitud kataloogi ja paneb "
+"lahtipakitavad failid sinna."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Ãœldine</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Luba veebiliides"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Luba SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Jälgitav port:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Sätted</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP nimekiri (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Tekst (Zip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Tekst (Kokkupakkimata)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Vigane liider"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Kehtetu võlukood"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Versiooni viga"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Blokknimekiri"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Päevad"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Nimekirja uuendamise intervall:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Nimekiri imporditakse käivitamisel"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Lae must nimekiri, kui vaja, ja impordi see."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Kontrolli ja impordi"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Lae uus must nimekiri ja impordi see."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Lae uus ja impordi"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Must nimekiri on värske"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Valikud</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Tüüp:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Kuupäev:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Faili suurus:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Info</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torrent lõpetatud"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torrent lisatud"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Käivita"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Sündmus"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Käsk"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Lisa käsk</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Käsud</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Teadaanne korras"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Teadanne saadetud"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Hoiatus"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Viga"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Afganistan"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Alandi saared"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Albaania"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Alžeeria"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Ameerika Samoa"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antarktika"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antigua ja Barbuda"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Argentiina"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Armeenia"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "Austraalia"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Austria"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Aserbaidžaan"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Bahama"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bahrein"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Bangladesh"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Valgevene"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Belgia"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermuda"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Boliivia"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnia ja Hertsegovina"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Bouvet' saar"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brasiilia"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Briti India ookeani ala"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Brunei"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Bulgaaria"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Kambodža"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Kamerun"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Kanada"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Roheneemesaared"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Kaimanisaared"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Kesk-Aafrika Vabariik"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "TÅ¡aad"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "TÅ¡iili"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Hiina"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Jõulusaar"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Kookossaared"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Kolumbia"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Komoorid"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Kongo"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Kongo DV"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Cooki saared"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Elevandiluurannik"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "Horvaatia"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Kuuba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Küpros"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "TÅ¡ehhi Vabariik"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Taani"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Djibouti"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominica"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Dominikaani Vabariik"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Ekuador"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Egiptus"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Ekvatoriaal-Guinea"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Eesti"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Etioopia"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falklandi saared (Malviinid)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Fääri saared"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fidži"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Soome"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Prantsusmaa"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "Prantsuse Guajaana"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "Prantsuse Polüneesia"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "Prantsuse Lõunaalad"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Gruusia"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "Saksamaa"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Suurbritannia"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Kreeka"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Gröönimaa"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadeloupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Guinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Guinea-Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guyana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Heard'i ja McDonald'i saared"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Püha Tool (Vatikan)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hongkong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Ungari"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Island"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "India"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indoneesia"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Iraan"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Iraak"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Iirimaa"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Mani saar"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Iisrael"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Itaalia"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaica"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Jaapan"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordaania"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kasahstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenya"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Põhja-Korea"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Lõuna-Korea (Korea Vabariik)"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuveit"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kõrgõzstan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Laos"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Läti"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Liibanon"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Libeeria"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Liibüa"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Leedu"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luksemburg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macau"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Makedoonia"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagaskar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malaisia"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldiivid"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Marshalli saared"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinique"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauritaania"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Mehhiko"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Mikroneesia Liiduriigid"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldova"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongoolia"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Montenegro"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Maroko"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mosambiik"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Birma"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namiibia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Holland"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Hollandi Antillid"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Uus-Kaledoonia"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Uus-Meremaa"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigeeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Norfolki saar"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Põhja-Mariaani saared"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norra"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Omaan"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Belau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palestiina okupeeritud ala"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Paapua Uus-Guinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguay"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peruu"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filipiinid"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Poola"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugal"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Katar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Réunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Rumeenia"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Venemaa"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Rwanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Saint Barthelemy"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Saint Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Saint Kitts ja Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Saint Lucia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Saint-Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint Pierre ja Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Saint Vincent ja Grenadiinid"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "São Tomé ja Príncipe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Saudi Araabia"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbia"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seišellid"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapur"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slovakkia"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Sloveenia"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Saalomoni saared"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somaalia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Lõuna-Aafrika Vabariik"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Lõuna-Georgia ja Lõuna-Sandwichi saared"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Hispaania"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudaan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Suriname"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard ja Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Svaasimaa"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Rootsi"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Å veits"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Süüria"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Taiwan"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tadžikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tansaania Ãœhendvabariik"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Tai"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Ida-Timor"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad ja Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tuneesia"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Türgi"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Türkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Turks ja Caicos"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukraina"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Araabia Ãœhendemiraadid"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Ameerika Ãœhendriigid"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Ãœhendriikide hajasaared"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Uruguai"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Usbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Briti Neitsisaared"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "USA Neitsisaared"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis ja Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Lääne-Sahara"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Jeemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Sambia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabwe"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Võrguühenduseta"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Võrgus"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Ãœhendatud"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Deemonit ei eksisteeri"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Deemon ei tööta"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Serveri käivitamine PID-is"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Aadress"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Klient"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Progress"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Alla kiirus"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Ãœles kiirus"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " torrentit järjekorras"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " torrent järjekorras"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Piiramatu"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Aktiveeritud"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Muu..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Alla:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Ãœles:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Alla"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Ãœles"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Maksimaalne allalaadimiskiirus"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Maksimaalne üleslaadimiskiirus"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torrent valmis"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Deluge on lõpetanud %(name)s allalaadimise, mis kaasab %(num_files)i faili.\n"
+"Nende teadete keelamiseks lülita välja e-posti teavitus Deluge "
+"eelistustest.\n"
+"\n"
+"Aitäh,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Allalaadimised"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Võrk"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Ãœlekandekiirus"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Liides"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Muu"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Deemon"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Proksi"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Puhver"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Pluginad"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Plugin"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Vali plugin"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Eggs lisandprogramm"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Failinimi"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Suurus"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Vigane fail"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Duplikaat torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Sama torrentit ei saa lisada topelt."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Faili tähtsuse määramine ebaõnnestus!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Vali .torrent fail"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Torrent failid"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Kõik failid"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Vigane URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Allalaadimine ebaõnnestus"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Järk"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Jälgija"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Vali fail"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Kataloogi valimine"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Salvesta .torrent fail"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Pole ühendatud"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Ãœhendusi"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Allalaadimis kiirus"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Ãœleslaadimis kiirus"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Protokolli liiklus alla- ja üleslaadimisel"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT sõlmed"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Sissetulevaid ühendusi pole!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Maksimaalne ühenduste arv"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrentid"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Pealdised"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Kõik"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Allalaadimine"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Jagamine"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Pausitud"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Kontrollin"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "Järjekorras"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Pole"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Sildita"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Host"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Viga hosti lisamisel"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Väljuda klassikalisest režiimist?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Paistab, et Deluge deemon (deluged) on juba käivitatud.\n"
+"\n"
+"Jätkamiseks pead kas peatama deemoni või väljuma klassikalisest režiimist."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Viga tuuma käivitamisel"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"Tekkis viga tuuma komponendi käivitamisel, mis on vajalik Deluge "
+"kasutamiseks klassikalises režiimis.\n"
+"\n"
+"Rohkema informatsiooni saamiseks loe edasi alt."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Viga klassikalise režiimi käivitamisel. Kas lülitada välja, et jätkata?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Viga deemoni käivitamisel"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"Viga deemoni käivitamisel. proovige käivitada konsoolist et näha viga."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Sees"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Väljas"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Piiramatu"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Vali kaust, kuhu failid liigutada"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Maksimaalselt üleslaadimispesasid"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Tähtus"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Detailid:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Nimi"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Alla laetud"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Ãœles laetud"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Levitajad"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Masinad"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "EETA"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Suhe"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Saadavus"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Lisatud"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Fail"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Lisa torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Loo torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Redigeerimine"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Ãœhenduse haldur"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Vaade"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Tööriistariba"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Külgriba"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Olekuri_ba"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "T_abid"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Veerud"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "_Külgriba"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Näita _null-staatuseid"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Näi_ta jälgijaid"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Abi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Korduma Kippuvad Küsimused"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Lisa torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Lisa torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Eemalda torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Eemalda torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Peata valitud torrentid"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Peata"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Jätka valitud torrenteid"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Jätka"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Järjekorrasta torrent üles"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Liiguta üles"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Järjekorrasta torrent alla"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Liiguta alla"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Eelistused"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Ãœhenduse haldur"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Laienda kõik"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Ära lae"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Normaalne tähtsus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Kõrge tähtsus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Kõr_geim tähtsus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Automaathaldus:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Levitamise järk:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Levitamise aeg:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Aktiivne aeg:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Jälgija olek:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Saadavus:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Kasutajad:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Jagajad:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Tükid:</b>"
+
+# Arvatav Saabumise Aeg
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>ETA:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Järgmine Teadeanne:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Jagamissuhe:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Ãœleslaetud:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Allalaaditud:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Lisamise kuupäev:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Olek"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Kommentaarid:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># faili:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Jälgija:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Kogusuurus:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Nimi:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Asukoht:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Olek:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Detailid"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Failid"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Masinad"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Liiguta lõpetatud:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Privaatne"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Tähtsusta esimene/viimane"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_Muuda jälgijaid"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Valikud"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Eemalda torrent?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>Oled kinnel et soovid eemaltada valitud torrenti?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>Seotud .torrent fail kustutatakse!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Allalaetud andmed kustutatakse!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Eemalda valitud torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Uus väljalase"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Uus väljalase saadaval!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Saadaolev versioon:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Praegune versioon:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Ära näitta tulevikus seda dialoogi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Mine veebilehele"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Lisa masin IP järgi"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Vali kõik"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Peata kõik"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Jätka valitud torrenteid."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Jätka kõiki"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Lisa torrenteid"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_Eemalda"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrentid</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Fai_lid"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Täielik"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Kompaktne"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Jaotus</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Maks. alla kiirus:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Maks. üles kiirus:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Lisa _peatatuna"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Esimesed/viimased pakid eelisõigusega"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Taasta vaikeväärtused"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Rakenda kõigile"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Lisa URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>URL-ilt</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Lisa Infohash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Alates Infohash</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Jälgijad:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Torrenti loomine"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Torrenti loomine</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Kaus_t"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "Võ_rguasukoht"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Failid</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Autor:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Kommentaarid:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Info"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Veebilevitused"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Tüki suurus:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Aseta privaatne lipp"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Torrent lisatakse sessiooni"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Sisesta võrguasukoht"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Võrguasukoht</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Asukoht:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Torrenti loomine"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Salvesta torrent kohas"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Salvesta .torrent fal</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Järjekorras torrentid"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Lisa järjekorras torrentid</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Ãœhendamisel lisatakse torrentid automaatselt"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "sedel"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Lisa masin"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Masina lisamine</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "masinanimi:port"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Lisa server"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Ãœhenduse haldur</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Käivita kohalik deemon"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Valitud masin käivitatakse automaatselt"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Vajadusel käivitatakse localhost automaatselt"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Käivitamisel seda dialoogi ei näidata"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Allalaadimised</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Automaatselt lisa torrente:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Allalaadimise asukoht:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ".torrent failid kopeeritakse:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Kaustad</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Kasuta täielikku jaotamist"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Täielik eraldamine eraldab kogu torrentile vajaminema kettaruumi ja väldib "
+"ketta fragmendistumist"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Kasuta kompaktset jaotust"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Kompaktne jaotamine jaotab ainult vajamineva ruumi"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Torrenti esimesed ja viimased tükid eelisõigusega"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Prioritiseeri torrenti esimeste ja viimaste failide tükid"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Lisa torrentid peatatuna"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Võrk</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Juhuslikud pordid"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge valib igakord automaatselt erineva pordi, mida kasutada."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Aktiivne port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Kuni:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Testi aktiivset porti"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Sisenevad pordid</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Väljuvad pordid</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Sisesta kasutajaliidese IP sissetulevate bittorrenti ühenduste jälgimiseks. "
+"Vaikeväärtuse kasutamiseks jäta tühjaks."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>Kasutajaliides</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"IP päises oleva TOS-baidi saatmine masinatele (k.a veebilevitamises). Eeldab "
+"heksakoodi."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Masina TOS-bait:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universaalne isehäälestumine"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT pordi vastendus protokoll"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Lähtemasina vahetus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery otsib masinaid kohalikust võrgust."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Hajusräsitabel võib parandada aktiivsete ühenduste arvu."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Võrgu lisad</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Sisenev:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Tase:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Sunnitud\n"
+"Lubatud\n"
+"Keelatud"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Käepigistus\n"
+"Täis vool\n"
+"Mitte kumbgi"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Väljuv:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Krüpteeri kogu voog"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Krüptimine</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Ãœlekandekiirus</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Maksimaalne ühenduste arv sekundis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Maksimaalselt pool-avatud ühendusi:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Maksimaalne üleslaadimiskiirus kõigile torrentitele. Määra -1 piiramatu "
+"puhul."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Maksimaalne üleslaadimise kiirus (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "Maksimaalselt lubatud ühenduste arv. Määra -1 piiramatu puhul."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Maksimaalselt ühendusi:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Maksimaalselt üleslaadimise pesi kõigile torrentitele. Määra -1 piiramatu "
+"puhul."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Maksimaalne üleslaadimiste pesad:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Maksimaalne allalaadimiskiirus kõigile torrentitele. Määra -1 piiramatu "
+"puhul."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Maksimaalne allalaadimis kiirus (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Piirangute eiramine kohtvõrgus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Kui see on lubatud, ligikaudne TCP / IP üldkulu lubatud kiiruse piirajaid, "
+"et vältida koguliikluse ületamist"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Üldine ülekandekiirus</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"Maksimaalselt üleslaadimiste pesi igale torrenti kohta. PiiramMäära -1 "
+"piiramatu puhul."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"Maksimaalne ühenduste arv iga torrenti kohta. Määra -1 piiramatu puhul."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Ãœlekandekiirus iga torrenti kohta</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Kasutajaliides</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Luba"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Klassikaline režiim peidab enamuse deemoni funktsionaalsusest ja muudab "
+"Deluge näiliselt terviklikuks rakenduseks. Kasuta, kui ei soovi käivitada "
+"Deluget deemonina. Rakendamiseks on vajalik Deluge taaskäivitus."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Klassikaline režiim</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Näita sesiooni kiirust tiitelribal"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Minu aken</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Näita alati"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Dialoog tuuakse esile"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Torrenti lisamise dialoog</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Luba süsteemse salve ikoon"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Sulgemisel minimeeri salve"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Alusta salves"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Parooliga kaitstud süsteemisalv"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "Süsteemisalv"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Teised</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Ole teavitatud uutest väljalasetet"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge kontrollib meie servereid ja ütled sulle kui uuem versioon on lastud "
+"välja"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Uuendused</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Aita kaasa Deluge täiustamisele ja saada oma Pythoni ja PyGTK versioonid "
+"ning operatsioonisüsteemi ja protsessori tüübid. Absoluutselt muud "
+"informatsiooni ei saadeta."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Jah, palun saada anonüümne statistika"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Süsteemi Informatsioon</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Asukoht:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Kui asukohta Deluge andmebaasist ei leita, kasutatakse masina riigi "
+"määramiseks DNS-i."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP andmebaas</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Assotsieeritud magnet lingid Deluge-ga"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Deemon</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Deemoni port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Port</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Kaugühendused lubatud"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Ãœhendus</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Veebilehelt kontrollitakse perioodiliselt uusi väljalaskeid"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Teised</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Järjekord</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Uued torrentid sorteeritakse üles"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Aktiivseid allalaadimisi:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Aktiivseid kokku"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Aktiivsete allalaadimiste koguarv:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Aeglasi torrenteid ei loeta"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Aktiivsed torrendid</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Jagamissuhte limiit:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Levitamisaja suhe:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Levitamise aeg (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Levitamine lõpetatakse suhte ületamisel:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Suhte ületamisel torrent eemaldatakse"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Ãœleslaadimised</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Proksi</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Host:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Pole\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Masin</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Veebilevitus</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Jälgija</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Puhver</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Puhvri suurus (16 KiB blokid):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Puhvri aegumine (sekundit):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr "16 kB blokkide koguarv, kettale salvestamise algusest"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Blokke kirjutatud:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr "Kirjutamiste arv kokku alates sessiooni algusest."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Kirjutamisi:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Kirjuta</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Bittorrenti mootori (masinate) poolt küsitud blokkide arv, mis serveeriti "
+"kettalt või puhvrist."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Blokke loetud:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "Puhvrist serveeritud blokkide arv."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr "Lugemiste arv kokku alates sessiooni algusest."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Lugemisi:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Loe</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"16 KiB blokkide hetkearv puhvris. Kaasab mõlemaid, lugemise ja kirjutamise "
+"puhvreid."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Puhvri suurus:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Loetud puhvri suurus:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Suurus</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Staatus</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Lisand programmid</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Versioon:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Koduleht:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Autori e-post:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Paigalda plugin"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Uuri pluginaid uuesti"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_Otsi veel pluginaid"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Näita Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Jätka kõiki"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_Allalaadimise kiirusepiirang"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_Ãœleslaadimise kiirusepiirang"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Sulge & seiska deemon"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Ava kaust"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "_Jätka"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Val_ikud"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Järjekord"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Uuenda jälgijat"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Eemalda torrent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "_Kontrolli uuesti"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "Muuda a_sukohta"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "_Ãœhenduse limiit"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Ãœleslaadimispe_sade limiit"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Automaatne juhtimine"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Eemalda valitud torrent?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Kui kustutad kirje, on see jäädavalt kadunud"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Jälgijate muutmine"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Jälgijate muutmine</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Lisa tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Lisa trackerid</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Jälgija muutmine"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Jälgija muutmine</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Eemalda andmetega"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Eemalda _torrent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Muuda asukohta"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Asukoha muutmine</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Sihtkoht:"
+
+#~ msgid "seconds"
+#~ msgstr "sekundit"
+
+#~ msgid "Unknown"
+#~ msgstr "Tundmatu"
+
+#~ msgid "Download"
+#~ msgstr "Kiirus Alla"
+
+#~ msgid "Upload"
+#~ msgstr "Kiirus Ãœles"
+
+#~ msgid "Sidebar"
+#~ msgstr "Külgriba"
+
+#~ msgid "Total Size"
+#~ msgstr "Suurus Kokku"
+
+#~ msgid "Pieces"
+#~ msgstr "Tükke"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Jagamissuhe"
+
+#~ msgid "Next Announce"
+#~ msgstr "Järgmine Teatamine"
+
+#~ msgid "Yes"
+#~ msgstr "Jah"
+
+#~ msgid "No"
+#~ msgstr "Ei"
+
+#~ msgid "Remove"
+#~ msgstr "Eemalda"
+
+#~ msgid "Details"
+#~ msgstr "Detailid"
+
+#~ msgid "Files"
+#~ msgstr "Failid"
+
+#~ msgid "Clear"
+#~ msgstr "Eemalda"
+
+#~ msgid "Start"
+#~ msgstr "Alusta"
+
+#~ msgid "Add"
+#~ msgstr "Lisa"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Kiirus:</b>"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Kustuta .torrent fail"
+
+#~ msgid "Select All"
+#~ msgstr "Vali kõik"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Username"
+#~ msgstr "Kasutajanimi"
+
+#~ msgid "Password"
+#~ msgstr "Parool"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "_Quit"
+#~ msgstr "_Sulge"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge on lukus"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge on parooliga kaitstud.\n"
+#~ "Et näha Deluge akent, palun sisestage oma parool"
+
+#~ msgid "Availability"
+#~ msgstr "Kättesaadavus"
+
+#~ msgid "Speed"
+#~ msgstr "Kiirus"
+
+#~ msgid "Filters"
+#~ msgstr "Filtrid"
+
+#~ msgid "Graph"
+#~ msgstr "Graafik"
+
+#~ msgid "New Password"
+#~ msgstr "Uus parool"
+
+#~ msgid "Template"
+#~ msgstr "Mall"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Uuenda automaatselt:"
+
+#~ msgid "About"
+#~ msgstr "Programmist"
+
+#~ msgid "# Of Files"
+#~ msgstr "Failide arv"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Vale parool, proovi uuesti"
+
+#~ msgid "Reannounce"
+#~ msgstr "Teadusta uuesti"
+
+#~ msgid "Pause all"
+#~ msgstr "Peata kõik"
+
+#~ msgid "Logout"
+#~ msgstr "Lahku"
+
+#~ msgid "Type"
+#~ msgstr "Tüüp"
+
+#~ msgid "Disabled"
+#~ msgstr "Väljas"
+
+#~ msgid "From"
+#~ msgstr "Kasutajalt"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Vali url või torrent, mitte mõlemat."
+
+#~ msgid "translate something"
+#~ msgstr "tõlgi midagi"
+
+#~ msgid "Image Only"
+#~ msgstr "Ainult pilt"
+
+#~ msgid "Text Only"
+#~ msgstr "Ainult tekst"
+
+#~ msgid "Text and image"
+#~ msgstr "Tekst ja pilt"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "uuendus peab olema > 0"
+
+#~ msgid "Set"
+#~ msgstr "Sea"
+
+#~ msgid "Submit"
+#~ msgstr "Sisesta"
+
+#~ msgid "Resume all"
+#~ msgstr "Jätka kõiki"
+
+#~ msgid "Torrent list"
+#~ msgstr "Torrenti nimekiri"
+
+#~ msgid "Login"
+#~ msgstr "Logi sisse"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Kustuta alla laetud failid."
+
+#~ msgid "Disable"
+#~ msgstr "Keela"
+
+#~ msgid "Config"
+#~ msgstr "Seadistus"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Queue Position"
+#~ msgstr "Järjekorra positsioon"
+
+#~ msgid "General"
+#~ msgstr "Ãœldine"
+
+#~ msgid "Save"
+#~ msgstr "Salvesta"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Maksimum üleslaadimis kiirus"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Maksimum allalaadimis kiirus"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Maksimum ühenduste arv"
+
+#~ msgid "No data"
+#~ msgstr "Andmeid pole"
+
+#~ msgid "Ports"
+#~ msgstr "Pordid"
+
+#~ msgid "Extra's"
+#~ msgstr "Ekstrad"
+
+#~ msgid "To"
+#~ msgstr "Saaja"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Viga torrenti seadistuses."
+
+#~ msgid "Handshake"
+#~ msgstr "Käepigistus"
+
+#~ msgid "Encryption"
+#~ msgstr "Krüptimine"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Maksimum allalaadimis kiirus (Kib/s)"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Maksimum üleslaadimis kiirus (Kib/s)"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Piiramatu"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = piiramatu"
+
+#~ msgid "Button style"
+#~ msgstr "Nuppude stiil"
+
+#~ msgid "Current Password"
+#~ msgstr "Praegune parool"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Uus parool (uuesti)"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Vana parool on vale"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Uus parool ei ole sama mis uus parool(uuesti)"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Need muudatused salvestati"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Paranda üleval olevad vead ja proovi uuesti"
+
+#~ msgid "This field is required."
+#~ msgstr "See väli on kohustuslik."
+
+#~ msgid "Enter a number."
+#~ msgstr "Sisesta number."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Sisesta terve number."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Lisa päris pilt. Fail mis sina üleslaadisid ei olnud pilt või oli vigane "
+#~ "pilt."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Lisatud fail on tühi."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Lisa õige e-posti aadress."
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Connect"
+#~ msgstr "Ãœhenda"
+
+#~ msgid "Statistics"
+#~ msgstr "Statistika"
+
+#~ msgid "Delete"
+#~ msgstr "Kustuta"
+
+#~ msgid "Stop"
+#~ msgstr "Seiska"
+
+#~ msgid "Move"
+#~ msgstr "Liiguta"
+
+#~ msgid "Recheck"
+#~ msgstr "Kontrolli uuesti"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Aegumine (sekundites)"
+
+#~ msgid "Inactive"
+#~ msgstr "Mitteaktiivne"
+
+#~ msgid "File"
+#~ msgstr "Fail"
+
+#~ msgid "Random"
+#~ msgstr "Segamini"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Kliendi-Vahetus"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Maksimum pool-avatud ühendusi"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Maksimum ühenduse katseid sekundis"
+
+#~ msgid "Inbound"
+#~ msgstr "Sissetulev"
+
+#~ msgid "Either"
+#~ msgstr "kumbki"
+
+#~ msgid "Level"
+#~ msgstr "Tase"
+
+#~ msgid "Outbound"
+#~ msgstr "Väljuv"
+
+#~ msgid "Forced"
+#~ msgstr "Sunnitud"
+
+#~ msgid "Global"
+#~ msgstr "Globaalne"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "Taaskäivita deemon ja webui peale nende seadete muutmist"
+
+#~ msgid "Error in Path."
+#~ msgstr "Viga rajas."
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr "Vali õige valiku varjant. See valik ei ole üks valiku varjantidest."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Vali õige valiku varjant. %s ei ole üks valiku varjantidest."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Lisa õige väärtus"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Lisa torrenteid</b></big>"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "Homepage"
+#~ msgstr "Koduleht"
+
+#~ msgid "FAQ"
+#~ msgstr "KKK"
+
+#~ msgid "Community"
+#~ msgstr "Kommuun"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Impordin %s"
+
+#~ msgid "Other.."
+#~ msgstr "Muud..."
+
+#~ msgid "State"
+#~ msgstr "Olek"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Maksimum üles laadimis slotte"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Lubatud pluginad"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Seda kasuta ei ole olemas"
+
+#~ msgid "Move To"
+#~ msgstr "Liiguta..."
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Võtit ei leitud '%s'"
+
+#~ msgid "Download Location"
+#~ msgstr "Allalaadimise asukoht"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... ja kustuta allaletud failid"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... ja kustuta kõik failid"
+
+#~ msgid "Ava"
+#~ msgstr "Ava"
+
+#~ msgid "Cancel"
+#~ msgstr "Katkesta"
+
+#~ msgid "Connected to"
+#~ msgstr "Ãœhendatud..."
+
+#~ msgid "Connection Limit"
+#~ msgstr "Ãœhenduse limiit"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "D/L kiiruse limiit"
+
+#~ msgid "Admin"
+#~ msgstr "Admin"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... ja kustuta torrent failid"
+
+#~ msgid "Disk Space"
+#~ msgstr "Kettaruum"
+
+#~ msgid "False"
+#~ msgstr "Väär"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "High priority"
+#~ msgstr "Kõrge prioriteet"
+
+#~ msgid "Keyword"
+#~ msgstr "Võtmesõna"
+
+#~ msgid "Highest priority"
+#~ msgstr "Kõrgeim prioriteet"
+
+#~ msgid "True"
+#~ msgstr "Tõene"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Ãœleslaadimis sloti limiit"
+
+#~ msgid "Update"
+#~ msgstr "Uuenda"
+
+#~ msgid "Search"
+#~ msgstr "Otsi"
+
+#~ msgid "Restart"
+#~ msgstr "Taaskäivita"
+
+#~ msgid "Graphs"
+#~ msgstr "Graafikud"
+
+#~ msgid "Stats"
+#~ msgstr "Statistika"
+
+#~ msgid "Import Now"
+#~ msgstr "Impordi kohe"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Impordi deemoni käivitamisel"
+
+#~ msgid "no label"
+#~ msgstr "silditu"
+
+#~ msgid "UpNP"
+#~ msgstr "UPnP"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr ".torrent fail salvestatakse"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Aktiivseid torrenteid kokku"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Allalaadivaid kokku"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Levitatavaid kokku"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Näita külgriba"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Ãœhendu deemoniga"
+
+#~ msgid "Show trackers"
+#~ msgstr "Näita jälgijaid"
+
+#~ msgid "Normal priority"
+#~ msgstr "Normaalne tähtsus"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Sissetulevaid ühendusi pole"
+
+#~ msgid "Move torrent"
+#~ msgstr "Liiguta torrentit"
+
+#~ msgid "Label torrent"
+#~ msgstr "Sildista torrent"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Deemoniga pole ühendatud"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "jälgija1.org\n"
+#~ "jälgija2.com\n"
+#~ "see ei tee hetkel midagi veel..\n"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Jälgija olek"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Uuenda jälgijat"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Levitamine lõpetatakse suhtel"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Levitamine peatatakse suhte ületamisel"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Torrent eemaldatakse suhte ületamisel"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torrent on üle peatamise suhte."
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Deluge seadistamisnõustaja"
+
+#~ msgid "All Finished!"
+#~ msgstr "Kõik lõpetatud!"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr "See nõustaja aitab muuta Deluge Sulle sobivaks."
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Kontrollimise intervall (päeva)"
+
+#~ msgid "BlockList"
+#~ msgstr "Must nimekir"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Töö käib.."
+
+#~ msgid "Refresh status"
+#~ msgstr "Uuenda olekut"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Kaasatud %i faili"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Deluge on lõpetanud %s allalaadimise, mis kaasab %i faili.\n"
+#~ "Nende teadete keelamiseks lülita välja e-posti teavitus Deluge "
+#~ "eelistustest.\n"
+#~ "\n"
+#~ "Aitäh,\n"
+#~ "Deluge"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Esimesed ja viimased tükid eelisjärjekorras"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP authiga"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 authiga"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge sisselogimine"
+
+#~ msgid "Active time"
+#~ msgstr "Aktiivne aeg"
+
+#~ msgid "Seeding time"
+#~ msgstr "Levitamise aeg"
+
+#~ msgid "Eta"
+#~ msgstr "ETA"
+
+#~ msgid "Do not download"
+#~ msgstr "Ära lae"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "Ü/A kiiruse piirang"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Kontrolli uuesti"
+
+#~ msgid "page 8"
+#~ msgstr "lk 8"
+
+#~ msgid "page 6"
+#~ msgstr "lk 6"
+
+#~ msgid "page 11"
+#~ msgstr "lk 11"
+
+#~ msgid "page 12"
+#~ msgstr "lk 12"
+
+#~ msgid "page 7"
+#~ msgstr "lk 7"
+
+#~ msgid "page 10"
+#~ msgstr "lk 10"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Lehe värskendamise intervall:"
+
+#~ msgid "Force Download"
+#~ msgstr "Allalaadimine jõuga"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Blokeeritud vahemikud: %s"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "%.2f%% allalaadimine"
+
+#~ msgid "Queue Top"
+#~ msgstr "Järjesta üles"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Järjesta alla"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Torrenti kohta"
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Sisesta kehtiv IPv4 aadress."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "URL paistab olevat katkine link."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Sisesta töötav URL."
+
+#~ msgid "Cache templates"
+#~ msgstr "Mallid puhvrisse"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : Torrenti nimekiri"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Automaatvärskendus (sekundit)"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Näita otsingulahtrit"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Lisa peatatuna"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Muutuste rakendamiseks käsitsi webui restart"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Sertifikaati ei leitud '%s'"
+
+#~ msgid "Seed rank"
+#~ msgstr "Levitamise järk"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Näita null-staatuseid"
+
+#~ msgid "Downloading.."
+#~ msgstr "Allalaadimine..."
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Ãœhenduseta.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Allalaadimine ebaõnnestus : %s"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s pole sobiv URL."
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "See programm on vaba tarkvara. Te võite seda edasi levitada ja/või muuta "
+#~ "vastavalt GNU Ãœldise Avaliku Litsentsi tingimustele, nagu need on Vaba "
+#~ "Tarkvara Fondi poolt avaldatud; kas Litsentsi versioon number 3 või "
+#~ "(vastavalt Teie valikule) ükskõik milline hilisem versioon. Seda programmi "
+#~ "levitatakse lootuses, et see on kasulik, kuid ILMA IGASUGUSE GARANTIITA; "
+#~ "isegi kaudse KVALITEEDIGARANTIITA või SOBIVUSELE TEATUD KINDLAKS "
+#~ "EESMÄRGIKS. Üksikasjade suhtes vaata GNU Üldist Avalikku Litsentsi. Te peaks "
+#~ "olema saanud GNU Ãœldise Avaliku Litsentsi koopia koos selle programmiga; kui "
+#~ "ei, vaata <http://www.gnu.org/licenses>. Lisaks, spetsiaalse erandina, "
+#~ "annavad autoriõiguste omajad loa programmi koodi osade kasutamiseks OpenSSL "
+#~ "teegiga. OpenSSL-i mitte puudutava koodi puhul peate alluma GNU Ãœldisele "
+#~ "Avalikule Litsentsile. Kui selle erandiga fail(e) muudetakse, võib laiendada "
+#~ "seda erandit ka Teie versioonidele faili(de)st, kuid kohustus selleks "
+#~ "puudub. Kui Te ei soovi nii teha, kustutage selle erandi lausung oma "
+#~ "versioonist. Kui selle erandi lausung kustutatakse kõigist programmi "
+#~ "lähtefailidest, siis kustutada see ka siit."
+
+#~ msgid "max_upload_slots"
+#~ msgstr "max_upload_slots"
+
+#~ msgid "max_connections"
+#~ msgstr "max_connections"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "max_upload_speed"
+
+#~ msgid "max_download_speed"
+#~ msgstr "max_download_speed"
+
+#~ msgid "apply_max"
+#~ msgstr "apply_max"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "remove_at_ratio"
+
+#~ msgid "move_completed"
+#~ msgstr "move_completed"
+
+#~ msgid "apply_queue"
+#~ msgstr "apply_queue"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "is_auto_managed"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "stop_at_ratio"
+
+#~ msgid "stop_ratio"
+#~ msgstr "stop_ratio"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "apply_move_completed"
+
+#~ msgid "move_completed_path"
+#~ msgstr "move_completed_path"
+
+#~ msgid "auto_add"
+#~ msgstr "auto_add"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "auto_add_trackers"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "See programm on vaba tarkvara. Te võite seda edasi levitada ja/või muuta "
+#~ "vastavalt GNU Ãœldise Avaliku Litsentsi tingimustele, nagu need on Vaba "
+#~ "Tarkvara Fondi poolt avaldatud; kas Litsentsi versioon number 3 või "
+#~ "(vastavalt Teie valikule) ükskõik milline hilisem versioon. Seda programmi "
+#~ "levitatakse lootuses, et see on kasulik, kuid ILMA IGASUGUSE GARANTIITA; "
+#~ "isegi kaudse KVALITEEDIGARANTIITA või SOBIVUSELE TEATUD KINDLAKS EESMÄRGIKS. "
+#~ "Ãœksikasjade suhtes vaata GNU Ãœldist Avalikku Litsentsi. Te peaks olema "
+#~ "saanud GNU Ãœldise Avaliku Litsentsi koopia koos selle programmiga; kui ei, "
+#~ "vaata <http://www.gnu.org/licenses>."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Sisesta kehtiv kuupäev/kellaaeg."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Sisesta kehtiv kuupäev."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Sisesta kehtiv kellaaeg."
+
+#~ msgid "From Url"
+#~ msgstr "URL-ist"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Kompaktne jaotus"
+
+#~ msgid "From Session"
+#~ msgstr "Sessioonist"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Viga sildi valikute muutmisel"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Salvesta kõik allalaadimised kausta"
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "Ühtegi faili ei saadetud. Kontrolli kodeeringutüüpi."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Ãœhtegi faili ei saadetud."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Veendu, et poleks rohkem kui %s kümnendkohta."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr "Veendu, et poleks rohkem kui %s numbrit enne koma."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Veendu, et poleks kokku rohkem kui %s numbrit."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Veendu, et väärtus oleks väiksem või võrdne kui %s."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Veendu, et väärtus oleks suurem või võrdne kui %s."
+
+#~ msgid "Set Timeout"
+#~ msgstr "Määra ajapiirang"
+
+#~ msgid "Test config value"
+#~ msgstr "Testi seadeväärtust"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Lisa kataloog automaatselt"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Levitamisi/masinaid"
+
+#~ msgid "Test config value:"
+#~ msgstr "Testi seadeväärtust:"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Automaatlisamine lubatud"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Veendu, et väärtusel poleks rohkem kui %(max)d tähemärki (praegu %(length)d)."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Veendu, et väärtusel poleks vähem kui %(min)d tähemärki (praegu %(length)d)."
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Sisesta väärtuste loend."
+
+#~ msgid "Upload torrent"
+#~ msgstr "Torrenti üleslaadimine"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Sisesta salasõna</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge on parooliga kaitstud!</big></b>"
diff --git a/deluge/i18n/eu.po b/deluge/i18n/eu.po
new file mode 100644
index 0000000..f027427
--- /dev/null
+++ b/deluge/i18n/eu.po
@@ -0,0 +1,3760 @@
+# Basque translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2006-11-01 15:00+0000\n"
+"Last-Translator: Xabi Ezpeleta <xezpeleta@gmail.com>\n"
+"Language-Team: Basque <eu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Nondik:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Aukeratu karpeta"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Etiketa"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Igoera abiadura:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Jetsiera abiadura:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Konexioak:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Gehienezkoa"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Gehitu Etiketa"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Izena:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Egunak"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Aukerak</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Data:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torrent-a gehitu da"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Exekutatu"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Ongi Iragarki"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Iragarki Bidalituta"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Oharra"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Okerra"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Bezeroa"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Tamaina"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Fitxategi guztiak"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Tracker"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Konexioak"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Etiketak"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Izena"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Haziak"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Bezeroak"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ETA"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Fitxategia"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Editatu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Laguntza"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Gehitu Torrent-a"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Ezabatu Torrent-a"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Nora:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Eguneratu Tracker-a"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "seconds"
+#~ msgstr "segundu"
+
+#~ msgid "Unknown"
+#~ msgstr "Ezezaguna"
+
+#~ msgid "Download"
+#~ msgstr "Jetsiera"
+
+#~ msgid "Upload"
+#~ msgstr "Igoera"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Eguneratu Tracker-a"
+
+#~ msgid "Total Size"
+#~ msgstr "Erabateko Tamaina"
+
+#~ msgid "Pieces"
+#~ msgstr "Zatiak"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Elkarbanatze Indizea"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Tracker-aren Egoera"
+
+#~ msgid "Next Announce"
+#~ msgstr "Hurrengo Albistea"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Gehien Deskarga Abiadura"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Gehien Konexioak"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Gehien Igoera Abiadura"
+
+#~ msgid "Delete"
+#~ msgstr "Ezabatu"
+
+#~ msgid "Filters"
+#~ msgstr "Iragazkiak"
+
+#~ msgid "General"
+#~ msgstr "Orokorra"
diff --git a/deluge/i18n/fa.po b/deluge/i18n/fa.po
new file mode 100644
index 0000000..0db812d
--- /dev/null
+++ b/deluge/i18n/fa.po
@@ -0,0 +1,3967 @@
+# Persian translation for deluge
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-09-03 14:31+0000\n"
+"Last-Translator: reza davoudi <Unknown>\n"
+"Language-Team: Persian <fa@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "کیلوبایت بر ثانیه"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "رمز عبور:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "از:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Ùعال"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "یک پوشه انتخاب کنید"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>محل دانلود</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "بیشینه اتصالات:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "بیشترین شکاÙ‌های آپلود:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>پهنای باند</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "توق٠دانه‌پراکنی در نسبت:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "حذ٠در نسبت:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "گزینه‌ها"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "برچسب"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "گزینه‌های برچسب"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>گزینه‌های برچسب</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "سرعت آپلود:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "سرعت دانلود:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "اتصال‌ها"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "مدیریت خودکار"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "اعمال تنظیمات صÙ:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "صÙ"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "جابجایی کامل به:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "اعمال تنظیمات محل:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "اعمال برچسب به صورت خودکار:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "اÙزودن برچسب"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>اÙزودن برچسب</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "نام:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr "<i>استÙاده از سایدبار برای اضاÙÙ‡ کردن، ویرایش Ùˆ حذ٠برچسب </i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>برچسب‌ها</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "نشانی اینترنتی:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "تاریخ:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "اجرا"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "رخداد"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "دستور"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>اضاÙÙ‡ کردن دستور</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>دستورات</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "هشدار"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "بروز خطا"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "نشانی"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "پیشرÙت"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "سرعت بارگیری"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "سرعت بالا"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "نامحدود"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Ùعال شده"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "غیره..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "پایین"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "بالا"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "بارگیری‌ها"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "شبکه"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "پهنای باند"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "غیره"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "اÙزونه‌ها"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "نام پرونده"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "اندازه‌"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "پرونده‌های Torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "همه‌ی پرونده‌ها"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "ردیاب"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "اتصال‌ها"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "خاموش"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "اولویت"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "نام"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "بارگیری‌شده"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "بارگذاری‌شده"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "جÙتها"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "زمان باقی مانده"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "نسبت"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "پرونده"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "اÙزودن تورنت"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "ویرایش"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "تورنت"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "نما"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_نوار ابزار"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "ستون"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "راهنما"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "اضاÙÙ‡ کردن تورنت"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "اÙزودن یک تورنت"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "حذ٠تورنت"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "حذ٠تورنت"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Ù…Ú©Ø«"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "ادامه"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "بالا بردن تورنت در صÙ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "پایین بردن تورنت در صÙ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "تنظیمات‌"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>سایز کامل: </b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>نام:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>:مسیر</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "جزئیات"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "خصوصی"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_ویرایش ردیاب"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "ادا_مه همه"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "اÙزودن تورنت‌ها"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "اطلاعات_هش"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>تورنت‌ها</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "پر_ونده"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "پر"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>تخصیص</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "بیشینه سرعت دانلود:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "بیشینه سرعت آپلود:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "اولویت اول/آخرین تکه"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "رجوع به اطلاعات پیشÙرض"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "اعمال برای همه"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "اÙزودن نشانی وب"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>از اطلاعات هش</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "اطلاعات هش:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "ردیاب‌ها:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>دانلودها</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "اÙزودن خودکار .torrents از:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "دانلود در:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "رونوشت پرونده .torrent به:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "استÙاده از تخصیص کامل"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"در حالت تخصیص کامل، Ú©Ù„ Ùضای مورد نیاز به یک تورنت از همان ابتدا داده می‌شود "
+"و از تکه تکه دیسک نیز جلوگیری می‌شود"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "استÙاده از تخصیص Ùشرده"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "در حالت تخصیص Ùشرده، Ùقط Ùضای مورد نیاز داده می‌شود"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "اولویت بندی اولین و آخرین تکه‌های تورنت"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "اولویت بندی اولین و آخرین تکه از پرونده‌ها در تورنت"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>شبکه</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "استÙاده تصادÙÛŒ درگاه"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "دلاگ هر زمان به صورت خودکار درگاه متÙاوتی را انتخاب می‌کند."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "درگاه Ùعال:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "به:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "آزمون درگاه Ùعال"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>درگاه ورودی</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>درگاه خروجی</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "خدمت کاش٠محلی، نقاط محلی روی شبکه را برای شما پیدا می‌کند."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "جدول درهم توزیع‌شده می‌تواند باعث بهبود اتصالات Ùعال شود."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>شبکه اضاÙÛŒ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "سطح:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"اجباری\n"
+"Ùعال\n"
+"غیرÙعال"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"دست دادن\n"
+"جریان کامل\n"
+"هر یک از این دو تا"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "خارج از محدوده"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "رمزبندی کردن تمام جریان"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>رمزبندی</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>پهنای باند</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "بیشینه اتصالات نیمه باز:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"بیشینه سرعت بارگذاشتن برای همه تورنت‌ها.برای مقدار نامحدود -1 را تنظیم کنید."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "بیشینه سرعت بارگذاشتن (کیلوبایت بر ثانیه):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "بیشینه اتصالات مجاز. رای مقدار نامحدود -1 را تنظیم کنید."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "بیشینه اتصالات:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"بیشینه شکاÙ‌های بارگذاشتن برای همه تورنت‌ها. برای مقدار نامحدود -1 را تنظیم "
+"کنید."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "بیشینه شکاÙ‌های بارگذاشتن:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"بیشینه سرعت بارگیری برای همه تورنت‌ها.برای مقدار نامحدود -1 را تنظیم کنید."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "بیشینه سرعت بارگیری (کیلوبایت بر ثانیه):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "چشم‌پوشی از محدودیت‌ها بر روی شبکه محلی"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>کاربرد پهنای باند جهانی</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Ùعال‌سازی"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"هیچ کدام\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_دانلود با سرعت محدود"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_محدودیت سرعت آپلود"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "ادا_مه"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "تظیم_ات"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_صÙ"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_به‌روزآوری ردیاب"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_حذ٠تورنت"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "_بررسی مجدد اجباری"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "_محدودیت اتصال"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "محدودیت _شکا٠آپلود"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_مدیریت خودکار"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>حذ٠تورنت انتخاب شده؟</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "اگر داده را پاک کنید، برای همیشه آن را از دست خواهید داد."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "حذ٠_تورنت"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "Remove"
+#~ msgstr "حذÙ"
+
+#~ msgid "Clear"
+#~ msgstr "پاک کردن"
+
+#~ msgid "Add"
+#~ msgstr "اÙزودن"
+
+#~ msgid "Availability"
+#~ msgstr "دسترس‌پذیری"
+
+#~ msgid "Share Ratio"
+#~ msgstr "ضریب اشتراک گذاری"
+
+#~ msgid "Details"
+#~ msgstr "جزئیات‌"
+
+#~ msgid "Select All"
+#~ msgstr "گزینش همه"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>سرعت:<b/>"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Server"
+#~ msgstr "کارگزار"
+
+#~ msgid "Username"
+#~ msgstr "نام کاربری"
+
+#~ msgid "Password"
+#~ msgstr "کلمه عبور"
+
+#~ msgid "Port"
+#~ msgstr "درگاه‌"
+
+#~ msgid "_Quit"
+#~ msgstr "_خروج"
+
+#~ msgid "Unknown"
+#~ msgstr "ناشناخته"
+
+#~ msgid "Download"
+#~ msgstr "بارگیری"
+
+#~ msgid "Upload"
+#~ msgstr "بارگذاری"
+
+#~ msgid "Template"
+#~ msgstr "قالب"
+
+#~ msgid "New Password"
+#~ msgstr "کلمه عبور جدید"
+
+#~ msgid "Image Only"
+#~ msgstr "Ùقط عکس"
+
+#~ msgid "Text Only"
+#~ msgstr "Ùقط متن"
+
+#~ msgid "Text and image"
+#~ msgstr "متن و عکس"
+
+#~ msgid "About"
+#~ msgstr "درباره"
+
+#~ msgid "Disable"
+#~ msgstr "غیرÙعال کردن‌"
+
+#~ msgid "Config"
+#~ msgstr "پیکربندی"
+
+#~ msgid "Pause all"
+#~ msgstr "مکث کردن همه"
+
+#~ msgid "Logout"
+#~ msgstr "خروج"
+
+#~ msgid "Login"
+#~ msgstr "ورود"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "کلمه عبور اشتباه می باشد, مجددا سعی کنید"
+
+#~ msgid "Next Announce"
+#~ msgstr "اعلامیه بعدی"
+
+#~ msgid "Speed"
+#~ msgstr "سرعت‌"
+
+#~ msgid "Set"
+#~ msgstr "تنظیم"
+
+#~ msgid "Url"
+#~ msgstr "نشانی وب"
+
+#~ msgid "Upload torrent"
+#~ msgstr "بارگزاری تورنت"
+
+#~ msgid "Submit"
+#~ msgstr "ارسال"
+
+#~ msgid "Total Size"
+#~ msgstr "اندازۀ کل"
+
+#~ msgid "Torrent list"
+#~ msgstr "Ùهرست تورنت"
+
+#~ msgid "Start"
+#~ msgstr "شروع"
+
+#~ msgid "Tracker Status"
+#~ msgstr "وضعیت ردیاب"
+
+#~ msgid "seconds"
+#~ msgstr "ثانیه"
+
+#~ msgid "Type"
+#~ msgstr "نوع‌"
+
+#~ msgid "Disabled"
+#~ msgstr "از کار اÙتاده"
+
+#~ msgid "Filters"
+#~ msgstr "صاÙی‌ها"
+
+#~ msgid "Pieces"
+#~ msgstr "تکه‌ها"
+
+#~ msgid "Files"
+#~ msgstr "پرونده‌ها"
+
+#~ msgid "Admin"
+#~ msgstr "مدیر"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "بروز رسانی خودکار"
+
+#~ msgid "Connected to"
+#~ msgstr "متصل به"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Ùایل‌های دانلود شده را پاک Ú©Ù†"
+
+#~ msgid "File"
+#~ msgstr "Ùایل"
+
+#~ msgid "False"
+#~ msgstr "نادرست‌"
+
+#~ msgid "Keyword"
+#~ msgstr "کلیدواژه"
+
+#~ msgid "# Of Files"
+#~ msgstr "تعداد Ùایل‌ها"
+
+#~ msgid "Active time"
+#~ msgstr "مدت زمان Ùعالیت"
+
+#~ msgid "Connect"
+#~ msgstr "اتصال"
+
+#~ msgid "Move"
+#~ msgstr "جابه‌جایی"
+
+#~ msgid "General"
+#~ msgstr "کلیات"
+
+#~ msgid "Restart"
+#~ msgstr "راه‌اندازی دوباره"
+
+#~ msgid "Save"
+#~ msgstr "ذخیره کردن"
+
+#~ msgid "Stop"
+#~ msgstr "متوق٠کن"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "بالاترین سرعت بارگیری"
+
+#~ msgid "Download Location"
+#~ msgstr "محل بارگیری"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "بالاترین تعداد اتصال‌ها"
+
+#~ msgid "No data"
+#~ msgstr "بدون داده"
+
+#~ msgid "Ports"
+#~ msgstr "درگاه‌ها"
+
+#~ msgid "To"
+#~ msgstr "تا"
+
+#~ msgid "Random"
+#~ msgstr "تصادÙی‌"
+
+#~ msgid "From"
+#~ msgstr "از"
+
+#~ msgid "Inbound"
+#~ msgstr "ورودی"
+
+#~ msgid "Either"
+#~ msgstr "هر کدام"
+
+#~ msgid "Per Torrent"
+#~ msgstr "برای هر تورنت"
+
+#~ msgid "Outbound"
+#~ msgstr "خروجی"
+
+#~ msgid "Global"
+#~ msgstr "سراسری"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "هنوز چیزی انجام نشده است..\n"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>اÙزودن تورنت‌ها</b></big>"
+
+#~ msgid "page 6"
+#~ msgstr "صÙحه Û¶"
+
+#~ msgid "page 7"
+#~ msgstr "صÙحه Û·"
diff --git a/deluge/i18n/fi.po b/deluge/i18n/fi.po
new file mode 100644
index 0000000..2013a17
--- /dev/null
+++ b/deluge/i18n/fi.po
@@ -0,0 +1,6147 @@
+# Finnish translation for deluge
+# Copyright (c) 2018 Rosetta Contributors and Canonical Ltd 2018
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2018-04-18 20:25+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Finnish <fi@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr ""
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr ""
+
+#: deluge/common.py:410
+msgid "K"
+msgstr ""
+
+#: deluge/common.py:411
+msgid "M"
+msgstr ""
+
+#: deluge/common.py:412
+msgid "G"
+msgstr ""
+
+#: deluge/common.py:413
+msgid "T"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr ""
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr ""
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr ""
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
diff --git a/deluge/i18n/fr.po b/deluge/i18n/fr.po
new file mode 100644
index 0000000..e40917e
--- /dev/null
+++ b/deluge/i18n/fr.po
@@ -0,0 +1,6153 @@
+# French translation for deluge
+# Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2017-11-11 06:41+0000\n"
+"Last-Translator: Stanislas Michalak <stanislas.michalak@gmail.com>\n"
+"Language-Team: French <fr@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr "o"
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr "Kio"
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr "Mio"
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr "Gio"
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr "Tio"
+
+#: deluge/common.py:410
+msgid "K"
+msgstr "K"
+
+#: deluge/common.py:411
+msgid "M"
+msgstr "M"
+
+#: deluge/common.py:412
+msgid "G"
+msgstr "G"
+
+#: deluge/common.py:413
+msgid "T"
+msgstr "T"
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr "K/s"
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr "Kio/s"
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr "M/s"
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr "Mio/s"
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr "G/s"
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr "Gio/s"
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr "T/s"
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr "Tio/s"
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr "Adresse IP d'écoute des connexions BitTorrent"
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr ""
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr "<b>Général<b>"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr "Chemin d'enregistrement"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr ""
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr "pygame n'est pas installé"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr "Torrent terminé"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+"Le téléchargement du torrent « %(name)s » comportant %(num_files)i "
+"fichier(s) est terminé."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+"Une erreur est survenue lors de l'envoi du courriel de notification : %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr "Le serveur n'a pas répondu correctement à la commande HELO : %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr "Courriel de notification envoyé."
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr "Torrent terminé « %(name)s »"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr "Extraire vers :"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
+
+#~ msgid "pynotify is not installed"
+#~ msgstr "pynotify n'est pas installé"
diff --git a/deluge/i18n/fy.po b/deluge/i18n/fy.po
new file mode 100644
index 0000000..0328a84
--- /dev/null
+++ b/deluge/i18n/fy.po
@@ -0,0 +1,4460 @@
+# Frisian translation for deluge
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2011-03-25 19:20+0000\n"
+"Last-Translator: Sense Hofstede <u@sensehofstede.nl>\n"
+"Language-Team: Frisian <fy@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Hostnamme:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Poarte:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Brûkersnamme:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Wachtwurd:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Fan:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Ynskeakele"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "In map kieze"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Lokaasje</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Maks uploadsnelheid:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Maks ferbiningen:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Maks uploadplakken:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Maks delhelsnelheid:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Bânbreedte</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Seed stopje bij ratio:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Fuortsmite bij ratio:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Boppekant"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Ûnderkant"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Rij</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Opsjes"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Leech label"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Label bestiet al"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Net-bekind label"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Net-bekinde torrent"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Label_opsjes"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "Label fuo_rtsmite"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "L_abel tafoegje"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Labelopsjes"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Labelopsjes</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Uploadplakken:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Uploadsnelheid:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Delhelsnelheid:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Ferbinings:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Heechste mooglik"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Automatysk beheard"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Rijynstellings tapasse:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Rij"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Foltôge ferplaatse nei:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Lokaasjeynstellings tapasse:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Lokaasje"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 rigel per tracker)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Automatysk label taheakje:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Trackers"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Label tafoegje"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Label taheakje</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Namme:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>De sydbalke kin brûkt wurde om labels ta te heakjen, bij te wurkjen en "
+"fuort te smyten.</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Labels</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Algemien</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP list (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Text (Zipped)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Text (Uncompressed)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Ûnjildige ferzje"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Blokkearlist"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Opsjes</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Soart:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Ynfo</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Oankondiging OK"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Oankondiging ferstjoerd"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Warskôging"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Flater"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Adres"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Client"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Foargong"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Delhelsnelheid"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Uploadsnelheid"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrents yn rij"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrent yn rij"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Ynskeakele"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Oars..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Omleech:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Omheech:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Omleech"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Omheech"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Maks delhelsnelheid ynstelle"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Maks uploadsnelheid ynstelle"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torrent foltôge"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Delhellingen"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Netwurk"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Bânbreedte"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Ynterface"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Oars"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Daemon"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Proxy"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Ynfoegtapassings"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Ynstekker"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Ynstekker kieze"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Ynstekker eggs"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Triemnamme"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Grutte"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Torrent-triemen"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Alle triemen"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Tier"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Tracker"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "In triem kieze"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "In map kieze"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ".torrent triem bewarje"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Net ferbûn"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Ferbinings"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Delhelsnelheid"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Uploadsnelheid"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT Nodes"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Gjin yngeande ferbinings!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Maks oantal ferbinings ynstelle"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrents"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Neat"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Gjin label"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Host"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Oan"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Út"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Prioriteit"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Details:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Namme"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Delhelle"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Uploaden"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Seeders"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Peers"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Tiid plm"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Ratio"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Bskber"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Tafoecht"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Bestân"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "Torrent t_afoegje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "Torrent oanmeitsje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "Bij_wurkje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "Ferbiningsbehearder"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "By_ld"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "Ar_kbalken"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Sydbalke"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Steat_balke"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "T_abs"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Kolommen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "Sydbalke"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Nul hits sjen litte"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "_Trackers sjen litte"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Help"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Faak stelde fragen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Torrent tafoegje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Torrent tavoegje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Torrent fuortsmite"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Torrent fuortsmite"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Selektearre torrents skoftsje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Skoftsje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Selektearre torrents ferfetsje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Ferfetsje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Torrent omheech yn rij"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Omheech yn rij"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Torrent omleech yn rij"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Omleech yn rij"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Foarkarren"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Ferbiningsbehearder"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "Alles útklapp_e"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "Net _delhelje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Normale prioriteit"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Hege prioriteit"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Heechste prioriteit"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Automatysk beheard:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Seedrang:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Seedtiid</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Oan-tiid:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Trackersteat:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Beskikberheid:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Peers:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Seeders:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Dielen:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Tiid plm</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Earstfolgjende oankondiging:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Dielratio</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Upload:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Delhelle:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Tafoechdatum:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Steat"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>Oantal triemen:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Totale grutte:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Namme:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Paad:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Steat</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Details"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Triemmen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Peers"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Foltôge ferplaatse:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Privé"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Earste/lêst foarrang"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "Trackers oanpasse"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Opsjes"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Torrent fuortsmite?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Selektearre torrent fortsmite"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Nije útjefte"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Nije útjefte beskikber!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<b>Beskikbere ferzje:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Ferzje:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Dit finster yn'e takomst net sjen litte"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "Nei webside"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "In peer tafoegje troch IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Alles selekteare"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "Alles skoftsje"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Selektearre torrents ferfetsje"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Alles ferfetsje"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Torrents tavoegje"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "Fuo_rtsmite"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrents</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Triemen"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Folledich"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Lyts"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Allokaasje</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Maks delhelsnelheid:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Maks uploadsnelheid:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Pauzearre tafoegje"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Earste/lêste dielen foarrang"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Tapasse op alles"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "URL tafoegje"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Fan URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Infohash tafoegje"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Fan infohash</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Trackers:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Torrent oanmeitsje"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Torrent oanmeitsje</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Map"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "Paad op ostân"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Triemen</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Auteur:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Kommentaar:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Ynfo"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Webseeds"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Dielgrutte:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Privé-flag ynstelle"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Dizze torrent oan'e sesje tafoegje"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Paad op ofstân ynfiere"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Paad op ofstân</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Paad:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Torrent oanmeitsje..."
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ".torrent bewarje as"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>.torrent triem bewarje</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Torrents yn rij"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Torrents yn rij tafoegje</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "label"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Peer tafoegje"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Peer tafoegje</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "host:poart"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Host tafoegje"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Ferbiningsbehearder</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "Lokale daemon _starte"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Automatysk mei host ferbine bij opstarten"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Localhost automatysk starte"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Dit finster net sjen litte bij opstarten"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Delhelje</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ".torrents automatysk tafoegje fan:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Delhelje nei:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ".torrent-triem kopiearje nei:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Mappen</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Folledige allokaasje brûke"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Kompakte allokaasje brûke"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Netwurk</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Willekeurige poartte brûke"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Ynstelde poartte:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Nei:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Poartte teste"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Yngeande poarten</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Útgeande poarten</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Peer TOS Byte:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT Port Mapping Protocol"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Peerútwikseling"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Netwurkekstra's</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Yngeand:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Nivo:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Forsearre\n"
+"Ynskeakele\n"
+"Útskeakele"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Fûskjen\n"
+"Folledige stream\n"
+"Beide"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Útgeand:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Folledige stream fersiiferje"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Fersiifering</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Bânbreedte</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Maks ferbiningsoanfragen per sekonde:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Maks heal-iepene ferbiningen:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Maks uploadsnelheid (Kib/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Maks ferbiningen:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Maks uploadplakken:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Maks delhelsnelheid (Kib/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Algemien bânbreedtegebrûk</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Bânbreedtegebrûk per torrent</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Ynterface</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Ynskeakelje"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Klassyke moadus</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Sesjesnelheid sjen litte yn titelbalke"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Haadfinster</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Altyd sjen litte"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Finster selekteare"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Torrents Tafoegje-finster</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Systeemfak-byldkaai ynskeakelje"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Yn systeemfak opstarte"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Systeemfak mei wachtwurd befeiligje"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Systeemfak</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Oars</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Warskôgje bij nije útjeftes"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Bijwurkingen</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Ja, statistyken opstjoere"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Systeemynformaasje</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Daemon</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Daemon poartte:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Poartte</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Ferbiningen op ofstân tastean"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Ferbiningen</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Om de safolle tiid website kontroleare op nij útjeftes"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Oars</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Rij</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Nije torrents oan de boppekant fan'e rij"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Trage torrents net telle"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Ynstelde torrents</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Limyt dielratio:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Seedtiid (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Seed stopje bij ratio:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Torrent fuortsmite bij berikken ratio"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Seeden</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Proxy</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Host:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 mei auth\n"
+"HTTP\n"
+"HTTP mei auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Peer</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Web Seed</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Tracker</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Ynstekkers</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Ferzje:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Haadside:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Email auteur:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "Ynstekker ynstalleare"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "Ynstekkers sykje"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "Deluge _sjen litte"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "Alles ferfetsje"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "Snelheidslimyt _delheljen:"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "Snelheidslimyt _uploaden:"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Ofslute & deamon stopje"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "Map iepenje"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Ferfetsje"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Opsjes"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "Rij"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "Tracker bijwurkje"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "Torrent fuo_rtsmite"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "Opnij kontroleare _forseare"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "Opslach ferplaat_se"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "Ferbiningsbeperking"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Limyt uploadplakken"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Automatysk beheard"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Selektearre torrent fuortsmite?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Trackers oanpasse"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Trackers bijwurkje</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Tracker tafoegje"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Trackers tafoegje</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Tracker oanpasse"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Tracker bijwurkje</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Fuortsmite mei _data"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "_Torrent fuortsmite"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Opslach ferplaatse"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Opslach ferplaatse</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "Remove"
+#~ msgstr "Fuortsmite"
+
+#~ msgid "Clear"
+#~ msgstr "Opromje"
+
+#~ msgid "Availability"
+#~ msgstr "Beskikberheid"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Ratio"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Torrents tafoegje</b></big>"
+
+#~ msgid "page 6"
+#~ msgstr "Pagina 6"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 7"
+#~ msgstr "Pagina 7"
+
+#~ msgid "page 8"
+#~ msgstr "Pagina 8"
+
+#~ msgid "page 10"
+#~ msgstr "Pagina 10"
+
+#~ msgid "page 11"
+#~ msgstr "Pagina 11"
+
+#~ msgid "page 12"
+#~ msgstr "Pagina 12"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "_Quit"
+#~ msgstr "Ofslute"
+
+#~ msgid "Homepage"
+#~ msgstr "Haadside"
+
+#~ msgid "FAQ"
+#~ msgstr "Fragen"
+
+#~ msgid "Community"
+#~ msgstr "Gemienskip"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Snelheid</b>"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Koe labelopsjes net ynstelle"
+
+#~ msgid "apply_max"
+#~ msgstr "apply_max"
+
+#~ msgid "max_download_speed"
+#~ msgstr "max_download_speed"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "max_upload_speed"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "max_upload_slots"
+
+#~ msgid "max_connections"
+#~ msgstr "max_connections"
+
+#~ msgid "apply_queue"
+#~ msgstr "apply_queue"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "is_auto_managed"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "stop_at_ratio"
+
+#~ msgid "stop_ratio"
+#~ msgstr "stop_ratio"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "remove_at_ratio"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "apply_move_completed"
+
+#~ msgid "move_completed"
+#~ msgstr "move_completed"
+
+#~ msgid "move_completed_path"
+#~ msgstr "move_completed_path"
+
+#~ msgid "auto_add"
+#~ msgstr "auto_add"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "auto_add_trackers"
+
+#~ msgid "BlockList"
+#~ msgstr "BlokkearList"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Kontroleare elke (dagen)"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Timeout (sekonden)"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Delheljen %.2f%%"
+
+#~ msgid "Inactive"
+#~ msgstr "Net aktyf"
+
+#~ msgid "Refresh status"
+#~ msgstr "Steat ferfarskje"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge is blokkeard"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge is blokkeard.\n"
+#~ "Type om it Deluge-finster sjen te litten it wachtwurd yn."
+
+#~ msgid "Other.."
+#~ msgstr "Oars..."
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Ynklusief %i triemen"
+
+#~ msgid "Filters"
+#~ msgstr "Filters"
+
+#~ msgid "State"
+#~ msgstr "Steat"
+
+#~ msgid "no label"
+#~ msgstr "gjin label"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torrent is foarbij stopratio."
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Dizze feroarings binne opslein"
+
+#~ msgid "Config"
+#~ msgstr "Config"
+
+#~ msgid "Connect"
+#~ msgstr "Ferbine"
+
+#~ msgid "About"
+#~ msgstr "Oer"
+
+#~ msgid "Logout"
+#~ msgstr "Ofmelde"
+
+#~ msgid "Statistics"
+#~ msgstr "Statistyken"
+
+#~ msgid "Details"
+#~ msgstr "Details"
+
+#~ msgid "Files"
+#~ msgstr "Triemen"
+
+#~ msgid "Add"
+#~ msgstr "Tafoegje"
+
+#~ msgid "Delete"
+#~ msgstr "Fuortsmite"
+
+#~ msgid "Stop"
+#~ msgstr "Stoppe"
+
+#~ msgid "Start"
+#~ msgstr "Starte"
+
+#~ msgid "Queue Top"
+#~ msgstr "Boppekant rij"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Ûnderkant rij"
+
+#~ msgid "Move"
+#~ msgstr "Ferplaatse"
+
+#~ msgid "Reannounce"
+#~ msgstr "Opnij oankondigje"
+
+#~ msgid "Recheck"
+#~ msgstr "Opnij kontroleare"
+
+#~ msgid "Ports"
+#~ msgstr "Poartten"
+
+#~ msgid "From"
+#~ msgstr "Fan"
+
+#~ msgid "To"
+#~ msgstr "Nei"
+
+#~ msgid "Random"
+#~ msgstr "Willekeurich"
+
+#~ msgid "Extra's"
+#~ msgstr "Ekstra's"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Mainline DHT"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Peers útwikselje"
+
+#~ msgid "Encryption"
+#~ msgstr "Fersiifering"
+
+#~ msgid "Forced"
+#~ msgstr "Forsearre"
+
+#~ msgid "Disabled"
+#~ msgstr "Útskeakele"
+
+#~ msgid "Handshake"
+#~ msgstr "Fûskjen"
+
+#~ msgid "Either"
+#~ msgstr "Beide"
+
+#~ msgid "Inbound"
+#~ msgstr "Yngeand"
+
+#~ msgid "Outbound"
+#~ msgstr "Útgeand"
+
+#~ msgid "Level"
+#~ msgstr "Nivo"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 mei auth"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP mei auth"
+
+#~ msgid "Type"
+#~ msgstr "Soart"
+
+#~ msgid "Port"
+#~ msgstr "Poartte"
+
+#~ msgid "Username"
+#~ msgstr "Brûkersnamme"
+
+#~ msgid "Password"
+#~ msgstr "Wachtwurd"
+
+#~ msgid "Global"
+#~ msgstr "Algemien"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Maks ferbiningen"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Maks delhelsnelheid (Kib/s)"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Maks uploadsnelheid (Kib/s)"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Maks uploadplakken"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Maks heal-iepene ferbiningen"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Maks ferbiningsoanfragen per sekonde"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Per Torrent"
+
+#~ msgid "Download"
+#~ msgstr "Delhelje"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Alle delhelle triemen bewarje yn"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr ".torrent triemen opslaan nei"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Map automatysk tafoegje"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Automatysk tafoegje ynskeakele"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Earste en lêste dielen foarrang jaan"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr ""
+#~ "Start de daemon en webui opnij op nei it feroarjen fan dizze ynstellins"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Seed stopje bij ratio"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Torrent fuortsmite bij ratio"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Ynskeakele ynstekkers"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Fier in list yn."
+
+#~ msgid "Unknown"
+#~ msgstr "Ûnbekind"
+
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgid "No"
+#~ msgstr "Nee"
+
+#~ msgid "This field is required."
+#~ msgstr "Dit fjild is nedich."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Fier in jildige wearde yn."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Fier in folledich nûmer yn."
+
+#~ msgid "Enter a number."
+#~ msgstr "Fier in nûmer yn."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Fier in jildige datum yn."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Fier in jildige tiid yn."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Fier in jildige datum/tiid yn."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Fier in jildich email-adres yn."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Der is gjin triem opstjoerd."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "It opstjoerde triem is leech."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Fier in jildige URL yn."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Dizze URL liket kapot."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Fier in jildich IPv4-adres yn."
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "refresh must be > 0"
+
+#~ msgid "no uri"
+#~ msgstr "gjin uri"
+
+#~ msgid "Move To"
+#~ msgstr "Ferplaatse nei"
+
+#~ msgid "Error in Path."
+#~ msgstr "Flater yn paad."
+
+#~ msgid "Template"
+#~ msgstr "Template"
+
+#~ msgid "Text and image"
+#~ msgstr "Tekst en plaatsje"
+
+#~ msgid "Image Only"
+#~ msgstr "Allinich plaatsje"
+
+#~ msgid "Text Only"
+#~ msgstr "Allinnich tekst"
+
+#~ msgid "Button style"
+#~ msgstr "Knopstyl"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Automatysk ferfarksje (sekonden)"
+
+#~ msgid "Cache templates"
+#~ msgstr "Templates foarlade"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Start de webui hânmatich op'e nij om de feroarings ta te passen."
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Sertifikaat net fûn op '%s'"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Kaai net fûn op '%s'"
+
+#~ msgid "Current Password"
+#~ msgstr "Ynsteld wachtwurd"
+
+#~ msgid "New Password"
+#~ msgstr "Nij wachtwurd"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Nij wachtwurd (befestigje)"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "It âlde wachtwurd is net jildich."
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "It nije wachtwurd is net gelyk mei de befestiging."
+
+#~ msgid "Sidebar"
+#~ msgstr "Sydbalke"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Sydbalke sjen litte"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Nul hits sjen litte"
+
+#~ msgid "Show trackers"
+#~ msgstr "Trackers sjen litte"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Limyt delhelsnelheid"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Limyt uploadsnelheid"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Seed stopje bij ratio"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Flater yn torrentopsjes."
+
+#~ msgid "Download Location"
+#~ msgstr "Lokaasje"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Lyts allokeare"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Yn pauzearde steat tafoegje"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Torrent uploade"
+
+#~ msgid "No data"
+#~ msgstr "Gjin ynformaasje"
+
+#~ msgid "# Of Files"
+#~ msgstr "# triemen"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... en alle triemen fuortsmite"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... en delhelle triemen fuortsmite"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... en torrenttriem fuortsmite"
+
+#~ msgid "Admin"
+#~ msgstr "Admin"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Automatysk ferfarskje:"
+
+#~ msgid "Ava"
+#~ msgstr "Bsk"
+
+#~ msgid "Cancel"
+#~ msgstr "Ôfbrekke"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Ferbine mei daemon"
+
+#~ msgid "Connected to"
+#~ msgstr "Ferbûn mei"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Ferbiningsbeperking"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "Dl snelheidslimyt"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr ".torrent triem fuortsmite"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Delhelle triemen fuortsmite"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge: Torrentlist"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge Login"
+
+#~ msgid "Disable"
+#~ msgstr "Útskeakelje"
+
+#~ msgid "Disk Space"
+#~ msgstr "Skiifromte"
+
+#~ msgid "Do not download"
+#~ msgstr "Net delhelje"
+
+#~ msgid "Eta"
+#~ msgstr "Eta"
+
+#~ msgid "False"
+#~ msgstr "Net wier"
+
+#~ msgid "File"
+#~ msgstr "Triem"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Op in kaaiwurd filterje"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Opnij kontroleare"
+
+#~ msgid "From Session"
+#~ msgstr "Fan sesje"
+
+#~ msgid "From Url"
+#~ msgstr "Fan URL"
+
+#~ msgid "General"
+#~ msgstr "Algemien"
+
+#~ msgid "High priority"
+#~ msgstr "Hege prioriteit"
+
+#~ msgid "Highest priority"
+#~ msgstr "Heechste prioriteit"
+
+#~ msgid "Keyword"
+#~ msgstr "Kaaiwurd"
+
+#~ msgid "Label torrent"
+#~ msgstr "Label torrent"
+
+#~ msgid "Login"
+#~ msgstr "Login"
+
+#~ msgid "Move torrent"
+#~ msgstr "Torrent ferplaatse"
+
+#~ msgid "Next Announce"
+#~ msgstr "Folgende oankondiging"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Gjin yngeande ferbinings"
+
+#~ msgid "Normal priority"
+#~ msgstr "Normaal"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Net ferbûn mei in daemon"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Wachtwurd is net jildich"
+
+#~ msgid "Pause all"
+#~ msgstr "Alles skofstje"
+
+#~ msgid "Pieces"
+#~ msgstr "Dielen:"
+
+#~ msgid "Queue Position"
+#~ msgstr "Plak yn rij"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Pagina ferfarskje:"
+
+#~ msgid "Restart"
+#~ msgstr "Opnij starte"
+
+#~ msgid "Resume all"
+#~ msgstr "Alles ferfetsje"
+
+#~ msgid "Save"
+#~ msgstr "Opslaan"
+
+#~ msgid "Search"
+#~ msgstr "Sykje"
+
+#~ msgid "Seed rank"
+#~ msgstr "Seedrang"
+
+#~ msgid "Seeding time"
+#~ msgstr "Seedtiid"
+
+#~ msgid "Select All"
+#~ msgstr "Alles selekteare"
+
+#~ msgid "Set"
+#~ msgstr "Ynstelle"
+
+#~ msgid "Speed"
+#~ msgstr "Snelheid"
+
+#~ msgid "Submit"
+#~ msgstr "Opstjoere"
+
+#~ msgid "Torrent list"
+#~ msgstr "Torrentlist"
+
+#~ msgid "Total Size"
+#~ msgstr "Totale grutte"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Trackersteat"
+
+#~ msgid "True"
+#~ msgstr "Wier"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "Limyt uploadsnelheid"
+
+#~ msgid "Update"
+#~ msgstr "Bijwurkje"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Tracker bijwurkje"
+
+#~ msgid "Upload"
+#~ msgstr "Upload"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Limyt uploadplakken"
+
+#~ msgid "seconds"
+#~ msgstr "sekonden"
diff --git a/deluge/i18n/gl.po b/deluge/i18n/gl.po
new file mode 100644
index 0000000..685bdc9
--- /dev/null
+++ b/deluge/i18n/gl.po
@@ -0,0 +1,6195 @@
+# Galician translation for deluge
+# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2018-04-23 01:39+0000\n"
+"Last-Translator: Marcos Lans <Unknown>\n"
+"Language-Team: Galician <gl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+"X-Poedit-Language: Galician\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr ""
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr ""
+
+#: deluge/common.py:410
+msgid "K"
+msgstr ""
+
+#: deluge/common.py:411
+msgid "M"
+msgstr ""
+
+#: deluge/common.py:412
+msgid "G"
+msgstr ""
+
+#: deluge/common.py:413
+msgid "T"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr ""
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr "Erro"
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr "Nome"
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr "Progreso"
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr "Estado"
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr "Tamaño"
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr "Taxa"
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr "Velocidade de descarga"
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr "Velocidade de envío"
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr "Pares"
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr "Dispoñíbel"
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr "Engadido"
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr "Localizador"
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr "Tempo estimado"
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr "Priorizar primeira/última"
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr "Xestión automática"
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr ""
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr "Aviso"
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr "Anuncio correcto"
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr "Anuncio enviado"
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr "Interface"
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr "Descargas"
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr "Largura de banda"
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr "Cola"
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr "Rede"
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr "Proxy"
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr "Caché"
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr "Outros"
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr "Daemon"
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr "Engadidos"
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr "Afganistán"
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr "Illas Aland"
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr "Albania"
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr "Alxeria"
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr "Samoa Americana"
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr "Antártida"
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr "Antiga e Barbuda"
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr "A Arxentina"
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr "Armenia"
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr "Australia"
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr "Austria"
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr "Azerbaidján"
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr "Bahamas"
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr "Bahrain"
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr "Bangladesh"
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr "Bielorrusia"
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr "Bélxica"
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr "Benín"
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr "Bermudas"
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr "Bolivia"
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnia e Hercegovina"
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr "Illa Bouvet"
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr "O Brasil"
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr "Territorio Británico no Océano Ãndico"
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr "Sultanato de Brunei"
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr "Bulgaria"
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr "Cambodja"
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr "O Camerún"
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr "Canadá"
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr "Cabo Verde"
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr "Illas Caimán"
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr "A República Centroafricana"
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr "O Chad"
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr "Chile"
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr "A China"
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr "Illa de Christmas"
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr "Illas Cocos (Keeling)"
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr "Colombia"
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr "Comores"
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr "O Congo"
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr "Congo, República Democrática do"
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr "Illas Cook"
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr "Costa do Marfil"
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr "Croacia"
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr "Cuba"
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr "Chipre"
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr "República Checa"
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr "Dinamarca"
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr "Djibuti"
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr "A Dominica"
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr "A República Dominicana"
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr "O Ecuador"
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr "Exipto"
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr "O Salvador"
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr "A Guinea Ecuatorial"
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr "Estonia"
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr "Etiopia"
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr "Illas Malvinas"
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr "Illas Feroe"
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr "Fiji"
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr "Finlandia"
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr "Francia"
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr "Güiana Francesa"
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr "Polinesia Francesa"
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr "Territorios Franceses do Sur"
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr "O Gabón"
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr "Xeorxia"
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr "Alemaña"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Xibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Grecia"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Groenlandia"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Granada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadalupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "A Guinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "A Guinea Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Güiana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Illa Heard e Illas McDonald"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Santa Sé (Cidade Estado do Vaticano)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Hungría"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Islandia"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "A India"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonesia"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Irán"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Iraq (O)"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Irlanda"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Illa de Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Israel"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italia"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Xamaica"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "O Xapón"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Illa de Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Xordania"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazakhstán"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenya"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Corea, República Democrática Popular de"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Corea, República de"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuwait"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kirguizstán"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "República Democrática Popular de Laos"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Letonia"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "O Líbano"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberia"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "República Ãrabe Libia"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Lituania"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luxemburgo"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macau"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Macedonia"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagascar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malasia"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Illas Maldivas"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Illas Marshall"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "A Martinica"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauritania"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauricio"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "México"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "A Micronesia, Estados Federados de"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldavia"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Mónaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolia"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Montenegro"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Illa de Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Marrocos"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambique"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Myanmar"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "O Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Os Países Baixos"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "As Antillas Holandesas"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Nova Caledonia"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Nova Zelandia"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Níxer"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nixeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Illa Norfolk"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Illas Marianas do Norte"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Noruega"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Omán"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Paquistán"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Territorios Palestinos"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panamá"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papúa-Nova Guinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "O Paraguai"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "O Perú"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Illas Filipinas"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Illas Pitcairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Polonia"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugal"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Porto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Qatar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "A Reunión"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Romania"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Rusia"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Rwanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Saint-Barthelemy"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Santa Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Saint Kitts e Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Santa Lucía"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Saint-Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint-Pierre-et-Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "San Vicente e As Granadinas"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "San Tomé e Príncipe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Arabia Saudí"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "O Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbia"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Illas Seychelles"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Serra Leoa"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapur"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Eslovaquia"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Eslovenia"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Illas Salomón"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Suráfrica"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Xeorxia do Sur e as Illas Sandwich do Sur"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "España"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudán"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Suriname"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Illas Svalbard e Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Swazilandia"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Suecia"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Suíza"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Siria"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tadjikistán"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzania"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Thailandia"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Timor Leste"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trindad e Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunisia"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Turquía"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistán"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Illas Turcas e Caicos"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ucraína"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Os Emiratos Ãrabes Unidos"
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "O Reino Unido"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Estados Unidos"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Illas Exteriores Menores dos EEUU"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "O Uruguai"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Uzbekistán"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "O Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Illas Virxes, Británicas"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Illas Virxes, U.S."
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Ilas de Wallis e Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "O Sáhara"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "O Iemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabwe"
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr "O daemon non se está executando"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr "Nome do ficheiro"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr "Grupo"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr "Seleccionar un ficheiro"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr "Seleccionar un cartafol"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr "Gardar o ficheiro .torrent"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr "Ficheiros torrent"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr "Todos os ficheiros"
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr "Servidor:"
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr "Ficheiro incorrecto"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr "Escoller un ficheiro .torrent"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr "URL incorrecto"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr "Produciuse un fallo na descarga"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr "Información:"
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr "Nome do usuario:"
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr "Contrasinal:"
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr "Outros..."
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr "Desconectado"
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr "Nodos DHT"
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr "Prioridade"
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr "E_stado"
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr "_Detalles"
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr "Fic_heiros"
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr "_Pares"
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr "_Opcións"
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr "Sen límite"
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr "Descargar"
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr "Subir"
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr "Fóra de liña"
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr "En liña"
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr "Conectado"
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr "Produciuse un erro ao engadir o servidor"
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr "Activado"
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr "Engadido"
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr "Seleccionar o engadido"
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr "Engadido Eggs"
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr "Localizadores"
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr "Ningunha"
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr " Torrents na cola"
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr " Torrent na cola"
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr "Estabelecer ilimitado"
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr "Activado"
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr "Desactivado"
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr "Enderezo"
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr "Cliente"
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr "Creando un torrent"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr "Torrents na cola"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr "Elimina_r"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr "Engadir automaticamente os torrents ao conectar"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr "_Ficheiro"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr "_Engadir torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr "_Crear torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr "_Editar"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr "Xestor de _conexión"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr "_Ver"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr "_Barra de ferramentas"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr "Barra _lateral"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr "Barra de _estado"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr "Lapel_as"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr "_Columnas"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr "Barra _lateral"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr "Mostrar _cero accesos"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr "Mostrar _localizadores"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr "_Axuda"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr "Preguntas frecuentes"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr "Engadir torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr "Engadir torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr "Eliminar torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr "Pausar os torrents seleccionados"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr "Pausar"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr "Continuar os torrents seleccionados"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr "Continuar"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr "Subir torrent na cola"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr "Subir na cola"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr "Baixar torrent na cola"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr "Baixar na cola"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr "Preferencias"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr "Xestor de conexión"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr "Mostrar a velocidade da sesión na barra de título"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr "Activar a icona na área de notificación"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr "Minimizar na área de notificación ao pechar"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr "Iniciar na área de notificación"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr "Protexer a área de notificación con contrasinal"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr "Mover os completados a:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr "Copiar os ficheiros .torrent en:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr "Descargar en:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Priorizar a primeira e a última parte do torrent"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Priorizar a primeira e a última parte dos ficheiros no torrent"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr "Engadir os torrents en pausa"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr "Mostrar sempre"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr "Poñer o foco sobre o diálogo"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+"Número máximo de conexións permitidas. Estabelecer -1 para ilimitado."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr "Conexións:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Slots máximos de envío para todos os torrents. Estabelecer -1 para ilimitado."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Velocidade máxima de descarga para todos os torrents. Estabelecer -1 para "
+"ilimitada."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr "Velocidade de descarga:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Velocidade máxima de envío para todos os torrents. Estabelecer -1 para "
+"ilimitado."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr "Velocidade de envío:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr "Ignorar os límites na rede local"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr "Límite da taxa de sobrecarga IP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Se se selecciona, a estimación da sobrecarga de TCP/IP obterase desde os "
+"limitadores da taxa para evitar que se excedan os límites co tráfico total"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr "Slots máximos de envío por torrent. Estabelecer -1 para ilimitado."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"Número máximo de conexións por torrent. Estabelecer -1 para ilimitado."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr "Porto activo:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr "Probar porto activo"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr "Desde:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr "Até:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr "Nivel:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr "Protocolo de mapeamento de portos NAT"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr "Intercambio de pares"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "O Servizo local de buscas (LSD) procura pares locais na súa rede."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+"Unha táboa hash distribuída pode mellorar a cantidade de conexións activas."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr "Byte TOS de par:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr "Nome do servidor:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr "Porto:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Tamaño da caché (bloques de 16 KiB):"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Número de segundos desde a última escritura na caché dunha parte do torrent "
+"até o momento en que se forza a escritura no disco. O valor predeterminado é "
+"de 60 segundos."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr "A caché caduca en (segundos):"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"Número total de bloques de 16 KiB escritos no disco desde que se iniciou "
+"esta sesión."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr "Bloques escritos:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"Número total de operacións de escritura realizadas desde que se iniciou esta "
+"sesión."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr "Escrituras:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"A proporción (bloques_escritos - escrituras) / bloques_escritos representa o "
+"número de operacións de escritura de gardado para o total das operacións de "
+"escritura, é dicir, unha especie de taxa de accesos á caché para a caché de "
+"escritura."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr "Taxa de accesos á caché de escritura:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Número de bloques solicitados desde o motor do bittorrent (desde os pares), "
+"que se serviron desde o disco ou da memoria caché."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr "Bloques lidos:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr "Número de bloques que se serviron desde a caché."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr "Eventos de lectura de bloques:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr "Taxa de accesos á caché para lectura."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr "Taxa de accesos á caché de lectura:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+"Número total de operacións de lectura realizadas desde que se iniciou esta "
+"sesión."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr "Lecturas:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Número de bloques de 16 KiB actualmente na caché de disco. Isto inclúe tanto "
+"a lectura como a escritura na caché."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr "Tamaño da caché:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr "Tamaño da caché de lectura:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Axúdenos a mellorar Deluge enviándonos a súa versión de Python, PyGTK, "
+"sistema operativo e o tipo de procesador. Non se envía, absolutamente, "
+"ningunha outra información."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr "Si, enviar estatísticas anónimas"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr "Localización:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Se Deluge non e quen de atopar o ficheiro da base de datos nese lugar, "
+"volverá utilizar o DNS para atopar o país do par."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr "Porto do daemon:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr "Permitir conexións remotas"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr "Conexións"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr "Comprobar periodicamente no sitio web se hai novas edicións"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr "Versión:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr "Autor:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr "Páxina principal:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr "Correo-e do autor:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr "Información"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr "Engadir un par"
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr "nomedoservidor:porto"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr "<b>Xeral</b>"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr "Engadir hash"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr "Información do «hash»:"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr "Localizadores:"
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr "Engadir un servidor"
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr "Destino:"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr "Nova versión"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr "_Ir á páxina web"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr "Non mostrar este dialogo no futuro"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr "Nome:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr "Comentarios:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr "Mover os completados a:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr "Deter a sementeira na taxa:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr "Eliminar coa taxa"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr "_Editar localizadores"
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr "Engadir torrents"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr "información do «_hash»"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr "Engadir en _pausa"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr "Priorizar primeira/última partes"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr "Aplicar a todo"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr "Reverter a predeterminados"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr "_Mostrar Deluge"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr "Velocidade límite de _descarga"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr "Velocidade límite de _envío"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr "Saír e apagar o daemon"
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr "Editar localizadores"
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr "Engadir un par polo seu IP"
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr "Editar localizador"
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr "Localizador:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr "Introducir a ruta remota"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr "Ruta:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr "Crear un torrent"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr "_Cartafol"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr "_Ruta remota"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr "Sementes web"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr "Tamaño das partes:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr "Estabelecer marca privada"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr "Engadir este torrent á sesión"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr "Opcións"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr "Gardar o .torrent como"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr "Co_ntinuar"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr "Continuar os torrents seleccionados."
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr "Opc_ións"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr "C_ola"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr "Act_ualizar o localizador"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr "_Eliminar torrent"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr "_Forzar unha nova comprobación"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr "etiqueta"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr "_Seleccionar todo"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr "_Pausar todos"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr "Con_tinuar todo"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr "Límite de _conexións"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr "Límite de _slots de envío"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr "_Xestión automática"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr "Engadir un localizador"
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr "Engadir URL"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr "_Expandir todo"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr "Orde"
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr "Utilizar portos aleatorios"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr "Lista de IP de Emule (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr "Texto SafePeer (comprimido en zip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "Texto de PeerGuardian (descomprimido)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr "Lista de bloqueados"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr "Líder incorrecto"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr "Código máxico incorrecto"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr "Versión incorrecta"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr "Días"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr "Comprobar se hai unha lista nova cada:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr "Importar a lista de bloqueados ao iniciar"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr "<b>Configuracións</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+"Descargar o ficheiro coa lista de bloqueados, se é necesario, e importar o "
+"ficheiro."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr "Comprobar a descarga e importar"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr "Descargar un novo ficheiro coa lista de bloqueados e importalo."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr "Forzar a descarga e importar"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr "A lista de bloqueados está actualizada"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr "<b>Opcións</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr "Tipo:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr "Data:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr "Tamaño do ficheiro:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr "<b>Información</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr "Torrent completado"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr "Torrent engadido"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr "Executar"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr "Aviso"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr "<b>Engadir orde</b>"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr "<b>Ordes</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr "Seleccionar un cartafol"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr "Velocidade máxima de envío:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr "Conexións máximas:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr "Slots máximos de envío:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr "Velocidade máxima de descarga:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Largura de banda</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr "<b>Cola</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr "Activar a interface web"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr "Activar SSL"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr "Porto de escoita:"
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+"A etiqueta é incorrecta, só están permitidos os caracteres:[a-z0-9_-]"
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr "Etiqueta baleira"
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr "A etiqueta xa existe"
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr "Etiqueta descoñecida"
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr "Torrent descoñecido"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr "_Opcións de etiqueta"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr "Elimina_r etiqueta"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr "_Engadir etiqueta"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr "Opcións de etiquetas"
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr "Etiqueta"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr "<b>Opcións de etiquetas</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr "Aplicar axustes máximos por torrent:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr "Máximo"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr "Aplicar os axustes da cola:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 liña por localizador)</i>"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr "Aplicar automaticamente a etiqueta:"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr "Engadir etiqueta"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr "<b>Engadir etiqueta</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Usar a barra lateral para engadir, editar e eliminar etiquetas. </I>\n"
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr "<b>Etiquetas</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr "Extraer en:"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr "Crear un sub-cartafol co nome do torrent"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Esta opción creará un subcartafol co nome do torrent dentro do cartafol "
+"seleccionado. Neste subcartafol extraerá os ficheiros."
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr "Límite de descarga:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr "Límite de envío:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr "Torrents activos:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Configuración lenta</b>"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr "Servidor:"
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr "Estabelecer o máximo de conexións"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr "Velocidade de descarga"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr "Estabelecer a velocidade máxima de descarga"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr "Velocidade de envío"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr "Estabelecer a velocidade máxima de envío"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr "Tráfico do protocolo descargar/enviar"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr "Filtros"
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr "Privado"
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr "Avisarme das novas edicións"
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr "Conexións máximas:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Velocidade máxima de descarga (KiB/s):"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Velocidade máxima de envío (KiB/s):"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr "Conexións máximas semi-abertas:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Intentos máximos de conexión por segundo:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr "Slots máximos de envío:"
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
+
+#~ msgid "_Normal Priority"
+#~ msgstr "Prioridade _normal"
+
+#~ msgid "_High Priority"
+#~ msgstr "Prioridade _alta"
+
+#~ msgid "Associate Magnet links with Deluge"
+#~ msgstr "Asociar ligazóns Magnet con Deluge"
diff --git a/deluge/i18n/he.po b/deluge/i18n/he.po
new file mode 100644
index 0000000..42e4141
--- /dev/null
+++ b/deluge/i18n/he.po
@@ -0,0 +1,6147 @@
+# Hebrew translation for deluge
+# Copyright (c) 2018 Rosetta Contributors and Canonical Ltd 2018
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2018-02-27 08:53+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Hebrew <he@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr ""
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr ""
+
+#: deluge/common.py:410
+msgid "K"
+msgstr ""
+
+#: deluge/common.py:411
+msgid "M"
+msgstr ""
+
+#: deluge/common.py:412
+msgid "G"
+msgstr ""
+
+#: deluge/common.py:413
+msgid "T"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr ""
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr ""
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr ""
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
diff --git a/deluge/i18n/hi.po b/deluge/i18n/hi.po
new file mode 100644
index 0000000..94babc1
--- /dev/null
+++ b/deluge/i18n/hi.po
@@ -0,0 +1,4636 @@
+# Hindi translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2010-06-22 13:19+0000\n"
+"Last-Translator: abhishek <Unknown>\n"
+"Language-Team: Hindi <hi@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "होसà¥à¤Ÿà¤¨à¥‡à¤®:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "पोरà¥à¤Ÿà¤ƒ"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "उपयोगकरà¥à¤¤à¤¾ का नाम:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "पासवरà¥à¤¡:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "दà¥à¤µà¤¾à¤°à¤¾:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "सकà¥à¤°à¤¿à¤¯ किया"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "à¤à¤• फ़ोलà¥à¤¡à¤° चà¥à¤¨à¥‡à¤‚"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>डाउनलोड सà¥à¤¥à¤¾à¤¨</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "अधिकतम अपलोड गति:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "अधिकतम समà¥à¤¬à¤¨à¥à¤§:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "अधिकतम अपलोड सà¥à¤²à¥‰à¤Ÿà¥à¤¸à¤ƒ"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "अधिकतम डाउनलोड गति:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>बैंडविडà¥à¤¥</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "सीड रोकें इस अनà¥à¤ªà¤¾à¤¤ पर"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "हटायें इस अनà¥à¤ªà¤¾à¤¤ पर"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "ऊपर"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "निचला"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>कतार</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "विकलà¥à¤ª"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "अवैध लेबल, मानà¥à¤¯ चिनà¥à¤¹:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "खाली लेबल"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "लेबल का असà¥à¤¤à¤¿à¤¤à¥à¤µ पहले से है"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "अजà¥à¤žà¤¾à¤¤ लेबल"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "अजà¥à¤žà¤¾à¤¤ टॉरेंट"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "लेबल"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "लेबल विकलà¥à¤ª (_O)"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "लेबल हटायें (_R)"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "लेबल जोड़ें (_A)"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "लेबल विकलà¥à¤ª"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>लेबल के विकलà¥à¤ª</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "अपलोड सà¥à¤²à¥‰à¤Ÿà¤¸à¥:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "अपलोड गतिः"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "डाउनलोड गति:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "कनेकà¥à¤¸à¤‚स"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• टोरेनà¥à¤Ÿ की अधिकतम योजना लगाà¤à¤‚:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "अधिकतम"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "अपने आप वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¿à¤¤"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "कतार सेटिंगà¥à¤¸ लागू करें:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "कतार"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "पूरà¥à¤£ हà¥à¤ को यहाठहटायें"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "सà¥à¤¥à¤¾à¤¨ सेटिंग लागू करें"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "सà¥à¤¥à¤¾à¤¨"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 line per tracker)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "अपने आप लेबल लगाà¤à¤‚"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "टà¥à¤°à¥ˆà¤•à¤°à¥à¤¸"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "लेबल जोड़ें"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>लेबल जोड़ें</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "नाम:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr "<i>साइडबार का उपयोग जोड़ने, संशोधन तथा हटाने के लिठकरें. <i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>लेबल</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "यहाठनिकालें:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "टॉरेंट के नाम का उप फोलà¥à¤¡à¤° बनायें"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"यह विकलà¥à¤ª चà¥à¤¨à¥‡ गये फोलà¥à¤¡à¤° के भीतर टॉरेंट के नाम का à¤à¤• उप फोलà¥à¤¡à¤° बनाकर फिर "
+"उसके अंदर निकाली गयी फिलों को रख देगा|"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>सामानà¥à¤¯</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>सेटिंग</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP सूची (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Text (Zipped)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Text (Uncompressed)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "अवैध नेता"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "अवैध जादू कोड"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "अमानà¥à¤¯ संसà¥à¤•à¤°à¤£"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "बà¥à¤²à¥‰à¤•à¤²à¤¿à¤¸à¥à¤Ÿ"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "यू आर à¤à¤² (URL):"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "दिन"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "नठलिसà¥à¤Ÿ के लिठजांचें पà¥à¤°à¤¤à¥à¤¯à¥‡à¤•:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "चालॠहोने पर बà¥à¤²à¥‰à¤•à¤²à¤¿à¤¸à¥à¤Ÿ आयात करें"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "आवशà¥à¤¯à¤• हो तो बà¥à¤²à¥‰à¤•à¤²à¤¿à¤¸à¥à¤Ÿ फ़ाइल डाउनलोड करें और फ़ाइल आयात करें."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "डाउनलोड और आयात जांचें"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "नया बà¥à¤²à¥‰à¤•à¤²à¤¿à¤¸à¥à¤Ÿ फ़ाइल डाउनलोड करें और आयात करें."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "बलपूरà¥à¤µà¤• डाउनलोड और आयात"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>विकलà¥à¤ª</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "पà¥à¤°à¤•à¤¾à¤°:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "तिथि:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "निशà¥à¤šà¤¿à¤¤ आकार:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>जानकारी</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "टोरेंट पà¥à¤°à¤¾ हà¥à¤†"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "टॉरेंट जà¥à¤¡à¤¼ गया"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "चलाà¤à¤"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "घटना"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "आदेश"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>आदेश जोड़ें</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>आदेश</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "घोषणा ठीक है"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "घोषणा भेजा"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "चेतावनी"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "तà¥à¤°à¥à¤Ÿà¤¿"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "पता"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "कà¥à¤²à¤¾à¤à¤‚ट"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "पà¥à¤°à¤—ति"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "अधो गति"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "उरà¥à¤§à¥à¤µ गति"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "टॉरेंट"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " टॉरेनà¥à¤Ÿà¥à¤¸ कतार में"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " टॉरेनà¥à¤Ÿ कतार में"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "असीमित"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "सकà¥à¤°à¤¿à¤¯ किया"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "अनà¥à¤¯..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "नीचे"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "ऊपर"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "डिलà¥à¤¯à¥‚ज"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "नीचे"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "ऊपर"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "अधिकतम डाउनलोड गति निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करें"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "अधिकतम अपलोड गति निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करें"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "टॉरेनà¥à¤Ÿ समापà¥à¤¤"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "डाउनलोडà¥à¤¸"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "नेटवरà¥à¤•"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "बेंडविडà¥à¤¥"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "इंटरफ़ेस"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "अनà¥à¤¯"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "डेमन"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "पà¥à¤°à¥‰à¤•à¥à¤¸à¥€"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "पà¥à¤²à¤—-इनà¥à¤¸"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "पà¥à¤²à¤—िन"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "पà¥à¤²à¤—िन चà¥à¤¨à¥‡"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "पà¥à¤²à¤—िन à¤à¤—à¥à¤¸ (Eggs)"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "फ़ाइलनाम"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "आकार"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "à¤à¤• .torrent फाइल चà¥à¤¨à¥‡à¤‚"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "टॉरेंट फाइलें"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "सभी फ़ाइलें"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Tier"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "टà¥à¤°à¥ˆà¤•à¤°"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "à¤à¤• फ़ाइल चà¥à¤¨à¥‡à¤‚"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "à¤à¤• फ़ोलà¥à¤¡à¤° चà¥à¤¨à¥‡à¤‚"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ".टॉरेनà¥à¤Ÿ फ़ाइल सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करें"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "जà¥à¤¡à¤¼à¤¾ हà¥à¤† नहीं है"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "संबंधन"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "डाउनलोड सà¥à¤ªà¥€à¤¡"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "अपलोड सà¥à¤ªà¥€à¤¡"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "पà¥à¤°à¥‹à¤Ÿà¥‹à¤•à¥‰à¤² टà¥à¤°à¥ˆà¤«à¤¿à¤• डाउनलोड/अपलोड"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT Nodes"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "आने वाले कोई जोड़ नहीं!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "अधिकतम समà¥à¤¬à¤¨à¥à¤§ निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करें"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "टॉरेनà¥à¤Ÿà¥à¤¸"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "लेबल"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "सभी"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "डाउनलोड किया जा रहा है"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "सीड किया जा रहा है"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "ठहराया हà¥à¤†"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "जाà¤à¤š की जा रही है"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "क़तार-बदà¥à¤§"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "कोई नहीं"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "कोई लेबल नहीं"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "होसà¥à¤Ÿ"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "चालू"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "बंद"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "असीमित करें"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "फ़ाइलें सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करने के लिठà¤à¤• निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ चà¥à¤¨à¥‡à¤‚"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "अधिकतम अपलोड सà¥à¤²à¥‰à¤Ÿ तय करें"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•à¤¤à¤¾"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "विवरण:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "नाम"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "डाउनलोड की गयी"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "अपलोडेड"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "सीडरà¥à¤¸"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "पीयरà¥à¤¸"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "इ टी ठ(E T A)"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "अनà¥à¤ªà¤¾à¤¤"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Avail"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "जोड़ा गया"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "फ़ाइल (_F)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "टॉरेनà¥à¤Ÿ जोडें"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "टॉरेनà¥à¤Ÿ बनाà¤à¤‚(_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "संशोधन (_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "कनेकà¥à¤¸à¤¨ मैनेजर (_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "टॉरेनà¥à¤Ÿ (_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "देखें (_V)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "उपकरण-पटà¥à¤Ÿà¥€ (_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "किनारे की पटà¥à¤Ÿà¥€ (_S)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Status_bar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "T_abs"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Columns"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "बाजूपटà¥à¤Ÿà¥€ (_S)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Show _Zero Hits"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "टà¥à¤°à¥ˆà¤•à¤°à¥à¤¸ दिखाà¤à¤ (_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_सहायता"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "बारमà¥à¤¬à¤¾à¤° पूछने वाले पà¥à¤°à¤¶à¥à¤¨"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "टॉरेनà¥à¤Ÿ जोड़ें"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "टॉरेनà¥à¤Ÿ जोड़ें"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "टॉरेनà¥à¤Ÿ हटाà¤à¤"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "टॉरेनà¥à¤Ÿ हटाइये"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "चà¥à¤¨à¥‡ हà¥à¤ टॉरेनà¥à¤Ÿà¥à¤¸ को विराम करें"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "ठहरें"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "चà¥à¤¨à¥‡ हà¥à¤ टॉरेनà¥à¤Ÿà¥à¤¸ को रिजà¥à¤¯à¥‚म विराम करें"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "पà¥à¤¨à¤ƒ आरमà¥à¤­ करें"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "टॉरेनà¥à¤Ÿ कतार में ऊपर करें"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "कतार में ऊपर"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "टॉरेनà¥à¤Ÿ कतार में नीचे करें"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "कतार में नीचे"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "वरीयता"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "कनेकà¥à¤¶à¤¨ पà¥à¤°à¤¬à¤‚धक"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "सभी का विसà¥à¤¤à¤¾à¤° करें (_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_डाउनलोड नहीं करें"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "सामानà¥à¤¯ पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•à¤¤à¤¾ (_N)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "उचà¥à¤š पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•à¤¤à¤¾ (_H)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "उचà¥à¤šà¤¤à¤® पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•à¤¤à¤¾ (_H)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>सà¥à¤µ निरà¥à¤§à¤¾à¤°à¤£:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>सीड कà¥à¤°à¤®:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>सीडिंग समय:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>सकà¥à¤°à¤¿à¤¯ समय:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>टà¥à¤°à¥ˆà¤•à¤° अवसà¥à¤¥à¤¾:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>उपलबà¥à¤§à¤¤à¤¾:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>पीयरà¥à¤¸:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>सीडरà¥à¤¸:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Pieces:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>ETA:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Next Announce:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Share अनà¥à¤ªà¤¾à¤¤:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>अपलोड किया :</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>डाउनलोड किया :</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Date Added:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "अवसà¥à¤¥à¤¾ (_S)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># of files:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>टà¥à¤°à¥ˆà¤•à¤° :</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>कà¥à¤² आकार:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>नाम:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b> पथ</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>अवसà¥à¤¥à¤¾:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "विवरण (_D)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "फ़ाइलें (_F)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "पीयरà¥à¤¸ (_P)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "पूरà¥à¤£ होने पर यहाठले जाà¤à¤:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "निजी"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Prioritize First/Last"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_संशोधन टà¥à¤°à¥ˆà¤•à¤°"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "विकलà¥à¤ª (_O)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "टॉरेनà¥à¤Ÿ हटायें?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+"<big><b>कà¥à¤¯à¤¾ आप निशà¥à¤šà¤¿à¤¨à¥à¤¤ हैं की आप चà¥à¤¨à¥‡ हà¥à¤ टॉरेनà¥à¤Ÿ को मिटाना चाहते "
+"हैं?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>संयà¥à¤•à¥à¤¤ टॉरेनà¥à¤Ÿ मिटा दिया जायगा !</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>डाउनलोड किया हà¥à¤¯à¤¾ डाटा मिटा दिया जायगा !</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "चà¥à¤¨à¤¾ हà¥à¤† टॉरेनà¥à¤Ÿ हटायें"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "नया रिलीज़"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>नया संसà¥à¤•à¤°à¤£ उपलबà¥à¤§!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>उपलबà¥à¤§ संसà¥à¤•à¤°à¤£:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>वरà¥à¤¤à¤®à¤¾à¤¨ संसà¥à¤•à¤°à¤£:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "यह डायलोग भविषà¥à¤¯ में न दिखाà¤à¤"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "वेबसाईट में जाà¤à¤ (_G)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "कोई पीयर उसकी IP की सहायता से जोड़ें"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "सभी चà¥à¤¨à¥‡à¤‚(_S)"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "सभी विराम (_P)"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Resume selected torrents."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Resu_me All"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "टॉरेनà¥à¤Ÿ जोड़ें"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "यूआरà¤à¤²(_U)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "हटाà¤à¤ (_R)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>टॉरेनà¥à¤Ÿ </b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "फ़ाइलें (_l)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "पूरà¥à¤£"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "सघन"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>साà¤à¤¾</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "अधिकतम डाउनलोड गति"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "अधिकतम उपरी गति:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "विराम अवसà¥à¤¥à¤¾ में जोड़ें"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Prioritize First/Last Pieces"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Revert To Defaults"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "सभी में लागू करें"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "यॠआर à¤à¤² जोड़ें"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>यॠआर à¤à¤² से</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Infohash जोड़ें"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Infohash से</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "टà¥à¤°à¥ˆà¤•à¤°à¥à¤¸:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "टॉरेनà¥à¤Ÿ बनाà¤à¤‚"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>टॉरेनà¥à¤Ÿ बनाà¤à¤‚</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "फोलà¥_डर"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Remote पथ"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>फाइलें</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "लेखकः"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "टिपà¥à¤ªà¤£à¤¿à¤¯à¤¾à¤:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "जानकारी"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "वेबसीडà¥à¤¸"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Piece Size:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "सेट पà¥à¤°à¤¾à¤‡à¤µà¥‡à¤Ÿ फà¥à¤²à¥ˆà¤—"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "यह टॉरेनà¥à¤Ÿ सेशन में जोड़ें"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "रिमोट पथ डालें"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>रिमोट पथ</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "पथ:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "टॉरेनà¥à¤Ÿ निरà¥à¤®à¤¾à¤£ कर रहा है"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Save .torrent as"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>.torrent फ़ाइल सà¥à¤°à¤•à¥à¤·à¤¿à¤¤</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "टॉरेनà¥à¤Ÿà¥à¤¸ कतार में"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>कतार वाले टॉरेनà¥à¤Ÿà¥à¤¸ जोड़ें</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "कनेकà¥à¤Ÿ होने पर सà¥à¤µà¤¤à¤ƒ ही टॉरेनà¥à¤Ÿà¥à¤¸ जोड़ें"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "लेबल"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "पीयर जोड़ें"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>पीयर जोड़ें</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "होसà¥à¤Ÿà¤¨à¤¾à¤®:पोरà¥à¤Ÿ"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "होसà¥à¤Ÿ जोड़ें"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>कनेकà¥à¤¸à¤¨ मैनेजर</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "लोकल डीमान शà¥à¤°à¥‚ करें (_Start)"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Automatically connect to selected host on start-up"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "आवशà¥à¤¯à¤•à¤¤à¤¾ पड़ने पर लोकलहोसà¥à¤Ÿ अपने आप शà¥à¤°à¥‚ करें"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Do not show this dialog on start-up"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>विभिनà¥à¤¨ डाउनलोड </big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "यहाठसे अपनेआप टौरेंट जोड़ें:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "डाउनलोड करें :"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ".torrent फाइल की नक़ल करें:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>फोलà¥à¤¡à¤°</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "पूरà¥à¤£ साà¤à¤¾ उपयोग करें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "सघन साà¤à¤¾ उपयोग करें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Compact allocation only allocates space as needed"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Prioritize first and last pieces of torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Prioritize first and last pieces of files in torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big> नेटवरà¥à¤•</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "कà¥à¤°à¤®à¤¹à¥€à¤¨ पोरà¥à¤Ÿ उपयोग करें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge हर बार उपयोग के लिठकोई भी पोरà¥à¤Ÿ चà¥à¤¨ लेगा."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "सकà¥à¤°à¤¿à¤¯ पोरà¥à¤Ÿ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "पà¥à¤°à¤¤à¤¿:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "सकà¥à¤°à¤¿à¤¯ पोरà¥à¤Ÿ जांचें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>आगमन पोरà¥à¤Ÿ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>बहिरà¥à¤—मन (Outgoing) पोरà¥à¤Ÿ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Peer TOS Byte:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>टी ओ à¤à¤¸(TOS)</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "यॠपी à¤à¤¨ पी"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT पोरà¥à¤Ÿ मेपिंग पà¥à¤°à¥‹à¤Ÿà¥‹à¤•à¥‰à¤²"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "पीयर विनिमय"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "à¤à¤² à¤à¤¸ डी(LSD)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery finds local peers on your network."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "डी à¤à¤š टी"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "वितरित hash टेबल सकà¥à¤°à¤¿à¤¯ संबंधो को बà¥à¤¾ सकता है"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>नेटवरà¥à¤• भिनà¥à¤¨à¤¤à¤¾à¤à¤‚</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Inbound:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "सà¥à¤¤à¤°à¤ƒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"बलपूरà¥à¤µà¤•\n"
+"सकà¥à¤°à¤¿à¤¯\n"
+"निषà¥à¤•à¥à¤°à¤¿à¤¯"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Outbound:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Encrypt entire stream"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Encryption</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>बैनà¥à¤¡à¤µà¤¿à¤¡à¥à¤¥</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "संबंधो के लिठपà¥à¤°à¤¤à¤¿ सेकणà¥à¤¡ अधिकतम पà¥à¤°à¤¯à¤¤à¥à¤¨ संखà¥à¤¯à¤¾"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "अधिकतम आधे-खà¥à¤²à¥‡ समà¥à¤¬à¤¨à¥à¤§"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr "सभी टॉरेनà¥à¤Ÿà¥à¤¸ के लिठअधिकतम अपलोड गति. असीमित के लिठ-1 डालें."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "अधिकतम अपलोड गति (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "अधिकतम संबंधो की संखà¥à¤¯à¤¾. असीमित के लिठ-1 डालें."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "अधिकतम समà¥à¤¬à¤¨à¥à¤§:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr "सभी टॉरेनà¥à¤Ÿà¥à¤¸ के लिठअधिकतम अपलोड सà¥à¤²à¥‰à¤Ÿà¥à¤¸. असीमित के लिठ-1 डालें."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "अधिकतम अपलोड सà¥à¤²à¥Œà¤Ÿ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr "सभी टॉरेनà¥à¤Ÿà¥à¤¸ के लिठअधिकतम डाउनलोड गति. असीमित के लिठ-1 डालें."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "अधिकतम डाउनलोड गति (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "लोकल नेटवरà¥à¤• के लिठसीमाओं को नहीं मानिà¤"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Rate limit IP overhead"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>गà¥à¤²à¥‹à¤¬à¤² बैणà¥à¤¡à¤µà¤¿à¤¡à¥à¤¥ पà¥à¤°à¤¯à¥‹à¤—</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• टॉरेनà¥à¤Ÿ के लिठअपलोड सà¥à¤²à¥‰à¤Ÿà¥à¤¸ की अधिकतम संखà¥à¤¯à¤¾. असीमित के लिठ-1 "
+"डालें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• टॉरेनà¥à¤Ÿ के लिठसंबंधो की अधिकतम संखà¥à¤¯à¤¾. असीमित के लिठ-1 डालें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>पà¥à¤°à¤¤à¤¿ टॉरेनà¥à¤Ÿ बैणà¥à¤¡à¤µà¤¿à¤¡à¥à¤¥ पà¥à¤°à¤¯à¥‹à¤—</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Interface</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "सकà¥à¤°à¤¿à¤¯ करें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Classic Mode</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "titlebar में session गति दिखाà¤à¤"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>मà¥à¤–à¥à¤¯ विंडो </b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "हमेशा पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ करें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "डायलोग को फोकस में लायें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Add Torrents Dialog</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "सिसà¥à¤Ÿà¤® टà¥à¤°à¥‡ icon सकà¥à¤°à¤¿à¤¯ करें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "बंद करने पर सिसà¥à¤Ÿà¤®-टà¥à¤°à¥‡ में डालो"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "टà¥à¤°à¥‡ में शà¥à¤°à¥‚ करो"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "सिसà¥à¤Ÿà¤®-टà¥à¤°à¥‡ पासवरà¥à¤¡ से सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>सिसà¥à¤Ÿà¤®-टà¥à¤°à¥‡</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>दूसरा</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "नठरिलीज़ के लिठचौकस रहें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr "डिलà¥à¤¯à¥à¤œ अपने सरà¥à¤µà¤°à¥à¤¸ को जांच कर बताà¤à¤—ा यदि नया वरà¥à¤œà¤¼à¤¨ उपलबà¥à¤§ हो"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Updates</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "हाà¤, कृपया गà¥à¤®à¤¨à¤¾à¤® आकडे भेज दें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>सिसà¥à¤Ÿà¤® जानकारी</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>डीमॉन</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "डीमॉन पोरà¥à¤Ÿ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>पोरà¥à¤Ÿ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "रिमोट कनेकà¥à¤¸à¤‚स सà¥à¤µà¥€à¤•à¤¾à¤°à¥‡à¤‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>समà¥à¤¬à¤¨à¥à¤§</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "नठरिलीज़ के लिठवेबसाईट को समय समय पर जांचते रहें"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>अनà¥à¤¯</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>कतार</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "नठटॉरेनà¥à¤Ÿà¥à¤¸ को कतार में ऊपर लगाà¤à¤‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "कà¥à¤² सकà¥à¤°à¤¿à¤¯ सीडिंग:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "कà¥à¤² सकà¥à¤°à¤¿à¤¯:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "कà¥à¤² सकà¥à¤°à¤¿à¤¯ डाउनलोडिंग:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "धीमे टॉरेनà¥à¤Ÿà¥à¤¸ की गिनती नहीं करें:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>सकà¥à¤°à¤¿à¤¯ टॉरेनà¥à¤Ÿà¥à¤¸</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Share अनà¥à¤ªà¤¾à¤¤ सीमा:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "सीड समय अनà¥à¤ªà¤¾à¤¤:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "सीड समय (मि.):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "सीडिंग रोकें जब अनà¥à¤ªà¤¾à¤¤ सीमा पहà¥à¤à¤š जाà¤"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "टॉरेनà¥à¤Ÿ हटायें जब share अनà¥à¤ªà¤¾à¤¤ पहà¥à¤à¤š जाà¤"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>सीडिंग</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>पà¥à¤°à¥‰à¤•à¥à¤¸à¥€</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "होसà¥à¤Ÿà¤ƒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>पीयर</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>वेब सीड</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>टà¥à¤°à¥ˆà¤•à¤°à¥à¤¸</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>पà¥à¤²à¤—िनà¥à¤¸</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "संसà¥à¤•à¤°à¤£:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "मà¥à¤– पृषà¥à¤ à¤ƒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "लेखक ई-मेल:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "पà¥à¤²à¤—िन नियà¥à¤•à¥à¤¤ करें (_I)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Rescan Plugins"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "डिलà¥à¤¯à¥à¤œ दिखाà¤à¤ (_S)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "सभी रिजà¥à¤¯à¥‚म (_R)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_डाउनलोड"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_अपलोड की गति सीमा"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Quit & Shutdown Daemon"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "फोलà¥à¤¡à¤° खोलें (_O)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Resu_me"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "वि_कलà¥à¤ª"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_कतार"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_अपडेट टà¥à¤°à¥ˆà¤•à¤°"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_हटायें टॉरेनà¥à¤Ÿ"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "बलपूरà¥à¤µà¤• पà¥à¤¨à¤ƒ जांच"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "Move _Storage"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "_समà¥à¤¬à¤¨à¥à¤§ सीमा"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "अपलोड _Slot सीमा"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "सà¥à¤µ निरà¥à¤§à¤¾à¤°à¤¿à¤¤"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>चà¥à¤¨à¥‡ हà¥à¤ टॉरेनà¥à¤Ÿ को हटायें? </b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "यदि आप डाटा हटाओगे तों वह पूरी तरह खो जायगा"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "टà¥à¤°à¥ˆà¤•à¤°à¥à¤¸ संशोधन"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>टà¥à¤°à¥ˆà¤•à¤°à¥à¤¸ संशोधन</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "टà¥à¤°à¥ˆà¤•à¤° जोड़ें"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>टà¥à¤°à¥ˆà¤•à¤° जोड़ें</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "टà¥à¤°à¥ˆà¤•à¤° संशोधन"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>टà¥à¤°à¥ˆà¤•à¤° संशोधन</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "टà¥à¤°à¥ˆà¤•à¤°:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "_डाटा के साथ हटायें"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "_टॉरेनà¥à¤Ÿ हटायें"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Move Storage"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Move Storage</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "लकà¥à¤·à¥à¤¯:"
+
+#~ msgid "Clear"
+#~ msgstr "खाली करें"
+
+#~ msgid "Add"
+#~ msgstr "जोड़ें"
+
+#~ msgid "Details"
+#~ msgstr "विवरण"
+
+#~ msgid "Select All"
+#~ msgstr "सभी चà¥à¤¨à¥‡à¤‚"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Password"
+#~ msgstr "पासवरà¥à¤¡"
+
+#~ msgid "Server"
+#~ msgstr "सरà¥à¤µà¤°"
+
+#~ msgid "Port"
+#~ msgstr "पोरà¥à¤Ÿ"
+
+#~ msgid "_Quit"
+#~ msgstr "बाहर (_Q)"
+
+#~ msgid "Unknown"
+#~ msgstr "अजà¥à¤žà¤¾à¤¤"
+
+#~ msgid "Download"
+#~ msgstr "डाउनलोड"
+
+#~ msgid "Upload"
+#~ msgstr "अपलोड"
+
+#~ msgid "Files"
+#~ msgstr "फ़ाइलें"
+
+#~ msgid "Graph"
+#~ msgstr "गà¥à¤°à¤¾à¤«"
+
+#~ msgid "Text Only"
+#~ msgstr "सिरà¥à¤« पाठ"
+
+#~ msgid "About"
+#~ msgstr "के बारे में"
+
+#~ msgid "Disable"
+#~ msgstr "निषà¥à¤•à¥à¤°à¤¿à¤¯ करें"
+
+#~ msgid "Logout"
+#~ msgstr "लॉग आउट"
+
+#~ msgid "Set"
+#~ msgstr "सेट"
+
+#~ msgid "Speed"
+#~ msgstr "गति"
+
+#~ msgid "Url"
+#~ msgstr "यूआरà¤à¤²"
+
+#~ msgid "Submit"
+#~ msgstr "जमा करें"
+
+#~ msgid "Total Size"
+#~ msgstr "कà¥à¤² आकार"
+
+#~ msgid "Start"
+#~ msgstr "पà¥à¤°à¤¾à¤°à¤‚भ"
+
+#~ msgid "Type"
+#~ msgstr "पà¥à¤°à¤•à¤¾à¤°"
+
+#~ msgid "seconds"
+#~ msgstr "सेकणà¥à¤¡"
+
+#~ msgid "From"
+#~ msgstr "से"
+
+#~ msgid "Filters"
+#~ msgstr "फ़िलà¥à¤Ÿà¤°à¥à¤¸"
+
+#~ msgid "Delete"
+#~ msgstr "मिटाà¤à¤"
+
+#~ msgid "General"
+#~ msgstr "सामानà¥à¤¯"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "अधिकतम कनेकà¥à¤¶à¤¨"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "अधिकतम अपलोड सà¥à¤²à¥‰à¤Ÿà¥à¤¸"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• के लिठजाà¤à¤š (दिन)"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "%.2f%% डाउनलोड किया जा राहा है"
+
+#~ msgid "Import Now"
+#~ msgstr "आयात अब"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "डाउनलोड करने का पà¥à¤°à¤¯à¤¾à¤¸ इतनी बार करें"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "डीमन के शà¥à¤°à¥‚ होने पर आयात"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "समय की सीमा (सेकनà¥à¤¡à¥à¤¸)"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "%s का आयात किया जा रहा है"
+
+#~ msgid "Inactive"
+#~ msgstr "निषà¥à¤•à¥à¤°à¤¿à¤¯"
+
+#~ msgid "Refresh status"
+#~ msgstr "ताज़ा सà¥à¤¥à¤¿à¤¤à¤¿"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "अवरà¥à¤¦à¥à¤§ सीमायें:%s"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "डिलà¥à¤¯à¥‚ज बंद है"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "डिलà¥à¤¯à¥‚ज पासवरà¥à¤¡ से सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ है.\n"
+#~ "डिलà¥à¤¯à¥‚ज विंडो दिखाने के लिठकृपया अपना पासवरà¥à¤¡ दरà¥à¤œ करें"
+
+#~ msgid "Other.."
+#~ msgstr "अनà¥à¤¯.."
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>टोरेंट जोड़ें</b></big>"
+
+#~ msgid "Graphs"
+#~ msgstr "रेखाचितà¥à¤°"
+
+#~ msgid "page 11"
+#~ msgstr "पृषà¥à¤  11"
+
+#~ msgid "page 12"
+#~ msgstr "पृषà¥à¤  12"
+
+#~ msgid "Homepage"
+#~ msgstr "मà¥à¤–à¥à¤¯ पृषà¥à¤ "
+
+#~ msgid "Community"
+#~ msgstr "समà¥à¤¦à¤¾à¤¯"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>गति :</b>"
+
+#~ msgid "Stats"
+#~ msgstr "आंकड़े"
+
+#~ msgid "Connect"
+#~ msgstr "जोड़ें"
+
+#~ msgid "Statistics"
+#~ msgstr "आंकड़े"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Move"
+#~ msgstr "सà¥à¤¥à¤¾à¤¨à¤¾à¤¨à¥à¤¤à¤°"
+
+#~ msgid "Recheck"
+#~ msgstr "पà¥à¤¨à¤ƒ जांच"
+
+#~ msgid "Stop"
+#~ msgstr "बंद करें"
+
+#~ msgid "UpNP"
+#~ msgstr "यॠपी à¤à¤¨ पी"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "डि à¤à¤š टी मेनलाइन"
+
+#~ msgid "Extra's"
+#~ msgstr "अतिरिकà¥à¤¤"
+
+#~ msgid "Random"
+#~ msgstr "कà¥à¤°à¤®à¤¹à¥€à¤¨"
+
+#~ msgid "Ports"
+#~ msgstr "पोरà¥à¤Ÿà¥à¤¸"
+
+#~ msgid "To"
+#~ msgstr "पà¥à¤°à¤¤à¤¿"
+
+#~ msgid "Either"
+#~ msgstr "अथवा"
+
+#~ msgid "Handshake"
+#~ msgstr "हैंडशेक"
+
+#~ msgid "Disabled"
+#~ msgstr "निषà¥à¤•à¥à¤°à¤¿à¤¯"
+
+#~ msgid "Level"
+#~ msgstr "सà¥à¤¤à¤°"
+
+#~ msgid "Global"
+#~ msgstr "वैशà¥à¤µà¤¿à¤•"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = सीमारहित"
+
+#~ msgid "Username"
+#~ msgstr "उपयोगकरà¥à¤¤à¤¾ का नाम"
+
+#~ msgid "HTTP"
+#~ msgstr "à¤à¤šà¤Ÿà¥€à¤Ÿà¥€à¤ªà¥€"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "अधिकतम अपलोड गति (Kib/s)"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "अधिकतम डाउनलोड गति (Kib/s)"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "अधिकतम आधे-खà¥à¤²à¥‡ समà¥à¤¬à¤¨à¥à¤§"
+
+#~ msgid "Per Torrent"
+#~ msgstr "पà¥à¤°à¤¤à¤¿ टॉरेनà¥à¤Ÿà¥"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "टॉरेनà¥à¤Ÿ हटायें जब अनà¥à¤ªà¤¾à¤¤ हो जाà¤"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = सीमारहित"
+
+#~ msgid "Total active torrents"
+#~ msgstr "कà¥à¤² सकà¥à¤°à¤¿à¤¯ टॉरेनà¥à¤Ÿ"
+
+#~ msgid "Total active downloading"
+#~ msgstr "कà¥à¤² सकà¥à¤°à¤¿à¤¯ डाउनलोड"
+
+#~ msgid "Total active seeding"
+#~ msgstr "कà¥à¤² देने वाले लोग"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "देना बंद करें जब अनà¥à¤ªà¤¾à¤¤ हो जाà¤"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "अपनेआप जोड़ना सकà¥à¤°à¤¿à¤¯ हà¥à¤†"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "अपनेआप फोलà¥à¤¡à¤° जोड़ें"
+
+#~ msgid "translate something"
+#~ msgstr "कà¥à¤› अनà¥à¤µà¤¾à¤¦ करो"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "पà¥à¤²à¤—िन सकà¥à¤°à¤¿à¤¯ करें"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "इस फोलà¥à¤¡à¤° का असà¥à¤¤à¤¿à¤¤à¥à¤µ नहीं है."
+
+#~ msgid "This field is required."
+#~ msgstr "यह कà¥à¤·à¥‡à¤¤à¥à¤° आवशà¥à¤¯à¤• है"
+
+#~ msgid "No"
+#~ msgstr "नहीं"
+
+#~ msgid "Yes"
+#~ msgstr "हाà¤"
+
+#~ msgid "Enter a number."
+#~ msgstr "कोई अंक डालें"
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "मानà¥à¤¯ ई-मेल à¤à¤¡à¥à¤°à¥‡à¤¸ डालें"
+
+#~ msgid "Move To"
+#~ msgstr "खिसकाà¤à¤"
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "मानà¥à¤¯ IPv4 à¤à¤¡à¥à¤°à¥‡à¤¸ डालें"
+
+#~ msgid "Button style"
+#~ msgstr "बटन शैली"
+
+#~ msgid "Current Password"
+#~ msgstr "वरà¥à¤¤à¥à¤¤à¤®à¤¾à¤¨ पासवरà¥à¤¡"
+
+#~ msgid "New Password"
+#~ msgstr "नया पासवरà¥à¤¡"
+
+#~ msgid "Show trackers"
+#~ msgstr "टà¥à¤°à¥ˆà¤•à¤°à¥à¤¸ दिखाà¤à¤"
+
+#~ msgid "Show sidebar"
+#~ msgstr "साइडबार दिखाà¤à¤"
+
+#~ msgid "Sidebar"
+#~ msgstr "साइडबार"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "सीड इस अनà¥à¤ªà¤¾à¤¤ पर रोके"
+
+#~ msgid "Download Location"
+#~ msgstr "डाउनलोड सà¥à¤¥à¤¾à¤¨"
+
+#~ msgid "No data"
+#~ msgstr "कोई आà¤à¤•à¤¡à¤¼à¤¾ नहीं"
+
+#~ msgid "page 6"
+#~ msgstr "पृषà¥à¤  6"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "सà¥à¤µà¤¤à¤ƒ ताज़ा करें:"
+
+#~ msgid "Availability"
+#~ msgstr "उपलबà¥à¤§à¤¤à¤¾"
+
+#~ msgid "Active time"
+#~ msgstr "सकà¥à¤°à¤¿à¤¯ समय"
+
+#~ msgid "Cancel"
+#~ msgstr "निरसà¥à¤¤ करें"
+
+#~ msgid "page 8"
+#~ msgstr "पृषà¥à¤  8"
+
+#~ msgid "page 7"
+#~ msgstr "पृषà¥à¤  7"
+
+#~ msgid "page 10"
+#~ msgstr "पृषà¥à¤  10"
+
+#~ msgid "Connected to"
+#~ msgstr "समà¥à¤¬à¤¨à¥à¤§ हà¥à¤†"
+
+#~ msgid "Connection Limit"
+#~ msgstr "समà¥à¤¬à¤¨à¥à¤§ सीमा"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "Do not download"
+#~ msgstr "डाउनलोड नहीं करें"
+
+#~ msgid "File"
+#~ msgstr "फाइल"
+
+#~ msgid "False"
+#~ msgstr "असतà¥à¤¯"
+
+#~ msgid "Template"
+#~ msgstr "टैमà¥à¤ªà¥à¤²à¥‡à¤Ÿ"
+
+#~ msgid "Forced"
+#~ msgstr "बलपूरà¥à¤µà¤• किया"
+
+#~ msgid "Queue Top"
+#~ msgstr "कतार में ऊपर"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "कतार में नीचे"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "Login"
+#~ msgstr "लॉगिन"
+
+#~ msgid "High priority"
+#~ msgstr "उचà¥à¤š पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•à¤¤à¤¾"
+
+#~ msgid "Keyword"
+#~ msgstr "कीवरà¥à¤¡"
+
+#~ msgid "Ok"
+#~ msgstr "ओके"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "पासवरà¥à¤¡ अमानà¥à¤¯ है, पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ करें"
+
+#~ msgid "Normal priority"
+#~ msgstr "सामानà¥à¤¯ पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•à¤¤à¤¾"
+
+#~ msgid "Remove"
+#~ msgstr "हटाà¤à¤"
+
+#~ msgid "Seed rank"
+#~ msgstr "सीड सà¥à¤¥à¤¾à¤¨"
+
+#~ msgid "Seeding time"
+#~ msgstr "सीडिंग समय"
+
+#~ msgid "Search"
+#~ msgstr "ढूंढें"
+
+#~ msgid "Save"
+#~ msgstr "सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करें"
+
+#~ msgid "Restart"
+#~ msgstr "पà¥à¤¨à¤ƒ आरंभ करें"
+
+#~ msgid "True"
+#~ msgstr "सतà¥à¤¯"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "अपलोड सà¥à¤²à¥‰à¤Ÿ सीमा"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Seeds/Peers"
+
+#~ msgid "Test config value:"
+#~ msgstr "Test config value:"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-संशोधन"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Deluge Setup Wizard"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr "This wizard will help you set up Deluge to your liking."
+
+#~ msgid "All Finished!"
+#~ msgstr "सभी समà¥à¤ªà¥‚रà¥à¤£ हà¥à¤†"
+
+#~ msgid "FAQ"
+#~ msgstr "FAQ"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "अधिकतम_अपलोड_सà¥à¤²à¥‰à¤Ÿà¥à¤¸"
+
+#~ msgid "max_connections"
+#~ msgstr "अधिकतम_समà¥à¤¬à¤¨à¥à¤§"
+
+#~ msgid "apply_queue"
+#~ msgstr "apply_queue"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "is_auto_managed"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "अधिकतम_अपलोड_गति"
+
+#~ msgid "max_download_speed"
+#~ msgstr "अधिकतम_डाउनलोड_गति"
+
+#~ msgid "apply_max"
+#~ msgstr "apply_max"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Error setting label options"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "stop_at_ratio"
+
+#~ msgid "stop_ratio"
+#~ msgstr "stop_ratio"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "remove_at_ratio"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "apply_move_completed"
+
+#~ msgid "move_completed"
+#~ msgstr "move_completed"
+
+#~ msgid "auto_add"
+#~ msgstr "auto_add"
+
+#~ msgid "Work in progress.."
+#~ msgstr "कारà¥à¤¯ पà¥à¤°à¤—ति पर.."
+
+#~ msgid "move_completed_path"
+#~ msgstr "move_completed_path"
+
+#~ msgid "BlockList"
+#~ msgstr "बà¥à¤²à¥‰à¤•à¤²à¤¿à¤¸à¥à¤Ÿ (BlockList)"
+
+#~ msgid "Test config value"
+#~ msgstr "Test config value"
+
+#~ msgid "Force Download"
+#~ msgstr "बलपूरà¥à¤µà¤• डाउनलोड"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Including %i files"
+
+#~ msgid "State"
+#~ msgstr "सà¥à¤¥à¤¿à¤¤à¤¿"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "यह ई-मेल आपको बताने के लिठहै की डिलà¥à¤¯à¥à¤œ ने %s डाउनलोडिंग समापà¥à¤¤ कर डाली है "
+#~ ". जिसमे %i फ़ाइल शामिल हैं.\n"
+#~ "यह सूचनाà¤à¤‚ पाना बंद करने के लिठडिलà¥à¤¯à¥à¤œ के ई-मेल सूचनाओं को डिलà¥à¤¯à¥à¤œ के "
+#~ "पà¥à¤°à¤¿à¤«à¤°à¥‡à¤‚सेस से बंद कर दीजिये."
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "उपरोकà¥à¤¤ तà¥à¤°à¥à¤Ÿà¤¿à¤¯à¥‹à¤‚ को सà¥à¤§à¤¾à¤°à¥‡à¤‚ और पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ करें"
+
+#~ msgid "no label"
+#~ msgstr "कोई लेबल नहीं"
+
+#~ msgid "Config"
+#~ msgstr "कॉनà¥à¤«à¤¼à¤¿à¤—"
+
+#~ msgid "Reannounce"
+#~ msgstr "Reannounce"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torrent is past stop ratio."
+
+#~ msgid "These changes were saved"
+#~ msgstr "ये बदलाव सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ हो गà¤"
+
+#~ msgid "Encryption"
+#~ msgstr "à¤à¤¨à¤•à¥à¤°à¤¿à¤ªà¥à¤¶à¤¨"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "पीयर-विनिमय"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Inbound"
+#~ msgstr "Inbound"
+
+#~ msgid "Outbound"
+#~ msgstr "Outbound"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Rate Limit IP Overhead"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "पà¥à¤°à¤¤à¤¿ सेकणà¥à¤¡ संबंधों के लिठअधिकतम पà¥à¤°à¤¯à¤¾à¤¸"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Enter a list of values."
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr "मानà¥à¤¯ चà¥à¤¨à¤¾à¤µ करें. यह चà¥à¤¨à¤¾à¤µ उपलबà¥à¤§ चà¥à¤¨à¤¾à¤µà¥‹à¤‚ में से à¤à¤• नहीं है."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+
+#~ msgid "Save .torrent files to"
+#~ msgstr ".torrent फ़ाइल यहाठसà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करें"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "सभी डाउनलोड यहाठसà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करें"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Ensure this value has at most %(max)d characters (it has %(length)d)."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "कोई मानà¥à¤¯ वैलà¥à¤¯à¥‚ डालें"
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "मानà¥à¤¯ चà¥à¤¨à¤¾à¤µ करें. %s उपलबà¥à¤§ चà¥à¤¨à¤¾à¤µà¥‹à¤‚ में नहीं है."
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "Restart daemon and webui after changing these settings"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Prioritize first and last pieces"
+
+#~ msgid "Enter a valid date."
+#~ msgstr "मानà¥à¤¯ दिनांक डालें."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "मानà¥à¤¯ समय डालें."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Ensure that there are no more than %s decimal places."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Ensure that there are no more than %s digits in total."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "निशà¥à¤šà¤¿à¤¤ करें की यह वैलà¥à¤¯à¥‚ %s से छोटा या बराबर है."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "निशà¥à¤šà¤¿à¤¤ करें की यह वैलà¥à¤¯à¥‚ %s से बड़ा या बराबर है."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "No file was submitted. Check the encoding type on the form."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "à¤à¤• पूरà¥à¤£ अंक डालें"
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "मानà¥à¤¯ दिनांक/समय डालें."
+
+#~ msgid "Text and image"
+#~ msgstr "Text and image"
+
+#~ msgid "Error in Path."
+#~ msgstr "पथ में तà¥à¤°à¥à¤Ÿà¥€"
+
+#~ msgid "no uri"
+#~ msgstr "no uri"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "refresh must be > 0"
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "कोई मानà¥à¤¯ छवि अपलोड करें. जो फ़ाइल आपने जमा किया वो या तो छवि नहीं है या "
+#~ "दूषित हो गयी ई."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "जमा किया फ़ाइल रिकà¥à¤¤ है."
+
+#~ msgid "No file was submitted."
+#~ msgstr "कोई फ़ाइल जमा नहीं किया गया."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr ""
+#~ "Select a valid choice. %(value)s is not one of the available choices."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "यह URL नषà¥à¤Ÿ (broken link) लगता है."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "मानà¥à¤¯ URL डालें."
+
+#~ msgid "Cache templates"
+#~ msgstr "Cache templates"
+
+#~ msgid "Image Only"
+#~ msgstr "केवल छवि"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "सà¥à¤µà¤¤à¤ƒ ताजा (सेकणà¥à¤¡)"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Manually restart webui to apply changes."
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "'%s' में की (key) नहीं पायी गयी."
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "'%s' में पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¾à¤¤à¥à¤° नहीं पाया गया"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "पà¥à¤°à¤¾à¤¨à¤¾ पासवरà¥à¤¡ मानà¥à¤¯ नहीं."
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "नया पासवरà¥à¤¡ (Confirm)"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "नया पासवरà¥à¤¡ नठपासवरà¥à¤¡ (Confirm) के बराबर नहीं."
+
+#~ msgid "Show keyword search"
+#~ msgstr "Show keyword search"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Show zero hits"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "अधिकतम अधो गति"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "अधिकतम उरà¥à¤§à¥à¤µ गति"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Compact Allocation"
+
+#~ msgid "# Of Files"
+#~ msgstr "# Of Files"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "url या टॉरेनà¥à¤Ÿ चà¥à¤¨à¥‡à¤‚, दोनों नहीं"
+
+#~ msgid "Upload torrent"
+#~ msgstr "अपलोड टॉरेनà¥à¤Ÿ"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "विराम (Paused) अवसà¥à¤¥à¤¾ में जोड़ें"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "टॉरेनà¥à¤Ÿ विकलà¥à¤ª में तà¥à¤°à¥à¤Ÿà¥€"
+
+#~ msgid "Ava"
+#~ msgstr "Ava"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Connect to Daemon"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "D/L गति सीमा"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "डाउनलोड किये फाइलों को इताà¤à¤‚"
+
+#~ msgid "Admin"
+#~ msgstr "पà¥à¤°à¤¶à¤¾à¤¸à¤•"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... और टॉरेनà¥à¤Ÿ फ़ाइल मिटायें"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... और डाउनलोडेड फाइलों को मिटायें"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... और सभी फाइलों को मिटायें"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr ".torrent फ़ाइल मिटायें"
+
+#~ msgid "Eta"
+#~ msgstr "Eta"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "डिलà¥à¤¯à¥à¤œ: टॉरेनà¥à¤Ÿ लिसà¥à¤Ÿ"
+
+#~ msgid "Deluge Login"
+#~ msgstr "डिलà¥à¤¯à¥à¤œ लॉगिन"
+
+#~ msgid "Disk Space"
+#~ msgstr "डिसà¥à¤• सà¥à¤¥à¤¾à¤¨"
+
+#~ msgid "Label torrent"
+#~ msgstr "लेबल टॉरेनà¥à¤Ÿ"
+
+#~ msgid "From Url"
+#~ msgstr "Url से"
+
+#~ msgid "From Session"
+#~ msgstr "सेशन से"
+
+#~ msgid "Force Recheck"
+#~ msgstr "बलपूरà¥à¤µà¤• पà¥à¤¨à¤ƒ जांच"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Filter on a keyword"
+
+#~ msgid "Highest priority"
+#~ msgstr "उचà¥à¤šà¤¤à¤® पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•à¤¤à¤¾"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Set Timeout"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Not Connected to a daemon"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "कोई आने वाले समà¥à¤¬à¤¨à¥à¤§ नहीं"
+
+#~ msgid "Move torrent"
+#~ msgstr "टॉरेनà¥à¤Ÿ सरकाà¤à¤‚"
+
+#~ msgid "Next Announce"
+#~ msgstr "अगली घोसणा"
+
+#~ msgid "Resume all"
+#~ msgstr "Resume all"
+
+#~ msgid "Pieces"
+#~ msgstr "टà¥à¤•à¥œà¥‡"
+
+#~ msgid "Pause all"
+#~ msgstr "Pause all"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "पृषà¥à¤  ताजा करें पà¥à¤°à¤¤à¥à¤¯à¥‡à¤•:"
+
+#~ msgid "Queue Position"
+#~ msgstr "कतार सà¥à¤¥à¤¾à¤¨"
+
+#~ msgid "Torrent list"
+#~ msgstr "टॉरेनà¥à¤Ÿ लिसà¥à¤Ÿ"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Share अनà¥à¤ªà¤¾à¤¤"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "U/L गति सीमा"
+
+#~ msgid "Tracker Status"
+#~ msgstr "टà¥à¤°à¥ˆà¤•à¤° अवसà¥à¤¥à¤¾"
+
+#~ msgid "Update Tracker"
+#~ msgstr "टà¥à¤°à¥ˆà¤•à¤° अपडेट"
+
+#~ msgid "Update"
+#~ msgstr "अपडेट"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "auto_add_trackers"
diff --git a/deluge/i18n/hr.po b/deluge/i18n/hr.po
new file mode 100644
index 0000000..5016ab4
--- /dev/null
+++ b/deluge/i18n/hr.po
@@ -0,0 +1,6256 @@
+# Croatian translation for deluge
+# Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2019-03-23 10:46+0000\n"
+"Last-Translator: gogo <trebelnik2@gmail.com>\n"
+"Language-Team: Croatian <hr@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+"Language: hr\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr "B"
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr "KiB"
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr "MiB"
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr "GiB"
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr "TiB"
+
+#: deluge/common.py:410
+msgid "K"
+msgstr "K"
+
+#: deluge/common.py:411
+msgid "M"
+msgstr "M"
+
+#: deluge/common.py:412
+msgid "G"
+msgstr "G"
+
+#: deluge/common.py:413
+msgid "T"
+msgstr "T"
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr "K/s"
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr "M/s"
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr "MiB/s"
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr "G/s"
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr "GiB/s"
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr "T/s"
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr "TiB/s"
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr "UÄestale mogućnosti"
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr "Prikaži ovu poruku pomoći"
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr "Prikaži inaÄicu"
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr "Mogućnosti pozadinskog programa"
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr "IP adresa sluÅ¡anja povezivanja korisniÄkog suÄelja"
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr "Ulaz sluÅ¡anja povezivanja korisniÄkog suÄelja"
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr "IP adresa slušanja BitTorrent povezivanja"
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr "Svi"
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr "Aktivno"
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr "Provjeravanje"
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr "Preuzimanje"
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr "Dijeljenje"
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr "Pauzirano"
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr "Red Äekanja"
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr "Greška"
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr "Naziv torrenta"
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr "Napredak"
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr "Stanje"
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr "VeliÄina"
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr "Preuzeto podataka"
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr "Poslano podataka"
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr "Preostalo"
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr "Omjer"
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr "Brzina preuzimanja"
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr "Brzina dijeljenja"
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr "Limit preuzimanja"
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr "Limit dijeljenja"
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr "Najviše povezivanja"
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr "ToÄke"
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr "Dijelitelji"
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr "Dostupno"
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr "Dijelitelji:ToÄke"
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr "Dodano"
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr "Pratitelj"
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr "Mapa preuzimanja"
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr "Vrijeme dijeljenja"
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr "Aktivno vrijeme"
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr "Posljednja aktivnost"
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr "Vrijeme završetka"
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr "Završeno"
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr "Preostalo vrijeme"
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr "Dijeljenjo"
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr "Prioritetno prvi/posljednji"
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr "Auto upravljanje"
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr "Zaustavi pri omjeru"
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr "Omjer zaustavljanja"
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr "Ukloni pri omjeru"
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr "Premjesti završeno u"
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr "Putanja premještanja završenih"
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr "Putanja premještanja završenih"
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr "Vlasnik"
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr "Dijelovi"
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr "Rang dijeljenja"
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr "Upozorenje"
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr "Najava OK"
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr "Najava poslana"
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr "SuÄelje"
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr "Preuzimanja"
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr "Propusnost"
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr "Red Äekanja"
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr "Mreža"
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr "Proxy"
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr "PriruÄna memorija"
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr "Ostalo"
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr "Daemon"
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr "Dodaci"
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr "Nizak"
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr "Normalan"
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr "Visok"
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr "Afghanistan"
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr "Alandski otoci"
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr "Albanija"
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr "Alžir"
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr "AmeriÄka Samoa"
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr "Andora"
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr "Antarktika"
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr "Antigva i Barbuda"
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr "Argentina"
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr "Armenija"
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr "Australija"
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr "Austrija"
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr "Azerbajdžan"
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr "Bahami"
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr "Bahrein"
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr "Bangladeš"
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr "Bjelorusija"
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr "Belgija"
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr "Bermudi (Bermudski otoci)"
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr "Butan"
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr "Bolivija"
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr "Bosna i Hercegovina"
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr "Bocvana"
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr "Otok Bouvet"
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr "Brazil"
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr "Britanski indijskooceanski teritoriji"
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr "Brunej Darussalam"
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr "Bugarska"
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr "Kambodža"
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr "Kamerun"
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr "Kanada"
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr "Zelenortska Republika (Zelenortski otoci)"
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr "Kajmanski otoci"
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr "SrednjoafriÄka Republika"
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr "ÄŒad"
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr "ÄŒile"
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr "Kina"
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr "Božićni Otok"
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr "Kokosovi otoci"
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr "Kolumbija"
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr "Komori"
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr "Kongo"
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr "Kongo, Demokratska Repubilika"
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr "Cookovo OtoÄje (Cookovi otoci, Kukovi otoci)"
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr "Kostarika"
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr "Obala Bjelokosti"
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr "Hrvatska"
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr "Kuba"
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr "Cipar"
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr "Češka Republika (Republika Češka)"
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr "Danska"
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr "Džibuti"
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr "Dominika"
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr "Dominikanska Republika"
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr "Ekvador"
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr "Egipat"
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr "San Salvador"
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr "Ekvatorska Gvineja"
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr "Eritreja"
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr "Estonija"
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr "Etiopia"
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falklandski Otoci (Malvinski Otoci)"
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr "Farski Otoci"
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr "Fidži"
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr "Finska"
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr "Francuska"
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr "Francuska Gvajana (Francuska Gijana)"
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr "Francuska Polinezija"
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr "Francuski južni i antarktiÄki teritoriji"
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr "Gambija"
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr "Gruzija"
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr "NjemaÄka"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Gana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "GrÄka"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Grenland"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadalupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Gvatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Gvineja"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Gvineja Bisau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Gvajana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Otok Heard i otoÄje McDonald"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Sveta Stolica (Država Vatikanskog Grada)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Mađarska"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Island"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "Indija"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonezija"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Iran, Islamska Republika"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Irak"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Irska"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Mana (otok)"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Izrael"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italija"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamajka"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japan"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordan"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazakstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenija"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Koreja, Demokratska Narodna Republika"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Republika Koreja"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuvajt"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kirgistan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Laoska Narodna Demokratska Republika"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Latvija (Letonija)"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Libanon"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesoto"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberia"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libija (Libijska Arapska Džamahirija)"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Lihtenštajn"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Litva"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luksemburg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Makao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Makedonija, Bivša Jugoslovenska Republika"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagaskar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malavi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malezija"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldivi"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Maršalovi otoci"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinik"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauritanija"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauricijus"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Meksiko"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Mikronezije, Savezne Države"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldova"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monako"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolija"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Crna Gora"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Maroko"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambik"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Mianmar"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Nambija"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Nizozemska"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Nizozemski Antili"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Nova Kaledonija"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Novi Zeland"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nikaragva"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigerija"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Otok Norfolk"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Sjevernomarijanski otoci"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norveška"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palestinski Teritorij, Okupiran"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua Nova Gvineja"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paragvaj"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filipini"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitkairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Poljska"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugal"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Portoriko"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Katar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Rumunjska"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Ruska Federacija"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Ruanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Sveti Bartolomej"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Sveta Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Sveti Kristofor i Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Sveta Lucija"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Sveti Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Sveti Vincent i Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Sveti Vincent i Grenadini"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Sveti Toma i Princip"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Saudijska Arabija"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Srbija"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Sejšeli"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sijera Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapur"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "SlovaÄka"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slovenija"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Salamunovi Otoci"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalija"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Južna Afrika"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Južna Georgija i otoÄje Južni Sandwich"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Å panjolska"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Å ri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Surinam"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard i Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Svazi"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Å vedska"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Å vicarska"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Sirija, Arapska Republika"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr "Tajvan"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tadžikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzanija, Ujedinjena Republika"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Tajland"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Timor"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad i Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunis"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Turska"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Otoci Turks i Caicos"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukrajina"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Ujedinjeni Arabski Emirati"
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Ujedinjeno Kraljevstvo"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Sjedinjene Države"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Sjedinjene AmeriÄke Države Manjih PacifiÄkih Otoka"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Urugvaj"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Uzbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vijetnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Britanski DjeviÄanski otoci"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "AmeriÄki DjeviÄanski Otoci"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis i Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Zapadna Sahara"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Jemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambija"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabve"
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr "Daemon nije pokrenut"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr "Naziv datoteke"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr "Rang"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr "Odaberite datoteku"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr "Odaberite mapu"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr "Pohranite .torrent datoteku"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr "Torrent datoteke"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr "Sve datoteke"
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr "Upišite svoju lozinku za prikaz Delugea..."
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr "Upišite svoju lozinku za izlaz iz Delugea..."
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr "Autorska pravo %(year_start)s-%(year_end)s Deluge Tim"
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+"Peer-to-peer program za dijeljenje datoteka\n"
+"koji koristi BitTorrent protokol."
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr "Klijent:"
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr "Trenutni razvojni programeri:"
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr "Bivši razvojni programeri ili doprinositelji:"
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+"Ovaj program je slobodan softver; možete ga redistribuirati i/ili mijenjati "
+"pod uvjetima GNU Opće javne licence objavljene od Fondacije slobodnog "
+"softvera; ili inaÄice 3 Licence ili (po vaÅ¡emu miÅ¡ljenju) svake novije "
+"inaÄice.\n"
+"\n"
+"Ovaj program je distribuiran u nadi da će biti koristan ali BEZ IKAKVOG "
+"JAMSTVA; Äak i bez podrazumijevanog jamstva ili POGODNOSTI ZA ODREÄENU "
+"NAMJENU. Pogledajte GNU Opću javnu licencu za više informacija.\n"
+"\n"
+"Trebali ste dobiti primjerak GNU Opće javne licence uz ovaj program; ako "
+"niste pogledajte <http://www.gnu.org/licenses>.\n"
+"\n"
+"Osim toga, kao posebna iznimka, nositelji autorskih prava daju dopuštenje za "
+"povezivanje dijelova koda programa sa OpenSSL knjižnicom. Morate se "
+"pridržavati GNU Opće javne licence u svim pogledima za svaki kôd korišten "
+"drugdje osim u OpenSSL-u.\n"
+"\n"
+"Ako mijenjate datoteku ili datoteke sa ovim izuzetkom, morate proširiti ovaj "
+"izuzetak na vaÅ¡u inaÄicu datoteke ili datoteka, ali vi niste dužni to "
+"uÄiniti. Ako ne želite to uÄiniti obriÅ¡ite izjavu o izuzetku iz vaÅ¡e "
+"inaÄice. Ako obriÅ¡ete izjavu o izuzetku sa svih izvornih datoteka u "
+"programu, stoga ju obrišite i ovdje."
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr "Poslužitelj:"
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr "libtorrent:"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr "Pogrešna datoteka"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr "Izaberite .torrent datoteku"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr "Pogrešan URL"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr "nije valjani URL."
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr "Preuzimanje..."
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr "Preuzimanje neuspjelo"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr "Preuzimanje neuspjelo:"
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr "Pojedinosti:"
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr "Ovjeri"
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr "KorisniÄko ime:"
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr "Lozinka:"
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr "Zaštićeno lozinkom"
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr "DrugaÄija..."
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr "Nije spojeno"
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr "DHT ÄvoriÅ¡ta"
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr "Slobodno prostora na disku"
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr "Nikada"
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr "Prioritet"
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr "_Sve"
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr "_Status torrenta"
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr "_Pojedinosti"
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr "Da_toteke"
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr "_ToÄke"
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr "_Mogućnosti"
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr "Nije povezano..."
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr "NeograniÄena"
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr "Brzina preuzimanja"
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr "Brzina dijeljenja"
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr "Nije spojen"
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr "Spojen"
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr "Spojen"
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr "Status"
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr "RaÄunalo"
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr "InaÄica"
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr "_Zaustavi daemon"
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr "_Prekini povezivanje"
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr "Nemoguće je pokrenuti daemon!"
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr "GreÅ¡ka pri dodavanju raÄunala"
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr "Razina"
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr "UkljuÄeno"
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr "Dodatak"
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr "Odaberite dodatak"
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr "Dodaci Eggs"
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr "Stanje torrenta"
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr "Pratitelji"
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr "Ništa"
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr "Nazivi"
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr "Nema naziva"
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr "<i>InaÄica klijenta</i>"
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr " Torrenti su na Äekanju"
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr " Torrent je na Äekanju"
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr "Postavi neograniÄeno"
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr "UkljuÄi"
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr "IskljuÄi"
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr "Onemogući"
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr "Omogući..."
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr "IP adresa"
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr "Torrent klijent"
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr "Izrada torrenta"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr "Torrenti na Äekanju"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr "Ob_riši"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr "Automatski dodaj torrente prilikom spajanja"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr "_Datoteka"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr "_Dodajte torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr "_Izradite torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr "Otkaži &_iskljuÄi Daemon"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr "_Uredi"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr "Upravitelj veza"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr "_Pogled"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr "_Alatna traka"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr "_BoÄna traka"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr "Statusna _traka"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr "K_artice"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr "_Stupci"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr "B_oÄna traka"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr "Prikažite više torrent statusa"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr "Prikažite _Pratitelje"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr "_Pomoć"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr "_Deluge web stranica"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr "_ÄŒesto postavljana pitanja"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr "ÄŒesto postavljana pitanja"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr "_Zajednica"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr "Dodajte torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr "Dodajte torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr "Uklonite torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr "Uklonite torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr "Pauzirajte odabrani torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr "Pauziraj torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr "Ponovo pokrenite odabrani torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr "Pokrenite torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr "Pomaknite torrent gore"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr "Pomaknite u redu gore"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr "Pomaknite torrent dolje"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr "Pomaknite u redu dolje"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr "Postavke"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr "Upravitelj povezivanja"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr "Zatvori"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr "Socks4"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr "Socks5"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr "Socks5 ovjera"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr "HTTP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr "HTTP ovjera"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr "I2P"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr "Samostojeći"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr "Samostojeća aplikacija"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr "Poveži se s Deluge pozadinskim programom (deluged)"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr "NaÄin aplikacije"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr "Prikaži sesiju brzine u naslovnoj traci"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr "Fokusiraj prozor pri dodavanju torrenta"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+"Traka dijelova\n"
+"će povećati propusnost između klijnta i pozadinskog\n"
+"programa (ne primjenjuje se u samostojećem naÄinu rada)."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr "Prikaži dijelovau u kartici stanja"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr "Završeno:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr "Preuzimanje:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr "ÄŒekanje:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr "Nedostaje:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr "Vrati izvornu boju"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr "Boje dijelova"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr "Glavni prozor"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr "UkljuÄi ikonu u traci sustava"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr "App indikator"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr "Traka sustava"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr "Smanji u traku sustava pri zatvaranju"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr "Pokreni u traci sustava"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr "Zaštiti traku sustava lozinkom"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr "Traka sustava"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr "Obavijesti o novim izdanjima"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr "Nadopune"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr "Zadano sustavom"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr "<b>Jezik</b>"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr "Premjesti dovršene torrente u:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr "Kopije .torrent datoteka su spremljene u:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr "Obriši kopiju torrent datoteke prilikom uklanjanja"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr "Obriši kopiju torrent datoteke napravljenu kada se torrent ukloni"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr "Preuzmi torrente u:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Prvi i zadnji dijelovi torrenta su prioritetni"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Prvi i zadnji dijelovi datoteka u torrentu su prioritetni"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr "Dodaj torrente u pauziranom stanju"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr "Dodaj mogućnosti torenta"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr "Uvijek prikaži"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr "Fokusiraj se na dijalog"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr "Dodaj dijalog torrenta"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr "Pokušaj povezivanja po sekundi:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr "Poluotvorena povezivanja:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+"Maksimalan broj dopuÅ¡tenih konekcija. Postavite na -1 za neograniÄeno."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr "Povezivanja:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Maksimalni broj ulaza dijeljenja za sve torrente. Postavite na -1 za "
+"neograniÄeno."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr "Ulazi dijeljenja:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Makismalna brzina preuzimanja za sve torrente. Postavite na -1 za "
+"neograniÄeno."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr "Brzina preuzimanja:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Makismalna brzina dijeljenja za sve torrente. Postavite na -1 za "
+"neograniÄeno."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr "Brzina dijeljenja:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr "Zanemari ograniÄenja na lokalnoj mreži"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr "Ocjeni gornje IP ograniÄenje"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Ako je oznaÄeno, gornja TCP/IP procjena je izvuÄena iz limitera ocjena, da "
+"izbjegnete prekomjerno ograniÄenje ukupnog prometa"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr "Globalno ograniÄenje propusnosti"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"Maksimalni broj ulaza za dijeljenje po torrentu. Postavi na -1 za "
+"neograniÄeno."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"Maksimalni broj konekcija po torrentu. Postavi na -1 za neograniÄeno."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+"Maksimalni broj preuzimanja po torrentu. Postavite -1 za neograniÄeno."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+"Maksimalna brzina dijeljenja po torrentu. Postavite -1 za neograniÄeno."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr "OgraniÄenje propusnosti po torrentu"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr "Dijeljenje:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr "Ukupno:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr "Zanemari spore torrente"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr "Preferiraj dijeljenje torenta"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr "Omjer dijeljenja:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr "Omjer vremena dijeljenja:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr "Vrijeme dijeljenja (m):"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr "Pauziraj torrent"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr "Dolazne adrese"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr "Aktivni ulaz:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr "Testiraj aktivni ulaz"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr "Od:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr "Razina:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr "Univerzalno ukopÄaj i igraj"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr "Protokol za pridruživanje NAT ulaza"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr "Razmjena toÄki"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+"Lokalni servis za otkrivanje, pronalazi lokalne toÄke na vaÅ¡oj mreži."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+"Distribuirana tablica jedinstvenih vrijednosti raspršivanja može poboljšati "
+"broj aktivnih konekcija."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr "TOS Bajt toÄke:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr "Naziv raÄunala:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr "Ulaz:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr "VeliÄina priruÄne memorije (16 KiB blokova):"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Broj sekundi od posljednjeg zapisa priruÄne memorije u dijelu zapisa "
+"priruÄne memorije, kada je prisilno zapisana na disk. Zadano je 60 sekundi."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr "PriruÄna memorija istjeÄe (sekundi):"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr "Postavke"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"Ukupan broj od 16 KiB blokova zapisanih na disk od kada je sesija pokrenuta."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr "Zapisano blokova:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"Ukupan broj od zapisanih operacija koje se izvode od kada je sesija "
+"pokrenuta."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr "Zapisa:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"Omjer (blokova_zapisano - zapisa) / blokova_zapisano prikazuje broj "
+"pohranjenih operacija zapisa po ukupnom zapisu informacija, npr. vrsta "
+"pogoÄ‘enih omjera priruÄne memorije za zapis priruÄne memorije."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr "Omjer pogodaka zapisa priruÄne memorije:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Broj blokada zahtjevanih iz bittorrent pogona (iz toÄaka), koji su posluženi "
+"iz diska ili priruÄne memorije."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr "Blokova oÄitano:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr "Broj blokova koji su posluženi iz priruÄne memorije."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr "Blokirano oÄitanih pogodaka:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr "Omjer pogodaka priruÄne memorije za Äitanje priruÄne memorije."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr "Omjer pogodaka Äitanja priruÄne memorije:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+"KonaÄan broj izvedenih operacija Äitanja od kada je ova sesija pokrenuta."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr "OÄitano:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Broj od 16 KiB blokova trenutno je u priruÄnoj memoriji. To ukljuÄuje i "
+"Äitanje i pisanje u priruÄnoj memorij."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr "VeliÄina priruÄne memorije:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr "VeliÄina Äitanja priruÄne memorije:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr "_Osvježi"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Pomozite nam poboljÅ¡ati Deluge tako Å¡to ćete nam poslati svoju inaÄicu "
+"Pythona, inaÄicu PyGTK, operacijski sustav i tipove procesora. Apsolutno "
+"nikakve druge informacije se ne Å¡alju."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr "Da, molim Å¡alji anonimnu statistiku"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr "Informacije sustava"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr "Lokacija:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Ako Deluge ne može pronaći datoteku baze podataka na toj lokaciji, ponovno "
+"će koristiti DNS da rijeÅ¡i zemlju toÄke."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr "Daemon ulaz:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr "Dozvoli udaljene veze"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr "Povezivanja"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr "Povremeno provjeri web stranicu za novu inaÄicu"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr "RaÄuni"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr "InaÄica:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr "Autor:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr "PoÄetna stranica:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr "E-pošta autora:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr "Informacije"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr "_Instaliraj"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr "_Potraži više..."
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr "Dodajte toÄku"
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr "naziv poslužitelja:ulaz"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr "Svojstva"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr "<b>Općenito</b>"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr "Prikaži skrivene datoteke"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr "Automatsko završavanje"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr "Spremi putanju"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr "Ctrl+S"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr "Ctrl+E"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr "Ctrl+R"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr "Ctrl+H"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr "Ctrl+D"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr "Uredi putanju"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr "Ukloni putanju"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr "Prikaži skrivene datoteke"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr "Zadana putanja"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr "PreÄaci"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr "Odaberi mapu"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr "Putanje spremanja"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr "stupac"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr "Odustani"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr "Otvori"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr "Dodaj"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr "Dodaj vrijednost trenutnog unosa na popis"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr "Uredi"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr "Uredi odabrani unos"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr "Ukloni"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr "Ukloni odabrani unos"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr "Pomakni odabrani unos gore"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr "Pomakni odabrani unos dolje"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr "Zadano"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr "Nema postavljenih zadanih putanja"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr "Otvori dijalog svojstva"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr "Dodajte Info-jedinstvenu-vrijednost"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr "Jedinstvena vrijednost:"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr "Pratitelji:"
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr "Dodajte raÄunalo"
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr "Odredište:"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr "Novo izdanje Delugea"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr "_Idite na web stranicu"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr "Dostupno je novo izdanje!"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr "Dostupna inaÄica:"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr "InaÄica poslužitelja"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr "Trenutna inaÄica:"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr "Ne prikazujte ovaj dijalog u budućnosti"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr "Preuzeto:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr "Poslano:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr "Dijelitelji:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr "ToÄke:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr "Dostupnost:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr "Rang dijeljenja:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr "Preostalo vrijeme:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr "Posljednji prijenos:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr "Aktivno vrijeme:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr "Vrijeme dijeljenja:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr "Dijelova:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr "Naziv:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr "Mapa preuzimanja:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr "Dodano:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr "Ukupna veliÄina:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr "Ukupno datoteka:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr "Jedinstvena vrijednost:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr "Stvorio:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr "Komentari:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr "Vlasnik:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr "Premjesti završeno:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr "Zaustavi dijeljenje pri omjeru:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr "Ukloni pri omjeru"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr "OgraniÄenje propusnosti"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr "Trenutni pratitelj:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr "Ukupno pratitelja:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr "Stanje pratitelja:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr "Sljedeće objavljivanje:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr "Privatni torrent:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr "_Uredite Pratitelje"
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr "Na vrh"
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr "Na dno"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr "Dodajte torrente"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr "Info_jedinstvene-vrijednosti"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr "Dodaj u _pauziranom stanju"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr "Prvi/Zadnji dijelovi su prioritetni"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr "Primjeni na sve"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr "Vrati na poÄetno"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr "_Prikaži Deluge"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr "_OgraniÄenje brzine preuzimanja"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr "_OgraniÄenje brzine dijeljenja"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr "Otkažite & iskljuÄite Daemon"
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr "Uredi Pratitelje"
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr "_Dodajte toÄku"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr "Dodajte toÄku po IP"
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr "Uredite pratitelje"
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr "Pratitelj:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr "Dodajte udaljenu putanju"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr "Putanja:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr "32 KiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr "64 KiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr "128 KiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr "256 KiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr "512 KiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr "1 MiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr "2 MiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr "4 MiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr "8 MiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr "16 MiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr "Izradite torrent"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr "Ma_pa"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr "_Udaljena putanju"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr "Datoteke"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr "Web dijelitelji"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr "VeliÄina dijela:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr "Postavi privatnu zastavicu"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr "Dodajte ovaj torrent u sesiju"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr "Mogućnosti"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr "Spremi .torrent kao"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr "_Pauzirajte torrent"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr "Po_krenite torrent"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr "Ponovno pokrenite odabrane torrente."
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr "Mog_ućnosti torrenta"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr "_Red Äekanja"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr "_Osvježite pratitelje"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr "_Uklonite torrent"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr "_Forsirana provjera"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr "naziv"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr "Odaberi _sve torrente"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr "_Pauziraj sve torrente"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr "Pokr_enite sve torrente"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr "OgraniÄenje veza"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr "Limit _ulaza dijeljenja"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr "_Auto upravljanje"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr "Dodajte pratitelje"
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr "Dodajte URL"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr "_Prikaži sve"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr "BitTorrent klijent"
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr "Deluge BitTorrent klijent"
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr "Preuzimajte i dijelite datoteke putem BitTorrenta"
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr "Opis"
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr "Naredba"
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr "Lozinka"
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr "Zatvori"
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr "Å irina"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr "Mape"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr "Kopije .torrent datoteka su spremljene u"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr "Koristi naizmjeniÄno odabrane ulaze"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr "Ukupno"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr "Vrsta"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr "Odaberite jezik"
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr "IP adresa \"%s\" je neispravnog oblika"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP popis (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer tekst (zipano)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian tekst (nekomprimirano)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr "Raspon blokiranih IP adresa / Raspon dopuštenih IP adresa"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr "Popis blokiranih IP adresa"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr "Neispravne IP adrese"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr "Neispravni vođa"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr "Neispravni magiÄan kôd"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr "PogreÅ¡na inaÄica"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr "dana"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr "Provjeri za novi popis svakih:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr "Uvezi popis blokiranih IP adresa prilikom pokretanja"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr "<b>Postavke</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Preuzmi popis blokiranih IP adresa i ako je potrebno uvezi ga."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr "Ažuriraj preuzmi i uvezi"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr "Preuzmi novi popis blokiranih IP adresa i uvezi ga."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr "Forsiraj preuzimanje i uvezi"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr "Popis blokiranih IP adresa je ažuriran"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr "<b>Mogućnosti</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr "Vrsta:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr "Datum:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr "VeliÄina datoteke:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr "<b>Informacije</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr "<b>Popis dopuštenih</b>"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr "Torrent preuzet"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr "Torrent dodan"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr "Torrent uklonjen"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr "Izvrši"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr "Događaj"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr "<b>Dodajte naredbu</b>"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr "<b>Naredbe</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr "Nekompatibilna mogućnost"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+"\"Nadgledana mapa\" mapa i \"Kopije .torrent datoteka su spremljene u\" mapa "
+"ne mogu biti iste!"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr "Auto dodavanje"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr "Nadgledana mapa ne postoji."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr "Putanja ne postoji."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr "Postavke nadgledane mape"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr "Odaberite mapu"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr "Omogući ovu nadgledanu mapu"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr "<b>Nadgledana mapa<b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr "Obriši .torrent nakon dodavanja"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr "Dodaj proširenje nakon dodavanja:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ".dodano"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+"Jednom kada je torent dodan u sesiju,\n"
+".torrent datpteka će se kopirati u odabranu\n"
+"mapu i obrisati se iz nadgledane mape."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr "<b>Radnja torrent datoteke<b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr "<b>Premjestite zvršeno</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr "Naziv: "
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr "<b>Naziv<b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr "Glavno"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr "Maksimalna brzina dijeljenja:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr "Maksimalno veza:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr "Maksimalno ulaza dijeljenja:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr "Maksimalna brzina preuzimanja:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Raspon</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr "Auto upravljanje:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr "Dodaj Pauzirano:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr "Red Äekanja na:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr "<b>Na Äekanju</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr "<b>NNadgledana mapa:</b>"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr "minuta"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr "1 minuta"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr "1 sekunda"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr "sekunda"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr "Stanje"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr "RazluÄivost"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr "Dijelitelji/ToÄke"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr "Boja preuzimanje:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr "Boja slanja:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr "<b>Graf povezivanja</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr "<b>Graf propusnosti</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr "DHT Ävorovi:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr "Predspremljeni DHT Ävorovi:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr "DHT torenti:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr "<b>Dijelitelji / ToÄke</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr "<b>Boje grafa</b>"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr "WebUi"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+"Deluge web suÄelje nije instalirano, molimo instalirajte\n"
+"suÄelje i pokuÅ¡ajte ponovno"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr "Omogući web suÄelje"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr "Omogući SSL"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr "Nadzirani ulaz:"
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Pogrešan naziv, valjani znakovi:[a-z0-9_-]"
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr "Prazan naziv"
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr "Naziv već postoji"
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr "Nepoznat naziv"
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr "Nepoznat torrent"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr "Mogućnosti_naziva"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr "_Ukloni naziv"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr "_Dodaj naziv"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr "Postavke naziva"
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr "Naziv"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr "tracker1.org"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr "<b>Postavke naziva</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr "Primjenite po torrentu maks. postavke:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr "Maksimum"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr "Primjeni postavke reda Äekanja:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr "Primjeni postavke mape:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 linija po pratitelju)</i>"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr "Automatski dodaj naziv:"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr "Dodajte naziv"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr "<b>Dodajte naziv</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Koristite boÄnu traku za dodavanje, ureÄ‘ivanje i uklanjanje naziva. </i>\n"
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr "<b>Nazivi</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr "Blinkanje obavijesti prikazano"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr "Obavijest skoÄnog prozora nije omogućena."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr "Obavijest skoÄnog prozora prikazana"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr "ZvuÄna obavijest nije omoguÄena"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr "pygame nije i9nstaliran"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr "ZvuÄna obavijest nije uspjela %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr "ZvuÄna obavijest uspjela"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr "Završeno preuzimanje torrenta"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+"Torrent \"%(name)s\" koji sadrži %(num_files)i datoteka je završio "
+"preuzimanje."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr "Obavijesti"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr "Odaberite zvuÄnu datoteku"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr "Dogodila se greška prilikom slanja obavijesti na e-poštu: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr "Poslužitelj nije ispravno odgovorio na pozdrav dobrodošlice: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr "Poslužitelj nije prihvatio kombinaciju korisniÄkog imena/lozinke: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr "Obavijesna e-pošta je poslana."
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr "Završeno preuzimanje torrenta \"%(name)s\""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+"Ova e-pošta vas obaviještava da je Deluge završio sa preuzimanjem Torrenta "
+"\"%(name)s\", Å¡to ukljuÄuje %(num_files)i files.\n"
+"Za zaustavljanje primanja ovih obavijesti, jednostavno iskljuÄite e-poÅ¡tu "
+"obavijesti u postavkama Delugea.\n"
+"\n"
+"Hvala Vam,\n"
+"Deluge."
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr "Blinkanje ikone u traci sustava omogućeno"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr "SkoÄni prozor omogućen"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr "Zvuk omogućen"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr "<b>Obavijesti korisniÄkog suÄelja</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr "<b>Primatelji</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr "Poslužitelj zahtijeva TLS/SSL"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr "<b>E-pošta obavijesti</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+"Ova postavka ustvari ne znaÄi da ćete primiti obavijest za sve ove dogaÄ‘aje."
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr "Pretplate"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr "ZvuÄne postavke"
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr "Raspakiravanje"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr "Otpakiraj u:"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr "Izradite naziv pod-mape po torrentu"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Ova mogućnost će kreirati pod-mapu koristeći naziv torrenta unutar odabranog "
+"raspakiranog direktorija i staviti otpakirane datoteke tamo."
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr "Raspored"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr "Limit preuzimanja:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr "Limit dijeljenja:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr "Aktivni torrenti:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr "Aktivno preuzimanje:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr "Aktivno dijeljenje:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Spore postavke</b>"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr "Preglednik datoteka"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr "Natrag"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr "Naprijed"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr "Stvori"
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr "Pomoć"
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr "Odjava"
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr "Spremi"
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr "Ukloni s podacima"
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr "Dodaj povezivanje"
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr "RaÄunalo:"
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr "Nemoguće dodavanje raÄunala: {0}"
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr "Pomakni"
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr "Pregledaj"
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr "Uredi povezivanje"
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr "Nemoguće ureÄ‘ivanje raÄunala"
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr "Prijava"
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr "Prijava neuspjela"
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr "Upisali ste neispravnu lozinku"
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr "Javni"
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr "Posljednji prijenos"
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr "Postavi maksimalan broj veza"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr "Brzina preuzimanja"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr "5 KiB/s"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr "10 KiB/s"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr "30 KiB/s"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr "80 KiB/s"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr "300 KiB/s"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr "Postavi maksimalnu brzinu preuzimanja"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr "Brzina dijeljenja"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr "Postavi maksimalnu brzinu dijeljenja"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr "Protokol prometa preuzimanje/dijeljenje"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr "Slobodan prostor u mapi preuzimanja"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr "<b>IP</b> {0}"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr "Poveži se"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr "Zaustavi pozadinski program"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr "Prekini povezivanje"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr "Pokreni pozadinski program"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr "Promijeni zadanu lozinku"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+"PreporuÄljiva je promjena zadane lozinke.<br><br>Želite li ju odmah "
+"promijeniti?"
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr "Filtri"
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr "Povezivanje je obnovljeno"
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr "Povezivanje je prekinuto"
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr "Pvezivanje s web poslužiteljem je prekinuto!"
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr "Pvezivanje s web poslužiteljem je prekinuto"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr "Prisilno provjeri"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr "Proširi sve"
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr "Pojedinosti"
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr "Komentar:"
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr "Općenito"
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr "Osobno"
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr "Provjeri je li dostupna nova inaÄica Delugea"
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr "Pauziraj torrent"
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr "Instaliraj"
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr "Maksimalan broj veza:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Maksimalna brzina preuzimanja (KiB/s):"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Maksimalna brzina dijeljenja (KiB/s):"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr "Maksimum poluotvorenih veza:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Maksimum pokušaja veze u sekundi:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr "Maksimalni broj ulaza za dijeljenje:"
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr "Potraži više"
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr "Preuzmi"
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
+
+#~ msgid "pynotify is not installed"
+#~ msgstr "pynotify nije instaliran"
+
+#~ msgid "pynotify failed to show notification"
+#~ msgstr "pynotify nije uspio prikazati obavijest"
+
+#~ msgid "<b><i><big>Notifications</big></i></b>"
+#~ msgstr "<b><i><big>Obavijesti</big></i></b>"
+
+#~ msgid "Ignore"
+#~ msgstr "Zanemari"
+
+#~ msgid "_Normal Priority"
+#~ msgstr "_Normalni prioritet"
+
+#~ msgid "_High Priority"
+#~ msgstr "_Visoki prioritet"
+
+#~ msgid "_Start"
+#~ msgstr "_Pokreni"
+
+#~ msgid "Associate Magnet links with Deluge"
+#~ msgstr "Spoji Magnet poveznice sa Delugeom"
diff --git a/deluge/i18n/hu.po b/deluge/i18n/hu.po
new file mode 100644
index 0000000..126c403
--- /dev/null
+++ b/deluge/i18n/hu.po
@@ -0,0 +1,6147 @@
+# Hungarian translation for deluge
+# Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2017-10-23 22:12+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Hungarian <hu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr ""
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr ""
+
+#: deluge/common.py:410
+msgid "K"
+msgstr ""
+
+#: deluge/common.py:411
+msgid "M"
+msgstr ""
+
+#: deluge/common.py:412
+msgid "G"
+msgstr ""
+
+#: deluge/common.py:413
+msgid "T"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr ""
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr ""
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr ""
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
diff --git a/deluge/i18n/id.po b/deluge/i18n/id.po
new file mode 100644
index 0000000..fb60f07
--- /dev/null
+++ b/deluge/i18n/id.po
@@ -0,0 +1,4098 @@
+# Indonesian translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-12-14 12:15+0000\n"
+"Last-Translator: Daya Adianto <Unknown>\n"
+"Language-Team: Indonesian <id@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Sambungan-sambungan"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/detik"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Kata Sandi:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Dari:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Aktif"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Lokasi Unduhan</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Hentikan penyebaran pada rasio:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Singkirkan pada rasio"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Label tidak sah, karakter yang sah:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Label Kosong"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Label Tak Dikenal"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Torrent Tak Dikenal"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Pengaturan Label"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Pengaturan Label</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Kecepatan mengunggah:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Kecepatan mengunduh:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Koneksi:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Terapkan aturan per torrent:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maksimal"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Terapkan Aturan antrian:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Antrian"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Pindahkan yang telah selesai ke:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Lokasi"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 baris per tracker)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Otomatis pasang label:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Tambah Label"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Tambah Label<b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Nama:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Label</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Umum</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Pengaturan</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Text (Zipped)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Text (Uncompressed)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Versi Tidak Sah"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Cek daftar terbaru setiap:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Tanggal:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Ukuran Berkas:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Info</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Waspada"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Kesalahan"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Alamat"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Klien"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Perkembangan"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Kecepatan Unduh"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Kecepatan Unggah"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrent Mengantri"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrent Mengantri"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Tidak terbatas"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Lainnya..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Unduh"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Unggah"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Unduh"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Jaringan"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Lebar Pita"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Plugin"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Plugin"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Nama berkas"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Ukuran"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Pilih berkas .torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Bekas torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Semua berkas"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Lapis"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Tracker"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Tidak Terhubung"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Kecepatan Mengunduh"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Kecepatan Mengunggah"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Tidak ada koneksi yang datang"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Label"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Semua"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Mengunduh"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Menyebarkan"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Atur Tak Terbatas"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Pilih direktori untuk memindahkan berkas"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Prioritas"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Nama"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Terunduh"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Terunggah"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Seeder"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Peer"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ETA"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Rasio"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Tersedia"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Berkas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Edit"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Tampilan"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Bantuan"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Tambah torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Tambah Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Hapus torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "HapusTorrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Tunda"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Lanjutkan"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Naikkan Antrian"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Turunkan Antrian"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Pengaturan"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Status Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Peer:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>ETA:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Ukuran Total:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Nama:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Prioritaskan Awal/Akhir"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Versi Terbaru Tersedia!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Jangan tampilkan halaman ini di kemudian hari"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrent</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Penuh"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Ringkas"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Pengalokasian</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Gunakan Alokasi Ringkas"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Port Aktif:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Ke:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Aktifkan"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Aktifkan ikon system tray"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Minimalkan ke tray ketika ditutup"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Antrikan torrent-torrent baru di puncak"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "Details"
+#~ msgstr "Detil"
+
+#~ msgid "Files"
+#~ msgstr "Berkas"
+
+#~ msgid "Download"
+#~ msgstr "Unduh"
+
+#~ msgid "Upload"
+#~ msgstr "Unggah"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge dikunci"
+
+#~ msgid "Start"
+#~ msgstr "Mulai"
+
+#~ msgid "# Of Files"
+#~ msgstr "Jumlah Berkas"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Hapus berkas .torrent"
+
+#~ msgid "Availability"
+#~ msgstr "Ketersediaan"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Hapus berkas terunduh"
+
+#~ msgid "File"
+#~ msgstr "Berkas"
+
+#~ msgid "General"
+#~ msgstr "Umum"
+
+#~ msgid "Pieces"
+#~ msgstr "Potongan"
+
+#~ msgid "Password"
+#~ msgstr "Kata Sandi"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Kata sandi salah, coba lagi"
+
+#~ msgid "Queue Position"
+#~ msgstr "Posisi Antrian"
+
+#~ msgid "Save"
+#~ msgstr "Simpan"
+
+#~ msgid "Remove"
+#~ msgstr "Hapus"
+
+#~ msgid "Resume all"
+#~ msgstr "Lanjutkan semua"
+
+#~ msgid "Submit"
+#~ msgstr "Kirim"
+
+#~ msgid "Torrent list"
+#~ msgstr "Daftar torrent"
+
+#~ msgid "Speed"
+#~ msgstr "Kecepatan"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Unggah torrent"
+
+#~ msgid "seconds"
+#~ msgstr "detik"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Prioritaskan potongan-potongan awal dan akhir"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Kecepatan Unggah Maksimal"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Kecepatan Unduh Maksimal"
+
+#~ msgid "To"
+#~ msgstr "Sampai"
+
+#~ msgid "Random"
+#~ msgstr "Acak"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Pilihlah sebuah url atau torrent, tidak keduanya"
+
+#~ msgid "No data"
+#~ msgstr "Tidak ada data"
+
+#~ msgid "From"
+#~ msgstr "Dari"
+
+#~ msgid "Config"
+#~ msgstr "Konfigurasi"
+
+#~ msgid "Disable"
+#~ msgstr "Non-aktifkan"
+
+#~ msgid "Eta"
+#~ msgstr "Eta"
+
+#~ msgid "Logout"
+#~ msgstr "Keluar"
+
+#~ msgid "Login"
+#~ msgstr "Masuk"
+
+#~ msgid "Pause all"
+#~ msgstr "Tunda semua"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Perbaharui halam setiap:"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Rasio Berbagi"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Atur Timeout"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Tambahkan Dalam Kondisi Tertunda"
+
+#~ msgid "Download Location"
+#~ msgstr "Lokasi Pengunduhan"
+
+#~ msgid "no uri"
+#~ msgstr "tanpa uri"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "pembaharuan harus > 0"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Koneksi Maksimal"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Alokasi Ringkas"
+
+#~ msgid "Disabled"
+#~ msgstr "Non-aktif"
+
+#~ msgid "Level"
+#~ msgstr "Tingkatan"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Tak terbatas"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Kecepatan Pengunduhan Maksimum (Kib/s)"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Kecepatan Pengunggahan Maksimum (Kib/s)"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Simpan berkas .torrent ke"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Simpan semua hasil pengunduhan di"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Per Torrent"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Jumlah penyebaran yang aktif"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Hentikan penyebaran ketika rasio mencapai"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Jumlah torrent yang aktif"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Jumlah pengunduhan yang aktif"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = tak terbatas"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Singkirkan torrent ketika rasio mencapai"
+
+#~ msgid "Template"
+#~ msgstr "Kerangka"
+
+#~ msgid "Cache templates"
+#~ msgstr "Simpanan kerangka"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "Text and image"
+#~ msgstr "Teks dan gambar"
+
+#~ msgid "Text Only"
+#~ msgstr "Hanya Teks"
+
+#~ msgid "Image Only"
+#~ msgstr "Hanya Gambar"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Perubahan-perubahan ini telah disimpan"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Hentikan penyebaran pada rasio"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Masukkan daftar nilai-nilai"
+
+#~ msgid "translate something"
+#~ msgstr "terjemahkan sesuatu"
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Pastikan jumlah digit tidak lebih dari %s."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Pastikan nilai ini lebih dari atau sama dengan %s."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Pastikan nilai ini kurang dari atau sama dengan %s."
+
+#~ msgid "Enter a number."
+#~ msgstr "Masukkan angka."
+
+#~ msgid "Statistics"
+#~ msgstr "Statistik"
+
+#~ msgid "Delete"
+#~ msgstr "Hapus"
+
+#~ msgid "Connect"
+#~ msgstr "Hubungkan"
+
+#~ msgid "Stop"
+#~ msgstr "Hentikan"
+
+#~ msgid "Other.."
+#~ msgstr "Lain-lain.."
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge terlindungi dengan password.\n"
+#~ "Untuk menampilkan layar Deluge, harap masukkan kata sandi Anda."
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Mengunduh %.2f%%"
+
+#~ msgid "Import Now"
+#~ msgstr "Impor Sekarang"
+
+#~ msgid "Add"
+#~ msgstr "Tambah"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Batas Waktu (detik)"
+
+#~ msgid "Inactive"
+#~ msgstr "Tak Aktif"
+
+#~ msgid "Refresh status"
+#~ msgstr "Perbarui status"
+
+#~ msgid "Unknown"
+#~ msgstr "Tak dikenal"
+
+#~ msgid "Filters"
+#~ msgstr "Saringan"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Mengimpor %s"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torrent melampaui rasio berhenti."
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Betulkan kesalahan-kesalahan di atas dan coba kembali"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "About"
+#~ msgstr "Risalah"
+
+#~ msgid "Queue Top"
+#~ msgstr "Antrian Teratas"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Antrian Terbawah"
+
+#~ msgid "Extra's"
+#~ msgstr "Ekstra"
+
+#~ msgid "Forced"
+#~ msgstr "Paksa"
+
+#~ msgid "Encryption"
+#~ msgstr "Enkripsi"
+
+#~ msgid "Handshake"
+#~ msgstr "Jabat tangan"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Jumlah Maksimum Percobaan Koneksi per Detik"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Jumlah Maksimum Koneksi Setengah Terbuka"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr ""
+#~ "Jalankan kembali daemon dan webui setelah merubah aturan-aturan berikut"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Penambahan Otomatis diaktifkan"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Penambah Otomatis folder"
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Pilih pilihan yang sah. %s bukan merupakan pilihan yang tersedia."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Masukkan sebuah nilai yang sah."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Masukkan tanggal yang benar."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Masukkan waktu yang benar."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Masukkan waktu dan tanggal yang benar."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Masukkan alamat surat elektronik yang benar."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Tidak ada berkas yang dikumpulkan."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Berkas yang dikumpulkan kosong."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Masukkan URL yang benar."
+
+#~ msgid "Move To"
+#~ msgstr "Pindahkan ke"
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Masukkan alamat IPv4 yang sah."
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Pembaharuan otomatis (detik)"
+
+#~ msgid "Button style"
+#~ msgstr "Gaya tombol"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Kesalahan pada pengaturan torrent."
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Pembaharuan otomatis:"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "ini belum melakukan apa-apa...\n"
diff --git a/deluge/i18n/is.po b/deluge/i18n/is.po
new file mode 100644
index 0000000..1ad99b6
--- /dev/null
+++ b/deluge/i18n/is.po
@@ -0,0 +1,4642 @@
+# Icelandic translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2009-11-04 17:15+0000\n"
+"Last-Translator: mankoneko <nkenny@simnet.is>\n"
+"Language-Team: Icelandic <is@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "Kíb/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Nafn þjóns:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Tengi:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Notandanafn:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Aðgangsorð:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Frá:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Virkt"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Stillingar"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Veldu möppu"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Ãkvörðunarstaður niðurhals</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Hámarks upphalshraði:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Hámarksfjöldi tenginga:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Hámarksfjöldi upphalshólfa"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Hámarks niðurhalshraði:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Bandvídd</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Hætta að deila við hlutfall:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Fjarlægja við hlutfall"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Efst"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Neðst"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>à röð</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Valkostir"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Ógilt merki, gildir stafir: [a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Tómt merki"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Merkimiði er áður til"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Óþekkt merki"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Óþekktur straumur"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Merki"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Merkimiða_valkostir"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_Fjarlægja merkimiða"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_Bæta við merkimiða"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Merkimiðavalkostir"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Merkimiðavalkostir</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Upphalshólf:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Upphalshraði:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Niðurhalshraði:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Tengingar:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Virkja hámarksstillingar fyrir hvern straum:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Hámark"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Stjórnast sjálfvirkt"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Virkja biðraðarstillingar:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Röð"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Flytja klárað í:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Virkja staðsetningarstillingar:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Staðsetning"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 lína á hvern sporrekjanda)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Virkja merkimiða sjálfvirkt:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Sporrekjendur"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Bættu við merki"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Bæta við merkimiða</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Nafn:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Notaðu hliðarstikuna til að bæta við, breyta og fjarlægja merkimiða. "
+"</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Merkimiðar</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Almennt</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Stillingar</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "IPtölulisti Emule (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer texti (í zip formati)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian texti (óþjappaður)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Óglidur leiðandi"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Ógildur töfrakóði"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Ógild útgáfa"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Útilokunarlisti"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "Slóð:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Dagar"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Leita eftir nýjum lista hverja:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Flytja inn bannlista við ræsingu:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Hala niður bannlistaskjal ef nauðsyn krefur og flytja inn skjalið."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Athuga niðurhal og innflutning"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Hala niður nýju bannlistaskjali og flytja það inn."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Neyða til niðurhals og innflutnings"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b> Valkostir</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Gerð:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Dagsetning:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Stærð skjals:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Upplýsingar</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Tilkynning í lagi"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Tilkynning send"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Viðvörun"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Villa"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Veffang"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Biðill"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Framvinda"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Niðurhalshraði"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Hraði upp"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Straumur"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " straumar í biðröð"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " straumur í biðröð"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Ótakmarkað"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Sett af stað"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Annað..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Niður:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Upp:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Niður"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Upp"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Setja hámarks niðurhalshraða"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Setja hámarks upphalshraða"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Straumi lokið"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Niðurhöl"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Netkerfi"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Bandvídd"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Viðmót"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Annað"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Púki"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Staðgengill"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Hliðarforrit"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Hliðarforrit"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Veldu hliðarforritið"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Hliðarforritaegg"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Heiti skjals"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Stærð"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Veldu .torrent skjal"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Straumskjöl"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Öll skjöl"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Bindi"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Sporrekjandi"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Veldu skrá"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Veldu möppu"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Vista .torrent skjal"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Ekki tengd(ur)"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Tengingar"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Niðurhalshraði"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Upphalshraði"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Reglu-umferð upphal/niðurhal"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT greinar"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Engar tengingar inn!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Setja hámark tenginga"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Straumar"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Merki"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Allt"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Hala niður"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Deili"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "à biðstöðu"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Athuga"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "à biðröð"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Ekkert"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Enginn merkimiði"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Hýsill"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Kveikt"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Slökkt"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Stilla sem ótakmarkað"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Veldu möppu til að flytja skjöl í"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Settu hámark upphalshólfa"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Forgangur"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Smáatriði:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Nafn"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Niðurhalað"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Upphalað"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Deilendur"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Jafningjar"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ÃKT"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Hlutfall"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Avail"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Bætt við"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Skrá"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Bæta við straumi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Búa til straum"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Breyta"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Tengingastjórnandi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Straumur"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Skoða"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Tækjastika"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Hliðarstika"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Stöðu_stika"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "Fl_ipar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Súlur"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "Hl_iðarstika"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Sýna _núll hæfni"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Sýna _sporrekjendur"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Hjálp"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Algengar Spurningar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Bæta við straumi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Bæta við straumi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Fjarlægja straum"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Fjarlægja straum"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Setja valda strauma í biðstöðu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Gera hlé"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Byrja aftur á völdum straumum"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Byrja aftur"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Setja straum í biðröð upp"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Röð upp"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Setja straum í biðröð niður"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Röð niður"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Kjörstillingar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Tengingastjóri"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Breiða úr öllum"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Ekki hala niður"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Venjulegur forgangur"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Hár forgangur"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "H_æsti forgangur"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Stjórnað sjálfvirkt:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Staða í deilingu:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Tími sem deildur:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Tími sem virkur:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Staða sporrekjanda:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Framboð:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Jafningjar:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Deilendur:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Brot:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Ãætlaður Tími:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Næsta Tilkynning:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Deili Hlutfall:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Upphalað:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Niðurhalað:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Bætt við daginn:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Staða"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>fjöldi skráa:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hakk:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Sporrekjandi:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Heildar Stærð:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Nafn:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Slóð:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Staða:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Nánar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Skrár"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Jafningjar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Flutningi lokið:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Einka"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Setja forgang fyrst/síðast"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_Breyta sporrekjendum"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Valkostir"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Fjarlægja straum?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>Ertu viss um að þú viljir fjarlægja valinn straum?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>Viðeigandi .torrent verður eytt!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Gögnum sem halað hefur verið niður verður eytt!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Fjarlægja valinn straum"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Ný útgáfa"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Ný útgáfa komin út!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Útgáfa til taks:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Núverandi útgáfa:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Ekki sýna þetta samtal í framtíðinni"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Heimsækja vefsíðu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Bæta við jafningja eftir IR(IP)"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Velja allt"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Setja alla í biðstöðu"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Byrja aftur á völdum straumum."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Byrja_aftur á öllum"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Bæta við straumum"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_Slóð"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Upplýsinga_hakk"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_Fjarlægja"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Straumar</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "S_krár"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Fullt"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Samþjappað"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Niðursetning</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Hámarkshraði niðurhals:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Hámarks hraði upphals:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Bæta við í_Biðstöðu"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Setja fyrstu/síðustu hluta í forgang"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Hverfa aftur til upprunastillinga"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Taka til allra"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Bæta við slóð"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Frá slóð</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Bæta við upplýsingahakki"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Frá upplýsingahakki</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Upplýsingahakk:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Sporrekjendur:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Búa til straum"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Búa til straum</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Ma_ppa"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Fjartengd leið"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Skjöl</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Höfundur:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Athugasemdir:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Upplýsingar"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Vefdeilendur"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Stærð hluta:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Setja einkastöðuveifu"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Bæta þessum straum í dvölina"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Færið inn fjartengda leið"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Fjartengd leið</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Leið:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Bý til straum"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Vista .torrent sem"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "Vista .torrent skjal"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Straumar í biðröð"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Bæta við straumum í biðröð</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Bæta við straumum sjálfkrafa við tengingu"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "Merkimiði"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Bæta við jafningja"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Bæta við jafningja</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "nafn þjóns:tengi"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Bæta við þjóni"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Tengingastjóri</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Ræsa staðbundinn púka"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Tengjast völdum þjóni sjálfkrafa við ræsingu"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Ræsa heimaþjón sjálfkrafa ef þarf"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Ekki sýna þetta samtal við ræsingu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Niðurhöl</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Bæta við .torrent skjölum sjálfrkrafa frá:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Hala niður í:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Afrit af .torrent skjölum til:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Möppur</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Nota heildarniðursetningu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Heildarniðursetning úthlutar öllu því plássi sem þörf er á fyrir strauminn "
+"og kemur í veg fyrir brotadreyfingu."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Nota hlutaniðursetningu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Hlutaniðursetning úthlutar einungis plássi eftir því sem þarf."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Setja fyrstu og síðustu hluta straums í forgang"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Setja fyrstu og síðastu hluta skjala í straumi í forgang"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Netkerfi</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Nota tengi af handahófi"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge velur sjálfvirkt tengi til að nota í hvert skipti."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Virkt tengi:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Til:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Prófa virkt tengi"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "Tengi á innleið"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "Tengi á útleið"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"TÞ (TOS) bætið sem er sett í IR (IP) hausinn í hverjum pakka sem sendur er "
+"til jafningja (þar með talinna vefdeilenda). Býst við gildi í sextándakerfi "
+"(hex)."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "TÞ (TOS) bæti deilanda:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TÞ(TOS)</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "AToS"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Algilt tengja og spila (UPnP)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NHF-TSR (nat-pmp)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NHF TengisSkráningarReglur (nat-pmp)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Viðskipti jafningja"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "TDT (lsd)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+"Uppgötvun staðarþjónustu finnur staðbundna jafningja í netkerfi þínu."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Dreifð hakktafla gæti bætt fjölda virkra tenginga."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Aukahlutir netkerfis</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "à innleið:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Stig:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Neytt\n"
+"Virkt\n"
+"Óvirkt"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Handaband\n"
+"Fullur straumur\n"
+"Hvort sem er"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "à útleið:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Dulrita allan straum"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Dulritun</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Bandvídd</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Hámarksfjöldi tengingatilrauna á sekúndu:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Hámark hálfopinna tenginga:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr "Hámarks upphalshraði fyrir alla strauma. Settu -1 fyrir ótakmarkað."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Hámarks upphalshraði (KíB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "Hámarksfjöldi leyfðra tenginga. Settu -1 fyrir ótakmarkað."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Hámarksfjöldi tenginga:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Hámarksfjöldi upphalshólfa fyrir alla strauma. Settu -1 fyrir ótakmarkað."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Hámarksfjöldi upphalshólfa:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Hámarks niðurhalshraði fyrir alla strauma. Settu -1 fyrir ótakmarkað."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Hámarks niðurhalshraði (KíB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Hundsa takmörk á staðbundnu netkerfi"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Regla um IR (IP) hámark"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"ef hakað er í hér mun áætluð regla um RSG/IR (TCP/IP) hámark verða dregin "
+"frá gengistakmörkunum, til að forðast það að fara framyfir takmörk í "
+"staðbundinni umferð"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Algild bandvíddarnotkun</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"Hámarksfjöldi upphalshólfa á hvern straum. Settu -1 fyrir ótakmarkað."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "Hámarksfjöldi tenginga á hvern straum. Settu -1 fyrir ótakmarkað."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Bandvíddarnotkun á hvern straum</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Viðmót</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Virkja"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Klassískur hamur mun fela mest af virkni púkans og lætur Deluge líta út sem "
+"eitt forrit. Notaðu þetta ef þú vilt ekki nýta þér það að keyra Deluge sem "
+"púka. Þú þarft að endurræsa Deluge til að þessar stillingar verði virkar."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Klassískur hamur</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Sýna hraða dvalar á titilstiku"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Aðalgluggi</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Sýna alltaf"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Færa samtalið í forgrunn"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Bæta straumum í samtal</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Virkja táknmynd í kerfisbakka"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Minnka niður í bakka við lokun"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Byrja í bakka"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Setja aðgangsorð á kerfisbakka"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Kerfisbakki</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Annað</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Láttu mig vita um nýjar útgáfur"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge mun athuga þjónana og segja þér ef nýrri útgáfa hefur komið út."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Uppfærslur</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Hjálpaðu okkur að bæta Deluge með því að senda okkur upplýsingar um Python "
+"útgáfu, PyGTK útgáfu, stýrikerfi og örgjörva. Alls engar aðrar upplýsingar "
+"eru sendar."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Já, vinsamlegast sendu nafnlausa tölfræði"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Kerfisupplýsingar</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Púki</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Púkatengi:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Tengi</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Leyfa fjartengingar"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Tengingar</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Leita reglulega eftir nýjum útgáfum á heimasíðunni."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Annað</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Biðröð</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Setja nýja strauma efst í röð"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Alls virkt í deilingu:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Alls virkt:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Alls virkt í niðurhali:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Ekki telja hæga strauma með"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Virkir straumar</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Takmörk deilingarhlutfalls:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Hlutfall deilingar og tíma:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Deilingartími (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Hætta að deila þegar deilihlutfall nær:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Fjarlægja straum þegar deilihlutfall nær:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Deili</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Staðgengill</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Hýsill:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Enginn\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 w/ Auth\n"
+"HTTP\n"
+"HTTP w/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Jafningi</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Vefdeiling</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Sporrekjandi</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Hliðarforrit</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Útgáfa:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Heimasíða:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Tölvupóstfang höfundar:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Setja upp hliðarforrit"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Endurskanna hliðarforrit"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Sýna Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Byrja aftur á öllum"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_Hámarks niðurhalshraði"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_Hámarks upphalshraði"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Hætta og slökkva á púka"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Opna möppu"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Byrja_aftur"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Valmögu_leikar"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Röð"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Uppfæra sporrekjanda"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Fjarlægja straum"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "_Neyða til endurathugunar"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "Færa_Geymslu"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "_Hámark tengingar"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Hámarksfjöldi upphals_hólfa"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Sjálfstjórnað"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Fjarlægja valinn straum?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Ef þú fjarlægir þessi gögn eru þau endanlega glötuð."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Breyta sporrekjendum"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Breyta sporrekjendum</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Bæta við sporrekjanda"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Bæta við sporrekjanda</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Breyta sporrekjanda"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Breyta sporrekjanda</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Sporrekjandi:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Fjarlægja með _gögnum"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Fjarlægja_straum"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Færa geymslu"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Færa geymslu</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Ãfangastaður:"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Hraði:</b>"
+
+#~ msgid "Details"
+#~ msgstr "Upplýsingar"
+
+#~ msgid "Add"
+#~ msgstr "Bæta við"
+
+#~ msgid "# Of Files"
+#~ msgstr "# skjala"
+
+#~ msgid "About"
+#~ msgstr "Um"
+
+#~ msgid "Ava"
+#~ msgstr "Frb"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Sjálfvirk endurskoðun"
+
+#~ msgid "Availability"
+#~ msgstr "Framboð"
+
+#~ msgid "Config"
+#~ msgstr "Stillingar"
+
+#~ msgid "Disable"
+#~ msgstr "Gera óvirkt"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Eyða niðurhöluðum skjölum."
+
+#~ msgid "Download"
+#~ msgstr "Hala niður"
+
+#~ msgid "Next Announce"
+#~ msgstr "Næsta tilkynning"
+
+#~ msgid "File"
+#~ msgstr "Skjal"
+
+#~ msgid "Logout"
+#~ msgstr "Útskráning"
+
+#~ msgid "Login"
+#~ msgstr "Innskráning"
+
+#~ msgid "General"
+#~ msgstr "Almennt"
+
+#~ msgid "Pause all"
+#~ msgstr "Gera hlé á öllum"
+
+#~ msgid "Pieces"
+#~ msgstr "Hlutar"
+
+#~ msgid "Password"
+#~ msgstr "Aðgangsorð"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Aðgangsorð er ógilt, reyndu aftur"
+
+#~ msgid "Queue Position"
+#~ msgstr "Staða í röð"
+
+#~ msgid "Save"
+#~ msgstr "Vista"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Endurskoða síðu hverja:"
+
+#~ msgid "Remove"
+#~ msgstr "Fjarlægja"
+
+#~ msgid "Reannounce"
+#~ msgstr "Endurtilkynna"
+
+#~ msgid "Resume all"
+#~ msgstr "Byrja alla aftur"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Hlutfall deilingar"
+
+#~ msgid "Set"
+#~ msgstr "Setja"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Setja hámarkstíma"
+
+#~ msgid "Start"
+#~ msgstr "Byrja"
+
+#~ msgid "Torrent list"
+#~ msgstr "Straumalisti"
+
+#~ msgid "Submit"
+#~ msgstr "Senda inn"
+
+#~ msgid "Speed"
+#~ msgstr "Hraði"
+
+#~ msgid "Upload"
+#~ msgstr "Hala upp"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Hala upp"
+
+#~ msgid "Total Size"
+#~ msgstr "Heildarstærð"
+
+#~ msgid "Url"
+#~ msgstr "Slóð"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Staða sporrekjanda"
+
+#~ msgid "seconds"
+#~ msgstr "sekúndur"
+
+#~ msgid "Download Location"
+#~ msgstr "Ãkvörðunarstaður niðurhals"
+
+#~ msgid "no uri"
+#~ msgstr "Engin slóð"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "Endurskoðun verður að vera > 0"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Mesti fjöldi tenginga"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Mesti upphalshraði"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Mesti niðurhalshraði"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Hlutaniðursetning"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Setja fyrstu og síðustu hluta í forgang"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Mesti fjöldi upphalshólfa"
+
+#~ msgid "Random"
+#~ msgstr "Af Handahófi"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Villa í valmöguleikum straums"
+
+#~ msgid "Ports"
+#~ msgstr "Tengi"
+
+#~ msgid "From"
+#~ msgstr "Frá"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Veljið slóð eða straum, ekki bæði."
+
+#~ msgid "No data"
+#~ msgstr "Engin gögn"
+
+#~ msgid "Extra's"
+#~ msgstr "Aukahlutir"
+
+#~ msgid "Handshake"
+#~ msgstr "Handatak"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Aðal-DHT"
+
+#~ msgid "Disabled"
+#~ msgstr "Óvirkt"
+
+#~ msgid "UpNP"
+#~ msgstr "AToS (upnp)"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Jafningjasamskipti"
+
+#~ msgid "Forced"
+#~ msgstr "Neytt"
+
+#~ msgid "Encryption"
+#~ msgstr "Dulritun"
+
+#~ msgid "Either"
+#~ msgstr "Annað hvort"
+
+#~ msgid "Inbound"
+#~ msgstr "à leið inn"
+
+#~ msgid "Outbound"
+#~ msgstr "à leið út"
+
+#~ msgid "Level"
+#~ msgstr "Stig"
+
+#~ msgid "Global"
+#~ msgstr "Altækt"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Ótakmarkað"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Hámarks niðurhalshraði (Kíb/s)"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Hámarks upphalshraði (Kíb/s)"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Hámark hálf-opinna tenginga"
+
+#~ msgid "Port"
+#~ msgstr "Tengi"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Sjálfvirk viðbót virk"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr ""
+#~ "Endurræsa púka og vefNM (webui) eftr að þessum stillingum verður breytt"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Bæta sjálfkrafa við möppu"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Vista .torrent skjöl í"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Geyma allt niðurhal í"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Ã hvern straum"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Hámark tilrauna til tengingar á sekúndu"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Alls virkir í deilingu"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Hætta að deila þegar hlutfall nær"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Alls virkir straumar"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Alls virkir í niðurhali"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = ótakmarkað"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Fjarlægja straum þegar hlutfali er náð"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Virk hliðarforrit"
+
+#~ msgid "Cache templates"
+#~ msgstr "Geyma sniðmót í minni"
+
+#~ msgid "Button style"
+#~ msgstr "Hnappamót"
+
+#~ msgid "Current Password"
+#~ msgstr "Núverandi aðgangsorð"
+
+#~ msgid "Server"
+#~ msgstr "Þjónn"
+
+#~ msgid "Text and image"
+#~ msgstr "Texti og mynd"
+
+#~ msgid "Template"
+#~ msgstr "Sniðmót"
+
+#~ msgid "Text Only"
+#~ msgstr "Einungis texti"
+
+#~ msgid "Image Only"
+#~ msgstr "Einungis mynd"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Nýtt aðgangsorð (staðfesting)"
+
+#~ msgid "New Password"
+#~ msgstr "Nýtt aðgangsorð"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Þessar breytingar voru vistaðar"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Leiðréttu villurnar að ofan og reyndu aftur"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Gamla aðgangsorðið er ógilt"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Nýja aðgagnsorðið er ekki jafngilt Nýja aðgangsorðinu (staðfesting)"
+
+#~ msgid "Move To"
+#~ msgstr "Færa í"
+
+#~ msgid "Error in Path."
+#~ msgstr "Villa í leið"
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Færðu inn gilt gildi"
+
+#~ msgid "This field is required."
+#~ msgstr "Þessi reitur er skylda"
+
+#~ msgid "No"
+#~ msgstr "Nei"
+
+#~ msgid "Yes"
+#~ msgstr "Já"
+
+#~ msgid "Unknown"
+#~ msgstr "Óþekkt"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Færðu inn lista af gildum"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Veldu gildan valmöguleika. Þessi valmöguleiki er ekki einn af tiltækum "
+#~ "valmöguleikum."
+
+#~ msgid "translate something"
+#~ msgstr "þýða eitthvað"
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr ""
+#~ "Veldu gildan valmöguleika. %s er ekki einn af tiltækum valmöguleikum."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Færðu inn gilda dagsetningu."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Gakktu úr skugga um að það séu ekki fleiri en %s tölustafir í allt."
+
+#~ msgid "Enter a number."
+#~ msgstr "Færðu inn tölu."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Gakktu úr skugga um að þetta gildi sé meira en eða jafnt %s."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Gakktu úr skugga um að þetta gildi sé minna en eða jafnt %s."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Færðu inn heila tölu"
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Gakktu úr skugga um að þetta gildi hafi minnst %(min)d stafi (it has "
+#~ "%(length)d)."
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Gakktu úr skugga um að þetta gildi hafi mest %(max)d stafi (það hefur "
+#~ "%(length)d)."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr ""
+#~ "Gakktu úr skugga um að það séu ekki meira en %s tölustafir fyrir framan "
+#~ "kommu."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Gakktu úr skugga um að það séu ekki fleiri en %s tugastafir."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Hlaðið upp gildri mynd. Skjalið sem þú hlóðst upp var annað hvort ekki mynd "
+#~ "eða skemmd mynd."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Færðu inn gilda tímasetningu."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Færðu inn gilda dagsetningu/tímasetningu."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Færðu inn gilt tölvupóstfang."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "Ekkert skjal var sent inn. Athugið tegund umritunar á eyðublaðinu."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Ekkert skjal var sent inn."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Skjalið sem sent var inn er tómt."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Færðu inn gilda slóð."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Þessi slóð virðist vera brotinn hlekkur."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr ""
+#~ "Veldu gildan valmöguleika. %(value)s er ekki einn af tiltækum valmöguleikum."
+
+#~ msgid "Statistics"
+#~ msgstr "Tölfræði"
+
+#~ msgid "Delete"
+#~ msgstr "Eyða"
+
+#~ msgid "Files"
+#~ msgstr "Skjöl"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Þessi mappa er ekki til."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Færðu inn gilt IR4-fang (ipv4)"
+
+#~ msgid "Connect"
+#~ msgstr "Tengjast"
+
+#~ msgid "Queue Top"
+#~ msgstr "Raða efst"
+
+#~ msgid "Stop"
+#~ msgstr "Stöðva"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Raða neðst"
+
+#~ msgid "Recheck"
+#~ msgstr "Athuga aftur"
+
+#~ msgid "Move"
+#~ msgstr "Flytja"
+
+#~ msgid "Other.."
+#~ msgstr "Annað.."
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge er læst"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge er verndað með aðgangsorði.\n"
+#~ "Til að sýna Deluge gluggann, vinsamlegast færðu inn aðgangsorð þitt."
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Straumur er kominn yfir stöðvunarhlutfall."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "Þetta forrit er ókeypis hugbúnaður: þú getur dreift því og/eða breytt því "
+#~ "samkvæmt ákvæðum GNU General Public Licence (Almennt Leyfi Almennings) eins "
+#~ "og það var gefið út af Free Software Foundation; annað hvort útgáfu 3 af "
+#~ "Leyfinu, eða hvaða seinni útgáfu sem er (þitt val). Þessu forriti er dreift "
+#~ "í þeirri von að það komi að góðum notum, en ÃN ALLRAR ÃBYRGÃAR; jafnvel án "
+#~ "ábyrgðar á HÆFI TIL MARKAÃSSETNINGAR eða HÆFNI TIL ÃKVEÃINNA NOTA. Sjáið GNU "
+#~ "General Public Licence fyrir frekari upplýsingar. Þú ættir að hafa fengið "
+#~ "eintak af GNU General Public Licence með þessu forriti; ef ekki geturðu "
+#~ "skoðað <http://www.gnu.org/licences>."
+
+#~ msgid "Filters"
+#~ msgstr "Síur"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Hámarkstími (sekúndur)"
+
+#~ msgid "BlockList"
+#~ msgstr "Útilokunarlisti"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Hala niður %.2f%%"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Flyt inn %s"
+
+#~ msgid "Import Now"
+#~ msgstr "Flytja inn núna"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Fjöldi tilrauna til niðurhals"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Flytja inn þegar púki fer í gang"
+
+#~ msgid "Inactive"
+#~ msgstr "Óvirkur"
+
+#~ msgid "Refresh status"
+#~ msgstr "Endurskoða stöðu"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Útilokuð svið: %s"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Athuga alltaf eftir (daga/r)"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Bæta við í biðstöðu"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Stöðva deilingu við hlutfall"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Eyða straumskjali"
+
+#~ msgid "Eta"
+#~ msgstr "Ãkt"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Bæta við straumum</b></big>"
+
+#~ msgid "From Session"
+#~ msgstr "Frá dvöl"
+
+#~ msgid "page 6"
+#~ msgstr "síða 6"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "To"
+#~ msgstr "Til"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Sjálfvirk endurskoðun (sekúndur)"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Gildistakmörkun IR (ip)"
+
+#~ msgid "page 7"
+#~ msgstr "síða 7"
+
+#~ msgid "page 8"
+#~ msgstr "síða 8"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "_Quit"
+#~ msgstr "_Hætta"
+
+#~ msgid "Homepage"
+#~ msgstr "Heimasíða"
+
+#~ msgid "FAQ"
+#~ msgstr "AS (faq)"
+
+#~ msgid "Community"
+#~ msgstr "Samfélag"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "þetta gerir ekki neitt ennþá...\n"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 10"
+#~ msgstr "síða 10"
+
+#~ msgid "page 11"
+#~ msgstr "síða 11"
+
+#~ msgid "page 12"
+#~ msgstr "síða 12"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KíB\n"
+#~ "64 KíB\n"
+#~ "128 KíB\n"
+#~ "256 KíB\n"
+#~ "512 KíB"
+
+#~ msgid "Error setting label options"
+#~ msgstr "VIlla við stillingu merkimiðavalkosta"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "hámarks_upphals_hólf"
+
+#~ msgid "max_connections"
+#~ msgstr "hámark_tenginga"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "er_stjórnað_sjálfvirkt"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "stöðva_við_hlutfall"
+
+#~ msgid "stop_ratio"
+#~ msgstr "stöðva_hlutfall"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "fjarlægja_við_hlutfall"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "hámarks_upphals_harði"
+
+#~ msgid "max_download_speed"
+#~ msgstr "hámarks_niðurhals_hraði"
+
+#~ msgid "move_completed"
+#~ msgstr "flutningi_lokið"
+
+#~ msgid "move_completed_path"
+#~ msgstr "flytja_kláraða_leið"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "bæta_sporrekjendum_við_sjálfvirkt"
+
+#~ msgid "auto_add"
+#~ msgstr "bæta_við_sjálfvirkt"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Verk í vinnslu.."
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "%i sköl innifalin"
+
+#~ msgid "no label"
+#~ msgstr "enginn merkimiði"
+
+#~ msgid "State"
+#~ msgstr "Staða"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Þessi tölvupóstur er til þess að láta þig vita af því að Deluge hefur lokið "
+#~ "við að hala niður %s, %i skjöl innifalin.\n"
+#~ "Til að hætta að fá þessar tilkynningar, slökktu þá á tölvupóststilkynningum "
+#~ "í kjörstillingum Deluge.\n"
+#~ "\n"
+#~ "Takk fyrir,\n"
+#~ "Deluge"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP w/ Auth"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 w/ Auth"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Type"
+#~ msgstr "Gerð"
+
+#~ msgid "Username"
+#~ msgstr "Notandanafn"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Sýna hliðarstiku"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Lykill fannst ekki í '%s'"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Skírteini fannst ekki í '%s'"
+
+#~ msgid "Sidebar"
+#~ msgstr "Hliðarstika"
+
+#~ msgid "Show trackers"
+#~ msgstr "Sýna sporrekjendur"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Sýna lykilorðaleit"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Sýna núll hittni"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... og eyða straumskjali"
+
+#~ msgid "Admin"
+#~ msgstr "Kerfis"
+
+#~ msgid "Active time"
+#~ msgstr "Tími sem virkur"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... og eyða niðurhöluðum skjölum"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... og eyða öllum skjölum"
+
+#~ msgid "Cancel"
+#~ msgstr "Hætta við"
+
+#~ msgid "Clear"
+#~ msgstr "Hreinsa"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Tengjast púka"
+
+#~ msgid "Connected to"
+#~ msgstr "Tengdur"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Takmörk tengingar"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "N/H hraðatakmörk"
+
+#~ msgid "False"
+#~ msgstr "Ógilt"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : Straumalisti"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge innskráning"
+
+#~ msgid "Disk Space"
+#~ msgstr "Diskpláss"
+
+#~ msgid "Do not download"
+#~ msgstr "Ekki hala niður"
+
+#~ msgid "Label torrent"
+#~ msgstr "Setja merkimiða á straum"
+
+#~ msgid "High priority"
+#~ msgstr "Hár forgangur"
+
+#~ msgid "From Url"
+#~ msgstr "Frá slóð"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Neyða til endurskoðunar"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Sía á stikkorði"
+
+#~ msgid "Keyword"
+#~ msgstr "Stikkorð"
+
+#~ msgid "Highest priority"
+#~ msgstr "Hæsti forgangur"
+
+#~ msgid "Ok"
+#~ msgstr "Ã lagi"
+
+#~ msgid "Normal priority"
+#~ msgstr "Venjulegur forgangur"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Ekki tengt við púka"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Engar tengingar á innleið"
+
+#~ msgid "Move torrent"
+#~ msgstr "Færa straum"
+
+#~ msgid "Seed rank"
+#~ msgstr "Staða í deilingu"
+
+#~ msgid "Search"
+#~ msgstr "Leita"
+
+#~ msgid "Restart"
+#~ msgstr "Endurræsa"
+
+#~ msgid "Seeding time"
+#~ msgstr "Tími deilingar"
+
+#~ msgid "Select All"
+#~ msgstr "Velja Allt"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "U/H hraðatakmörk"
+
+#~ msgid "True"
+#~ msgstr "Rétt"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Uppfæra sporrekjanda"
+
+#~ msgid "Update"
+#~ msgstr "Uppfæra"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Hámark upphalshólfa"
+
+#~ msgid "apply_max"
+#~ msgstr "virkja_hámark"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Endurræsið vefNM (webui) handvirkt til að virkja stillingar"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "virkja_flutningi_lokið"
+
+#~ msgid "gtk-edit"
+#~ msgstr "mvk-breyta (gtk)"
+
+#~ msgid "gtk-connect"
+#~ msgstr "mkv-tengja (gtk)"
+
+#~ msgid "apply_queue"
+#~ msgstr "virkja_biðröð"
+
+#~ msgid "Stats"
+#~ msgstr "Tölfræði"
+
+#~ msgid "All Finished!"
+#~ msgstr "Allt tilbúið!"
+
+#~ msgid "Force Download"
+#~ msgstr "Neyða niðurhal"
+
+#~ msgid "Graph"
+#~ msgstr "Línurit"
+
+#~ msgid "Graphs"
+#~ msgstr "Línurit"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Deilendur/Jafningjar"
+
+#~ msgid "Test config value"
+#~ msgstr "Reyna gildi stillingar"
+
+#~ msgid "Test config value:"
+#~ msgstr "Reyna gildi stillingar:"
diff --git a/deluge/i18n/it.po b/deluge/i18n/it.po
new file mode 100644
index 0000000..cfe6a7f
--- /dev/null
+++ b/deluge/i18n/it.po
@@ -0,0 +1,6147 @@
+# Italian translation for deluge
+# Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2017-07-19 16:19+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Italian <it@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr ""
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr ""
+
+#: deluge/common.py:410
+msgid "K"
+msgstr ""
+
+#: deluge/common.py:411
+msgid "M"
+msgstr ""
+
+#: deluge/common.py:412
+msgid "G"
+msgstr ""
+
+#: deluge/common.py:413
+msgid "T"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr ""
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr ""
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr ""
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
diff --git a/deluge/i18n/iu.po b/deluge/i18n/iu.po
new file mode 100644
index 0000000..b0696a5
--- /dev/null
+++ b/deluge/i18n/iu.po
@@ -0,0 +1,3712 @@
+# Inuktitut translation for deluge
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-06-21 03:11+0000\n"
+"Last-Translator: adaminikisi <Unknown>\n"
+"Language-Team: Inuktitut <iu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
diff --git a/deluge/i18n/ja.po b/deluge/i18n/ja.po
new file mode 100644
index 0000000..16f8287
--- /dev/null
+++ b/deluge/i18n/ja.po
@@ -0,0 +1,4652 @@
+# Japanese translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2011-01-26 16:37+0000\n"
+"Last-Translator: Toshiharu Kudoh <toshi.kd2@gmail.com>\n"
+"Language-Team: Japanese <ja@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr "MiB"
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr "GiB"
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "ホストå:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "ãƒãƒ¼ãƒˆ:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "ユーザå:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "パスワード:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "From:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "有効"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "セッティング"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "フォルダã®é¸æŠž"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>ダウンロード場所</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "最大アップロード速度:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "最大接続数:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "最大アップロードスロット:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "最大ダウンロード速度:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>帯域幅</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "シードåœæ­¢æ¯”:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "ã“ã®æ¯”率ã§å‰Šé™¤ã™ã‚‹"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "上端"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "下端"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>キュー</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "オプション"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "ダウンロード制é™:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "アップロード制é™:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "アクティブトレント数:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>制é™è¨­å®š</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "ä¸æ­£ãªãƒ©ãƒ™ãƒ«ã§ã™ã€‚使用ã§ãる文字:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "空ã®ãƒ©ãƒ™ãƒ«ã§ã™"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "ラベルã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "未知ã®ãƒ©ãƒ™ãƒ«ã§ã™"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "未知ã®ãƒˆãƒ¬ãƒ³ãƒˆã§ã™"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "ラベル"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "ラベルオプション(_O)"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "ラベルã®å‰Šé™¤(_R)"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "ラベルã®è¿½åŠ (_A)"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "ラベルオプション"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>ラベルオプション</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "アップロードスロット:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "アップロード速度:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "ダウンロード速度:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "接続数:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "å„トレントã«æœ€å¤§è¨­å®šã‚’é©ç”¨ã™ã‚‹:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "最大"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "自動管ç†"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "キュー設定をé©ç”¨ã™ã‚‹:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "キュー"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "完了後ã«ç§»å‹•ã™ã‚‹:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "場所設定をé©ç”¨ã™ã‚‹:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "場所"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 行㫠1 トラッカー)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "ラベルã«è‡ªå‹•é©ç”¨ã™ã‚‹:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "トラッカー"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "ラベルã®è¿½åŠ "
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>ラベルã®è¿½åŠ </b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "åå‰:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr "<i>ラベルã®è¿½åŠ ã€ç·¨é›†ã€ãŠã‚ˆã³å‰Šé™¤ã¯ã‚µã‚¤ãƒ‰ãƒãƒ¼ã§è¡Œã„ã¾ã™ã€‚</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>ラベル</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "展開先:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "トレントåã®ã‚µãƒ–フォルダを作æˆã™ã‚‹"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr "ã“ã®ã‚ªãƒ—ションã¯é¸æŠžã•ã‚ŒãŸå±•é–‹å…ˆãƒ•ã‚©ãƒ«ãƒ€å†…ã«ãƒˆãƒ¬ãƒ³ãƒˆåã®ã‚µãƒ–フォルダを作æˆã—ã€å±•é–‹ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’ãã“ã«æ ¼ç´ã—ã¾ã™ã€‚"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>全般</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Web インターフェイスを有効ã«ã™ã‚‹"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "SSL を有効ã«ã™ã‚‹"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "å¾…ã¡å—ã‘ãƒãƒ¼ãƒˆ:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>設定</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP list (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Text (Zipped)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Text (éžåœ§ç¸®)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "無効ãªãƒªãƒ¼ãƒ€ãƒ¼"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "無効ãªãƒžã‚¸ãƒƒã‚¯ã‚³ãƒ¼ãƒ‰"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "無効ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "ブロックリスト"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "æ—¥"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "æ–°ã—ã„リストã®ãƒã‚§ãƒƒã‚¯é–“éš”:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "起動時ã«ãƒ–ロックリストをインãƒãƒ¼ãƒˆã™ã‚‹"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "å¿…è¦ãªã‚‰ãƒ–ロックリストファイルをダウンロードã—ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’インãƒãƒ¼ãƒˆã—ã¾ã™"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "ダウンロードã®ãƒã‚§ãƒƒã‚¯ã¨ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "æ–°ã—ã„ブロックリストファイルをダウンロードãŠã‚ˆã³ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "強制ダウンロードã¨ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "ブロックリストã¯æœ€æ–°ã§ã™"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>オプション</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "タイプ:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "日付:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "ファイルサイズ:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>情報</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "トレント完了時"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "トレント追加時"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "コマンド実行"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "イベント"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "コマンド"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>コマンドã®è¿½åŠ </b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>コマンド</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "アナウンス OK"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "アナウンス済ã¿"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "警戒"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "エラー"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "アフガニスタン"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "オーランド諸島"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "アルãƒãƒ‹ã‚¢"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "アルジェリア"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "アメリカ領サモア"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "アンドラ"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "アンゴラ"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "アングィラ島"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "å—極"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "アンティグア・ãƒãƒ¼ãƒ–ーダ"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "アルゼンãƒãƒ³"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "アルメニア"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "アルãƒå³¶"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "オーストラリア"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "オーストリア"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "アゼルãƒã‚¤ã‚¸ãƒ£ãƒ³"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "ãƒãƒãƒž"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "ãƒãƒ¼ãƒ¬ãƒ¼ãƒ³"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "ãƒãƒ³ã‚°ãƒ©ãƒ‡ã‚£ã‚·ãƒ¥"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "ãƒãƒ«ãƒãƒ‰ã‚¹"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "ベラルーシ"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "ベルギー"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "ベリーズ"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "ベナン"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "ãƒãƒŸãƒ¥ãƒ¼ãƒ€è«¸å³¶"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "ブータン"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "ボリビア"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "ボスニア・ヘルツェゴビナ"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "ボツワナ"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "ブーヴェ島"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "ブラジル"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "イギリス領インド洋地域"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "ブルãƒã‚¤ãƒ»ãƒ€ãƒ«ã‚µãƒ©ãƒ¼ãƒ "
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "ブルガリア"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "ブルキナファソ"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "ブルンジ"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "カンボジア"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "カメルーン"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "カナダ"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "カーボベルデ"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "ケイマン諸島"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "中央アフリカ"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "ãƒãƒ£ãƒ‰"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "ãƒãƒª"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "中国"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "クリスマス島"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "ココス (キーリング) 諸島"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "コロンビア"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "コモロ"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "コンゴ共和国"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "コンゴ民主共和国"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "クック諸島"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "コスタリカ"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "コートジボアール"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "クロアãƒã‚¢"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "キューãƒ"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "キプロス"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "ãƒã‚§ã‚³"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "デンマーク"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "ジブãƒ"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "ドミニカ国"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "ドミニカ共和国"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "エクアドル"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "エジプト"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "エルサルãƒãƒ‰ãƒ«"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "赤é“ギニア"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "エリトリア"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "エストニア"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "エãƒã‚ªãƒ”ã‚¢"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "フォークランド (マルビナス) 諸島"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "フェロー諸島"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "フィジー"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "フィンランド"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "フランス"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "フランス領ギアナ"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "フランス領ãƒãƒªãƒã‚·ã‚¢"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "フランス領å—方・å—極地域"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "ガボン"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "ガンビア"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "グルジア"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "ドイツ"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "イギリス"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "ガーナ"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "ジブラルタル"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "ギリシャ"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "グリーンランド"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "グレナダ"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "グアドループ"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "グァム"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "グアテマラ"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "ガーンジー"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "ギニア"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "ギニアビサウ"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "ガイアナ"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "ãƒã‚¤ãƒ"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "ãƒãƒ¼ãƒ‰å³¶ãŠã‚ˆã³ãƒžã‚¯ãƒ‰ãƒŠãƒ«ãƒ‰è«¸å³¶"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "ãƒãƒã‚«ãƒ³"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "ホンジュラス"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "香港"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "ãƒãƒ³ã‚¬ãƒªãƒ¼"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "アイスランド"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "インド"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "インドãƒã‚·ã‚¢"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "イラン"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "イラク"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "アイルランド"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "マン島"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "イスラエル"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "イタリア"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "ジャマイカ"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "日本"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "ジャージー"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "ヨルダン"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "カザフスタン"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "ケニア"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "キリãƒã‚¹"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "北æœé®®"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "韓国"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "クウェート"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "キルギスタン"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "ラオス"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "ラトビア"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "レãƒãƒŽãƒ³"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "レソト"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "リベリア"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "リビア"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "リヒテンシュタイン"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "リトアニア"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "ルクセンブルク"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "マカオ"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "マケドニア"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "マダガスカル"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "マラウィ"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "マレーシア"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "モルジブ"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "マリ"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "マルタ"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "マーシャル諸島"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "マルティニーク"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "モーリタニア"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "モーリシャス"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "マヨット"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "メキシコ"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "ミクロãƒã‚·ã‚¢"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "モルドãƒ"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "モナコ"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "モンゴル"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "モンテãƒã‚°ãƒ­"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "モントセラト"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "モロッコ"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "モザンビーク"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "ミャンマー"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "ナミビア"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "ナウル"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "ãƒãƒ‘ール"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "オランダ"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "オランダ領アンティル"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "ニューカレドニア"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "ニュージーランド"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "ニカラグア"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "ニジェール"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "ナイジェリア"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "ニウエ"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "ノーフォーク島"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "北マリアナ諸島"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "ノルウェー"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "オマーン"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "パキスタン"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "パラウ"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "パレスãƒãƒŠ"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "パナマ"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "パプアニューギニア"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "パラグアイ"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "ペルー"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "フィリピン"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "ピトケアン諸島"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "ãƒãƒ¼ãƒ©ãƒ³ãƒ‰"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "ãƒãƒ«ãƒˆã‚¬ãƒ«"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "プエルトリコ"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "カタール"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "レユニオン"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "ルーマニア"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "ロシア"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "ルワンダ"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "サン・ãƒãƒ«ãƒ†ãƒ«ãƒŸãƒ¼å³¶"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "セントヘレナ"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "セントクリストファー・ãƒã‚¤ãƒ“ス"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "セントルシア"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "セント・マーãƒãƒ³"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "サンピエールãŠã‚ˆã³ãƒŸã‚¯ãƒ­ãƒ³å³¶"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "セントビンセント・グレナディーン"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "サモア"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "サンマリノ"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "サントメ・プリンシペ"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "サウジアラビア"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "ã‚»ãƒã‚¬ãƒ«"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "セルビア"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "セイシェル"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "シエラレオãƒ"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "シンガãƒãƒ¼ãƒ«"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "スロãƒã‚­ã‚¢"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "スロベニア"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "ソロモン諸島"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "ソマリア"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "å—アフリカ"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "サウスジョージア・サウスサンドウィッãƒè«¸å³¶"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "スペイン"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "スリランカ"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "スーダン"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "スリナム"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "スヴァールãƒãƒ«è«¸å³¶ãŠã‚ˆã³ãƒ¤ãƒ³ãƒžã‚¤ã‚¨ãƒ³å³¶"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "スワジランド"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "スウェーデン"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "スイス"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "シリア"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "å°æ¹¾"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "タジキスタン"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "タンザニア"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "タイ"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "æ±ãƒ†ã‚£ãƒ¢ãƒ¼ãƒ«"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "トーゴ"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "トケラウ"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "トンガ"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "トリニダード・トãƒã‚´"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "ãƒãƒ¥ãƒ‹ã‚¸ã‚¢"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "トルコ"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "トルクメニスタン"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "タークス・カイコス諸島"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "ツãƒãƒ«"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "ウガンダ"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "ウクライナ"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "アラブ首長国連邦"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "アメリカåˆè¡†å›½"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "アメリカåˆè¡†å›½å¤–諸島"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "ウルグアイ"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "ウズベキスタン"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "ãƒãƒŒã‚¢ãƒ„"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "ベãƒã‚ºã‚¨ãƒ©"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "ベトナム"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "イギリス領ãƒãƒ¼ã‚¸ãƒ³è«¸å³¶"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "アメリカ領ãƒãƒ¼ã‚¸ãƒ³è«¸å³¶"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "ワリー・エ・フトゥーナ諸島"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "西サãƒãƒ©"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "イエメン"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "ザンビア"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "ジンãƒãƒ–エ"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "オフライン"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "オンライン"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "接続中"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "デーモンãŒå­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "デーモンãŒèµ·å‹•ã—ã¦ã„ã¾ã›ã‚“"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "アドレス"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "クライアント"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "進æ—"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "下り速度"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "上り速度"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "トレント"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " トレントキュー済ã¿"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " トレントキュー済ã¿"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "無制é™"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "活性化"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "ãã®ä»–..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "ダウン:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "アップ:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "下"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "上"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "最大ダウンロード速度ã®è¨­å®š"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "最大アップロード速度ã®è¨­å®š"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "トレントãŒå®Œäº†ã—ã¾ã—ãŸ"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "ダウンロード"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "帯域幅"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "インターフェイス"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "ãã®ä»–"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "デーモン"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "プロキシ"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "キャッシュ"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "プラグイン"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "プラグイン"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "プラグインã®é¸æŠž"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "ファイルå"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "サイズ"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "無効ãªãƒ•ã‚¡ã‚¤ãƒ«"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "トレントã®é‡è¤‡"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "åŒã˜ãƒˆãƒ¬ãƒ³ãƒˆã‚’2回追加ã¯ã§ãã¾ã›ã‚“。"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "ファイルã®å„ªå…ˆåº¦ã‚’設定ã§ãã¾ã›ã‚“!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "トレントファイルã®é¸æŠž"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "トレントファイル"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "無効㪠URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "ダウンロード失敗"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "列"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "トラッカー"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "ファイルをé¸æŠžã—ã¦ãã ã•ã„"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "フォルダをé¸æŠžã—ã¦ãã ã•ã„"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "トレントファイルã®ä¿å­˜"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "接続ã—ã¦ã„ã¾ã›ã‚“"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "接続数"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "下り速度"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "上り速度"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "ダウンロード/アップロードプロトコルã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT ノード"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "外部ã‹ã‚‰ã®æŽ¥ç¶šã¯ã‚ã‚Šã¾ã›ã‚“!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "最大接続数ã®è¨­å®š"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "トレント"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "ラベル"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "å…¨ã¦"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "ダウンロード中"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "シーディング"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "休止中"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "ãƒã‚§ãƒƒã‚¯ä¸­"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "キュー済ã¿"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "ãªã—"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "ラベルãªã—"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "ホスト"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "ホストã®è¿½åŠ ã‚¨ãƒ©ãƒ¼"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "クラシックモードをオフã«ã—ã¾ã™ã‹?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"ã“れ㯠Deluge デーモンプロセス (deluged) ãŒæ—¢ã«å‹•ä½œä¸­ã®æ™‚ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚\n"
+"\n"
+"続行ã™ã‚‹ã«ã¯ã€ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚’åœæ­¢ã™ã‚‹ã‹ã€ã‚¯ãƒ©ã‚·ãƒƒã‚¯ãƒ¢ãƒ¼ãƒ‰ã‚’オフã«ã—ã¦ãã ã•ã„。"
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "コアã®èµ·å‹•ã‚¨ãƒ©ãƒ¼"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"コアコンãƒãƒ¼ãƒãƒ³ãƒˆã®èµ·å‹•æ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚Deluge ã¯ã‚¯ãƒ©ã‚·ãƒƒã‚¯ãƒ¢ãƒ¼ãƒ‰ã§ã®èµ·å‹•ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。\n"
+"\n"
+"より詳ã—ã„情報ã¯ä»¥ä¸‹ã‚’ã”覧ãã ã•ã„。"
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr "クラシックモードã§èµ·å‹•ã—ãŸãŸã‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã“れをオフã«ã—ã¦ç¶šè¡Œã—ã¾ã™ã‹?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "デーモンã®èµ·å‹•ã‚¨ãƒ©ãƒ¼"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr "デーモンプロセスã®èµ·å‹•ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚コンソールã‹ã‚‰èµ·å‹•ã—エラーを確èªã—ã¦ãã ã•ã„。"
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "オン"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "オフ"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "無制é™"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "ファイルã®ç§»å‹•å…ˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®é¸æŠž"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "最大アップロードスロット数ã®è¨­å®š"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "優先度"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "詳細:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "åå‰"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "ダウンロード済ã¿"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "アップロード済ã¿"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "シーダ"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "ピア"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "残り時間"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "共有比"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "å¯ç”¨æ€§"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "追加"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "ファイル(_F)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "トレントã®è¿½åŠ (_A)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "トレントã®ä½œæˆ(_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "編集(_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "接続マãƒãƒ¼ã‚¸ãƒ£(_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "トレント(_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "表示(_V)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "ツールãƒãƒ¼(_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "サイドãƒãƒ¼(_S)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "ステータスãƒãƒ¼(_B)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "タブ(_A)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "カラム(_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "サイドãƒãƒ¼(_I)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "ヒットã—ãªã„ã‚‚ã®ã‚‚表示(_Z)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "トラッカーを表示(_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "ヘルプ(_H)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "よãã‚る質å•ã¨å›žç­”(FAQ)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "トレントを追加ã—ã¾ã™"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "トレントã®è¿½åŠ "
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "トレントを削除"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "トレントã®å‰Šé™¤"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "é¸æŠžã—ãŸãƒˆãƒ¬ãƒ³ãƒˆã‚’休止ã—ã¾ã™"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "休止"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "é¸æŠžã—ãŸãƒˆãƒ¬ãƒ³ãƒˆã‚’å†é–‹ã—ã¾ã™"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "å†é–‹"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "トレントã®ã‚­ãƒ¥ãƒ¼ã‚’上ã’ã¾ã™"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "キューを上ã’ã‚‹"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "トレントã®ã‚­ãƒ¥ãƒ¼ã‚’下ã’ã¾ã™"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "キューを下ã’ã‚‹"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "設定"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "接続マãƒãƒ¼ã‚¸ãƒ£"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "å…¨ã¦å±•é–‹(_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "ダウンロードã—ãªã„(_D)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "優先度 通常(_N)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "優先度 高(_H)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "優先度 最高(_G)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>自動管ç†:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>シードランク:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>シード時間:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>アクティブ時間:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>トラッカー状態:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>å¯ç”¨æ€§:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>ピア:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>シーダ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>ピース:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>残り時間:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>次ã®ã‚¢ãƒŠã‚¦ãƒ³ã‚¹:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>共有比:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>アップロード済ã¿:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>ダウンロード済ã¿:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>追加日:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "状態(_S)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>コメント:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>ファイル数:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>ãƒãƒƒã‚·ãƒ¥:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>トラッカー:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>åˆè¨ˆã‚µã‚¤ã‚º:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>åå‰:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>パス:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>状態:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "詳細(_D)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "ファイル(_F)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "ピア(_P)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "完了後移動:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "プライベート"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "最åˆã¨æœ€å¾Œã‚’優先"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "トラッカーã®ç·¨é›†(_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "オプション(_O)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "トレントを削除ã—ã¾ã™ã‹?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>é¸æŠžã—ãŸãƒˆãƒ¬ãƒ³ãƒˆã‚’削除ã—ã¾ã™ãŒã‚ˆã‚ã—ã„ã§ã™ã‹?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>関連ã™ã‚‹ãƒˆãƒ¬ãƒ³ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã¯å‰Šé™¤ã•ã‚Œã¾ã™!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>ダウンロードã—ãŸãƒ‡ãƒ¼ã‚¿ã¯å‰Šé™¤ã•ã‚Œã¾ã™!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "é¸æŠžã—ãŸãƒˆãƒ¬ãƒ³ãƒˆã‚’削除ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "最新版"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>最新版ãŒåˆ©ç”¨ã§ãã¾ã™!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>利用å¯èƒ½ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "ã“ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’今後表示ã—ãªã„"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "ウェブサイトã¸(_G)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "ピアを IP アドレスã§è¿½åŠ ã—ã¾ã™"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "å…¨ã¦é¸æŠž(_S)"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "å…¨ã¦ä¼‘æ­¢(_P)"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "é¸æŠžã—ãŸãƒˆãƒ¬ãƒ³ãƒˆã‚’å†é–‹ã—ã¾ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "å…¨ã¦å†é–‹(_M)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "トレントã®è¿½åŠ "
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "URL(_U)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "ãƒãƒƒã‚·ãƒ¥æƒ…å ±(_H)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "削除(_R)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>トレント</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "ファイル(_L)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "フル"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "コンパクト"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>割り当ã¦</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "最大下り速度:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "最大上り速度:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "休止状態ã§è¿½åŠ ã™ã‚‹(_P)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "最åˆ/最後ã®ãƒ”ースを優先ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "デフォルトã«æˆ»ã™"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "å…¨ã¦ã«é©ç”¨"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "URLã®è¿½åŠ "
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>URLã‹ã‚‰</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "ãƒãƒƒã‚·ãƒ¥æƒ…å ±ã®è¿½åŠ "
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>ãƒãƒƒã‚·ãƒ¥æƒ…å ±ã‹ã‚‰</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "ãƒãƒƒã‚·ãƒ¥æƒ…å ±:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "トラッカー:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "トレントã®ä½œæˆ"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>トレントã®ä½œæˆ</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "フォルダ(_D)"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "リモートパス(_R)"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>ファイル</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "作者:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "コメント:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "情報"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Web シード"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "ピースサイズ:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "プライベートフラグを設定ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "ã“ã®ãƒˆãƒ¬ãƒ³ãƒˆã‚’ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«è¿½åŠ ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "リモートパスを入力ã—ã¦ãã ã•ã„"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>リモートパス</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "パス:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "トレントを作æˆã—ã¦ã„ã¾ã™"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "トレントファイルをåå‰ã‚’ã¤ã‘ã¦ä¿å­˜"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>トレントファイルã®ä¿å­˜</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "キュー済ã¿ãƒˆãƒ¬ãƒ³ãƒˆ"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>キュー済ã¿ãƒˆãƒ¬ãƒ³ãƒˆã‚’追加</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "接続ã—ã¦ã„るトレントを自動的ã«è¿½åŠ "
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "ラベル"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "ピアã®è¿½åŠ "
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>ピアã®è¿½åŠ </b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "ホストå:ãƒãƒ¼ãƒˆ"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "ホストã®è¿½åŠ "
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>接続マãƒãƒ¼ã‚¸ãƒ£</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "ローカルデーモンを起動(_S)"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "起動時ã«é¸æŠžã—ãŸãƒ›ã‚¹ãƒˆã«è‡ªå‹•æŽ¥ç¶šã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "å¿…è¦ã§ã‚れ㰠localhost を自動起動ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "起動時ã«ã“ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’表示ã—ãªã„"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>ダウンロード</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "トレントを自動的ã«è¿½åŠ :"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "ダウンロード場所:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "トレントファイルをコピー:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>フォルダ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "フル割り当ã¦ã‚’使用ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr "フル割り当ã¦ã¯ãƒˆãƒ¬ãƒ³ãƒˆã«å¿…è¦ãªã‚¹ãƒšãƒ¼ã‚¹ã‚’ã‚らã‹ã˜ã‚確ä¿ã—ã€ãƒ‡ã‚£ã‚¹ã‚¯ã®æ–­ç‰‡åŒ–を防ãŽã¾ã™"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "コンパクト割り当ã¦ã‚’使用ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "コンパクト割り当ã¦ã¯æœ€ä½Žé™å¿…è¦ãªã‚¹ãƒšãƒ¼ã‚¹ã ã‘を確ä¿ã—ã¾ã™"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "トレントã®æœ€åˆã¨æœ€å¾Œã®ãƒ”ースを優先ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "トレント内ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€åˆã¨æœ€å¾Œã®ãƒ”ースを優先ã—ã¾ã™"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "トレントを休止状態ã§è¿½åŠ ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "ランダムãƒãƒ¼ãƒˆã‚’使用ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge ã¯æ¯Žå›žã€ç•°ãªã‚‹ãƒãƒ¼ãƒˆã‚’自動é¸æŠžã—ã¾ã™"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "使用ãƒãƒ¼ãƒˆ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "To:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "使用ãƒãƒ¼ãƒˆã‚’テスト"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>å—ä¿¡ãƒãƒ¼ãƒˆ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>é€ä¿¡ãƒãƒ¼ãƒˆ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr "Bittorrent ã®æŽ¥ç¶šã‚’å¾…ã¡å—ã‘るインターフェイスã®IPアドレスを入力ã—ã¦ãã ã•ã„。デフォルトã§ã‚ˆã„ãªã‚‰ã°ç©ºã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>インターフェイス</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"TOS (Type Of Service) ãƒã‚¤ãƒˆã‚’ (Web シードをå«ã‚€) ピアã«é€ä¿¡ã•ã‚Œã‚‹å„パケット㮠IP ヘッダ ã«è¨­å®šã—ã¾ã™ã€‚16 "
+"進数ã§æŒ‡å®šã—ã¾ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "ピア TOS ãƒã‚¤ãƒˆ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play を使用ã—ã¾ã™"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT ãƒãƒ¼ãƒˆãƒžãƒƒãƒ”ングプロトコルを使用ã—ã¾ã™"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "ピア交æ›"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery ã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã®ãƒ”アを検出ã—ã¾ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "DHT ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªæŽ¥ç¶šæ•°ã®æ”¹å–„ãŒè¦‹è¾¼ã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è©³ç´°</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "インãƒã‚¦ãƒ³ãƒ‰:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "レベル:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"強制\n"
+"有効\n"
+"無効"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯\n"
+"フルストリーム\n"
+"ã©ã¡ã‚‰ã‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "アウトãƒã‚¦ãƒ³ãƒ‰:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "ストリーム全体を暗å·åŒ–ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>æš—å·åŒ–</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>帯域幅</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "最大接続試行回数 (毎秒)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "最大åŠé–‹æŽ¥ç¶šæ•°:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr "全トレントã®æœ€å¤§ã‚¢ãƒƒãƒ—ロード速度 (-1ã¯ç„¡åˆ¶é™)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "最大アップロード速度 (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "最大許容接続数 (-1ã¯ç„¡åˆ¶é™)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "最大接続数:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr "全トレントã®æœ€å¤§ã‚¢ãƒƒãƒ—ロードスロット数 (-1ã¯ç„¡åˆ¶é™)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "最大アップロードスロット数:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr "全トレントã®æœ€å¤§ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰é€Ÿåº¦ (-1ã¯ç„¡åˆ¶é™)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "最大ダウンロード速度 (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "ローカルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã§ã¯åˆ¶é™ã—ãªã„"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "IP オーãƒãƒ¼ãƒ˜ãƒƒãƒ‰ã‚’レート制é™ã«å«ã‚ãªã„"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"ãƒã‚§ãƒƒã‚¯ãƒžãƒ¼ã‚¯ã‚’ã¤ã‘ã‚‹ã¨ã€å…¨ä½“ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯é‡ã«ã‚ˆã£ã¦åˆ¶é™ã‚’超ãˆã¦ã—ã¾ã‚ãªã„よã†ã«ã€æ¸¬å®šã•ã‚ŒãŸ TCP/IP オーãƒãƒ¼ãƒ˜ãƒƒãƒ‰ã‚’レート制é™ã«å«ã¿ã¾ã›ã‚“。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>全体ã®å¸¯åŸŸå¹…使用法</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr "å„トレントã®æœ€å¤§ã‚¢ãƒƒãƒ—ロードスロット数 (-1ã¯ç„¡åˆ¶é™)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "å„トレントã®æœ€å¤§æŽ¥ç¶šæ•° (-1ã¯ç„¡åˆ¶é™)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>å„トレントã®å¸¯åŸŸå¹…使用法</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>インターフェース</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "有効ã«ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"クラシックモードã¯ãƒ‡ãƒ¼ãƒ¢ãƒ³æ©Ÿèƒ½ã®å¤§éƒ¨åˆ†ã‚’éš ã—ã¦ã€Deluge をシングルアプリケーションã®ã‚ˆã†ã«è¦‹ã›ã¾ã™ã€‚デーモンã¨ã—ã¦å®Ÿè¡Œã•ã‚Œã‚‹ Deluge "
+"を利用ã—ãªã„å ´åˆã¯ã“れを使用ã—ã¦ä¸‹ã•ã„。ã“ã®è¨­å®šã‚’有効ã«ã™ã‚‹ãŸã‚ã«ã¯å†èµ·å‹•ãŒå¿…è¦ã§ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>クラシックモード</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "セッション速度をタイトルãƒãƒ¼ã«è¡¨ç¤ºã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>メインウインドウ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "常ã«è¡¨ç¤ºã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "ダイアログã«ãƒ•ã‚©ãƒ¼ã‚«ã‚¹ã‚’åˆã‚ã›ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>トレントã®è¿½åŠ ãƒ€ã‚¤ã‚¢ãƒ­ã‚°</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "システムトレイã«ã‚¢ã‚¤ã‚³ãƒ³ã‚’表示ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "é–‰ã˜ãŸã‚‰ãƒˆãƒ¬ã‚¤ã«æœ€å°åŒ–ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "最å°åŒ–ã§é–‹å§‹ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "システムトレイä¿è­·ãƒ‘スワード"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>システムトレイ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>ãã®ä»–</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "最新版ãŒã‚ã‚Œã°è­¦å‘Šã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr "Deluge ã¯æœ€æ–°ç‰ˆãŒã‚ã‚‹ã‹ãƒã‚§ãƒƒã‚¯ã—ã€ã‚ã‚Œã°é€šçŸ¥ã—ã¾ã™"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>アップデート</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Deluge ã®æ”¹è‰¯ã‚’助ã‘ã‚‹ãŸã‚ã«ã€ä½¿ç”¨ã—ã¦ã„ã‚‹ Python 㨠PyGTK ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã€OS "
+"ã¨ãƒ—ロセッサーã®ã‚¿ã‚¤ãƒ—ã‚’é€ã‚Šã¾ã™ã€‚ä»–ã®æƒ…å ±ã¯çµ¶å¯¾ã«é€ã‚Šã¾ã›ã‚“。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "ã¯ã„ã€åŒ¿åã®çµ±è¨ˆã‚’é€ã‚Šã¾ã™"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>システム情報</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "場所:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr "Deluge ãŒã“ã®å ´æ‰€ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’見ã¤ã‘られãªã‹ã£ãŸå ´åˆã¯ã€ãƒ”ã‚¢ã®å›½ç±è§£æ±ºã®ãŸã‚ã« DNS を使用ã—ã¾ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP データベース</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "マグãƒãƒƒãƒˆãƒªãƒ³ã‚¯ã‚’ Deluge ã«é–¢é€£ä»˜ã‘ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>デーモン</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "デーモンãƒãƒ¼ãƒˆ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>ãƒãƒ¼ãƒˆ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "リモート接続を許å¯ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>接続</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "定期的ã«æ–°ã—ã„リリースをãƒã‚§ãƒƒã‚¯ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>ãã®ä»–</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>キュー</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "æ–°ã—ã„トレントをキューã®æœ€ä¸Šéƒ¨ã«å…¥ã‚Œã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "ç·ã‚¢ã‚¯ãƒ†ã‚£ãƒ–シード数:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "ç·ã‚¢ã‚¯ãƒ†ã‚£ãƒ–æ•°:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "ç·ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ダウンロード数:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "é…ã„トレントã¯ã‚«ã‚¦ãƒ³ãƒˆã—ãªã„"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>アクティブトレント</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "共有比上é™:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "シード時間率:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "シード時間 (分):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "共有比ã«é”ã—ãŸã‚‰ã‚·ãƒ¼ãƒ‰ã‚’åœæ­¢ã™ã‚‹:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "共有比ã«é”ã—ãŸã‚‰ãƒˆãƒ¬ãƒ³ãƒˆã‚’削除ã™ã‚‹"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>シーディング</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>プロキシ</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "ホスト:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"ãªã—\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>ピア</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Web シード</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>トラッカー</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>キャッシュ</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "キャッシュサイズ (16 KiB ブロック):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr "最後ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚ŒãŸæ›¸ãè¾¼ã¿ã‹ã‚‰ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’フラッシュã™ã‚‹ã¾ã§ã®ç§’æ•°ã§ã™ã€‚デフォルト㯠60 秒ã§ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "ã‚­ãƒ£ãƒƒã‚·ãƒ¥æœŸé™ (秒):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr "セッションãŒé–‹å§‹ã•ã‚Œã¦ã‹ã‚‰ãƒ‡ã‚£ã‚¹ã‚¯ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒ–ロック (16KiB) ã®ç·æ•°ã§ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "書ãè¾¼ã¿ãƒ–ロック:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr "ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŒé–‹å§‹ã•ã‚Œã¦ã‹ã‚‰å®Ÿè¡Œã•ã‚ŒãŸç·æ›¸ãè¾¼ã¿å›žæ•°ã§ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "書ãè¾¼ã¿:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"(書ãè¾¼ã¿ãƒ–ロック - 書ãè¾¼ã¿) ÷ 書ãè¾¼ã¿ãƒ–ロック "
+"ã§è¡¨ã•ã‚Œã‚‹ç·æ›¸ãè¾¼ã¿æ•°å†…ã§ã®ä¿å­˜ã•ã‚ŒãŸæ›¸ãè¾¼ã¿æ•°ã®æ¯”率ã€ç°¡å˜ã«ã„ã†ã¨æ›¸ãè¾¼ã¿ã‚­ãƒ£ã‚·ãƒ¥ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãƒ’ット率ã®ä¸€ã¤ã§ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "書ãè¾¼ã¿ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãƒ’ット率:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>書ãè¾¼ã¿</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr "Bittorrent エンジン (ピア) ã‹ã‚‰è¦æ±‚ã•ã‚Œã€ãƒ‡ã‚£ã‚¹ã‚¯ã¾ãŸã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‹ã‚‰ä¾›çµ¦ã•ã‚ŒãŸãƒ–ロック数ã§ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "読ã¿è¾¼ã¿ãƒ–ロック:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "キャッシュã‹ã‚‰ä¾›çµ¦ã•ã‚ŒãŸãƒ–ロック数ã§ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "読ã¿è¾¼ã¿ãƒ’ットブロック:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "読ã¿è¾¼ã¿ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãƒ’ット率ã§ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "読ã¿è¾¼ã¿ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãƒ’ット率:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr "セッションãŒé–‹å§‹ã•ã‚Œã¦ã‹ã‚‰å®Ÿè¡Œã•ã‚ŒãŸç·èª­ã¿è¾¼ã¿å›žæ•°ã§ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "読ã¿è¾¼ã¿:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>読ã¿è¾¼ã¿</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr "ディスクキャッシュã«ã‚ã‚‹ç¾åœ¨ã®æ›¸ãè¾¼ã¿ãŠã‚ˆã³èª­ã¿è¾¼ã¿ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãƒ–ロック (16KiB) æ•°ã§ã™ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "キャッシュサイズ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "読ã¿è¾¼ã¿ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚µã‚¤ã‚º:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>サイズ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>ステータス</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>プラグイン</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "ホームページ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "作者ã®Eメール:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "プラグインをインストール(_I)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "プラグインをå†ã‚¹ã‚­ãƒ£ãƒ³(_R)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "ã‚‚ã£ã¨ãƒ—ラグインを探ã™(_F)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "Delugeã®è¡¨ç¤º(_S)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "å…¨ã¦å†é–‹(_R)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "ダウンロード速度制é™(_D)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "アップロード速度制é™(_U)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "デーモンをシャットダウンã—ã¦çµ‚了"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "フォルダを開ã(_O)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "å†é–‹(_M)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "オプション(_I)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "キュー(_Q)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "トラッカーã®æ›´æ–°(_U)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "トレントã®å‰Šé™¤(_R)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "強制å†ãƒã‚§ãƒƒã‚¯(_F)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "ストレージã®ç§»å‹•(_S)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "接続数制é™(_C)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "アップロードスロット数制é™(_S)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "自動管ç†(_A)"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>é¸æŠžã—ãŸãƒˆãƒ¬ãƒ³ãƒˆã‚’削除ã—ã¾ã™ã‹?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "データを削除ã—ãŸå ´åˆã€ãƒ‡ãƒ¼ã‚¿ã¯å®Œå…¨ã«å¤±ã‚れるã§ã—ょã†ã€‚"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "トラッカーã®ç·¨é›†"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>トラッカーã®ç·¨é›†</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "トラッカーã®è¿½åŠ "
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>トラッカーã®è¿½åŠ </b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "トラッカーã®ç·¨é›†"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>トラッカーã®ç·¨é›†</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "トラッカー:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "データも共ã«å‰Šé™¤(_D)"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "トレントを削除(_T)"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "ストレージã®ç§»å‹•"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>ストレージã®ç§»å‹•</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "移動先:"
+
+#~ msgid "Details"
+#~ msgstr "詳細"
+
+#~ msgid "Download"
+#~ msgstr "ダウンロード"
+
+#~ msgid "Upload"
+#~ msgstr "アップロード"
+
+#~ msgid "Files"
+#~ msgstr "ファイル"
+
+#~ msgid "General"
+#~ msgstr "一般"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Unknown"
+#~ msgstr "ä¸æ˜Ž"
+
+#~ msgid "Remove"
+#~ msgstr "削除"
+
+#~ msgid "Clear"
+#~ msgstr "クリア"
+
+#~ msgid "Add"
+#~ msgstr "追加"
+
+#~ msgid "Availability"
+#~ msgstr "å¯ç”¨æ€§"
+
+#~ msgid "Share Ratio"
+#~ msgstr "共有比"
+
+#~ msgid "_Quit"
+#~ msgstr "終了(_Q)"
+
+#~ msgid "Select All"
+#~ msgstr "å…¨ã¦é¸æŠž"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "トレントファイルを削除"
+
+#~ msgid "Username"
+#~ msgstr "Username"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "Password"
+#~ msgstr "Password"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "Graph"
+#~ msgstr "グラフ"
+
+#~ msgid "New Password"
+#~ msgstr "æ–°ã—ã„パスワード"
+
+#~ msgid "Template"
+#~ msgstr "テンプレート"
+
+#~ msgid "Text Only"
+#~ msgstr "テキストã®ã¿"
+
+#~ msgid "Image Only"
+#~ msgstr "ç”»åƒã®ã¿"
+
+#~ msgid "Text and image"
+#~ msgstr "テキストã¨ç”»åƒ"
+
+#~ msgid "About"
+#~ msgstr "ã‚¢ãƒã‚¦ãƒˆ"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "オートリフレッシュ:"
+
+#~ msgid "Config"
+#~ msgstr "コンフィグ"
+
+#~ msgid "Disable"
+#~ msgstr "無効"
+
+#~ msgid "Pieces"
+#~ msgstr "ピース"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "無効ãªãƒ‘スワードã§ã™ã€‚ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„"
+
+#~ msgid "Logout"
+#~ msgstr "ログアウト"
+
+#~ msgid "Login"
+#~ msgstr "ログイン"
+
+#~ msgid "Set"
+#~ msgstr "セット"
+
+#~ msgid "Resume all"
+#~ msgstr "å…¨ã¦å†é–‹"
+
+#~ msgid "Set Timeout"
+#~ msgstr "タイムアウトを設定"
+
+#~ msgid "Queue Position"
+#~ msgstr "キューã®ä½ç½®"
+
+#~ msgid "Start"
+#~ msgstr "開始"
+
+#~ msgid "Submit"
+#~ msgstr "é€ä¿¡"
+
+#~ msgid "Total Size"
+#~ msgstr "åˆè¨ˆã‚µã‚¤ã‚º"
+
+#~ msgid "Torrent list"
+#~ msgstr "トレントリスト"
+
+#~ msgid "seconds"
+#~ msgstr "秒"
+
+#~ msgid "Disabled"
+#~ msgstr "無効"
+
+#~ msgid "Type"
+#~ msgstr "タイプ"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "トレントã‹URLを片方ã®ã¿é¸æŠž"
+
+#~ msgid "Eta"
+#~ msgstr "残り時間"
+
+#~ msgid "Upload torrent"
+#~ msgstr "トレントをアップロード"
+
+#~ msgid "From"
+#~ msgstr "From"
+
+#~ msgid "# Of Files"
+#~ msgstr "ファイル数"
+
+#~ msgid "Ava"
+#~ msgstr "å¯ç”¨æ€§"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "ダウンロード済ã¿ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除"
+
+#~ msgid "Next Announce"
+#~ msgstr "次ã®ã‚¢ãƒŠã‚¦ãƒ³ã‚¹"
+
+#~ msgid "Pause all"
+#~ msgstr "å…¨ã¦ä¼‘æ­¢"
+
+#~ msgid "Speed"
+#~ msgstr "速度"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "毎回ページリフレッシュã™ã‚‹:"
+
+#~ msgid "Reannounce"
+#~ msgstr "å†ã‚¢ãƒŠã‚¦ãƒ³ã‚¹"
+
+#~ msgid "File"
+#~ msgstr "ファイル"
+
+#~ msgid "Save"
+#~ msgstr "ä¿å­˜"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "休止状態を追加"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "最åˆã¨æœ€å¾Œã®ãƒ”ースを優先"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "最大上り速度"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "最大下り速度"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "最大接続数"
+
+#~ msgid "no uri"
+#~ msgstr "URIç„¡ã—"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "トレントオプションã®ã‚¨ãƒ©ãƒ¼"
+
+#~ msgid "Ports"
+#~ msgstr "ãƒãƒ¼ãƒˆ"
+
+#~ msgid "Random"
+#~ msgstr "ランダム"
+
+#~ msgid "To"
+#~ msgstr "To"
+
+#~ msgid "Encryption"
+#~ msgstr "æš—å·åŒ–"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Forced"
+#~ msgstr "強制"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Mainline DHT"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "最大åŠé–‹æŽ¥ç¶šæ•°"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "最大ダウンロード速度 (Kib/s)"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "最大アップロード速度 (Kib/s)"
+
+#~ msgid "Inbound"
+#~ msgstr "インãƒã‚¦ãƒ³ãƒ‰"
+
+#~ msgid "Level"
+#~ msgstr "レベル"
+
+#~ msgid "Outbound"
+#~ msgstr "アウトãƒã‚¦ãƒ³ãƒ‰"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = 無制é™"
+
+#~ msgid "Global"
+#~ msgstr "全般"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "トレントファイルをä¿å­˜"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "ä¿å­˜å…ˆã‚’固定"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "自動的ã«ãƒ•ã‚©ãƒ«ãƒ€ã‚’追加"
+
+#~ msgid "Total active torrents"
+#~ msgstr "åˆè¨ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–トレント数"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = 無制é™"
+
+#~ msgid "Total active seeding"
+#~ msgstr "åˆè¨ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–シーディング"
+
+#~ msgid "Total active downloading"
+#~ msgstr "åˆè¨ˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–ダウンロード"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "共有比ã«é”ã—ãŸã‚‰ãƒˆãƒ¬ãƒ³ãƒˆã‚’削除"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "プラグインを有効"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "共有比ã«é”ã—ãŸã‚‰ã‚·ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’åœæ­¢"
+
+#~ msgid "Button style"
+#~ msgstr "ボタンスタイル"
+
+#~ msgid "Cache templates"
+#~ msgstr "キャッシュテンプレート"
+
+#~ msgid "Current Password"
+#~ msgstr "ç¾åœ¨ã®ãƒ‘スワード"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "å¤ã„パスワードã¯ç„¡åŠ¹"
+
+#~ msgid "Move To"
+#~ msgstr "移動先"
+
+#~ msgid "These changes were saved"
+#~ msgstr "変更をä¿å­˜ã—ã¾ã—ãŸ"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "比率ã§ã‚·ãƒ¼ãƒ‰ã‚’åœæ­¢"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "上記ã®èª¤ã‚Šã‚’訂正ã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„"
+
+#~ msgid "No"
+#~ msgstr "ã„ã„ãˆ"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr "有効ãªé¸æŠžã‚’é¸ã‚“ã§ãã ã•ã„。ãã®é¸æŠžã¯åˆ©ç”¨å¯èƒ½ãªé¸æŠžè‚¢ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "有効ãªé¸æŠžã‚’é¸ã‚“ã§ãã ã•ã„。 %s ã¯åˆ©ç”¨å¯èƒ½ãªé¸æŠžè‚¢ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "値ã®ãƒªã‚¹ãƒˆã‚’入力"
+
+#~ msgid "Enter a valid value."
+#~ msgstr "有効ãªå€¤ã‚’入力"
+
+#~ msgid "This field is required."
+#~ msgstr "ã“ã®æ¬„ã¯å¿…é ˆã§ã™"
+
+#~ msgid "Community"
+#~ msgstr "コミュニティ"
+
+#~ msgid "FAQ"
+#~ msgstr "FAQ"
+
+#~ msgid "Homepage"
+#~ msgstr "ホームページ"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "デーモンã«æŽ¥ç¶š"
+
+#~ msgid "Connect"
+#~ msgstr "接続"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : Torrent リスト"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge ログイン"
+
+#~ msgid "Move"
+#~ msgstr "移動"
+
+#~ msgid "Keyword"
+#~ msgstr "キーワード"
+
+#~ msgid "Move torrent"
+#~ msgstr "torrent を移動"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Either"
+#~ msgstr "ã©ã¡ã‚‰ã‹"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Statistics"
+#~ msgstr "統計"
+
+#~ msgid "Delete"
+#~ msgstr "削除"
+
+#~ msgid "Stop"
+#~ msgstr "åœæ­¢"
+
+#~ msgid "Recheck"
+#~ msgstr "å†ãƒã‚§ãƒƒã‚¯"
+
+#~ msgid "BlockList"
+#~ msgstr "ブロックリスト"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "デーモン・スタートアップã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "タイムアウト (秒)"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "ブロック範囲: %s"
+
+#~ msgid "Queue Top"
+#~ msgstr "キューを最上部ã¸"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "キューを最下部ã¸"
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "正当ãªURLを入力"
+
+#~ msgid "From Session"
+#~ msgstr "セッションã‹ã‚‰"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "page 8"
+#~ msgstr "page 8"
+
+#~ msgid "page 6"
+#~ msgstr "page 6"
+
+#~ msgid "page 7"
+#~ msgstr "page 7"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+
+#~ msgid "Check for every (days)"
+#~ msgstr "毎回ãƒã‚§ãƒƒã‚¯(æ—¥)"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "ダウンロード中 %.2f%%"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 10"
+#~ msgstr "page 10"
+
+#~ msgid "page 11"
+#~ msgstr "page 11"
+
+#~ msgid "page 12"
+#~ msgstr "page 12"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "Error setting label options"
+#~ msgstr "ラベルオプションã®è¨­å®šã§ã‚¨ãƒ©ãƒ¼ã§ã™"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "全 %i ファイル"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "ã“ã®é›»å­ãƒ¡ãƒ¼ãƒ«ã¯ Deluge ㌠%s (%i 個ã®ãƒ•ã‚¡ã‚¤ãƒ«) ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚’終了ã—ãŸã“ã¨ã‚’ãŠçŸ¥ã‚‰ã›ã™ã‚‹ã‚‚ã®ã§ã™ã€‚\n"
+#~ "ã“ã®é€šçŸ¥ã‚’åœæ­¢ã—ãŸã„å ´åˆã¯ã€Deluge ã®è¨­å®šã§ã€é›»å­ãƒ¡ãƒ¼ãƒ«ã§ã®é€šçŸ¥ã‚’オフã«ã—ã¦ãã ã•ã„。\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+
+#~ msgid "State"
+#~ msgstr "状態"
+
+#~ msgid "no label"
+#~ msgstr "ラベルãªã—"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "apply_max"
+#~ msgstr "最大値をé©ç”¨ã™ã‚‹"
+
+#~ msgid "max_download_speed"
+#~ msgstr "最大ダウンロード速度"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "最大アップロード速度"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "最大アップロードスロット数"
+
+#~ msgid "max_connections"
+#~ msgstr "最大接続数"
+
+#~ msgid "apply_queue"
+#~ msgstr "キュー設定をé©ç”¨ã™ã‚‹"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "自動管ç†ã™ã‚‹"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "共有比ã§åœæ­¢ã™ã‚‹"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "共有比ã§å‰Šé™¤ã™ã‚‹"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "完了後移動をé©ç”¨ã™ã‚‹"
+
+#~ msgid "move_completed"
+#~ msgstr "完了後ã«ç§»å‹•ã™ã‚‹"
+
+#~ msgid "move_completed_path"
+#~ msgstr "移動先パス"
+
+#~ msgid "auto_add"
+#~ msgstr "自動追加ã™ã‚‹"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "自動追加トラッカー"
+
+#~ msgid "Work in progress.."
+#~ msgstr "処ç†ä¸­..."
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "IP オーãƒãƒ¼ãƒ˜ãƒƒãƒ‰ã‚’レート制é™ã«å«ã‚ãªã„"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr "ã“ã®å€¤ã¯æœ€å¤§ã§ %(max)d 文字ã¾ã§ã§ã™ (入力値: %(length)d)。"
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr "ã“ã®å€¤ã¯ %(min)d 文字以上ã§ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“ (入力値: %(length)d)。"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "リフレッシュ㯠0 より大ãããªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "自動リフレッシュ (秒)"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "変更をé©ç”¨ã™ã‚‹ã«ã¯æ‰‹å‹•ã§ WebUI ã‚’å†èµ·å‹•ã—ã¦ãã ã•ã„。"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "'%s' ã®è¨¼æ˜Žæ›¸ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "'%s' ã®ã‚­ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#~ msgid "Sidebar"
+#~ msgstr "サイドãƒãƒ¼"
+
+#~ msgid "Show sidebar"
+#~ msgstr "サイドãƒãƒ¼ã‚’表示ã™ã‚‹"
+
+#~ msgid "Show zero hits"
+#~ msgstr "ヒットã—ãªã„ã‚‚ã®ã‚‚表示ã™ã‚‹"
+
+#~ msgid "Show trackers"
+#~ msgstr "トラッカーを表示ã™ã‚‹"
+
+#~ msgid "Show keyword search"
+#~ msgstr "キーワード検索を表示ã™ã‚‹"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã™ã‚‹"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... ダウンロードファイルを削除ã™ã‚‹"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... トレントファイルを削除ã™ã‚‹"
+
+#~ msgid "Active time"
+#~ msgstr "アクティブ時間"
+
+#~ msgid "Admin"
+#~ msgstr "管ç†"
+
+#~ msgid "Cancel"
+#~ msgstr "キャンセル"
+
+#~ msgid "Connected to"
+#~ msgstr "接続先"
+
+#~ msgid "Connection Limit"
+#~ msgstr "接続制é™"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "DL 速度制é™"
+
+#~ msgid "Disk Space"
+#~ msgstr "ディスク領域"
+
+#~ msgid "Do not download"
+#~ msgstr "ダウンロードã—ãªã„"
+
+#~ msgid "Force Recheck"
+#~ msgstr "強制å†ãƒã‚§ãƒƒã‚¯"
+
+#~ msgid "High priority"
+#~ msgstr "優先度 高"
+
+#~ msgid "Highest priority"
+#~ msgstr "優先度 最高"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "外部ã‹ã‚‰ã®æŽ¥ç¶šã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#~ msgid "Normal priority"
+#~ msgstr "優先度 通常"
+
+#~ msgid "Ok"
+#~ msgstr "OK"
+
+#~ msgid "Restart"
+#~ msgstr "å†èµ·å‹•"
+
+#~ msgid "Search"
+#~ msgstr "検索"
+
+#~ msgid "Seeding time"
+#~ msgstr "シード時間"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "UL 速度制é™"
+
+#~ msgid "Update"
+#~ msgstr "æ›´æ–°"
+
+#~ msgid "Update Tracker"
+#~ msgstr "トラッカーã®æ›´æ–°"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "アップロードスロット数制é™"
+
+#~ msgid "From Url"
+#~ msgstr "URLã‹ã‚‰"
+
+#~ msgid "True"
+#~ msgstr "True"
+
+#~ msgid "False"
+#~ msgstr "False"
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "ダウンロードã«å¤±æ•—ã—ã¾ã—㟠: %s"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge ã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge ã¯ãƒ‘スワードã«ã‚ˆã£ã¦ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™\n"
+#~ "Deluge を表示ã™ã‚‹ãŸã‚ã«ãƒ‘スワードを入力ã—ã¦ä¸‹ã•ã„"
+
+#~ msgid "Filters"
+#~ msgstr "フィルタ"
+
+#~ msgid "Other.."
+#~ msgstr "ãã®ä»–..."
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>速度:</b>"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>トレントã®è¿½åŠ </b></big>"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "ダウンロード試行回数"
+
+#~ msgid "Import Now"
+#~ msgstr "ã„ã¾ã™ãインãƒãƒ¼ãƒˆã™ã‚‹"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "%s をインãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™"
+
+#~ msgid "Inactive"
+#~ msgstr "動作ã—ã¦ã„ã¾ã›ã‚“"
+
+#~ msgid "Refresh status"
+#~ msgstr "状態をリフレッシュ"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "トレントã¯åœæ­¢å…±æœ‰æ¯”を越ãˆã¾ã—ãŸã€‚"
+
+#~ msgid "Extra's"
+#~ msgstr "詳細"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "ピア交æ›"
+
+#~ msgid "Handshake"
+#~ msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "最大アップロードスロット数"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "最大接続数 (毎秒)"
+
+#~ msgid "Per Torrent"
+#~ msgstr "å„トレント"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "自動追加を有効ã«ã™ã‚‹"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "設定を変更後ã«ãƒ‡ãƒ¼ãƒ¢ãƒ³ã¨ WebUI ã‚’å†èµ·å‹•ã—ã¦ãã ã•ã„"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ã¯å­˜åœ¨ã—ã¾ã›ã‚“。"
+
+#~ msgid "Enter a whole number."
+#~ msgstr "æ•°å­—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "ã“ã®å€¤ã¯ %s 以下ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "ã“ã®å€¤ã¯ %s 以上ã§ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“。"
+
+#~ msgid "Enter a number."
+#~ msgstr "数値を入力ã—ã¦ãã ã•ã„。"
+
+#~ msgid "Enter a valid date."
+#~ msgstr "æ­£ã—ã„日付を入力ã—ã¦ãã ã•ã„。"
+
+#~ msgid "Enter a valid time."
+#~ msgstr "æ­£ã—ã„時刻を入力ã—ã¦ãã ã•ã„。"
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "æ­£ã—ã„日付/時刻を入力ã—ã¦ãã ã•ã„。"
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "æ­£ã—ã„ Eメールアドレスを入力ã—ã¦ãã ã•ã„。"
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "実行ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ã‚ã‚Šã¾ã›ã‚“。フォームã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚¿ã‚¤ãƒ—ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„。"
+
+#~ msgid "No file was submitted."
+#~ msgstr "実行ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "実行ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ç©ºã§ã™ã€‚"
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr "正常ãªã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’アップロードã—ã¦ãã ã•ã„。アップロードã—よã†ã¨ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ã‚¤ãƒ¡ãƒ¼ã‚¸ã§ã¯ãªã„ã‹ã€ç ´æã—ã¦ã„ã¾ã™ã€‚"
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "ã“ã® URL ã¯å£Šã‚ŒãŸãƒªãƒ³ã‚¯ã®ã‚ˆã†ã§ã™ã€‚"
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr "æ­£ã—ã„é¸æŠžè‚¢ã‚’é¸æŠžã—ã¦ãã ã•ã„。%(value)s ã¯æœ‰åŠ¹ãªé¸æŠžè‚¢ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "æ­£ã—ã„ IPv4 アドレスを入力ã—ã¦ãã ã•ã„。"
+
+#~ msgid "Error in Path."
+#~ msgstr "パスã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã™ã€‚"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "æ–°ã—ã„パスワード (確èª)"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "æ–°ã—ã„パスワードãŒä¸€è‡´ã—ã¾ã›ã‚“"
+
+#~ msgid "No data"
+#~ msgstr "データãªã—"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "デーモンã«æŽ¥ç¶šã—ã¦ã„ã¾ã›ã‚“"
+
+#~ msgid "Seed rank"
+#~ msgstr "シードランク"
+
+#~ msgid "Tracker Status"
+#~ msgstr "トラッカー状態"
+
+#~ msgid "Download Location"
+#~ msgstr "ダウンロード場所"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "最å°é™å‰²ã‚Šå½“ã¦"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s ã¯æ­£ã—ã„ URL ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+#~ msgid "Downloading.."
+#~ msgstr "ダウンロードã—ã¦ã„ã¾ã™..."
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "接続ã—ã¦ã„ã¾ã›ã‚“..."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "ã“ã‚Œã¯ã¾ã ä½•ã‚‚ã—ã¾ã›ã‚“...\n"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge ã¯ãƒ‘スワードä¿è­·ã•ã‚Œã¦ã„ã¾ã™!</big></b>"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>続行ã™ã‚‹ãŸã‚ã«ã¯ãƒ‘スワードを入力ã—ã¦ãã ã•ã„</i>"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Deluge セットアップウィザード"
+
+#~ msgid "Stats"
+#~ msgstr "統計"
+
+#~ msgid "Force Download"
+#~ msgstr "強制ダウンロード"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr "ã“ã®ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã¯ã‚ãªãŸãŒå¥½ããªã‚ˆã†ã« Deluge を設定ã™ã‚‹ã“ã¨ã‚’手助ã‘ã—ã¾ã™ã€‚"
diff --git a/deluge/i18n/ka.po b/deluge/i18n/ka.po
new file mode 100644
index 0000000..cdefcbf
--- /dev/null
+++ b/deluge/i18n/ka.po
@@ -0,0 +1,3918 @@
+# Georgian translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-04-19 05:53+0000\n"
+"Last-Translator: David Machakhelidze <david.machakhelidze@gmail.com>\n"
+"Language-Team: Georgian <ka@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "პáƒáƒ áƒ¢áƒ˜:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "პáƒáƒ áƒáƒšáƒ˜"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "სáƒáƒ˜áƒ“áƒáƒœ:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "ჩáƒáƒ áƒ—ულიáƒ"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის áƒáƒ›áƒáƒ áƒ©áƒ”ვáƒ"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული ფáƒáƒ˜áƒšáƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘áƒ</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "გáƒáƒ“მáƒáƒ¬áƒ”რის ლიმიტი:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის ლიმიტი:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ ტáƒáƒ áƒ”ნტები:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის სიჩქáƒáƒ áƒ”:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის სიჩქáƒáƒ áƒ”:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "კáƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბი:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "რიგი"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბული გáƒáƒ“áƒáƒ˜áƒ¢áƒáƒœáƒ”:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "მდებáƒáƒ áƒ”áƒáƒ‘áƒ"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "მეთვáƒáƒšáƒ§áƒ£áƒ áƒ”ები"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "სáƒáƒ®áƒ”ლი:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "მáƒáƒáƒ—áƒáƒ•áƒ¡áƒ”:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>მთáƒáƒ•áƒáƒ áƒ˜</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "უსმენს პáƒáƒ áƒ¢áƒ¡:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>პáƒáƒ áƒáƒ›áƒ”ტრები</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP სირ(GZip ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer ტექსტი (Zip ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Text (შეკუმშვის გáƒáƒ áƒ”შე)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ლიდერი"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ’იური კáƒáƒ“ი"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ვერსიáƒ"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "ბლáƒáƒ™áƒ˜áƒ áƒ”ბის სიáƒ"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "ბმული:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "დღე"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>პáƒáƒ áƒáƒ›áƒ”ტრები</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "ტიპი:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>ინფáƒ</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "ტáƒáƒ áƒ”ნტი დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "ტáƒáƒ áƒ”ნტი დáƒáƒ”მáƒáƒ¢áƒ"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "შესრულებáƒ"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "მáƒáƒ•áƒšáƒ”ნáƒ"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "ბრძáƒáƒœáƒ”ბáƒ"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "ბრძáƒáƒœáƒ”ბები"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "áƒáƒœáƒáƒœáƒ¡áƒ˜ OK"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "ყურáƒáƒ“ღებáƒ"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "შეცდáƒáƒ›áƒ"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "áƒáƒ•áƒ¦áƒáƒœáƒ”თი"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "áƒáƒšáƒ‘áƒáƒœáƒ”თი"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "áƒáƒšáƒŸáƒ˜áƒ áƒ˜"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "áƒáƒœáƒ“áƒáƒ áƒ"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "áƒáƒœáƒ’áƒáƒšáƒ"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "áƒáƒœáƒ¢áƒáƒ áƒ¥áƒ¢áƒ˜áƒ“áƒ"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "áƒáƒ áƒ’ენტინáƒ"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "სáƒáƒ›áƒ®áƒ”თი"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "áƒáƒ•áƒ¡áƒ¢áƒ áƒáƒšáƒ˜áƒ"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "áƒáƒ•áƒ¡áƒ¢áƒ áƒ˜áƒ"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "áƒáƒ–ერბáƒáƒ˜áƒ¯áƒáƒœáƒ˜"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "ბáƒáƒ°áƒáƒ›áƒ˜áƒ¡ კუნძულები"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "ბáƒáƒ°áƒ áƒ”ინი"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "ბáƒáƒœáƒ’ლáƒáƒ“ეში"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "ბáƒáƒ áƒ‘áƒáƒ“áƒáƒ¡áƒ˜"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "ბელგიáƒ"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "ბერმუდი"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "ბáƒáƒšáƒ˜áƒ•áƒ˜áƒ"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "ბáƒáƒ¡áƒœáƒ˜áƒ დრჰერცáƒáƒ’áƒáƒ•áƒ˜áƒœáƒ"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "ბáƒáƒªáƒ•áƒáƒœáƒ"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "ბრáƒáƒ–ილიáƒ"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "ბრიტáƒáƒœáƒ”თის ინდáƒáƒ”თის áƒáƒ™áƒ”áƒáƒœáƒ˜áƒ¡ ტერიტáƒáƒ áƒ˜áƒ"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "ბულგáƒáƒ áƒ”თი"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "კáƒáƒ›áƒ‘áƒáƒ¯áƒ"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "კáƒáƒ›áƒ”რუნი"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "კáƒáƒœáƒáƒ“áƒ"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "კáƒáƒ˜áƒ›áƒáƒœáƒ˜áƒ¡ კუნძულები"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "ჩáƒáƒ“ი"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "ჩილე"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "ჩინეთი"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "áƒáƒ¦áƒ“გáƒáƒ›áƒ˜áƒ¡ კუნძულები"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "კáƒáƒšáƒ£áƒ›áƒ‘იáƒ"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "კáƒáƒœáƒ’áƒ"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "კáƒáƒ¢ დიუáƒáƒ áƒ˜"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "ხáƒáƒ áƒ•áƒáƒ¢áƒ˜áƒ"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "კუბáƒ"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "კვიპრáƒáƒ¡áƒ˜"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "ჩეხეთის რესპუბლიკáƒ"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "დáƒáƒœáƒ˜áƒ"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "ეკვáƒáƒ“áƒáƒ áƒ˜"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "ეგვიპტე"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "ესტáƒáƒœáƒ”ტი"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "ეთიáƒáƒžáƒ˜áƒ"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "ფáƒáƒ áƒ”რის კუნძულები"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "ფიჯი"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "ფინეთი"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "სáƒáƒ¤áƒ áƒáƒœáƒ’ეთი"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "ფრáƒáƒœáƒ’ული გვინეáƒ"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "სáƒáƒ¥áƒáƒ áƒ—ველáƒ"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "გერმáƒáƒœáƒ˜áƒ"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "გáƒáƒ”რთიáƒáƒœáƒ”ბული სáƒáƒ›áƒ”ფáƒ"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "გáƒáƒœáƒ"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "გიბრáƒáƒšáƒ¢áƒáƒ áƒ˜"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "სáƒáƒ‘ერძნეთი"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "გრენლáƒáƒœáƒ“იáƒ"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "გვáƒáƒ“áƒáƒšáƒ£áƒžáƒ”"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "გვáƒáƒ¢áƒ”მáƒáƒšáƒ"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "გვინეáƒ"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "ჰáƒáƒ˜áƒ¢áƒ˜"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "ჰáƒáƒœáƒ“ურáƒáƒ¡áƒ˜"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "უნგრეთი"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "ისლáƒáƒœáƒ“იáƒ"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "ინდáƒáƒ”თი"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "ინდáƒáƒœáƒ”ზიáƒ"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "ირáƒáƒœáƒ˜áƒ¡ ისლáƒáƒ›áƒ£áƒ áƒ˜ რესპუბლიკáƒ"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "ერáƒáƒ§áƒ˜"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "ირლáƒáƒœáƒ“იáƒ"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "მáƒáƒœáƒ˜áƒ¡ კუნძული"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "ისრáƒáƒ”ლი"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "იტáƒáƒšáƒ˜áƒ"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "იáƒáƒ›áƒáƒ˜áƒ™áƒ"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "იáƒáƒžáƒáƒœáƒ˜áƒ"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "ყáƒáƒ–áƒáƒ®áƒ”თი"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "კენიáƒ"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "ქუვეითი"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "ყირგიზეთი"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "ლáƒáƒ¢áƒ•áƒ˜áƒ"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "ლიხტენშტეინი"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "ლუქსემბურგი"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "მáƒáƒ“áƒáƒ’áƒáƒ¡áƒ™áƒáƒ áƒ˜"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "კლიენტი"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "პრáƒáƒ’რესი"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის სიჩქáƒáƒ áƒ”"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის სიჩქáƒáƒ áƒ”"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "ლიმიტის გáƒáƒ áƒ”შე"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "სხვáƒ..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "დელუჯი"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "დáƒáƒ‘ლáƒ"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "ზევით"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "ტáƒáƒ áƒ”ნტი დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვები"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "ქსელი"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "გáƒáƒ›áƒ¢áƒáƒ áƒ£áƒœáƒáƒ áƒ˜áƒáƒœáƒáƒ‘áƒ"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "სხვáƒ"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "მáƒáƒ“ულები"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "მáƒáƒ“ული"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "ზáƒáƒ›áƒ"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "შეáƒáƒ áƒ©áƒ˜áƒ” .torrent ფáƒáƒ˜áƒšáƒ˜"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "ტáƒáƒ áƒ”ნტ ფáƒáƒ˜áƒšáƒ”ბი"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "ყველრფáƒáƒ˜áƒšáƒ˜"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "მეთვáƒáƒšáƒ§áƒ£áƒ áƒ”"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "შეერთებები"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "გáƒáƒ›áƒáƒ áƒ—ვáƒ"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "შეáƒáƒ áƒ©áƒ˜áƒ”თ დირექტáƒáƒ áƒ˜áƒ ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ“áƒáƒ¡áƒáƒ¢áƒáƒœáƒáƒ“"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "პრიáƒáƒ áƒ˜áƒ¢áƒ”ტი"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr ""
+"_: instable.src#DLG_INSERT_TABLE.FT_NAME.fixedtext.text\n"
+"სáƒáƒ®áƒ”ლი"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ულიáƒ"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ულიáƒ"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "მთესველები"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "პირები"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ETA"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "რáƒáƒ¢áƒ˜áƒ"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_ფáƒáƒ˜áƒšáƒ˜"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "ტáƒáƒ áƒ”ნტის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "რ_ედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "ტáƒáƒ áƒ”ნტი"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_ხედი"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "ხელსáƒáƒ¬áƒ§áƒáƒ—რ_პáƒáƒœáƒ”ლი"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_კáƒáƒšáƒáƒœáƒ”ბი"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "ტáƒáƒ áƒ”ნტის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "ტáƒáƒ áƒ”ნტის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "ტáƒáƒ áƒ”ნტის áƒáƒ›áƒáƒ¦áƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "პáƒáƒ£áƒ–áƒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "გáƒáƒ’რძელებáƒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "ტáƒáƒ áƒ”ნტის რიგში მáƒáƒ¦áƒšáƒ áƒáƒ¢áƒáƒœáƒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "ტáƒáƒ áƒ”ნტის რიგში დáƒáƒ‘ლრჩáƒáƒ›áƒáƒ¢áƒáƒœáƒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "რიგში უკáƒáƒœ დáƒáƒ¬áƒ”ვáƒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>მეთვáƒáƒšáƒ§áƒ£áƒ áƒ˜áƒ¡ სტáƒáƒ¢áƒ£áƒ¡áƒ˜:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒáƒ‘áƒ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>პირები:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>მთესველები:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>ნáƒáƒ­áƒ”რი:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>ETA:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>შემდეგი áƒáƒœáƒáƒœáƒ¡áƒ˜:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>სáƒáƒ–იáƒáƒ áƒ რეიტინგი:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ულიáƒ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ულიáƒ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># ფáƒáƒ˜áƒšáƒ”ბიდáƒáƒœ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>მეთვáƒáƒšáƒ§áƒ£áƒ áƒ”:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>სრული ზáƒáƒ›áƒ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>სáƒáƒ®áƒ”ლი:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>გეზი:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_დეტáƒáƒšáƒ”ბი"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "მეთვáƒáƒšáƒ§áƒ£áƒ áƒ”თრრედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "ყველáƒáƒ¡ მáƒáƒœáƒ˜áƒ¨áƒ•áƒœáƒ"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "სრული პáƒáƒ£áƒ–áƒ"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "შერჩეული ტáƒáƒ áƒ”ნტების გáƒáƒ’რძელებáƒ."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "ტáƒáƒ áƒ”ნტის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "áƒáƒ›áƒáƒ¦áƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>ტáƒáƒ áƒ”ნტები</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "ფáƒáƒ˜áƒšáƒ”ბი"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "გáƒáƒœáƒ—áƒáƒ•áƒ¡áƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "áƒáƒœáƒ­áƒ áƒ˜áƒ¡ ზáƒáƒ›áƒ:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "სრული გáƒáƒœáƒ—áƒáƒ•áƒ¡áƒ”ბის áƒáƒ—ვისებáƒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"სრული ლáƒáƒ™áƒáƒªáƒ˜áƒ წინáƒáƒ¡áƒ¬áƒáƒ  მáƒáƒœáƒ˜áƒ¨áƒœáƒáƒ•áƒ¡ სივრცეს, რáƒáƒ›áƒ”ლიც სáƒáƒ­áƒ˜áƒ áƒáƒ ტáƒáƒ áƒ”ნტისáƒáƒ’áƒáƒœ დრ"
+"áƒáƒ›áƒ˜áƒ— გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒáƒ•áƒ¡ ფრáƒáƒ’მენტáƒáƒªáƒ˜áƒáƒ¡"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "კáƒáƒ›áƒžáƒáƒ¥áƒ¢áƒ£áƒ áƒ˜ გáƒáƒœáƒ—áƒáƒ•áƒ¡áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "სივრცის კáƒáƒ›áƒžáƒáƒ¥áƒ¢áƒ£áƒ áƒ˜ თვისებრმხáƒáƒšáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ”ბის მიხედვით"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "პირველი დრბáƒáƒšáƒ ნáƒáƒ­áƒ áƒ”ბის პრიáƒáƒ áƒ˜áƒ–ებრტáƒáƒ áƒ”ნტში"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>ქსელი</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "შემთხვევითი პáƒáƒ áƒ¢áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "დელუჯი áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ შეáƒáƒ áƒ©áƒ”ვს გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ”ბულ პáƒáƒ áƒ¢áƒ¡ ყáƒáƒ•áƒ”ლ ჯერზე."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ პáƒáƒ áƒ¢áƒ˜:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "სáƒáƒ“:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ პáƒáƒ áƒ¢áƒ˜áƒ¡ ტესტირებáƒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT პáƒáƒ áƒ¢áƒ”ბის მინიჭების პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "პირების გáƒáƒªáƒ•áƒšáƒâ€“გáƒáƒ›áƒáƒªáƒ•áƒšáƒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "დისტრიბუციული ჰეშ ცხრილი ხელს უწყáƒáƒ‘ს áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ  შეერთებებს"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>ქსელური დáƒáƒœáƒáƒ›áƒáƒ¢áƒ”ბი</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "შემáƒáƒ›áƒáƒ•áƒáƒšáƒ˜:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "დáƒáƒœáƒ”:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"ხელის ჩáƒáƒ›áƒáƒ áƒ—მევáƒ\n"
+"სრული დინებáƒ\n"
+"სხვáƒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "გáƒáƒ›áƒáƒ•áƒáƒšáƒ˜:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•áƒ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "შეერთების მცდელáƒáƒ‘ების რáƒáƒáƒ“ენáƒáƒ‘რერთ წáƒáƒ›áƒ¨áƒ˜:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ნáƒáƒ®áƒ”ვრáƒáƒ“ ღირშეერთებები:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის სიჩქáƒáƒ áƒ” ყველრტáƒáƒ áƒ”ნტისáƒáƒ—ვის. მიუთითეთ –1 ლიმიტის "
+"მáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლáƒáƒ“."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიჩქáƒáƒ áƒ”(KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "შეერთებáƒáƒ—რმáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ. დáƒáƒáƒ§áƒ”ნეთ–1 ლიმიტის მáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლáƒáƒ“."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ შეერთებები:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სლáƒáƒ¢áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘áƒ. მიუთითეთ –1 ლიმიტáƒáƒ¡ მáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლáƒáƒ“."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სლáƒáƒ¢áƒ”ბი"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"ყველრტáƒáƒ áƒ”ნტის ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიჩქáƒáƒ áƒ”. დáƒáƒáƒ§áƒ”ნეთ–1 ლიმიტის "
+"მáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლáƒáƒ“."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიჩქáƒáƒ áƒ”(KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>გáƒáƒ›áƒ¢áƒáƒ áƒ£áƒáƒœáƒ áƒ˜áƒáƒœáƒáƒ‘ის გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის სლáƒáƒ¢áƒ”ბი ტáƒáƒ áƒ”ნტზე. დáƒáƒáƒ§áƒ”ნეთ – 1 ლიმიტის მáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლáƒáƒ“."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ შეერთებების რáƒáƒáƒ“ენáƒáƒ‘რტáƒáƒ áƒ”ნტზე. მიუთითეთ –1 ლიმიტáƒáƒ¡ მáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლáƒáƒ“."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>გáƒáƒ›áƒ¢áƒáƒ áƒ£áƒœáƒáƒ áƒ˜áƒáƒœáƒáƒ‘ის გáƒáƒ›áƒáƒ§áƒ”ნებრტáƒáƒ áƒ”ნტზე</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "ჩáƒáƒ áƒ—ვáƒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>მთáƒáƒ•áƒáƒ áƒ˜ ფáƒáƒœáƒ¯áƒáƒ áƒ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "სისტემური პáƒáƒœáƒ”ლის ხáƒáƒ¢áƒ£áƒšáƒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "მინიმიზáƒáƒªáƒ˜áƒ სისტემურ პáƒáƒœáƒ”ლში დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡áƒáƒ¡"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "გáƒáƒ¨áƒ•áƒ”ბრსისტემურ პáƒáƒœáƒ”ლში"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "სისტემური პáƒáƒœáƒ”ლის პáƒáƒ áƒáƒšáƒ˜áƒ— დáƒáƒªáƒ•áƒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>სისტემური პáƒáƒœáƒ”ლი</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "შეტყáƒáƒ‘ინებრáƒáƒ®áƒáƒšáƒ˜ ვერსის გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ˜áƒ¡áƒáƒ¡"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"დელუჯი შეáƒáƒ›áƒáƒ¬áƒ›áƒ”ბს ჩვენს სერვერებს დრშეგáƒáƒ¢áƒ§áƒáƒ‘ინებთ áƒáƒ®áƒáƒšáƒ˜ ვერსიის გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ˜áƒ¡ "
+"შესáƒáƒ®áƒ”ბ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "გáƒáƒœáƒáƒ®áƒšáƒ”ბები"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ სისტემის შესáƒáƒ®áƒ”ბ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>კáƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბი</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>სხვáƒ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>რიგი</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>თესვáƒ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"áƒáƒ áƒªáƒ”რთი\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "áƒáƒ©áƒ•áƒ”ნე დელუჯი"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "გáƒáƒœáƒáƒ’რძე ყველáƒ"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის სიჩქáƒáƒ áƒ˜áƒ¡ ლიმიტი"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის სიჩქáƒáƒ áƒ˜áƒ¡ ლიმიტი"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "გáƒáƒ’რძელებáƒ"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "რიგი"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "მეთვáƒáƒšáƒ§áƒ£áƒ áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "ტáƒáƒ áƒ”ნტის áƒáƒ›áƒáƒ¦áƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "კáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜áƒ¡ ლიმიტი"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ მáƒáƒ áƒ—ული"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "მáƒáƒ—ვáƒáƒšáƒ§áƒ áƒ”თრრედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>სიჩქáƒáƒ áƒ”:</b>"
+
+#~ msgid "Details"
+#~ msgstr "დეტáƒáƒšáƒ”ბი"
+
+#~ msgid "Availability"
+#~ msgstr "ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒáƒ‘áƒ"
+
+#~ msgid "Clear"
+#~ msgstr "გáƒáƒ¬áƒ›áƒ”ნდáƒ"
+
+#~ msgid "Select All"
+#~ msgstr "ყველáƒáƒ¡ მáƒáƒœáƒ˜áƒ¨áƒ•áƒœáƒ"
+
+#~ msgid "_Quit"
+#~ msgstr "გáƒáƒ¡áƒ•áƒšáƒ"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "დელუჯი ბლáƒáƒ™áƒ˜áƒ áƒ”ბულიáƒ"
+
+#~ msgid "Download"
+#~ msgstr "ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ"
+
+#~ msgid "Upload"
+#~ msgstr "áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ"
+
+#~ msgid "Remove"
+#~ msgstr "áƒáƒ›áƒáƒ¦áƒ”ბáƒ"
+
+#~ msgid "Share Ratio"
+#~ msgstr "ზიáƒáƒ áƒ˜ რეიტინგი"
+
+#~ msgid "Add"
+#~ msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"
+
+#~ msgid "Password"
+#~ msgstr "პáƒáƒ áƒáƒšáƒ˜"
+
+#~ msgid "Username"
+#~ msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი"
+
+#~ msgid "Speed"
+#~ msgstr "სიჩქáƒáƒ áƒ”"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "წáƒáƒ¨áƒáƒšáƒ” .torrent ფáƒáƒ˜áƒšáƒ˜"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "დელუჯი დáƒáƒªáƒ£áƒšáƒ˜áƒ პáƒáƒ áƒáƒšáƒ˜áƒ—.\n"
+#~ "დელუჯის გáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ•áƒ˜áƒ¡áƒ—ვის áƒáƒ™áƒ˜áƒ¤áƒ”თ თქვენი პáƒáƒ áƒáƒšáƒ˜"
+
+#~ msgid "Unknown"
+#~ msgstr "უცნáƒáƒ‘იáƒ"
+
+#~ msgid "Server"
+#~ msgstr "სერვერი"
+
+#~ msgid "Port"
+#~ msgstr "პáƒáƒ áƒ¢áƒ˜"
+
+#~ msgid "Graph"
+#~ msgstr "გრáƒáƒ¤áƒ˜áƒ™áƒ˜"
+
+#~ msgid "New Password"
+#~ msgstr "áƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒáƒšáƒ˜"
+
+#~ msgid "Template"
+#~ msgstr "შáƒáƒ‘ლáƒáƒœáƒ˜"
+
+#~ msgid "Text and image"
+#~ msgstr "ტექსტი დრსურáƒáƒ—ები"
+
+#~ msgid "Image Only"
+#~ msgstr "მხáƒáƒšáƒáƒ“ სურáƒáƒ—ები"
+
+#~ msgid "Text Only"
+#~ msgstr "მხáƒáƒšáƒáƒ“ ტექსტი"
+
+#~ msgid "Ava"
+#~ msgstr "Ava"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ:"
+
+#~ msgid "Disable"
+#~ msgstr "გáƒáƒ›áƒáƒ áƒ—ვáƒ"
+
+#~ msgid "Config"
+#~ msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ"
+
+#~ msgid "Set"
+#~ msgstr "მითითებáƒ"
+
+#~ msgid "Submit"
+#~ msgstr "გáƒáƒ’ზáƒáƒ•áƒœáƒ"
+
+#~ msgid "Resume all"
+#~ msgstr "ყველáƒáƒ¡ გáƒáƒ’რძელებáƒ"
+
+#~ msgid "Set Timeout"
+#~ msgstr "დრáƒáƒ˜áƒ¡ მითითებáƒ"
+
+#~ msgid "Disabled"
+#~ msgstr "გáƒáƒ›áƒáƒ áƒ—ული"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Upload torrent"
+#~ msgstr "ტáƒáƒ áƒ”ნტის áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ"
+
+#~ msgid "Tracker Status"
+#~ msgstr "მეთვáƒáƒšáƒ§áƒ£áƒ áƒ˜áƒ¡ სტáƒáƒ¢áƒ£áƒ¡áƒ˜"
+
+#~ msgid "seconds"
+#~ msgstr "წáƒáƒ›áƒ”ბი"
+
+#~ msgid "Filters"
+#~ msgstr "ფილტრები"
+
+#~ msgid "Files"
+#~ msgstr "ფáƒáƒ˜áƒšáƒ”ბი"
+
+#~ msgid "translate something"
+#~ msgstr "რáƒáƒ›áƒ˜áƒ¡ თáƒáƒ áƒ’მáƒáƒœ"
+
+#~ msgid "Logout"
+#~ msgstr "გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ"
+
+#~ msgid "About"
+#~ msgstr "პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ"
+
+#~ msgid "# Of Files"
+#~ msgstr "# ფáƒáƒšáƒ”ბიდáƒáƒœ"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒšáƒ˜, კიდევ სცáƒáƒ“ეთ"
+
+#~ msgid "Next Announce"
+#~ msgstr "შემდეგი áƒáƒœáƒáƒœáƒ¡áƒ˜"
+
+#~ msgid "Login"
+#~ msgstr "შესვლáƒ"
+
+#~ msgid "Eta"
+#~ msgstr "Eta"
+
+#~ msgid "Type"
+#~ msgstr "ტიპი"
+
+#~ msgid "Total Size"
+#~ msgstr "სრული ზáƒáƒ›áƒ"
+
+#~ msgid "Torrent list"
+#~ msgstr "ტáƒáƒ áƒ”ნტების სიáƒ"
+
+#~ msgid "Pieces"
+#~ msgstr "ნáƒáƒ­áƒ áƒ”ბი"
+
+#~ msgid "Pause all"
+#~ msgstr "ყველáƒáƒ¡ პáƒáƒ£áƒ–áƒ"
+
+#~ msgid "From"
+#~ msgstr "სáƒáƒ˜áƒ“áƒáƒœ"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "გვერდის გáƒáƒœáƒáƒ®áƒšáƒ”ბრყáƒáƒ•áƒ”ლ:"
+
+#~ msgid "Reannounce"
+#~ msgstr "ხელáƒáƒ®áƒáƒšáƒ˜ áƒáƒœáƒáƒœáƒ¡áƒ˜"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>ტáƒáƒ áƒ”ნტის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ</b></big>"
diff --git a/deluge/i18n/kk.po b/deluge/i18n/kk.po
new file mode 100644
index 0000000..690ac43
--- /dev/null
+++ b/deluge/i18n/kk.po
@@ -0,0 +1,4737 @@
+# Kazakh translation for deluge
+# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2011-03-30 10:00+0000\n"
+"Last-Translator: jmb_kz <Unknown>\n"
+"Language-Team: Kazakh <kk@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "КБ/Ñ"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "ХоÑÑ‚ аты:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Буманы тандау"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "МакÑимум байланыÑтар Ñаны:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Жүктеп алу жылдамдығы:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Ðқпараты</b>"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Торрент"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Барлық файлдар"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "Торрентті Ò›_оÑу"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "Тор_рент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "Бет_тер"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "_Бүйір панелі"
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Торрентті қоÑу"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Торрентті қоÑу"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "Барлығын таң_дау"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "Өшір_у"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "МакÑимал жүктеп алу жылдамдығы:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Ð_Ñлданған түрде қоÑу"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Бірінші мен Ñоңғы бөліктердің баÑымдылығын арттыру"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Б_ума"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "ТүÑініктемелер:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Мәліметі"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Ықшам резервілеу"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Торренттің бірінші мен Ñоңғы бөліктердің баÑымдылығын арттыру"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Торренттің бірінші мен Ñоңғы бөліктердің баÑымдылығын арттыру"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"TOS байт, әр IP деÑтеÑінің баÑында орналаÑады және пирлерге беріледі "
+"(интернет-Ñидерлерді қоÑа). Оналтылық мән."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Пирлермен алмаÑу"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Шектеулер</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"Торрент үшін байланыÑтар ең көп Ñаны. Шектелмеген мәні үшін -1 қойыңыз."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Жүйелік Ñөреде таңбашаÑын көрÑету"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Жаңа нұÑқалары жөнінде хабарлау"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr "Deluge жаңа нұÑқалардың бар-жоғын текÑеріп отырады"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "ХоÑÑ‚Ñ‹:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Ðвтордың E-mail-Ñ‹:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "Плаги_нді орнату"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "Плагиндерді _жаңарту"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "Deluge кө_Ñ€Ñету"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "Мәліметтерді текÑері_п шығу"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "БайланыÑтар Ñанын шектеу"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Мәліметтермен қоÑа өшіру"
+
+#~ msgid "gtk-edit"
+#~ msgstr "Түзету"
+
+#~ msgid "# Of Files"
+#~ msgstr "Файлдар Ñаны"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr "КиБ"
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr "МиБ"
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr "Гиб"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr "pynotify орнатылмаған"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr "pynotify мәлімдеме көрÑете алмады"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr "pygame орнатылмаған"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr "ÐÑқталған торренттер"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr "Ð”Ñ‹Ð±Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ таңдаңыз"
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr "Мәлімдеме Ñлектрондық хаты жіберілді"
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr "\"%(name)s\" торренті аÑқталды"
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+"Deluge оÑÑ‹ хатпен, құрамында %(num_files)i файлы бар \"%(name)s\" жүктеуін "
+"аÑқтағаны жайлы мәлімдейді.\n"
+"ОÑындай мәлімдемелерді алмау үшін, Deluge баптауларында, Ñлектронды поштамен "
+"мәлімдеу баптауын алып таÑтаңыз.\n"
+"\n"
+"Рахмет,\n"
+"Deluge"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr "<b><i><big>Мәлімдемелер</big></i></b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr "<b>UI мәлімдемелері</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Порт:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Пайдаланушы аты:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "ÒšÒ±Ð¿Ð¸Ñ Ñөз:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr "<b>Ðлушылар</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr "Сервер TLS/SSL талап етеді"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Қайдан:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "ҚоÑулы"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr "<b>Электрондық хат мәлімдемелері</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Баптаулар"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr "Жазылулар"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr "КөрÑетілген орналаÑу жері жоқ."
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr "ҚоÑқаннан кейін .torrent файлын жою"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr "Жүктеме орналаÑуын көрÑету"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Жүктеме орны</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr "Жүктеме аÑқталғанда Ñақтау орналаÑуын көрÑету"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr "<b>Жылжыту аÑқталды</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr "Белгі: "
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr "<b>Белгі</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr "Ðегізгі"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Таратудың макÑимал жылдамдығы:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Тарату Ñлоттардың макÑимал Ñаны:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Жүктеп алудың макÑимал жылдамдығы:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Каналдың өткізу қабілеттілігі</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "ОÑÑ‹ рейтингтен аÑқан кезде, таратуды тоқтату:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "КелеÑÑ– рейтингке жеткенде, жою"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Жоғарыға"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Төмен"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Кезек</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Баптаулар"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Жүктеу шегі:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Тарату шегі:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "БелÑенді торренттер:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Шектеулер</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Қате белгі, Ñ€Ò±Ò›Ñат етілетін Ñимволдар: [a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Ð‘Ð¾Ñ Ð±ÐµÐ»Ð³Ñ–"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Белгі бар болып тұр"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "БелгіÑіз белгі"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "БелгіÑіз торрент"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Белгі"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Белгі _баптаулары"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "Белгіні _жою"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "Белгіні _қоÑу"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Белгі баптаулары"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Белгі баптаулары</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Тарату Ñлоттары:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Тарату жылдамдығы:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "БайланыÑтар:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Торрент үшін макÑималды баптаулар:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "МакÑимал"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Ðвтоматты баÑқару"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Кезек баптауларын қолдану:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Кезекке"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "ÐÑқталғандарды оÑÑ‹ жерге жылжыту:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "ОрналаÑу баптауларын қолдану:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "ОрналаÑуы"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(әр трекер бөлек жолда)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "ОÑÑ‹ белгіні автоматты түрде қолдану:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Трекерлер"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Белгіні қоÑу"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Белгіні қоÑу</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "ÐÑ‚Ñ‹:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Бүйір панелді белгілерді қоÑу, түзету немеÑе өшіру үшін қолданыңыз. </i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Белгілер</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "ОÑÑ‹ жерге шығару:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "ÒšÒ±Ñ€Ð°Ð¼Ð´Ð°Ñ Ð±ÑƒÐ¼Ð°Ð½Ñ‹ торрент атымен атап, құру"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Бұл баптау, таңдалған бумада торрент атымен аталған, жаңадан құрылған "
+"Ò›Ò±Ñ€Ð°Ð¼Ð´Ð°Ñ Ð±ÑƒÐ¼Ð°Ð½Ñ‹Ò£ ішіне файлдарды шығаруға мүмкіндік береді."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Жалпы</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+"Deluge веб интерфейÑÑ– орнатылмаған, оны\n"
+"орнатып қайтадан байқап көріңіз"
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Веб интерфейÑÑ‚Ñ– қоÑу"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "SSL қолдану"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Тыңдалатын порт:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Баптаулар</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP тізімі (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer мәтіні (zip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian мәтіні (Ñығылмаған)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "БаÑÑ‹ Ð´Ò±Ñ€Ñ‹Ñ ÐµÐ¼ÐµÑ"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Ðеверный отпечаток"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Қате нұÑқаÑÑ‹"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Қара тізім (Blocklist)"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL ÑілтемеÑÑ–:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Күн"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Жаңа тізімді уақыт өте текÑеру:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Қара тізімді бағдарлама қоÑылу кезінде импорттау"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Қара тізімді керек болÑа, жүктеп алып, импорттау."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "ТекÑеріп алып, импорттау"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Жаңа қара тізім файлын жүктеп алып, импорттау."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Жүктеп алуды мен импорттауды мәжбүрлі түрде орындау"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Қара тізім еÑкірген жоқ"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Баптаулар</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Түрі:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Күні:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Файл көлемі:"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Торрент аÑқталды"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Торрент қоÑылды"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Орындау"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Оқиға"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Команда"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Команданы қоÑу</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Командалар</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "ÐÐ½Ð¾Ð½Ñ Ñәтті орындалды"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "ÐÐ½Ð¾Ð½Ñ Ð¶Ñ–Ð±ÐµÑ€Ñ–Ð»Ð´Ñ–"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Ðазар аударыңыз"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Қате"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "ÐуғанÑтан"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Ðланд аралдары"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "ÐлбаниÑ"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Ðлжир"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Ð¨Ñ‹Ò“Ñ‹Ñ Ð¡Ð°Ð¼Ð¾Ð° (ÐҚШ)"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Ðндорра"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Ðнгола"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Ðнгвилла"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Ðнтарктика"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Ðнтигуа және Барбуда"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Ðргентина"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "ÐрмениÑ"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Ðруба"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "ÐвÑтралиÑ"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "ÐвÑтриÑ"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Әзірбайжан"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Багам аралдары"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Бахрейн"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Бангладеш"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "БарбадоÑ"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "БеларуÑÑŒ"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "БельгиÑ"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Белиз"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Бенин"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Бермуд аралдары"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Бутан"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "БоливиÑ"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "БоÑÐ½Ð¸Ñ Ð¶Ó™Ð½Ðµ Герцеговина"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "БотÑвана"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Буве аралдары"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "БразилиÑ"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Үнді мұхитындағы Ò°Ð»Ñ‹Ð±Ñ€Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ð°Ð¹Ð¼Ð°Ò“Ñ‹"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Бруней ДаруÑÑалам"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "БолгариÑ"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Буркина ФаÑо"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Бурунди"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Камбоджа"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Камерун"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Канада"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Кабо-Верде"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Кайман аралдары"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Орталық Ðфрика РеÑпубликаÑÑ‹"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Чад"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Чили"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Қытай"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "РождеÑтво аралы"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "ÐšÐ¾ÐºÐ¾Ñ Ð°Ñ€Ð°Ð»Ð´Ð°Ñ€Ñ‹"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "КолумбиÑ"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Комор аралдары"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Конго"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Конго ДемократиÑлық РеÑпубликаÑÑ‹"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Кук аралдары"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "КоÑта Рика"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Кот-д'Ивуар"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "ХорватиÑ"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Куба"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Кипр"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "ЧехиÑ"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "ДаниÑ"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Джибути"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Доминика"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Доминикан РеÑпубликаÑÑ‹"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Эквадор"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "МыÑÑ‹Ñ€"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "Сальвадор"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Экваториалдық ГвинеÑ"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "ЭритреÑ"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "ЭÑтониÑ"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "ЭфиопиÑ"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Фолкленд (Мальвин) аралдары"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Фарер аралдары"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Фиджи"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "ФинлÑндиÑ"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "ФранциÑ"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "ФранциÑның ГвианаÑÑ‹"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "Polinezia franceză"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "ФранциÑның ÑолтүÑтік аймақтары"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Габон"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "ГамбиÑ"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "ГрузиÑ"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "ГерманиÑ"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "ҰлыбританиÑ"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Гана"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Гибралтар"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "ГрекиÑ"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "ГренландиÑ"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Гренада"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Гваделупа"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Гуам"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Гватемала"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "ГернÑи"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "ГвинеÑ"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "ГвинеÑ-БиÑау"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Гайана"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Гаити"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Хеард пен Макдональд аралдары"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Ватикан"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "ГондураÑ"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Гонконг"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "ВенгриÑ"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "ИÑландиÑ"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "ҮндіÑтан"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "ИндонезиÑ"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Иран ИÑламдық РеÑпубликаÑÑ‹"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Ирак"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "ИрландиÑ"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "ÐœÑн аралы"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Израиль"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "ИталиÑ"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Ямайка"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "ЖапониÑ"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "ДжерÑи"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "ИорданиÑ"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "ҚазақÑтан"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "КениÑ"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Кирибати"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "ÐšÐ¾Ñ€ÐµÑ (СолтүÑтік)"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "ÐšÐ¾Ñ€ÐµÑ Ð ÐµÑпубликаÑÑ‹"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Кувейт"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "ҚырғызÑтан"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Ð›Ð°Ð¾Ñ Ð¥Ð°Ð»Ñ‹Ò› ДемократиÑлық РеÑпубликаÑÑ‹"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "ЛатвиÑ"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Ливан"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "ЛеÑото"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "ЛибериÑ"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Ð›Ð¸Ð²Ð¸Ñ Ðраб ДжамахириÑÑÑ‹"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Лихтенштейн"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Литва"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "ЛюкÑембург"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Макао"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "МакедониÑ"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "МадагаÑкар"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Малави"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "МалайзиÑ"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Мальдив аралдары"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Мали"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Мальта"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Маршалл аралдары"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Мартиника"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "МавританиÑ"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Маврикий"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Мариотт"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "МекÑика"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "МикронезиÑ"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Молдова"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Монако"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "МонғолиÑ"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "ЧерногориÑ"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "МонÑеррат"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Марокко"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Мозамбик"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "МьÑнма"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "ÐамибиÑ"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Ðауру"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Ðепал"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Ðидерланды"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "ÐидерландиÑның Ðнтиль аралдары"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Жаңа КаледониÑ"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Жаңа ЗеландиÑ"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Ðикарагуа"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Ðигер"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "ÐигериÑ"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "ÐиуÑ"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Ðорфолк аралы"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "СолтүÑтік Марианна Ðралдары"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "ÐорвегиÑ"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Оман"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "ПәкіÑтан"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Палау"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "ПалеÑтина жері"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Панама"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Папуа - Жаңа ГвинеÑ"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Парагвай"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Перу"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Филиппин"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "ПиткÑрн аралдары"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Польша"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "ПортугалиÑ"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "ПуÑрто-Рико"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Катар"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Реюньон"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "РумыниÑ"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "РеÑей"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Руанда"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Сен-Бартелемей"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Әулие Елена ар."
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Сент-ÐšÐ¸Ñ‚Ñ Ð¶Ó™Ð½Ðµ ÐевиÑ"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Сент-ЛюÑиÑ"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Сент-Мартин"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Сен-Пьер және Микелон"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Сент-ВинÑент және Гренадинар"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Самоа"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "Сан-Марино"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Сан-Томе және ПринÑипи"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Сауд ÐрабиÑÑÑ‹"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Сенегал"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "СербиÑ"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Сейшел аралдары"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Сьерра-Леоне"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Сингапур"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "СловакиÑ"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "СловениÑ"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Соломон аралдары"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Сомали"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "ОңтүÑтік Ðфрика"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "ОңтүÑтік Ð”Ð¶Ð¾Ñ€Ð´Ð¶Ð¸Ñ Ð¼ÐµÐ½ ОңтүÑтік Ð¡ÐµÐ½Ð´Ð²Ð¸Ñ Ð°Ñ€Ð°Ð»Ð´Ð°Ñ€Ñ‹"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "ИÑпаниÑ"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Шри-Ланка"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Судан"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Суринам"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Шпицберген мен Ян Майен"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Свазиленд"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "ШвециÑ"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "ШвейцариÑ"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Ð¡Ð¸Ñ€Ð¸Ñ Ðраб РеÑпубликаÑÑ‹"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Тайвань Қытай ПровинциÑÑÑ‹"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "ТәжікÑтан"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "ТанзаниÑ"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Тайланд"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Тимор-ЛеÑте"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Того"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Токелау"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Тонга"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Тринидад және Тобаго"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "ТуниÑ"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "ТүркиÑ"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "ТүрікменÑтан"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Ð¢ÐµÑ€ÐºÑ Ð¶Ó™Ð½Ðµ ÐšÐ°Ð¹ÐºÐ¾Ñ Ð°Ñ€Ð°Ð»Ð´Ð°Ñ€Ñ‹"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Тувалу"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Уганда"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Украина"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Біріккен Ðраб Әмірліктері"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "ÐҚШ"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "ÐҚШ-Ò£ Сыртқы Кішкене аралдары"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Уругвай"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "ӨзбекÑтан"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Вануату"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "ВенеÑуÑла"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Вьетнам"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Виргин аралдары (ҰлыбританиÑ)"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Виргин аралдары (ÐҚШ)"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Ð£Ð¾Ð»Ð»Ð¸Ñ Ð¶Ó™Ð½Ðµ Футуна"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Ð‘Ð°Ñ‚Ñ‹Ñ Ð¡Ð°Ñ…Ð°Ñ€Ð°"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Йемен"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "ЗамбиÑ"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Зимбабве"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Желіге қоÑылмаған"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Желіге қоÑылған"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "ҚоÑылған"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Қызмет жоқ"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Қызмет жүктелмеген"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Серверді PID нөмірлі етіп жүктеу"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "ÐдреÑÑ–"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Клиент"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "БарыÑÑ‹"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Жүктеп алу жылдамдығы"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Тарату жылдамдығы"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Торренттер кезекке тұрғызылды"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Торрент кезекке тұрғызылды"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "ШектеуÑіз"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "БелÑенді"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "БаÑқа..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Жүктеу:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Тарату:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Жүктеу"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Тарату"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Жүктеп алудың макÑимал жылдамдығын орнату"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Таратудың макÑимал жылдамдығын орнату"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Торрент аÑқталды"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Deluge оÑÑ‹ хатпен, құрамында %(num_files)i файлы бар %(name)s жүктеуін "
+"аÑқтағаны жайлы мәлімдейді.\n"
+"ОÑындай мәлімдемелерді алмау үшін, Deluge баптауларында, Ñлектронды поштамен "
+"мәлімдеу баптауын алып таÑтаңыз.\n"
+"\n"
+"Рахмет,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr "Топтар"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Жүктемелер"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Желі"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Каналдың өткізу қабілеттілігі"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Сыртқы түрі (интерфейÑ)"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "БаÑқа"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Қызмет"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "ПрокÑи"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "КÑш"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Кеңейтулер"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Кеңейту"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Кеңейтуді таңдаңыз"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Eggs кеңейтуі"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Файл аты"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Көлемі"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "ЖарамÑыз файл"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Торрент бар болып тұр"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Бір торрентті бірнеше рет қоÑа алмайÑыз."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Файл үшін баÑымдылықты (приоритет) орнату мүмкін емеÑ!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+"Ықшам резервілеу кезінде файлдардың жүктеу баÑымдылығы Ð¶Ò±Ð¼Ñ‹Ñ Ñ–Ñтемейді. "
+"Толық резервілеуге ауыÑтыру қажет пе?"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ".torrent файлын таңдаңыз"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Торрент файлдары"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "ЖарамÑыз URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Жүктеу ÑәтÑіз аÑқталды"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Деңгей"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Трекер"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Файлды таңдаңыз"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Буманы таңдаңыз"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ".torrent файлын Ñақтау"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "ҚоÑылмаған"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "ҚоÑылыÑтар"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Жүктеп алу жылдамдығы"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Тарату жылдамдығы"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Жүктеп алу/тарату трафигін текÑеріп отыру"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT тораптары"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "ÐšÑ–Ñ€Ñ–Ñ Ò›Ð¾ÑылыÑтары жоқ!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "МакÑимал қоÑылыÑтар Ñанын орнату"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Торренттер"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Белгілер"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Барлық"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Жүктелуде"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Таратылуда"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "ÐÑлдап тұр"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "ТекÑеру"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "Кезекте"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr "БелÑенді"
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Жоқ"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "БелгіÑÑ– жоқ"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr "Күйі"
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "ХоÑÑ‚Ñ‹"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr "ÐÒ±Ñқа"
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr "Қызметті _тоқтату"
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr "Қызметті Ñ–Ñ_ке қоÑу"
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr "Қызметті Ñ–Ñке қоÑу мүмкін емеÑ"
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+"Deluge орындалатын бинарлы \"deluged\" файлын таба алмады. Мүмкін Ñізде "
+"deluged пакеті орнатылмаған немеÑе ол PATH жолында көрÑетілмеген."
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "ХоÑÑ‚ қоÑу қатеÑÑ–"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "КлаÑÑикалық режимді қолданыÑтан шығару қажет пе?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Deluge қызметі (deluged) қоÑылған Ñекілді.\n"
+"\n"
+"ЖалғаÑтыру үшін, қызметті тоқтату не КлаÑÑикалық режимді қолданыÑтан шығару "
+"қажет."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Өзекті (core) жүктеу қатеÑÑ–"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"Deluge КлаÑÑикалық режимде Ð¶Ò±Ð¼Ñ‹Ñ Ñ–Ñтеуіне қажетті өзектің (core) Ò›Ò±Ñ€Ð°Ð¼Ð´Ð°Ñ "
+"бөлігін жүктеу кезінде қате туындады.\n"
+"\n"
+"Көбірек білу үшін, төменірек толық мәліметті қараңыз."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"КлаÑÑикалық режимде ашу кезінде қате туындады. Оны Ñ–Ñтен ажыратып, жұмыÑÑ‚Ñ‹ "
+"жалғаÑтыру қажет пе?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Қызметті Ñ–Ñке қоÑу қатеÑÑ–"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"Қызметті Ñ–Ñке қоÑу кезінде қате туындады. Қатені көру үшін, оны конÑольден "
+"Ñ–Ñке қоÑып көріңіз."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "ҚоÑулы"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Ðжыратылған"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "ШектеуÑіз етіп орнату"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Файлдарды жылжытудың ныÑана бумаÑын таңдаңыз"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Тарату Ñлоттардың макÑимал Ñанын орнату"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr "Жүктемеу"
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr "Жай баÑымдылық"
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr "Жоғары баÑымдылық"
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr "Ең жоғары баÑымдылық"
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "БаÑымдылығы"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Толық ақпарат:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "ÐÑ‚Ñ‹"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Жүктелген"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Таратылған"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Таратушылар (Ñид)"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "ҚатыÑушылар (пир)"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Қалған уақыт"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Рейтинг"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Қол жетімді"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "ҚоÑылған"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr "ОрналаÑу жерін Ñақтау"
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Файл"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "Торрентті қ_ұру"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr "Шығу және қызметті _тоқтату"
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Өзгерту"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "Қо_ÑылыÑтар менеджері"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "Сырт _көрініÑ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "Сай_мандар панелі"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Бүйір панелі"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Күйлер _жолақшаÑÑ‹"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "Баға_налар"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "_Ðөлдік Ñлементтерін көрÑету"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "_Трекерлерді көрÑету"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Көмек"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr "_Үй парағы"
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr "_FAQ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Жиі Қойылатын Сұрақтар (FAQ)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr "_ҚоғамдаÑÑ‚Ñ‹Ò›"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Торрентті өшіру"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Торрентті жою"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Таңдалған торренттерді аÑлдату"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "ÐÑлдату"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Таңдалған торренттерді жалғаÑтыру"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "ЖалғаÑтыру"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Торрентті жоғарыға жылжыту"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Жоғары"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Торрентті төменге жылжыту"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Төмен"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Баптаулар"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "ҚоÑылыÑтар менеджері"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "Барлығын _жаю"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "Жүкт_емеу"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Жай баÑымдылық"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Жоғары баÑымдылық"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "_Ең жоғары баÑымдылық"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Ðвтоматты баÑқарылады:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Рейтинг:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Тарату уақыты:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>БелÑенділік уақыты:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Трекер күйі:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Қол жетімділігі:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>ҚатыÑушылар (пир):</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Таратушылар (Ñид):</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Бөліктер:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Қалған уақыт:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>КелеÑÑ– анонÑ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Рейтинг:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Таратылған көлем:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Жүктеліп алынған көлем:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>ҚоÑылған уақыты:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Күйі"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Сипаттама:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>Файлдар Ñаны:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Хеш:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Трекер:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Жалпы көлемі:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>ÐÑ‚Ñ‹:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>ОрналаÑу жері:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Күйі:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Толық ақпарат"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Файлдар"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "ҚатыÑу_шылар (пир)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "ÐÑқталғандарды оÑÑ‹ жерге жылжыту:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Жеке"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Бірінші мен Ñоңғы бөліктердің баÑымдылығын арттыру"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "Трекерлерді _өзгерту"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "Ба_птаулар"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Торрентті жою қажет пе?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>Белгіленген торрентті жою қажет пе?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>БайланыÑтырылған .torrent файлы де жойылады!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Жүктеліп алынған файлдар жойылады!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Белгіленген торрентті жою"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Жаңа Ò£Ò±Ñқа"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Жаңа нұÑқа жетімді!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Жетімді жаңа нұÑқа:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Ðғымдағы нұÑқа:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Бұл терезені келеÑіде көрÑетпеу"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Веб Ñайтқа өту"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr "ҚатыÑушыны Ò›_оÑу"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "ҚатыÑушыны (пир) оның IP адреÑÑ– бойынша қоÑу"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "Барлығын аÑ_лдату"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Белгіленген торренттерді жалғаÑтыру."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Барлығын _жалғаÑтыру"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Торренттерді қоÑу"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL Ñілтеме"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Хеш ту_ралы ақпарат"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Торренттер</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Файл_дар"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Толық"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Ықшам"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Резервілеу</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Таратудың макÑимал жылдамдығы:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Қалыпты баптауларды қайтару"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Барлығы үшін Ñ–Ñке аÑыру"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "URL Ñілтемені қоÑу"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>URL бойынша</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Мәліметтер хешін қоÑу"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Мәліметтер хешінен</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Мәліметтер хеші:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Трекерлер:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Торрентті құру"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Торрентті құру</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Қашықтаған орналаÑу жері"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Файлдар</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Ðвтор:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Веб-таратушылар (веб-Ñидтер)"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Бөлік көлемі:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Жекешелік жалаушаÑын қою"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Торрентті оÑÑ‹ ÑеанÑқа қоÑу"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Қашықтаған орналаÑу жерін енгізіңіз"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Қашықтаған орналаÑу жері</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "ОрналаÑу жері:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Торрент құрылуда"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ".torrent файлын баÑқашалай Ñақтау"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>.torrent файлын Ñақтау</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Кезектегі торренттер"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Кезекке тұрғызылған торренттерді қоÑу</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "ҚоÑылған кезде торрентерді автоматты түрде қоÑу"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "белгі"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "ҚатыÑушыны (пир) қоÑу"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>ҚатыÑушыны (пир) қоÑу</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "хоÑÑ‚ аты:порт"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "ХоÑÑ‚Ñ‚Ñ‹ қоÑу"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>ҚоÑылыÑтар менеджері</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "Локальды қы_зметін Ñ–Ñке қоÑу"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "ҚоÑылған кезде таңдалған торапқа автоматты қоÑылу"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Қажет болған жағдарларда, жергілікті желіге автоматты түрде қоÑылу"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "ҚоÑылған кезде бұл Ñұхбат терезеÑін көрÑетпеу"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Жүктемелер</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "КелеÑÑ– бумадан .torrent файлдарды автоматты қоÑу:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Жүктемелер Ñақталатын орын:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ".torrent файлдарды оÑÑ‹ жерге көшіру:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr "Жою кезінде торрент файлдың көшірмеÑін жою"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr "Торрент жойылатын кезде құрылған торрент файлдың көшірмеÑін жою."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Бумалар</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Толық резервілеу"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Толық резервілеу, торрентті жүктеуіне қажетті диÑкілік орнын алып қалып, "
+"мәліметтердің бөліктеуіне (фрагментациÑ) жол бермейді"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Ықшам резервілеу торрент үшін орынды керек болған кезде бөледі"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Торренттерді аÑлдатылған күйде қоÑу"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Желі</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "КездейÑоқ порттарды қолдану"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge әрдайым жаңа порт таңдайтын болады."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "БелÑенді порт:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Қайда:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "БелÑенді портты текÑеру"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>ÐšÑ–Ñ€Ñ–Ñ Ð¿Ð¾Ñ€Ñ‚Ñ‚Ð°Ñ€</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Ð¨Ñ‹Ò“Ñ‹Ñ Ð¿Ð¾Ñ€Ñ‚Ñ‚Ð°Ñ€</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"ÐšÑ–Ñ€Ñ–Ñ bittorrent қоÑылыÑтарын тыңдайтын интерфейÑÑ‚Ñ–Ò£ IP адреÑін енгізіңіз. "
+"Қалыпты интерфейÑÑ‚Ñ– қолданамын деÑеңіз, ештеңе енгізбей, өріÑÑ‚Ñ– Ð±Ð¾Ñ ÐµÑ‚Ñ–Ð¿ "
+"қалдырыңыз."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>ИнтерфейÑ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "ҚатыÑушының (пир) TOS байты:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT порттарды қайта бағыттау протоколы"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery желіңізде локалды пирлерді табады."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Таралған хеш-кеÑте (DHT) белÑенді қоÑылыÑтар Ñанын арттыра алады."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Желінің қоÑымша баптаулары</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "КіріÑ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Деңгей:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Мәжбүрленген\n"
+"ҚоÑылған\n"
+"ҚоÑылмаған"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"СинхронизациÑ\n"
+"Бүкіл ағым\n"
+"Екінің біреуі"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "ШығыÑ:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Бүкіл ағымды шифрлеу"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Шифрлеу</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Бір Ñекунд ішіндегі орнатылатын қоÑылыÑтардың макÑимал Ñаны:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Жартылай ашық қоÑылыÑтардың макÑимал Ñаны:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Барлық торренттер үшін макÑималды тарату жылдамдығы. Шектелмеген үшін -1 "
+"енгізңіз."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "МакÑималды тарату жылдамдығы (КиБ/Ñ):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "ҚоÑылыÑтардың макÑимал Ñаны. Шектелмеген үшін -1 енгізңіз."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "ҚоÑылыÑтардың макÑимал Ñаны:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Барлық торренттер үшін тарату Ñлоттардың макÑимал Ñаны. Шектелмеген үшін -1 "
+"енгізңіз."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Тарату Ñлоттардың макÑимал Ñаны:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Барлық торренттер үшін макÑимал жүктеп алу жылдамдығы. Шектелмеген үшін -1 "
+"енгізңіз."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "МакÑималды жүктеп алу жылдамдығы (КиБ/Ñ):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Локалды желі шектеулерін елемеу"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Жылдамдықты IP протоколының ерекшеліктерін еÑкеріп шектеу"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"ҚоÑылған болÑа, жалпы трафик шегінен аÑып кетпеу үшін, TCP/IP ерекшеліктері "
+"жылдамдық шектеушілермен еÑкерілетін болады"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Каналды жалпы қолдану</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"Әрбір торрент үшін тарату Ñлоттардың макÑимал Ñаны. Шектелмеген үшін -1 "
+"енгізңіз."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Әрбір торрент үшін каналды қолдану</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Сыртқы түрі (интерфейÑ)</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "ҚоÑу"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"КлаÑÑикалық түрде Deluge қызметінің барлық мүмкіндіктері Ñ–Ñке аÑырылмай, "
+"Deluge қарапайым бағдарлама ретінде-ақ көрінеді. Deluge қызметінің барлық "
+"артықшылықтарын қолданам деÑеңіз, оÑыны қоÑыңыз. Одан кейін өзгеріÑтерді "
+"Ñ–Ñке аÑыру үшін, Deluge бағдарламаÑын жауып, қайта ашуыңыз қажет."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>КлаÑÑикалық түрі</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Жылдамдықты терезенің Ð±Ð°Ñ Ð±Ó©Ð»Ñ–Ð³Ñ–Ð½Ð´Ðµ көрÑету"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Ð‘Ð°Ñ Ñ‚ÐµÑ€ÐµÐ·Ðµ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Әрқашан көрÑету"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Сұхбат терезеÑін алдына шығару"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Торрент қоÑу Ñұхбат терезеÑÑ–</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Терезе жабылған кезде мәлімдеу аумағына орау"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Бағдарлама ашылған кезде жүйелік трейге орау"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Мәлімдеу аумағын Ò›Ò±Ð¿Ð¸Ñ Ñөзбен қорғау"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Мәлімдеу аумағы</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>БаÑқа</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Жаңартулар</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Сіз, өзіңіздің Python, PyGTK, операциÑлық жүйеніздің нұÑқалары мен процеÑÑор "
+"түрі туралы мәліметтерді бізге жіберу арқылы, Deluge жобаÑына көмек көрÑете "
+"алаÑыз. Одан баÑқа ешбір ақпарат жіберілмейді."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Иә, анонимды ÑтатиÑтиканы жіберіп отыруға Ñ€Ò±Ò›Ñат беремін"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Жүйе туралы ақпарат</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "ОрналаÑуы:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Егер Deluge көрÑетілген жерде мәліметтер қоры файлын таппаÑа, қатыÑушылардың "
+"(пир) елін анықтау үшін DNS қолданылатын болады."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP мәліметтер қоры</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Magnet Ñілтемелерін Deluge-мен байланыÑтыру"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Қызмет</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Қызмет порты:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Порт</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "БаÑқа жерден қоÑылуға Ñ€Ò±Ò›Ñат беру"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>ҚоÑылыÑтар</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Веб Ñайттан жаңа нұÑқалардың пайда болуын текÑеріп отыру"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>БаÑқа</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Кезек</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Жаңа торренттерді кезек баÑына қоÑу"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "БелÑенді таратулар Ñаны:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "БелÑенді торренттердің жалпы Ñаны:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "БелÑенді жүктемелер Ñаны:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "БаÑу торренттерді еÑкермеу"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>БелÑенді торренттер</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Рейтингті шектеу:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Тарату уақытының рейтингі:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Тарату уақыты (мин.):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Таратуды оÑÑ‹ рейтингке жеткенде тоқтату:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Торрентті оÑÑ‹ рейтингке жеткенде жою"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Тарату</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>ПрокÑи</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Жоқ\n"
+"Socks v4\n"
+"Socks v5\n"
+"Socks v5 (авторизациÑмен)\n"
+"HTTP\n"
+"HTTP (авторизациÑмен)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>ҚатыÑушы (пир)</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Веб-таратушы (веб-Ñид)</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Трекер</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>КÑш</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "КÑш көлемі (блок 16 КиБ):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "КÑш өмір Ñүру уақыты (Ñекундпен):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"Ð¡ÐµÐ°Ð½Ñ Ð±Ð°Ñталғалы диÑкіге 16 КиБ көлемді жазылған блоктардың толық Ñаны."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Жазылған блоктар Ñаны:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr "Ð¡ÐµÐ°Ð½Ñ Ð±Ð°Ñталғалы орындалған жазу амалдардың толық Ñаны."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Жазу амалдар Ñаны:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"\"(жазылған блоктар - жазу амалдар) / жазылған блоктар\" формула бойынша "
+"еÑептелінетін Ñан, жазу амалдарының Ñақталынғандардың, толық Ñанына "
+"қатынаÑÑ‹, Ñғни жазу кÑштің тиімділігін көрÑетеді."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "КÑшке Ñ‚Ò¯Ñіп қалу ықтималдылығы (пайызбен):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Жазу</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Bittorrent қозғалтқышы (engine) Ñұраған, диÑктен немеÑе кÑштен оқылған "
+"блоктар Ñаны."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Оқылған блоктар:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "КÑштен оқылған блоктар Ñаны."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "КÑштен оқылған блоктар:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "Оқу кÑштің нәтижелік коÑффициенті."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "КÑштен оқылған блоктар (пайызбен):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr "Ð¡ÐµÐ°Ð½Ñ Ð±Ð°Ñталғалы орындалған оқу амалдардың толық Ñаны."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Оқу амалдары:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Оқу</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"ДиÑкілік кÑштегі 16 КиБ көлемді блоктар Ñаны. Оқу және жазу кÑштерін қамтиды."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "КÑш көлемі:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Оқу кÑш көлемі:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Көлемі</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Күй</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Кеңейтулер</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "ÐÒ±Ñқа:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Үй парағы:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "Кеңейтулерді _іздеу"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "Барлығын _жалғаÑтыру"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_Жүктеп алу жылдамдығын шегі"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_Тарату жылдамдығын шегі"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Шығу және қызметті тоқтату"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Буманы ашу"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Жалғ_аÑтыру"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "_Баптаулар"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Кезек"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Трекерді жаңарту"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "Торрентті _жою"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "М_әліметтерді жылжыту"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Тарату _Ñлоттар Ñанның шегі"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Ðвтоматты баÑқарылады"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Белгіленген торрентті жою қажет пе?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Жүктелінген файлдарды өшіретін болÑаңыз, оны әрқашанға жоғалтаÑыз."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Трекерлерді өзгерту"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Трекерлерді өзгерту</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Трекерді қоÑу"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Трекерлерді қоÑу</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Трекерді өзгерту"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Трекерді өзгерту</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Трекер:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "_Торрентті жою"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Мәліметтерді жылжыту"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Мәліметтерді жылжыту</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Қайда:"
+
+#~ msgid "About"
+#~ msgstr "ОÑÑ‹ туралы"
+
+#~ msgid "Add"
+#~ msgstr "ҚоÑу"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Ðвтожаңарту:"
+
+#~ msgid "Ava"
+#~ msgstr "Жеткізілген"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Торренттерді қоÑу</b></big>"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 7"
+#~ msgstr "7-ші парақ"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 КБ\n"
+#~ "64 КБ\n"
+#~ "128 КБ\n"
+#~ "256 КБ\n"
+#~ "512 КБ"
+
+#~ msgid "_Quit"
+#~ msgstr "_Шығу"
+
+#~ msgid "page 8"
+#~ msgstr "8-ші парақ"
+
+#~ msgid "page 11"
+#~ msgstr "11-ші парақ"
+
+#~ msgid "Homepage"
+#~ msgstr "Үй парағы"
+
+#~ msgid "page 12"
+#~ msgstr "12-ші парақ"
+
+#~ msgid "page 10"
+#~ msgstr "10-шы парақ"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Парақты келеÑÑ– уақыт Ñайын жаңарту:"
+
+#~ msgid "Graphs"
+#~ msgstr "Графиктер"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Таратушылар/Жалпы қатыÑушылар"
+
+#~ msgid "Test config value:"
+#~ msgstr "Баптауларды текÑеру:"
+
+#~ msgid "All Finished!"
+#~ msgstr "ÐÑқталды!"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Deluge баптау шебері"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr "Бұл шебер Deluge баптауға көмектеÑеді"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "тарату_Ñлоттардың_макÑимал_Ñаны"
+
+#~ msgid "max_connections"
+#~ msgstr "байланыÑтардың_макÑимал_Ñаны"
+
+#~ msgid "apply_max"
+#~ msgstr "макÑималды қолдану"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Белгінің опциÑларын баптау қатеÑÑ–"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "таратудың_макÑимал_жылдамдығы"
+
+#~ msgid "max_download_speed"
+#~ msgstr "жүктеп алудың макÑимал жылдамдығы"
+
+#~ msgid "stop_ratio"
+#~ msgstr "рейтингті тоқтату"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "рейтинг_мәні_оÑыған_жеткенде,_тоқтату"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "автоматты_түрде_баÑқарылады"
+
+#~ msgid "apply_queue"
+#~ msgstr "кезекті_қолдану"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "трекерлерді_автоматты_қоÑу"
+
+#~ msgid "auto_add"
+#~ msgstr "автоматты_қоÑу"
+
+#~ msgid "move_completed_path"
+#~ msgstr "аÑқталғандарды_келеÑÑ– жерге_ауыÑтыру"
+
+#~ msgid "move_completed"
+#~ msgstr "аÑқталғанды_ауыÑтыру"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "аÑқталғандарды_ауыÑтыруды_қолдану"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "рейтинг_мәні_оÑыған_жеткенде,_тоқтату"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Өңделуде..."
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Импортталды %s"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Жүктеп алу %.2f%%"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Жүктеп алу талаптар Ñаны"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Қызмет қоÑылған кезде импорттау"
+
+#~ msgid "BlockList"
+#~ msgstr "Оқшауланғандардың тізімі"
+
+#~ msgid "Import Now"
+#~ msgstr "Қазір импорттау"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Күту уақыты (Ñек)"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "КелеÑÑ– күн(дер) Ñаны Ñайын текÑеру"
+
+#~ msgid "Force Download"
+#~ msgstr "Мәжбүрлі түрде жүктеп алу"
+
+#~ msgid "Test config value"
+#~ msgstr "Мәнді текÑеру"
+
+#~ msgid "Stats"
+#~ msgstr "СтатиÑтика"
+
+#~ msgid "Refresh status"
+#~ msgstr "Күйін жаңарту"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Оқшауланғандар: %s"
+
+#~ msgid "Inactive"
+#~ msgstr "БелÑенді емеÑтер"
+
+#~ msgid "Graph"
+#~ msgstr "График"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge оқшауланды"
+
+#~ msgid "Other.."
+#~ msgstr "БаÑқа..."
+
+#~ msgid "State"
+#~ msgstr "Күйі"
+
+#~ msgid "no label"
+#~ msgstr "белгі жоқ"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Торрент тоқтау коÑффициентіне жетті."
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Config"
+#~ msgstr "Баптаулар"
+
+#~ msgid "These changes were saved"
+#~ msgstr "ӨзгеріÑтер Ñақталды"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Қателерді түзеп, қайталап көріңіз"
+
+#~ msgid "Logout"
+#~ msgstr "Жүйеден шығу"
+
+#~ msgid "Statistics"
+#~ msgstr "СтатиÑтикаÑÑ‹"
+
+#~ msgid "Details"
+#~ msgstr "Көбірек білу"
+
+#~ msgid "Delete"
+#~ msgstr "Өшіру"
+
+#~ msgid "Stop"
+#~ msgstr "Тоқтату"
+
+#~ msgid "Start"
+#~ msgstr "БаÑтау"
+
+#~ msgid "Files"
+#~ msgstr "Файлдар"
+
+#~ msgid "Connect"
+#~ msgstr "Ð‘Ð°Ð¹Ð»Ð°Ð½Ñ‹Ñ Ò›Ò±Ñ€Ñƒ"
+
+#~ msgid "Ports"
+#~ msgstr "Порттар"
+
+#~ msgid "To"
+#~ msgstr "Қайда"
+
+#~ msgid "Extra's"
+#~ msgstr "ҚоÑымша"
+
+#~ msgid "From"
+#~ msgstr "Қайдан"
+
+#~ msgid "Move"
+#~ msgstr "Жылжыту"
+
+#~ msgid "Recheck"
+#~ msgstr "ТекÑеріп шығу"
+
+#~ msgid "Random"
+#~ msgstr "КездейÑоқ"
+
+#~ msgid "Queue Top"
+#~ msgstr "Кещек баÑÑ‹"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Кезек Ñоңы"
+
+#~ msgid "Reannounce"
+#~ msgstr "ÐнонÑÑ‚Ñ‹ қайталау"
+
+#~ msgid "Disabled"
+#~ msgstr "Сөндірілген"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Пирлармен ауыÑу"
+
+#~ msgid "Encryption"
+#~ msgstr "Шифрлеу"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Inbound"
+#~ msgstr "КіріÑ"
+
+#~ msgid "Either"
+#~ msgstr "Екеуі де"
+
+#~ msgid "Outbound"
+#~ msgstr "ШығыÑ"
+
+#~ msgid "Forced"
+#~ msgstr "Мәжбүрленген"
+
+#~ msgid "Handshake"
+#~ msgstr "БайланыÑÑ‚Ñ‹ орнату"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Ðегізгі DHT"
+
+#~ msgid "Type"
+#~ msgstr "Түрі"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "Level"
+#~ msgstr "Деңгейі"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "Port"
+#~ msgstr "Порты"
+
+#~ msgid "Username"
+#~ msgstr "Пайдаланушы аты"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Жартылай ашық байланыÑтар макÑимумы"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Жүктеп алу жылдамдық макÑимумы (Кб/Ñ)"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Секундына Ð±Ð°Ð¹Ð»Ð°Ð½Ñ‹Ñ Ð¾Ñ€Ð½Ð°Ñ‚Ñƒ талап Ñаны макÑимумы"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Тарату жылдамдық макÑимумы (Кб/Ñ)"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Шектелмеген"
+
+#~ msgid "Global"
+#~ msgstr "Жалпы"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Тарату Ñлоттар макÑимумы"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Ð‘Ð°Ð¹Ð»Ð°Ð½Ñ‹Ñ Ñаны макÑимумы"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr ".torrent файлдарын келеÑÑ– жерге Ñақтау"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "КелеÑÑ– бума ішінен торренттерді автоматты түрде қоÑу"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Бір торрент үшін"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Барлық жүктемелерді келеÑÑ– жерде Ñақтау"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Ðвтоматты қоÑуға Ñ€Ò±Ò›Ñат беру"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "IP хаттамаÑының ерекшеліктерін еÑкеріп, жылдамдықты шектеу"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = шектеуÑіз"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Бірінші мен Ñоңғы бөліктердің баÑымдылығы үлкен"
+
+#~ msgid "Download"
+#~ msgstr "Жүктеп алу"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr ""
+#~ "Бұл баптауларды өзгерткен Ñоң бағдарламаны мен веб-интерфейÑÑ‚Ñ– қайта қоÑыңыз"
+
+#~ msgid "Total active torrents"
+#~ msgstr "БелÑенді торренттер жалпы Ñаны"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Рейтинг келеÑÑ– мәнге жеткен кезде, торрентті өшіру"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Рейтинг келеÑÑ– мәнге жеткен кезде, таратуды тоқтату"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Таратулардың жалпы Ñаны"
+
+#~ msgid "Total active downloading"
+#~ msgstr "БелÑенді жүктемелердің жалпы Ñаны"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr "ТиіÑÑ‚Ñ– таңдау жаÑаңыз. Бұл нұÑқа қол жетерÑіз."
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "ҚоÑулы плагиндер"
+
+#~ msgid "translate something"
+#~ msgstr "бірнәрÑені аударыңыз"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Бұл бума жоқ."
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Мәндер тізімін енгізіңіз."
+
+#~ msgid "Yes"
+#~ msgstr "Иә"
+
+#~ msgid "No"
+#~ msgstr "Жоқ"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Таңбалардың жалпы Ñаны %(max)d аÑпағанына көз жеткізіңіз (қазір %(length)d)."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Таңбалардың жалпы Ñаны %(min)d кем ÐµÐ¼ÐµÑ ÐµÐºÐµÐ½Ñ–Ð½Ðµ көз жеткізіңіз (қазір "
+#~ "%(length)d)."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Ð”Ò±Ñ€Ñ‹Ñ Ð¼Ó™Ð½Ð´Ñ– енгізіңіз."
+
+#~ msgid "This field is required."
+#~ msgstr "Бұл жол тиіÑÑ‚Ñ–."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "ТиіÑÑ‚Ñ– таңдау жаÑаңыз. %s нұÑқаÑÑ‹ Ð´Ò±Ñ€Ñ‹Ñ ÐµÐ¼ÐµÑ."
+
+#~ msgid "Unknown"
+#~ msgstr "БелгіÑіз"
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Санды толығымен енгізіңіз."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Енгізілген мән %s мәнінен кіші не тең екеніне көз жеткізіңіз."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Ð”Ò±Ñ€Ñ‹Ñ e-mail енгізіңіз."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "Файл таңдалмады. Формадағы кодталуды текÑеріңіз."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Енгізілген мән %s мәнінен үлкен не тең екеніне көз жеткізіңіз."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Ð”Ò±Ñ€Ñ‹Ñ ÑƒÐ°Ò›Ñ‹Ñ‚Ñ‚Ñ‹ енгізіңіз."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Ð”Ò±Ñ€Ñ‹Ñ ÐºÒ¯Ð½Ð´Ñ–/уақытты енгізіңіз."
+
+#~ msgid "Enter a number."
+#~ msgstr "Сан енгізіңіз."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Ð”Ò±Ñ€Ñ‹Ñ ÐºÒ¯Ð½Ð´Ñ– енгізіңіз."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Сан ұзындығы %s мәнінен көп ÐµÐ¼ÐµÑ ÐµÐºÐµÐ½Ñ–Ð½Ðµ көз жеткізіңіз."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Ð”Ò±Ñ€Ñ‹Ñ URL енгізіңіз."
+
+#~ msgid "no uri"
+#~ msgstr "URI жоқ"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "аралық > 0 болуы тиіÑ"
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr "Ð”Ò±Ñ€Ñ‹Ñ Ñ‚Ð°Ò£Ð´Ð°Ñƒ жаÑаңыз. %(value)s Ð´Ò±Ñ€Ñ‹Ñ ÐµÐ¼ÐµÑ Ð±Ð¾Ð»Ñ‹Ð¿ тұр."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Ð”Ò±Ñ€Ñ‹Ñ Ñурет файлын жүктеңіз. Сіз жүктеген файл зақымдалған, немеÑе Ñурет "
+#~ "ÐµÐ¼ÐµÑ Ð±Ð¾Ð»Ñ‹Ð¿ тұр."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Таңдалған файл боÑ."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Файл таңдалмады."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Ð”Ò±Ñ€Ñ‹Ñ IPv4 адреÑін енгізіңіз."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Бұл URL қате."
+
+#~ msgid "Move To"
+#~ msgstr "Қайда жылжыту керек"
+
+#~ msgid "Template"
+#~ msgstr "Үлгі"
+
+#~ msgid "Text Only"
+#~ msgstr "Тек мәтін"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "ӨзгеріÑтер Ñ–Ñке аÑу үшін веб-интерфейÑÑ‚Ñ– қайта қоÑыңыз."
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Ðвтожаңарту (Ñек)"
+
+#~ msgid "Button style"
+#~ msgstr "Батырмалар Ñтилі"
+
+#~ msgid "Image Only"
+#~ msgstr "Тек Ñуреттер"
+
+#~ msgid "Text and image"
+#~ msgstr "Мәтін мен Ñуреттер"
+
+#~ msgid "Error in Path."
+#~ msgstr "Жол табылмады."
+
+#~ msgid "Cache templates"
+#~ msgstr "Үлгілерді кÑштеу"
+
+#~ msgid "Server"
+#~ msgstr "Сервері"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Кілт '%s' ішінен табылмады"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Сертификат '%s' ішінен табылмады"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Sidebar"
+#~ msgstr "Бүйір панелі"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Бүйір панелді көрÑету"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Торрент баптаулары қате."
+
+#~ msgid "Show trackers"
+#~ msgstr "Трекерлерді көрÑету"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Іздеуді көрÑету"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Рейтинг келеÑÑ– мәнге жеткен кезде, таратуды тоқтату"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "МакÑимал тарату жылдамдығы"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "МакÑимал жүктеп алу жылдамдығы"
+
+#~ msgid "Download Location"
+#~ msgstr "Жүктелу орны"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "ÐÑлданған түрде қоÑу"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Ðөлдік Ñлементтерді көрÑету"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Файлдардың ықшам аллокациÑÑÑ‹"
+
+#~ msgid "No data"
+#~ msgstr "Деректер жоқ"
+
+#~ msgid "Active time"
+#~ msgstr "Ð–Ò±Ð¼Ñ‹Ñ ÑƒÐ°Ò›Ñ‹Ñ‚Ñ‹"
+
+#~ msgid "Admin"
+#~ msgstr "ÐдминиÑтратор"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Торрентті тарату"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... және Барлық файлдарды өшіру"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "URL немеÑе торрент, екеуден біреуін таңдаңыз."
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... және барлық Жүктелген файлдарды өшіру"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... және Torrent файлды өшіру"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Қызметке қоÑылу"
+
+#~ msgid "Clear"
+#~ msgstr "Тазарту"
+
+#~ msgid "Connected to"
+#~ msgstr "КелеÑіге қоÑылған"
+
+#~ msgid "Availability"
+#~ msgstr "Қол жетерлік"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "Жүктеп алу жылдамдық шегі"
+
+#~ msgid "Cancel"
+#~ msgstr "Ð‘Ð°Ñ Ñ‚Ð°Ñ€Ñ‚Ñƒ"
+
+#~ msgid "Connection Limit"
+#~ msgstr "БайланыÑтар шегі"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : торренттер тізімі"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge ішіне кіру"
+
+#~ msgid "False"
+#~ msgstr "Жалған"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Жүктелген файлдарды өшіру."
+
+#~ msgid "Disk Space"
+#~ msgstr "ДиÑкідегі орын"
+
+#~ msgid "Do not download"
+#~ msgstr "Жүктемеу"
+
+#~ msgid "Disable"
+#~ msgstr "Сөндіру"
+
+#~ msgid "Eta"
+#~ msgstr "Қалған"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr ".torrent файлды өшіру"
+
+#~ msgid "High priority"
+#~ msgstr "БаÑымдылығы жоғары"
+
+#~ msgid "Label torrent"
+#~ msgstr "Торрент белгіÑÑ–"
+
+#~ msgid "General"
+#~ msgstr "Жалпы"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Кілттік Ñөз бойынша фильтрлеу"
+
+#~ msgid "Keyword"
+#~ msgstr "Кілттік Ñөз"
+
+#~ msgid "Highest priority"
+#~ msgstr "БаÑымдылығы ең үлкен"
+
+#~ msgid "From Session"
+#~ msgstr "СеÑÑиÑдан"
+
+#~ msgid "Force Recheck"
+#~ msgstr "ТекÑеріп шығу"
+
+#~ msgid "From Url"
+#~ msgstr "Сілтемеден"
+
+#~ msgid "File"
+#~ msgstr "Файл"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "ÐšÑ–Ñ€Ñ–Ñ Ð±Ð°Ð¹Ð»Ð°Ð½Ñ‹Ñтар жоқ"
+
+#~ msgid "Normal priority"
+#~ msgstr "БаÑымдылығы кәдімгі"
+
+#~ msgid "Move torrent"
+#~ msgstr "Торрентті жылжыту"
+
+#~ msgid "Ok"
+#~ msgstr "ОК"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Қызметке қоÑылмаған"
+
+#~ msgid "Next Announce"
+#~ msgstr "КелеÑÑ– анонÑ"
+
+#~ msgid "Login"
+#~ msgstr "Кіру"
+
+#~ msgid "Seed rank"
+#~ msgstr "Тарату коÑффициенті"
+
+#~ msgid "Restart"
+#~ msgstr "Қайта баÑтау"
+
+#~ msgid "Remove"
+#~ msgstr "Өшіру"
+
+#~ msgid "Pieces"
+#~ msgstr "Бөліктер"
+
+#~ msgid "Resume all"
+#~ msgstr "Барлығын жалғаÑтыру"
+
+#~ msgid "Queue Position"
+#~ msgstr "Кезектегі орны"
+
+#~ msgid "Save"
+#~ msgstr "Сақтау"
+
+#~ msgid "Search"
+#~ msgstr "Іздеу"
+
+#~ msgid "Seeding time"
+#~ msgstr "Жалпы тарату уақыты"
+
+#~ msgid "Set"
+#~ msgstr "Орнату"
+
+#~ msgid "Submit"
+#~ msgstr "Жіберу"
+
+#~ msgid "Total Size"
+#~ msgstr "Жалпы көлемі"
+
+#~ msgid "Torrent list"
+#~ msgstr "Торренттер тізімі"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Таймаут орнату"
+
+#~ msgid "Select All"
+#~ msgstr "Барлығын таңдау"
+
+#~ msgid "Speed"
+#~ msgstr "Жылдамдығы"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Рейтинг"
+
+#~ msgid "True"
+#~ msgstr "Ðқиқат"
+
+#~ msgid "Update"
+#~ msgstr "Жаңарту"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Тарату Ñлоттар шегі"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Трекерді жаңарту"
+
+#~ msgid "Upload"
+#~ msgstr "Тарату"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "Тарату жылдамдық шегі"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Трекер күйі"
+
+#~ msgid "seconds"
+#~ msgstr "Ñекунд"
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr ""
+#~ "Енгізілген Ñан ішінде үтірге дейінгі Ñандар Ñаны %s мәнінен үлкен ÐµÐ¼ÐµÑ "
+#~ "екеніне көз жеткізіңіз."
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Бұл хатта Deluge Ñізге %s жүктелу үрдіÑÑ–, оның құрамында %i файлы бар, "
+#~ "аÑқталғанын хабарлайды.\n"
+#~ "ОÑындай хабарламаларды келеÑіде алмау үшін, Deluge баптауларында email "
+#~ "арқылы хабарлау мүмкіндігін өшіріңіз.\n"
+#~ "\n"
+#~ "Құрметпен,\n"
+#~ "Deluge"
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr ""
+#~ "Енгізілген Ñан ішінде ондықтар Ñаны %s мәнінен үлкен ÐµÐ¼ÐµÑ ÐµÐºÐµÐ½Ñ–Ð½Ðµ көз "
+#~ "жеткізіңіз."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "Бұл бағдарлама — еркін бағдарламалық қамтама; Ñіз оны GNU Әмбебап Қоғамдық "
+#~ "ЛицензиÑÑының 3-ші не одан кейінгі кез-келген нұÑқаÑÑ‹ негізінде тарата "
+#~ "не/және өзгерте алаÑыз. Бұл бағдарлама біреуге пайдалы болады деп Ñенімімен "
+#~ "таратылады, бірақта ЕШҚÐÐДÐЙ КЕПІЛДЕМЕ БЕРІЛМЕЙДІ, КОММЕРЦИЯЛЫҚ ÒšÒ°ÐДЫЛЫҚ "
+#~ "ЖӘÐЕ ÐÐҚТЫ ÐœÐҚСÐТЫ ҮШІРЖÐРÐМДЫЛЫҒЫРҚОСÐ. Көбірек білу үшін GNU Әмбебап "
+#~ "Қоғамдық ЛицензиÑÑын қараңыз. Сіз оÑÑ‹ бағдарламамен бірге GNU Әмбебап "
+#~ "Қоғамдық ЛицензиÑÑын алуыңыз керек еді, олай болмаÑа, оның мәтінін "
+#~ "<http://www.gnu.org/licenses> адреÑінен таба алаÑыз."
+
+#~ msgid "Pause all"
+#~ msgstr "Барлығын аÑлдату"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge Ò›Ò±Ð¿Ð¸Ñ Ñөзбен қорғалынған!</big></b>"
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "СәтÑіз жүктеу : %s"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>ЖалғаÑтыру үшін Ò›Ò±Ð¿Ð¸Ñ Ñөзді енгізіңіз</i>"
+
+#~ msgid "Downloading.."
+#~ msgstr "Жүктелінуде..."
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s жарамÑыз URL."
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "ҚоÑылмаған.."
+
+#~ msgid "Filters"
+#~ msgstr "Сүзгілер"
+
+#~ msgid "Community"
+#~ msgstr "ҚоғамдаÑÑ‚Ñ‹Ò›"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "ÒšÒ±Ð¿Ð¸Ñ Ñөз қате, қайталап көріңіз"
+
+#~ msgid "Password"
+#~ msgstr "ÒšÒ±Ð¿Ð¸Ñ Ñөз"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge Ò›Ò±Ð¿Ð¸Ñ Ñөзбен қорғалған.\n"
+#~ "Ð‘Ð°Ñ Ñ‚ÐµÑ€ÐµÐ·ÐµÑін ашу үшін, Ò›Ò±Ð¿Ð¸Ñ Ñөзді енгізіңіз"
+
+#~ msgid "New Password"
+#~ msgstr "Жаңа Ò›Ò±Ð¿Ð¸Ñ Ñөз"
+
+#~ msgid "Current Password"
+#~ msgstr "Ðғымдағы Ò›Ò±Ð¿Ð¸Ñ Ñөз"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "ЕÑкі Ò›Ò±Ð¿Ð¸Ñ Ñөз қате енгізілді"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Жаңа Ò›Ò±Ð¿Ð¸Ñ Ñөз (ТекÑеру үшін)"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Жаңа Ò›Ò±Ð¿Ð¸Ñ Ñөз мен текÑеру Ò›Ò±Ð¿Ð¸Ñ Ñөз өзара ÑÓ™Ð¹ÐºÐµÑ ÐºÐµÐ»Ð¼ÐµÐ¹Ð´Ñ–"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "бұл әзірше ешнәрÑе Ñ–Ñтеп тұрған жоқ..\n"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Құрамында %i файл бар"
+
+#~ msgid "FAQ"
+#~ msgstr "Жиі Қойылатын Сұрақтар (FAQ)"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Жылдамдық:</b>"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "page 6"
+#~ msgstr "6-шы парақ"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB\n"
+#~ "1 MiB\n"
+#~ "2 MiB\n"
+#~ "4 MiB\n"
+#~ "8 MiB\n"
+#~ msgstr ""
+#~ "32 КиБ\n"
+#~ "64 КиБ\n"
+#~ "128 КиБ\n"
+#~ "256 КиБ\n"
+#~ "512 КиБ\n"
+#~ "1 МиБ\n"
+#~ "2 МиБ\n"
+#~ "4 МиБ\n"
+#~ "8 МиБ\n"
diff --git a/deluge/i18n/kn.po b/deluge/i18n/kn.po
new file mode 100644
index 0000000..272ad0f
--- /dev/null
+++ b/deluge/i18n/kn.po
@@ -0,0 +1,3922 @@
+# Kannada translation for deluge
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2009-12-11 11:47+0000\n"
+"Last-Translator: ಸà³à²­à²¾à²¸à³ ಭಟà³(Subhas Bhat) <Unknown>\n"
+"Language-Team: Kannada <kn@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "ಕಿಲೋಬೈಟà³à²¸à³/ಸೆಕೆಂಡà³"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "ಸಕà³à²°à²¿à²¯à²—ೊಳಿಸಲಾಗಿದೆ"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "ಗರಿಷà³à²Ÿ ಸಂಪರà³à²•à²—ಳà³:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "ನಿಲà³à²²à²¿à²¸à³à²µ ವೇಗದ ಅನà³à²ªà²¾à²¤:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "ತೆಗೆದà³à²¹à²¾à²•à²²à³ ಅನà³à²ªà²¾à²¤:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "ಆದà³à²¯à²¤à³†à²—ಳà³"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "ಶೀರà³à²·à²¿à²•à³†"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "ಹೆಸರಿನ ಆಯà³à²•à³†à²—ಳà³"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>ಹೆಸರಿನ ಆಯà³à²•à³†à²—ಳà³</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "ಅಪà³â€Œà²²à³‹à²¡à²¿à²¨ ವೇಗ:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "ಡೌನà³â€Œà²²à³‹à²¡à²¿à²¨ ವೇಗ:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "ಸಂಪರà³à²•à²—ಳà³:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "ಸà³à²µà²¯à²‚ನಿರà³à²µà²¹à²¿à²¤"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "ಸರದಿ"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "ಪೂರà³à²£à²—ೊಂಡವà³à²—ಳನà³à²¨à³ ಸà³à²¥à²³à²¾à²‚ತರಿಸಲೠಸà³à²¥à²³:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "ಹೆಸರà³à²—ಳನà³à²¨à³ ಸà³à²µà²¯à²‚ಚಾಲಿತವಾಗಿ"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "ಟà³à²¯à³à²°à²¾à²•à²°à³à²¸à³"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "‌ಹೆಸರನà³à²¨à³ ಸೇರಿಸà³"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>ಹೆಸರನà³à²¨à³ ಸೇರಿಸà³</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>ಹೆಸರà³à²—ಳà³</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>ಸಾಮಾನà³à²¯</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "ಜಾಲವಿಳಾಸ:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "ಹೊಸ ಪಟà³à²Ÿà²¿à²—ಾಗಿ ಪà³à²°à²¤à²¿:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "ವಿಧ:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>ವಿವರಣೆ</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "ಪà³à²°à²•à²Ÿà²£à³† ಸರಿಯಾಗಿದೆ"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "ಪà³à²°à²•à²Ÿà²£à³† ಕಳà³à²¹à²¿à²¸à²²à²¾à²—ಿದೆ"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "ಎಚà³à²šà²°à²¿à²•à³†"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "ದೋಷ"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "ವಿಳಾಸ"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "ಕಕà³à²·à²¿"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "ಪà³à²°à²—ತಿ"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "ಡೌನà³à²²à³‹à²¡à³ ವೇಗ"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "ಅಪà³à²²à³‹à²¡à³ ವೇಗ"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "ಅಪà³à²²à³‹à²¡à³"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "ಇತರೆ"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "ಗಾತà³à²°"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "ಸಂಪರà³à²•"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "ಹೆಸರà³"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "ಡೌನà³à²²à³‹à²¡à³ ಮಾಡಲಾಗಿದೆ"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "ಅಪà³à²²à³‹à²¡à³ ಮಾಡಲಾಗಿದೆ"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ಬೇಕಾಗà³à²µ ಸಮಯ"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "ಅನà³à²ªà²¾à²¤"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "ಟೊರೆಂಟೠಸೇರಿಸà³"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "ಟೊರೆಂಟೠಅನà³à²¨à³ ತೆಗೆದà³à²¹à²¾à²•à³"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "ತಾತà³à²•à²¾à²²à²¿à²•à²µà²¾à²—ಿ ನಿಲà³à²²à²¿à²¸à³"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "ಪà³à²¨à²°à²¾à²°à²‚ಭಿಸà³"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "ಡೌನà³à²²à³‹à²¡à³ ಸರದಿ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "ಖಾಸಗಿ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "ಟಾರೆಂಟನà³à²¨à³ ಸೇರಿಸà³"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "ಯà³à²†à²°à³à²Žà²²à³(_U)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>ಟೊರೆಂಟà³à²¸</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "ಸಂಪೂರà³à²£"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "ಎಲà³à²²à²¦à²•à³à²•à³‚ ಅನà³à²µà²¯à²¿à²¸à²¿"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "ಯà³à²†à²°à³à²Žà²²à³ ಸೇರಿಸà³"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>ಯà³à²†à²°à³à²Žà²²à³ ನಿಂದ</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "ಖಾಸಗಿಯಾಗಿ ವರà³à²—ೀಕರಿಸà³"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "ಸಕà³à²°à²¿à²¯à²—ೊಳಿಸà³"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "ಆಯà³à²•à³†à²—ಳà³(_i)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "# Of Files"
+#~ msgstr "# ಕಡತಗಳà³"
+
+#~ msgid "About"
+#~ msgstr "ಕà³à²°à²¿à²¤à³"
+
+#~ msgid "Add"
+#~ msgstr "ಸೇರಿಸà³"
+
+#~ msgid "Availability"
+#~ msgstr "ಲಭà³à²¯à²¤à³†"
+
+#~ msgid "Details"
+#~ msgstr "ವಿವರಗಳà³"
+
+#~ msgid "Disable"
+#~ msgstr "ನಿಷà³à²•à³à²°à²¿à²¯à²—ೊಳಿಸà³"
+
+#~ msgid "Download"
+#~ msgstr "ಡೌನà³à²²à³‹à²¡à³"
+
+#~ msgid "Eta"
+#~ msgstr "ಬೇಕಾಗà³à²µ ಸಮಯ"
+
+#~ msgid "File"
+#~ msgstr "ಕಡತ"
+
+#~ msgid "General"
+#~ msgstr "ಸಾಮಾನà³à²¯"
+
+#~ msgid "Login"
+#~ msgstr "ಪà³à²°à²µà³‡à²¶à²¿à²¸à³"
+
+#~ msgid "Logout"
+#~ msgstr "ನಿರà³à²—ಮಿಸà³"
+
+#~ msgid "Password"
+#~ msgstr "ಗà³à²ªà³à²¤à²ªà²¦"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "ತಪà³à²ªà³ ಗà³à²ªà³à²¤à²ªà²¦, ಪà³à²¨à²ƒ ಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¿"
+
+#~ msgid "Pause all"
+#~ msgstr "ಎಲà³à²²à²µà²¨à³à²¨à³ ತಾತà³à²•à²¾à²²à²¿à²•à²µà²¾à²—ಿ ನಿಲà³à²²à²¿à²¸à³"
+
+#~ msgid "Pieces"
+#~ msgstr "ವಿಭಾಗ"
+
+#~ msgid "Queue Position"
+#~ msgstr "ಸರದಿಯ ಸà³à²¥à²¿à²¤à²¿"
+
+#~ msgid "Reannounce"
+#~ msgstr "ಮರà³à²ªà³à²°à²•à²Ÿà²£à³†"
+
+#~ msgid "Remove"
+#~ msgstr "ತೆಗೆದà³à²¹à²¾à²•à³"
+
+#~ msgid "Resume all"
+#~ msgstr "ಎಲà³à²²à²µà²¨à³à²¨à³ ಪà³à²¨à²°à²¾à²°à²‚ಭಿಸà³"
+
+#~ msgid "Save"
+#~ msgstr "ಉಳಿಸà³"
+
+#~ msgid "Speed"
+#~ msgstr "ವೇಗ"
+
+#~ msgid "Start"
+#~ msgstr "ಆರಂಭಿಸà³"
+
+#~ msgid "Submit"
+#~ msgstr "ಸಲà³à²²à²¿à²¸à³"
+
+#~ msgid "Torrent list"
+#~ msgstr "ಟೊರೆಂಟೠಪಟà³à²Ÿà²¿"
+
+#~ msgid "Total Size"
+#~ msgstr "ಒಟà³à²Ÿà³ ಗಾತà³à²°"
+
+#~ msgid "Upload"
+#~ msgstr "ಅಪà³à²²à³‹à²¡à³"
+
+#~ msgid "Upload torrent"
+#~ msgstr "ಅಪà³à²²à³‹à²¡à³ ಟೊರೆಂಟà³"
+
+#~ msgid "seconds"
+#~ msgstr "ಸೆಕೆಂಡà³à²—ಳà³"
+
+#~ msgid "Download Location"
+#~ msgstr "ಡೌನà³à²²à³‹à²¡à³ ಮಾಡಬೇಕಾದ ಸà³à²¥à²³"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "ಗರಿಷà³à²  ಡೌನà³à²²à³‹à²¡à³ ವೇಗ"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "ಗರಿಷà³à²  ಅಪà³à²²à³‹à²¡à³ ವೇಗ"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "ಗರಿಷà³à²  ಸಂಪರà³à²•à²—ಳà³"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "ಗರಿಷà³à²  ಅಪà³à²²à³‹à²¡à³ ವಿಭಾಗಗಳà³"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "ಮೊದಲ ಹಾಗೠಕೊನೆಯ ಭಾಗಗಳಿಗೆ ಆಧà³à²¯à²¤à³† ಕೊಡà³"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "ತಾತà³à²•à²¾à²²à²¿à²•à²µà²¾à²—ಿ ನಿಲà³à²²à²¿à²¸à²¿à²¦ ಸà³à²¥à²¿à²¤à²¿à²¯à²²à³à²²à²¿ ಸೇರಿಸà³"
+
+#~ msgid "No data"
+#~ msgstr "ಯಾವà³à²¦à³† ದತà³à²¤à²¾à²‚ಶ ಇಲà³à²²"
+
+#~ msgid "From"
+#~ msgstr "ಇಲà³à²²à²¿à²‚ದ"
+
+#~ msgid "To"
+#~ msgstr "ಇಲà³à²²à²¿à²—ೆ"
+
+#~ msgid "Forced"
+#~ msgstr "ಬಲವಂತವಾಗಿ"
+
+#~ msgid "Disabled"
+#~ msgstr "ನಿಷà³à²•à³à²°à²¿à²¯à²—ೊಳಿಸಲಾಗಿದೆ"
+
+#~ msgid "Handshake"
+#~ msgstr "ಹಸà³à²¤à²²à²¾à²˜à²µ"
+
+#~ msgid "Either"
+#~ msgstr "ಇವೆರಡರಲà³à²²à²¿ ಒಂದà³"
+
+#~ msgid "Inbound"
+#~ msgstr "ಒಳಬರà³à²µ"
+
+#~ msgid "Outbound"
+#~ msgstr "ಹೊರಹೋಗà³à²µ"
+
+#~ msgid "Level"
+#~ msgstr "ಮಟà³à²Ÿ"
+
+#~ msgid "Global"
+#~ msgstr "ಜಾಗತಿಕ"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "ಗರಿಷà³à²  ಡೌನà³à²²à³‹à²¡à³ ವೇಗ (Kib/s)"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "ಗರಿಷà³à²  ಅಪà³à²²à³‹à²¡à³ ವೇಗ (Kib/s)"
+
+#~ msgid "Active time"
+#~ msgstr "ಸಕà³à²°à²¿à²¯ ಸಮಯ"
+
+#~ msgid "Admin"
+#~ msgstr "ಕಾರà³à²¯à²¨à²¿à²°à³à²µà²¾à²¹à²•"
+
+#~ msgid "Clear"
+#~ msgstr "ತೆರವà³à²—ೊಳಿಸà³"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr ".torrent ಕಡತಗಳನà³à²¨à³ ಅಳಿಸà³"
+
+#~ msgid "Connect"
+#~ msgstr "ಸೇರಿಕೊ"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "ಡೆಲà³à²¯à³à²²à³‚ಜೠ: ಟೊರೆಂಟೠಪಟà³à²Ÿà²¿"
+
+#~ msgid "Connected to"
+#~ msgstr "ಇದಕà³à²•à³† ಸೇರಿಕೊಂಡಿದೆ"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "ಡೌನà³à²²à³‹à²¡à³ ಮಾಡಿದ ಕಡತಗಳನà³à²¨à³ ಅಳಿಸà³"
+
+#~ msgid "Deluge Login"
+#~ msgstr "ಡೆಲà³à²¯à³à²²à³‚ಜೠಪà³à²°à²µà³‡à²¶à²¿à²¸à³"
+
+#~ msgid "False"
+#~ msgstr "ತಪà³à²ªà³"
+
+#~ msgid "Keyword"
+#~ msgstr "ಸೂಚà³à²¯ ಪದ"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "ಸೂಚà³à²¯ ಪದದ ಆಧಾರದ ಮೇಲೆ ಶೋಧಿಸà³"
+
+#~ msgid "Label torrent"
+#~ msgstr "ಟೊರೆಂಟೠಶೀರà³à²·à²¿à²•à³†"
+
+#~ msgid "Move"
+#~ msgstr "ವರà³à²—ಾಯಿಸà³"
+
+#~ msgid "Move torrent"
+#~ msgstr "ಟೊರೆಂಟೠಅನà³à²¨à³ ವರà³à²—ಾಯಿಸà³"
+
+#~ msgid "Next Announce"
+#~ msgstr "ಮà³à²‚ದಿನ ಪà³à²°à²•à²Ÿà²£à³†"
+
+#~ msgid "Restart"
+#~ msgstr "ಪà³à²¨à²°à²¾à²°à²‚ಭಿಸà³"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "ಇವೠಸದà³à²¯à²•à³à²•à³† à²à²¨à²¨à³à²¨à³‚ ಮಾಡà³à²¤à³à²¤à²¿à²²à³à²².\n"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>ಟಾರೆಂಟನà³à²¨à³ ಸೇರಿಸà³</b></big>"
diff --git a/deluge/i18n/ko.po b/deluge/i18n/ko.po
new file mode 100644
index 0000000..ddf00ad
--- /dev/null
+++ b/deluge/i18n/ko.po
@@ -0,0 +1,4645 @@
+# Korean translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2009-01-24 10:53+0000\n"
+"Last-Translator: Mait <mattengi@gmail.com>\n"
+"Language-Team: Korean <ko@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "올리기 ì†ë„:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "내려받기 ì†ë„:"
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "아래로"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "위로"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "꺼ì§"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "파ì¼ì„ ì˜®ê²¨ë†“ì„ ë””ë ‰í† ë¦¬"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "다운로드 양"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "업로드 양"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "ì¼ì‹œì •ì§€"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "계ì†ë°›ê¸°"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "토런트 대기 순서 올리기"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "대기열 올리기"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "토런트 대기 순서 내리기"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "대기열 내리기"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>업로드 양:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>다운로드 양:</b>"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "ëª¨ë‘ ì¼ì‹œì •ì§€(_P)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "전체 할당 사용 (권장)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "단순 할당 사용"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "단순 í• ë‹¹ì„ ì‚¬ìš©í•˜ë©´ 필요할 때만 ê³µê°„ì„ í• ë‹¹ 받습니다."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "토런트내 파ì¼ë“¤ì˜ 처ìŒê³¼ 마지막 ì¡°ê°ì„ ë” ìš°ì„ í•¨"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>기타 네트워í¬</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"핸드ì‰ì´í¬\n"
+"스트림 전체\n"
+"ëª¨ë‘ ì‚¬ìš©"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "초당 최대 ì—°ê²° ì‹œë„:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr "ì „ì²´ í† ëŸ°íŠ¸ì˜ ìµœëŒ€ 업로드 ì†ë„입니다. ë¬´ì œí•œì€ -1ë¡œ 설정."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "최대 업로드 ì†ë„ (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "ì—°ê²°ì„ í—ˆìš©í•  최대 개수입니다. ë¬´ì œí•œì€ -1ë¡œ 설정."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr "ì „ì²´ í† ëŸ°íŠ¸ì˜ ìµœëŒ€ 업로드 개수입니다. ë¬´ì œí•œì€ -1ë¡œ 설정."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "최대 업로드 개수:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr "ì „ì²´ í† ëŸ°íŠ¸ì˜ ìµœëŒ€ 다운로드 ì†ë„입니다. ë¬´ì œí•œì€ -1ë¡œ 설정."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "최대 다운로드 ì†ë„ (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr "토런트 하나당 최대 업로드 개수입니다. ë¬´ì œí•œì€ -1ë¡œ 설정."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>토런트당 ëŒ€ì—­í­ ì‚¬ìš©ëŸ‰</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr "Delugeê°€ 서버를 확ì¸í•˜ì—¬ 새로운 ë²„ì „ì´ ë°œê²¬ë˜ë©´ 당신ì—게 알려ì¤ë‹ˆë‹¤."
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "Deluge 보기ì´(_S)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "대기열(_Q)"
+
+#~ msgid "New Password"
+#~ msgstr "새 패스워드"
+
+#~ msgid "Pause all"
+#~ msgstr "ëª¨ë‘ ì¼ì‹œì •ì§€"
+
+#~ msgid "Pieces"
+#~ msgstr "ì¡°ê°ë“¤"
+
+#~ msgid "Queue Position"
+#~ msgstr "대기열 위치"
+
+#~ msgid "Resume all"
+#~ msgstr "ëª¨ë‘ ë‹¤ì‹œì‹œìž‘"
+
+#~ msgid "From"
+#~ msgstr "보낸ì´"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "호스트명:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "í¬íŠ¸:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "ì‚¬ìš©ìž ì´ë¦„:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "암호:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "범위:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "사용"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "설정"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "í´ë” ì„ íƒ"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>다운로드 위치</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "최고 업로드 ì†ë„:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "최대 연결수:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "최대 업로드 슬롯수:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "최고 다운로드 ì†ë„:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>대역í­</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "ë‹¤ìŒ ë¹„ìœ¨ì—ì„œ ë°°í¬ ì¤‘ì§€:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "ë¹„ìœ¨ì— ë„달하면 제거"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "최ìƒë‹¨"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "최하단"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>대기열</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "옵션"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "다운로드 제한:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "업로드 제한:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "활성 토런트 수:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>ì €ì† ì„¤ì •</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "ìž˜ëª»ëœ ë¼ë²¨, 유효한 문ìž:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "빈 ë¼ë²¨"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "ì´ë¯¸ 존재하는 ë¼ë²¨ìž…니다"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "ì•Œ 수 없는 ë¼ë²¨"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "알 수 없는 토런트"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "ë¼ë²¨"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "ë¼ë²¨ 옵션(_O)"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "ë¼ë²¨ 제거(_R)"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "ë¼ë²¨ 추가(_A)"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "ë¼ë²¨ 옵션"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>ë¼ë²¨ 옵션</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "업로드 슬롯:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "ì—°ê²°:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "ê°œê°œì˜ í† ëŸ°íŠ¸ì— ìµœëŒ€ 설정 사용:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "최대"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "ìžë™ 관리"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "대기열 설정 사용:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "대기열"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "완료ë˜ë©´ ë‹¤ìŒ ìœ„ì¹˜ë¡œ 옮김:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "위치 설정 사용:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "위치"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(트래커당 한 줄)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "ìžë™ìœ¼ë¡œ ë¼ë²¨ ì ìš©:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "트래커"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "ë¼ë²¨ 추가"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>ë¼ë²¨ 추가</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "ì´ë¦„:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr "<i>íƒìƒ‰ì°½ì—ì„œ ë¼ë²¨ì„ 추가, 수정, 제거할 수 있습니다. </i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>ë¼ë²¨</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "ì—¬ê¸°ì— í’€ê¸°:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "토런트 ì´ë¦„으로 하위 í´ë” ìƒì„±"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr "í† ëŸ°íŠ¸ì˜ ì´ë¦„으로 하위 í´ë”를 ìƒì„±í•˜ê³  ìƒì„±ëœ í´ë”ì—다 ì••ì¶•ì„ í•´ì œí•©ë‹ˆë‹¤."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>ì¼ë°˜</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "웹 ì¸í„°íŽ˜ì´ìŠ¤ 사용"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "SSL 사용"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "수신 대기 í¬íŠ¸:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>설정</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP list (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Text (Zipped)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Text (Uncompressed)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "리ë”ê°€ 올바르지 않습니다."
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "ë§¤ì§ ì½”ë“œê°€ 올바르지 않습니다."
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "ë²„ì „ì´ ì˜¬ë°”ë¥´ì§€ 않습니다."
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "차단목ë¡"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "ì¼"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "목ë¡ì„ 갱신할 주기:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "시작시 ì°¨ë‹¨ëª©ë¡ ê°€ì ¸ì˜¤ê¸°"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "필요한 경우ì—만 ì°¨ë‹¨ëª©ë¡ íŒŒì¼ì„ 다운로드하여 가져옵니다."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "확ì¸í›„ 다운로드하여 가져오기"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "새로운 ì°¨ë‹¨ëª©ë¡ íŒŒì¼ì„ 다운로드하여 가져옵니다."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "무조건 다운로드하여 가져오기"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "차단목ë¡ì€ 최신입니다"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>옵션</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "종류:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "날짜:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "íŒŒì¼ í¬ê¸°:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>ì •ë³´</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "토런트 완료"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "토런트 추가"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "실행"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "ì¡°ê±´"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "명령"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>명령 추가</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>명령</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "알림 ì •ìƒ"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "알림 보냄"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "경고"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "오류"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "아프가니스탄"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "올란드제ë„"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "알바니아"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "알제리"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "아메리칸사모아"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "안ë„ë¼"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "앙골ë¼"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "앵귈ë¼"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "남극"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "앤티가바부다"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "아르헨티나"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "아르메니아"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "아루바"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "오스트레ì¼ë¦¬ì•„"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "오스트리아"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "아제르바ì´ìž”"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "바하마"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "바레ì¸"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "방글ë¼ë°ì‹œ"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "바베ì´ë„스"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "벨ë¼ë£¨ìŠ¤"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "벨기ì—"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "벨리즈"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "베냉"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "버뮤다"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "부탄"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "볼리비아"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "보스니아헤르체고비나"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "보츠와나"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "부베 섬"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "브ë¼ì§ˆ"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "ì˜êµ­ë ¹ì¸ë„ì–‘ì‹ë¯¼ì§€"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "ë¸Œë£¨ë‚˜ì´ ì™•êµ­"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "불가리아"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "부르키나파소"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "부룬디"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "캄보디아"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "카메룬"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "ìºë‚˜ë‹¤"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "카보베르ë°"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "ì¼€ì´ë§¨ ì œë„"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "중앙아프리카공화국"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "차드"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "ì¹ ë ˆ"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "중국"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "í¬ë¦¬ìŠ¤ë§ˆìŠ¤ì„¬"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "코코스 ì œë„"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "콜롬비아"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "코모로"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "콩고"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "콩고민주공화국"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "ì¿¡ì•„ì¼ëžœë“œ"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "코스타리카"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "코트디부아르"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "í¬ë¡œì•„í‹°ì•„"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "ì¿ ë°”"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "키프로스"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "ì²´ì½”"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "ë´ë§ˆí¬"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "지부티"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "ë„미니카"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "ë„미니카공화국"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "ì—ì½°ë„르"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "ì´ì§‘트"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "엘살바ë„르"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "ì ë„기니"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "ì—리트레아"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "ì—스토니아"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "ì—티오피아"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "í¬í´ëžœë“œ ì œë„"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "페어로우섬"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "피지"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "필란드"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "프랑스"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "프랑스령기아나"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "프랑스령 í´ë¦¬ë„¤ì‹œì•„"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "프랑스령 남부와 남극지역"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "가봉"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "ê°ë¹„ì•„"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "그루지아"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "ë…ì¼"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "ì˜êµ­"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "가나"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "지브롤터"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "그리스"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "그린란드"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "그레나다"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "카리브"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "괌"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "과테ë§ë¼"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "건지"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "기니"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "기니비사우"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "ê°€ì´ì•„나"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "ì•„ì´í‹°"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "허드 ì œë„와 맥ë„ë„ë“œ ì œë„"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "êµí™©ì²­ (바티칸 시국)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "온ë‘ë¼ìŠ¤"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "í™ì½©"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "í—가리"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "ì•„ì´ìŠ¬ëž€ë“œ"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "ì¸ë„"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "ì¸ë„네시아"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "ì´ëž€"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "ì´ë¼í¬"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "ì•„ì¼ëžœë“œ"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "맨섬"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "ì´ìŠ¤ë¼ì—˜"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "ì´íƒˆë¦¬ì•„"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "ìžë©”ì´ì¹´"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "ì¼ë³¸"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "저지"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "요르단"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "ì¹´ìží스탄"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "ì¼€ëƒ"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "키리바시"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "조선민주주ì˜ì¸ë¯¼ê³µí™”êµ­"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "대한민국"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "쿠웨ì´íŠ¸"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "키르기스스탄"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "ë¼ì˜¤ìŠ¤"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "ë¼íŠ¸ë¹„ì•„"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "레바논"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "레소토"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "ë¼ì´ë² ë¦¬ì•„"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "리비아"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "리히í…슈타ì¸"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "리투아니아"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "룩셈부르í¬"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "마카오"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "마케ë„니아"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "마다가스카르"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "ë§ë¼ìœ„"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "ë§ë ˆì´ì‹œì•„"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "몰디브"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "ë§ë¦¬"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "몰타"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "마셜제ë„"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "마르티니í¬"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "모리타니"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "모리셔스"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "마요트"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "멕시코"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "마ì´í¬ë¡œë„¤ì‹œì•„ ì—°ë°©"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "몰ë„ë°”"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "모나코"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "몽골"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "몬테네그로"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "몬세ë¼íŠ¸ì‚°"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "모로코"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "모잠비í¬"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "미얀마"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "나미비아"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "나우루"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "네팔"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "네ëœëž€ë“œ"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "네ëœëž€ë“œë ¹ 앤틸리스"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "뉴칼레ë„니아"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "뉴질랜드"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "니카ë¼ê³¼"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "니제르"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "나ì´ì§€ë¦¬ì•„"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "니우ì´"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "ë…¸í½ì„¬"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "ë¶ ë§ˆë¦¬ì•„ë‚˜ ì œë„"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "노르웨ì´"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "오만"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "파키스탄"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "팔ë¼ìš°"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "íŒ”ë ˆìŠ¤íƒ€ì¸ ìœ ì—”ì¸ë„주ì˜ì—…무조정국"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "파나마"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "파푸아뉴기니"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "파ë¼ê³¼ì´"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "페루"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "필리핀"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "피트케ì¸"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "í´ëž€ë“œ"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "í¬ë¥´íˆ¬ì¹¼"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "푸ì—르토리코"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "카타르"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "레위니옹"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "루마니아"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "러시아"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "르완다"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "ìƒ ë°”ë¥´í…”ë ˆë¯¸"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "ìƒ í—¬ë ˆë‚˜"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "ìƒ í‚¤ì¸ ë„¤ë¹„ìŠ¤"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "ìƒ ë£¨ì‹œì•„"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "ìƒ ë§ˆí‹´"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "ìƒ íŽ˜ì—르미켈론"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "ìƒ ë¹ˆì„¼íŠ¸ 그레나딘"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "사모아"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "산마리노"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "ìƒíˆ¬ë©”프린시페"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "사우디아ë¼ë¹„ì•„"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "세네갈"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "세르비아"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "세ì´ì…¸"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "ì‹œì—ë¼ë¦¬ì˜¨"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "싱가í¬ë¥´"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "슬로바키아"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "슬로베니아"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "솔로몬 ì œë„"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "소ë§ë¦¬ì•„"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "남아프리카공화국"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "사우스조지아 사우스샌드위치 ì œë„"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "스페ì¸"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "스리랑카"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "수단"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "수리남"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "스발바르 얀마옌 ì œë„"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "스와질란드"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "스웨ë´"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "스위스"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "시리아 ì•„ëž ê³µí™”êµ­"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "타ì´ì™„"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "타지키스탄"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "탄ìžë‹ˆì•„"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "타ì´"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "통티모르"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "토고"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "토켈ë¼ìš°"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "통가"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "트리니다드토바고"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "튀니지"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "터키"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "투르í¬ë©”니스탄"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "í„°í¬ìŠ¤ ì¼€ì´ì»¤ìŠ¤ ì œë„"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "투발루"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "우간다"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "ìš°í¬ë¼ì´ë‚˜"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "ì•„ëžì—미리트"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "미국"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "미국령 군소 ì œë„"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "우루과ì´"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "우즈베키스탄"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "바누아투"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "베네수엘ë¼"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "베트남"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "ì˜êµ­ë ¤ì—¬ 버진 ì œë„"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "미국령 버진아ì¼ëžœë“œ"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "월리스푸투나제ë„"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "서사하ë¼"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "예멘"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "잠비아"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "ì§ë°”브웨"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "오프ë¼ì¸"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "온ë¼ì¸"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "ì—°ê²°ë¨"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "ë°ëª¬ì´ 존재하지 않습니다"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "ì‹¤í–‰ì¤‘ì¸ ë°ëª¬ì´ 없습니다"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "ì‹œìž‘ì¤‘ì¸ ì„œë²„ì˜ PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "주소"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "í´ë¼ì´ì–¸íŠ¸"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "진행 ìƒí™©"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "다운 ì†ë„"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "ì—… ì†ë„"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "토런트"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " 토런트 대기열"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " 토런트 대기열"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "무제한"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "활성화ë¨"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "ì‚¬ìš©ìž ì§€ì •"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "다운:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "ì—…:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "최고 다운로드 ì†ë„ 설정"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "최대 업로드 ì†ë„ 설정"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "토런트 완료"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Delugeê°€ %(name)sì˜ ë‹¤ìš´ë¡œë“œë¥¼ 마쳤ìŒì„ 알리는 ì´ë©”ì¼ìž…니다.\n"
+"ì´ í† ëŸ°íŠ¸ì—는 %(num_files)i ê°œì˜ íŒŒì¼ì´ í¬í•¨ë˜ì–´ 있습니다.\n"
+"ì´ ì •ë³´ê°€ 전달ë˜ëŠ” ê²ƒì„ ì¤‘ë‹¨í•˜ë ¤ë©´ Delugeì˜ ê¸°ë³¸ì„¤ì •ì—ì„œ 알림 í•­ëª©ì— ìžˆëŠ” ì´ë©”ì¼ ì‚¬ìš©ì— ì²´í¬ë¥¼ 해제하면 ë©ë‹ˆë‹¤.\n"
+"\n"
+"ê°ì‚¬í•©ë‹ˆë‹¤.\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "다운로드"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "네트워í¬"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "대역í­"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "ì¸í„°íŽ˜ì´ìŠ¤"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "기타"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "ë°ëª¬"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "프ë¡ì‹œ"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "ìºì‹œ"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "부가 기능"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "부가 기능"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "부가 기능 ì„ íƒ"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "부가 기능 ì—ê·¸"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "파ì¼ì´ë¦„"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "í¬ê¸°"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "알수 없는 파ì¼"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "중복ë˜ëŠ” 토런트"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "ë™ì¼í•œ 토런트를 중복하여 추가 í•  수 없습니다."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "íŒŒì¼ ìš°ì„ ìˆœìœ„ë¥¼ 변경할 수 없습니다!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ".torrent íŒŒì¼ ì„ íƒ"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "토런트 파ì¼"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "모든 파ì¼"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "알수 없는 URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "다운로드 실패"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "순위"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "트래커"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "íŒŒì¼ ì„ íƒ"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "í´ë” ì„ íƒ"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ".torrent íŒŒì¼ ì €ìž¥"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "ì—°ê²°ë˜ì§€ ì•ŠìŒ"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "연결 수"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "다운로드 ì†ë„"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "업로드 ì†ë„"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "프로토콜 소통량 다운로드/업로드"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT 노드"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "들어오는 ì—°ê²°ì´ ì—†ìŠµë‹ˆë‹¤!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "최대 연결수 설정"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "토런트"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "꼬리표"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "모ë‘"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "다운로드중"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "ë°°í¬ì¤‘"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "ì¼ì‹œì •ì§€ë¨"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "검사중"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "대기중"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "ì—†ìŒ"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "미지정"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "호스트"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "호스트 추가 오류"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "í´ëž˜ì‹ 모드를 í•´ì œ 하시겠습니까?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Deluge ë°ëª¬ 프로세스 (deluged)ê°€ ì´ë¯¸ 실행중입니다.\n"
+"\n"
+"ë°ëª¬ì„ 중단하거나 í´ëž˜ì‹ 모드를 해제해야 진행 í•  수 있습니다."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "시작 코어 오류"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"Deluge를 í´ëž˜ì‹ 모드로 ì‹¤í–‰í•˜ëŠ”ë° í•„ìš”í•œ 핵심 구성요소를 시작하는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤.\n"
+"\n"
+"ìžì„¸í•œ 정보는 ì•„ëž˜ì˜ ë‚´ìš©ì„ í†µí•´ 확ì¸í•˜ì„¸ìš”."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr "í´ëž˜ì‹ 모드로 시작하는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤. í´ëž˜ì‹ 모드를 ë„ê³  ê³„ì† ì§„í–‰ 하시겠습니까?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "ë°ëª¬ 시작 오류"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr "ë°ëª¬ 프로세스를 시작하는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤. ì–´ë–¤ 오류가 ë°œìƒí•˜ì˜€ëŠ”지 확ì¸í•˜ë ¤ë©´ 콘솔ì—ì„œ 다시 실행해보세요."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "켬"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "무제한으로 설정"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "최대 업로드 슬롯수 설정"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "우선순위"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "ìƒì„¸ ì •ë³´:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "ì´ë¦„"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "ë°°í¬ìž"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "피어"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "남ì€ì‹œê°„"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "비율"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "유효성"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "추가ë¨"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "파ì¼(_F)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "토런트 추가(_A)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "토런트 ìƒì„±(_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "편집(_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "ì—°ê²° 관리ìž(_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "토런트(_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "보기(_V)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "ë„구 모ìŒ(_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "íƒìƒ‰ì°½(_S)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "ìƒíƒœí‘œì‹œì¤„(_B)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "탭(_A)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "ì—´(_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "íƒìƒ‰ì°½(_I)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "대ìƒì´ ì—†ì–´ë„ í‘œì‹œ(_Z)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "트래커 ëª©ë¡ í‘œì‹œ(_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "ë„움ë§(_H)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "ìžì£¼ 묻는 질문"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "토런트 추가"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "토런트 추가"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "토런트 제거"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "토런트 제거"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "ì„ íƒëœ 토런트 중지"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "ì„ íƒëœ 토런트 재시작"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "기본 설정"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "ì—°ê²° 관리ìž"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "ëª¨ë‘ íŽ¼ì¹˜ê¸°(_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "다운로드 안함(_D)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "보통 우선 순위(_N)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "ë†’ì€ ìš°ì„  순위(_H)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "최고 우선 순위(_G)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>ìžë™ 관리:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>ë°°í¬ ë“±ê¸‰:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>ë°°í¬ ì‹œê°„:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>활성화 시간:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>트래커 ìƒíƒœ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>유효성:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>피어 수:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>ë°°í¬ìž 수:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>ì¡°ê° ê°œìˆ˜:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>남ì€ì‹œê°„:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>ë‹¤ìŒ ì•Œë¦¼:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>공유 비율:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>ë“±ë¡ ë‚ ì§œ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "ìƒíƒœ(_S)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>설명:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>íŒŒì¼ ê°œìˆ˜:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>해시:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>트래커:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>ì „ì²´ í¬ê¸°:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>íŒŒì¼ ì´ë¦„:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>경로:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>ìƒíƒœ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "ìƒì„¸ ì •ë³´(_D)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "파ì¼(_F)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "피어(_P)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "완료ë˜ë©´ 옮김:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "비공개"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "처ìŒ/ë§ˆì§€ë§‰ì„ ìš°ì„ í•¨"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "트래커 수정(_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "옵션(_O)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "토런트를 제거하시겠습니까?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>ì„ íƒí•œ 토런트를 삭제하시겠습니까?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>.torrent와 ì—°ê´€ëœ ê²ƒë“¤ê¹Œì§€ ì‚­ì œ ë©ë‹ˆë‹¤!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>다운로드한 ë°ì´í„°ë„ ì‚­ì œë©ë‹ˆë‹¤!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "ì„ íƒí•œ 토런트 제거"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "새로운 릴리즈"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>새로운 릴리즈를 찾았습니다!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>새로운 버젼:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>현재 버젼:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "다ìŒë¶€í„° ì´ ëŒ€í™”ìƒìžë¥¼ ë³´ì´ì§€ ì•ŠìŒ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "웹사ì´íŠ¸ë¡œ ì´ë™(_G)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "ì´ IP를 피어로 추가"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "ëª¨ë‘ ì„ íƒ(_S)"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "ì„ íƒëœ 토런트 재시작."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "ëª¨ë‘ ìž¬ì‹œìž‘(_M)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "토런트 추가"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "URL(_U)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "해시 정보(_H)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "제거(_R)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>토런트 목ë¡</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "파ì¼(_L)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "ì „ì²´"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "ì¡°ê°"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>저장공간 할당 ë°©ì‹</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "최고 다운 ì†ë„:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "최고 ì—… ì†ë„:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "ì¤‘ì§€ëœ ìƒíƒœë¡œ 추가(_P)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "처ìŒ/마지막 ì¡°ê°ì„ ìš°ì„ "
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "기본값으로 ë˜ëŒë¦¬ê¸°"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "ì „ì²´ì— ì ìš©"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "URL로 추가"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>URL로 부터</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "해시정보 추가"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>해시정보로</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "해시정보:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "트래커:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "토런트 ìƒì„±"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>토런트 ìƒì„±</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "í´ë”(_D)"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "ì›ê²© 경로(_R)"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>파ì¼</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "저작ìž:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "설명:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "ì •ë³´"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "웹배í¬"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "ì¡°ê°ì˜ í¬ê¸°:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "비공개 플래그 설정"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "ì´ í† ëŸ°íŠ¸ë¥¼ ì„¸ì…˜ì— ì¶”ê°€"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "ì›ê²© 경로 ìž…ë ¥"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>ì›ê²© 경로</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "경로:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "토런트 ìƒì„±ì¤‘"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ".torrent íŒŒì¼ ì €ìž¥"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>.torrent íŒŒì¼ ì €ìž¥</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "토런트 대기열"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>토런트 ëŒ€ê¸°ì—´ì— ì¶”ê°€</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "ìžë™ìœ¼ë¡œ 토런트 추가 & ì—°ê²°"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "ë¼ë²¨"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "피어 추가"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>피어 추가</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "호스트ì´ë¦„:í¬íŠ¸"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "호스트 추가"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>ì—°ê²° 관리ìž</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_로컬 ë°ëª¬ 시작"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "시작시 ì„ íƒëœ í˜¸ìŠ¤íŠ¸ì— ìžë™ìœ¼ë¡œ ì ‘ì†"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "필요한 경우 로컬호스트를 ìžë™ìœ¼ë¡œ 시작"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "시작시 ì´ ëŒ€í™”ìƒìžë¥¼ 표시하지 ì•ŠìŒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>다운로드</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "ë‹¤ìŒ ìœ„ì¹˜ì˜ .torrent ìžë™ 추가:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "기본 다운로드 위치:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "ë‹¤ìŒ ìœ„ì¹˜ë¡œ .torrent íŒŒì¼ ë³µì‚¬:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>í´ë”</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr "ì „ì²´ í• ë‹¹ì„ ì‚¬ìš©í•˜ë©´ 토런트ì—ì„œ 필요로 하는 모든 ê³µê°„ì„ ë¯¸ë¦¬ 할당 받습니다. 디스í¬ì˜ 단편화를 최소화 í•  수 있습니다."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "í† ëŸ°íŠ¸ì˜ ì²˜ìŒê³¼ 마지막 ì¡°ê°ì„ 우선함"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "ì¤‘ì§€ëœ ìƒíƒœë¡œ 토런트 추가"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>네트워í¬</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "무작위 í¬íŠ¸ 사용"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Delugeê°€ 매번 ìžë™ìœ¼ë¡œ 다른 í¬íŠ¸ë¥¼ ì„ íƒí•˜ë„ë¡ í•©ë‹ˆë‹¤."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "활성 í¬íŠ¸:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "~"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "í¬íŠ¸ 활성화 검사"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>들여오는 í¬íŠ¸</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>내보내는 í¬íŠ¸</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"들어오는 비트토런트 ì—°ê²°ë“¤ì„ ìˆ˜ì‹ í•˜ê¸° 위한 ì¸í„°íŽ˜ì´ìŠ¤ì˜ IP 주소를 ìž…ë ¥ 하세요. 기본으로 ë™ìž‘하길 ì›í•œë‹¤ë©´ 비워ë‘ë©´ ë©ë‹ˆë‹¤."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>ì¸í„°íŽ˜ì´ìŠ¤</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr "피어(웹 ë°°í¬ë¥¼ í¬í•¨)ì—게 전달ë˜ëŠ” 모든 íŒ¨í‚·ì˜ IP í—¤ë”ì— TOS ë°”ì´íŠ¸ë¥¼ 설정합니다. 16진수 값으로 입력하세요."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "피어 TOS ë°”ì´íŠ¸:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "범용 플러그 앤 플레ì´"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT í¬íŠ¸ 맵핑 프로토콜"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "피어 êµí™˜"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discoveryë¡œ 당신과 ë™ì¼í•œ 네트워í¬ì— ì†í•œ 피어를 ì°¾ì„ ìˆ˜ 있습니다."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "í•´ì‹œ í…Œì´ë¸”ì„ ë¶„ì‚°í•˜ë©´ 활성 연결수를 í–¥ìƒì‹œí‚¬ìˆ˜ 있습니다."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "들여오기:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "수준:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"강제\n"
+"사용함\n"
+"사용안함"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "내보내기:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "ì „ì²´ ìŠ¤íŠ¸ë¦¼ì„ ì•”í˜¸í™”"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>암호화</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>대역í­</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "최대 단방향 연결 개수:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "최대 연결 개수:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "로컬 네트워í¬ì—서는 ì œí•œì„ ë¬´ì‹œ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "IP ì˜¤ë²„í—¤ë“œì˜ ë¹„ìœ¨ì„ ì œí•œ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr "ì²´í¬í•˜ë©´ 비율 제한 ìž¥ì¹˜ì— ì˜í•´, 예ìƒë˜ëŠ” TCP/IP 오버헤드를 í¬í•¨í•œ ì´ ì†Œí†µëŸ‰ì´ ì œí•œì„ ì´ˆê³¼í•˜ì§€ ì•Šë„ë¡ í•©ë‹ˆë‹¤."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>ì „ì²´ ëŒ€ì—­í­ ì‚¬ìš©ëŸ‰</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "토런트 하나당 ì—°ê²° 가능한 최대 개수입니다. ë¬´ì œí•œì€ -1ë¡œ 설정."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>ì¸í„°íŽ˜ì´ìŠ¤</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "사용"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"í´ëž˜ì‹ 모드ì—서는 ë°ëª¬ ê¸°ëŠ¥ì˜ ëŒ€ë¶€ë¶„ì´ ê°ì¶°ì§€ë©° Deluge를 í•˜ë‚˜ì˜ ì‘ìš© 프로그램으로 ë™ìž‘하게 합니다. Deluge 실행시 ë°ëª¬ì„ "
+"ì´ìš©í•˜ê³  싶지 않으면 ì´ ì˜µì…˜ì„ ì´ìš©í•˜ì‹­ì‹œì˜¤. ì´ ì„¤ì •ì„ ì ìš©ì‹œí‚¤ê¸° 위해서는 Deluge를 다시 시작해야합니다."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>í´ëž˜ì‹ 모드</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "ì°½ ì œëª©ì— ì„¸ì…˜ ì†ë„ 표시"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>ë©”ì¸ ìœˆë„ìš°</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "í•­ìƒ ë³´ì´ê¸°"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "대화ìƒìžì— í¬ì»¤ìŠ¤ë¥¼ 맞춤"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>토런트 추가 대화ìƒìž</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "시스템 알림 ì˜ì—­ì— ì•„ì´ì½˜ 표시"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "닫으면 알림 ì˜ì—­ìœ¼ë¡œ 최소화"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "알림 ì˜ì—­ì—ì„œ 시작"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "알림 ì˜ì—­ì— 있ì„ë•Œ 암호로 보호"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>시스템 알림 ì˜ì—­</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>기타</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "새 ë²„ì „ì´ ë°°í¬ë˜ë©´ 알림"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>ì—…ë°ì´íŠ¸</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Delugeì˜ ê°œì„ ì„ ë•ê¸° 위해 Pythonê³¼ pyGTKì˜ ë²„ì „, OS와 í”„ë¡œì„¸ì„œì˜ ì¢…ë¥˜ë¥¼ 제작ìžì—게 보냅니다. ì´ì™¸ì˜ ì–´ë– í•œ ì •ë³´ë„ "
+"전송하지 않습니다."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "네, ìµëª…으로 통계를 보내겠습니다."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>시스템 정보</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "위치:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr "만약 Delugeê°€ ì´ ìœ„ì¹˜ì—ì„œ ë°ì´í„°ë² ì´ìŠ¤ 파ì¼ì„ 찾지 못하면 차선으로 DNS를 ì´ìš©í•˜ì—¬ í”¼ì–´ì˜ êµ­ê°€ 결정합니다."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP ë°ì´í„°ë² ì´ìŠ¤</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Delugeì— ë§ˆê·¸ë„· ë§í¬ë¥¼ ì—°ë™"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>ë°ëª¬</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "ë°ëª¬ í¬íŠ¸:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>í¬íŠ¸</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "ì›ê²© ì ‘ì† í—ˆìš©"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>ì—°ê²°</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "정기ì ìœ¼ë¡œ 웹사ì´íŠ¸ë¥¼ 확ì¸í•˜ì—¬ 새로운 ë°°í¬íŒì´ 있는지 확ì¸"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>기타</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>대기열</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "새 토런트ì—게 가장 ë†’ì€ ëŒ€ê¸°ìˆœìœ„ë¥¼ 부여"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "ì „ì²´ 활성 ë°°í¬:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "전체 활성:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "전체 활성 다운로드:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "ëŠë¦° 토런트는 ê³„ì‚°ì— ë„£ì§€ ì•ŠìŒ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>활성 토런트</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "공유 비율 제한:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "ë°°í¬ ì‹œê°„ 비율:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "ë°°í¬ ì‹œê°„ (분):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "공유 ë¹„ìœ¨ì´ ë‹¤ìŒì— ë„달하면 ë°°í¬ ì¤‘ë‹¨:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "공유 ë¹„ìœ¨ì— ë„달하면 토런트 제거"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>ë°°í¬ì¤‘</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>프ë¡ì‹œ</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "호스트:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"ì—†ìŒ\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>피어</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>웹 ë°°í¬</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>트래커</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>ìºì‹œ</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "ìºì‹œ í¬ê¸° (16 KiB 블럭):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr "쓰기 ìºì‹œëŠ” 마지막으로 ìºì‹œëœ ì¡°ê°ì„ 기ë¡í•œí›„ 수초가 경과ë˜ë©´ 강제로 디스í¬ë¡œë¶€í„° í•´ì œë©ë‹ˆë‹¤. 60초가 기본값입니다."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "ìºì‹œ í•´ì œ (ì´ˆ):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr "ì„¸ì…˜ì´ ì‹œìž‘ëœ ì´í›„ 디스í¬ì— 기ë¡í•œ 16 KiB ë¸”ëŸ­ì˜ ì´ ê°œìˆ˜."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "기ë¡í•œ 블럭 개수:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr "ì„¸ì…˜ì´ ì‹œìž‘ëœ ì´í›„ ìˆ˜í–‰ëœ ì“°ê¸° ìž‘ì—…ì˜ ì´ íšŸìˆ˜."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "쓰기 횟수:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"비율 (기ë¡í•œ_블럭_개수 - 쓰기_횟수) / 기ë¡í•œ_블럭_개수는 ì „ì²´ 쓰기 작업중 쓰기 작업으로 저장한 횟수를 나타냅니다. 즉 쓰기 "
+"ìºì‹œë¥¼ 위한 ì¼ì¢…ì˜ ìºì‹œ ì ì¤‘률."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "쓰기 ìºì‹œ ì ì¤‘률:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>쓰기</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr "비트토런트 엔진(피어들)ì˜ ìš”ì²­ìœ¼ë¡œ 디스í¬ë‚˜ ìºì‹œë¡œë¶€í„° ì „ë‹¬ë°›ì€ ë¸”ëŸ­ì˜ ê°œìˆ˜."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "ì½ê¸° 블럭 개수:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "ìºì‹œì—ì„œ 전달 ë°›ì€ ë¸”ëŸ­ì˜ ê°œìˆ˜."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "ì‚¬ìš©ëœ ì½ì€ 블럭 개수:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "ì½ê¸° ìºì‹œì˜ ìºì‹œ ì ì¤‘률."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "ì½ê¸° ìºì‹œ ì ì¤‘률:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr "ì„¸ì…˜ì´ ì‹œìž‘ëœ ì´í›„ ìˆ˜í–‰ëœ ì½ê¸° ìž‘ì—…ì˜ ì´ íšŸìˆ˜."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "ì½ê¸° 횟수:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>ì½ê¸°</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr "ë””ìŠ¤í¬ ìºì‹œì— 존재하는 16KiB ë¸”ëŸ­ì˜ ê°œìˆ˜. ì½ê¸°ì™€ 쓰기 ìºì‹œê°€ ëª¨ë‘ í¬í•¨ë˜ì–´ 있습니다."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "ìºì‹œ í¬ê¸°:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "ì½ê¸° ìºì‹œ í¬ê¸°:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>í¬ê¸°</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>ìƒíƒœ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>부가 기능</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "버전:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "홈페ì´ì§€:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "ì €ìž‘ìž ì´ë©”ì¼:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "부가 기능 설치(_I)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "부가 기능 ëª©ë¡ ìƒˆë¡œê³ ì¹¨(_R)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "부가 기능 검색(_F)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "ëª¨ë‘ ìž¬ì‹œìž‘(_R)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "다운로드 ì†ë„ 제한(_D)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "업로드 ì†ë„ 제한(_U)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "ë°ëª¬ ë내기 & 종료"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "í´ë” 열기(_O)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "재시작(_M)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "옵션(_I)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "트래커 ì—…ë°ì´íŠ¸(_U)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "토런트 제거(_R)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "강제 재검사(_F)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "저장소 ì´ë™( _S)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "연결 제한(_C)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "업로드 슬롯 제한(_S)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "ìžë™ 관리(_A)"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>ì„ íƒí•œ 토런트를 제거 하시겠습니까?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "ë°ì´í„°ë¥¼ 제거하면 ì˜êµ¬ì ìœ¼ë¡œ ì†ì‹¤ ë©ë‹ˆë‹¤."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "트래커 수정"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>트래커 수정</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "트래커 추가"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>트래커 추가</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "트래커 수정"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>트래커 수정</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "트래커:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "ë°ì´í„°ë„ 함께 제거(_D)"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "토런트만 제거(_T)"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "저장소 ì´ë™"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>저장소 ì´ë™</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "설명:"
+
+#~ msgid "Unknown"
+#~ msgstr "모름"
+
+#~ msgid "seconds"
+#~ msgstr "ì´ˆ"
+
+#~ msgid "Yes"
+#~ msgstr "예"
+
+#~ msgid "No"
+#~ msgstr "아니오"
+
+#~ msgid "Update Tracker"
+#~ msgstr "추ì ìž ì—…ë°ì´íŠ¸"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Mainline DHT"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>ì†ë„:</b>"
+
+#~ msgid "Availability"
+#~ msgstr "유효성"
+
+#~ msgid "Select All"
+#~ msgstr "ëª¨ë‘ ì„ íƒ"
+
+#~ msgid "Clear"
+#~ msgstr "비우기"
+
+#~ msgid "Add"
+#~ msgstr "추가"
+
+#~ msgid "Remove"
+#~ msgstr "제거"
+
+#~ msgid "Share Ratio"
+#~ msgstr "공유 비율"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr ".torrent íŒŒì¼ ì‚­ì œ"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Username"
+#~ msgstr "사용ìžì´ë¦„"
+
+#~ msgid "Password"
+#~ msgstr "암호"
+
+#~ msgid "Server"
+#~ msgstr "서버"
+
+#~ msgid "Port"
+#~ msgstr "í¬íŠ¸"
+
+#~ msgid "_Quit"
+#~ msgstr "종료(_Q)"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge가 잠겨 있습니다."
+
+#~ msgid "Download"
+#~ msgstr "다운로드"
+
+#~ msgid "Upload"
+#~ msgstr "업로드"
+
+#~ msgid "Graph"
+#~ msgstr "그래프"
+
+#~ msgid "Files"
+#~ msgstr "파ì¼"
+
+#~ msgid "Text and image"
+#~ msgstr "글ìžì™€ 그림"
+
+#~ msgid "Image Only"
+#~ msgstr "그림만"
+
+#~ msgid "Text Only"
+#~ msgstr "글ìžë§Œ"
+
+#~ msgid "# Of Files"
+#~ msgstr "íŒŒì¼ ê°œìˆ˜"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "다운로드한 파ì¼ì„ ì‚­ì œ:"
+
+#~ msgid "Eta"
+#~ msgstr "남ì€ì‹œê°„"
+
+#~ msgid "Login"
+#~ msgstr "로그ì¸"
+
+#~ msgid "Logout"
+#~ msgstr "로그아웃"
+
+#~ msgid "Next Announce"
+#~ msgstr "ë‹¤ìŒ ì•Œë¦¼"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "패스워드가 틀립니다. 다시 입력하세요."
+
+#~ msgid "Reannounce"
+#~ msgstr "다시 알림"
+
+#~ msgid "Set"
+#~ msgstr "설정"
+
+#~ msgid "Set Timeout"
+#~ msgstr "시간초과 설정"
+
+#~ msgid "Speed"
+#~ msgstr "ì†ë„"
+
+#~ msgid "Start"
+#~ msgstr "시작"
+
+#~ msgid "Torrent list"
+#~ msgstr "토런트 목ë¡"
+
+#~ msgid "Total Size"
+#~ msgstr "ì „ì²´ í¬ê¸°"
+
+#~ msgid "Tracker Status"
+#~ msgstr "트래커 ìƒíƒœ"
+
+#~ msgid "Upload torrent"
+#~ msgstr "업로드 토런트"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Disabled"
+#~ msgstr "비활성"
+
+#~ msgid "Type"
+#~ msgstr "종류"
+
+#~ msgid "Filters"
+#~ msgstr "í•„í„°"
+
+#~ msgid "Details"
+#~ msgstr "ìƒì„¸ ì •ë³´"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge는 암호로 보호ë˜ê³  있습니다.\n"
+#~ "Deluge ì°½ì„ ë³´ì‹œë ¤ë©´ 암호를 입력해주세요."
+
+#~ msgid "About"
+#~ msgstr "프로그램 정보"
+
+#~ msgid "Ava"
+#~ msgstr "유효성"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "ìžë™ 새로고침:"
+
+#~ msgid "Config"
+#~ msgstr "설정"
+
+#~ msgid "Disable"
+#~ msgstr "사용 안함"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "페ì´ì§€ 새로고침 간격:"
+
+#~ msgid "Submit"
+#~ msgstr "전송"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "ì•„ì§ì€ ì´ê³³ì— ì•„ë¬´ê²ƒë„ ìž…ë ¥í•˜ì§€ 마세요..\n"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>토런트 추가</b></big>"
+
+#~ msgid "page 6"
+#~ msgstr "page 6"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 7"
+#~ msgstr "page 7"
+
+#~ msgid "page 8"
+#~ msgstr "page 8"
+
+#~ msgid "page 10"
+#~ msgstr "page 10"
+
+#~ msgid "page 11"
+#~ msgstr "page 11"
+
+#~ msgid "page 12"
+#~ msgstr "page 12"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "Homepage"
+#~ msgstr "홈페ì´ì§€"
+
+#~ msgid "FAQ"
+#~ msgstr "FAQ"
+
+#~ msgid "Community"
+#~ msgstr "커뮤니티"
+
+#~ msgid "Error setting label options"
+#~ msgstr "ë¼ë²¨ 옵션 설정 오류"
+
+#~ msgid "apply_max"
+#~ msgstr "최대 설정 사용"
+
+#~ msgid "max_download_speed"
+#~ msgstr "최고 다운로드 ì†ë„"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "최고 업로드 ì†ë„"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "최대 업로드 슬롯수"
+
+#~ msgid "max_connections"
+#~ msgstr "최대 연결수"
+
+#~ msgid "apply_queue"
+#~ msgstr "대기열 설정 사용"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "ìžë™ìœ¼ë¡œ 관리"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "비율ì—ì„œ ë°°í¬ ì¤‘ì§€"
+
+#~ msgid "stop_ratio"
+#~ msgstr "중지할 비율"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "비율ì—ì„œ 제거"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "완료ë˜ë©´ 다ìŒìœ¼ë¡œ 옮기는 설정 사용"
+
+#~ msgid "move_completed"
+#~ msgstr "완료ë˜ë©´ 옮김"
+
+#~ msgid "move_completed_path"
+#~ msgstr "완료ë˜ë©´ ë‹¤ìŒ ê²½ë¡œë¡œ 옮김"
+
+#~ msgid "auto_add"
+#~ msgstr "ìžë™ 추가(_A)"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "ìžë™ìœ¼ë¡œ 추가할 트래커 목ë¡"
+
+#~ msgid "Work in progress.."
+#~ msgstr "ê¸°ëŠ¥ì„ êµ¬í˜„ì¤‘ìž…ë‹ˆë‹¤.."
+
+#~ msgid "BlockList"
+#~ msgstr "차단목ë¡"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "갱신 주기 (ì¼)"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "시간초과 (초)"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "다운로드 ì‹œë„ íšŸìˆ˜"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "ë°ëª¬ 시작시 들여오기"
+
+#~ msgid "Import Now"
+#~ msgstr "지금 들여오기"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "다운로드중 %.2f%%"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "들여오는 중 %s"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "차단 범위: %s"
+
+#~ msgid "Inactive"
+#~ msgstr "비활성"
+
+#~ msgid "Refresh status"
+#~ msgstr "ìƒíƒœ 새로고침"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "ì´ í”„ë¡œê·¸ëž¨ì€ ìžìœ (free) 소프트웨어입니다; ìžìœ  소프트웨어 재단ì—ì„œ 발행한 GNU 공개 ë¼ì´ì„¼ìŠ¤ì˜ ì¡°ê±´ì— ë§žê²Œ 수정하여(하거나) "
+#~ "ìž¬ë°°í¬ í• ìˆ˜ 있습니다; ë¼ì´ì„¼ìŠ¤ëŠ” 버전 3 í˜¹ì€ (본ì¸ì´ ì›í•œë‹¤ë©´) 최신 ë²„ì „ì¤‘ì— ì„ íƒí• ìˆ˜ 있습니다. ì´ í”„ë¡œê·¸ëž¨ì´ ìœ ìš©í•˜ê²Œ ì´ìš©ë˜ê¸¸ "
+#~ "ë°”ë¼ëŠ” 마ìŒìœ¼ë¡œ ë°°í¬í•©ë‹ˆë‹¤ë§Œ, ì–´ë– í•œ ë³´ì¦ë„ 하지 않습니다; 즉 묵시ì ì¸ ìƒí’ˆì„± ë³´ì¦ì„ 하지 않으며 ì´ ë©´ì±…ì¡°í•­ì— ê¸°ìˆ ëœê²ƒ 처럼 ê°œì¸ì ì¸ "
+#~ "ìš©ë„ì— ì í•©í•©ë‹ˆë‹¤. 보다 ìžì„¸í•œ ë‚´ìš©ì€ GNU 공개 ë¼ì´ì„¼ìŠ¤ë¥¼ 참고하길 ë°”ëžë‹ˆë‹¤. GNU 공개 ë¼ì´ì„¼ìŠ¤ì˜ ì‚¬ë³¸ì€ ì´ í”„ë¡œê·¸ëž¨ê³¼ 함께 "
+#~ "받으셨ì„ê²ë‹ˆë‹¤; 만약 ì°¾ì„수 없다면 다ìŒì„ 참조 하세요 <http://www.gnu.org/licenses> ."
+
+#~ msgid "Other.."
+#~ msgstr "기타.."
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "%iê°œì˜ íŒŒì¼ì´ í¬í•¨ë˜ì–´ 있습니다"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Delugeê°€ %sì˜ ë‹¤ìš´ë¡œë“œë¥¼ 마쳤ìŒì„ 알리는 ì´ë©”ì¼ìž…니다.\n"
+#~ "ì´ í† ëŸ°íŠ¸ì—는 %iê°œì˜ íŒŒì¼ì´ í¬í•¨ë˜ì–´ 있습니다.\n"
+#~ "ì´ëŸ¬í•œ ì •ë³´ê°€ 전달ë˜ëŠ” ê²ƒì„ ì¤‘ë‹¨í•˜ë ¤ë©´ Delugeì˜ ê¸°ë³¸ì„¤ì •ì—ì„œ 알림 í•­ëª©ì— ìžˆëŠ”ì´ë©”ì¼ ì‚¬ìš©ì— ì²´í¬ë¥¼ 해제하면 ë©ë‹ˆë‹¤.\n"
+#~ "\n"
+#~ "ê°ì‚¬í•©ë‹ˆë‹¤.\n"
+#~ "Deluge"
+
+#~ msgid "State"
+#~ msgstr "ìƒíƒœ"
+
+#~ msgid "no label"
+#~ msgstr "미지정"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "토런트가 중단 ë¹„ìœ¨ì„ ë„˜ì—ˆìŠµë‹ˆë‹¤."
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "These changes were saved"
+#~ msgstr "변경 ì‚¬í•­ì„ ì €ìž¥í–ˆìŠµë‹ˆë‹¤"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "오류를 수정하고 다시 ì‹œë„"
+
+#~ msgid "Connect"
+#~ msgstr "ì—°ê²°"
+
+#~ msgid "Statistics"
+#~ msgstr "통계"
+
+#~ msgid "Delete"
+#~ msgstr "삭제"
+
+#~ msgid "Stop"
+#~ msgstr "중지"
+
+#~ msgid "Queue Top"
+#~ msgstr "최ìƒìœ„ 대기열"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "최하위 대기열"
+
+#~ msgid "Move"
+#~ msgstr "ì´ë™"
+
+#~ msgid "Recheck"
+#~ msgstr "재검사"
+
+#~ msgid "Ports"
+#~ msgstr "í¬íŠ¸"
+
+#~ msgid "To"
+#~ msgstr "마지막"
+
+#~ msgid "Random"
+#~ msgstr "무작위"
+
+#~ msgid "Extra's"
+#~ msgstr "고급"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "피어 êµí™˜"
+
+#~ msgid "Encryption"
+#~ msgstr "암호화"
+
+#~ msgid "Forced"
+#~ msgstr "강제"
+
+#~ msgid "Handshake"
+#~ msgstr "핸드ì‰ì´í¬"
+
+#~ msgid "Either"
+#~ msgstr "ëª¨ë‘ í—ˆìš©"
+
+#~ msgid "Inbound"
+#~ msgstr "들여오기"
+
+#~ msgid "Outbound"
+#~ msgstr "내보내기"
+
+#~ msgid "Level"
+#~ msgstr "수준"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "Global"
+#~ msgstr "ì „ì²´"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = 무제한"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "최대 연결수"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "최고 다운로드 ì†ë„ (Kib/s)"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "최대 업로드 ì†ë„ (Kib/s)"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "최대 업로드 슬롯수"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "최대 단방향 연결수"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "최대 초당 ì—°ê²° ì‹œë„ íšŸìˆ˜"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "IP 오버헤드 비율 제한"
+
+#~ msgid "Per Torrent"
+#~ msgstr "ê°œê°œì˜ í† ëŸ°íŠ¸"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "기본 다운로드 위치"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr ".torrent íŒŒì¼ ì €ìž¥ 위치"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "ìžë™ 추가 위치:"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "ìžë™ 추가 사용"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "처ìŒê³¼ 마지막 ì¡°ê°ì„ 우선함"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "ë³€ê²½ëœ ì„¤ì •ì€ ë°ëª¬ê³¼ 웹ui를 재시작한 ì´í›„ì— ì ìš©ë©ë‹ˆë‹¤."
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = 무제한"
+
+#~ msgid "Total active torrents"
+#~ msgstr "전체 활성 토런트"
+
+#~ msgid "Total active downloading"
+#~ msgstr "전체 활성 다운로딩"
+
+#~ msgid "Total active seeding"
+#~ msgstr "ì „ì²´ 활성 ë°°í¬"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "ì¼ì • ë¹„ìœ¨ì— ë„달하면 ë°°í¬ ì¤‘ì§€"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "ì¼ì • ë¹„ìœ¨ì— ë„달하면 토런트 제거"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "í”ŒëŸ¬ê·¸ì¸ ì‚¬ìš©"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "í´ë”ê°€ 존재하지 않습니다."
+
+#~ msgid "translate something"
+#~ msgstr "번역하신분"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr "ì„ íƒì§€ì—ì„œ 고르세요. ì„ íƒí•œê²ƒì€ ì´ìš©ê°€ëŠ¥í•œ ì„ íƒì§€ì— 없습니다."
+
+#~ msgid "Enter a list of values."
+#~ msgstr "ê°’ 목ë¡ì„ 입력하세요."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "유효한 ì„ íƒì§€ì—ì„œ 고르세요. %s는 ì´ìš© 가능한 ì„ íƒì§€ì¤‘ì— ì—†ìŠµë‹ˆë‹¤."
+
+#~ msgid "This field is required."
+#~ msgstr "ì´ í•„ë“œëŠ” 필수 항목입니다."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "유효한 ê°’ì„ ìž…ë ¥í•˜ì„¸ìš”."
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr "허용ë˜ëŠ” ê°’ì€ ìµœëŒ€ %(max)dìžìž…니다 (ìž…ë ¥í•œê²ƒì€ %(length)dìž ìž…ë‹ˆë‹¤)."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr "허용ë˜ëŠ” ê°’ì€ ìµœì†Œí•œ %(min)dìžë¥¼ 넘어야 합니다 (ìž…ë ¥í•œê²ƒì€ %(length)dìž ìž…ë‹ˆë‹¤)."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "숫ìžë§Œ 입력하세요."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "%s보다 작거나 ê°™ì€ ê°’ë§Œ 허용ë©ë‹ˆë‹¤."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "%s보다 í¬ê±°ë‚˜ ê°™ì€ ê°’ë§Œ 허용ë©ë‹ˆë‹¤."
+
+#~ msgid "Enter a number."
+#~ msgstr "숫ìžë¥¼ 입력하세요."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "유효한 날짜를 입력하세요."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "유효한 ì‹œê°„ì„ ìž…ë ¥í•˜ì„¸ìš”."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "유효한 날짜/ì‹œê°„ì„ ìž…ë ¥í•˜ì„¸ìš”."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "유효한 ì´ë©”ì¼ ì£¼ì†Œë¥¼ 입력하세요."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "ì œì¶œëœ íŒŒì¼ì´ 없습니다. ì–‘ì‹ì—ì„œ ì¸ì½”딩 ìœ í˜•ì„ í™•ì¸í•˜ì„¸ìš”."
+
+#~ msgid "No file was submitted."
+#~ msgstr "ì œì¶œëœ íŒŒì¼ì´ 없습니다."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "제출한 파ì¼ì´ 비어있습니다."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr "유효한 ì´ë¯¸ì§€ë¥¼ 업로드 하세요. ë‹¹ì‹ ì´ ì—…ë¡œë“œí•œ 파ì¼ì€ ì´ë¯¸ì§€ê°€ 아니거나 ì†ìƒëœ ì´ë¯¸ì§€ 입니다."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "유효한 URLì„ ìž…ë ¥í•˜ì„¸ìš”."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "ì´ URLì€ ë§í¬ê°€ 깨진듯 합니다."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr "유효한 ì„ íƒì§€ì—ì„œ 고르세요. %(value)s는 ì´ìš© 가능한 ì„ íƒì§€ì¤‘ì— ì—†ìŠµë‹ˆë‹¤."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "유효한 IPv4 주소를 입력하세요."
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "새로고침 간격 > 0"
+
+#~ msgid "no uri"
+#~ msgstr "URI ì—†ìŒ"
+
+#~ msgid "Move To"
+#~ msgstr "다ìŒìœ¼ë¡œ ì´ë™í•˜ê¸°"
+
+#~ msgid "Error in Path."
+#~ msgstr "경로가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#~ msgid "Template"
+#~ msgstr "템플릿"
+
+#~ msgid "Button style"
+#~ msgstr "버튼 모양"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "ìžë™ìœ¼ë¡œ 새로고침 (ì´ˆ)"
+
+#~ msgid "Cache templates"
+#~ msgstr "ìºì‹œ 템플릿"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "ë³€ê²½ì‚¬í•­ì„ ì ìš©í•˜ë ¤ë©´ 웹UI를 수ë™ìœ¼ë¡œ 재시작해야합니다."
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "'%s'ì—ì„œ ì¸ì¦ì„œë¥¼ ì°¾ì„ ìˆ˜ 없습니다."
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "'%s'ì—ì„œ 키를 ì°¾ì„ ìˆ˜ 없습니다."
+
+#~ msgid "Current Password"
+#~ msgstr "현재 암호"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "새 암호(확ì¸)"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "예전 암호가 ì¼ì¹˜í•˜ì§€ 않습니다."
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "새 암호와 새 암호(확ì¸)ì´ ì„œë¡œ ì¼ì¹˜í•˜ì§€ 않습니다"
+
+#~ msgid "Sidebar"
+#~ msgstr "íƒìƒ‰ì°½"
+
+#~ msgid "Show sidebar"
+#~ msgstr "íƒìƒ‰ì°½ 표시"
+
+#~ msgid "Show zero hits"
+#~ msgstr "대ìƒì´ ì—†ì–´ë„ í‘œì‹œ"
+
+#~ msgid "Show trackers"
+#~ msgstr "트래커 ëª©ë¡ í‘œì‹œ"
+
+#~ msgid "Show keyword search"
+#~ msgstr "키워드 검색 표시"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "최대 다운 ì†ë„"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "최대 ì—… ì†ë„"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "ì¼ì • 비율ì—ì„œ ë°°í¬ ì¤‘ì§€"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "토런트 ì˜µì…˜ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#~ msgid "Download Location"
+#~ msgstr "다운로드 위치"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "ì¡°ê° í• ë‹¹"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "ì¤‘ì§€ëœ ìƒíƒœë¡œ 추가"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "URLì´ë‚˜ 토런트중 한가지를 ì„ íƒí•˜ì„¸ìš”, ì–‘ìª½ì„ ë™ì‹œì— 추가할 수 없습니다."
+
+#~ msgid "No data"
+#~ msgstr "ë°ì´í„°ê°€ 없습니다."
+
+#~ msgid "... and delete All files"
+#~ msgstr "... ê³¼ 모든 íŒŒì¼ ì‚­ì œ"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... ê³¼ ë‹¤ìš´ë¡œë“œëœ íŒŒì¼ ì‚­ì œ"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... ê³¼ 토런트 íŒŒì¼ ì‚­ì œ"
+
+#~ msgid "Active time"
+#~ msgstr "활성 시간"
+
+#~ msgid "Admin"
+#~ msgstr "관리"
+
+#~ msgid "Cancel"
+#~ msgstr "취소"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "ë°ëª¬ì— ì—°ê²°"
+
+#~ msgid "Connected to"
+#~ msgstr "다ìŒì— ì—°ê²°ë¨"
+
+#~ msgid "Connection Limit"
+#~ msgstr "연결 제한"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "ì—…/다운 ì†ë„ 제한"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge: 토런트 목ë¡"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge 로그ì¸"
+
+#~ msgid "Disk Space"
+#~ msgstr "ë””ìŠ¤í¬ ê³µê°„"
+
+#~ msgid "Do not download"
+#~ msgstr "다운로드 안함"
+
+#~ msgid "False"
+#~ msgstr "미ì ìš©"
+
+#~ msgid "File"
+#~ msgstr "파ì¼"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "키워드로 필터"
+
+#~ msgid "Force Recheck"
+#~ msgstr "강제 재검사"
+
+#~ msgid "From Session"
+#~ msgstr "세션ì—ì„œ 부터"
+
+#~ msgid "From Url"
+#~ msgstr "URLì—ì„œ 부터(_U)"
+
+#~ msgid "General"
+#~ msgstr "ì¼ë°˜"
+
+#~ msgid "High priority"
+#~ msgstr "ë†’ì€ ìš°ì„ ìˆœìœ„"
+
+#~ msgid "Highest priority"
+#~ msgstr "최고 우선순위"
+
+#~ msgid "Keyword"
+#~ msgstr "키워드"
+
+#~ msgid "Label torrent"
+#~ msgstr "토런트 ë¼ë²¨"
+
+#~ msgid "Move torrent"
+#~ msgstr "토런트 ì´ë™"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "들어오는 ì—°ê²°ì´ ì—†ìŒ"
+
+#~ msgid "Normal priority"
+#~ msgstr "보통 우선순위"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "ë°ëª¬ì— ì—°ê²°ë˜ì–´ 있지 ì•ŠìŒ"
+
+#~ msgid "Ok"
+#~ msgstr "양호"
+
+#~ msgid "Restart"
+#~ msgstr "재시작"
+
+#~ msgid "Save"
+#~ msgstr "저장"
+
+#~ msgid "Search"
+#~ msgstr "찾기"
+
+#~ msgid "Seed rank"
+#~ msgstr "ë°°í¬ ë“±ê¸‰"
+
+#~ msgid "Seeding time"
+#~ msgstr "ë°°í¬ ì‹œê°„"
+
+#~ msgid "True"
+#~ msgstr "ì ìš©"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "ì—…/다운 ì†ë„ 제한"
+
+#~ msgid "Update"
+#~ msgstr "ì—…ë°ì´íŠ¸"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "업로드 슬롯 제한"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s는 올바른 URLì´ ì•„ë‹™ë‹ˆë‹¤."
+
+#~ msgid "Downloading.."
+#~ msgstr "다운로드 중.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "다운로드 실패: %s"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "ì—°ê²° ì—†ìŒ.."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "ì´ í”„ë¡œê·¸ëž¨ì€ ìžìœ (free) 소프트웨어입니다; ìžìœ  소프트웨어 재단ì—ì„œ 발행한 GNU 공개 ë¼ì´ì„¼ìŠ¤ì˜ ì¡°ê±´ì— ë§žê²Œ 수정하여(하거나) "
+#~ "ìž¬ë°°í¬ í• ìˆ˜ 있습니다; ë¼ì´ì„¼ìŠ¤ëŠ” 버전 3 í˜¹ì€ (본ì¸ì´ ì›í•œë‹¤ë©´) 최신 ë²„ì „ì¤‘ì— ì„ íƒí• ìˆ˜ 있습니다. ì´ í”„ë¡œê·¸ëž¨ì´ ìœ ìš©í•˜ê²Œ ì´ìš©ë˜ê¸¸ "
+#~ "ë°”ë¼ëŠ” 마ìŒìœ¼ë¡œ ë°°í¬í•©ë‹ˆë‹¤ë§Œ, ì–´ë– í•œ ë³´ì¦ë„ 하지 않습니다; 즉 묵시ì ì¸ ìƒí’ˆì„± ë³´ì¦ì„ 하지 않으며 ì´ ë©´ì±…ì¡°í•­ì— ê¸°ìˆ ëœê²ƒ 처럼 ê°œì¸ì ì¸ "
+#~ "ìš©ë„ì— ì í•©í•©ë‹ˆë‹¤. 보다 ìžì„¸í•œ ë‚´ìš©ì€ GNU 공개 ë¼ì´ì„¼ìŠ¤ë¥¼ 참고하길 ë°”ëžë‹ˆë‹¤. GNU 공개 ë¼ì´ì„¼ìŠ¤ì˜ ì‚¬ë³¸ì€ ì´ í”„ë¡œê·¸ëž¨ê³¼ 함께 "
+#~ "받으셨ì„ê²ë‹ˆë‹¤; 만약 ì°¾ì„수 없다면 다ìŒì„ 참조 하세요 <http://www.gnu.org/licenses>. In addition, "
+#~ "as a special exception, the copyright holders give permission to link the "
+#~ "code of portions of this program with the OpenSSL library. You must obey the "
+#~ "GNU General Public License in all respects for all of the code used other "
+#~ "than OpenSSL. If you modify file(s) with this exception, you may extend this "
+#~ "exception to your version of the file(s), but you are not obligated to do "
+#~ "so. If you do not wish to do so, delete this exception statement from your "
+#~ "version. If you delete this exception statement from all source files in the "
+#~ "program, then also delete it here."
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>ê³„ì† í•˜ì‹œë ¤ë©´ 암호를 입력하세요</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Delugeê°€ 암호로 보호ë˜ì–´ 있습니다!</big></b>"
diff --git a/deluge/i18n/ku.po b/deluge/i18n/ku.po
new file mode 100644
index 0000000..3a2b53d
--- /dev/null
+++ b/deluge/i18n/ku.po
@@ -0,0 +1,3754 @@
+# Kurdish translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2007-11-30 11:54+0000\n"
+"Last-Translator: Erdal Ronahi <erdal.ronahi@gmail.com>\n"
+"Language-Team: Kurdish <ku@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Şîfre:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Ji:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Peldankekê Hilbijêre"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Cihê Daxistinê</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Leza Daxistinê"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Bêsînor"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Çalak"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Wekî din..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Jêr"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Jor"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Daxistin"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Tor"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Yên Din"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Pêvek"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Mezinahî"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Nav"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Pel"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "Torrentê _lêzêde bike"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Sererastkirin"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Nîşandan"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Darikê amûran"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Sitûn"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Alîkarî"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Torrentê lêzêde bike"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Torrentê Rake"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Behndan"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Bidomîne"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Vebijark"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Rewşa trackerê:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Tekilî:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Belavker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Parçe:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Şandî:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Daxistî:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># ji pelan:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Mezinahî:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Nav:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Rêç:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Hûragahî"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrent</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Ber bi hundir re:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Ast:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Ber bi derve re:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Torrentê Rake"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Lez:</b>"
+
+#~ msgid "Details"
+#~ msgstr "Kîtekît"
+
+#~ msgid "Files"
+#~ msgstr "Pel"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Pelê .torrent jê bibe"
+
+#~ msgid "Select All"
+#~ msgstr "Hemû Hilbijêre"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Server"
+#~ msgstr "Pêşkêşker"
+
+#~ msgid "Username"
+#~ msgstr "Navê bikarhêner"
+
+#~ msgid "Password"
+#~ msgstr "Şîfre"
+
+#~ msgid "_Quit"
+#~ msgstr "_Derketin"
+
+#~ msgid "Unknown"
+#~ msgstr "Nenas"
+
+#~ msgid "Remove"
+#~ msgstr "Rakirin"
+
+#~ msgid "Add"
+#~ msgstr "Lêzêdekirin"
+
+#~ msgid "Speed"
+#~ msgstr "Lez"
diff --git a/deluge/i18n/la.po b/deluge/i18n/la.po
new file mode 100644
index 0000000..6ce9ce8
--- /dev/null
+++ b/deluge/i18n/la.po
@@ -0,0 +1,3727 @@
+# Latin translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2007-01-22 20:00+0000\n"
+"Last-Translator: Matthias Benkard <login@mail.matthias.benkard.de>\n"
+"Language-Team: Latin <la@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Velocitas dandi:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Velocitas arcessendi:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Emptor"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Magnitudo"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Omna data"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Coniunctiones"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Nomen"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Donantes"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Socii"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "Unknown"
+#~ msgstr "Ignotum"
+
+#~ msgid "Download"
+#~ msgstr "Arcessere"
+
+#~ msgid "Upload"
+#~ msgstr "Donare"
+
+#~ msgid "Yes"
+#~ msgstr "Sic"
+
+#~ msgid "No"
+#~ msgstr "Non"
diff --git a/deluge/i18n/languages.py b/deluge/i18n/languages.py
new file mode 100644
index 0000000..49dc530
--- /dev/null
+++ b/deluge/i18n/languages.py
@@ -0,0 +1,117 @@
+# -*- coding: utf-8 -*-
+#
+# This file is public domain.
+#
+
+from __future__ import unicode_literals
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+
+# Deferred translation
+def _(message):
+ return message
+
+
+# Languages we provide translations for, out of the box.
+LANGUAGES = {
+ 'af': _('Afrikaans'),
+ 'ar': _('Arabic'),
+ 'ast': _('Asturian'),
+ 'az': _('Azerbaijani'),
+ 'bg': _('Bulgarian'),
+ 'be': _('Belarusian'),
+ 'bn': _('Bengali'),
+ 'br': _('Breton'),
+ 'bs': _('Bosnian'),
+ 'ca': _('Catalan'),
+ 'cs': _('Czech'),
+ 'cy': _('Welsh'),
+ 'da': _('Danish'),
+ 'de': _('German'),
+ 'el': _('Greek'),
+ 'en': _('English'),
+ 'en_AU': _('English (Australia)'),
+ 'en_CA': _('English (Canada)'),
+ 'en_GB': _('English (United Kingdom)'),
+ 'eo': _('Esperanto'),
+ 'es': _('Spanish'),
+ 'es-ar': _('Argentinian Spanish'),
+ 'es-mx': _('Mexican Spanish'),
+ 'es-ni': _('Nicaraguan Spanish'),
+ 'es-ve': _('Venezuelan Spanish'),
+ 'et': _('Estonian'),
+ 'eu': _('Basque'),
+ 'fa': _('Persian'),
+ 'fi': _('Finnish'),
+ 'fr': _('French'),
+ 'fy': _('Frisian'),
+ 'ga': _('Irish'),
+ 'gl': _('Galician'),
+ 'he': _('Hebrew'),
+ 'hi': _('Hindi'),
+ 'hr': _('Croatian'),
+ 'hu': _('Hungarian'),
+ 'ia': _('Interlingua'),
+ 'id': _('Indonesian'),
+ 'is': _('Icelandic'),
+ 'it': _('Italian'),
+ 'iu': _('Inuktitut'),
+ 'ja': _('Japanese'),
+ 'ka': _('Georgian'),
+ 'kk': _('Kazakh'),
+ 'km': _('Khmer'),
+ 'kn': _('Kannada'),
+ 'ko': _('Korean'),
+ 'ku': _('Kurdish'),
+ 'la': _('Latin'),
+ 'lb': _('Luxembourgish'),
+ 'lt': _('Lithuanian'),
+ 'lv': _('Latvian'),
+ 'mk': _('Macedonian'),
+ 'ml': _('Malayalam'),
+ 'mn': _('Mongolian'),
+ 'ms': _('Mayaly'),
+ 'my': _('Burmese'),
+ 'nb': _('Norwegian Bokmal'),
+ 'ne': _('Nepali'),
+ 'nds': _('Low German'),
+ 'nl': _('Dutch'),
+ 'nn': _('Norwegian Nynorsk'),
+ 'os': _('Ossetic'),
+ 'pa': _('Punjabi'),
+ 'pl': _('Polish'),
+ 'pms': _('Piedmontese'),
+ 'pt': _('Portuguese'),
+ 'pt_BR': _('Brazilian Portuguese'),
+ 'ro': _('Romanian'),
+ 'ru': _('Russian'),
+ 'sk': _('Slovak'),
+ 'sl': _('Slovenian'),
+ 'si': _('Sinhalese'),
+ 'sq': _('Albanian'),
+ 'sr': _('Serbian'),
+ 'sr-latn': _('Serbian Latin'),
+ 'sv': _('Swedish'),
+ 'sw': _('Swahili'),
+ 'ta': _('Tamil'),
+ 'te': _('Telugu'),
+ 'th': _('Thai'),
+ 'tl': _('Tagalog'),
+ 'tlh': _('Klingon'),
+ 'tr': _('Turkish'),
+ 'tt': _('Tatar'),
+ 'udm': _('Udmurt'),
+ 'uk': _('Ukrainian'),
+ 'ur': _('Urdu'),
+ 'vi': _('Vietnamese'),
+ 'zh_CN': _('Chinese (Simplified)'),
+ 'zh_HK': _('Chinese (Hong Kong)'),
+ 'zh-hans': _('Simplified Chinese'),
+ 'zh-hant': _('Traditional Chinese'),
+ 'zh_TW': _('Chinese (Taiwan)'),
+}
+
+del _
diff --git a/deluge/i18n/lt.po b/deluge/i18n/lt.po
new file mode 100644
index 0000000..d79c27e
--- /dev/null
+++ b/deluge/i18n/lt.po
@@ -0,0 +1,4720 @@
+# Lithuanian translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-10-29 11:06+0000\n"
+"Last-Translator: Nerijus Arlauskas <Unknown>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Juodasis sąrašas"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Parsiųsti naują blokavimo sąrašą ir jį importuoti."
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Parsiuntimas"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "IÅ¡siuntimas"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Parsiuntimai"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Susijungimų valdymas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>Ar tikrai norite pašalinti pasirinktą torentą?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Pašalinti pasirinktą torentą"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Susijungimų valdymas</b></big>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Naudoti kompaktišką vietos paskyrimą"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Papildomi tinklo nustatymai</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Maks. bandymų susijungti kiekis per sekundę:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Maks. dalinų susijungimų kiekis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "Maksimalus susijungimų kiekis. -1 yra neribotas."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Bendras srauto naudojimas</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "Maks. susijungimų kiekis vienam torentui. -1 yra neribotas."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Klasikinis veikimas paslÄ—ps daugumÄ… serviso funkcionalumo ir elgsis tarsi "
+"Deluge būtų vientisa programa. Naudokite šį nustatymą, jei nenorite Deluge "
+"serviso suteikiamų papildomų galimybių. Kad ši parinktis įsigaliotų, reikės "
+"perkrauti Deluge."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Padėkite mums dar labiau patobulinti Deluge informuodami apie jūsų naudojamą "
+"Python versijÄ…, PyGTK versijÄ…, operacinÄ—s sistemos ir procesoriaus tipus. "
+"Jokia kita informacija nebus siunÄiama."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Visi aktyvÅ«s parsiunÄiami:"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Atverti aplankÄ…"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "_Priverstinai patikrinti"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "_Susijungimų kiekio riba"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Maks. prisijungimų kiekis per sekundę"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Įsitikinkite, kad reikšmė turi ne daugiau simbolių nei %(max)d (dabar jų "
+#~ "%(length)d)."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Įsitikinkite, kad reikšmė turi ne mažiau simbolių nei %(min)d (dabar jų "
+#~ "%(length)d)."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr ""
+#~ "Failas nebuvo priskirtas. Patikrinkite, ar teisingas formos kodavimo tipas."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr ""
+#~ "Įsitikinkite, kad skaitmenų prieš kablelį kiekis yra ne didesnis nei %s."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Įsitikinkite, kad skaitmenų kiekis yra ne didesnis nei %s."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr ""
+#~ "Įsitikinkite, kad skaitmenų po kablelio kiekis yra ne didesnis nei %s."
+
+#~ msgid "Refresh status"
+#~ msgstr "Atnaujinimo būsena"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Automatiškai įkelti aplanką"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Å is aplankas neegzistuoja."
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Serverio pavadinimas:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Prievadas:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Vartotojo vardas:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Slaptažodis:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Nuo:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Įjungtas"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Nustatymai"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Pasirinkite aplankÄ…"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Parsiuntimo vieta</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Maks. išsiuntimo greitis:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Maks. susijungimų kiekis:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Maks. išsiuntimo kanalų kiekis:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Maks. parsiuntimo greitis:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Srautas</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Baigti skleisti pasiekus santykį:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Pašalinti pasiekus santykį"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Viršus"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "ApaÄia"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>EilÄ—</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Parinktys"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Parsisiuntimo limitas:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Siuntimo limitas"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Aktyvūs torentai"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>LÄ—tinantys nustatymai</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Neteisinga žymė, teisingi simboliai: [a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Išvalyti žymę"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Žymė jau yra"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Nežinoma žymė"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Nežinomas torentas"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Žymė"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Žymės _parinktys"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "P_ašalinti žymę"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "Įkelt_i žymę"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Žymių parinktys"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "Žymės nustatymai"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Išsiuntimo kanalų kiekis:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "IÅ¡siuntimo greitis:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Parsiuntimo greitis:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Susijungimai:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Pritaikyti torento maksimalias parinktis:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maksimumas"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Valdoma automatiškai"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Pritaikyti eilÄ—s parinktis:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "EilÄ—"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Perkelti parsiųstus failus į:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Pritaikyti vietos parinktis:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Vieta"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(viena eilutÄ— vienam serveriui)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Nustatyti žymę automatiškai:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Sekimo serveriai"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Pridėti žymę"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Pridėti Žymą</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Pavadinimas:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Norėdami pakeisti, įkelti ar pašalinti žymes, naudokite šoninę juostą. "
+"</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Žymės</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Išskleisti į:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Sukurti poaplankį torento vardu"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Šis pasirinkimas leis sukurti torento vardo poaplankį pasirinktame "
+"išskleidimo aplanke ir sudėti išskleistus failus ten."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Bendra</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Įjungti web sąsają"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Įjungti SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Klausomas prievadas:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Nustatymai</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "eMule IP sąrašas (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer tekstas (Zipped)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Tekstas (Nesuspaustas)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Neteisinga pradžia"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Neteisingas magiškas kodas"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Neteisinga versija"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL adresas:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Dienas (-Ä…)"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Ieškoti naujo sąrašo kas:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Įkelti blokavimo sąrašą startuojant"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Jei reikia, parsiųsti blokavimo sąrašą ir importuoti failą."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Patikrinti parsiuntimÄ… ir importuoti"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Privalomai siųsti ir importuoti"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Blokavimo sąrašas atnaujintas"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Parinktys</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Tipas:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Data:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Failo dydis:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Informacija</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torentas baigtas"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torentas pridÄ—tas"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Vykdyti"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Įvykis"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Komanda"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>PridÄ—ti komandÄ…</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Komandos</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Atnaujinimas sÄ—kmingas"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Atnaujinimas nusiųstas"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "DÄ—mesio!"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Klaida"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Afganistanas"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Alando salos"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Albanija"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Alžyras"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Amerikos Samoa"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andora"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Angilija"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antarktis"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antikva ir Barbuda"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Argentina"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "ArmÄ—nija"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "Australija"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Austrija"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Azerbaidžanas"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Bahamai"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bachreinas"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Bangladešas"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbadosas"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Baltarusija"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Belgija"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Belizas"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Beninas"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermudai"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Butanas"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Bolivija"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnija ir Hercegovina"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Botsvana"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "BuvÄ— sala"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brazilija"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Indijos vandenyno britų sritis"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "BrunÄ—jaus Darusalamas"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Bulgarija"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Burundis"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Kambodža"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Kamerūnas"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Kanada"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Žaliasis Kyšulys"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Kaimanų salos"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "CentrinÄ—s Afrikos Respublika"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "ÄŒadas"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "ÄŒilÄ—"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Kinija"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Kalėdų sala"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Kokosų (Keelingo) salos"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Kolumbija"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Komorai"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Kongas"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Kongo DemokratinÄ— Respublika"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Kuko salos"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Kosta Rika"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Dramblio Kaulo Krantas"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "Kroatija"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Kuba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Kipras"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "ÄŒekijos Respublika"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Danija"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Džibutis"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominika"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Dominikos Respublika"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Ekvadoras"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Egiptas"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "Salvadoras"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Pusiaujo GvinÄ—ja"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "EritrÄ—ja"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Estija"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Etiopija"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falklando (Malvinų) salos"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Farerų salos"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fidžis"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Suomija"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Prancūzija"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "Prancūzijos Gviana"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "Prancūzijos Polinezija"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "Prancūzijos pietų ir antarkties sritys"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabonas"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambija"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Gruzija"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "Vokietija"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "JungtinÄ— KaralystÄ—"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Gana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltaras"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Graikija"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Grenlandija"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "GvadelupÄ—"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guamas"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Gvatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Gernsis"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "GvinÄ—ja"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Bisau-GvinÄ—ja"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Gajana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haitis"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Heardo ir McDonaldo salos"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Å ventasis Sostas (Vatikano Miesto ValstybÄ—)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Hondūras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Honkongas"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Vengrija"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Islandija"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "Indija"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonezija"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Irano Islamo Respublika"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Irakas"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Airija"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Meno sala"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Izraelis"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italija"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaika"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japonija"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Džersis"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordanija"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazachija"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenija"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribatis"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "KorÄ—jos Liaudies DemokratinÄ— Respublika"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "KorÄ—jos Respublika"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuveitas"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kirgizija"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Laoso Liaudies DemokratinÄ— Respublika"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Latvija"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Libanas"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotas"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberija"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libija"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Lichtenšteinas"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Lietuva"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Liuksemburgas"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Makao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Makedonija, buvusi Jugoslavijos Respublika"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagaskaras"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malavis"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malaizija"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldyvai"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Malis"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Maršalo salos"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinika"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauritanija"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauricijus"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Majotas"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Meksika"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Mikronezijos FederacinÄ—s Valstijos"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldova"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monakas"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolija"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Juodkalnija"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montseratas"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Marokas"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambikas"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Mianmaras"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibija"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepalas"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Olandija"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Olandijos Antilai"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Naujoji Kaledonija"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Naujoji Zelandija"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nikaragva"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Nigeris"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigerija"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "NiujÄ—"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Norfolko sala"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Šiaurės Marianų salos"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norvegija"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Omanas"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistanas"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palestinos teritorija, okupuota"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua Naujoji GvinÄ—ja"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paragvajus"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filipinai"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitkernas"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Lenkija"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugalija"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rikas"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Kataras"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reunionas"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Rumunija"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Rusijos Federacija"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Ruanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Å vento Baltramiejaus sala"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Å v. Elenos sala"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Sent Kitsas ir Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Å ventoji Liucija"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Å ventasis Martynas"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Sen Pjeras ir Mikelonas"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Å v. Vincentas ir Grenadinai"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marinas"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "San TomÄ— ir PrinsipÄ—"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Saudo Arabija"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegalas"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbija"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seišeliai"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Siera LeonÄ—"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapūras"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slovakija"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "SlovÄ—nija"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Saliamono salos"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalis"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Pietų Afrika"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Pietų Gruzija ir pietų SandviÄo salos"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Ispanija"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Å ri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudanas"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Surinamas"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbardo ir Jan Majen salos"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Svazilendas"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Å vedija"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Å veicarija"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Sirijos Arabų Respublika"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Taivanas, Kinijos provincija"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tadžikistanas"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzanijos JungtinÄ— Respublika"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Tailandas"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Rytų Timoras"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togas"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidadas ir Tobagas"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunisas"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Turkija"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "TurkmÄ—nija"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Terkso ir Kaikoso salos"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukraina"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Jungtiniai Arabų Emyratai"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "JungtinÄ—s Amerikos Valstijos"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "JAV mažosios aplinkinės salos"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Urugvajus"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Uzbekija"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venesuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnamas"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Mergelių salos, Jungtinė Karalystė"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Mergelių salos, JAV"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Volisas ir Futūna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Vakarų Sachara"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Jemenas"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambija"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "ZimbabvÄ—"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Atsijungęs"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Prisijungęs"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Prisijungta"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Procesas neegzistuoja"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Procesas nepaleistas"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Serveris jungiamas PID rėžimu"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Adresas"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Klientas"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Eiga"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Parsiuntimo greitis"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "IÅ¡siuntimo greitis"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torentas"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torentai eilÄ—je"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torentas eilÄ—je"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Neribojama"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Aktyvuotas"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Kita.."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Parsiuntimas:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "IÅ¡siuntimas:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Nustatyti Maksimalų Atsiuntimo Greitį"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Nustatyti Maksimalų Išsiuntimo Greitį"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torentas baigtas"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Šiuo laišku norima pranešti, kad Deluge baigė siųsti %(name)s iš "
+"%(num_files)i bylų (-os).\n"
+"Norėdami nebegauti šių pranešimų tiesiog išjunkite pranešimus el. paštu "
+"Deluge nustatymuose."
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Tinklas"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Duom. srautas"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "SÄ…saja"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Kita"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Foninis servisas"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Tarpinis serveris (proxy)"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Saugykla"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Įskiepiai"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Papildinys"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Pasirinkite papildinį"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Papildinio priedai"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Failo pavadinimas"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Dydis"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Netinkama byla"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Toks pats torentas"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Negalima dukart pridÄ—ti to paties torento."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Nepavyksta nustatyti bylos svarbos!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Pasirinkite .torrent failÄ…"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Torrent failai"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Visi failai"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Netinkamas adresas"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Siuntimas nepavyko"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "GrupÄ—"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Sekimo serveris"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Pasirinkite failÄ…"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Pasirinkite aplankÄ…"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "IÅ¡saugoti .torrent failÄ…"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Neprisijungta"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Susijungimai"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Parsiuntimo greitis"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "IÅ¡siuntimo greitis"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Protokolo JudÄ—jimo Parsiuntimas/IÅ¡siuntimas"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT klientai"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "NÄ—ra įeinanÄių prisijungimų!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Nustatyti Maksimalų Prisijungimų SkaiÄių"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torentai"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Žymės"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Visi"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "ParsiunÄiama"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Skleidžiama"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Pristabdyta"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Tikrinama"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "EilÄ—je"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Joks"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Nėra Žymos"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Prisijungimo adresas"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Klaida pridedant kompiuterį"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Išjungti klasikinį rėžimą?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Atrodo, kad Deluge procesas (deluged) jau veikia.\n"
+"Jums reiktų arba jį sustabdyti, arba išjungti klasikinį rėžimą."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Nepavyko paleisti branduolio"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"Nepavyko paleisti branduolio dalies, reikalingos klasikiniam Deluge "
+"rėžimui.\n"
+"Prašome peržiūrėti detalesnę inforamciją, pateiktą žemiau:"
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Kadangi paleidžiant klasikiniu rėžimu įvyko klaida, ar norėtumėte tęsti jį "
+"išjungdami?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Klaida paleidžiant procesą"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"Paleidžiant procesą įvyko klaida. Pamėginkite paleisti jį iš terminalo, "
+"norÄ—dami pamatyti, kokia tai klaida."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Įjungta"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "IÅ¡jungta"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Nustatyti neribojamÄ…"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Pasirinkite aplanką, į kurį perkelsite failus"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Nustatyti Maksimalų IÅ¡siuntimo Vietų SkaiÄių"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Prioritetas"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "IÅ¡samiau:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Pavadinimas"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Parsiųsta"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Išsiųsta"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "SkleidÄ—jai"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "SiuntÄ—jai ir skleidÄ—jai"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Likęs laikas"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Santykis"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Pasiekiamumas"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Įdėtas"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Failas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "Į_kelti torentą"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "Su_kurti torentÄ…"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Keisti"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Susijungimų valdymas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torentas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Vaizdas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "Į_rankinė"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "Å oninÄ— _juosta"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "BÅ«senos _juosta"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "_KortelÄ—s"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Stulpeliai"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "Å oninÄ— _juosta"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Rodyti _tuÅ¡Äias kategorijas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Rodyti _sekimo serverius"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Žinynas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Dažniausiai užduodami klausimai"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Įkelti torentą"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Įkelti torentą"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Pašalinti torentą"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Pašalinti torentą"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Sustabdyti pasirinktus torentus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "PauzÄ—"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Pratęsti pasirinktus torentus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Pratęsti"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Perkelti torentą eilėje aukštyn"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Eilėje aukštyn"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Perkelti torentą eilėje žemyn"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Eilėje žemyn"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Nustatymai"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_IÅ¡skleisti visus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "N_esiųsti"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Normalus prioritetas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Aukštas prioritetas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "AukÅ¡Äiau_sias prioritetas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Valdoma automatiškai:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Skleidimo laipsnis:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Skleidimo laikas:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Aktyvus laikas:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Sekimo serverio būsena:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Prieinamumas:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Dalyviai:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>SkleidÄ—jai:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Dalys:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Liko:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Kitas atnaujinimas:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Dalinimosi santykis:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Išsiųsta:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Parsiųsta:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Įdėjimo data:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "BÅ«sena"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Atsiliepimai:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>Failų kiekis:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Maišos kodas (hash):</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Sekimo serveris:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Bendras dydis:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Pavadinimas:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Kelias:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>BÅ«sena:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_IÅ¡samiau"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Failai"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "SiuntÄ—jai ir skleidÄ—jai"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Perkelti baigtus:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Privatus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "PirmenybÄ— pirmam/paskutiniui"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_Keisti sekimo serverius"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Parinktys"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Pašalinti torentą?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>Susietas .torrent failas bus ištrintas!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Parsiųsti duomenys bus ištrinti!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Atnaujinimas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Nauja versija jau išleista!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Nauja versija:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Dabar naudojama versija:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Ateityje neberodyti Å¡io lango"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Atverti puslapį"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Įkelti dalyvį pagal jo IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "Pažymėti _viską"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Sustabdyti visus"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Pratęsti pažymėtus torentus"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Pra_tęsti visus"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Įkelti torentus"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Informacijos maiša (Info_hash)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_Pašalinti"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torentai</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Fai_lai"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Pilnas"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Kompaktiškas"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Vietos paskyrimas</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Maks. parsiuntimo greitis:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Maks. išsiuntimo greitis:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Įkelti susta_bdytoje būsenoje"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Prioritetas pirmoms/paskutinÄ—ms dalims"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Atstatyti pradines parinktis"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Pritaikyti visiems"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "PridÄ—ti URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>IÅ¡ URL adreso</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Įkelti maišos kodą (infohash)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>IÅ¡ \"Infohash\"</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Informacijos maiša (infohash):"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Sekimo serveriai:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Sukurti TorentÄ…"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Sukurti torentÄ…</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "_Aplankas"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Nutolęs adresas"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Failai</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Autorius:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Komentarai:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Informacija"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Žiniatinkliu platinami failai"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Dalies dydis:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Nustatyti \"privaÄiu\""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Įkelti šį torentą į siuntimus"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Įveskite nutolusį adresą"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Nutolęs adresas</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Adresas:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Torento kūrimas"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "IÅ¡saugoti .torrent kaip"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>IÅ¡saugoti .torrent failÄ…</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Torentai eilÄ—je"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Įkelti torentus eilėje</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Automatiškai įkelti torentus prisijungus"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "žyma"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Įkelti dalyvį"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Įkelti dalyvį</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "serveris:prievadas"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Įkelti serverį"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Paleisti lokalų servisą"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Automatiškai prisijungti prie pasirinkto serverio startuojant"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Jei reikia, automatiškai paleisti lokaliai"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Nerodyti Å¡io dialogo paleidimo metu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Parsiuntimai</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Automatiškai įkelti .torrent failus iš:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Parsiųsti į:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Kopijuoti .torrent failus į:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Aplankai</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Pilnas disko vietos paskyrimas"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Pilnas paskyrimas rezervuoja visą reikiamą vietą torento išsaugojimui, taip "
+"užkirsdamas kelią disko fragmentavimuisi."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+"Kompaktiškas paskyrimas rezervuoja disko vietą tik tuomet, kai to reikia"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Padidinti pirmų ir paskutinių torento dalių prioritetą"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Padidinti pirmų ir paskutinių torento failo dalių prioritetą"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Torentus pridėti, bet jų kol kas nesiųsti"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Tinklas</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Naudoti atsitiktinius prievadus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge automatiškai parinks skirtingą prievadą kiekvieną kartą."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Aktyvus prievadas:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Iki:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Patikrinti aktyvų prievadą"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Įeinantys prievadai</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>IÅ¡einantys prievadai</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Ä®veskite sÄ…sajos, suteikianÄios galimybÄ™ susijungti torentų tinkle, IP "
+"adresÄ…. Palikite laukelį tuÅ¡ÄiÄ…, jei naudosite programiÅ¡kai nustatytÄ…jį."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>SÄ…saja</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"Serviso tipo (TOS) baitas kiekvieno kitiems (\"peers\" ir \"web seeds\") "
+"siunÄiamo paketo IP antraÅ¡tÄ—je. Turi bÅ«ti Hex tipo."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Dalyvio (peer) TOS baitas:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT prievadų peradresavimas"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Peer Exchange"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+"Lokalių Servisų Paieška randa siutėjus ir skleidėjus vietiniame tinkle."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "DHT gali padidinti susijungimų ir Å¡altinių skaiÄių."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Įeinantis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Lygis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Priverstinis\n"
+"Įjungtas\n"
+"IÅ¡jungtas"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Susijungimo patvirtinimas\n"
+"Visas srautas\n"
+"Vienas iš dviejų"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "IÅ¡einantis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Šifruoti visą duomenų srautą"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Å ifravimas</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Srautas</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr "Maksimalus išsiuntimo greitis visiems torentams. -1 yra neribotas."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Maks. išsiuntimo greitis (KiB/s)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Maks. prisijungimų kiekis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr "Maks. išsiuntimo kanalų kiekis visiems torentams. -1 yra neribotas."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Maks. išsiuntimo kanalų kiekis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr "Maks. parsiuntimo greitis visiems torentams. -1 yra neribotas."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Maks. parsiuntimo greitis (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Ignoruoti apribojimus vietiniame tinkle"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "GreiÄio limito IP iÅ¡laidos"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Jei pažymÄ—ta, numatomos TCP/IP iÅ¡laidos yra atimamos iÅ¡ greiÄio limitų, kad "
+"būtų išvengta visuotinių srauto limitų."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr "Maks. išsiuntimo kanalų kiekis vienam torentui. -1 yra neribotas."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Srauto naudojimas torentui</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>SÄ…saja</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Įjungti"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Klasikinis veikimas</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Rodyti sesijos greitį lango pavadinime"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Pagrindinis langas</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Visada rodyti"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Parodyti virš kitų langų"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Torentų įkėlimo langas</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Įjungti sistemos dėklo ženkliuką"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Užveriant nukelti į sistemos dėklą"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Paleisti sistemos dÄ—kle"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Apsaugoti sistemos dėklą slaptažodžiu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Sistemos dÄ—klas</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Kita</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "PerspÄ—ti apie atnaujinimus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr "Deluge patikrins mūsų serverius ir praneš apie atnaujinimus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Atnaujinimai</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Taip, siųsti anoniminę statistiką"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Sistemos informacija</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Vieta:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Jei Deluge nepavyks rasti duomenų bazės bylos šioje vietoje, ji naudosis DNS "
+"paslauga vartotojo Å¡aliai nustatyti."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP duombazÄ—</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Atverti Magnet nuorodas su Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Servisas</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Serviso prievadas:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Prievadas</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Leisti nuotolinius prisijungimus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Susijungimai</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Periodiškai ieškoti atnaujinimų interneto puslapyje"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Kita</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>EilÄ—</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Naujus torrentus perkelti į eilės viršų"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Visi aktyvūs skleidžiami:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Visi aktyvūs:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "NeįskaiÄiuoti lÄ—tų torentų"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Aktyvūs torentai</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Dalinimosi santykio riba:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Skleidimo laiko santykis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Skleidimo laikas (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Baigti skleidimÄ…, kai santykis pasieks:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Pašalinti torentą, kai santykis pasiektas"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Skleidimas</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Tarpinis serveris (proxy)</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Serveris:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Joks\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 su autentifikacija\n"
+"HTTP\n"
+"HTTP su autentifikacija"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Taškas</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Web sÄ—kla</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Trakeris</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Atmintis</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Atminties dydis (16 KiB dydžio atkarpomis)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Sekundžių skaiÄius, rodantis, kiek laiko praeis nuo paskutinÄ—s dalies raÅ¡ymo "
+"į atmintį iki tol, kol ji bus įrašyta į diską. Pagal nutylėjimą 60 sekundžių."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Atminties galiojimo laikas (sekundÄ—mis):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"SkaiÄius 16KiB dydžio atkarpų, įraÅ¡ytų į diskÄ… nuo tada, kada Å¡ sesija "
+"prasidÄ—jo."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Įrašyta atkarpų:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr "SkaiÄius nuo sesijos pradžios padarytų raÅ¡ymo veiksmų."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Rašymo veiksmų:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"Reitingas (blocks_written - writes) / blocks_written parodo išsaugotų rašymo "
+"veiksmų santykį su visais išsaugotais rašymo veiksmais iš visų rašymo "
+"operacijų."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "Rašymo podėlio užklausų reitingas:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Rašymo</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Užklaustų iš torent variklio blokų kiekis (iš siuntėjų), kurie buvo "
+"aptarnauti iš disko ar podėlio."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Perskaityta atkarpų:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "Blokų, uptarnautų iš podėlio, kiekis."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "Blokų skaitymo užklausos:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "Podėlio užklausų reitingas skaitymo podėliui."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "Skaitymo podėlio užklausų reitingas:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr "Bendras atliktų skaitymo operacijų skaiÄius nuo seanso pradžios."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Skaitymo veiksmų:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Skaitymo</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Å iuo metu podÄ—lyje esanÄių 16 KB blokų skaiÄius, įskaitan ir skaitymo, "
+"rašymo podėlį."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Atminties dydis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Skaitymo atminties dydis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Dydis</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>BÅ«sena</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Papildiniai</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Versija:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Namų puslapis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Autoriaus e-paštas:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "Į_diegti papildinį"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "P_eržiūrėti papildinius"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "Surasti daugiau įskiepių"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "Rodyti _Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Pratęsti visus"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "Pa_rsiuntimo greiÄio riba"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_IÅ¡siuntimo greiÄio riba"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Išeiti ir sustabdyti serverį"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Pra_tęsti"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Par_inktys"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_EilÄ—"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Atnaujinti serverį"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "Pašalinti to_rentą"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "Keisti duomenų _vietą"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Išsiuntimo _kanalų riba"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "Valdoma _automatiškai"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Pašalinti pažymėtą torentą?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Jei pašalinsite duomenis, jie bus prarasti negrąžinamai."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Keisti sekimo serverius"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Keisti sekimo serverius</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Įkelti sekimo serverį"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Įkelti sekimo serverius</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Keisti sekimo serverį"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Keisti sekimo serverį</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Sekimo serveris:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Pašalinti su _Duomenimis"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Pašalinti _Torrent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Keisti duomenų vietą"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Keisti duomenų vietą</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Paskirties vieta:"
+
+#~ msgid "Unknown"
+#~ msgstr "Nežinomas"
+
+#~ msgid "seconds"
+#~ msgstr "sekundÄ—s"
+
+#~ msgid "Download"
+#~ msgstr "Siuntimas"
+
+#~ msgid "Upload"
+#~ msgstr "IÅ¡siuntimas"
+
+#~ msgid "Yes"
+#~ msgstr "Taip"
+
+#~ msgid "No"
+#~ msgstr "Ne"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Dalinimosi santykis"
+
+#~ msgid "Files"
+#~ msgstr "Failai"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Greitis:</b>"
+
+#~ msgid "Remove"
+#~ msgstr "Pašalinti"
+
+#~ msgid "Clear"
+#~ msgstr "IÅ¡valyti"
+
+#~ msgid "Select All"
+#~ msgstr "Pasirinkti visus"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "IÅ¡trinti .torrent failÄ…"
+
+#~ msgid "Speed"
+#~ msgstr "Greitis"
+
+#~ msgid "Graph"
+#~ msgstr "Grafikas"
+
+#~ msgid "Pieces"
+#~ msgstr "Dalys"
+
+#~ msgid "Details"
+#~ msgstr "IÅ¡sami informacija"
+
+#~ msgid "Server"
+#~ msgstr "Serveris"
+
+#~ msgid "Password"
+#~ msgstr "Slaptažodis"
+
+#~ msgid "Port"
+#~ msgstr "Prievadas"
+
+#~ msgid "New Password"
+#~ msgstr "Naujas slaptažodis"
+
+#~ msgid "Template"
+#~ msgstr "Å ablonas"
+
+#~ msgid "Text Only"
+#~ msgstr "Tik tekstas"
+
+#~ msgid "About"
+#~ msgstr "Apie"
+
+#~ msgid "# Of Files"
+#~ msgstr "Failų skaiÄius"
+
+#~ msgid "Eta"
+#~ msgstr "Liko"
+
+#~ msgid "Disable"
+#~ msgstr "IÅ¡jungti"
+
+#~ msgid "Logout"
+#~ msgstr "Atsijungti"
+
+#~ msgid "Queue Position"
+#~ msgstr "EilÄ—s pozicija"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Slaptažodis neteisingas, bandykite dar kartą"
+
+#~ msgid "Pause all"
+#~ msgstr "PauzÄ— visiems"
+
+#~ msgid "Login"
+#~ msgstr "Prisijungti"
+
+#~ msgid "Set"
+#~ msgstr "Nustatyti"
+
+#~ msgid "Resume all"
+#~ msgstr "Pratęsti visus"
+
+#~ msgid "Start"
+#~ msgstr "PradÄ—ti"
+
+#~ msgid "Type"
+#~ msgstr "Tipas"
+
+#~ msgid "From"
+#~ msgstr "IÅ¡"
+
+#~ msgid "Filters"
+#~ msgstr "Filtrai"
+
+#~ msgid "translate something"
+#~ msgstr "išverskite kažką"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Automatinis atnaujinimas:"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "atnaujinimas turi būti > 0"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Atnaujinti puslapį kiekvieną:"
+
+#~ msgid "Submit"
+#~ msgstr "Patvirtinti"
+
+#~ msgid "Config"
+#~ msgstr "Konfigūracija"
+
+#~ msgid "Add"
+#~ msgstr "Įkelti"
+
+#~ msgid "Ava"
+#~ msgstr "Pasiek."
+
+#~ msgid "Availability"
+#~ msgstr "Pasiekiamumas"
+
+#~ msgid "Next Announce"
+#~ msgstr "Kitas atnaujinimas"
+
+#~ msgid "General"
+#~ msgstr "Bendri"
+
+#~ msgid "Save"
+#~ msgstr "IÅ¡saugoti"
+
+#~ msgid "Reannounce"
+#~ msgstr "Atnaujinti dar kartÄ…"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Nustatyti delsties laikÄ…"
+
+#~ msgid "Torrent list"
+#~ msgstr "Torentų sąrašas"
+
+#~ msgid "Total Size"
+#~ msgstr "Bendras dydis"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Serverio būsena"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Išsiųsti torentą"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Įkelti kaip sustabdytą"
+
+#~ msgid "Download Location"
+#~ msgstr "Parsiuntimo vieta"
+
+#~ msgid "no uri"
+#~ msgstr "jokio uri"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Maks. susijungimų skaiÄius"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Maks. išsiuntimo greitis"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Maks. parsiuntimo greitis"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Kompaktiškas vietos paskyrimas"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Teikti prioritetÄ… pirmoms ir paskutinÄ—ms dalims"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Maks. išsiuntimo kanalų kiekis"
+
+#~ msgid "To"
+#~ msgstr "Ä®"
+
+#~ msgid "Random"
+#~ msgstr "Atsitiktinis"
+
+#~ msgid "Ports"
+#~ msgstr "Prievadai"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Pasirinkite adresÄ… arba torentÄ…, ne abu."
+
+#~ msgid "No data"
+#~ msgstr "Nėra duomenų"
+
+#~ msgid "Extra's"
+#~ msgstr "Papildomi"
+
+#~ msgid "Handshake"
+#~ msgstr "Susijungimo patvirtinimas"
+
+#~ msgid "Disabled"
+#~ msgstr "IÅ¡jungtas"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Mainline DHT"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Peer-Exchange"
+
+#~ msgid "Forced"
+#~ msgstr "Priverstinis"
+
+#~ msgid "Encryption"
+#~ msgstr "Å ifravimas"
+
+#~ msgid "Either"
+#~ msgstr "Vienas iš galimų"
+
+#~ msgid "Inbound"
+#~ msgstr "Įeinantis"
+
+#~ msgid "Outbound"
+#~ msgstr "IÅ¡einantis"
+
+#~ msgid "Level"
+#~ msgstr "Lygis"
+
+#~ msgid "Global"
+#~ msgstr "Globalus"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Neribojamas"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Maks. parsiuntimo greitis (Kib/s)"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Maks. dalinų susijungimų kiekis"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Automatinis įkėlimas įjungtas"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Išsaugoti .torrent failus į:"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Parsiųstus failus laikyti:"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Torento"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Visi aktyvūs išsiuntimai"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Visi aktyvūs torentai"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Visi aktyvūs parsiuntimai"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = neribojamas"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Įjungti papildinius"
+
+#~ msgid "Cache templates"
+#~ msgstr "Laikinosios saugyklos Å¡ablonai"
+
+#~ msgid "Button style"
+#~ msgstr "Mygtuko stilius"
+
+#~ msgid "Current Password"
+#~ msgstr "Esamas slaptažodis"
+
+#~ msgid "Text and image"
+#~ msgstr "Tekstas ir paveikslÄ—lis"
+
+#~ msgid "Image Only"
+#~ msgstr "Tik paveikslÄ—lis"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Naujas slaptažodis (patvirtinimui)"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Sustabdyti pasiekus santykį"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Šie pakeitimai buvo išsaugoti"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Pataisykite klaidas viršuje ir bandykite dar kartą"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Naujas slaptažodis neatitinka naujo slaptažodžio patvirtinimo"
+
+#~ msgid "Move To"
+#~ msgstr "Perkelti į"
+
+#~ msgid "Error in Path."
+#~ msgstr "Klaida adrese."
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Maks. išsiuntimo greitis (Kib/s)"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "Perkrauti servisą ir Web sąsają po šių nustatymų pakeitimo"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Senas slaptažodis neteisingas"
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Įveskite teisingą reikšmę."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Pasirinkite teisingÄ… variantÄ…. Pasirinkimas \"%s\" nÄ—ra galimas."
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Įveskite sąrašą reikšmių."
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Pasirinkite teisingą variantą. Šis variantas nėra vienas galimų variantų."
+
+#~ msgid "This field is required."
+#~ msgstr "Å is laukas yra privalomas."
+
+#~ msgid "Enter a number."
+#~ msgstr "Ä®veskite skaiÄių."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Įsitikinkite, kad ši reikšmė yra didesnė arba lygi %s."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Įsitikinkite, kad ši reikšmė yra mažesnė arba lygi %s."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Ä®veskite pilnÄ… skaiÄių."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Įveskite teisingą datą."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Įveskite teisingą laiką."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Įveskite teisingą datą/laiką."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Įveskite teisingą el. pašto adresą."
+
+#~ msgid "File"
+#~ msgstr "Failas"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Klaida torento parinktyse."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Failas nebuvo priskirtas."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Priskirtas failas buvo tuÅ¡Äias."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Įveskite teisingą adresą."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Å is adresas neatrodo teisingai suformuotas."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr ""
+#~ "Pasirinkite teisingą variantą. %(value)s variantas nėra vienas iš galimų."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Persiųskite teisingą paveiksliuką. Jūsų persiųstas failas arba nėra "
+#~ "paveiksliukas, arba yra sugadintas."
+
+#~ msgid "Statistics"
+#~ msgstr "Statistika"
+
+#~ msgid "Delete"
+#~ msgstr "IÅ¡trinti"
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Įveskite teisingą IPv4 adresą."
+
+#~ msgid "Connect"
+#~ msgstr "Prisijungti"
+
+#~ msgid "Queue Top"
+#~ msgstr "Eilėje viršuj"
+
+#~ msgid "Stop"
+#~ msgstr "Stabdyti"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "EilÄ—je gale"
+
+#~ msgid "Recheck"
+#~ msgstr "Pertikrinti"
+
+#~ msgid "Move"
+#~ msgstr "Perkelti"
+
+#~ msgid "Other.."
+#~ msgstr "Kitas..."
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge yra užrakintas"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge yra užrakintas slaptažodžiu\n"
+#~ "Norėdami pamatyti Deluge langą, prašome įvesti slaptažodį."
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torento santykis viršijo nustatytą stabdymui."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Tikrinti kas (dienomis):"
+
+#~ msgid "BlockList"
+#~ msgstr "Blokavimų Sąrašas"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "ParsiunÄiama %.2f%%"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Importuojama %s"
+
+#~ msgid "Import Now"
+#~ msgstr "Importuoti dabar"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Kiek kartų bandyti siųsti"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Įkelti serviso paleidimo metu"
+
+#~ msgid "Inactive"
+#~ msgstr "Neaktyvus"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Užblokuotos zonos: %s"
+
+#~ msgid "page 6"
+#~ msgstr "6 puslapis"
+
+#~ msgid "page 7"
+#~ msgstr "7 puslapis"
+
+#~ msgid "page 8"
+#~ msgstr "8 puslapis"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Įkelti torentus</b></big>"
+
+#~ msgid "_Quit"
+#~ msgstr "IÅ¡_eiti"
+
+#~ msgid "Homepage"
+#~ msgstr "Namų puslapis"
+
+#~ msgid "FAQ"
+#~ msgstr "DUK (FAQ)"
+
+#~ msgid "Community"
+#~ msgstr "BendruomenÄ—"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Ištrinti parsiųstus failus."
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Baigti skleidimÄ…, kai santykis pasieks"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Pašalinti torentą, kai santykis pasiektas"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Laukimo laikas (sek.)"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "From Session"
+#~ msgstr "Iš sąrašo"
+
+#~ msgid "Active time"
+#~ msgstr "Aktyvus laikas"
+
+#~ msgid "Admin"
+#~ msgstr "Administratorius"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Prisijungti prie serviso"
+
+#~ msgid "Connected to"
+#~ msgstr "Prisijungti prie"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : Torentų sąrašas"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge prisijungimas"
+
+#~ msgid "False"
+#~ msgstr "Ne"
+
+#~ msgid "Label torrent"
+#~ msgstr "Pažymėti torentą"
+
+#~ msgid "Move torrent"
+#~ msgstr "Perkelti torentÄ…"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Neprisijungta prie serviso"
+
+#~ msgid "Restart"
+#~ msgstr "Paleisti iš naujo"
+
+#~ msgid "Seeding time"
+#~ msgstr "Skleidimo laikas"
+
+#~ msgid "Seed rank"
+#~ msgstr "Skleidimo lygis"
+
+#~ msgid "True"
+#~ msgstr "Taip"
+
+#~ msgid "Update"
+#~ msgstr "Atnaujinti"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Įskaitant %i failus(-ą)"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Šis laiškas yra skirtas pranešti, kad Deluge baigė %s siuntimą, kuriame yra "
+#~ "%i failų.\n"
+#~ "Jei nenorite ateityje gauti šio pranešimo, atjunkite el. pašto pranešimus "
+#~ "Deluge nustatymuose.\n"
+#~ "\n"
+#~ "AÄiÅ«,\n"
+#~ "Deluge"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 10"
+#~ msgstr "10 puslapis"
+
+#~ msgid "page 11"
+#~ msgstr "11 puslapis"
+
+#~ msgid "page 12"
+#~ msgstr "12 puslapis"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "Å¡i eilutÄ— dar neveikia..\n"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Bazinio žodžio filtras"
+
+#~ msgid "Keyword"
+#~ msgstr "Bazinis žodis"
+
+#~ msgid "All Finished!"
+#~ msgstr "Viskas paruošta!"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Deluge derinimo pagalbininkas"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr "Šis pagalbininkas padės pritaikyti Deluge jūsų reikmėms."
+
+#~ msgid "Graphs"
+#~ msgstr "Diagramos"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "SkleidÄ—jai/Dalyviai"
+
+#~ msgid "Test config value:"
+#~ msgstr "Band. konfigūracijos reikšmė:"
+
+#~ msgid "Show trackers"
+#~ msgstr "Rodyti sekimo serverius"
+
+#~ msgid "State"
+#~ msgstr "BÅ«sena"
+
+#~ msgid "Test config value"
+#~ msgstr "Band. konfigūracijos reikšmė"
+
+#~ msgid "Stats"
+#~ msgstr "Statistika"
+
+#~ msgid "no label"
+#~ msgstr "jokios žymės"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Rodyti žymes be rezultatų"
+
+#~ msgid "Sidebar"
+#~ msgstr "Å oninÄ— juosta"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Rodyti Å¡oninÄ™ juostÄ…"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Rodyti paiešką"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Klaida nustatant žymos pasirinkimus"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "maksimalus_iÅ¡siuntimo_vietų_skaiÄius"
+
+#~ msgid "max_connections"
+#~ msgstr "maksimalus_prisijungimų_skaiÄius"
+
+#~ msgid "move_completed"
+#~ msgstr "perkelti_pabaigtÄ…"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "maksimalus_išsiuntimo_greitis"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Vyksta darbas..."
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Auto atnaujinimas (sekundÄ—s)"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Kad iInicijuoti pakeitimus, rankiniu būdu perkraukite webui."
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Sertifikatas nerastas '%s'"
+
+#~ msgid "Cancel"
+#~ msgstr "Atšaukti"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Prisijungimo limitas"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "Parsiuntimo GreiÄio Limitas"
+
+#~ msgid "Disk Space"
+#~ msgstr "Disko vieta"
+
+#~ msgid "Do not download"
+#~ msgstr "Neparsiųsti"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... ir ištrinti Torent bylą"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... ir ištrinti Parsiųstas bylas"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... ir ištrinti Visas bylas"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Raktas nerastas '%s'"
+
+#~ msgid "Normal priority"
+#~ msgstr "Normalus Prioritetas"
+
+#~ msgid "Ok"
+#~ msgstr "Gerai"
+
+#~ msgid "Search"
+#~ msgstr "Ieškoti"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "IÅ¡siuntimo GreiÄio Limitas"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Išsiuntimo Vietų Limitas"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Atnaujinti Trackerį"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "yra_automatiškai_valdomas"
+
+#~ msgid "max_download_speed"
+#~ msgstr "maksimalus_parsiuntimo_greitis"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "sustoti_ties_santykiu"
+
+#~ msgid "stop_ratio"
+#~ msgstr "sustojimo_santykis"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "pašalinti_ties_santykiu"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "pritaikyti_perkÄ—limÄ…_pabaigta"
+
+#~ msgid "move_completed_path"
+#~ msgstr "perkÄ—limas_pabaigtas_kelias"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "automatiškai_pridėti_trackerius"
+
+#~ msgid "auto_add"
+#~ msgstr "automatiškai_pridėti"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Privalomai Pertikrinti"
+
+#~ msgid "High priority"
+#~ msgstr "Aukštas prioritetas"
+
+#~ msgid "From Url"
+#~ msgstr "IÅ¡ Adreso"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "NÄ—ra Ä®einanÄių Susijungimų"
+
+#~ msgid "Highest priority"
+#~ msgstr "AukÅ¡Äiausias prioritetas"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "GreiÄio Limito IP iÅ¡laidos"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s yra netinkamas adresas."
+
+#~ msgid "Downloading.."
+#~ msgstr "AtsiunÄiama.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Nepavyko atsiųsti %s"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Atsijungta..."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "Å i programa yra nemokama: JÅ«s galite laisvai ja dalintis ar keisti pagal GNU "
+#~ "General Public licenzijos nurodymus, kaip yra paskelbusi Free Software "
+#~ "Foundation (pagal treÄiÄ… arba bet kuriÄ… vÄ—lesnÄ™ licenzijos versijÄ…). Å i "
+#~ "programa kuriama su viltimi, kad ji bus naudinga, taÄiau JOKIA GARANTIJA "
+#~ "NESUTEIKIAMA. Taip pat negarantuojama, kad Å¡i programa yra skirta tik tam "
+#~ "tikrai funkcijai atlikti. Pasižiūrėkite GNU General Public licenziją "
+#~ "<http://www.gnu.org/licenses>. Beje, specialios išimties tvarka, autorinių "
+#~ "teisių savininkai leidžia surišti keleto šios programos dalių kodą su "
+#~ "OpenSSL biblioteka. JÅ«s privalote laikytis GNU General Public licenzijos "
+#~ "visais kitais atvejais. Jei keisite bylas, kurioms galioja ši išimtis, "
+#~ "galite jÄ… taikyti ir toms byloms, taÄiau tai nÄ—ra bÅ«tina. Jei to nedarysite, "
+#~ "ištrinkite tekstą apie išimtį iš savo bylos versijos aprašo. Jei ištrinsite "
+#~ "jį iÅ¡ visų programos kodo bylų, iÅ¡trinkite jį ir iÅ¡ Äia."
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Norėdami tęsti, įveskite slaptažodį</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge apsaugota slaptažodžiu!</big></b>"
+
+#~ msgid "Username"
+#~ msgstr "Naudotojas"
diff --git a/deluge/i18n/lv.po b/deluge/i18n/lv.po
new file mode 100644
index 0000000..680cdf2
--- /dev/null
+++ b/deluge/i18n/lv.po
@@ -0,0 +1,4742 @@
+# Latvian translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2011-04-18 13:27+0000\n"
+"Last-Translator: tas_pats <Unknown>\n"
+"Language-Team: Latvian <lv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Paziņojums kÄrtÄ«bÄ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Datne"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Pirmo un pēdējo pa priekšu"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "PrioritÄte ir pirmie/pÄ“dÄ“jie gabaliņi"
+
+#~ msgid "Disable"
+#~ msgstr "Atslēgt"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr "KiB"
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr "MiB"
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr "GiB"
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr "Izvēlies skaņas datni"
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Resursdatora nosaukums:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Ports:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "LietotÄjvÄrds:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Parole:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "No:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Ieslēgts"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Izvēlēties mapi"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>LejupielÄdes vieta</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "MaksimÄlais augÅ¡upielÄdes Ätrums:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "MaksimÄlais savienojumu skaits:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "MaksimÄlais augÅ¡upielÄdes pieslÄ“gvietu skaits:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "MaksimÄlais lejupielÄdes Ätrums:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Caurlaidība</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "ApstÄdinÄt augÅ¡upielÄdi, kad reitings ir:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Dzēst kad reitings ir"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "AugÅ¡Ä"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "ApakÅ¡Ä"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Rinda</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Iestatījumi"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "LejupielÄdes ierobežojumi:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "AugÅ¡upielÄdes ierobežojumi:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Aktīvi torrenti:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>LÄ“nie uzstÄdÄ«jumi</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Nederīga etiķete, izmantojiet rakstzīmes:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "TukÅ¡Ä etiÄ·ete"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Etiķēte jau eksitē"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "NezinÄma etiÄ·ete"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "NezinÄms torrents"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Iezīme"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Iezīmes _iespējas"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "AizvÄkt iezÄ«mi"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "Pievienot iezīmi"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Etiķešu īpašības"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Etiķešu īpašības</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "AugÅ¡upielÄdes pieslÄ“gvietas:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "AugÅ¡upielÄdes Ätrums:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "LejupielÄdes Ätrums:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Savienojumi:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "ApstiprinÄt maksimÄlos iestÄdÄ«jumus torentam:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maksimums"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "AutomÄtiski pÄrvaldÄ«ts"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "ApstiprinÄt secÄ«bas iestatÄ«jumus:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "secības"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Pabeigtos pÄrvietot uz:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "ApstiprinÄt atraÅ¡anÄs vietas iestatÄ«jumus:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "AtraÅ¡anÄs vieta"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 līnija katram trakerim)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "AutomÄtiski pievienot etiÄ·eti:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Trakeri"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Pievienot etiÄ·eti"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Pievienot etiÄ·eti</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Nosaukums:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Izmantojiet sÄnjoslu, lai pievienotu, rediģētu vai aizvÄktu etiÄ·etes. "
+"</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>EtiÄ·etes</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "izpakot:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Izveidot torrenta nosaukumu apakšmapē"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Tiks radÄ«ts apakÅ¡mape izmantojot torrenta nosaukumu atzÄ«mÄ“tajÄ mapÄ“ un tur "
+"izvietotas atarhivÄ“tÄs datnes."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>VispÄrÄ“ji</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Izmantot tīkla saskartni"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Izmantot SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Izmantot portu:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b> UzstÄdÄ«jumi</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP saraksts (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Teksts (Zip formÄtÄ)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Teksta (nnesaspiests)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Kļūdains sÄkums"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Kļūdains kods"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Kļūdaina versija"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "BloÄ·Ä“to IP saraksts"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "Tīmekļa vietne:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Dienas"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Parbaudīt vai nav jauns saraksts katru:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "ImportÄ“t bloÄ·Ä“Å¡anas sarakstu darbu uzsÄkot"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Ja nepiecieÅ¡ams lejupielÄdÄ“t un importÄ“t bloÄ·Ä“Å¡anas sarakstu"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "PÄrbaudÄ«t LejupielÄdi un ImportÄ“t"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "LejupielÄdÄ“t jaunu blokÄ“Å¡anas sarakstu un impotet to."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Piespiedu LejupielÄde un imoportÄ“Å¡ana"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Melnajam sarakstam ir jaunÄka versiоф"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Iespējas</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Tips:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Datums:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Datnes izmērs:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>InformÄcija</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torents pienÄcis"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torrents pievienots"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "DarbinÄt"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Notikums"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Komanda"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "Pievienot komandu"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "Komandas"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Paziņojums nosūtīts"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "BrÄ«dinÄjums"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Kļūda"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "AfganistÄna"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Ä€landu salas"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "AlbÄnija"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Alžīrija"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Amerikas Samoa"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andora"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Angilja"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antarktīda"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antigva un Barbuda"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Argentīna"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Armēnija"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "AustrÄlija"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Austrija"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "AzerbaidžÄna"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Bahamu salas"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bahreina"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Bangladeša"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbadosa"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Baltkrievija"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Beļģija"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Beliza"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Benina"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermudu salas"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "ButÄna"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Bolīvija"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnija un Hercogovina"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "BotsvÄna"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Buvē sala"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brazīlija"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Indijas OkeÄna Britu Teritorija"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Bruneja"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "BulgÄrija"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkinafaso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Kambodža"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Kamerūna"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "KanÄda"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Kaboverde"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Kaimanu salas"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "CentrÄlÄfrikas Republika"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "ÄŒada"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Čīle"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Ķīna"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Ziemsvētku Sala"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Kokosu (KÄ«linga) Salas"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Kolumbija"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Komoras"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Kongo Republika"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Kongo DemokrÄtiskÄ Republika"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Kuka salas"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Kostarika"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Ziloņkaula krasts"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "HorvÄtija"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Kuba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Kipra"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "ÄŒehija"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "DÄnija"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Džibutī"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominika"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "DominikÄna"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Ekvadora"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Ä’Ä£ipte"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "Salvadora"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "EkvatoriÄlÄ Gvineja"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Eritreja"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Igaunija"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Etiopija"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Folklendu salas"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Farēru salas"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fidži"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Somija"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Francija"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "FranÄu GviÄna"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "FranÄu PolinÄ“zija"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "FranÄu Dienvidu Teritorijas"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabona"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambija"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Gruzija"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "VÄcija"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "ApvienotÄ Karaliste"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Gana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "GibraltÄrs"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "GrieÄ·ija"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Grenlande"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Gvandelupa"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "GuÄma"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Gvatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "GÄ“rnsija"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Gvineja"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Gvineja-Bisava"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "GajÄna"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "HÄ“rda un Makdonalda salas"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "VatikÄns"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Hondurasa"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Honkonga"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "UngÄrija"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Īslande"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "Indija"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonēzija"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "IrÄna"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "IrÄka"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Īrija"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Menas Sala"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Izraēla"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "ItÄlija"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaika"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "JapÄna"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Džersija"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "JordÄnija"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "KazahstÄna"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenija"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Ziemeļkoreja"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Dienvidkoreja"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuveita"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "KirgizstÄna"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Laosa"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Latvija"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "LibÄna"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesoto"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Libērija"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "LÄ«bija"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Lihtenšteina"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Lietuva"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luksemburga"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Makao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "MaÄ·edonija"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "MadagaskÄra"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malavī"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malaizija"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldivu salas"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "MÄrÅ¡ala Salas"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinika"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "MauritÄnija"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Maurīcija"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Majota"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Meksika"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Mikronēzija"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "MoldÄvija"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "MonÄko"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolija"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Melnkalne"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Monserata"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Maroka"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambika"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Mjanma"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namībija"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "NepÄla"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "NÄ«derlande"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Nīderlandes Antiļu salas"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Jaunkaledonija"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Jaunzēlande"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nikaragva"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Nigēra"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigērija"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Norfolkas Sala"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Ziemeļu Marianas salas"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norvēģija"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "OmÄna"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "PakistÄna"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palestīna"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua Jaungvineja"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paragvaja"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filipīnas"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitkērna"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Polija"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "PortugÄle"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puertoriko"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Katara"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reinjona"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "RumÄnija"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Krievijas federÄcija"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Ruanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "SvÄ“tÄ Bartalameja sala"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Sv. Helēnas sala"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Saint Kitts and Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Sentlūsija"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Senmartēna sala"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Senpjēra un Mikelona"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Sentvinsenta un Grenadīnas"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "Sanmarīno"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Santome un Prinsipi"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "SaÅ«da ArÄbija"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "SenegÄla"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbija"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seišeļu salas"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sjerraleone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapūra"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "SlovÄkija"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slovēnija"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "ZÄlamana Salas"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "SomÄlija"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "DienvidÄfrika"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Dienviddžordžija un DienvidsendviÄu salas"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "SpÄnija"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Å rilanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "SudÄna"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Surinama"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "SvalbÄra un Jana Majena sala"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Svazilenda"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Zviedrija"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Å veice"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "SÄ«rija"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "TaivÄna"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "TadžikistÄna"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "TanzÄnija"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Taizeme"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Austrumtimora"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "TrinidÄda un TobÄgo"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunisija"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Turcija"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "TurkmenistÄna"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Turku un Kaikosu Salas"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tivalī"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukraina"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Apvienotie ArÄbu EmirÄti"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "ASV"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Amerikas Savienoto Valstu mazÄs pieguļoÅ¡Äs salas"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Urugvaja"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "UzbekistÄna"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venecuēla"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vjetnama"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Britu Virdžinu salas"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Virdžinu salas, ASV."
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Volisa salas un Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "RietumsahÄra"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Jemena"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambija"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabve"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Bezsaistē"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Tiešsaistē"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Pieslēdzies"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Pakalpojums neeksistē"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Process ir neaktīvs"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Palaiž serveri ar PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Adrese"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Klients"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Progress"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "LejupielÄdes Ätrums"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "AugÅ¡upielÄdes Ätrums"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrents"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrenti rindÄ"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " torrents rindÄ"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Neierobežots"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Aktivizēts"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Citi..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Lejup:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Augšup:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Lejup"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Augšup"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "IestatÄ«t maksimÄlo lejupielÄdes Ätrumu"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "IestatÄ«t maksimÄlo augÅ¡upielÄdes Ätrumu"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torrents ir pabeigts"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Å \n"
+"\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr "Kategorijas"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "LejupielÄdes"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "TÄ«kls"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Caurlaidība"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Interfeiss"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Citi"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Serviss"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Starpniekserveris"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Kešatmiņa"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Spraudņi"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Spraudnis"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Izvēlieties spraudni"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Eggs paplaÅ¡inÄjums"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Faila nosaukums"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Lielums"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Nederīga datne"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "AtkÄrtots torrents"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Nevar vienu un to pašu torrentu pievienot divreiz"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "NeiespÄ“jami uzstÄdÄ«t dates prioritÄti"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Izvēlieties .torrent failu"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Torrent faili"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Visi faili"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Nederīgs URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "LejupielÄde netika pabeigta"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Tier"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Trakeris"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Izvēlieties failu"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Izvēlieties mapi"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "SaglabÄt .torrent failu"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Nepievienots"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Savienojumi"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "LejupielÄdes Ätrums"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "AugÅ¡upielÄdes Ätrums"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Lejup/augšup protokola satiksme"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT mezgli"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr "Diska brÄ«vÄ vieta"
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Nav ienÄkoÅ¡u savienojumu"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "IestatÄ«t maksimÄlo savienojumu skaitu"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrenti"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "EtiÄ·etes"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Viss"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "LejupielÄde"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "PiedÄvÄ"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Pauzēts"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "PÄrbauda"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "Gaida rindÄ"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr "Aktīvs"
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Nekas"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Bez etiÄ·etes"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr "StÄvoklis"
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Resursdators"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr "Versija"
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Kļūda pievienojot vietni"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Izslēgt Klaisko Skatu?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"IzskatÄs, ka Deluge process (deluged) jau darbojas\n"
+"Jums ir vai nu jÄaptur process vai jÄizslÄ“dz Klasiskais skats lai turpinÄtu."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Kļūda palaižot kodolu"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"Ir gadÄ«jusies kļūda Deluge kodola sastÄvdaļÄ, kas nepiecieÅ¡ama lai darbinÄtu "
+"Klasisko skatu.\n"
+"Papildus informÄciju skatÄ«ties zemÄk."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr "KlasiskajÄ skatÄ bija kļūda, vai JÅ«s gribat turpinÄt"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Kļūda palaižot pakalpojumu"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"GadÄ«jÄs kļūda palaižot pakalpojuma procesu. MÄ“Ä£iniet palaist no konsoles, "
+"lai redzētu, kas par kļūdu."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Ieslēgts"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Izslēgts"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Neierobežot"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "IzvÄ“lieties mapi, uz kuru pÄrvietot failus"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "UzstÄdÄ«t maksimÄlo augÅ¡upielÄdes pieslÄ“gvietu skaitu"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr "Nevajag lejupielÄdÄ“t"
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr "NormÄla prioritÄte"
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr "Augsta prioritÄte"
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr "VisaugstÄkÄ prioritÄte"
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "PrioritÄte"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Detaļas:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Nosaukums"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "LejupielÄdÄ“ts"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "AugÅ¡upielÄdÄ“ts"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Devēji"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Iesaistītie"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Kopējais laiks, kas atlicis"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Attiecība"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Pieej."
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Pievienots"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Pievienot torrentu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "Iz_veidot torrentu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Labot"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Savienojumu pÄrvaldnieks"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrents"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Skatīt"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "RÄ«kjosla"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_SÄnjosla"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Stat_usa josla"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "Šķirkļi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Kolonnas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "SÄnu _josla"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "RÄdÄ«t tukÅ¡Äs sadaļas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "_RÄdÄ«t trakerus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Palīdzība"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Bieži uzdotie jautÄjumi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Pievienot torrentu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Pievienot torrentu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "AizvÄkt torrentu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "AizvÄkt torrentu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Pauzēt izvēlētos torrentus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Iepauzēt"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "AtsÄkt izvÄ“lÄ“tos torrentus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "AtsÄkt"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "PÄÅ—vietot uz augÅ¡u"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "PÄrvietot rindÄ uz augÅ¡u"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "PÄrvietot uz leju"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "PÄrvietot rindÄ uz leju"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "UzstÄdÄ«jumi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Savienojumu pÄrvaldnieks"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "Izpl_est visu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_NeielÄdÄ“t"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "NormÄla _prioritÄte"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Augsta prioritÄte"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "_VisaugstÄkÄ prioritÄte"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>AutomÄtiski pÄrvaldÄ«ts:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>DalÄ«tÄja ranks:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Dalīšanas laiks:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Aktīvais laiks:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Trakera statuss:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Pieejamība:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Iesaistītie:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Devēji:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Gabaliņi:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Laiks atlicis:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>NÄkamÄ pÄrziņoÅ¡ana:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>DalÄ«Å¡anÄs attiecÄ«ba:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>AugÅ¡upielÄdÄ“ts:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>LejupielÄdÄ“ts:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Pievienošanas datums:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Statuss"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>KomentÄri:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># no datnēm:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Trakeris:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Kopējais izmērs:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Nosaukums:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "Ceļš"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Statuss:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "PapildinformÄcija"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Faili"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "Iesaistītie"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "PÄvietot pabeigtos:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "PrivÄts"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "Labot trakerus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_UzstÄdÄ«jumi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Dzēst torrentu?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+"<big><b>Vai esat pÄrliecinÄts, ka vÄ“laties dzÄ“st izvÄ“lÄ“to torrentu?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>SaistÄ«tÄ .torrent datne tiks dzÄ“sta </i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>LejupielÄdÄ“tie dati tiks dzÄ“sti!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Dzēst izvēlēto torrentu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Jauns programmas laidiens"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Jauns programmas laidiens pieejams!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>PieejamÄ versija:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>PaÅ¡reizÄ“jÄ versija:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "TurpmÄk nerÄdÄ«t Å¡o logu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Iet uz tīmekļa vietni"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Pievienot iesaistÄ«to pÄ“c tÄ IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "Izvēlēties vi_sus"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "Pauzēt visus"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "AtsÄkt izvÄ“lÄ“tos torrentus"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "AtsÄkt visus _m"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Pievienot Torrentus"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_Izņemt"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrenti</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Fai_li"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Pilns"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Kompakts"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Piešķiršana</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "MaksimÄlais lejupielÄdes Ätrums:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "MaksimÄlais augÅ¡upielÄdes Ätrums:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Pievienot kÄ _PauzÄ“tu"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Atjaunot uz noklusētajiem"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Pielietot visiem"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Pievienot saiti"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>No saites</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Pievienot \"Infohash\""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>No \"Infohash\"</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Trakeri:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Izveidot torrentu"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Izveidot torrentu</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Mape"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "AttÄlais ceļš"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Faili</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Autors:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "KomentÄri:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Info"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Tīmekļa devēji"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Daļiņas izmērs:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "UzstÄdÄ«t privÄtÄ torrenta karodziņu"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Pievienot Å¡o torrentu sesijai"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "IevadÄ«t attÄlo ceļu"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>AttÄlais ceļš</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Ceļš:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Veido torrentu"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "SaglabÄt .torrent kÄ"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>SaglabÄt .torrent failu</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Ierindotie Torrenti"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Pievienot gaidošus torrentus</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "AutomÄtiski pievienot torentus pieslÄ“dzoties"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "iezīme"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Pievienot dalībdatoru"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Pievienot dalībdatoru</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "datorvÄrds:ports"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Pievienot serveri"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Savienojumu pÄrvaldnieks</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "UzsÄkt vietÄ“jo _servisu"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "AutomÄtiski savienoties ar izvÄ“lÄ“to serveri, sÄkot darbu"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Ja vajadzīgs, palaist 'localhost'"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "NerÄdÄ«t Å¡o logu, sÄkot darbu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>LejupielÄdes</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "AutomÄtiski pievienot .torrent failus no:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "SaglabÄt iekÅ¡:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Kopēt .torrent failus uz:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Mapes</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Lietot pilnu vietas piešķiršanu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Pilna vietas piešķiršana, kas nepieciešama torrentam, lai novērstu viņa "
+"dalīšanu pa gabaliņiem uz diska"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Izmantot kompakto diska vietas iedalīšanu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Kompakta vietas piešķiršana, piesķir kad vajag"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Torenta pirmos un pēdējos gabaliņus pa priekšu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "UzstÄdÄ«t augstÄku prioritÄti pirmajÄm un pÄ“dÄ“jÄm torrenta daļiņÄm"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Pievienot torrentu pauzētu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>TÄ«kls</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Izmantot dažÄdus portus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge automÄtiski katru reizi izvÄ“lÄ“sies citu portu."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Tekošais ports:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Uz:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "PÄrbaudÄ«t tekoÅ¡o portu:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>IenÄkuÅ¡ie porti</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Izejošie porti</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Ievadiet IP saskarnei kura pieņems ienÄkoÅ¡os bittorenta savienojumus. "
+"AtstÄjiet tukÅ¡u ja vÄ“laties izmantot noklusÄ“juma uzstÄdÄ«jumus."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>Saskarne</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"TOS baits uzstÄdÄ«ts katras paketes IP virsrakstÄ, ko nosÅ«ta dalÄ«bniekam "
+"(vietnes ieskaitot). Sagaida HEX vērtību."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Dalībnieka TOS baits:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT portu pÄrveides protokols"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Dalībnieku datu apmaiņa"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "VietÄ“jo servisu atklÄjÄ“js"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery finds local peers on your network."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "DalÄ«tÄ kontrolsummu tabula var uzlabot kopÄ“jo pieslÄ“gumu skaitu."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Tīkla papildiespējas</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "IenÄkoÅ¡ais:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "LÄ«menis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"ObligÄts\n"
+"Iespējams\n"
+"Izslēgts"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"SasveicinÄÅ¡anÄs\n"
+"Pilna plūsma\n"
+"Viens no"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Izejošais:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Šifrēt visu plūsmu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Šifrēšana</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Caurlaidība</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Max savienojumu mÄ“Ä£inÄjumi sekundÄ“:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Max Pusatvērtie savienojumi:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"MaksimÄlais kopÄ“jais visu torrentu augÅ¡upielÄdes Ätrums. -1 nozÄ«mÄ“ "
+"neierobežots."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "MaksimÄlais augÅ¡upielÄdes Ätrums (KiB/s)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "MaksimÄlais konekciju skaits. -1 nozÄ«mÄ“ neierobežots."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "MaksimÄlais konekciju skaits:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"MaksimÄlais augÅ¡upielÄdes pieslÄ“gvietu skaits. -1 nozÄ«mÄ“ neierobežots."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Max augÅ¡upielÄdes pieslÄ“gvietas:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"MaksimÄlais visu torrentu lejupielÄdes Ätrums. -1 nozÄ«mÄ“ neierobežots."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "MaksimÄlais lejupielÄdes Ätrums (KiB/s)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "IgnorÄ“t ierobežojumus vietÄ“jÄ tÄ«klÄ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Noteikt IP pÄrpalikuma robežu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Ja atzÄ«mÄ“ts, kopÄ“jais TCP/IP pÄrpalikums noņemts ar plÅ«smas ierobežotÄju, "
+"lai novÄ“rstu robežu pÄrkÄpÅ¡anu ar kopÄ“jo plÅ«smu."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Kopējais caurlaidības izlietojums</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"MaksimÄlais augÅ¡upielÄdes pieslÄ“gvietu skaits uz torrentu. -1 nozÄ«mÄ“ "
+"neierobežots."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "MaksimÄlais savienojumu skaits uz torrentu. -1 nozÄ«mÄ“ neierobežots."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Caurlaidības izlietojums uz torrentu</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Interfeiss</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Ieslēgt"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Klasiskais režīms paslÄ“ps lielÄko daļu no servisa iespÄ“jÄm un liks Deluge "
+"parÄdÄ«ties kÄ vienai programmai. Izmantojiet to, ja nevÄ“laties izmantot "
+"priekÅ¡rocÄ«bas, darbinot Deluge kÄ servisu. Jums vajadzÄ“s pÄrstartÄ“t Deluge, "
+"lai Å¡Ä« iespÄ“ja stÄtos spÄ“kÄ."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "Klasiskais režīms"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "RÄdÄ«t sesijas Ätrumu virsraksta joslÄ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "Galvenais logs"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "VienmÄ“r rÄdÄ«t"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Dialogu novietot redzamÄ vietÄ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Pievienot Torrentus dialogs</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Izmantot sistēmas paneļa ikonu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Aizverot logu, minimizÄ“t kÄ sistÄ“mas paneļa ikonu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "SÄknÄ“t sistÄ“mas panelÄ«"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "AizsargÄt sistÄ“mas paneļa ikonu ar paroli"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Sistēmas panelis</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>PÄrÄ“jie</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Paziņot par jaunÄm versijÄm"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge pÄrbaudÄ«s mÅ«su serverus un ziņos, ja bÅ«s izlaista jaunÄka versija"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>AtjauninÄjumi</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Palīdziet mums uzlabot Deluge, nosūtot mums savu Python versiju, PyGTK "
+"versiju, operÄ“tÄjsistÄ“mas un procesora tipu. NekÄda cita informÄcija netiks "
+"nosūtīta."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "JÄ, lÅ«dzu nosÅ«tÄ«t anonÄ«mu statistiku"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>SistÄ“mas informÄcija</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "AtraÅ¡anÄs vieta:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Ja Deluge nevar atrast vietu datu bÄzÄ“, viņa izmanto DNS lai noteiktu valsti."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP DatubÄze</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Piesaistīt Magneta saiti Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Servis</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Servisa ports:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Ports</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Atļaut attÄlinÄtos pieslÄ“gumus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Savienojumi</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Periodiski pÄrbaudÄ«t mÅ«su vietni, vai nav jaunu Deluge versiju"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Citi</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Rinda</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Pievienot jaunos torrentus rindas sÄkumÄ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "KopÄ aktÄ«vie devÄ“ji:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "KopÄ aktÄ«vie:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "KopÄ aktÄ«vie lejupielÄdejamie:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Neskaitīt lēnos torrentus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "Aktīvie torrenti"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Dalīšanas attiecības robeža:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Dalīšanas laika attiecība"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Dalīšanas laiks (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "PÄrstÄt dalÄ«t, kad dalÄ«Å¡anas attiecÄ«ba sasniedz:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Dzēst torrentu, kad dalīsanas attiecība ir"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>PiedÄvÄÅ¡ana</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Starpniekserveris</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Resursdators:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"NekÄds\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Dalībnieki</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Tīmekļa dalīšana</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "Trakeris"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Kešatmiņa</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Kešatmiņas izmērs (16 KiB blokos):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Sekunžu skaits kopÅ¡ pÄ“dÄ“jÄs ierakstÄ«Å¡anas no keÅ¡atmiņas diskÄ. "
+"Noklusējums:60 sekundes"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Kešatmiņas novecosana (sekundes):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr "KopÄ“jais 16KiB bloku skaits, kas ierakstÄ«ts kopÅ¡ sesijas sÄkuma."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Bloki ierakstīti:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr "KopÄ“jais ieraksta operÄciju veikÅ¡anu skaits kopÅ¡ sesijas sÄkuma."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Ieraksta op:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"Attiecība (ierakstītie bloki - ierakstu reizes) / bloku ieraksti attēlo "
+"skaitu, kas ietaupÄ«ts ieraksta operÄcijÄs t.i. savdabÄ«ga keÅ¡atmiņas "
+"izmantošanas attiecība priekš ierakstīšanas kešatmiņas"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "Ierakstīšanas kešatmiņas izmantošanas attiecība:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Raksta</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Bloku skaits, kas pieprasīti bittorenta dzinējam (no devējiem), kas "
+"pasniegti no diska vai kešatmiņas."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Bloki nolasīti:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "Bloku skaits, kas pasniegti no kešatmiņas"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "Bloku lasīšanas izmantošana:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "Kešatmiņas izmantošanas attieciba lasīšanas kešatmiņai."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "Lasīšanas kešatmiņas izmantošanas attiecība:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr "KopÄ“jais lasÄ«Å¡anÄs operÄciju skaits kopÅ¡ sesijas sÄkuma."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Lasīšanas:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Lasa</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"16 KiB bloku skaits diska keÅ¡atmiņÄ. Ietver abus: gan lasÄ«Å¡anu, gan "
+"lasīšanas kešatmiņu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Kešatmiņas izmērs:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Lasīšanas kešatmiņas izmērs:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Izmērs</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Statuss</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Spraudņi</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Versija:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "MÄjaslapa:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Autora e-pasts:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Instalēt spraudni"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_PÄrskanÄ“t spraudņus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "Meklēt papildus spraudņus _F"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "PÄrÄdÄ«t Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "AtsÄkt visus"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "LejupielÄ_des Ätruma limits"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "AugÅ¡_upielÄdes Ätruma limits"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Iziešana un servisa slēgšana"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "Atvērt mapi _o"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "AtsÄkt _m"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "UzstÄdÄ«jum_i"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Novietojums rindÄ"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Atjaunot trakeri"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Dzēst torrentu"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "Piespiedu _failu pÄrbaude"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "PÄrvietot glabÄtuvi _s"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "Savienojumu limits"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "AugÅ¡upielÄdes _pieslÄ“gvietu skaita limits:"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "AutomÄtiski pÄrvaldÄ«ts"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Dzēst izvēlēto torrentu?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Ja jūs izdzēsīsiet datus, tie tiks neatgriezeniski zaudēti"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Labot trakerus"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Labot trakerus</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Pievienot trakeri"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Pievienot trakerus</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Labot trakeri"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Labot trakeri</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Trakeris:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "DzÄ“st torrentu un tÄ failus"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Dzēst torrentu"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "PÄrvietot glabÄtuvi"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>PÄrvietot glabÄtuvi</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "MÄ“rÄ·is:"
+
+#~ msgid "seconds"
+#~ msgstr "sekundes"
+
+#~ msgid "Unknown"
+#~ msgstr "NezinÄms"
+
+#~ msgid "Download"
+#~ msgstr "LejupielÄde"
+
+#~ msgid "Upload"
+#~ msgstr "AugÅ¡upielÄde"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Atjaunot trakeri"
+
+#~ msgid "Total Size"
+#~ msgstr "Kopējais izmērs"
+
+#~ msgid "Pieces"
+#~ msgstr "Gabaliņi"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Trakera statuss"
+
+#~ msgid "Next Announce"
+#~ msgstr "NÄkamÄ paziņoÅ¡ana"
+
+#~ msgid "Yes"
+#~ msgstr "JÄ"
+
+#~ msgid "No"
+#~ msgstr "NÄ“"
+
+#~ msgid "Availability"
+#~ msgstr "Pieejamība"
+
+#~ msgid "Details"
+#~ msgstr "SÄ«kÄka informÄcija"
+
+#~ msgid "Files"
+#~ msgstr "Faili"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Ä€trums:</b>"
+
+#~ msgid "Select All"
+#~ msgstr "Iezīmēt visus"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Dzēst .torrent failu"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Server"
+#~ msgstr "Serveris"
+
+#~ msgid "Username"
+#~ msgstr "LietotÄjvÄrds:"
+
+#~ msgid "Password"
+#~ msgstr "Parole"
+
+#~ msgid "Port"
+#~ msgstr "Ports"
+
+#~ msgid "_Quit"
+#~ msgstr "_Aizvērt"
+
+#~ msgid "Graph"
+#~ msgstr "Grafiks"
+
+#~ msgid "Filters"
+#~ msgstr "Filtri"
+
+#~ msgid "Clear"
+#~ msgstr "Izdzēst"
+
+#~ msgid "Add"
+#~ msgstr "Pievienot"
+
+#~ msgid "Remove"
+#~ msgstr "AizvÄkt"
+
+#~ msgid "# Of Files"
+#~ msgstr "Failu skaits"
+
+#~ msgid "About"
+#~ msgstr "Par programmu"
+
+#~ msgid "Admin"
+#~ msgstr "Administrators"
+
+#~ msgid "Connect"
+#~ msgstr "Pieslēgties"
+
+#~ msgid "Connected to"
+#~ msgstr "Pieslēgties pie"
+
+#~ msgid "File"
+#~ msgstr "Fails"
+
+#~ msgid "False"
+#~ msgstr "Nepatiess"
+
+#~ msgid "Move"
+#~ msgstr "PÄrvietot"
+
+#~ msgid "Keyword"
+#~ msgstr "AtslÄ“gvÄrds"
+
+#~ msgid "Label torrent"
+#~ msgstr "Apzīmēt torrentu"
+
+#~ msgid "Move torrent"
+#~ msgstr "PÄrvietot torrentu"
+
+#~ msgid "Login"
+#~ msgstr "PieteikÅ¡anÄs"
+
+#~ msgid "Logout"
+#~ msgstr "Beigt darbu"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Parole neder, mēģiniet vēlreiz"
+
+#~ msgid "Pause all"
+#~ msgstr "Apturēt visu"
+
+#~ msgid "Resume all"
+#~ msgstr "AtsÄkt visu"
+
+#~ msgid "Restart"
+#~ msgstr "PÄrstartÄ“t"
+
+#~ msgid "Queue Position"
+#~ msgstr "Vieta rindÄ"
+
+#~ msgid "Seeding time"
+#~ msgstr "Dalīšanas ilgums"
+
+#~ msgid "Speed"
+#~ msgstr "Ä€trums"
+
+#~ msgid "Set"
+#~ msgstr "UzstÄdÄ«t"
+
+#~ msgid "Save"
+#~ msgstr "SaglabÄt"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Dalīšanas attiecība"
+
+#~ msgid "Submit"
+#~ msgstr "Nosūtīt"
+
+#~ msgid "Update"
+#~ msgstr "AtjauninÄt"
+
+#~ msgid "Stop"
+#~ msgstr "PÄrtraukt"
+
+#~ msgid "Torrent list"
+#~ msgstr "Torrentu saraksts"
+
+#~ msgid "Start"
+#~ msgstr "SÄkt"
+
+#~ msgid "True"
+#~ msgstr "Patiess"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "MaksimÄlais lejupielÄdes Ätrums"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "KompaktÄ diska vietas iedalÄ«Å¡ana"
+
+#~ msgid "Download Location"
+#~ msgstr "LejupielÄdes vieta"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "atsvaidzinÄÅ¡anas biežumam jÄbÅ«t > 0"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "MaksimÄlais augÅ¡upielÄdes Ätrums"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Kļūda torrenta iestatījumos"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Upload torrent"
+#~ msgstr "AugÅ¡upielÄdÄ“t torrentu"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Pievienot apturÄ“tÄ stÄvoklÄ«"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "PrioritÄte ir sÄkuma un beigu gabaliņi"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "MaksimÄlais augÅ¡upielÄdes slotu skaits"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Izvēlieties url vai torrentu, bet ne abus."
+
+#~ msgid "Maximum Connections"
+#~ msgstr "MaksimÄlais savienojumu skaits"
+
+#~ msgid "No data"
+#~ msgstr "Nav datu"
+
+#~ msgid "Ports"
+#~ msgstr "Porti"
+
+#~ msgid "To"
+#~ msgstr "Uz"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Peer-Exchange"
+
+#~ msgid "From"
+#~ msgstr "No"
+
+#~ msgid "Random"
+#~ msgstr "Nejaušs"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Mainline DHT"
+
+#~ msgid "Disabled"
+#~ msgstr "Atslēgts"
+
+#~ msgid "Either"
+#~ msgstr "Jebkurš"
+
+#~ msgid "Forced"
+#~ msgstr "Piespiedu"
+
+#~ msgid "Encryption"
+#~ msgstr "Šifrēšana"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Katram torrentam"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "MaksimÄlais pusatvÄ“rto savienojumu skaits"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "MaksimÄlais lejupielÄdes Ätrums (Kib/s)"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "MaksimÄlais savienoÅ¡anÄs mÄ“Ä£inÄjumu skaits sekundÄ“"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "MaksimÄlais augÅ¡upielÄdes Ätrums (Kib/s)"
+
+#~ msgid "Level"
+#~ msgstr "LÄ«menis"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = neierobežots"
+
+#~ msgid "Global"
+#~ msgstr "GlobÄls"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "AutomÄtiskÄs ielÄdes mape"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Kopējais aktīvo torrentu skaits"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = neierobežots"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Kopējais aktīvo lejupielĞu skaits"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "AizvÄkt torrentu, kad attiecÄ«ba sasniedz"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "PÄrtraukt dalÄ«Å¡anu, kad attiecÄ«ba sasniedz"
+
+#~ msgid "Button style"
+#~ msgstr "Pogu stils"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Ieslēgtie spraudņi"
+
+#~ msgid "Image Only"
+#~ msgstr "Tikai attēli"
+
+#~ msgid "Text Only"
+#~ msgstr "Tikai teksts"
+
+#~ msgid "Text and image"
+#~ msgstr "Teksts un attēli"
+
+#~ msgid "Template"
+#~ msgstr "Veidne"
+
+#~ msgid "Move To"
+#~ msgstr "PÄrvietot uz"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr ""
+#~ "Lauciņos \"JaunÄ parole\" un \"JaunÄ parole (vÄ“lreiz)\" jÄievada viena un tÄ "
+#~ "pati parole"
+
+#~ msgid "These changes were saved"
+#~ msgstr "SÄ«s izmaiņas tika saglabÄtas"
+
+#~ msgid "Current Password"
+#~ msgstr "PaÅ¡reizÄ“jÄ parole"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "JaunÄ parole (vÄ“lreiz)"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "VecÄ parole nav pareiza"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Izlabojiet augstÄk redzamo kļūdu un mÄ“Ä£iniet vÄ“lreiz"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Ievadiet sarakstu ar vÄ“rtÄ«bÄm"
+
+#~ msgid "translate something"
+#~ msgstr "Iztulkot kaut ko"
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Ievadiet derīgu vērtību!"
+
+#~ msgid "This field is required."
+#~ msgstr "Å is lauciņš ir obligÄti jÄaizpilda."
+
+#~ msgid "Enter a number."
+#~ msgstr "Ievadiet skaitli!"
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "PÄrliecinieties, ka Å¡Ä« vÄ“rtÄ«ba ir lielÄka vai vienÄda ar %s!"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "PÄrliecinieties, ka Å¡Ä« vÄ“rtÄ«ba nav garÄka par %(max)d simboliem (patlaban "
+#~ "tÄs garums ir %(length)d)!"
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Ievadiet veselu skaitli!"
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "PÄrliecinieties, ka Å¡Ä« vÄ“rtÄ«ba ir mazÄka vai vienÄda ar %s!"
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "PÄrliecinieties, ka Å¡Ä« vÄ“rtÄ«ba nav Ä«sÄka par %(min)d simboliem (patlaban tÄs "
+#~ "garums ir %(length)d)!"
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "PÄrliecinieties, ka kopÄ nav vairÄk par %s cipariem!"
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Ievadiet derīgu e-pasta adresi!"
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "AugÅ¡upielÄdÄ“jiet derÄ«gu attÄ“lu! Fails, kuru augÅ¡upielÄdÄ“jÄt, vai nu nebija "
+#~ "attÄ“ls, vai arÄ« bija bojÄts."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr ""
+#~ "PÄrliecinieties, ka skaitlis nesatur vairÄk par %s zÄ«mÄ“m pirms komata!"
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Ievadiet derīgu laiku!"
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Ievadiet derīgu datumu/laiku!"
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Ievadiet derīgu datumu!"
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "PÄrliecinieties, ka skaitlis nesatur vairÄk par %s zÄ«mÄ“m aiz komata!"
+
+#~ msgid "Statistics"
+#~ msgstr "Statistika"
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Ievadiet derīgu URL!"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Šī mape neeksistē."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Ievadiet derīgu IPv4 adresi!"
+
+#~ msgid "Recheck"
+#~ msgstr "PÄrbaudÄ«t"
+
+#~ msgid "Delete"
+#~ msgstr "Izdzēst"
+
+#~ msgid "Queue Top"
+#~ msgstr "PÄrvietot uz rindas augÅ¡u"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "PÄrvietot uz rindas beigÄm"
+
+#~ msgid "Reannounce"
+#~ msgstr "AtkÄrtoti veikt paziņoÅ¡anu"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Ieskaitot %i failus"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torrents ir virs apturēšanas attiecības"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge ir aizslēgts"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Pieeja Deluge programmai ir aizsargÄta ar paroli.\n"
+#~ "Lai piekļūtu programmas logam, lūdzu, ievadiet paroli"
+
+#~ msgid "page 10"
+#~ msgstr "10. lappuse"
+
+#~ msgid "page 11"
+#~ msgstr "11. lappuse"
+
+#~ msgid "page 12"
+#~ msgstr "12. lappuse"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "Homepage"
+#~ msgstr "MÄjaslapa"
+
+#~ msgid "FAQ"
+#~ msgstr "FAQ"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Kļūda, uzstÄdot iezÄ«mes iespÄ“jas"
+
+#~ msgid "BlockList"
+#~ msgstr "BloÄ·Ä“jamo saraksts"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "PÄrbaudÄ«t reizi (dienÄs)"
+
+#~ msgid "Import Now"
+#~ msgstr "Importēt tagad"
+
+#~ msgid "Inactive"
+#~ msgstr "Neaktīvs"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Importē %s"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "LejupielÄdÄ“ %.2f%%"
+
+#~ msgid "Refresh status"
+#~ msgstr "AtsvaidzinÄt statusu"
+
+#~ msgid "Other.."
+#~ msgstr "Cits.."
+
+#~ msgid "State"
+#~ msgstr "StÄvoklis"
+
+#~ msgid "Config"
+#~ msgstr "Konfigurēt"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Type"
+#~ msgstr "Tips"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "AutomÄtiska torrentu pievienoÅ¡ana ieslÄ“gta"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "SaglabÄt .torrent failus iekÅ¡"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "SaglabÄt visas lejupielÄdes iekÅ¡"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Show sidebar"
+#~ msgstr "RÄdÄ«t sÄnjoslu"
+
+#~ msgid "Sidebar"
+#~ msgstr "SÄnjosla"
+
+#~ msgid "Show trackers"
+#~ msgstr "RÄdÄ«t trakerus"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... un izdzēst torrenta failu"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... un izdzÄ“st lejupielÄdÄ“tos failus"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... un izdzēst visus failus"
+
+#~ msgid "Cancel"
+#~ msgstr "Atcelt"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Savienojumu limits"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "IzdzÄ“st lejupielÄdÄ“tos failus."
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge: Torrentu saraksts"
+
+#~ msgid "Deluge Login"
+#~ msgstr "PieslÄ“gÅ¡anÄs Deluge"
+
+#~ msgid "From Url"
+#~ msgstr "No URL"
+
+#~ msgid "High priority"
+#~ msgstr "Augsta prioritÄte"
+
+#~ msgid "General"
+#~ msgstr "VispÄrÄ“ji"
+
+#~ msgid "Highest priority"
+#~ msgstr "VisaugstÄkÄ prioritÄte"
+
+#~ msgid "From Session"
+#~ msgstr "No sesijas"
+
+#~ msgid "Ok"
+#~ msgstr "Labi"
+
+#~ msgid "Normal priority"
+#~ msgstr "NormÄla prioritÄte"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Nav ienÄkoÅ¡u savienojumu"
+
+#~ msgid "Search"
+#~ msgstr "Meklēt"
+
+#~ msgid "Error in Path."
+#~ msgstr "Kļūda adresē."
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-rediģēšana"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-savienojums"
+
+#~ msgid "max_connections"
+#~ msgstr "max_savienojumu"
+
+#~ msgid "max_download_speed"
+#~ msgstr "max_lejupielÄdes_Ätrums"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "PÄrtraukums (sekundÄ“s)"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "šis vēl nedara neko..\n"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Pievienot Torrentus</b></big>"
+
+#~ msgid "Graphs"
+#~ msgstr "Grafiki"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Devēji/Dalībnieki"
+
+#~ msgid "Test config value:"
+#~ msgstr "UzstÄdÄ«jumu vertÄ«bu tests:"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Å is epasts informÄ“ JÅ«s, ka Deluge ir pabeidzis lejupielÄdÄ“t %s , kas satur "
+#~ "%i failus.\n"
+#~ "Lai turpmÄk nesaņemtu Å¡Ädus paziņojumus, vienkÄrÅ¡i Deluge iestatÄ«jumos "
+#~ "atslēdziet paziņojumus pa epastu.\n"
+#~ "\n"
+#~ "Pateicos,\n"
+#~ "Deluge"
+
+#~ msgid "page 6"
+#~ msgstr "6. lapa"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 7"
+#~ msgstr "7. lapa"
+
+#~ msgid "page 8"
+#~ msgstr "8.lapa"
+
+#~ msgid "Extra's"
+#~ msgstr "PapildinÄjumi"
+
+#~ msgid "apply_max"
+#~ msgstr "apstiprinÄt_maksimumu"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "max_lejupielÄdes_vietas"
+
+#~ msgid "apply_queue"
+#~ msgstr "apstiprinÄt_rindu"
+
+#~ msgid "Community"
+#~ msgstr "Kopiena"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "max_lejupielÄdes_Ätrums"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "ImportÄ“t servisÄ to palaižot"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "LejupielÄdes mÄ“Ä£inÄjuma reizes"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "BloÄ·Ä“t: %s"
+
+#~ msgid "Work in progress.."
+#~ msgstr "ProgresÄ ..."
+
+#~ msgid "Handshake"
+#~ msgstr "SasveicinÄÅ¡anÄs"
+
+#~ msgid "no label"
+#~ msgstr "nav etiÄ·ete"
+
+#~ msgid "Inbound"
+#~ msgstr "IenÄkoÅ¡s"
+
+#~ msgid "Outbound"
+#~ msgstr "Izejošs"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr "IzvÄ“lieties derÄ«gu uzstÄdÄ«jumu. TagadÄ“jÄ nav derÄ«ga."
+
+#~ msgid "Total active seeding"
+#~ msgstr "KopÄ“jais dalÄmo torrentu skaits"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Noteikt IP pÄrpalikuma robežu"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr ""
+#~ "PÄrstartÄ“jiet servisu un tÄ«kla saskarni pÄ“c Å¡o iestatÄ«jumu izmainÄ«Å¡anas"
+
+#~ msgid "Cache templates"
+#~ msgstr "UzkrÄÅ¡anas sagataves"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "AutomÄtiska atsveidze ik pÄ“c (sekundes)"
+
+#~ msgid "no uri"
+#~ msgstr "nav uri"
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "PievienotÄ datne ir tukÅ¡a"
+
+#~ msgid "No file was submitted."
+#~ msgstr "Datne nav pievienota"
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "Datne nav pievienota. PÄrbaudiet formas kodejuma tipu."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Å Ä«s saite nestrÄdÄ."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "IzvÄ“lÄ“ties derÄ«gu uzstÄdÄ«jumu. %s nav derÄ«ga."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr "IzvÄ“lieties derÄ«gus uzstÄdÄ«jumus. VÄ“rtÄ«bas %(value)s tÄdas nav."
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Auto atjaunošana:"
+
+#~ msgid "Ava"
+#~ msgstr "Ava"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Pieslēgties servisam"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "A/L Ätruma robeža"
+
+#~ msgid "Eta"
+#~ msgstr "Kopējais laiks līdz pabeigšanai"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Nav pieslēgts servisam"
+
+#~ msgid "Disk Space"
+#~ msgstr "Vieta uz diska"
+
+#~ msgid "Do not download"
+#~ msgstr "LejupielÄdi neveikt"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "FiltrÄ“t, izmantojot atslÄ“gas vÄrdu"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Atjaunot lapu ik pēc:"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Piespiedu pÄrbaude"
+
+#~ msgid "Set Timeout"
+#~ msgstr "UzstÄdÄ«t noilgumu"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "AugÅ¡upielÄdes pieslÄ“gvietu skaita robeža"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "A/L Ätruma robeža"
+
+#~ msgid "Show keyword search"
+#~ msgstr "RÄdÄ«t meklÄ“Å¡anu pÄ“c atslÄ“gvÄrda"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Radīt 0 rezultus"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "PÄrtraukt dalÄ«Å¡anu pie Å¡Ädas attiecÄ«bas"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "pievienot_trakeckeri_automÄtiski"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "RestartÄ“t vietnes dzinÄ“ju, lai aptiprinÄtu izmaiņas"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "'%s' nav atslēgas"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "'%s' netika atrasts sertifikÄts"
+
+#~ msgid "New Password"
+#~ msgstr "JaunÄ parole"
+
+#~ msgid "Active time"
+#~ msgstr "AktÄ«vitÄtes laiks"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "autovadīts"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "beigt_kad_attiecība"
+
+#~ msgid "stop_ratio"
+#~ msgstr "beigu_attiecība"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "dzēst_ja_attiecība"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "apstiprinÄt_parvietoÅ¡anas_veikÅ¡anu"
+
+#~ msgid "move_completed"
+#~ msgstr "pÄrvietoÅ¡ana_beigta"
+
+#~ msgid "move_completed_path"
+#~ msgstr "pÄrvietoÅ¡ana _veikta_uz"
+
+#~ msgid "auto_add"
+#~ msgstr "auto_pievienošana"
+
+#~ msgid "Seed rank"
+#~ msgstr "DalÄ«bnieka pakÄpe"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s ir nederīgs URL"
+
+#~ msgid "Downloading.."
+#~ msgstr "LejupielÄdÄ“.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "%s: lejupielÄde netika pabeigta"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Bezsaistē.."
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Ievadiet paroli, lai turpinÄtu</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge aizsargÄta ar paroli!</big></b>"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB\n"
+#~ "1 MiB\n"
+#~ "2 MiB\n"
+#~ "4 MiB\n"
+#~ "8 MiB\n"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB\n"
+#~ "1 MiB\n"
+#~ "2 MiB\n"
+#~ "4 MiB\n"
+#~ "8 MiB\n"
diff --git a/deluge/i18n/mk.po b/deluge/i18n/mk.po
new file mode 100644
index 0000000..a1414ae
--- /dev/null
+++ b/deluge/i18n/mk.po
@@ -0,0 +1,4044 @@
+# Macedonian translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2009-11-19 20:22+0000\n"
+"Last-Translator: ÐлекÑандар ÐндевÑки <Unknown>\n"
+"Language-Team: Macedonian <mk@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Име на хоÑÑ‚:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Порт:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "КориÑничко име:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Лозинка:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Од:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Овозможено"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Одбери папка"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Локација за Преземања</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "МакÑ. брзина на Upload:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Ðајвеќе Ð’Ñ€Ñки:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "МакÑ. меÑта за Upload:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "МакÑ. брзина на Download:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>ОпÑег:</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Сопри го Ñидувањето на ратио:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Избриши на ратио"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>РедоÑлед</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Опции"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Download лимит:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Upload лимит:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Ðктивни торенти:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Бавни поÑтавувања</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Ðевалидна етикета, валидни карактери:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Празна етикета"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Етикетата веќе поÑтои"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Ðепозната етикета"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Ðепознат торент"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Етикета"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "_Oпции за етикети"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "Избриши етикета"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "Додај етикета"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Опции за етикетите"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Опции за етикетите</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "МеÑта за Upload:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Брзина на Upload:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Брзина на Download:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Ð’Ñ€Ñки:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Додај макÑимални поÑтавувања по торент:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "МакÑимум"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "ÐвтоматÑко менаџирање"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Додај поÑтавувања за редоÑлед:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "РедоÑлед"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "ПремеÑти ги завршените во:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Додај поÑтавувања за локација:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Локација"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 ред за Ñледач)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "ÐвтоматÑко додавање на етикета:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Следачи"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Додај ознака"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "Додај ознака"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Име:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>КориÑтете ја Ñтраничната лента да додавате, изменувате и бришете етикети. "
+"</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Етикети</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "ИзнеÑи во:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Креирај под-папка за името на торентот"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Оваа опција ќе креира под-папка Ñо името на торентот во избраната папка за "
+"изнеÑување и ќе ги Ñтави датотеките таму."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Општо</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Овозможи веб-интерфејÑ"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Овозможи SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Ðктивен порт:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>ПоÑтавувања</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP лиÑта (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer текÑÑ‚ (Zipped)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian текÑÑ‚ (Uncompressed)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Ðевалиден водач"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Ðевалиден магичен код"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Ðевалидна верзија"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "БлоклиÑта"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Денови"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Провери за нова лиÑта Ñекои:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Додади блоклиÑта на Ñекое Ñтартување"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Симни ја блоклиÑтата ако е потребно и внеÑи ја датотеката"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Провери Ñимни и внеÑи"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Симни нова блоклиÑта и внеÑи ја"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "ПриÑили Ñимни и внеÑи"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "БлоклиÑтата е Ñвежа"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>ПодеÑувања</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Тип:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Датум:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Големина на датотека:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>информации</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Торентот заврши"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Торентот е додаден"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Изврши"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "ÐаÑтан"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Команда"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Додај команда</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Команди</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Ðајава УÑпешна"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Ðајавата е иÑпратена"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Предупредување"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Грешка"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "ÐфганиÑтан"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Ðланд ОÑтрови"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Ðлбанија"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Ðлжир"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Ðмерички Самоа"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Ðндора"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Ðнгола"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Ðнгила"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Ðнтарктик"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Ðнтигва и Барбуда"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Ðргентина"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Ðрменија"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Ðруба"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "ÐвÑтралија"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "ÐвÑтрија"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Ðзербејџан"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Бахами"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Бахреин"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Бангладеш"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "БарбадоÑ"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "БелоруÑија"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Белгија"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Белизе"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Бенин"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Бермуда"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Бутан"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Боливија"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "БоÑна и Херцеговина"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Боцвана"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Буве ОÑтров"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Бразил"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "БританÑко-индиÑка ОкеанÑка Територија"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Брунеи ДаруÑалам"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Бугарија"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Буркина ФаÑо"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Бурунди"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Камбоџа"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Камерун"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Канада"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Капе Верде"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "КајманÑки ОÑтрови"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Централно ÐфроканÑка Република"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Чад"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Чиле"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Кина"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "ВелигденÑки ОÑтрови"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "ÐšÐ¾ÐºÐ¾Ñ (Килинг) ОÑтрови"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Колумбија"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Комори"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Конго"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Конго, ДемократÑка Република"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Кук ОÑтрови"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "КоÑта Рика"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Брег на Слоновата КоÑка"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "ХрватÑка"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Куба"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Кипар"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Чешка"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "ДанÑка"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Ðибути"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Доминика"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "ДоминиканÑка Република"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Еквадор"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Египет"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "Ел Салвадор"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "ЕкваторÑка Гвинеја"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Еритреа"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "ЕÑтонија"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Етиопија"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "ФолкландÑи ОÑтрови (Малвини)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "ФарÑки ОÑтрови"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Фиџи"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "ФинÑка"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Франција"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "ФранцуÑка Гвајана"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "ФранцуÑка Полинезија"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "ФранцуÑка Јужна Територија"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Габон"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Гамбија"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Грузија"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "Германија"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Обединето КралÑтво"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Гана"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Гибралтар"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Грција"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Гренланд"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Гренада"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Гвадалупе"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Гуам"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Гватемала"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Гурнзи"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Гвинеја"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Гвинеја-БиÑау"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Гвајана"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Хаити"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "ХердÑки ОÑтрови и МекДоналд ОÑтрови"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Ватикан"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "ХондураÑ"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Хонг Конг"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Унгарија"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "ИÑланд"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "Индија"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Индонезија"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Иран, ИÑламÑка Република"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Ирак"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "ИрÑка"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "ОÑтров Ман"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Израел"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Италија"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Јамајка"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Јапонија"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "ÐерÑи"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Јордан"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "КазакÑтан"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Кениа"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Кирибати"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Кореа, ДемократÑка Ðародна Република"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Кореа, Република"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Кувајт"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "КиргиÑтан"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Лао Ðародна ДемократÑка Република"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Латвија"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Либан"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "ЛеÑото"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Либерија"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Либија"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Лихтенштајн"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Литванија"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "ЛукÑембург"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Макао"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Македонија"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "МадагаÑкар"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Малави"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Малезија"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Малдиви"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Мали"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Малта"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "МаршалÑки ОÑтрови"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Мартиник"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Мавританија"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "МаурициуÑ"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Мајоте"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "МекÑико"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Микронезија, Федеративни Држави"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Молдавија"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Монако"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Монголија"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Црна Гора"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "МонÑерат"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Мароко"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Мозамбик"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Мјанмар"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Ðамибија"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Ðауру"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Ðепал"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Холандија"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "ХоландÑки Ðнтили"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Ðова Каледонија"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Ðов Зеланд"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Ðикарагва"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Ðигер"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Ðигерија"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Ðиуе"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Ðорфолк"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Северна Мариана ОÑтрови"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Ðорвешка"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Оман"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "ПакиÑтан"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Палау"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "ПалеÑтина, Окупирана Територија"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Панама"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Папуа Ðова Гвинеја"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Парагвај"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Перу"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Филипини"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Питкаирн"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "ПолÑка"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Португалија"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Порто Рико"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Катар"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Реунион"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Романија"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "РуÑка Федерација"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Руанда"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Свети Бартелемеј"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Света Хелена"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Свет ÐšÐ¸Ñ‚Ñ Ð¸ ÐевиÑ"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Света Луција"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Свети Мартин"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Свет Пјер и Микелон"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Свет ВинÑент и Гренадините"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Самоа"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "Сан Марино"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Сао Томе и Принципе"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "СаудиÑка Ðрабија"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Сенегал"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Србија"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Сејшели"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Сиера Леоне"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Сингапур"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Словачка"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Словенија"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "СоломонÑки ОÑтрови"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Сомалија"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Јужна Ðфрика"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Јужна Ðорџија и Јужни Сендвич ОÑтрови"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Шпанија"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Шри Ланка"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Судан"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Суринаме"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Свалбард и Јан Мајен"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Свазиленд"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "ШведÑка"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Швајцарија"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Сирија"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Тајван, КинеÑка провинција"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "ТаџикиÑтан"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Танзанија"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Тајланд"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Тимор-ЛеÑте"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Того"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Токелау"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Тонга"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Тринидад и Тобаго"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "ТуниÑ"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Турција"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "ТуркмениÑтан"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Ð¢ÑƒÑ€ÐºÑ Ð¸ ÐšÐ°Ð¸ÐºÐ¾Ñ ÐžÑтрови"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Тувалу"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Уганда"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Украина"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Обединети ÐрабÑки Емирати"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "СÐД"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "СÐД мали оÑтрови"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Уругвај"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "УзбекиÑтан"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Вануату"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Венецуела"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Виетнам"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Вирџин ОÑтрови, БританÑки"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Вирџин ОÑтрови, СÐД"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Ð’Ð°Ð»Ð¸Ñ Ð¸ Футуна"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Западна Сахара"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Јемен"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Замбија"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Зимбабве"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Офлајн"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Онлајн"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Поврзан"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Даемонот не поÑтои"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Даемонот не е вклучен"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Стартување на Ñервер Ñо PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "ÐдреÑа"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Клиент"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "ПрогреÑ"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Брзина на Ñимнување"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Брзина на качување"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Торент"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Торентите Ñе подредени"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Торентот е подреден"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Ðеограничено"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Ðктивирани"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Друго..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Симнува:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Качува:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Ðадолу"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Ðагоре"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "ПоÑтави макÑимална брзина за Ñимнување"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "ПоÑтави макÑимална брзина за качување"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Завршен торент"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Овој емаил ви е иÑпратен Ñо цел да ве информира дека Deluge заврши Ñо "
+"Ñимнување на %(name)s, \t\tкој вклучуваше %(num_files)i датотеки.\n"
+"За да ги иÑклучите овие извеÑтувања, едноÑтавно иÑклучете\t\tемаил "
+"извеÑтувања во подеÑувањето на Deluge.\n"
+"\n"
+"Благодариме,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Преземања"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Мрежа"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Сообраќај"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "ИнтерфејÑ"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Друго"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Даемон"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "ПрокÑи"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Кеш"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Приклучоци"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Додаток"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Изберете додаток"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Додаток Eggs"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Име на датотека"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Големина"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Ðевалидна датотека"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Дупликат торент"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Ðе може да Ñе додаде иÑтиот торент два пати."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "ÐеуÑпешно подеÑување на приоритет!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Одберете .torrent датотека"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Торент датотеки"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Сите датотеки"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Ðевалиден URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Симнувањето е неуÑпешно"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Ðиво"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Тракер"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Избери датотека"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Избери папка"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Зачувај .torrent датотека"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Ðе е поврзан"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Ð’Ñ€Ñки"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Брзина на Download"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Брзина на Upload"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Протокол Ñообраќај Download/Upload"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT јазли"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Ðема дојдовни врÑки"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "ПоÑтави макÑимум врÑки"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Торенти"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Ðикој"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Грешка при додавањето на хоÑтот"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "ИÑклучи КлаÑичен мод?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Изгледа дека Deluge даемон процеÑот (deluged) е веќе вклучен.\n"
+"\n"
+"Ќе мора или да го Ñопрете даемонот или да иÑклучите КлаÑичен мод за да "
+"продолжите"
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Грешка при Ñтартување на јадрото"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"Се јави грешка при Ñтартување на битна компонента која мора да биде вклучена "
+"за да работи Deluge во КлаÑичен мод.\n"
+"\n"
+"Ве молиме погледнете ги деталите подолу за повеќе информации."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Поради грешка при Ñтартување во КлаÑичен мод, би Ñакале да продолжите Ñо "
+"негово иÑклучување?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Грешка при Ñтартување на даемонот"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"Имаше грешка при Ñтарување на даемон процеÑот. Пробајте Ñо Ñтартување од "
+"конзола за да видите дали има некоја грешка."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Вклучено"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "ИÑклучено"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "ПоÑтави неограничено"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Избери нов директориум за датотеките"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "ПоÑтави макÑимум меÑта за Upload"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Приоритет"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Детали:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Име"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Преземени"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Прикачени"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Сејачи"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Пријатели"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ЕТÐ"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "СоодноÑ"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "ДоÑтапно"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Додадено"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Датотека"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "Додај _Торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Креирај торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Уреди"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Менаџер на врÑки"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Поглед"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Ðлатник"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Страничник"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "СтатуÑ_поле"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "Т_абови"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Колони"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "Ст_раничник"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Покажи _Ðула погодоци"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Покажи _Тракери"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Помош"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "ЧеÑто ПоÑтавувани Прашања"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Додај торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Додај Торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "ОтÑтрани торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "ОтÑтрани Торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Паузирај го избраниот торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Пауза"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Обнови ги избраните торенти"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Продолжи"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Подреди Торент Погоре"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Подреди Погоре"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Подреди Торент Подолу"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Подреди Подолу"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Преференци"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Менаџер на врÑки"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Прошири Сите"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Ðе Ñимнувај"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "Ðорма_лен Приоритет"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_ВиÑок приоритет"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "ÐајвиÑ_ок приоритет"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>ÐвтоматÑки менаџиран:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Ранк на Ñејач:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Време на Ñеење:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Време на активноÑÑ‚:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð½Ð° Тракерот:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>ДоÑтапноÑÑ‚:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Пријатели:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Сејачи:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Делови:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>ПВЗ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Следна Ðајава:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>СоодноÑ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Качени</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Преземено</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Дата на додавање:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_СтатуÑ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Коментари:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># на датотеки:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Хаш:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Тракер:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Вкупна големина:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Име:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Патека:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>СтатуÑ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Детали"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Датотеки"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Пријатели"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "ПремеÑти завршени:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Приватен"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Приоритизирај Прв/ПоÑледен"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_Уреди тракери"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Опции"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Избриши торент?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+"<big><b>Дали навиÑтина Ñакате да го избришате избраниот торент?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>Поврзаниот .torrent ќе биде избришан!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Симнатите податоци ќе бидат избришани!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Избришај го избраниот торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Ðова верзија"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>ДоÑтапна е нова верзија!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>ДоÑтапна верзија:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Сегашна верзија:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Во иднина не го покажувај овој диалог"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Оди кон вебÑајт"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Додади пријател по IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Одбери Ñе"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Паузирај Сите"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Продолжи ги Ñелектираните торенти."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Продол_жи Сите"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Додај Торенти"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_ÐдреÑа"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_ОтÑтрани"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Торенти</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Да_тотеки"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Полно"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Компактно"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Ðлокација</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "МакÑимална Download Брзина:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "МакÑимална Upload Брзина:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Додај во _паузирана ÑоÑтојба"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Приоритизирај прв/поÑледен дел"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Врати на Ñтандардно"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "ПоÑтави за Ñите"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Додај адреÑа"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Од адреÑа</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Додај Infohash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Од Infohash</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Тракери:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Креирај Торент"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Креирај Торент</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Пап_ка"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Оддалечена патека"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Датотеки</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Ðвтор:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Коментари:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "инфо"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Веб-Ñејачи"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Големина на дел:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "ПоÑтави приватно знаме"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Додај го овој торент кон ÑеÑијата"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "ВнеÑи оддалечена патека"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Оддалечена патека</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Патека:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Креирање на торент"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Зачувај .torrent како"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Зачувај .torrent датотека</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Подредени торенти"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Додади ги подредените торенти</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "ÐвтоматÑки додај торенти на Ñекое поврзување"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "етикета"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Додај Пријател"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Додај пријател</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "хоÑÑ‚:порт"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Додај хоÑÑ‚"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "Менаџер на врÑки"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Стартувај локален даемон"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "ÐвтоматÑко поврзување Ñо избраниот хоÑÑ‚ на Ñекое Ñтартување"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "ÐвтоматÑко Ñтартување на localhost ако е потребно"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Ðе го покажувај овој дијалог на Ñтартување"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Симнувања</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Ðвто. додај .torrent-и од:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Симни во:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Копии од .torrent датотеки во:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Папки</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "КориÑти целоÑна алокација"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"ЦелоÑна алокација предвреме го алоцира проÑторот кој е потребен за торентот "
+"и Ñпречува фрагментација на диÑкот"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "КориÑти компактна алокација"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Компактната алокација зазема проÑтор за време на преземањето."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Приоритизирај први и поÑледни делови од торентот"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Приоритизирај први и поÑледни делови во датотеките од торентот"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Додај торенти во паузирана ÑоÑтојба"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Мрежа</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "КориÑти Ñлучајни порти"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge автоматÑки ќе одбира различна порта при Ñекое кориÑтење."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Ðктивна Порта"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "До:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "ТеÑтирај Ðктивна Порта"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Дојдовни порти</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Појдовни порти</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"ВнеÑете ја IP адреÑата на интерфејÑот кој ќе Ñлужи за примање на дојдовни "
+"bittorrent врÑки. ОÑтавете го ова празно за кориÑтење на Ñтандардната IP "
+"адреÑа."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>ИнтерфејÑ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"TOS бајтот поÑтавен во IP заглавјето на Ñекој пакет пратен до пријателите "
+"(вклучувајки web Ñејачи). Потребна е Hex вредноÑÑ‚."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "TOS пријател бајт:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Уневарзален Приклучи и Пушти"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT Port Mapping Protocol"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "ПријателÑка Размена"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery finds local peers on your network."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "ДиÑтрибуирана хаш табела за подобрување на активните врÑки"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Мрежни Додатоци</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Влезна"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Ðиво:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"ПриÑилен\n"
+"Овозможен\n"
+"ИÑклучен"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Handshake\n"
+"ЦелоÑен проток\n"
+"Било кој"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Излезна"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Енкриптирај го целиот проток"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Енкрипција</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>ОпÑег</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "МакÑимум обиди за конекција во Ñекунда:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "МакÑимум полуотворени врÑки:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"МакÑимум брзина за качување за Ñите торенти. ПоÑтави -1 за неограничено."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "МакÑимум брзина на качување (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "МакÑимум дозволени врÑки. ПоÑтави -1 за неограничено."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "МакÑимум врÑки:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"МакÑимум позиции за качување за Ñите торенти. ПоÑтави -1 за неограничено."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "МакÑимум Позиции за Качување:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"макÑимум брзина за преземање за Ñите торенти. ПоÑтави -1 за неограничено."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "макÑимум брзина на преземање (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Игнорирај лимити на локалната мрежа"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Оцени лимити на IP overhead"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Ðко е штиклирано, преÑметаниот TCP/IP overhead е иÑцеден од лимитерите на "
+"Ñтапка, за избегнување на надминување на лимитот на целоÑниот Ñообраќај"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Глобален Ñообраќај</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr "МакÑимум позиции за качување по торент. ПоÑтави -1 за неограничено."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "МакÑимален број на врÑки по торент. ПоÑтави -1 за неограничено."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Сообраќај по торент</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>ИнтерфејÑ</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Овозможи"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"КлаÑичниот мод делумно ќе ја Ñкрие функционалноÑта на даемонот и ќе го "
+"направи Deluge да изгледа како единечна апликација. Употребете го ова ако "
+"не Ñакате да ја иÑкориÑтите предноÑта на Deluge како даемон. Мора да го "
+"реÑтартирате Deluge за ова да дојде во ефект."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>КлаÑичен мод</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Покажи брзина на ÑеÑија во наÑловот"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Главен прозорец</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Покажи Ñекогаш"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "ДонеÑи го дијалогот во фокуÑ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Додај дијалог за торенти</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Овозможи икона во ÑиÑ. лента"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Минимизирај во ÑиÑтемÑка лента на отворање."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Започни во ÑиÑ. лента"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Заштити Ñо лозинка ÑиÑ. икона."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>СиÑтемÑка лента</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Друго</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "ИзвеÑтувања за нови изданија"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge ќе провери во нашите Ñервери и ќе ве извеÑти ако има понова верзија"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Ðадградби</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Помогнете ни да го подобриме Deluge Ñо иÑпраќање на вашата Python верзија, "
+"PyGTK верзија, ОС и тип на процеÑор. Ðикаква друга информација нема да биде "
+"пратена."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Да, иÑпрати анонимна ÑтатиÑтика"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>СиÑтемÑки Информации</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Локација:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Ðко Deluge не уÑпее да пронајде датотека Ñо база на податоци на оваа локациј "
+"ќе побара информација кориÑтејќи DNS за пронаоѓање на земјата на пријателот."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP база на податоци</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Поврзи Magner врÑки Ñо Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Даемон</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Даемон порта:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Порта</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Дозволи оддалечени врÑки"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Ð’Ñ€Ñки</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Периодично проверувај ја веб-Ñтраната за нови изданија"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Друго</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Ред</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Подреди ги новите торенти најгоре"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Вкупно активно Ñеани:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Вкупно активни:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Вкупно активно Ñимнувани:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Ðе ги Ñметај бавните торенти"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Ðктивни торенти</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Споделен лимит на ратио:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Време на Ñеано ратио"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Време на Ñеење (м):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Сопри Ñо Ñеење кога ке Ñе доÑтигне делено ратио:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "ОтÑтрани торент кога ќе Ñе доÑтигне делено ратио:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Сејам</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>ПрокÑи</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "ХоÑÑ‚:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Ðиеден\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Пријател</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Web Ñејач</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Тракер</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Кеш</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Големина на кеш (16KiB-ни блокови):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Време во Ñекунди од поÑледното кеширано запишување во дел од запишуваниот "
+"кеш до приÑилното пишување на диÑк. Стандардно е 60 Ñекунди."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "ИÑтекување на кешот (Ñекунди):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"Вкупниот број на 16 KiB блокови запишани на диÑк од Ñамиот почеток на "
+"ÑеÑијата."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Блокови запишани:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"Вкупниот број на извршени операции за запишување од Ñамиот почеток на "
+"ÑеÑијата."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Запишувања:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"Ратио (блокови запишани - запиÑи) / блокови запишани претÑтавува број на "
+"зачувани операции за запишување по вкупно операции за запишување, пр. вид на "
+"кеш за кешот за запишување."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "Кеш за запишување ратио на погодоци:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Запишувања</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Број на блокови кои беа побарани од bittorrent енџинот (од пријателите), "
+"Ñервирани од диÑкот или кешот."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Блокови прочитани:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "Број на блокови кои беа Ñервирани од кешот:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "Погодоци на блоковите за читање:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "Ратио на погодоците на кешот за читањето."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "Ратио на погодоци на кешот за читање:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr "Вкупен број на операции на читање од почетокот на ÑеÑијата."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Отчитувања:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Отчитување</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Број на 16 KiB блокови моментално на кешот на диÑкот. Ова вклучува и кеш за "
+"пишување и читање."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Големина на кешот:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Големина на кешот за читање:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Големина</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>СтатуÑ</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Додатоци</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Верзија:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Домашна Ñтрана:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Емаил на авторот:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_ИнÑталирај додаток"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Скенирај додатоци повторно"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_Ðајди повеќе додатоци"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Покажи Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Продолжи Сите"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_Ограничено преземање"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_Ограничено качување"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Откажи и иÑклучи даемон"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Отвори папка"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Продол_жи"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Оп_ции"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "Во _редица"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_ОÑвежи Тракер"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_ОтÑтрани Торент"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "П_риÑили повторна проверка"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "ПремеÑти _Ñкладирање"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "_Лимит на врÑка"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Лимит на _Upload меÑто"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_AвтоматÑко менаџирање"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Избришај го избраниот торент?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Ðко ги избришате податоците, ќе бидат трајно изгубени."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Уреди тракери"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Уреди тракери</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Додај Тракер"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Додај Тракери</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Уреди Тракери"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Уреди Тракери</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Тракер:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Избришај Ñо _Податоци"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Избришај _Торент"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "ПремеÑти Ñкладирање"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>ПремеÑти Ñкладирање</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "ДеÑтинација:"
+
+#~ msgid "Remove"
+#~ msgstr "ОтÑтрани"
+
+#~ msgid "Clear"
+#~ msgstr "ИÑчиÑти"
+
+#~ msgid "Add"
+#~ msgstr "Додај"
+
+#~ msgid "Availability"
+#~ msgstr "ДоÑтапноÑÑ‚"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Ð¡Ð¾Ð¾Ð´Ð½Ð¾Ñ Ð½Ð° делење"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Брзина:</b>"
+
+#~ msgid "Details"
+#~ msgstr "Детали"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Избриши го торентот"
+
+#~ msgid "Select All"
+#~ msgstr "Избери ÑÑ"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Filters"
+#~ msgstr "Филтри"
+
+#~ msgid "From"
+#~ msgstr "Од"
+
+#~ msgid "Type"
+#~ msgstr "Тип"
+
+#~ msgid "Disabled"
+#~ msgstr "Оневозможено"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "seconds"
+#~ msgstr "Ñекунди"
+
+#~ msgid "Server"
+#~ msgstr "Сервер"
+
+#~ msgid "Port"
+#~ msgstr "Порта"
+
+#~ msgid "Password"
+#~ msgstr "Лозинка"
+
+#~ msgid "Username"
+#~ msgstr "КориÑничко име"
+
+#~ msgid "_Quit"
+#~ msgstr "_Ðапушти"
+
+#~ msgid "Unknown"
+#~ msgstr "Ðепознато"
+
+#~ msgid "Download"
+#~ msgstr "Преземи"
+
+#~ msgid "Upload"
+#~ msgstr "Качи"
+
+#~ msgid "Files"
+#~ msgstr "Датотеки"
+
+#~ msgid "Graph"
+#~ msgstr "Графа"
+
+#~ msgid "New Password"
+#~ msgstr "Ðова лозинка:"
+
+#~ msgid "Template"
+#~ msgstr "Образец"
+
+#~ msgid "Image Only"
+#~ msgstr "Само Ñлики"
+
+#~ msgid "Text Only"
+#~ msgstr "Само текÑÑ‚"
+
+#~ msgid "Text and image"
+#~ msgstr "ТекÑÑ‚ и Ñлики"
+
+#~ msgid "About"
+#~ msgstr "За"
+
+#~ msgid "Disable"
+#~ msgstr "ИÑклучи"
+
+#~ msgid "Next Announce"
+#~ msgstr "Следна најава"
+
+#~ msgid "Logout"
+#~ msgstr "Одјави Ñе"
+
+#~ msgid "Login"
+#~ msgstr "Ðајави Ñе"
+
+#~ msgid "Speed"
+#~ msgstr "Брзина"
+
+#~ msgid "Set"
+#~ msgstr "ПоÑтави"
+
+#~ msgid "Start"
+#~ msgstr "Почеток"
+
+#~ msgid "Submit"
+#~ msgstr "ИÑпрати"
+
+#~ msgid "Total Size"
+#~ msgstr "Вкупна големина"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge е заклучен"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge е заштитен Ñо лозинка.\n"
+#~ "За да го отворите Deluge, внеÑете ја лозинката."
+
+#~ msgid "Graphs"
+#~ msgstr "Графикони"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Додај Торенти</b></big>"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "ова Ñеуште не е имплементирано..\n"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s не е валиден URL"
+
+#~ msgid "Downloading.."
+#~ msgstr "Симнување..."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "ÐеуÑпешно Ñимнување на: %s"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Ðе е поврзан.."
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge е заштитен Ñо лозинка!</big></b>"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>ВнеÑете ја вашата лозинка за да продолжите</i>"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Вклучува %i датотеки"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "Оваа програма е Ñлободен Ñофтвер; можете да ја редиÑтрибуирате и/или "
+#~ "модификувате под уÑловите на GNU General Public лиценцата публикувана од "
+#~ "Фондацијата за Слободен Софтвер; или верзија 3 од лиценцата, или (по ваш "
+#~ "избор) Ñекоја подоцна верзија. Оваа програма Ñе диÑтрибуира Ñо цел да биде "
+#~ "кориÑна, но БЕЗ ÐИКÐКВРГÐРÐÐЦИЈÐ; ниту ни без имплицираната гаранција за "
+#~ "ТРГУВÐÐОСТ или КВÐЛИФИКУВÐÐОСТ ЗРОДРЕДЕÐРЦЕЛ. Погледнете ја GNU General "
+#~ "Public лиценцата за оваа програма; ако не погледнете "
+#~ "<http://www.gnu.org/licenses>. Додатно, како поÑебен иÑклучок, ноÑителите на "
+#~ "авторÑки права дозволуваат поврзување на делови од оваа програма Ñо OpenSSL "
+#~ "библиотеката. Мора да Ñе придржувате кон GNU General Public лиценцата во "
+#~ "Ñите Ñлучаи на кориÑтење на кодот оÑвен Ñо OpenSSL. Ðко модифицирате "
+#~ "датотеки Ñо овој иÑклучок, може да го продолжите иÑклучокот Ñо вашата "
+#~ "верзија на датотеките, но не Ñте приморани на тоа. Ðко не Ñакате да го "
+#~ "продолжите овој иÑклучок, тогаш избришете го делот каде тоа е наведено во "
+#~ "вашата верзија. Ðко го избришете овој иÑклучок од изворниот код на "
+#~ "програмата, иÑто така избришете го и во оваа датотека."
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "State"
+#~ msgstr "СоÑтојба"
+
+#~ msgid "no label"
+#~ msgstr "без етикета"
+
+#~ msgid "Other.."
+#~ msgstr "Друго.."
+
+#~ msgid "Homepage"
+#~ msgstr "Домашна Ñтраница"
+
+#~ msgid "FAQ"
+#~ msgstr "ЧПП"
+
+#~ msgid "Community"
+#~ msgstr "ОпштеÑтво"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "page 6"
+#~ msgstr "Ñтрана 6"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 7"
+#~ msgstr "Ñтрана 7"
+
+#~ msgid "page 8"
+#~ msgstr "Ñтрана 8"
+
+#~ msgid "page 10"
+#~ msgstr "Ñтрана 10"
+
+#~ msgid "page 11"
+#~ msgstr "Ñтрана 11"
+
+#~ msgid "page 12"
+#~ msgstr "Ñтрана 12"
diff --git a/deluge/i18n/ms.po b/deluge/i18n/ms.po
new file mode 100644
index 0000000..c12a515
--- /dev/null
+++ b/deluge/i18n/ms.po
@@ -0,0 +1,4688 @@
+# Malay translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2009-06-16 03:55+0000\n"
+"Last-Translator: Ibrahim Elias <imen802003@netscape.net>\n"
+"Language-Team: Malay <ms@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Henti semai pada kadar:"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Pilihan Label"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Pilihan Label</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Kelajuan Muatnaik"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Pindah telah selesai ke:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Tetapkan lokasi aturan:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Penjejak-penjejak"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr "<i>Gunakan bar-sisi untuk tambah, edit dan buang label.</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Label-label</b>"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Perincian:"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Sambung torrent dipilih."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Sam_bung Semua"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Kompak"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Tambah Dalam Keadaan _Kejang"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Utamakan Awal/Akhir Cebisan"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Tetapkan Kepada Semua"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Muaturun</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Tambah .torrent auto dari:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Muaturun ke:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Salin fail .torrent ke:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Peruntukan kompak hanya menperuntukkan ruang yang diperlukan"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Guna Port Rawak"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "TOS Byte Rakan:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Abaikan had pada jaringan tempatan"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Antaramuka</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Tunjuk kelajuan sesi pada bar tajuk"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Tingkap Utama</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Sentiasa tunjuk"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Fokus kepada dialog"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Tambah Dialog Torrents</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Lain</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Sambungan</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Periksa laman sesawang berkala untuk keluaran terbaru"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Lain</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Jumlah muaturun aktif:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Had Kadar Kongsi:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Masa Semai (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Henti semai bila kadar kongsi mencapai:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Buang torrent bila kadar kongsi mencapai"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Benih Sesawang</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Muka utama:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Email Pengarang:"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "Pindah _Simpanan"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "Had _Sambungan"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Had _Slot Muatnaik"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "Diurus _Auto"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Tambah Penjejak"
+
+#~ msgid "page 11"
+#~ msgstr "muka 11"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Nama Host"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Nama pengguna:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Kata laluan:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Dari:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Dibolehkan"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Tetapan"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Pilih Folder"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Lokasi Muat turun</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Kelajuan Maksima Upload:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Sambungan Maksima:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Slot Muatnaik Maksima:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Kelajuan Maksima Download:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Jalur lebar</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Singkirkan pada nisbah"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Atas"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Bawah"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Queue</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Pilihan"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Had Muat Turun"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Had Muat Naik"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Torrent aktif:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b> Tetapan Perlahan</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Label tidak sah, aksara sah:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Label Kosong"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Label telah wujud"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Label tidak diketahui"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Torrent tidak diketahui"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Pilihan_Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_Buang Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_Tambah Label"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Slot Muatnaik:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Kelajuan Muat Turun"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Sambungan:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Tetapkan setiap torrent penetapan maksima"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maksima"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Diurus secara automatik"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Tetapkan aturan Barisan:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Aturan"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Lokasi"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 baris setiap penjejak)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Tetapkan label secara automatik:"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Tambah Label"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Tambah Label</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Nama:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Ekstrak ke:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Cipta nama sub-folder torrent"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Pilihan ini akan cipta sub-folder menggunakan nama torrent pada folder "
+"ekstrak yang dipilih dan meletakkan fail yang diekstrak ke sana"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Umum</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Membolehkan paparan web"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Membolehkan SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Mendengar port:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Aturan</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "List IP Emule (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "Teks SafePeer (Zipped)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "Teks PeerGuardian (Uncompressed)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Leader tidak sah"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Kod magik salah"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Versi salah"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Senarai Sekatan"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Hari"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Periksa untuk senarai baru setiap hari"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Import senaraiblok bila startup"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Muaturun fail blocklist jika perlu dan import"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Periksa Muaturun dan Import"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Muaturun fail senaraiblok baru dan import"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Paksa Muaturun dan Import"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Senarai-sekatan telah dikemas-kini"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Pilihan</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Jenis:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Tarikh:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Saiz fail"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Info</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torrent Siap"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torrent Ditambah"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Laksanakan"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Peristiwa"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Perintah"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Tambahkan Perintah</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Perintah</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Hebah OK"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Hebahan dihantar"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Amaran"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Ralat"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Afghanistan"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Kepulauan Aland"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Albania"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Algeria"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Samoa Amerika"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antartika"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antigua dan Barbuda"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Argentina"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Armenia"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "Australia"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Austria"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Azerbaijan"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Bahamas"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bahrain"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Bangladesh"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Belarus"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Belgium"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermuda"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Bolivia"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnia Herzegovina"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Kepulauan Bouvet"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brazil"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Wilayah Lautan India British"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Brunei Darussalam"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Bulgaria"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Kemboja"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Cameroon"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Kanada"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Cape Verde"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Kepulauan Cayman"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Republik Afrika Tengah"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Chad"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Chile"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "China"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Kepulauan Christmas"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Kepulauan Cocos (Keeling)"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Colombia"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Comoros"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Congo"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Republik Demokrat Congo"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Kepulauan Cook"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Cote d'Ivoire"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "Croatia"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Cuba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Cyprus"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Republik Czech"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Denmark"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Djibouti"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominica"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Republik Dominica"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Ecuador"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Mesir"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Equatorial Guinea"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Estonia"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Ethiopia"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Kepulauan Falkland (Malvinas)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Kepulauan Faroe"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fiji"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Finland"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Perancis"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "French Guiana"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "French Polynesia"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "Wilayah Selatan Perancis"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Georgia"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "Jerman"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "United Kingdom"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Greece"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Greenland"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadeloupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Guinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Guinea-Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guyana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Kepulauan Heard dan Kepulauan McDonald"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Holy See (Vatican City State)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Hungari"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Iceland"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "India"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonesia"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Republik Islam Iran"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Iraq"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Ireland"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Isle of Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Israel"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Itali"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaica"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Jepun"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordan"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazakhstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenya"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Republik Rakyat Demokratik Korea"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Republik Korea"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuwait"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kyrgyzstan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Lao People's Democratic Republic"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Latvia"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Lubnan"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberia"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libyan Arab Jamahiriya"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Lithuania"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luxembourg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macau"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Macedonia, Bekas Republik Yugoslavia"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagascar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malaysia"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldives"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Kepulauan Marshall"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinique"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauritania"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Mexico"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Negeri-negeri Bersekutu Micronesia"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldova"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolia"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Montenegro"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Maghribi"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambique"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Myanmar"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Belanda"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Netherlands Antilles"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "New Caledonia"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "New Zealand"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Pulau Norfolk"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Kepulauan Mariana Utara"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norway"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Kawasan Diduduki Palestian"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua New Guinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguay"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filipina"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Poland"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugis"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Qatar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Romania"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Persekutuan Rusia"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Rwanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Saint Barthelemy"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Saint Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Saint Kitts dan Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Saint Lucia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Saint Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint Pierre and Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Saint Vincent dan Grenadines"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Sao Tome dan Principe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Arab Saudi"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbia"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seychelles"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapura"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slovakia"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slovenia"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Kepulauan Solomon"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Afrika Selatan"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "South Georgia dan Kepulauan Sandwich Selatan"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Sepanyol"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Suriname"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard dan Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Swaziland"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Sweden"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Switzerland"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Republik Arab Syria"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Taiwan, Wilayah China"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tajikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Republik Bersatu Tanzania"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Thailand"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Timor-Leste"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad dan Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunisia"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Turki"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Kepulauan Caicos dan Turks"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukraine"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Emiriah Arab Bersatu"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Amerika Syarikat"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Pulau Kecil yang Jauh dari Amerika Syarikat"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Uruguay"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Uzbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Kepulauan Virgin, British"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Kepulauan Virgin, Amerika Syarikat"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis dan Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Sahara Barat"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Yaman"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabwe"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Luar Talian"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Dalam talian"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Tersambung"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Daemon tidak wujud"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Daemon tidak berjalan"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Memulakan server dalam PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Alamat"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Klien"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Perkembangan"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Kelajuan Muat turun"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Kelajuan Muat nail"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrents Queued"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrent Queued"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Tak terhad"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Telah diaktifkan"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Lain-lain..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Turun:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Naik:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Turun"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Naik"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Set Kelajuan Muat Turun Maksima"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Set Kelajuan Muat Naik Maksima"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torrent habis"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Email ini adalah untuk memberitahu anda bahawa Deluge telah tamat muat-turun "
+"%(name)s, dimana merangkumi %(num_files)i fail.\n"
+"Untuk berhenti menerima pemberitahuan ini, sila padam notifikasi email dalam "
+"pilihan Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Muat Turun"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Rangkaian"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Bandwidth"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Interface"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Lain-lain"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Daemon"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Proksi"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Cache"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Plugin"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Plugin"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Pilih Plugin"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Plugin Eggs"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Filename"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Saiz"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Fail tidak sah"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Tidak dapat menetapkan keutamaan file!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Pilih fail torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Fail torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Semua fail"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "URL tidak sah"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Muat-turun Gagal"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Tier"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Penjejak"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Pilih satu fail"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Pilih satu folder"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Simpan fail .torrent"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Tidak Bersambung"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Sambungan-sambungan"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Kelajuan Muat Turun"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Kelajuan Muat Naik"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Protocol Traffic Download/Upload"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "Nod DHT"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Tiada Sambungan Masuk!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Set Sambungan Maksima"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Label"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Semua"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Sedang Dimuat Turun"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Benihan"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Rehat"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Sedang Disemak"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "Gilir"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Tiada"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Tiada Label"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Host"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Ralat Menambah Hos"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Padam Mod Klasik?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Didapati proses daemon Deluge (deluged) telah berjalan.\n"
+"\n"
+"Sama ada anda perlu hentikan daemon atau padam Mod Klasik untuk meneruskan."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Ralat Memulakan Core"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"Terdapat ralat dalam memulakan komponen utama dimana ia diperlukan untuk "
+"menjalankan Deluge dalam Mod Klasik\n"
+"\n"
+"Sila lihat butir-butiran dibawah untuk maklumat yang lebih lanjut"
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Ralat Memulakan Daemon"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"Terdapat ralat dalam memulakan proses daemon. Cuba jalankan ia dari konsol "
+"untuk melihat jika terdapat ralat."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "On"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Padam"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Set Tidak Terhad"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Pilih satu direktori untuk pindah fail"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Set Slot Muat naik Maksimum"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Keutamaan"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Nama:"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Telah Dimuat Turun"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Dimuatnaik"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Penyemai-penyemai"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Rakan"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ETA"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Nisbah"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Avail"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Added"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Fail"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Tambah Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Cipta Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Edit"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Pengurus Sambungan"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Papar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Toolbar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Sidebar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Status_bar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "T_abs"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Kolum"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "S_idebar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Papar _Zero Hits"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Papar _Tracker"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Bantuan"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Frequently Asked Questions"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Tambah torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Tambah Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Buang torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Buang Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Tangguh torrent terpilih"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Jeda"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Resume torrent terpilih"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Sambung"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Queue Torrent Ke Atas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Queue keatas"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Queue Torrent Ke Bawah"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Queue Bawah"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Keutamaan"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Pengurus Sambungan"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Expand Semua"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Jangan Muat turun"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Prioriti Biasa"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Prioriti Tinggi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Hi_ghest Priority"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Auto Urus:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Seed Rank:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Masa Seeding:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Masa Aktif:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Status Pengesan:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Kebolehsediaan:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Penerima:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Seeders:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Cebisan:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Anggaran selesai:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Pengumuman Seterusnya:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Kadar kongsi:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<>Jumlah Muat-Naik:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Jumlah Muat-Turun:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Tarikh Tambah:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Status"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Komen:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># gagal</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Pengesan:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<>Saiz Keseluruhan:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Nama:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<>Haluan:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Perincian"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Files"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Peers"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Alih yang selesai:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Persendirian"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Utamakan Pertama/Akhir"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_Edit Trackers"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Pilihan"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Buang Torrent?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>Adakah anda pasti mahu buang torrent terpilih?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>.torrent berkaitan akan dihapus!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Data yang telah dimuatturun akan dihapus!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Buang Torrent Terpilih"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Keluaran Baru"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Keluaran Baru Tersedia!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Versi Tersedia:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Versi Sekarang:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Jangan papar dialog ini dimasa akan datang"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Pergi ke Website"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Tambah satu peer mengikut IPnya"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Pilih Semua"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Hentikan semua sementara"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Tambah Torrent"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_Buang"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrents</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Fa_il"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Penuh"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Allocation</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Kelajuan turun Maksima:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Kelajuan Naik Maksima:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Tukar kepada Asal"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Tambah URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Dari URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Tambah Infohash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Dari Infohash</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Penjejak:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Cipta Torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Cipta Torrent</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Fol_der"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Remote Path"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Files</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Pengarang:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Komen:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Info"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "SemaianWeb"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Saiz kepingan"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Tetap Bendera Peribadi"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Tambah torrent ini pada sesi"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Masuk Remote Path"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Remote Path</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Path:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Mencipta Torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Simpan .torrent sebagai"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Simpan .torrent file</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Queued Torrents"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Tambah Queued Torrents</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Tambah torrent secara automatik bila sambung"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "label"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Tambah Peer"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Tambah Peer</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "hostname:port"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Tambah Host"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Pengurus Sambungan</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Mula daemon tempatan"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Sambung secara automatik bagi host terpilih ketika start-up"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Mula localhost secara automatik sekiranya diperlukan"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Jangan papar dialog ini pada start-up"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Folders</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Guna Full Allocation"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Pra-peruntuk peruntukan penuh semua ruang yang diperlukan untuk torrent dan "
+"halang disk fragmentation"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Guna penempatan padat"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Utamakan cebisan awal dan akhir torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Utamakan cebisan awal dan akhir fail dalam torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Tambah torrent dalam keadaan Selang"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Jaringan</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+"Deluge akan memilih port berlainan secara automatik setiap kali digunakan."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Active Port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Kepada:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Periksa Port Aktif"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Port Masuk</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Port Keluar</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Masukkan alamat IP paparan untuk mendengar kemasukkan sambungan bittorent. "
+"Tinggalkan ia kosong jika anda ingin menggunakan yang asal"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>Antaramuka</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"Byte TOS ditetapkan pada permulaan IP setiap peket dihantar kepada rakan "
+"(termasuk benih sesawang). Jangkakan nilai Hex."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT Port Mapping Protocol"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Tukar Rakan"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Jelajah Servis Tempatan mencari rakan tempatan dalam jaringan anda."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Hash table teragih boleh meningkatkan jumlah sambungan aktif."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Network Extras</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Inbound:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Level:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Dipaksa\n"
+"Dibolehkan\n"
+"Tidak dibolehkan"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Outbound:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Encrypt seluruh stream"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Encryption</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Jalur lebar</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Cubaan maksimum sambungan per saat:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Maximum Half-Open Connections:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Had kelajuan muat naik maksimum untuk semua torrent. Set -1 untuk tidak "
+"terhad."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Kelajuan Muat naik Maksimum (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "Maksimum connection dibenarkan. Set -1 untuk tak terhad."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Maximum Connections:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Had slot muat naik maksimum untuk semua torrent. Set -1 untuk tak terhad."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Slot Muat naik Maksimum:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Had kelajuan muat turun maksimum untuk semua torrent. Set -1 untuk tak "
+"terhad."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Kelajuan Muat turun Maksimum (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Kadar had overhead IP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Global Bandwidth Usage</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr "Had slot muat naik maksimum per torrent. Set -1 untuk tak terhad."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "Bilangan connection maksimum per torrent. Set -1 untuk tak terhad."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Per Torrent Bandwidth Usage</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Hidupkan"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Mod klasik akan menyembunyikan semua fungsi daemon and membuatkan Deluge "
+"hanya kelihatan sebagai sebuah aplikasi. Gunakan ini jika anda tidak mahu "
+"mengambil kesempatan dengan kelebihan menjalankan Deluge sebagai daemon. "
+"Anda perlu mulakan semula Deluge supaya aturan ini berkesan."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Mod Klasik</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Enable system tray icon"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Minimize to tray on close"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Start in tray"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Password protect system tray"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>System Tray</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Ingatkan mengenai keluaran terbaru"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge akan memeriksa pelayan kami dan akan memberitahu anda jika versi baru "
+"telah dikeluarkan."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Updates</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Bantu kami mempertingkatkan Deluge sengan menghantar versi Python, versi "
+"PyGTK, OS dan jenis pemproses. Tiada maklumat lain yang akan dihantar selain "
+"itu."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Ya, tolong hantar statistik anonymus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "Informasi Sistem"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Lokasi:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>Pangkalan Data GeoIP</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Daemon</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Port daemon:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Port</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Benar Sambungan Jarak Jauh"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Barisan</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Atur torrent baru paling atas"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Jumlah semaian aktif:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Jumlah aktif:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Jangan kira torrent perlahan"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Torrent Aktif</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Kadar Masa Semai :"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Seeding</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Proksi</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Hos:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Rakan</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Penjejak</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Cache</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Saiz cache (blok 16 KiB):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Blok yang ditulis:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Nombor blok 16 KiB sekarang berada pada cache cakera. Ini termasuk cache "
+"membaca dan menulis"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Saiz Cache:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Baca Saiz Cache:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Saiz</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Status</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Plugins</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Versi:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Pasang Plugin"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Scan kembali Plugin"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_Cari Plugin Tambahan"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Show Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Resume All"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_Had laju muat turun"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_Had laju muat atas"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Keluar & Tutup Daemon"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Buka Folder"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Sam_bung"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Pilih_an"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Queue"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Update Tracker"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Buang Torrent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "_Paksa Periksa semula"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Buang torrent yang telah dipilih?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Jika anda buang data, data tersebut akan hilang dengan kekal."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Edit Trackers"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Edit Penjejak</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Tambah Trackers</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Edit Tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Edit Tracker</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Buang Dengan _Data"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Buang _Torrent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Pindah Storan"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Pindah Storan</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Destinasi"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Kelajuan:</b>"
+
+#~ msgid "Details"
+#~ msgstr "Keterangan"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Kadar Kongsi"
+
+#~ msgid "Remove"
+#~ msgstr "Buang"
+
+#~ msgid "Add"
+#~ msgstr "Tambah"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Buang fail .torrent"
+
+#~ msgid "Speed"
+#~ msgstr "Kelajuan"
+
+#~ msgid "Select All"
+#~ msgstr "Pilih Semua"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "Username"
+#~ msgstr "Username"
+
+#~ msgid "Password"
+#~ msgstr "Kata laluan"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "_Quit"
+#~ msgstr "_Keluar"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge telah dikunci"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge dilindungi dengan kata laluan.\n"
+#~ "Untuk melihat window Deluge, sila masukkan kata laluan anda"
+
+#~ msgid "Unknown"
+#~ msgstr "Tidak Diketahui"
+
+#~ msgid "Upload"
+#~ msgstr "Muat naik"
+
+#~ msgid "Files"
+#~ msgstr "Fail-fail"
+
+#~ msgid "Graph"
+#~ msgstr "Graf"
+
+#~ msgid "New Password"
+#~ msgstr "Kata Laluan Baru"
+
+#~ msgid "Template"
+#~ msgstr "Templat"
+
+#~ msgid "translate something"
+#~ msgstr "alih bahasa sesuatu"
+
+#~ msgid "Image Only"
+#~ msgstr "Gambar sahaja"
+
+#~ msgid "About"
+#~ msgstr "Tentang"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Buang file yang dimuatturun"
+
+#~ msgid "Disable"
+#~ msgstr "Matikan"
+
+#~ msgid "Queue Position"
+#~ msgstr "Posisi di aturan"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Kata Laluan salah, cuba lagi"
+
+#~ msgid "Pause all"
+#~ msgstr "Hentikan semua sementara"
+
+#~ msgid "Submit"
+#~ msgstr "Hantar"
+
+#~ msgid "Start"
+#~ msgstr "Mula"
+
+#~ msgid "Total Size"
+#~ msgstr "Jumlah Saiz"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Status penjejak"
+
+#~ msgid "seconds"
+#~ msgstr "saat"
+
+#~ msgid "Active time"
+#~ msgstr "Masa aktif"
+
+#~ msgid "# Of Files"
+#~ msgstr "# Fail"
+
+#~ msgid "Clear"
+#~ msgstr "Kosongkan"
+
+#~ msgid "Admin"
+#~ msgstr "Pentadbir"
+
+#~ msgid "Config"
+#~ msgstr "Konfig"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Sambung ke Deamon"
+
+#~ msgid "Connect"
+#~ msgstr "Sambungkan"
+
+#~ msgid "Connected to"
+#~ msgstr "Disambungkan ke"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge: Senarai Torrent"
+
+#~ msgid "File"
+#~ msgstr "Fail"
+
+#~ msgid "Download"
+#~ msgstr "Muaturun"
+
+#~ msgid "False"
+#~ msgstr "Salah"
+
+#~ msgid "Eta"
+#~ msgstr "Eta"
+
+#~ msgid "Logout"
+#~ msgstr "Logkeluar"
+
+#~ msgid "Move"
+#~ msgstr "Pindah"
+
+#~ msgid "General"
+#~ msgstr "Umum"
+
+#~ msgid "Keyword"
+#~ msgstr "Kata kunci"
+
+#~ msgid "Label torrent"
+#~ msgstr "Label torrent"
+
+#~ msgid "Move torrent"
+#~ msgstr "Pindah torrent"
+
+#~ msgid "Login"
+#~ msgstr "Lomasuk"
+
+#~ msgid "Pieces"
+#~ msgstr "Cebisan-cebisan"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Tidak disambungkan ke deamon"
+
+#~ msgid "Next Announce"
+#~ msgstr "Umum seterusnya"
+
+#~ msgid "Restart"
+#~ msgstr "Mula semula"
+
+#~ msgid "Seed rank"
+#~ msgstr "Pangkat benih"
+
+#~ msgid "Seeding time"
+#~ msgstr "Masa menyemai"
+
+#~ msgid "Set"
+#~ msgstr "Tetap"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Tetap masa tamat"
+
+#~ msgid "Save"
+#~ msgstr "Simpan"
+
+#~ msgid "True"
+#~ msgstr "Benar"
+
+#~ msgid "Update"
+#~ msgstr "Kemaskini"
+
+#~ msgid "Stop"
+#~ msgstr "Henti"
+
+#~ msgid "Torrent list"
+#~ msgstr "Senarai torrent"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Kelajuan Muatnaik Maksimum"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Kelajuan Muaturun Maksimum"
+
+#~ msgid "Download Location"
+#~ msgstr "Lokasi muaturun"
+
+#~ msgid "no uri"
+#~ msgstr "tiada uri"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "segar mesti > 0"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Kesalahan dalam pilihan torrent."
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Muatnaik torrent"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Pentingkan cebisan pertama dan terakhir"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Slot Muatnaik Maksimum"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Pilih url atau torent, bukan keduanya."
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Sambungan Maksimum"
+
+#~ msgid "No data"
+#~ msgstr "Tiada data"
+
+#~ msgid "Ports"
+#~ msgstr "Port"
+
+#~ msgid "To"
+#~ msgstr "Ke"
+
+#~ msgid "Random"
+#~ msgstr "Rambang"
+
+#~ msgid "Extra's"
+#~ msgstr "Lebihan"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Tukar-Rakan"
+
+#~ msgid "From"
+#~ msgstr "Dari"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "DHT Garisan Utama"
+
+#~ msgid "Disabled"
+#~ msgstr "Tidak dibolehkan"
+
+#~ msgid "Either"
+#~ msgstr "Keduanya"
+
+#~ msgid "Forced"
+#~ msgstr "Dipaksakan"
+
+#~ msgid "Encryption"
+#~ msgstr "Penyulitan"
+
+#~ msgid "Handshake"
+#~ msgstr "Jabat tangan"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Simpan fail .torrent ke"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Setiap Torrent"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Simpan semua muaturun dalam"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Cubaan Maksimum Setiap Saat"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Kelajuan Muaturun Maksimum (Kib/s)"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Kelajuan Muatnaik Maksimum (Kib/s)"
+
+#~ msgid "Level"
+#~ msgstr "Tahap"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Tidak Terhad"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Tambah folder auto"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Jumlah torrent aktif"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = tidak terhad"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Jumlah muaturun aktif"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Tambah Torrent</b></big>"
+
+#~ msgid "page 6"
+#~ msgstr "muka 6"
+
+#~ msgid "page 8"
+#~ msgstr "muka 8"
+
+#~ msgid "page 7"
+#~ msgstr "muka 7"
+
+#~ msgid "page 10"
+#~ msgstr "muka 10"
+
+#~ msgid "page 12"
+#~ msgstr "muka 12"
+
+#~ msgid "Availability"
+#~ msgstr "Ketersediaan"
+
+#~ msgid "Resume all"
+#~ msgstr "Sambung semua"
+
+#~ msgid "Graphs"
+#~ msgstr "Graf"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Benih/Rakan"
+
+#~ msgid "Test config value:"
+#~ msgstr "Cuba nilai aturan:"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "ini masih belum berfungsi...\n"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "All Finished!"
+#~ msgstr "Semua Tamat!"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Deluge Setup Wizard"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr "Wizard ini akan membantu anda set up Deluge mengikut pilihan anda."
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "Community"
+#~ msgstr "Komuniti"
+
+#~ msgid "FAQ"
+#~ msgstr "FAQ"
+
+#~ msgid "Homepage"
+#~ msgstr "Homepage"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "slot_muatnaik_maksimum"
+
+#~ msgid "max_connections"
+#~ msgstr "sambungan_maksimum"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Ralat penetapan pilihan label"
+
+#~ msgid "apply_max"
+#~ msgstr "guna_maksimum"
+
+#~ msgid "max_download_speed"
+#~ msgstr "kelajuan-muatturun_maksimum"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "kelajuan_muatnaik_maksimum"
+
+#~ msgid "apply_queue"
+#~ msgstr "terapkan_queue"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "auto_tambah_trackers"
+
+#~ msgid "auto_add"
+#~ msgstr "auto_tambah"
+
+#~ msgid "stop_ratio"
+#~ msgstr "berhenti_ratio"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "berhenti_pada_ratio"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "adalah_diurus_secara automatik"
+
+#~ msgid "move_completed_path"
+#~ msgstr "alih_path_selesai"
+
+#~ msgid "move_completed"
+#~ msgstr "alih_selesai"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "terap_alih_selesai"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "buang_pada_ratio"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Kerja sedang dijalankan.."
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Downloading %.2f%%"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Import ketika startup daemon"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Times untuk percubaan muat turun"
+
+#~ msgid "Import Now"
+#~ msgstr "Import Sekarang"
+
+#~ msgid "BlockList"
+#~ msgstr "BlockList"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Timeout (saat)"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Periksa setiap (days)"
+
+#~ msgid "Force Download"
+#~ msgstr "Muat turun Paksa"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Importing %s"
+
+#~ msgid "Test config value"
+#~ msgstr "Test config value"
+
+#~ msgid "Stats"
+#~ msgstr "Stats"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Blocked Ranges: %s"
+
+#~ msgid "Inactive"
+#~ msgstr "Tidak Aktif"
+
+#~ msgid "Refresh status"
+#~ msgstr "Status Refresh"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "Program ini adalah perisian percuma; anda boleh edar kembali dan/atau ubah "
+#~ "program ini di bawah syarat-syarat GNU General Public License sebagai mana "
+#~ "yang telah diterbitkan oleh Free Software Foundation; sama ada versi 3 lesen "
+#~ "tersebut, atau (pilihan anda) versi terbaru. Program ini diedarkan dengan "
+#~ "harapan ianya akan berguna , tetapi TANPA APA-APA JAMINAN; tanpa jaminan "
+#~ "terpakai BOLEH DINIAGAKAN atau SESUAI UNTUK TUJUAN TERTENTU. Lihat GNU "
+#~ "General Public License untuk perincian maklumat. Anda harus terima satu "
+#~ "salinan GNU General Public License bersama program ini; jika tidak, lihat "
+#~ "<http://www.gnu.org/licenses>."
+
+#~ msgid "Other.."
+#~ msgstr "Lain-lain.."
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Email ini untuk memberitahu anda bahawa Deluge telah selesai muat turun %s , "
+#~ "yang mana termasuk %i fail.\n"
+#~ "Untuk berhenti dari menerima makluman ini, hanya tutup makluman email (email "
+#~ "notification) dalam Deluge Preference.\n"
+#~ "\n"
+#~ "Terima kasih.\n"
+#~ "Deluge"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Termasuk %i fail"
+
+#~ msgid "Filters"
+#~ msgstr "Filters"
+
+#~ msgid "no label"
+#~ msgstr "tiada label"
+
+#~ msgid "State"
+#~ msgstr "State"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torrent melebihi ratio berhenti."
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Statistics"
+#~ msgstr "Statistik"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Perubahan ini telah disimpan"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Betulkan ralat di atas dan cuba lagi"
+
+#~ msgid "Recheck"
+#~ msgstr "Periksa kembali"
+
+#~ msgid "Delete"
+#~ msgstr "Hapus"
+
+#~ msgid "Queue Top"
+#~ msgstr "Queue Atas"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Queue Bawah"
+
+#~ msgid "Inbound"
+#~ msgstr "Inbound"
+
+#~ msgid "Outbound"
+#~ msgstr "Outbound"
+
+#~ msgid "Reannounce"
+#~ msgstr "Hebah kembali"
+
+#~ msgid "Type"
+#~ msgstr "Type"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Sambungan Separuh-buka Maksimum"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Rate Limit IP Overhead"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "Restart deamon dan webui selepas ubah ketetapan ini"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Tambah Automatik dibolehkan"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Buang torrent apabila ratio telah sampai"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Berhenti penyemaian apabila ratia sampai"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Pilih satu pilihan yang sah. Pilihan itu bukan dari pilihan yang tersedia."
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Enabled Plugins"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Masukkan senarai value."
+
+#~ msgid "Total active seeding"
+#~ msgstr "Kesemua penyemaian aktif"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Folder ini tidak wujud."
+
+#~ msgid "Yes"
+#~ msgstr "Ya"
+
+#~ msgid "No"
+#~ msgstr "Tidak"
+
+#~ msgid "This field is required."
+#~ msgstr "Ruang ini diperlukan."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr ""
+#~ "Pilih satu pilihan yang sah. %s bukan daripada pilihan yang tersedia."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Masukkan satu value yang sah."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Pastikan value ini lebih besar daripada atau sama dengan %s."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Masukkan nombor penuh."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Pastikan value ini kurang daripada atau sama dengan %s."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Pastikan value ini mempunyai sekurang-kurangnya %(min)d aksara (ia mempunyai "
+#~ "%(length)d)."
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Pastikan value ini ada semaksimum %(max)d aksara (ia mempunyai %(length)d)."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr ""
+#~ "Tiada fail yang telah diserahkan. Sila semak encoding type dalam borang."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr ""
+#~ "Pilih satu pilihan yang sah. %(value)s adalah bukan dari pilihan yang "
+#~ "tersedia."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Masukkan URL yang sah."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Muat naik image yang sah. Fail yang anda muat naik adalah bukan image atau "
+#~ "image yang rosak."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Fail yang diserahkan adalah kosong."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Tiada fail yang diserahkan."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Masukkan IPv4 yang sah."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "URL ini nampaknya adalah link yang tidak bersambung."
+
+#~ msgid "Move To"
+#~ msgstr "Pindah ke"
+
+#~ msgid "Error in Path."
+#~ msgstr "Ralat dalam Path."
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Key tidak dijumpai pada '%s'"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Certificate tidak dijumpai pada '%s'"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Restart webui cara manual untuk menerapkan perubahan."
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Auto refresh (saat)"
+
+#~ msgid "Button style"
+#~ msgstr "Ciri Butang"
+
+#~ msgid "Text Only"
+#~ msgstr "Teks Sahaja"
+
+#~ msgid "Text and image"
+#~ msgstr "Teks dan imej"
+
+#~ msgid "Cache templates"
+#~ msgstr "Cache templates"
+
+#~ msgid "Current Password"
+#~ msgstr "Kata kunci Semasa"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Penempatan Padat"
+
+#~ msgid "Show trackers"
+#~ msgstr "Papar trackers"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Papar carian keyword"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Berhenti semaian pada ratio"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Papar zero hits"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Papar bar sisi"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Kata kunci lama tidak sah"
+
+#~ msgid "Sidebar"
+#~ msgstr "Bar sisi"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Kata kunci baru tidak sama dengan Kata kunci Baru(pasti)"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Kata kunci Baru (Pasti)"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... dan hapus Semua fail"
+
+#~ msgid "Ava"
+#~ msgstr "Ava"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Tambah dalam keadaan Pause"
+
+#~ msgid "Cancel"
+#~ msgstr "Batal"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Auto Refresh:"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... dan hapus fail yang telah di Muat turun"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... dan hapus fail Torrent"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Saring berdasarkan kata kunci"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Log Masuk Deluge"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "Had Kelajuan MuatTurun"
+
+#~ msgid "Disk Space"
+#~ msgstr "Ruang Disk"
+
+#~ msgid "Do not download"
+#~ msgstr "Jangan Muat Turun"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Paksa Recheck"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Had Sambungan"
+
+#~ msgid "Enter a number."
+#~ msgstr "Masukkan nombor."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr "Pastikan bahawa tidak lebih dari %s digit sebelum titik perpuluhan."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Masukkan tarikh yang sah."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Pastikan bahawa tidak lebih dari %s digit kesemuanya."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Pastikan bahawa tidak lebih dari %s tempat-tempat perpuluhan."
+
+#~ msgid "High priority"
+#~ msgstr "Keutamaan tinggi"
+
+#~ msgid "Highest priority"
+#~ msgstr "Keutamaan tertinggi"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Tiada Sambungan Masuk"
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Masukkan alamat e-mail yang sah."
+
+#~ msgid "From Session"
+#~ msgstr "Dari Sesi"
+
+#~ msgid "From Url"
+#~ msgstr "Dari Url"
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Masukkan masa yang sah."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Masukkan masa/waktu yang sah."
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Refresh laman setiap:"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Kemaskini Tracker"
+
+#~ msgid "Normal priority"
+#~ msgstr "Keutamaan biasa"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "Had Laju Muat Naik"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Had Slot Muat Naik"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Search"
+#~ msgstr "Carian"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s bukan URL yang sah"
+
+#~ msgid "Downloading.."
+#~ msgstr "Muat-turun.."
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Tidak Bersambung.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Gagal untuk muat-turun : %s"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge dilindungi kata laluan!</big></b>"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Sila masukkan kata laluan</i>"
diff --git a/deluge/i18n/nb.po b/deluge/i18n/nb.po
new file mode 100644
index 0000000..f37f9d2
--- /dev/null
+++ b/deluge/i18n/nb.po
@@ -0,0 +1,4671 @@
+# Norwegian Bokmål translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2010-12-25 20:42+0000\n"
+"Last-Translator: Thomas Amland <Unknown>\n"
+"Language-Team: Norwegian Bokmål <nb@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Vertsnavn:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Brukernavn:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Passord:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Fra:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Aktiv"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Innstillinger"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Velg en mappe"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Nedlastingsplassering</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Maks opplastingshastighet:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Maks antall tilkoblinger:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Maks antall opplastingsplasser:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Maks nedlastingshastighet:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>BÃ¥ndbredde</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Stopp deling ved delingsforhold:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Fjern ved delingsforhold"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Øverst"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Nederst"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Kø</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Alternativer"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Nedlastingsgrense"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Opplastingsgrense"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Aktive torrenter:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Trege innstillinger</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Ugyldig merkelapp, gyldige tegn: [a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Tom merkelapp"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Merkelappen finnes allerede"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Ukjent merkelapp"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Ukjent torrent"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Merkelapp"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Merkelappinnstillinger"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_Fjern merkelapp"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_Legg til merkelapp"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Innstillinger for merkelapper"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Innstillinger for merkelapper</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Opplastingsplasser:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Opplastingshastighet:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Nedlastingshastighet:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Tilkoblinger:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Bruk per torrent maks-innstillinger:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maksimalt"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Behandles automatisk"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Bruk kø-innstillinger:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Kø"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Flytt ferdige til:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Bruk lokale innstillinger:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Plassering"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 linje per tracker)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Bruk merkelapp automatisk:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Trackere"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Legg til merkelapp"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Legg til merkelapp</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Navn:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Bruk sidelinjen for å legge til, endre og fjerne merkelapper. </i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Merkelapper</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Pakk ut til:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Opprett torrent-navn undermappe"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Dette alternativet vil opprette en undermappe med navnet til torrenten "
+"innenfor valgte utpakkingsmappe, og legge de utpakkede filene der."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Generelt</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Tillat webgrensesnitt"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Benytt SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Lytteport:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Innstillinger</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IPliste (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Tekst (Zippet)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Tekst (Ikke komprimert)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Ugyldig leder"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Ugyldig magikode"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Ugyldig versjon"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Blokkeringsliste"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Dager"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Se etter ny liste hver:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Importer blokkliste ved oppstart"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Last ned blokkeringsliste hvis nødvendig og importer denne."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Sjekk nedlasting og importer"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Last ned ny blokkeringsliste og importer denne."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Tving nedlasting og importer"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Blokkeringsliste er nyeste"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Alternativer</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Type:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Dato:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Filstørrelse:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Info</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torrent ferdig"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torrent lagt til"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Kjør"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Hendelse"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Kommando"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Legg til kommando</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Kommandoer</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Kunngjøring OK"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Kunngjøring sendt"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Advarsel"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Feil"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Afghanistan"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Ã…land"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Albania"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Algerie"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Amerikansk Samoa"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antarktis"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antigua og Barbados"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Argentina"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Armenia"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "Australia"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Østerrike"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Aserbadsjan"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Bahamas"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bahrain"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Bangladesh"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Hviterussland"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Belgia"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermuda"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Bolivia"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnia-Hercegovina"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Bouvetøya"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brasil"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Det britiske området i Indiahavet"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Brunei"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Bulgaria"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Kambodsja"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Kamerun"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Canada"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Kapp Verde"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Caymanøyene"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Den sentralafrikanske republikk"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Tsjad"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Chile"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Kina"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Juleøya"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Kokos (Keeling) øyene"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Colombia"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Komorene"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Kongo"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Kongo, Den demokratiske republikk"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Cookøyene"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Elfenbenskysten"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "Kroatia"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Cuba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Kypros"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Tsjekkia"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Danmark"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Djibouti"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominica"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Den Dominikanske Republikk"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Ecuador"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Egypt"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Ekvatorial-Guinea"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Estland"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Etiopia"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falklandsøyene"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Færøyene"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fiji"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Finnland"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Frankrike"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "Fransk Guyana"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "Fransk Polynesia"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "De franske sørterritorier"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Georgia"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "Tyskland"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Storbritannia"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Hellas"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Grønland"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadeloupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Guinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Guinea-Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guyana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Heard- og McDonald-øyene"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Vatikanstaten"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hongkong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Ungarn"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Island"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "India"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonesia"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Iran"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Irak"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Irland"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Israel"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italia"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaica"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japan"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordan"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kasakhstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenya"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Nord-Korea"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Sør-Korea"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuwait"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kirgisistan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Laos"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Latvia"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Libanon"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberia"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libya"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Litauen"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luxemburg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Makedonia"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagaskar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malaysia"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldivene"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Marshalløyene"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinique"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauritania"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Mexico"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Mikronesiaføderasjonen"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldova"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolia"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Montenegro"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Marokko"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mosambik"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Burma"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Nederland"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "De nederlandske Antillene"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Ny-Caledonia"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "New Zealand"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Norfolkøya"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Nord-Marianene"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norge"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palestina"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua Ny-Guinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguay"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filippinene"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairnøyene"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Polen"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugal"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Qatar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Réunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Romania"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Russland"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Rwanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Saint-Barthelemy"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "St. Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Saint Kitts og Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Saint Lucia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Saint Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint-Pierre og Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Saint Vincent og Grenadinene"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "São Tomé og Príncipe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Saudi-Arabia"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbia"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seychellene"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapore"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slovakia"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slovenia"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Salomonøyene"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Sør-Afrika"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Sør-Georgia og Sør-Sandwichøyene"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Spania"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Surinam"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard og Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Swaziland"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Sverige"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Sveits"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Syria"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Taiwan"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tadsjikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzania"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Thailand"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Øst-Timor"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad og Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunisia"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Tyrkia"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Turks- og Caicosøyene"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukraina"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "De forente arabiske emirater"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Amerikas forente stater"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "USAs ytre småøyer"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Uruguay"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Usbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "De britiske Jomfruøyene"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "De amerikanske Jomfruøyene"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis- og Futunaøyene"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Vest-Sahara"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Jemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabwe"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Frakoblet"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Tilkoblet"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Tilkoblet"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Nissen eksisterer ikke"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Nissen kjører ikke"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Starter tjener med PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Adresse"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Klient"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Fremdrift"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Nedhastighet"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Opphastighet"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrenter i kø"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrent i kø"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Ubegrenset"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Aktivert"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Annet ..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Ned:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Opp:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Ned"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Opp"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Sett maksimum nedlastingshastighet"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Sett maksimum opplastingshastighet"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torrent ferdig nedlastet"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Denne e-posten er for å informere deg om at Deluge har fullført nedlastingen "
+"av %(name)s , inkludert %(num_files)i filer.\n"
+"For å unngå å motta disse varslene, slå helt enkelt av e-postvarsel i Deluge "
+"sine brukervalg.\n"
+"\n"
+"Takk skal du ha,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Nedlasting"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Nettverk"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "BÃ¥ndbredde"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Grensesnitt"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Annet"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Bakgrunnsprosess"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Mellomtjener"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Hurtiglager"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Programutvidelser"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Programtillegg"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Velg programutvidelsen"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Utvidelser (Python eggs)"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Filnavn"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Størrelse"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Ugyldig fil"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Duplikat-torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Du kan ikke legge til den samme torrenten to ganger."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Kunne ikke sette filprioritet!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Velg en fil av type .torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Torrent-filer"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Alle filtyper"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Ugyldig adresse (URL)"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Nedlasting mislyktes"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Gruppering"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Tracker"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Velg en fil"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Velg en mappe"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Lagre .torrent-filen"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Ikke tilkoblet"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Tilkoblinger"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Nedlastingshastighet"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Opplastningshastighet"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Protokolltrafikk ned/opp"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT-noder"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Ingen innkommende tilkoblinger!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Sett maks tilkoblinger"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrenter"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Etiketter"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Alle"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Laster ned"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Deler"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Stoppet midlertidig"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Undersøker"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "Lagt i kø"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Ingen"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Ingen etikett"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Vert"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Feil ved innlasting av vert"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Slå av klassisk modus?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Det ser ut til at en Deluge prosess (deluged) allerede kjører.\n"
+"\n"
+"Du må enten stoppe prosessen eller skru av Klassisk modus for å fortsette."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Feil ved oppstart av kjerne"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"Det var en feil med oppstarten av kjernekomponentet som er nødvendig for å "
+"kjøre Deluge i Klassisk modus.\n"
+"\n"
+"Vennligst se detaljene nedenfor for mer informasjon."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Siden det var en feil ved oppstarten i Klassisk modus ønsker du å fortsette "
+"ved å slå den av?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Feil ved start av bakgrunnsprosess"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"Det oppstod en feil ved oppstart av bakgrunnstjenesten. Forsøk kjøre den fra "
+"en konsoll for å se om det er en feilmelding."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "PÃ¥"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Av"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Sett ubegrenset"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Velg en katalog å flytte filer til"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Sett maks opplastingsplasser"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Prioritet"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Detaljer:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Navn"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Nedlastet"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Lastet opp"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Delere"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Noder"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Tid igjen"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Forholdstall"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Tilgjengelighet"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Lagt til"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Fil"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Legg til torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Lag torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Endre"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Tilkoblingshåndterer"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Vis"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Verktøylinje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Sidelinje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Status_linje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "F_aner"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Kolonner"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "S_idelinje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Vis _Null Treff"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Vis _trackere"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Hjelp"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Ofte stilte spørsmål"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Legg til torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Legg til Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Fjern torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Fjern Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Pause valgte torrenter"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Pause"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Fortsett valgte torrenter"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Gjenoppta"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Flytt torrent opp i kø"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Opp i kø"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Flytt torrent ned i kø"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Ned i kø"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Brukervalg"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Tilkobingshåndterer"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Utvid alle"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Ikke last ned"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Normal prioritet"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Høy prioritet"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Hø_yest prioritet"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Automatisk håndtert:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Deler-rangering:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Delingstid:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Aktiv tid:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Tracker-status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Tilgjengelighet:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Noder:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Delere:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Biter:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Tid igjen:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Neste Annonsering:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Delingsforhold:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Lastet opp:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Lastet ned:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Dato lagt til:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Status"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Kommentarer:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>Antall filer:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Total størrelse:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Navn:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Sti:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Detaljer"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Filer"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Noder"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Flytt ferdige:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Privat"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Prioriter første/siste"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "R_ediger Trackere"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Alternativer"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Fjerne torrent?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+"<big><b>Er du sikker på at du vil fjerne den valgte torrenten?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>Den tilhørende torrent-filen vil bli slettet!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Nedlastede data vil bli slettet!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Fjern valgte torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Ny utgivelse"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Ny utgivelse tilgjengelig!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Tilgjengelig versjon:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Gjeldende versjon:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Ikke vis denne dialogen i framtiden"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_GÃ¥ til nettsted"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Legg til deltaker fra IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Velg alle"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Pause alle"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Fortsett valgte torrenter"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Fortsett alle"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Legg til torrenter"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Sjekksum"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "_Fjern"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrenter</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Fi_ler"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Fullstendig"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Kompakt"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Allokering</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Maks ned-hastighet"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Maks opp-hastighet"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Legg til i _pauset tilstand"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Prioriter første/siste bit"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Gjenopprett standardverdier"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Bruk på alle"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Legg til URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Fra URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Legg til infohash (unik kode)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Fra Infohash (unik kode)</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash (unik kode):"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Trackere:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Lag torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Lag torrent</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "_Mappe"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Sti til annet sted"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Filer</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Forfatter:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Kommentarer:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Info"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Web-delere"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Delstørrelse:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Aktiver Privat-flagget"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Legg til denne torrenten i arbeidsøkten"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Oppgi ekstern sti"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Ekstern sti</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Sti:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Oppretter torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Lagre .torrent som"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "Lagre .torrent-fil"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Torrenter i kø"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Legg til torrenter i kø</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Legg til torrenter automatisk ved tilkobling"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "etikett"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Legg til deltaker"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Legg til deltaker</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "vertsnavn:port"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Legg til vert"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Tilkoblingshåndterer</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Start lokal bakgrunnsprosess"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Koble til valgt vertsmaskin automatisk ved oppstart"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Start localhost automatisk hvis nødvendig"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Ikke vis denne dialogen ved oppstart"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Nedlasting</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Automatisk legg til .torrent-filer fra:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Last ned til:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Lagre kopi av .torrent-filer i:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Mapper</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Bruk fullstendig allokering"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Setter av all nødvendig diskplass på forhånd, slik at man unngår "
+"fragmentering."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Bruk kompakt allokering"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Setter av diskplass etter behov."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Prioriter første og siste bit av torrenten"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Prioriter første og siste bit av hver fil i torrenten"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Legg til torrenter i pauset tilstand"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Nettverk</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Bruk tilfeldige porter"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge vil automatisk velge en tilfeldig port hver gang."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Aktiv Port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Til:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Test aktiv port"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Innkommende porter</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Utgående porter</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Skriv inn IP adressen til grensesnittet for å lytte til inkommende "
+"bittorrent tilkoblinger. La stå tomt hvis du ønsker benytte standardverdien."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>Grensesnitt</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"TOS byten som settes i IP headeren for hver pakke sendt til andre nedlastere "
+"(inklusive web-delere). Forventer en hex-verdi."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Nedlaster TOS Byte:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal \"Plug&Play\""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT portmappingsprotokoll"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Nedlasterutveksling"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Lokalt tjenestesøk finner lokale nedlastere i ditt nettverk."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Distribuert hashtabell kan forbedre mengden av aktive tilkoblinger"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Nettverkstillegg</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Innkommende:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Nivå:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Tvunget\n"
+"Aktivert\n"
+"Deaktivert"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Oppkobling\n"
+"Hele overføringen\n"
+"En av delene"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Utgående:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Krypter hele datastrømmen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Kryptering</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>BÃ¥ndbredde</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Høyeste antall tilkoblingsforsøk per sekund:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Høyeste antall halvåpne tilkoblinger:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Høyeste opphastighet for samtlige torrenter. Sett til -1 for uendelig."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Høyeste opplastningshastighet (KiB/s)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "Høyeste antall tillatte tilkoblinger. Sett til -1 for uendelig."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Høyeste antall tilkoblinger:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Høyeste antall opplastingsplasser for alle torrenter. Sett til -1 for "
+"uendelig."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Høyeste antall opplastningsplasser:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Maksimal nedlastingshastighet for alle torrenter. Sett til -1 for uendelig."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Høyeste nedlastingshastighet (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Ignorer begrensninger i lokalt nettverk"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Ekskluder protokolltrafikk"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Hvis dette alternativet velges, vil bånbredden TCP/IP-protokollen bruker, "
+"være medregnet for total tillatt båndbredde."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Global bruk av båndbredde</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"Høyeste antall opplastingsplasser per torrent. Sett til -1 for uendelig"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "Høyeste antall tilkoblinger per torrent. Sett til -1 for uendelig."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>BÃ¥ndbreddebruk per torrent</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Grensesnitt</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Aktiver"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Klassisk modus skjuler de fleste bakgrunnsprosess-funksjonene og gjør at "
+"Deluge framstår som ett enkelt program. Bruk dette hvis du ikke ønsker å "
+"kjøre Deluge som bakgrunnsprosess. Du må starte Deluge på nytt for at denne "
+"innstillingen skal aktiveres."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Klassisk modus</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Vis sesjonens fart i tittellinjen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Hovedvindu</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Vis alltid"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Sett dialogen i fokus"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Legg til torrents-dialog</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Vis ikon i systemkurven"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Minimer til systemkurv ved lukking"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Start i systemkurv"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Passordbeskytt systemkurv"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Systemkurv</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Annet</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Varsle meg om nye utgaver"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge vil sjekke om det har kommet en ny utgivelse og i så fall gi deg "
+"beskjed."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Oppdateringer</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Hjelp oss å forbedre Deluge ved å sende oss informasjon om din Python-"
+"versjon, PyGTK-versjon, operativsystem og prosessortype. Ingen annen "
+"informasjon vil bli sendt."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Ja takk, send anonym statistikk"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Systeminformasjon</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Plassering:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Hvis Deluge ikke finner databasefilen ved denne plasseringen vil den falle "
+"tilbake til DNS for å finne en peers land."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP-database</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Assosier Magnet lenker med Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Bakgrunnsprosess</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Bakgrunnsprosess-port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Port</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Tillat fjern-tilkoblinger"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Tilkoblinger</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Sjekk nettstedet periodisk for nye utgivelser"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Annet</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Kø</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Legg nye torrenter først i kø"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Totalt aktive delere:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Totalt aktive:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Totalt aktive nedlastere:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Ikke ta med trege torrenter i beregningen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Aktive torrenter</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Begrens delingsforhold:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Deletidsforhold"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Delingstid (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Stopp når delingsforhold når:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Fjern torrent når delingsforhold er nådd"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Deling</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Mellomtjener (proxy)</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Vert:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Ingen\n"
+"Socksv4\n"
+"Socksv5 med autentisering\n"
+"HTTP\n"
+"HTTP med autentisering"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Klient</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Web-deler</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Tracker</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Hurtiglager</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Hurtiglagerstørrelse (16 KiB blokker)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Antall sekunder fra siste mellomlagrede skrivning til den blir tvunget "
+"skrevet til disk. Standarden er 60 sekunder."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Mellomlager løpetid (sekunder):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"Det totale antall 16 KiB-blokker skrevet til disk siden denne sesjonen ble "
+"startet."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Blokker skrevet:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"Det totale antall skriveoperasjoner utført siden denne sesjonen ble startet."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Skrivinger:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr "Ratioen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Skriv</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Nummeret av blokkeringer som ble forespurt fra bittorrent motoren (fra "
+"peers), som var servert fra disk eller buffer."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Blokker lest:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "Nummeret av blokkeringer som ble servert av buffer."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Lesninger:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Les</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Hurtiglagerstørrelse:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Størrelse på lesemellomlager:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Størrelse</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Status</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Utvidelser</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Versjon:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Hjemmeside:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Forfatterens e-post:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Installer programtillegg"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Les inn programtillegg på nytt"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_Finn flere programtillegg"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Vis Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "Fo_rtsett Alle"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "Begrens _nedlastingshastighet"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "Begrens _opplastingshastighet"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Avslutt & stopp bakgrunnsprosess"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "Ã…pne _mappe"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "_Fortsett"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "_Alternativer"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Kø"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Oppdater Tracker"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Fjern Torrent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "_Kontroller på nytt"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "Flytt _lagringsplass"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "Begrens antall tilkoblinger"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Maks _opplastingsplasser"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Automatisk håndtert"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "Fjerne valgt torrent?"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Hvis du fjerner dataene, vil de bli borte permanent."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Rediger trackere"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Rediger trackere</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Legg til tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Legg til trackere</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Rediger tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Rediger tracker</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Fjern med _data"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Fjern _torrent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Flytt lagringsplass"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Flytt lagringsplass</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "MÃ¥l:"
+
+#~ msgid "seconds"
+#~ msgstr "sekunder"
+
+#~ msgid "Unknown"
+#~ msgstr "Ukjent"
+
+#~ msgid "Download"
+#~ msgstr "Nedlastning"
+
+#~ msgid "Upload"
+#~ msgstr "Opplastning"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Oppdater Tracker"
+
+#~ msgid "Pieces"
+#~ msgstr "Biter"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Delingsforhold"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Mainline DHT"
+
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgid "No"
+#~ msgstr "Nei"
+
+#~ msgid "Details"
+#~ msgstr "Detaljer"
+
+#~ msgid "Files"
+#~ msgstr "Filer"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "General"
+#~ msgstr "Generelt"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Hastighet:</b>"
+
+#~ msgid "Filters"
+#~ msgstr "Filtere"
+
+#~ msgid "Availability"
+#~ msgstr "Tilgjengelighet"
+
+#~ msgid "Speed"
+#~ msgstr "Hastighet"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Slett .torrent-fil"
+
+#~ msgid "Username"
+#~ msgstr "Brukernavn"
+
+#~ msgid "Password"
+#~ msgstr "Passord"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "_Quit"
+#~ msgstr "_Avslutt"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge er låst"
+
+#~ msgid "Graph"
+#~ msgstr "Graf"
+
+#~ msgid "Add"
+#~ msgstr "Legg til"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "Remove"
+#~ msgstr "Fjern"
+
+#~ msgid "Clear"
+#~ msgstr "Tøm"
+
+#~ msgid "Select All"
+#~ msgstr "Velg alle"
+
+#~ msgid "New Password"
+#~ msgstr "Nytt passord"
+
+#~ msgid "Template"
+#~ msgstr "Mal"
+
+#~ msgid "Text Only"
+#~ msgstr "Kun tekst"
+
+#~ msgid "translate something"
+#~ msgstr "oversett noe"
+
+#~ msgid "Image Only"
+#~ msgstr "Kun bilder"
+
+#~ msgid "Text and image"
+#~ msgstr "Tekst og bilder"
+
+#~ msgid "Ava"
+#~ msgstr "Avansert"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "oppdatering må være større enn 0"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Slett nedlastede filer."
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Oppdater automatisk:"
+
+#~ msgid "About"
+#~ msgstr "Om"
+
+#~ msgid "# Of Files"
+#~ msgstr "Antall filer"
+
+#~ msgid "Config"
+#~ msgstr "Oppsett"
+
+#~ msgid "Logout"
+#~ msgstr "Utlogging"
+
+#~ msgid "Login"
+#~ msgstr "Innlogging"
+
+#~ msgid "Eta"
+#~ msgstr "Estimat"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Oppdater siden hver:"
+
+#~ msgid "Resume all"
+#~ msgstr "Fortsett alle"
+
+#~ msgid "Reannounce"
+#~ msgstr "Annonser på nytt"
+
+#~ msgid "Pause all"
+#~ msgstr "Pause alle"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Last opp torrent"
+
+#~ msgid "Start"
+#~ msgstr "Start"
+
+#~ msgid "Type"
+#~ msgstr "Type"
+
+#~ msgid "Disabled"
+#~ msgstr "Avslått"
+
+#~ msgid "From"
+#~ msgstr "Fra"
+
+#~ msgid "Torrent list"
+#~ msgstr "Torrentliste"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Trackerstatus"
+
+#~ msgid "File"
+#~ msgstr "Fil"
+
+#~ msgid "Save"
+#~ msgstr "Lagre"
+
+#~ msgid "No data"
+#~ msgstr "Ingen data"
+
+#~ msgid "Ports"
+#~ msgstr "Porter"
+
+#~ msgid "To"
+#~ msgstr "Til"
+
+#~ msgid "Random"
+#~ msgstr "Tilfeldig"
+
+#~ msgid "Encryption"
+#~ msgstr "Kryptering"
+
+#~ msgid "Level"
+#~ msgstr "Nivå"
+
+#~ msgid "Outbound"
+#~ msgstr "Utgående"
+
+#~ msgid "Forced"
+#~ msgstr "Tvungen"
+
+#~ msgid "Handshake"
+#~ msgstr "HÃ¥ndtrykk"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Uendelig"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Lagre .torrent filer i"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Per Torrent"
+
+#~ msgid "Inbound"
+#~ msgstr "Inngående"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Totalt aktive torrents"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = uendelig"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Totalt aktive nedlastinger"
+
+#~ msgid "Button style"
+#~ msgstr "Stil for knapp"
+
+#~ msgid "Move To"
+#~ msgstr "Flytt til"
+
+#~ msgid "Current Password"
+#~ msgstr "Nåværende passord"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Rett feilene over og prøv igjen"
+
+#~ msgid "Admin"
+#~ msgstr "Admin"
+
+#~ msgid "Connect"
+#~ msgstr "Koble til"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge: Torrentliste"
+
+#~ msgid "Move"
+#~ msgstr "Flytt"
+
+#~ msgid "Move torrent"
+#~ msgstr "Flytt torrent"
+
+#~ msgid "Keyword"
+#~ msgstr "Nøkkelord"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge-innlogging"
+
+#~ msgid "Restart"
+#~ msgstr "Start på nytt"
+
+#~ msgid "Stop"
+#~ msgstr "Stopp"
+
+#~ msgid "Update"
+#~ msgstr "Oppdater"
+
+#~ msgid "no uri"
+#~ msgstr "ingen uri"
+
+#~ msgid "Active time"
+#~ msgstr "Aktiv tid"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Filtrer på ord"
+
+#~ msgid "False"
+#~ msgstr "Usann"
+
+#~ msgid "True"
+#~ msgstr "Sann"
+
+#~ msgid "Extra's"
+#~ msgstr "Ekstra"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Endringer ble lagret"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Gammelt passord er ikke godkjent"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Ikke tilkoblet en bakgrunnsprosess"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Passordet er ugyldig, prøv igjen"
+
+#~ msgid "Queue Position"
+#~ msgstr "Kø-posisjon"
+
+#~ msgid "Seed rank"
+#~ msgstr "Deler-rangering"
+
+#~ msgid "Set"
+#~ msgstr "Bruk"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Angi tidsavbrudd"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Koble til bakgrunnsprosess"
+
+#~ msgid "Label torrent"
+#~ msgstr "Sett merkelapp på torrent"
+
+#~ msgid "Next Announce"
+#~ msgstr "Neste annonsering"
+
+#~ msgid "Submit"
+#~ msgstr "Oppdater"
+
+#~ msgid "Total Size"
+#~ msgstr "Total størrelse"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Maksimal ned-hastighet"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Kompakt tildeling"
+
+#~ msgid "Download Location"
+#~ msgstr "Nedlastingssted"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Maksimal opp-hastighet"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Feil i torrent-innstillinger"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Legg til i pauset tilstand"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Prioriter første og siste del"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Velg enten en url eller en torrent, ikke begge deler."
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Maksimalt antall tilkoblinger"
+
+#~ msgid "Either"
+#~ msgstr "Enten"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Lagre alle nedlastinger i"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Maks halvåpne tilkoblinger"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Maks nedlastingshastighet (Kib/s)"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Maks tilkoblingsforsøk per sekund"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Maks opplastingshastighet (Kib/s)"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Legg til mappe automatisk"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr ""
+#~ "Start bakgrunnsprosess og web-grensesnitt på nytt etter endring av disse "
+#~ "innstillingene"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Fjern torrent når delingsforhold blir"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Tillat programutvidelser"
+
+#~ msgid "Cache templates"
+#~ msgstr "Mellomlagre maler"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Nytt passord er ikke likt som Nytt passord (bekreft)"
+
+#~ msgid "Error in Path."
+#~ msgstr "Feil i sti."
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Nytt passord (bekreft)"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Velg et gyldig alternativ. Det alternativet er ikke et av de tilgjengelige "
+#~ "alternativene."
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Skriv inn en liste av verdier."
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Sørg for at denne verdien har høyst %(max)d tegn (det har %(length)d)."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr ""
+#~ "Velg et gyldig alternativ. %s er ikke et av de tilgjengelige alternativene."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Skriv inn en gyldig verdi."
+
+#~ msgid "This field is required."
+#~ msgstr "Dette feltet er påkrevet."
+
+#~ msgid "Enter a number."
+#~ msgstr "Skriv inn et tall."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Sørg for at denne verdien er lik eller større enn %s."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Skriv inn et heltall."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Sørg for at denne verdien er lik eller mindre enn %s."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Sørg for at det ikke er mer enn %s siffer totalt."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Sørg for at denne verdien har minst %(min)d tegn (det har %(length)d)."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "Ingen fil ble sendt. Kontroller filkodingstypen i skjemaet."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Last opp et gyldg bilde. Filen du lastet opp var enten ikke et bilde eller "
+#~ "et ødelagt bilde."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Den sendte filen er tom."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Skriv inn en gyldig e-postadresse."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Skriv inn et gyldig tidspunkt."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Skriv inn gyldig dato/tidspunkt."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Ingen fil ble sendt."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr "Sørg for at det ikke er mer enn %s siffer før desimaltegnet."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Skriv inn en gyldig dato."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Sørg for at det ikke er mer enn %s desimalplasser."
+
+#~ msgid "Statistics"
+#~ msgstr "Statistikk"
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Skriv inn en gyldig URL."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Denne URL'en ser ikke ut til å fungere."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Skriv inn en gyldig IPv4-adresse."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr ""
+#~ "Velg et gyldig alternativ. %(value)s er ikke et av de tilgjengelige "
+#~ "alternativene."
+
+#~ msgid "Recheck"
+#~ msgstr "Sjekk på nytt"
+
+#~ msgid "Delete"
+#~ msgstr "Slett"
+
+#~ msgid "Queue Top"
+#~ msgstr "Kø i topp"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Kø i bunn"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Inkluderer %i filer"
+
+#~ msgid "Other.."
+#~ msgstr "Annet.."
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torrenten har passert stopp-delingsforholdet"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge er passordbeskyttet.\n"
+#~ "For å vise Deluge-vinduet, skriv inn passordet ditt."
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Antall forsøk på nedlasting"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Tidsavbrudd (sekunder)"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Sjekk for hver (dager)"
+
+#~ msgid "BlockList"
+#~ msgstr "Blokkeringsliste"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Importerer %s"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Blokkerte utvalg: %s"
+
+#~ msgid "Inactive"
+#~ msgstr "Inaktiv"
+
+#~ msgid "Refresh status"
+#~ msgstr "Oppdatér status"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Laster ned %.2f%%"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "page 6"
+#~ msgstr "side 6"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 7"
+#~ msgstr "side 7"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Maksimalt antall opplastingsplasser"
+
+#~ msgid "page 8"
+#~ msgstr "side 8"
+
+#~ msgid "page 10"
+#~ msgstr "side 10"
+
+#~ msgid "page 11"
+#~ msgstr "side 11"
+
+#~ msgid "page 12"
+#~ msgstr "side 12"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Legg til torrenter</b></big>"
+
+#~ msgid "From Session"
+#~ msgstr "Fra arbeidsøkt"
+
+#~ msgid "Community"
+#~ msgstr "Interessegruppe"
+
+#~ msgid "Homepage"
+#~ msgstr "Hjemmeside"
+
+#~ msgid "Show trackers"
+#~ msgstr "Vis trackere"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "denne gjør ingenting ennå..\n"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+
+#~ msgid "Connected to"
+#~ msgstr "Tilkoblet til"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Nedlaster-utveksling"
+
+#~ msgid "Seeding time"
+#~ msgstr "Delingstid"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Stopp deling når delingsforhold blir"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Totalt aktive delere"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Stopp delingved delingsforhold"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Denne mappen finnes ikke."
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Automatisk legg til aktivert"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Automatisk oppdateringsfrekvens (sekunder)"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "max_download_speed"
+#~ msgstr "maksimum_nedlastingshastighet"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "maksimum_opplastingshastighet"
+
+#~ msgid "max_connections"
+#~ msgstr "maksimum_tilkoblinger"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "stopp_ved_delingsforhold"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "fjern_ved_delingsforhold"
+
+#~ msgid "move_completed"
+#~ msgstr "fjern_ferdige"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "maksimum_opplastingsplasser"
+
+#~ msgid "no label"
+#~ msgstr "Ingen merkelapp"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... og slett nedlastede filer"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... og slett alle filer"
+
+#~ msgid "Cancel"
+#~ msgstr "Avbryt"
+
+#~ msgid "Disk Space"
+#~ msgstr "Diskplass"
+
+#~ msgid "Do not download"
+#~ msgstr "Ikke last ned"
+
+#~ msgid "High priority"
+#~ msgstr "Høy prioritet"
+
+#~ msgid "From Url"
+#~ msgstr "Fra URL"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Tving ny sjekk"
+
+#~ msgid "Normal priority"
+#~ msgstr "Normal prioritet"
+
+#~ msgid "Search"
+#~ msgstr "Søk"
+
+#~ msgid "Highest priority"
+#~ msgstr "Høyest prioritet"
+
+#~ msgid "apply_max"
+#~ msgstr "bruk_maks"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "bruk_flytt_ferdige"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Arbeid pågår ..."
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Denne e-posten er for å informere deg om at Deluge har lastet ned %s , som "
+#~ "inkluderer %i filer.\n"
+#~ "For å slutte å motta disse varslene, skru av e-postvarsling i Deluge sine "
+#~ "brukervalg.\n"
+#~ "\n"
+#~ "Takk,\n"
+#~ "Deluge"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Feilet å sette merkelapp-alternativer"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Start webui på nytt manuelt for å ta i bruk endringene."
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... og slett torrent-fil"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Vis sidelinjen"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Vis null treff"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Tilkoblingsgrense"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Nøkkel ikke funnet ved '%s'"
+
+#~ msgid "Sidebar"
+#~ msgstr "Sidelinje"
+
+#~ msgid "Ok"
+#~ msgstr "OK"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "Hastighetsgrense ned"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Ingen innkommende tilkoblinger"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "Hastighetsgrense opp"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Antall tilkoblinger for opplasting"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Sertifikat ikke funnet ved '%s'"
+
+#~ msgid "move_completed_path"
+#~ msgstr "flytt_ferdig_sti"
+
+#~ msgid "auto_add"
+#~ msgstr "legg_til_automatisk"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Vis nøkkelordsøk"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP med autentisering"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 med autentisering"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "apply_queue"
+#~ msgstr "legg til kø"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "automatisk administrert"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Ekskluder protokolltrafikk"
+
+#~ msgid "stop_ratio"
+#~ msgstr "stopp_ratio"
+
+#~ msgid "Downloading.."
+#~ msgstr "Laster ned.."
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s er ikke en gyldig URL."
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Skriv passordet ditt for å fortsette</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge er passordbeskyttet!</big></b>"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Ikke tilkoblet.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Klarte ikke å laste ned : %s"
+
+#~ msgid "Disable"
+#~ msgstr "Deaktiver"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Importer når bakgrunnsprosess starter opp"
+
+#~ msgid "Import Now"
+#~ msgstr "Importer nå"
+
+#~ msgid "State"
+#~ msgstr "Tilstand"
+
+#~ msgid "FAQ"
+#~ msgstr "Vanlige spørsmål"
diff --git a/deluge/i18n/nds.po b/deluge/i18n/nds.po
new file mode 100644
index 0000000..741c29f
--- /dev/null
+++ b/deluge/i18n/nds.po
@@ -0,0 +1,3739 @@
+# German, Low translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-06-23 08:44+0000\n"
+"Last-Translator: bmhm <Unknown>\n"
+"Language-Team: German, Low <nds@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Von:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Wähle einen Ordner"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Down Speed"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Up Speed"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Downloads"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Netzwerk"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Plugins"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Größe"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Seeders"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Peers"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Datei"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Torrent hinzufügen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Edit"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Anzeige"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Toolbar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Spalten"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Hilfe"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Füge Torrent hinzu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Torrent wegmaken"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Paus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Wiedermaken"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Einstellungen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Tracker Status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Verfügbarkeit:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Peers:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Seeders:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Teile:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>ETA:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Nächster Announce:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Share Ratio:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Uploaded:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Downloaded:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># Dateien</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Gesamtgröße:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Name:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Pfad:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Details"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Aktiver Port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Nach:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT Port Mapping Protocol"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Peer Exchange"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Speed:</b>"
+
+#~ msgid "Details"
+#~ msgstr "Details"
+
+#~ msgid "Availability"
+#~ msgstr "Verfügbarkeit"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Share Ratio"
+
+#~ msgid "Speed"
+#~ msgstr "Speed"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Lösche .torrent Datei"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Remove"
+#~ msgstr "Wegdoon"
+
+#~ msgid "Add"
+#~ msgstr "Tofögen"
diff --git a/deluge/i18n/nl.po b/deluge/i18n/nl.po
new file mode 100644
index 0000000..ad19b05
--- /dev/null
+++ b/deluge/i18n/nl.po
@@ -0,0 +1,4749 @@
+# Dutch translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2010-09-27 15:27+0000\n"
+"Last-Translator: RoestVrijStaal <Unknown>\n"
+"Language-Team: Dutch <nl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Hostnaam:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Poort:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Gebruikersnaam:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Wachtwoord:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Van:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Ingeschakeld"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Instellingen"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Kies een map"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Downloadlocatie</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Maximale Upload-snelheid:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Maximum verbindingen:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Maximum aantal uploadslotes:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Maximale Download-snelheid"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Bandbreedte</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Seeden stoppen bij ratio:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Verwijder op ratio"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Bovenkant"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Onderkant"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Wachtrij</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Opties"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Download limiet"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Upload limiet"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Actieve Torrents:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Dal Instellingen</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Ongeldig label, geldige tekens: [a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Leeg label"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Label bestaat reeds"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Onbekend label"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Onbekende torrent"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Label _Opties"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_Verwijder Label"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "Label _Toevoegen"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Label Opties"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Label Opties</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Upload slots:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Uploadsnelheid:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Downloadsnelheid:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Verbindingen"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Per torrent maximale instellingen toepassen:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maximum"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Automatisch beheerd"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Wachtrij-instellingen toepassen:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Wachtrij"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Verplaats gedownloade bestanden naar:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Locatie-instellingen toepassen:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Locatie"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 regel per tracker)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Label automatisch toepassen:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Trackers"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Label toevoegen"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Label toevoegen</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Naam:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Gebruik de zijbalk om labels toe te voegen, te wijzigen en te "
+"verwijderen.</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Labels</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Uitpakken naar:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Maak een submap met de naam van de torrent"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Deze optie maakt een submap met de naam van de torrent binnen de "
+"geselecteerde extractiemap en plaatst de uitgepakte bestanden daar."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Algemeen</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Schakel webinterface in"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Schakel SSL in"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Luisterpoort:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Instellingen</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP lijst (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Tekst (gezipt)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Tekst (zonder compressie)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Foutieve leider"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Ongeldige magische code"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Ongeldige versie"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Blokkeerlijst"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Dagen"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Naar nieuwe lijst controleren iedere:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Bij opstarten blokkeerlijst importeren"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+"Indien noodzakelijk het blokkeerlijst-bestand downloaden en het bestand "
+"importeren."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Download en Import controleren"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Een nieuwe blokkeerlijst downloaden en importeren."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Download en Import forceren"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Blokeerlijst is up to date"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Opties</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Type:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Datum:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Bestandsgrootte:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Info</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torrent compleet"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torrent toegevoegd"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Uitvoeren"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Gebeurtenis"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Opdracht"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Voeg opracht toe</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Opdrachten</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Aankondiging OK"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Aankondiging verzonden"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Opgelet"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Fout"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Afghanistan"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Ã…landseilanden"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Albanië"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Algerije"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Amerikaans-Samoa"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antartica"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antigua en Barbuda"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Argentinië"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Armenië"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "Australië"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Oostenrijk"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Azerbeidzjan"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Bahama's"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bahrein"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Bangladesh"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Wit-Rusland"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "België"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermuda"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Bolivia"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnië-Herzogevina"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Bouvet-eiland"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brazilië"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Brits Territorium in de Indische Oceaan"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Brunei Darussalam"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Bulgarije"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Cambodja"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Cameroen"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Canada"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Kaapverdië"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Kaaimaneilanden"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Centraal-Afrikaanse Republiek"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Tsjaad"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Chili"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "China"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Kersteiland"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Kokoseilanden (Keeling)"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Colombia"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Komoren"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Congo"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Congo, Democratische Republiek"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Cook Eilanden"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Ivoorkust"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "Kroatië"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Cuba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Cyprus"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Tsjechische Republiek"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Denemarken"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Djibouti"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominica"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Dominicaanse Republiek"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Ecuador"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Egypte"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Equatoriaal Guinea"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Estland"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Ethiopië"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falklandeilanden (Malvinas)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Faeröereilanden"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fiji"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Finland"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Frankrijk"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "Frans-Guyana"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "Frans-Polynesië"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "Franse Zuidelijke- en Antarctische Gebieden"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Georgië"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "Duitsland"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Groot-Brittanië"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Griekenland"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Groenland"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadeloupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Guinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Guinee-Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guyana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haïti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Heardeiland en McDonaldeilanden"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Vaticaanstad"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Hongarije"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Ijsland"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "India"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonesië"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Iran, Islamitische Republiek"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Irak"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Ierland"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Man (eiland)"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Israël"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italië"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaica"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japan"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordanië"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazachstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenia"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Noord-Korea"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Zuid-Korea"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Koeweit"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kirgizië"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Democratische Volksrepubliek Laos"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Letland"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Libanon"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberië"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libië"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Lichtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Litouwen"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luxemburg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Macedonië"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagascar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Maleisië"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldiven"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Marshall-eilanden"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinique"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauritanië"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Mexico"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Micronesië"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldavië"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolië"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Montenegro"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Marokko"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambique"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Birma"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibië"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Nederland"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Nederlandse Antillen"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Nieuw-Caledonië"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Nieuw-Zeeland"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Norfolkeiland"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Noordelijke Marianen"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Noorwegen"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palestina"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papoea-Nieuw-Guinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguay"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filippijnen"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairneilanden"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Polen"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugal"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Qatar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Roemenië"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Rusland"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Rwanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Sint-Bartholomeus"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Sint-Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Saint Kitts en Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Santa Lucia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Sint-Maarten"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint-Pierre en Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Sint-Vincent en de Grenadines"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Sao Tomé en Principe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Saoedi-Arabië"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Servië"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seychellen"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapore"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slowakije"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slovenië"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Salomoneilanden"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalië"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Zuid-Afrika"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Zuid-Georgië en de Zuidelijke Sandwicheilanden"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Spanje"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Suriname"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard en Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Swaziland"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Zweden"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Zwitserland"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Syrië"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Taiwan"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tadzjikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzania, Verenigde Republiek"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Thailand"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Oost-Timor"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad en Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunesië"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Turkije"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Turkse- en Caicoseilanden"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Oeganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Oekraïne"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Verenigde Arabische Emiraten"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Verenigde Staten"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Kleine Pacifische eilanden van de Verenigde Staten"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Uruguay"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Oezbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Maagdeneilanden, Britse"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Maagdeneilanden, V.S."
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis en Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "West Sahara"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Jemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabwe"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Offline"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Online"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Verbonden"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Deamon bestaat niet"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Deamon draait niet"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Start server in PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Adres"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Client"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Voortgang"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Downloadsnelheid"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Uploadsnelheid"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrents in de rij geplaatst"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrent in de rij geplaatst"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Onbeperkt"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Geactiveerd"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Overig..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Omlaag:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Omhoog:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Naar beneden"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Naar boven"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Stel maximale downloadsnelheid in"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Stel maximale uploadsnelheid in"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torrent gereed"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Dit e-mail bericht is verzonden omdat Deluge klaar is met het downloaden van "
+"%(name)s, dat %(num_files)i bestanden bevat.\n"
+"Je kunt dit soort berichten uitschakelen in de instellingen van Deluge.\n"
+"\n"
+"Bedankt,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Downloads"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Netwerk"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Bandbreedte"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Interface"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Overige"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Daemon"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Proxy"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Cache"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Plugins"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Plugin"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Selecteer de Plugin"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Plugin eieren"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Bestandsnaam"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Grootte"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Ongeldig bestand"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Torrent dupliceren"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Het is niet mogelijk een torrent twee keer toe te voegen."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Kon bestandsprioriteit niet instellen!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Kies een .torrent-bestand"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Torrentbestanden"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Alle bestanden"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Ongeldige URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Downloaden mislukt"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Rij"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Tracker"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Kies een bestand"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Kies een map"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Sla .torrent bestand op"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Niet verbonden"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Verbindingen"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Download snelheid"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Upload snelheid"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Protocol dataverkeer Download/Upload"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT Nodes"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Geen inkomende verbindingen!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Stel maximaal aantal verbindingen in"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrents"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Labels"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Alle"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Downloaden"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Seeden"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Gepauzeerd"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Controleren"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "In Wachtrij"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Geen"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Geen label"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Host"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Fout bij toevoegen van host"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Klassieke Mode uitschakelen?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Het lijkt er op dat er al een Deluge daemon proces (deluged) is opgestart.\n"
+"\n"
+"Stop de huidige daemon of schakel Klassieke Mode uit om verder te gaan."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Fout bij opstarten core"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"Er was een fout bij het starten van de core, welke vereist is om Deluge in "
+"Klassieke Mode te gebruiken."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Aangezien er een fout was bij het starten van de Klassieke Mode, wil je "
+"doorgaan door deze uit te schakelen?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Fout bij starten van de daemon"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"Er was een probleem bij het starten van het daemon-proces. Probeer het uit "
+"te voeren vanuit een console om te zien of er een fout op treedt."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Aan"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Uit"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Zet op ongelimiteerd"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Kies een map om bestanden naar te verplaatsen"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Stel maximum aantal upload plaatsen in"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Prioriteit"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Details:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Naam"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Gedownloaded"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Geupload"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Seeders"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Peers"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Resterend"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Verhouding"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Beschikbaar"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Toegevoegd"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Bestand"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Torrent toevoegen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "Torrent _Aanmaken"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "B_ewerken"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Verbindingsbeheerder"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "Weerga_ve"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Knoppenbalk"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Zijpaneel"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Status_balk"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "T_abbladen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Kolommen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "Z_ijpaneel"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Toon _Zero Hits"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Toon _Trackers"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Help"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Veelgestelde vragen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Torrent toevoegen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Torrent toevoegen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Verwijder torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Torrent verwijderen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Geselecteerde torrents pauzeren"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Pauzeren"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Geselecteerde torrents verderzetten"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Hervatten"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Torrent in wachtrij omhoog"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Omhoog in wachtrij"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Torrent in wachtrij omlaag"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Omlaag in wachtrij"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Instellingen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Connectie Manager"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Alles uit klappen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Niet Downloaden"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Normale Prioriteit"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Hoge Prioriteit"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Hoo_gste Prioriteit"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Automatisch Beheerd:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Seed Rang:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Seed Tijd:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Actieve Tijd:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Tracker status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Beschikbaarheid:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Peers:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Seeders:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Gedeelten:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Resterende tijd:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Volgende aankondiging:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Deelverhouding</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Ge-upload:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Gedownload:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Datum Toegevoegd:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Status"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Commentaar:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># bestanden:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Totale grootte:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Naam:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Pad:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Details"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Bestanden"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Peers"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Voltooid verplaatsen:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Besloten"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Verhoog prioriteit Eerste/Laatste"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "Trackers b_ewerken"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Opties"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Torrent verwijderen?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+"<big><b>Weet u zeker dat u de geselecteerde torrent wilt "
+"verwijderen?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>De geassocieerde .torrent zal worden verwijderd!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>De gedownloade data zal verwijderd worden!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Geselecteerde Torrent Verwijderen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Nieuwe Uitgave"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Nieuwe Uitgave Beschikbaar!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Beschikbare Versie:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Huidige Versie:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Deze dialoog in de toekomst niet tonen"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Ga naar Website"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Voeg een peer toe met zijn IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "Alles _selecteren"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Pauzeer alles"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Geselecteerde torrents voortzetten."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "_Alle Voortzetten"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Torrents Toevoegen"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "Ve_rwijderen"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrents</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "_Bestanden"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Volledig"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Compact"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "Allocatie"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Max Down Snelheid:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Max Up Snelheid:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Toevoegen in ge_pauzeerde status"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Prioriteit op eerste/laatste delen"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Terugzetten Naar Standaardinstellingen"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Toepassen Op Alle"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "URL toevoegen"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Van URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Voeg Infohash toe"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Van Infohash</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Trackers:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Torrent aanmaken"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Torrent aanmaken</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "_Map"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Extern Pad"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Bestanden</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Auteur:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Commentaar:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Informatie"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Webseeds"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Stukjes grootte:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Stel Prive vlag in"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Deze torrent aan de sessie toevoegen"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Geef een pad op afstand"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Pad op afstand</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Pad:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Torrent maken"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Sla .torrent op als"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Sla .torrent bestand op</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Torrents in de wachtrij"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Aanschuivende Torrents Toevoegen</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Automatisch torrents toevoegen bij het maken van de verbinding"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "label"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Voeg Peer Toe"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Voeg Peer Toe</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "hostname:poort"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Host toevoegen"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Connectie Manager</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Start lokale daemon"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Bij het opstarten automatisch verbinden met de geselecteerde host"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Automatisch de localhost starten indien nodig"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Laat dit venster niet zien bij het opstarten"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Downloads</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ".torrents automatisch toevoegen van:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Downloaden naar:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Kopie van .torrent-bestanden naar:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Mappen</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Gebruik volledige allocatie"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Volledige allocatie reserveert alle nodige ruimte voor de torrent op "
+"voorhand en voorkomt schijffragmentatie"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Gebruik compacte allocatie"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Compacte allocatie reserveert ruimte alleen wanneer nodig"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Geef voorrang aan eerste en laatste stukjes van torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Geef voorrang aan eerste en laatste stukjes van bestanden in torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Torrent toevoegen in gepauzeerde stand"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Netwerk</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Gebruik willekeurige poorten"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge zal elke keer automatisch een verschillende poort kiezen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Actieve poort:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Tot:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Actieve poort testen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Inkomende poorten</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Uitgaande poorten</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Voer het IP-adres in van de verbinding die gebruikt moet worden voor "
+"inkomende bittorrent verbindingen. Laat het veld leeg voor de standaard "
+"instellingen."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>Interface</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"De TOS byte die wordt gezet in de IP header van ieder tcp-pakket dat "
+"verzonden wordt naar peers (inclusief web seeds). Er moet een Hex ingetoetst "
+"worden."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Peer TOS Byte:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT Port Mapping Protocol"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Peer-uitwisseling"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Lokale Service Ontdekker heeft lokale peers op je netwerk gevonden."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+"Gedistributeerde hashtabel kan het aantal actieve verbindingen verbeteren."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Netwerk extra's</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Binnenkomend:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Niveau:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Geforceerd\n"
+"Aan\n"
+"Uit"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Handschud\n"
+"Complete stroom\n"
+"Ofwel"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Uitgaand:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Encrypteer gehele stroom"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Encryptie</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Bandbreedte</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Maximum connectie pogingen per seconde"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Maximum half-open verbindingen:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"De maximale uploadsnelheid voor alle torrents. Zet op -1 voor onbeperkt."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Maximale uploadsnelheid (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+"Het maximale aantal toegestane verbindingen. Zet op -1 voor onbeperkt."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Maximaal aantal verbindingen:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"De maximale upload plaatsen voor alle torrens. Gebruik -1 voor ongelimiteerd."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Maximale upload plaatsen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"De maximale downloadsnelheid voor alle torrents. Zet op -1 voor onbeperkt."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Maximale downloadsnelheid (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Limieten negeren op locale netwerk"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Beperk IP overhead samen met doorvoersnelheid."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Wanneer aangevinkt wordt de geschatte TCP/IP overhead afgetrokken van de "
+"gelimiteerde doorvoersnelheid. Dit is om te voorkomen dat de limieten worden "
+"overschreden met het totale dataverkeer."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Globaal bandbreedtegebruik</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"De maximale upload plaatsen per torrens. Gebruik -1 voor ongelimiteerd"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"Het maximum aantal verbindingen per torrent. Zet op -1 voor onbeperkt."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Bandbreedtegebruik per torrent</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Interface</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Activeren"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Classic Mode zal het meeste van de daemon-functionaliteit verbergen en laat "
+"Deluge er uit zien als een enkel programma. Gebruik dit als u geen voordeel "
+"wil nemen van het draaien van Deluge als daemon.\r\n"
+"Herstart Deluge om deze instelling te activeren."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Klassieke Modus</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Toon sessie snelheid in titelbar"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Hoofdvenster</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Altijd tonen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Breng het dialoog naar voren"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Torrents toevoegen-venster</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Systeemvakpictogram inschakelen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Naar systeemvak minimaliseren bij afsluiten"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Start in het systeemvak"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Door wachtwoord beschermd systeemvak"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Systeemvak</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Andere</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Laat het weten wanneer er nieuwe versies zijn"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge zal automatisch onze servers controleren en melden wanneer er een "
+"nieuwere versie verschenen is"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Updates</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Help ons Deluge te verbeteren door ons uw Python-versie, PyGTK-versie, OS en "
+"processor types te sturen. Geen andere informatie wordt verzonden."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Ja, verstuurd anonieme statistieken"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "Systeem informatie"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Locatie:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Als Deluge geen database kan vinden op deze locatie zal er gebruik worden "
+"gemaakt van DNS om het land te bepalen."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP Database</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Magnet-links met Deluge associëren"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Daemon</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Daemon poort:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Poort</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Verbindingen op afstand toestaan"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Connecties</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Controleer de website regelmatig voor nieuwe versies"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Anders</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Wachtrij</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Nieuwe torrents bovenaan de rij plaatsen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Totaal actieve seeds:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Totaal actief:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Totaal actieve downloads:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Tel trage torrents niet mee"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Actieve torrents</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Deelverhouding Limiet:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Seed Tijd Verhouding:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Seed Tijd (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Het seeden stoppen bij een deelverhouding van:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Torrent verwijderen wanneer de deelverhouding bereikt is"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Seeden</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Proxy</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Host:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Geen\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 m. auth\n"
+"HTTP\n"
+"HTTP m. auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Peer</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Web Seed</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Tracker</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Cache</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Cache Grootte (16 KiB blokken):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Het aantal seconden na de laatste wijziging waarna de cache naar de harddisk "
+"wordt geschreven. Standaard is 60 seconden."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Cache verval (seconden):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"Het aantal blokken van 16 KiB dat naar de harddisk is geschreven sinds deze "
+"sessie begon."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Blokken geschreven:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr "Het aantal leesoperaties dat is uitgevoerd sinds deze sessie begon."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Geschreven:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"De verhouding (geschreven_blokken - schrijfoperaties) / geschreven_blokken "
+"stelt het aantal opgeslagen schrijfoperaties op het totale aantal "
+"schrijfoperaties voor."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "Schrijf cache treffer verhouding"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Schrijven</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Het aantal blokken aangevraagd via de bittorrent engine die geserveerd "
+"werden vanaf de schijf of cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Blokken gelezen:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "Het aantal blokken dat werd gelezen vanuit de cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "Blokken gelezen uit cache:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "De cache hit ratio voor de leescache"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "Lees cache treffer verhouding"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+"Het totale aantal leesoperaties dat is uitgevoerd sinds het begin van deze "
+"sessie."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Gelezen:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Lezen</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Aantal 16 KiB-blokken in het cachegeheugen. Dit omvat zowel de lees als "
+"schrijf cache."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Cache grootte:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Lees cache grootte:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Grootte</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Status</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Plugins</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Versie:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Homepage:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "E-mailadres van de auteur:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Installeer Plugin"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Opnieuw scannen naar Plugins"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_Vind meer Plugins"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "Deluge _tonen"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Hervat alles"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_Download snelheidslimiet"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_Upload snelheidslimiet"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Verlaten & Daemon Afsluiten"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "Map _openen"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "_Voortzetten"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Opt_ies"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Wachtrij"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "Tracker vernie_uwen"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "Torrent ve_rwijderen"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "Hercontrole _Forceren"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "_Opslag Verplaatsen"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "_Connectielimiet"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Upload _Slot Limiet"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Automatisch Beheerd"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Verwijder geselecteerde torrent?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Als je alle data verwijderd, is alles permanent verloren."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Bewerk trackers"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Trackers Bewerken</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Tracker Toevoegen"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Voeg Trackers toe</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Tracker Bewerken"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Tracker Bewerken</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Verwijder Met _Data"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Verwijder _torrent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Opslag Verplaatsen"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Opslag Verplaatsen</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Doel:"
+
+#~ msgid "seconds"
+#~ msgstr "seconden"
+
+#~ msgid "Unknown"
+#~ msgstr "Onbekend"
+
+#~ msgid "Download"
+#~ msgstr "Download"
+
+#~ msgid "Upload"
+#~ msgstr "Upload"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Tracker vernieuwen"
+
+#~ msgid "Sidebar"
+#~ msgstr "Zijbalk"
+
+#~ msgid "Total Size"
+#~ msgstr "Totale omvang"
+
+#~ msgid "Pieces"
+#~ msgstr "Stukken"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Deelverhouding"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Tracker status"
+
+#~ msgid "Next Announce"
+#~ msgstr "Volgende aankondiging"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Mainline DHT"
+
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgid "No"
+#~ msgstr "Nee"
+
+#~ msgid "Remove"
+#~ msgstr "Verwijder"
+
+#~ msgid "Details"
+#~ msgstr "Details"
+
+#~ msgid "Files"
+#~ msgstr "Bestanden"
+
+#~ msgid "General"
+#~ msgstr "Standaard"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Maximum connecties"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Snelheid:</b>"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr ".torrent-bestand verwijderen"
+
+#~ msgid "Select All"
+#~ msgstr "Alles selecteren"
+
+#~ msgid "Username"
+#~ msgstr "Gebruikersnaam"
+
+#~ msgid "Password"
+#~ msgstr "Wachtwoord"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "Port"
+#~ msgstr "Poort"
+
+#~ msgid "_Quit"
+#~ msgstr "Af_sluiten"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge is vergrendeld"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge is beveiligd met een wachtwoord.\n"
+#~ "Type uw wachtwoord om het Deluge-venster te tonen,"
+
+#~ msgid "Availability"
+#~ msgstr "Beschikbaarheid"
+
+#~ msgid "Graph"
+#~ msgstr "Grafiek"
+
+#~ msgid "Filters"
+#~ msgstr "Filters"
+
+#~ msgid "Speed"
+#~ msgstr "Snelheid"
+
+#~ msgid "Add"
+#~ msgstr "Toevoegen"
+
+#~ msgid "New Password"
+#~ msgstr "Nieuw Wachtwoord"
+
+#~ msgid "Template"
+#~ msgstr "Template"
+
+#~ msgid "Image Only"
+#~ msgstr "Alleen een ikoon"
+
+#~ msgid "Text and image"
+#~ msgstr "Tekst en ikoon"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Ververs iedere:"
+
+#~ msgid "Set"
+#~ msgstr "Instellen"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Het wachtwoord is ongelding, probeer het nog een keer."
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Kies een url of een torrent-bestand, niet biede."
+
+#~ msgid "translate something"
+#~ msgstr "dummy string op te testen of de vertalingen werken."
+
+#~ msgid "Text Only"
+#~ msgstr "Alleen tekst"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "\"Ververs Iedere\" moet groter zijn dan 0"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Torrent bestand uploaden"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Submit"
+#~ msgstr "Ok"
+
+#~ msgid "Disable"
+#~ msgstr "Deactiveren"
+
+#~ msgid "Config"
+#~ msgstr "Configuratie"
+
+#~ msgid "Torrent list"
+#~ msgstr "Torrent lijst"
+
+#~ msgid "Resume all"
+#~ msgstr "Alles activeren"
+
+#~ msgid "Login"
+#~ msgstr "Inloggen"
+
+#~ msgid "Type"
+#~ msgstr "Type"
+
+#~ msgid "Disabled"
+#~ msgstr "Uitgeschakeld"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Stel timeout in"
+
+#~ msgid "Logout"
+#~ msgstr "Uitloggen"
+
+#~ msgid "Pause all"
+#~ msgstr "Pauzeer alles"
+
+#~ msgid "From"
+#~ msgstr "Van"
+
+#~ msgid "Reannounce"
+#~ msgstr "Opnieuw aankondigen"
+
+#~ msgid "Eta"
+#~ msgstr "Resterende tijd"
+
+#~ msgid "Start"
+#~ msgstr "Start"
+
+#~ msgid "Queue Position"
+#~ msgstr "Wachtrij positie"
+
+#~ msgid "File"
+#~ msgstr "Bestand"
+
+#~ msgid "Save"
+#~ msgstr "Opslaan"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Geef prioriteit aan laatste en eerste delen"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Maximale Upload Snelheid"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Maximale Download Snelheid"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Compacte Allocatie"
+
+#~ msgid "Download Location"
+#~ msgstr "Download Locatie"
+
+#~ msgid "no uri"
+#~ msgstr "geen uri"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Toevoegen in gepauseerde status"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Fout in torrent opties."
+
+#~ msgid "No data"
+#~ msgstr "Geen gegevens"
+
+#~ msgid "Ports"
+#~ msgstr "Poorten"
+
+#~ msgid "To"
+#~ msgstr "Tot"
+
+#~ msgid "Random"
+#~ msgstr "Willekeurig"
+
+#~ msgid "Extra's"
+#~ msgstr "Extra's"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Peer-Exchange"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Encryption"
+#~ msgstr "Versleuteling"
+
+#~ msgid "Level"
+#~ msgstr "Nivo"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Onbeperkt"
+
+#~ msgid "Global"
+#~ msgstr "Globaal"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = Onbeperkt"
+
+#~ msgid "Button style"
+#~ msgstr "Knop stijl"
+
+#~ msgid "Move To"
+#~ msgstr "Verplaatsen naar"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Maximale downloadsnelheid (Kib/s)"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Maximale uploadsnelheid (Kib/s)"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Maximum aantal uploadslots"
+
+#~ msgid "Inbound"
+#~ msgstr "Inkomend"
+
+#~ msgid "Outbound"
+#~ msgstr "Uitgaand"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr ".torrent-bestanden opslaan in"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Map automatisch toevoegen"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Per Torrent"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Alle downloads opslaan in"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Maximum aantal verbindingspogingen per seconde"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Totaal actieve torrents"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Totaal bezig met seeden"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Totaal bezig met downloaden"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Plugins inschakelen"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Oud wachtwoord is ongeldig"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Nieuw wachtwoord"
+
+#~ msgid "Current Password"
+#~ msgstr "Huidig wachtwoord"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Voer een lijst van waarden in"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Nieuw wachtwoord is niet gelijk aan nieuw wachtwoord (bevestigen)"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Deze wijzigingen werden opgeslaan"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Corrigeer de fouten hierboven en probeer opnieuw"
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Selecteer een geldige keuze. %s is geen beschikbare keuze."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Geef een geldige waarde in."
+
+#~ msgid "This field is required."
+#~ msgstr "Dit veld is vereist."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Controleer of er niet meer dan %s tekens zijn in totaal."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Controleer of deze waarde groter dan of gelijk is aan %s."
+
+#~ msgid "Enter a number."
+#~ msgstr "Geef een getal in."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Geef een geheel getal in."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Controleer of deze waarde kleiner dan of gelijk is aan %s."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Geef een geldig e-mailadres in."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Geef een geldig tijdstip in."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Geef een geldig(e) datum/tijdstip in."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr ""
+#~ "Controleer of er niet meer dan %s tekens voor het decimaalteken zijn."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Geef een geldige datum in."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Controleer of er niet meer dan %s tekens na het decimaalteken zijn."
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Connect"
+#~ msgstr "Verbinden"
+
+#~ msgid "Statistics"
+#~ msgstr "Statistieken"
+
+#~ msgid "Delete"
+#~ msgstr "Verwijderen"
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Geef een geldige URL in."
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Deze map bestaat niet."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Geef een geldig IPv4-adres in."
+
+#~ msgid "Move"
+#~ msgstr "Verplaatsen"
+
+#~ msgid "Stop"
+#~ msgstr "Stoppen"
+
+#~ msgid "Queue Top"
+#~ msgstr "Begin van de rij"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Einde van de rij"
+
+#~ msgid "Other.."
+#~ msgstr "Andere..."
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Time-out (seconden)"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Bezig met importeren %s"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Bezig met downloaden %.2f%%"
+
+#~ msgid "Import Now"
+#~ msgstr "Nu importeren"
+
+#~ msgid "Inactive"
+#~ msgstr "Niet actief"
+
+#~ msgid "Forced"
+#~ msgstr "Geforceerd"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Maximale half-openstaande connecties"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "Herstart Daemon en webui na het veranderen van deze instellingen"
+
+#~ msgid "Error in Path."
+#~ msgstr "Fout in pad."
+
+#~ msgid "Handshake"
+#~ msgstr "Handdruk"
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Het verzonden bestand is leeg."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Deze URL blijkt niet geldig te zijn."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Upload een geldige afbeelding. Het ge-uploade bestand was of geen afbeelding "
+#~ "of een beschadigde afbeelding."
+
+#~ msgid "Recheck"
+#~ msgstr "Controleer opnieuw"
+
+#~ msgid "Refresh status"
+#~ msgstr "Ververs status"
+
+#~ msgid "page 6"
+#~ msgstr "pagina 6"
+
+#~ msgid "page 7"
+#~ msgstr "pagina 7"
+
+#~ msgid "page 8"
+#~ msgstr "pagina 8"
+
+#~ msgid "Active time"
+#~ msgstr "Actieve tijd"
+
+#~ msgid "Admin"
+#~ msgstr "Beheerder"
+
+#~ msgid "False"
+#~ msgstr "Fout"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Verbinden met Daemon"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Op sleutelwoord filtreren"
+
+#~ msgid "Keyword"
+#~ msgstr "Sleutelwoord"
+
+#~ msgid "Label torrent"
+#~ msgstr "Torrent labelen"
+
+#~ msgid "Move torrent"
+#~ msgstr "Torrent verplaatsen"
+
+#~ msgid "Connected to"
+#~ msgstr "Verbonden met"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge inloggen"
+
+#~ msgid "Restart"
+#~ msgstr "Herstarten"
+
+#~ msgid "Update"
+#~ msgstr "Update"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Stop met seeden indien ratio bereikt"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Niet verbonden met een daemon"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Dit e-mailbericht is er om u te informeren dat Deluge klaar is met "
+#~ "downloaden van %s , die %i bestanden inhoudt.\n"
+#~ "Om deze notificaties te annuleren, zet \"E-mail notificatie\" uit bij "
+#~ "voorkeuren van Deluge.\n"
+#~ "\n"
+#~ "Dank u wel,\n"
+#~ "Deluge"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Inclusief %i bestanden"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "De torrent heeft de stop-ratio overschreden."
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Stop seeden op ratio"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Geblokkeerde ranges: %s"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 10"
+#~ msgstr "page 10"
+
+#~ msgid "page 11"
+#~ msgstr "page 11"
+
+#~ msgid "Homepage"
+#~ msgstr "Homepage"
+
+#~ msgid "Community"
+#~ msgstr "Gemeenschap"
+
+#~ msgid "FAQ"
+#~ msgstr "FAQ"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr "Dit hoeft niet vertaald te worden.\n"
+
+#~ msgid "About"
+#~ msgstr "Informatie"
+
+#~ msgid "Clear"
+#~ msgstr "Wissen"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Automatisch verversen"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge: Torrent Lijst"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Gedownloade bestanden verwijderen."
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Torrent verwijderen wanneer ratio bereikt is"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "Dit programma is vrije software; u mag het verspreiden en/of modificeren "
+#~ "onder de voorwaarden van de GNU General Public License zoals gepubliceerd "
+#~ "door de Free Software Foundation; ofwel versie 3 van de License, of (naar uw "
+#~ "wil) eender welke latere versie. Dit programma is verspreid in de hoop dat "
+#~ "het nuttig is, maar ZONDER ENIGE GARANTIE; zonder zelfs de geïmpliceerde "
+#~ "garantie van VERHANDELBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD DOEL. Zie de "
+#~ "GNU General Public License voor meer details. U zou een copy van de GNU "
+#~ "General Public License ontvangen moeten hebben bij dit programma; zo niet, "
+#~ "zie <http://www.gnu.org/licenses>."
+
+#~ msgid "page 12"
+#~ msgstr "pagina 12"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-bewerken"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Torrents Toevoegen</b></big>"
+
+#~ msgid "From Session"
+#~ msgstr "Van Sessie"
+
+#~ msgid "Show trackers"
+#~ msgstr "Trackers tonen"
+
+#~ msgid "Seed rank"
+#~ msgstr "Seed rang"
+
+#~ msgid "Seeding time"
+#~ msgstr "Seed Tijd"
+
+#~ msgid "True"
+#~ msgstr "Ja"
+
+#~ msgid "Either"
+#~ msgstr "Beide"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Maak een geldige keuze. Die keuze is niet een van de beschikbare keuzes."
+
+#~ msgid "Cache templates"
+#~ msgstr "Cache templates"
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Zorg ervoor dat deze waarde op z'n minst %(min)d karakters heeft (het zijn "
+#~ "er reeds %(length)d)."
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Zorg ervoor dat deze waarde op z'n meest %(max)d karakters heeft (het zijn "
+#~ "er reeds %(length)d)"
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr ""
+#~ "Maak een geldige keuze. %(value)s is niet een van de beschikbare keuzes."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Er was geen bestand verzonden."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr ""
+#~ "Er was geen bestand verzonden. Controleer het type encoding op het formulier."
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Importeren bij startup van de daemon"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Aantal downloadpogingen"
+
+#~ msgid "BlockList"
+#~ msgstr "Blokkeer lijst"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Controleer iedere .. dagen"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "# Of Files"
+#~ msgstr "# Aantal Bestanden"
+
+#~ msgid "Ava"
+#~ msgstr "Besch."
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Zet automatisch toevoegen aan"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Automatisch vernieuwen (seconden)"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Bezig..."
+
+#~ msgid "State"
+#~ msgstr "Status"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "Https"
+#~ msgstr "https"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Zijbalk tonen"
+
+#~ msgid "Graphs"
+#~ msgstr "Grafieken"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Seeds/Peers"
+
+#~ msgid "All Finished!"
+#~ msgstr "Alles Beëindigd"
+
+#~ msgid "no label"
+#~ msgstr "geen label"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... en verwijder Torrent bestand"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... en verwijder Gedownloade bestanden"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... en verwijder Alle bestanden"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Upload plaatsen limiet"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Start de webui manueel opnieuw op om de veranderingen toe te passen."
+
+#~ msgid "Cancel"
+#~ msgstr "Annuleren"
+
+#~ msgid "Disk Space"
+#~ msgstr "Schijfruimte"
+
+#~ msgid "Do not download"
+#~ msgstr "Niet downloaden"
+
+#~ msgid "High priority"
+#~ msgstr "Hoge prioriteit"
+
+#~ msgid "Search"
+#~ msgstr "Zoeken"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Certificaat niet gevonden in '%s'"
+
+#~ msgid "From Url"
+#~ msgstr "Van Url"
+
+#~ msgid "Highest priority"
+#~ msgstr "Hoogste prioriteit"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "max_upload_slots"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "max_upload_speed"
+
+#~ msgid "max_download_speed"
+#~ msgstr "max_download_speed"
+
+#~ msgid "apply_max"
+#~ msgstr "apply_max"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Fout bij instellen labelopties."
+
+#~ msgid "max_connections"
+#~ msgstr "max_connections"
+
+#~ msgid "apply_queue"
+#~ msgstr "apply_queue"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "is_auto_managed"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "stop_at_ratio"
+
+#~ msgid "stop_ratio"
+#~ msgstr "stop_ratio"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "remove_at_ratio"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "apply_move_completed"
+
+#~ msgid "move_completed"
+#~ msgstr "move_completed"
+
+#~ msgid "move_completed_path"
+#~ msgstr "move_completed_path"
+
+#~ msgid "auto_add"
+#~ msgstr "auto_add"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "auto_add_trackers"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Toon lege resultaten"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Toets niet gevonden bij '%s'"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Beperk IP overhead samen met doorvoersnelheid."
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Normal priority"
+#~ msgstr "Normale prioriteit"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Verbindingslimiet"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "Limiet downloadsnelheid"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Geen binnenkomende verbindingen"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Forceer controle"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "Limiet uploadsnelheid"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "Beveiligde HTTP"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socks v5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Beveiligde socks v5"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socks v4"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Toon sleutelwoordzoeken"
+
+#~ msgid "Test config value"
+#~ msgstr "Test config waarde"
+
+#~ msgid "Stats"
+#~ msgstr "Statistieken"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Deluge Configuratie Hulp Programma"
+
+#~ msgid "Force Download"
+#~ msgstr "Forceer Download"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr ""
+#~ "Dit hulp programma helpt je om Deluge te configureren naar jouw voorkeur."
+
+#~ msgid "Test config value:"
+#~ msgstr "Test config waarde:"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s is geen geldige URL"
+
+#~ msgid "Downloading.."
+#~ msgstr "Downloaden.."
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Niet verbonden.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Downloaden mislukt: %s"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge is beveiligd met een wachtwoord!</big></b>"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Voer uw wachtwoord in om door te gaan</i>"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "Dit programma is vrije software; je kan het herdistributeren en/of wijzigen "
+#~ "onder de voorwaarden van de GNU General Public Licensie gepubliceerd bij de "
+#~ "Free Software Foundation; oftewel versie 3 van de Licensie, of (uit eigen "
+#~ "keuze) elke recentere versie. Dit programma is gedistributeerd in de hoop "
+#~ "dat het nuttig is, maar ZONDER ENIGE GARANTIE; zonder indirecte garantie van "
+#~ "VERKOOPBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD DOEL. Zie de GNU General "
+#~ "Public Licensie voor meer details. Je zou een kopie van de GNU General "
+#~ "Public Licentie bij dit programma erbij hebben gekregen; zo niet, zie "
+#~ "<http://www.gnu.org/licenses>. Daarnaast, als een speciale uitzondering, de "
+#~ "houders van het auteursrecht van dit programma geven toestemming om "
+#~ "gedeeltelijke stukken programmacode van dit programma te linken met de "
+#~ "OpenSSL Bibliotheek. Je moet de GNU General Public Licentie gehoorzamen "
+#~ "alleszins bij alle gebruikte programmacode die anders is dan OpenSSL. Als je "
+#~ "deze bestand(en) aanpast met deze uitzondering, je mag deze "
+#~ "uitzonderingsverklaring in de bestand(en) van jouw versie zetten, maar je "
+#~ "bent dat niet verplicht te doen. Als je dat niet wenst, verwijder dan deze "
+#~ "uitzonderingsverklaring van je eigen versie. Als je deze "
+#~ "uitzonderingsverklaring van alle broncode-bestanden in het programma "
+#~ "verwijdert, verwijder dan ook deze uitzonderingsverklaring."
diff --git a/deluge/i18n/pl.po b/deluge/i18n/pl.po
new file mode 100644
index 0000000..fa12735
--- /dev/null
+++ b/deluge/i18n/pl.po
@@ -0,0 +1,4725 @@
+# Polish translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: Michał Kaliszka <desmont@gmail.com>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2010-10-17 08:55+0000\n"
+"Last-Translator: Mateusz <Unknown>\n"
+"Language-Team: Polish <pl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Maksymalna prędkość wysyłania:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Maksymalna liczba połączeń wychodzących:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Maksymalna prędkość pobierania:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Usuń, gdy współczynnik (ratio) osiągnie wartość"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "Tekst PeerGuardian (nieskompresowany)"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "dni"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrenty dodane do kolejki"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Aktywowanych"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Warstwa"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Współczynnik"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Dodaj torrenta"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Pozycja na liście rozsiewających:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Peerów:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Pliki"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Uczestnicy"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>Czy rzeczywiście chcesz usunąć wybrane torrenty?</b></big>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "U_suń"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Maksymalna prędkość pobierania:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Maksymalna prędkość wysyłania:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Zastosuj dla wszystkich"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Wymiana uczestników"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Usługa wyszukująca znajduje uczestników w twojej sieci lokalnej."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Maksymalna liczba połączeń wychodzących:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Obszar powiadamiania</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Liczba aktywnych torrentów:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Liczba aktywnych torrentów (pobieranie):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Limit dla współczynnika udostępniania:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Współczynnik dla czasu rozsiewania:"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Automatycznie zarzÄ…dzany"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Edycja trackera"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Edycja trackera</b>"
+
+#~ msgid "Forced"
+#~ msgstr "Wymuszony"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Zapisuj wszystkie pobrane pliki w"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Nowe hasło (potwierdź)"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Zatrzymaj rozsiewanie, gdy współczynnik osiągnie wartość"
+
+#~ msgid "Pieces"
+#~ msgstr "Części"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torrent osiągnął współczynnik (ratio) warunkujący zatrzymanie."
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Zatrzymaj rozsiewanie, gdy współczynnik (ratio) osiągnie wartość"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Usuń torrent, gdy współczynnik (ratio) osiągnie wartość"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Nazwa hosta:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Użytkownik:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Hasło:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Od:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "WÅ‚Ä…czone"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Ustawienia"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Wybierz katalog"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Lokalizacja pobranych plików</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Maksymalna liczba połączeń:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>ÅÄ…cze</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Przestań rozsiewać przy współczynniku:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Góra"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Dół"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Kolejka</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Opcje"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Limit pobierania:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Limit wysyłania"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Aktywne Torrenty:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Niepoprawna etykieta. Poprawne znaki: [a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Pusta etykieta"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Etykieta już istnieje"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Nieznana etykieta"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Nieznany torrent"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Etykieta"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "_Opcje etykiet"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_Usuń etykietę"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_Dodaj etykietÄ™"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Opcje etykiety"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Opcje etykiety</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Połączenia wychodzące:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Prędkość wysyłania:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Prędkość pobierania:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Liczba połączeń:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Zastosuj dla każdego torrenta ustawienia maks."
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maksimum"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Automatycznie zarzÄ…dzany"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Zastosuj ustawienia kolejki:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Kolejka"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Przenieś zakończone do:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Zastosuj ustawienia lokalizacji:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Lokalizacja"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 linia na tracker)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Automatycznie zastosuj etykietÄ™:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Trackery"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Dodaj etykietÄ™"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Dodaj etykietÄ™</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Nazwa:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Użyj bocznego panelu żeby dodać, edytować i usuwać etykiety. </i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Etykiety</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Rozpakuj do:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Stwórz podfolder o nazwie torrentu"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Ta opcja stworzy podfolder używając nazwy torrenta w folderze zaznaczonym do "
+"rozpakowania i wstawi tam rozpakowane pliki"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Ogólne</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Aktywuj interfejs sieciowy"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "WÅ‚Ä…cz SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Port nasłuchujący:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Ustawienia</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Lista Emule IP (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "Tekst SafePeer (Zip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Błędny prowadnik"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Niepoprawny kod magiczny"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Nieprawidłowa wersja"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Lista zablokowanych"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Sprawdź czy jest nowa lista co:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Importuj listÄ™ zablokowanych przy starcie"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+"Pobierz plik z listą zablokowanych jeżeli to konieczne i importuj go."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Sprawdź czy jest nowa lista i importuj"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Pobierz nowy plik z listÄ… zablokowanych i importuj go."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "WymuÅ› pobranie listy i importuj"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Blocklista jest zaaktualizowana"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Opcje</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Typ:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Data:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Rozmiar pliku:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Informacje</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torrent ukończony"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torrent dodany"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Uruchom"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Zdarzenie"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Polecenie"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Dodaj polecenie</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Polecenia</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Aktualizacja powiodła się"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Żądanie aktualizacji wysłane"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Ostrzeżenie"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "BÅ‚Ä…d"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Afganistan"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Wyspy Alandzkie"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Albania"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Algieria"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Samoa Amerykańskie"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andora"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antarktyda"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antigua i Barbuda"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Argentyna"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Armenia"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "Australia"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Austria"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Azerbejdżan"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Wyspy Bahama"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bahrajn"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Bangladesz"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Białoruś"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Belgia"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermudy"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Boliwia"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bośnia i Hercegowina"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Bostwana"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Wyspa Bouvet"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brazylia"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Brytyjskie Terytorium Oceanu Indyjskiego"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Sułtanat Brunei"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Bułgaria"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Republika Burundi"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Kambodża"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Kamerun"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Kanada"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Republika Zielonego PrzylÄ…dka"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Kajmany"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Republika Åšrodkowej Afryki"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Czad"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Chile"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Chiny"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Wyspa Bożego Narodzenia"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Wyspy Kokosowe"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Kolumbia"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Komory"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Kongo"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Demokratyczna Republika Konga"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Wyspy Cooka"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Kostaryka"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Wybrzeże Kości Słoniowej"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "Chorwacja"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Kuba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Cypr"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Czeska Republika"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Dania"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Dżibuti"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominikana"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Republika Dominikańska"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Ekwador"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Egipt"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "Salwador"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Gwinea równikowa"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Erytrea"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Estonia"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Etiopia"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falklandy"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Wyspy Owcze"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fidżi"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Finlandia"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Francja"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "Gujana Francuska"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "Polinezja Francuska"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "Francuskie Terytoria Południowe i Antarktyczne"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Gruzja"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "Niemcy"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Wielka Brytania"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Grecja"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Grenlandia"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Gwadelupa"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Gwatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Gwinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Gwinea Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Gujana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Wyspa Heard i Wyspy McDonalda"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Watykan"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Węgry"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Islandia"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "Indie"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonezja"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Iran"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Irak"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Irlandia"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Wyspa Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Izrael"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "WÅ‚ochy"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamajka"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japonia"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordania"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazachstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenia"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Korea Północna"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Korea Południowa"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuwejt"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kirgistan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Ludowa Republika Demokratyczna Laosu"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Åotwa"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Liban"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberia"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libia"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Litwa"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luksemburg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Makau"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Republika Macedonii"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagaskar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malezja"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Malediwy"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Wyspy Marshalla"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martynika"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauretania"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Majotta"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Meksyk"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Mikronezja"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Mołdawia"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monako"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolia"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Czarnogóra"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Maroko"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambik"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Birma"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Holandia"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Antyle Holenderskie"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Nowa Kaledonia"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Nowa Zelandia"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nikaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Wyspa Norfolk"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Mariany Północne"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norwegia"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Terytorium Palestyńskie, okupowane"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua-Nowa Gwinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paragwaj"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filipiny"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Polska"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugalia"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Portoryko"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Katar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Rumunia"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Rosja"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Rwanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Saint-Barthélemy"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Święta Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Saint Kitts i Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Saint Lucia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Saint Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint Pierre i Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Saint Vincent i Grenadyny"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Wyspy Świętego Tomasza i Książęca"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Arabia Saudyjska"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbia"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seszele"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapur"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "SÅ‚owacja"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "SÅ‚owenia"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Wyspy Salomona"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "RPA"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Georgia Południowa i Sandwich Południowy"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Hiszpania"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Surinam"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard i Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Suazi"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Szwecja"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Szwajcaria"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Syria"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Tajwan, Republika Chińska"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tadżykistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzania"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Tajlandia"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Timor Wschodni"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trynidad i Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunezja"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Turcja"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Turks i Caicos"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukraina"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Zjednoczone Emiraty Arabskie"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Stany Zjednoczone"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Dalekie Wyspy Mniejsze Stanów Zjednoczonych"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Urugwaj"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Uzbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Wenezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Wietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Brytyjskie Wyspy Dziewicze"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Wyspy Dziewicze Stanów Zjednoczonych"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis i Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Sahara Zachodnia"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Jemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabwe"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Offline"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Online"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Połączono"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Daemon nie istnieje"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Demon nie jest uruchomiony"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Uruchamiam serwer z PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Adres"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Klient"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Postęp"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Szybk. pobierania"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Szybk. wysyłania"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrent dodany do kolejki"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Bez limitu"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Inna..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Pob.:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Wys.:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Pob."
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Wys."
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Ustaw maksymalną prędkość pobierania"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Ustaw maksymalną prędkość wysyłania"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Zakończono pobieranie torrenta"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"To jest e-mail informujący o tym, że Deluge zakończył pobierać %(name)s , "
+"zawierający %(num_files)i plików.\n"
+"Aby przestać otrzymywać powiadomienia, wyłącz opcję powiadamianie przez e-"
+"mail w preferencjach Deluge.\n"
+"Dziękujemy,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Pobierane"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Sieć"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "ÅÄ…cze"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Interfejs"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Inne"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Demon"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Proxy"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Bufor podręczny"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Wtyczki"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Wtyczka"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Wybierz wtyczkÄ™"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Pliki *.egg pluginów"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Nazwa pliku"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Rozmiar"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Niewłaściwy plik"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Nie można dodać tego samego torrenta dwukrotnie."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Nie można ustawić priorytetu pliku!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Wybierz plik .torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Pliki .torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Wszystkie pliki"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Nieprawidłowy adres URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "BÅ‚Ä…d pobierania"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Tracker"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Wybierz plik"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Wybierz katalog"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Zapisz plik .torrent"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Niepołączony"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Połączeń"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Prędkość pobierania"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Prędkość wysyłania"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Prędkość pobierania/wysyłania"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "Węzły DHT"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Brak połączeń przychodzących!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Ustaw maksymalną liczbę połączeń"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrenty"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Etykiety"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Wszystkie"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Pobieranie"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Wysyłanie"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Pauza"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Sprawdzanie"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "W kolejce"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Brak"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Brak etykiety"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Host"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "BÅ‚Ä…d przy dodawaniu hosta"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Wyłączyć Tryb Klasyczny"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Proces demona Deluge (deluged) jest już uruchomiony.\n"
+"Zatrzymaj demona lub wyłącz Tryb Klasyczny aby kontynuować."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Wystąpił błąd przy uruchamianiu w Trybie Klasycznym. Kontynuować wyłączając "
+"go?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "WÅ‚Ä…czone"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Wyłączony"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Ustaw brak ograniczenia"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Wybierz katalog, do którego przenieść pliki"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Ustaw maksymalną liczbę połączeń wychodzących"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Priorytet"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Szczegóły:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Nazwa"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Pobrano"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Wysłano"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "RozsiewajÄ…cych"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Uczestnicy"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Pozostało"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Dost."
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Dodano"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "P_lik"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Stwórz torrenta"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Edycja"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Menadżer połączeń"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Widok"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Pasek narzędzi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "Panel _boczny"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Pasek _stanu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "_Zakładki"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Kolumny"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "_Boczny panel"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Wyświetl puste kategorie"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Pokaż _trackery"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Pomoc"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Najczęściej zadawane pytania"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Dodaj torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Dodaj plik torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Usuń torrenta"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Usuń torrenta"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Wstrzymaj wybrane torrenty"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Wstrzymaj"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Wznów wybrane torrenty"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Wznów"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Przenieś o jedno miejsce w kolejce w górę"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Przenieś o jedno miejsce w kolejce w górę"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Przenieś o jedno miejsce w kolejce w dół"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Przenieś o jedno miejsce w kolejce w dół"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Opcje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Menadżer połączeń"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "Rozwiń _wszystko"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "Nie po_bieraj"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "Normalny p_riorytet"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "W_ysoki priorytet"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Na_jwyższy priorytet"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Automatycznie zarzÄ…dzany:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Czas rozsiewania:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Czas aktywności:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Status trackera:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Dostępność:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>RozsiewajÄ…cych:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Części:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Do końca:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Następna Aktualizacja:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Współczynnik udostępniania (ratio):</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Wysłano:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Pobrano:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Data dodania:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Stan"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Komentarze:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># plików:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Suma kontrolna:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>ÅÄ…czny rozmiar:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Nazwa:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Ścieżka:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Stan:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Szczegóły"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Przenieś zakończone:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Prywatne"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Kolejkuj Pierwszy/Ostatni"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_Edycja trackerów"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Opcje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Usunąć torrenta?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>PowiÄ…zany .torrent zostanie skasowany!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Pobrane dane zostaną usunięte!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Usuń wybrane torrenty"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Nowa wersja"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Nowa wersja jest dostępna!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Dostępna wersja:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Bieżąca wersja:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Nie pokazuj więcej tego okienka"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "_Idź do strony domowej"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Dodaj adres IP uczestnika"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Zaznacz wszystko"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Wstrzymaj wszystkie"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Wznów zaznaczone torrenty"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Wz_nów wszystkie"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Dodaj torrenty"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrenty</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "P_liki"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Pełny"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Przyrostowy"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Przydział</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Dodaj jako _wstrzymane"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Kolejkuj Pierwsze/Ostatnie fragmenty"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Przywróć ustawienia domyślne"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Dodaj URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Z URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Dodaj Infohash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "Z Infohash'a"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Trackery:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Stwórz torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Stwórz torrent</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Fol_der"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Zdalna ścieżka"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Pliki</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Autor:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Komentarze:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Informacje"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Serwery rozsiewajÄ…ce"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Rozmiar części:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Ustaw jako prywatny"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Dodaj ten torrent do sesji"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Wprowadź zdalną ścieżkę"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Zdalna ścieżka</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Ścieżka:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Tworzenie torrenta"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Zapisz .torrent jako"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Zapisz plik .torrent</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Torrenty w kolejce"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Dodaj torrenty z kolejki</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Automatycznie dodaj torrenty przy połączeniu"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "etykieta"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Dodaj Peera"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Dodaj Uczestnika</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "nazwa hosta:port"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Dodaj hosta"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Menadżer połączeń</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Uruchom lokalnego demona"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Przy starcie automatycznie połącz z wybranym hostem"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "W razie potrzeby automatycznie uruchom lokalnego hosta"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Nie pokazuj tego okna przy starcie"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Pobieranie</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Dodaj automatycznie pliki .torrent z:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Pobierz do:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Zapisz kopię plików .torrent w:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Katalogi</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Używaj pełnego przydziału miejsca"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Tryb pełnego przydziału alokuje cały obszar dysku potrzebny na pliki, co "
+"zapobiega fragmentacji dysku"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Oszczędny przydział miejsca"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Tryb oszczędny alokuje miejsce według potrzeb"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Pobieraj najpierw pierwsze i ostatnie części plików"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Pobieraj najpierw pierwsze i ostatnie części plików"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Dodaj torrenty jako Wstrzymane"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Sieć</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Użyj losowych portów"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge za każdym razem wybierze automatycznie inny port."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Aktywny port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Do:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Testuj port"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Porty przychodzÄ…ce</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Porty wychodzÄ…ce</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>Interfejs</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"Bajt TOS ustawiony w nagłówku IP każdego pakietu wysyłanego do uczestników "
+"(wliczając rozsiewających z WWW). Wprowadź wartość w systemie szesnastkowym,"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Bajt TOS dla uczestników"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Uniwersalne Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "Protokół mapowania portów NAT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+"Rozproszona tablica skrótów (DHT) może pomóc zwiększyć ilość aktywnych "
+"połączeń."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Dodatkowe opcje</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "PrzychodzÄ…ce:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Poziom:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Wymuszone\n"
+"WÅ‚Ä…czone\n"
+"Wyłączone"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Negocjacja połączenia\n"
+"Cały strumień\n"
+"Obydwa"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "WychodzÄ…ce:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Szyfruj cały strumień"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Szyfrowanie</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>ÅÄ…cze</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Maksymalna liczba prób połączeń na sekundę:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Maksymalna liczba półotwartych połączeń:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Maksymalna prędkość wysyłania dla wszystkich plików .torrent. Ustaw -1 dla "
+"braku ograniczeń."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Maksymalna prędkość wysyłania (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "Maksymalna ilość możliwych połączeń. Ustaw -1 dla braku ograniczeń."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Maksymalna liczba połączeń:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Maksymalna ilość połączeń wychodzących dla wszystkich plików torrent. Ustaw -"
+"1 dla braku ograniczeń."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Maksymalna prędkość pobierania dla wszystkich plików .torrent. Ustaw -1 dla "
+"braku ograniczeń."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Maksymalna prędkość pobierania (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Ignorowanie limitów w sieci lokalnej"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Wlicz narzut protokołu IP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Jeśli zaznaczone, szacunkowy narzut protokołu TCP/IP jest odejmowany od "
+"limitów przepustowości by zapobiec ich przekroczeniu przez całkowity ruch."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Globalne zużycie przepustowości łącza</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"Maksymalna ilość połączeń wychodzących na torrent. Ustaw -1 dla braku "
+"ograniczeń."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"Maksymalna liczba połączeń na torrent. Ustaw -1 dla braku ograniczeń."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Przydział przepustowości na każdy torrent z osobna</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Interfejs</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "WÅ‚Ä…cz"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Tryb klasyczny ukryje większość funkcjonalności demona i sprawi, że Deluge "
+"będzie pojedynczą aplikacją. Użyj tej opcji jeśli nie chcesz uruchomić "
+"Deluge jako demona, Musisz uruchomić ponownie Deluge żeby zmiany zostały "
+"wprowadzone."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "Tryb klasyczny"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Pokaż prędkość dla sesji w pasku tytułu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Okno główne</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Zawsze pokazuj"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Okienko na wierzchu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "Okienko dodawania torrentów"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Pokaż ikonę w obszarze powiadamiania"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Minimalizowanie do obszaru powiadamiania po zamknięciu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Uruchamiaj w obszarze powiadamiania"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Zabezpiecz obszar powiadamiania hasłem"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Inne</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Informuj o nowych wydaniach"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge będzie sprawdzał nasze serwery i poinformuje Cię jeśli pojawi się "
+"nowa wersja"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Aktualizacje</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Pomóż nam ulepszać Deluge wysyłając nam numer wersji Pythona, PyGTK, "
+"systemu oraz typ procesora. Żadne inne informacje nie są wysyłane."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Tak, wysyłaj anonimowe statystyki"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Informacje o systemie</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Położenie:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Jeśli Deluge nie będzie mógł znaleźć pliku bazy danych pod tą ścieżką, użyje "
+"DNS-u, aby ustalić kraj uczestnika."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>Baza Danych GeoIP</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Połącz linki Magnet z Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Demon</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Port demona:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Port</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Zezwól na połączenia zdalne"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Połączenia</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Okresowo sprawdzaj stronÄ™ w poszukiwaniu nowych wersji"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Inne</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Kolejka</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Umieść nowe torrenty na początku kolejki"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Liczba aktywnych torrentów (wysyłanie)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Nie bierz pod uwagę wolnych torrentów"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Aktywne torrenty</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Czas rozsiewania (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Przestań wysyłać kiedy współczynnik udostępniania osiągnie:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Usuń torrenta kiedy współczynnik udostępniania osiągnie:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Rozsiewanie</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Proxy</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Host:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Żaden\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 (wymagajÄ…cy autoryzacji)\n"
+"HTTP\n"
+"HTTP (wymagajÄ…cy autoryzacji)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Uczestnik</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>RozsiewajÄ…cy z WWW</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Tracker</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Zapis</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Odczyt</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Rozmiar Cache:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Rozmiar Cache Odczytu:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Rozmiar</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Stan</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Wtyczki</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Wersja:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Strona domowa:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "E-mail Autora:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Instaluj WtyczkÄ™"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Szukaj wtyczek"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "Sz_ukaj Wtyczek"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Pokaż Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "Wz_nów wszystkie"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "Limit prędkości _pobierania"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "Limit prędkości _wysyłania"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Zakończ i wyłącz demona"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Otwórz katalog"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Wz_nów"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "O_pcje"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Kolejka"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Aktualizuj informacje o trackerze"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Usuń torrent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "WymuÅ› _sprawdzenie"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "PrzenieÅ› _docelowy katalog"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "Limit p_ołączeń"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Limit dla p_ołączeń wychodzących"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Usunąć wybrane torrenty?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Jeżeli skasujesz dane to zostaną one utracone na zawsze."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Edycja trackerów"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Edycja trackerów</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Dodaj tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Dodaj trackery</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Skasuj razem z _danymi"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Skasuj _torrent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "PrzenieÅ› docelowy katalog"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>PrzenieÅ› docelowy katalog<b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Położenie:"
+
+#~ msgid "seconds"
+#~ msgstr "sekund"
+
+#~ msgid "Unknown"
+#~ msgstr "Nieznany"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Odśwież informacje o trackerze"
+
+#~ msgid "Yes"
+#~ msgstr "Tak"
+
+#~ msgid "No"
+#~ msgstr "Nie"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Używaj DHT BitTorrenta"
+
+#~ msgid "Remove"
+#~ msgstr "Usuń"
+
+#~ msgid "Details"
+#~ msgstr "Szczegóły"
+
+#~ msgid "Files"
+#~ msgstr "Pliki"
+
+#~ msgid "General"
+#~ msgstr "Ogólne"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Maksymalna liczba połączeń"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge jest zablokowany"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge jest chroniony hasłem.\n"
+#~ "Aby pokazać Deluge, wpisz hasło."
+
+#~ msgid "Availability"
+#~ msgstr "Dostępność"
+
+#~ msgid "Select All"
+#~ msgstr "Zaznacz wszystko"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Usuń plik .torrent"
+
+#~ msgid "Add"
+#~ msgstr "Dodaj"
+
+#~ msgid "Username"
+#~ msgstr "Nazwa użytkownika"
+
+#~ msgid "Server"
+#~ msgstr "Serwer"
+
+#~ msgid "Password"
+#~ msgstr "Hasło"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "Filters"
+#~ msgstr "Filtry"
+
+#~ msgid "_Quit"
+#~ msgstr "Wy_jdź"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Odśwież stronę co:"
+
+#~ msgid "Set"
+#~ msgstr "Ustaw"
+
+#~ msgid "Submit"
+#~ msgstr "Wyślij"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Wyślij torrent"
+
+#~ msgid "Template"
+#~ msgstr "Szablon"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Automatyczne odświeżanie:"
+
+#~ msgid "About"
+#~ msgstr "O programie"
+
+#~ msgid "# Of Files"
+#~ msgstr "# Plików"
+
+#~ msgid "Logout"
+#~ msgstr "Wyloguj siÄ™"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Hasło jest niepoprawne, spróbuj ponownie"
+
+#~ msgid "Pause all"
+#~ msgstr "Wstrzymaj wszystko"
+
+#~ msgid "Login"
+#~ msgstr "Zaloguj siÄ™"
+
+#~ msgid "Torrent list"
+#~ msgstr "Lista torrentów"
+
+#~ msgid "Resume all"
+#~ msgstr "Wznów wszystkie"
+
+#~ msgid "From"
+#~ msgstr "Od"
+
+#~ msgid "Clear"
+#~ msgstr "Wyczyść"
+
+#~ msgid "Image Only"
+#~ msgstr "Tylko grafika"
+
+#~ msgid "Text and image"
+#~ msgstr "Tekst i grafika"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Usuń pobrane pliki"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Prędkość:</b>"
+
+#~ msgid "Download"
+#~ msgstr "Szybk. pobierania"
+
+#~ msgid "Upload"
+#~ msgstr "Szybk. wysyłania"
+
+#~ msgid "Graph"
+#~ msgstr "Wykres"
+
+#~ msgid "New Password"
+#~ msgstr "Nowe hasło"
+
+#~ msgid "Text Only"
+#~ msgstr "Tylko tekst"
+
+#~ msgid "translate something"
+#~ msgstr "przetłumacz coś"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "odświeżanie musi być > 0"
+
+#~ msgid "Ava"
+#~ msgstr "Dost."
+
+#~ msgid "Config"
+#~ msgstr "Ustawienia"
+
+#~ msgid "Disable"
+#~ msgstr "Wyłącz"
+
+#~ msgid "Eta"
+#~ msgstr "Pozostało"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Ustaw czas aktywności"
+
+#~ msgid "Speed"
+#~ msgstr "Prędkość"
+
+#~ msgid "Total Size"
+#~ msgstr "Całkowity rozmiar"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Stan trackera"
+
+#~ msgid "Disabled"
+#~ msgstr "Wyłączone"
+
+#~ msgid "Type"
+#~ msgstr "Typ"
+
+#~ msgid "Queue Position"
+#~ msgstr "Pozycja w kolejce"
+
+#~ msgid "File"
+#~ msgstr "Plik"
+
+#~ msgid "Save"
+#~ msgstr "Zapisz"
+
+#~ msgid "Ports"
+#~ msgstr "Porty"
+
+#~ msgid "To"
+#~ msgstr "Do"
+
+#~ msgid "Random"
+#~ msgstr "Losowe"
+
+#~ msgid "Encryption"
+#~ msgstr "Szyfrowanie"
+
+#~ msgid "No data"
+#~ msgstr "Brak danych"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Maksymalna prędkość wysyłania"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Wymiana Peerów"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Maksymalna prędkość pobierania (Kib/s)"
+
+#~ msgid "Move To"
+#~ msgstr "PrzenieÅ› do"
+
+#~ msgid "Current Password"
+#~ msgstr "Obecne hasło"
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Wpisz cały numer"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Connect"
+#~ msgstr "Połącz"
+
+#~ msgid "Statistics"
+#~ msgstr "Statystyki"
+
+#~ msgid "Delete"
+#~ msgstr "Usuń"
+
+#~ msgid "Move"
+#~ msgstr "PrzenieÅ›"
+
+#~ msgid "Download Location"
+#~ msgstr "Miejsce zapisu pobieranych danych"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Wszystkie aktywne torrenty"
+
+#~ msgid "This field is required."
+#~ msgstr "To pole jest wymagane."
+
+#~ msgid "Other.."
+#~ msgstr "Inne..."
+
+#~ msgid "Error in torrent options."
+#~ msgstr "BÅ‚Ä…d w ustawieniach torrenta"
+
+#~ msgid "Extra's"
+#~ msgstr "Dodatki"
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Wprowadź poprawny adres e-mail."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Wprowadź poprawną datę."
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Importowanie %s"
+
+#~ msgid "Inactive"
+#~ msgstr "Nieaktywne"
+
+#~ msgid "page 6"
+#~ msgstr "strona 6"
+
+#~ msgid "page 8"
+#~ msgstr "strona 8"
+
+#~ msgid "page 7"
+#~ msgstr "strona 7"
+
+#~ msgid "Community"
+#~ msgstr "Społeczność"
+
+#~ msgid "FAQ"
+#~ msgstr "FAQ"
+
+#~ msgid "Homepage"
+#~ msgstr "Strona domowa"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Zacznij od pierwszych i ostatnich części"
+
+#~ msgid "Level"
+#~ msgstr "Poziom"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Stare hasło jest niepoprawne"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Dodaj jako wstrzymany"
+
+#~ msgid "Inbound"
+#~ msgstr "PrzychodzÄ…ce"
+
+#~ msgid "Outbound"
+#~ msgstr "WychodzÄ…ce"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = bez limitu"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Aktywne wtyczki"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Bez limitu"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Połącz z demonem"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Filtruj przy użyciu słowa kluczowego"
+
+#~ msgid "Keyword"
+#~ msgstr "SÅ‚owo kluczowe"
+
+#~ msgid "Move torrent"
+#~ msgstr "PrzenieÅ› torrent"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Brak połączenia z demonem"
+
+#~ msgid "Restart"
+#~ msgstr "Uruchom ponownie"
+
+#~ msgid "Seeding time"
+#~ msgstr "Czas rozsiewania"
+
+#~ msgid "no uri"
+#~ msgstr "brak identyfikatora URI"
+
+#~ msgid "Update"
+#~ msgstr "Aktualizuj"
+
+#~ msgid "Url"
+#~ msgstr "Adres URL"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Maksymalna prędkość pobierania"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Wybierz adres URL lub torrent, a nie oba."
+
+#~ msgid "Handshake"
+#~ msgstr "Uzgadnianie"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Maksymalna liczba prób połączeń na sekundę"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr ""
+#~ "Restartuj demon oraz interfejs użytkownika WWW po zmianie tych ustawień"
+
+#~ msgid "Button style"
+#~ msgstr "Styl przycisku"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Nowe hasło nie jest zgodne z jego potwierdzeniem"
+
+#~ msgid "Error in Path."
+#~ msgstr "Błąd w ścieżce."
+
+#~ msgid "Cache templates"
+#~ msgstr "Buforuj szablony"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Zmiany zostały zapisane"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Popraw powyższe błędy i spróbuj ponownie"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Maksymalna liczba znaków w wartości: %(max)d (bieżąca liczba znaków: "
+#~ "%(length)d)."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Minimalna liczba znaków w wartości: %(min)d (bieżąca liczba znaków: "
+#~ "%(length)d)."
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Wybierz poprawną opcję. Wybrana opcja nie jest jedną z dostępnych opcji."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Wybierz poprawną opcję. Opcja %s nie jest jedną z dostępnych opcji."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Wprowadź poprawną wartość."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Wartość musi być większa lub równa %s."
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Wprowadź listę wartości."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Wartość musi być mniejsza lub równa %s."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "Nie wprowadzono żadnego pliku. Sprawdź typ kodowania w formularzu."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Nie wprowadzono żadnego pliku."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Wprowadź poprawną godzinę."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Wprowadź poprawną datę/godzinę."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Maksymalna liczba cyfr to %s."
+
+#~ msgid "Enter a number."
+#~ msgstr "Wprowadź liczbę."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Maksymalna liczba cyfr po przecinku to %s"
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr "Maksymalna liczba cyfr przed przecinkiem to %s."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr ""
+#~ "Wybierz poprawną opcję. Opcja %(value)s nie jest jedną z dostępnych opcji."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Wprowadź poprawny adres URL."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Wprowadzony plik jest pusty."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Wprowadź poprawny adres IPv4."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Prześlij poprawny obraz. Przesłany plik nie jest obrazem lub jest uszkodzony."
+
+#~ msgid "Recheck"
+#~ msgstr "Sprawdź ponownie"
+
+#~ msgid "Queue Top"
+#~ msgstr "PrzenieÅ› na poczÄ…tek kolejki"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "PrzenieÅ› na koniec kolejki"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Liczba plików: %i"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Ta wiadomość e-mail to powiadomienie o zakończeniu pobierania torrenta %s "
+#~ "(liczba plików: %i) przez program Deluge.\n"
+#~ "Aby wyłączyć te alerty, należy wyłączyć powiadamianie za pomocą poczty "
+#~ "elektronicznej w preferencjach programu Deluge.\n"
+#~ "\n"
+#~ "Pozdrowienia,\n"
+#~ "Deluge"
+
+#~ msgid "Connected to"
+#~ msgstr "Połączony z"
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Podany URL jest niepoprawny."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "Program ten stanowi wolne oprogramowanie; możesz go rozprowadzać i/lub "
+#~ "modyfikować na zasadach Powszechnej Licencji Publicznej GNU w wersji 3 lub "
+#~ "(jeśli wolisz) jakiejkolwiek następnej wersji. Niniejszy program "
+#~ "rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ "
+#~ "JAKIEJKOLWIEK GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ "
+#~ "albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. W celu uzyskania bliższych "
+#~ "informacji zapoznaj się z treścią licencji, której kopia powinna być "
+#~ "dostarczona razem z programem. Jeśli nie jest, odwiedź "
+#~ "<http://www.gnu.org/licenses>."
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Limit czasu (w sekundach)"
+
+#~ msgid "Admin"
+#~ msgstr "Administracja"
+
+#~ msgid "Stop"
+#~ msgstr "Zatrzymaj"
+
+#~ msgid "Start"
+#~ msgstr "Uruchom"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Login Deluge"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Automatyczne Dodawanie włączone"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Ten katalog nie istnieje."
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Automatycznie dodaj katalog"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Konfigurator Ustawień Deluge"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "RozsiewajÄ…cy/Uczestnicy"
+
+#~ msgid "Show trackers"
+#~ msgstr "Pokaż trackery"
+
+#~ msgid "no label"
+#~ msgstr "brak etykiety"
+
+#~ msgid "All Finished!"
+#~ msgstr "Wszystko zakończone!"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr "Ten kreator pozwoli Ci dopasować Deluge do twoich potrzeb."
+
+#~ msgid "Graphs"
+#~ msgstr "Wykresy"
+
+#~ msgid "Test config value:"
+#~ msgstr "Sprawdź wartość ustawienia:"
+
+#~ msgid "Test config value"
+#~ msgstr "Sprawdź wartość ustawienia"
+
+#~ msgid "Stats"
+#~ msgstr "Statystyki"
+
+#~ msgid "State"
+#~ msgstr "Stan"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Pokaż wyszukiwanie według słów kluczowych"
+
+#~ msgid "Sidebar"
+#~ msgstr "Panel boczny"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Pokaż panel boczny"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Maksymalna prędkość wysyłania (Kib/s)"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Liczba prób pobierania"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Sprawdzaj raz na (liczba dni)"
+
+#~ msgid "BlockList"
+#~ msgstr "Czarna lista"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Pobieranie %.2f%%"
+
+#~ msgid "Refresh status"
+#~ msgstr "Odśwież stan"
+
+#~ msgid "Import Now"
+#~ msgstr "Importuj teraz"
+
+#~ msgid "Global"
+#~ msgstr "Globalne"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Zapisuj pliki .torrent w"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Maksymalna liczba połączeń półotwartych"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Importuj przy starcie demona"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Zablokowane zakresy: %s"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Aktywne torrenty (wysyłanie)"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Aktywne torrenty (pobieranie)"
+
+#~ msgid "Either"
+#~ msgstr "Obydwa"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Automatyczne odświeżanie (sekundy)"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Dodaj torrenty</b></big>"
+
+#~ msgid "From Session"
+#~ msgstr "Z sesji"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-połącz"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Na torrent"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Maksymalna liczba połączeń wychodzących"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Wlicz narzut protokołu IP"
+
+#~ msgid "Reannounce"
+#~ msgstr "Ponów Aktualizację"
+
+#~ msgid "Next Announce"
+#~ msgstr "Następna aktualizacja"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Przyrostowy przydział miejsca"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "to jeszcze do niczego nie służy..\n"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 10"
+#~ msgstr "strona 10"
+
+#~ msgid "page 11"
+#~ msgstr "strona 11"
+
+#~ msgid "page 12"
+#~ msgstr "strona 12"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Błąd przy zmianie ustawień etykiety"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "maks_liczba_połączeń_wychodzących"
+
+#~ msgid "max_connections"
+#~ msgstr "maks_liczba_połączeń"
+
+#~ msgid "apply_max"
+#~ msgstr "użyj_maks_ustawień"
+
+#~ msgid "max_download_speed"
+#~ msgstr "maks_prędkość_pobierania"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "maks_prędkość_wysyłania"
+
+#~ msgid "apply_queue"
+#~ msgstr "użyj_kolejkowania"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "zatrzymaj_przy_współczynniku"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "czy_jest_automatycznie_zarzÄ…dzany"
+
+#~ msgid "stop_ratio"
+#~ msgstr "współczynnik_zatrzymania"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "automatyczne_dodawanie_trackerów"
+
+#~ msgid "auto_add"
+#~ msgstr "automatyczne_dodawanie"
+
+#~ msgid "move_completed_path"
+#~ msgstr "ścieżka_dla_przeniesienia_zakończonych"
+
+#~ msgid "move_completed"
+#~ msgstr "przenieś_zakończone"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "zastosuj_przeniesienie_zakończonych"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "usuń_przy_współczynniku"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr ""
+#~ "Żeby zmiany zostały wrowadzone zrestartuj ręcznie interfejs WWW użytkownika."
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Klucz nie został znaleziony w '%s'"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Certyfikat nie został znaleziony w '%s'"
+
+#~ msgid "Active time"
+#~ msgstr "Czas aktywności"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... i skasuj wszystkie pliki"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... i skasuj pobrane pliki"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... i skasuj plik torrent"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge: lista torrentów"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "Limit prędkości Pob./Wys."
+
+#~ msgid "Cancel"
+#~ msgstr "Anuluj"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Limit połączeń"
+
+#~ msgid "Disk Space"
+#~ msgstr "Miejsce na dysku"
+
+#~ msgid "Do not download"
+#~ msgstr "Nie pobieraj"
+
+#~ msgid "Force Recheck"
+#~ msgstr "WymuÅ› sprawdzanie"
+
+#~ msgid "Label torrent"
+#~ msgstr "Przypisz etykietÄ™ do torrenta"
+
+#~ msgid "Highest priority"
+#~ msgstr "Najwyższy priorytet"
+
+#~ msgid "From Url"
+#~ msgstr "Z URL"
+
+#~ msgid "High priority"
+#~ msgstr "Wysoki priorytet"
+
+#~ msgid "Normal priority"
+#~ msgstr "Normalny priorytet"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Brak przychodzących połączeń"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Seed rank"
+#~ msgstr "Pozycja na liście rozsiewających"
+
+#~ msgid "Search"
+#~ msgstr "Szukaj"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "Limit prędkości Wys,/Pob."
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Limit dla połączeń wychodzących"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edytuj"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Praca w toku."
+
+#~ msgid "True"
+#~ msgstr "Tak"
+
+#~ msgid "False"
+#~ msgstr "Nie"
+
+#~ msgid "Force Download"
+#~ msgstr "WymuÅ› pobranie"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Wyświetl puste kategorie"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s nie jest poprawnym adresem URL."
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Nie połączono.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Nie udało się pobrać: %s"
+
+#~ msgid "Downloading.."
+#~ msgstr "Pobieranie..."
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Wpisz swoje hasło aby kontynuować</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge jest chronione hasłem!</big></b>"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Współczynnik udostępniania (ratio)"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "Ten program jest wolnym oprogramowaniem; możesz go rozprowadzać dalej i / "
+#~ "lub modyfikować na warunkach GNU General Public License opublikowanej przez "
+#~ "Free Software Foundation w wersji 3 tej Licencji lub (według twojego wyboru) "
+#~ "którejś z późniejszych wersji. Ten program jest rozpowszechniany w nadziei, "
+#~ "że będzie użyteczny, ale BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej "
+#~ "gwarancji PRZYDATNOÅšCI HANDLOWEJ albo PRZYDATNOÅšCI DO OKREÅšLONEGO CELU. "
+#~ "Zobacz licencję GNU General Public License więcej szczegółów. Powinieneś "
+#~ "otrzymać kopię GNU General Public License wraz z tym programem, jeśli nie, "
+#~ "patrz <http://www.gnu.org/licenses>. Ponadto, jako wyjÄ…tek specjalny, "
+#~ "właścicieli praw autorskich wydaje pozwolenie na linkowanie kodu części tego "
+#~ "programu z biblioteki OpenSSL. Musisz przestrzegać licencji GNU General "
+#~ "Public License w wszystkich aspektach wykorzystania kodu, innym niż OpenSSL. "
+#~ "W przypadku modyfikacji pliku (ów) z wyjątkiem tego, możesz rozszerzyć ten "
+#~ "wyjątek o Twoją wersję tego pliku (s), ale nie są do tego zobowiązani. Jeśli "
+#~ "nie chcesz, aby to zrobić, usuń niniejsze oświadczenie wyjątek od wersji. "
+#~ "Jeśli usuniesz ten oświadczenie wyjątek od wszystkich plików źródłowych w "
+#~ "programie, a następnie usunąć ją tutaj."
diff --git a/deluge/i18n/pms.po b/deluge/i18n/pms.po
new file mode 100644
index 0000000..001dce1
--- /dev/null
+++ b/deluge/i18n/pms.po
@@ -0,0 +1,3715 @@
+# Piemontese translation for deluge
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-04-19 22:37+0000\n"
+"Last-Translator: Triton <Unknown>\n"
+"Language-Team: Piemontese <pms@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "Clear"
+#~ msgstr "Pulida"
diff --git a/deluge/i18n/pt.po b/deluge/i18n/pt.po
new file mode 100644
index 0000000..81836bc
--- /dev/null
+++ b/deluge/i18n/pt.po
@@ -0,0 +1,6147 @@
+# Portuguese translation for deluge
+# Copyright (c) 2019 Rosetta Contributors and Canonical Ltd 2019
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2019-01-31 20:22+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Portuguese <pt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr ""
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr ""
+
+#: deluge/common.py:410
+msgid "K"
+msgstr ""
+
+#: deluge/common.py:411
+msgid "M"
+msgstr ""
+
+#: deluge/common.py:412
+msgid "G"
+msgstr ""
+
+#: deluge/common.py:413
+msgid "T"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr ""
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr ""
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr ""
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
diff --git a/deluge/i18n/pt_BR.po b/deluge/i18n/pt_BR.po
new file mode 100644
index 0000000..51f0fb9
--- /dev/null
+++ b/deluge/i18n/pt_BR.po
@@ -0,0 +1,6147 @@
+# Brazilian Portuguese translation for deluge
+# Copyright (c) 2018 Rosetta Contributors and Canonical Ltd 2018
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2018-05-27 16:13+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr ""
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr ""
+
+#: deluge/common.py:410
+msgid "K"
+msgstr ""
+
+#: deluge/common.py:411
+msgid "M"
+msgstr ""
+
+#: deluge/common.py:412
+msgid "G"
+msgstr ""
+
+#: deluge/common.py:413
+msgid "T"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr ""
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr ""
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr ""
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
diff --git a/deluge/i18n/ro.po b/deluge/i18n/ro.po
new file mode 100644
index 0000000..810ccf0
--- /dev/null
+++ b/deluge/i18n/ro.po
@@ -0,0 +1,4744 @@
+# Romanian translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2011-04-23 14:56+0000\n"
+"Last-Translator: Mihai Capotă <mihai@mihaic.ro>\n"
+"Language-Team: Romanian <ro@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Selectaţi un dosar"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Viteză maximă de încărcare:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Viteză maximă de descărcare:"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Serviciu"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Viteza de descărcare"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Viteză de încărcare"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Disp"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Repornește"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Timpul de însămânțare</b>"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "ÃŽntreru_pe toate"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Viteză maximă de descărcare:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Viteză maximă de încărcare:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Adaugă în stare de _pauză"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Viteza maximă de încărcare pentru toate torrentele. Pentru nelimitat puneți -"
+"1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Viteza maxima de încărcare (KO/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Viteza maximă de descărcare pentru toate torrentele. Pentru nelimitat puneți "
+"-1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Viteza maxima de descărcare (KO/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Aşează noile torrente in capul cozii"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Număr de torrente care sunt la însămânțare"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Număr total de torrente care se descarcă:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Oprește însămânțarea când rația ajunge la:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Însămânțare<b/>"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "Viteză limită pentru _descărcare"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "Viteză _maximă de încărcare"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "Deschide d_osarul"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Viteză maximă de descărcare (KO/s)"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Viteză maximă de încărcare"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Viteză maximă de descărcare"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Viteză maximă de încărcare (KO/s)"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Selectați o opţiune validă. Acea alegere nu este una din cele disponibile."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Selectați o opţiune validă. %s nu este una din cele valabile."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr "Selectați o opţiune validă. %(value)s nu este una din cele valabile."
+
+#~ msgid "Homepage"
+#~ msgstr "Pagina acasă"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Opreşte însămânțarea când raţia ajunge la"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Adaugă automat dsarul"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Dosarul nu există."
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Eroare în opţiunile torrentului."
+
+#~ msgid "No data"
+#~ msgstr "Lipsă date"
+
+#~ msgid "Download Location"
+#~ msgstr "Locaţie descărcare"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Slot-uri maxime pentru încărcare"
+
+#~ msgid "Forced"
+#~ msgstr "Forţa"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Pe torrent"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Număr maxim de conexiuni pe jumătate deschise"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Număr maxim de încercări de conectare per secundă"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr ""
+#~ "Reporneşte serviciul şi interfaţa pentru browser după schimbarea acestor "
+#~ "configurații"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Număr torrente active"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Module active"
+
+#~ msgid "Button style"
+#~ msgstr "Stil butoane"
+
+#~ msgid "Error in Path."
+#~ msgstr "Eroare în cale."
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Corectați erorile de mai sus şi încercați din nou"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Opreşte însămânțarea la raţia de"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Introduceți o listă de valori."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Introduceți o valoare validă."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Asigurați-vă că valoarea are cel puțin %(min)d caractere (are lungimea de "
+#~ "%(length)d)."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Asigurați-vă că valoarea este mai mare sau egală cu %s."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Introducețo un timp valid."
+
+#~ msgid "Enter a number."
+#~ msgstr "Introduceți un număr."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Introduceţi un număr întreg."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Asigurați-vă că valoarea este mai mică sau egală cu %s."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr "Asigurați-vă ca nu sunt mai mult de %s cifre înainte de virgulă."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Introduceți o dată validă."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Asigurați-vă ca nu sunt mai mult de %s cifre in total."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Asigurați-vă că nu sunt mai mult de %s zecimale."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Introduceți un URL valid."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Încarcă o imagine acceptată. Fișierul încărcat ori nu este o imagine, ori "
+#~ "este una coruptă."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Niciun fișier nu a fost trimis."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "Niciun fișier nu a fost trimis. Verificați codarea."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Introduceți o adresă de e-mail validă."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Introduceți o adresă de tip IPv4 validă."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "URL-ul pare a fi o legătură ruptă."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Introduceți o dată și o ora valide."
+
+#~ msgid "Recheck"
+#~ msgstr "Reverifică"
+
+#~ msgid "Queue Top"
+#~ msgstr "Vârful cozii."
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Baza cozii."
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Nume gazdă:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Nume utilizator:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Parolă:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "De la:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Activat"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Setări"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Locaţie descărcări</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Maxim de conexiuni:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Sloturi maxime pentru încărcare:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Lățime de bandă</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Oprește torentul la rația de:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Şterge la raţia de"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Sus"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Jos"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Coadă</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Opțiuni"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Limită de descărcare:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Limită de încărcare:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Torente active:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Setări încete</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Etichetă invalidă, caracterele valide sunt:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Etichetă necompletată"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Eticheta deja există"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Etichetă necunoscută"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Torent necunoscut"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Etichetă"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "_Opțiuni etichetă"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "Ște_rge eticheta"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_Adaugă etichetă"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Opțiuni Etichete"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Opțiuni etichete</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Sloturi de încărcare:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Viteza de încărcare:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Viteză de descărcare:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Conexiuni:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Aplică setări maxime per torrent:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Maxim"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Administrat automat"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Aplică setările cozii:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Coadă"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Mută descărcările complete în:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Aplică setările de locaţie:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Locație"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(o linie per tracker)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Aplică eticheta automat:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Trackere"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Adaugă etichetă"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Adăugare etichetă</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Nume:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Folosiți bara laterală pentru a adăuga, edita și șterge etichete. </i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Etichete</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Extage în:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Crează sub-dosar cu numele torrentului"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Acestă opțiune va creea un sub-dosar folosind numele torrentului în dosarul "
+"de extragere selectat și va plasa fișierele extrase în acesta."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Setări generale</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Activează interfața web"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Activează SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Port de ascultat:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Setări</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Lista IP Emule (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer text (comprimat cu Zip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian text (necomprimat)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Leader nevalid"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Cod magic nevalid"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Versiune nevalidă"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Blocklist"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Zile"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Verfică dacă a apărut o nouă versiune la fiecare:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Importă lista neagră la pornire"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Descarcă lista neagră dacă e necesar și importă fișierul."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Verifică descărcările și importul"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Descarcă o nouă listă neagră și încarc-o."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Descărcare forțată și importare"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Lista neagră este actualizată"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Opțiuni</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Tip:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Data:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Dimensiune fișier:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Informații</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torent finalizat"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torent adăugat"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Execută"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Eveniment"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Comandă"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Adaugă comandă</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Comenzi</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Anunţ OK"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Anunţ trimis"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Avertisment"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Eroare"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Afganistan"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Insulele Aland"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Albania"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Algeria"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Samoa Americană"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antarctica"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antigua și Barbuda"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Argentina"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Armenia"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "Australia"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Austria"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Azerbaijan"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Bahamas"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bahrain"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "BangladeÈ™"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Belarus"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Belgia"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermuda"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Bolivia"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnia și Herțegovina"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Insula Bouvet"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brazilia"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Teritoriul Britanic din Oceanul Indian"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Brunei Darussalam"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Bulgaria"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Cambodia"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Camerun"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Canada"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Capul Verde"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Insulele Cayman"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Republica Centrafricană"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Ciad"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Chile"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "China"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Insula Crăciunului"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Insulele Cocos (Keeling)"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Columbia"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Comoros"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Congo"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Republica Democrată Congo"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Insulele Cook"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Coasta de FildeÈ™"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "Croația"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Cuba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Cipru"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Cehia"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Danemarca"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Djibouti"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominica"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Republica Dominicană"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Ecuador"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Egipt"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Guinea Ecuatorială"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Estonia"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Etiopia"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Insulele Falkland (Malvine)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Insulele Feroe"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fiji"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Finlanda"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Franța"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "Guiana Franceză"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "Polynesia Franceză"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "Teritoriile franceze de sud"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Georgia"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "Germania"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Marea Britanie"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Grecia"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Groenlanda"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadalupa"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Guineea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Guineea-Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guiana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Insulele Heard ÅŸi McDonald"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Vatican"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Ungaria"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Islanda"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "India"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonezia"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Republica Islamică Iran"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Irak"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Irlanda"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Insula Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Israel"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italia"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaica"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japonia"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Iordania"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazahstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenia"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Republica Democrată Poapulară Coreea"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Republica Coreea"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuwait"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kârgâzstan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Republica Populară Democrată Lao"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Letonia"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Liban"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesoto"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberia"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libia"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Lituania"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luxemburg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Macedonia, fosta Republică Iogoslavă"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagascar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malaesia"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldive"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Insulele Marshall"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinica"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauritania"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Mexic"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Micronesia, Statele Federale ale"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldova"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolia"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Muntenegru"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Maroc"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambic"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Mianmar"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Olanda"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Antilele Olandeze"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Noua Caledonie"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Noua Zeelandă"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Insula Norfolk"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Insulele Mariane de Nord"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norvegia"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Teritoriile Palestiniene, Ocupate"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua Noua Guinee"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguai"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filipine"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Polonia"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugalia"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Qatar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "România"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Federația Rusă"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Rwanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Sfântul Bartolomeu"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Sfânta Elena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Sfântul Cristofor și Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Sfânta Lucia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Insula Sfântul Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint Pierre și Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Sfântul Vincențiu și Grenadine"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "São Tomé și Príncipe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Arabia Saudită"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbia"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seychelles"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapore"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slovacia"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slovenia"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Insulele Solomon"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Africa de Sud"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Georgia de Sud și Insulele Sandwich de Sud"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Spania"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Suriname"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard și Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Elveţia"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Suedia"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Elveţia"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Siria"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Taiwan, Provincia Chineză"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tajikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzania, Republica Unită"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Tailanda"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Timor-Leste"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad și Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunisia"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Turcia"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Insulele Turks și Caicos"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ucraina"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Emiratele Arabe Unite"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Statele Unite"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Insulele de Coasta ale Statelor Unite"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Uruguai"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Uzbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Insulele Virgine Britanice"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Insulele Virgine (SUA)"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis și Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Sahara de Vest"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Yemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbave"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Deconectat"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Conectat"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Conectat"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Serviciul nu există"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Serviciul nu rulează"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Pornește serverul în PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Adresă"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Client"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Progres"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Viteză descărcare"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Viteză încărcare"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Torrent-ele sunt așezate în coadă"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrent-ul este așezat în coadă."
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Nelimitat"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Activat"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Alta..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Desc:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "ÃŽnc:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Desc"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "ÃŽnc"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Setează viteza maximă de descărcare"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Setează viteza maximă de încărcare"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torent terminat"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Acest e-mail are rolul de a vă informa că Deluge a terminat de descărcat "
+"%(name)s, care include %(num_files)i fișiere.\n"
+"Pentru a nu mai primi aceste avertizări, dezactivați notificarea prin e-mail "
+"din preferințele programului Deluge.\n"
+"\n"
+"Vă mulțumim,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Descărcări"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Reţea"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Lățime de bandă"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Interfață"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Altele"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Proxy"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Prestocare"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Module"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Modul"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Selectați modulul"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Ouă modul"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Nume fiÅŸier"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Dimensiune"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Fișier invalid"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Torent duplicat"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Nu puteți adăuga același torent de două ori."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Nu se poate stabili prioriatea fișierului!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Alege un fiÅŸier .torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "FiÅŸiere torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Toate fiÅŸierele"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "URL incorect"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Descărcarea a eșuat"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Strat"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Tracker"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Alegeți un fișier"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Alegeți un dosar"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Salvare fiÅŸier .torrent"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Neconectat"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Conexiuni"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Trafic protocol Download/Upload"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "Noduri DHT"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Nici o conexiune stabilită!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Setează numărul maxim de conexiuni"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torente"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Etichete"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Toate"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Se descarcă"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Partajare"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "În stare de pauză"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Se face verificarea"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "Pus în coadă"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Niciuna"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Fără etichetă"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Gazdă"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Nu s-a putut adăuga gazda"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Dezactivați modul clasic?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr "Se pare că procesul de serviciu Deluge (deluged) rulează deja."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Eroare la pornirea nucleului"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"A intervenit o eroare la pornirea nucleului, care este necesar pentru a rula "
+"Deluge în modul clasic.\n"
+"\n"
+"Pentru mai multe informații vedeți detaliile de mai jos."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"De vreme ce a intervenit o eroare la pornirea modului clasic doriți să "
+"continuați prin a-l dezactiva?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Eroare la pornirea serviciului"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"A intervenit o eroare la pornirea procesului de serviciu. Încercați să-l "
+"rulați folosind o consolă, pentru a vedea dacă intervine o eroare."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Activat"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Dezactivat"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Nelimitat"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Alege un director pentru a muta fișierele"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Setează numărul maxim de sloturi pentru încărcare"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Prioritate"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Detalii:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Nume"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Descărcat"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Uploadat"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Contribuitori"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Parteneri"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Timp estimat"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Raţie"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Adăugat"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Fișier"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Adaugă torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Creează torent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Editare"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "Manager de _conexiuni"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Vizualizare"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "Bară de unel_te"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Panou lateral"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Bară de _stare"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "_File"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Coloane"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "Bară _laterală"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Afișează acțiunile cu _zero sarcini"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Afişează _tracker-e"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Ajutor"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Întrebări frecvente"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Adaugă torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Adaugă torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Åžterge torrentul"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Elimină torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Pune torrentele selectate în starea de pauză"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Pauză"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Repornește torrentele selectate"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Mută torrent-ul în sus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Coada Sus"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Mută torrent-ul în jos"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Coada Jos"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Preferinţe"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Manager de conexiuni"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "Măr_ește toate"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "Nu _descărca"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "Prioritate _normală"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "Prioritate _ridicată"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Prioritate _maximă"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Auto managed</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Gradul de contribuție:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Timp activ</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Stare tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Disponibilitate:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Parteneri:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Contribuitori:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Porțiuni:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Timp rămas estimat:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Următoarea actualizare:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Rație:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>încărcat:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Descărcat:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Data adăugării:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Statut"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Comentarii:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># fișiere:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Mărime totală:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Nume:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Cale:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Status:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Detalii"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "Fișie_re"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Parteneri"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Mută transferurile complete în:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Privat"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Acordă prioritate primelor/ultimelor bucăți"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "Modifica Track_ere"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Opțiuni"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Ștergere torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>Sigur doriți să ștergeți torrent-ul selectat?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>Fișierul .torrent asociat va fi șters!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Datele descărcate vor fi șterse!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Șterge torrentul selectat"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Versiune nouă"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Versiune nouă disponibilă</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Versiune disponibilă</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Versiune curentă:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Nu mai arăta dialogul ăsta pe viitor"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "Du-te la pa_gina de web"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Adaugă un partener după IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Selectează tot"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Repornește torrentele selectate."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Repor_neÅŸte tot"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Adaugă torrente"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "Ște_rge"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torente</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "F_ișiere"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Complet"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Compact"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Alocare</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Primele/ultimele bucăți au prioritate"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Revenire la setările prestabilite"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Aplică pentru toate"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Adăugare URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Din URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Adăugare Infohash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Din Infohash</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Infohash:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Trackere:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Creează torent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Creeare torrent</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Fol_der"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "Ad_resă distantă"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>FiÅŸiere</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Autor:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Comentarii:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Informații"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Însămânţători web"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Marime Parti:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Marcați-l ca privat"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Adaugă acest torrent la sesiune"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Introduceţi adresa distantă"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Adresă distantă</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Cale:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Creează torent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Salvează fişierul .torrent ca"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Salvează fișierul .torrent </b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Torrente aflate în coadă"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Adaugă torrentele în coadă</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Adaugă automat torrentele la conectare"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "etichetă"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Adăugare partener"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Adăugare partener</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "gazdă:port"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Adaugă gazdă"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Manager de conexiuni</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Pornește demonul local"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Conectează-te automat la pornire către gazda selectată"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Pornește automat localhost-ul, dacă este necesar"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Nu arăta dialogul ăsta la pornire"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Descărcări</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Auto adăugare .torrente din:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Descarcă în:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Copiază fişiere .torrent în:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Dosare</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Folosește alocarea completă"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Alocarea completa aloca dinainte tot spatiul necesar torentului si previne "
+"fragmentarea discului."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Foloseste Alocarea Compacta"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Alocarea compacta aloca spatiu dupa cum este necesar"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Prima și ultima partea a torrent-ului au prioritate"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+"Mărește prioritatea primelor și ultimelor părți ale fișierelor din torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Adăugați torente puse pe pauză"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Rețea</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Folosește porturi aleatoare"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge va alege sa foloseasca un port diferit de fiecare data."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Port Acvtiv:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Către:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Verifica Portul Activ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "Porturi de sosire"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "Porturi de ieșire"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Introdu adresa IP a interfaței pentru a asculta conexiunile bittorent ce "
+"sosesc. Lasă această căsuță goală dacă vrei să folosești adresa implicită."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>Interfață</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"TOS-ul setat în header-ul IP al fiecărui pachet trimis către parteneri "
+"(inclusivi contribuitorii). Se așteaptă o valoare hexazecimală."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "Limita TOS Byte a partenerului:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "Protocolul de alocare a porturilor NAT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Schimb între parteneri"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+"Local Service Discovery ajută la găsirea partenerilor din rețeaua locală."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+"Tabela hash distribuita ar putea imbunatati numarul de conexiuni active."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Optiuni suplimentare de retea</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "La Primire"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Nivel:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Forțată\n"
+"Activată\n"
+"Dezactivată"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Handshake\n"
+"Intregul Flux\n"
+"Oricare"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "La expediere"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Criptează întreaga bandă"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Criptare</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Limită de bandă</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Numărul maxim de încercări de conectare pe secundă:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Număr maxim de conexiuni semi-deschise:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "Numărul maxim de conexiuni permise. Setați -1 pentru nelimitat."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Numărul maxim de conexiuni:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Numărul maxim de sloturi de încărcare pentru toate torentele. Stabiliți -1 "
+"pentru nelimitat."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Numărul maxim de sloturi pentru încărcare:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Ignoră limitele existente în rețeaua locală."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "Surplus limită rată IP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Dacă este activat, surplusul estimat TCP/IP este ignorat de limitarea "
+"lățimii de banda, pentru a evita depășirea traficului total"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Uitilizarea globală a lățimii de bandă</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"Numărul maxim de sloturi de încărcare per torent. Setați -1 pentru "
+"nelimitate."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "Numărul maxim de conexiuni per torent. Setați -1 pentru nelimitat."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Utilizarea lățimii de bandă per torrent</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Interfață</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Activează"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Modul clasic va ascunde marea majoritate a funționalității demonului și va "
+"face ca Deluge să pară a fi o singură aplicație. Folosiți această opțiune "
+"dacă nu doriți să profitați de folosirea lui Deluge ca și demon. Trebuie să "
+"reporniți Deluge pentru ca această setare să aibă efect."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Modul clasic</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Afișează viteza sesiunii în bara de titlu"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Fereastra principală</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Afișează întotdeauna"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Adaugă dialogul în prim plan"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Dialog de adăugare de torrente</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Activează iconiţa din zona de notificare"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Minimizează în zona de notificare la închidere"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Pornește în zona de notificare"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Protejează cu parolă zona de notificare"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Zona de notificare</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Altele</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Avertizează-mă când apar noi versiuni"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge va verifica serverele și vă va informa dacă a fost lansată o nouă "
+"versiune"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Actualizări</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Ajutați-ne să îmbunătățim Deluge trimițându-ne informații despre versiunea "
+"PyGTK-ulu, sistemului de operare și procesorului pe care îl folosiți. "
+"Absolut nici o informație suplimentară nu va fi trimisă."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Da, vreau să trimit statistici anonime"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Informații despre sistem</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Locație:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Dacă Deluge nu poate găsi fișierul bazei de date la această locație va "
+"reveni la utilizarea DNS pentru a rezolva partenerii de conexiune ai țării."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>Baza de Date GeoIP</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Asociază legăturile de tip Magnet cu programul Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Demon</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Portul demonului:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Port</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Permite conexiuni din altă locaţie"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Conexiuni</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Verifică periodic dacă au apărut noi versiuni"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Altele</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Coadă</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Număr torrente active"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Nu lua în considerare și torrentele cu viteze mici"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Torrente active</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Limită de rație"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Timp de stat la seed"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Timp de contribuire (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Șterge torentul când rația ajunge la"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Proxy</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Gazdă:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Nici unul\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv6 cu Autentificare\n"
+"HTTP\n"
+"HTTP cu autentificare"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Partener</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Însămânţare web</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Tracker</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Prestocare</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Mărimea de prestocare (blocuri de 16 KiB):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Numărul de secunde de la ultima piesă prestocată în memoria temporară, până "
+"în momentul în care este forțat curățată de pe disk. Valoarea implicită este "
+"60 de secunde."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Prestocarea expiră în (secunde):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"Numărul total de blocuri de 16 KiB scrise pe disk de la începutul sesiunii."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Blocuri scrise:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr "Numărul total de operațiuni de scriere de când a început sesiunea."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Scrieri:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"Rația (blocuri_scrise - scrieri) / blocuri_scrise reprezintă numărul de "
+"operațiuni de scriere salvate din totalul operațiunilor de scriere, ex: un "
+"fel de raport al folosirii spațiului de prestocare pentru scriere."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "Rația spațiului de prestocare pentru scriere:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Scrie</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Numărul de blocuri ce au fost cerute de către motorul bittorent (de la "
+"parteneri), care au fost servite de disk sau de spațiul de prestocare."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Blocuri citite:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+"Numărul de blocuri care au fost servite de către spațiul de prestocare."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "Rezultatul blocurilo citite:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "Rația spațiului de prestocare pentru citire."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "Rația spațiului de prestocare pentru citire:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr "Numărul total de operațiuni de citire de când a început sesiunea."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Citiri:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Citește</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Numărul de blocuri de 16 KiB care se află momentan în spațiul de prestocare. "
+"Acestea includ și blocurile alocate pentru scris și cele pentru citit."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Mărime spațiu de prestocare:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Dimensiunea spațiului de prestocare pentru citit:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Dimensiune</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Statut</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Module</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Versiune:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Pagină web:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Email-ul autorului:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Instalează module"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Rescanează modulele"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_Caută mai multe module"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "A_fișează Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Repornește toate"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Ieși și închide demonul"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Repor_nește"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Opț_iuni"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "Coa_dă"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "Act_ualizare Tracker"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "Ste_rge Torent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "Verifică _forțat"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "Mută încărcătur_a"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "Limită _conexiuni"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Limită _sloturi upload"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Administrat automat"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Eliminaţi torentul selectat?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Dacă eliminaţi datele, acestea vor fi pierdute permanent."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Modifica Trackerele"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Modifică trackere</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Adaugă tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Adăugare tracker-e</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Modifică tracker:"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Modifică tracker</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Şterge cu tot cu _Datele descărcate"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Eliminare _torent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Mută încărcătura"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Mută încărcătura</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Destinație:"
+
+#~ msgid "Details"
+#~ msgstr "Detalii"
+
+#~ msgid "Files"
+#~ msgstr "FiÅŸiere"
+
+#~ msgid "Upload"
+#~ msgstr "Incarcare"
+
+#~ msgid "General"
+#~ msgstr "General"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Număr maxim de conexiuni"
+
+#~ msgid "Unknown"
+#~ msgstr "Nescunoscut"
+
+#~ msgid "Availability"
+#~ msgstr "Disponibilitate"
+
+#~ msgid "Add"
+#~ msgstr "Adaugă"
+
+#~ msgid "Remove"
+#~ msgstr "Elimină"
+
+#~ msgid "Select All"
+#~ msgstr "Selectează tot"
+
+#~ msgid "Speed"
+#~ msgstr "Vitezã"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "Username"
+#~ msgstr "Nume"
+
+#~ msgid "Password"
+#~ msgstr "Parolă"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge este incuiat"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge este protejat prin parola.\n"
+#~ "Pentru a afisa fereastra Deluge va rugam sa introduceti parola"
+
+#~ msgid "Filters"
+#~ msgstr "Filtre"
+
+#~ msgid "Graph"
+#~ msgstr "Grafic"
+
+#~ msgid "From"
+#~ msgstr "De la"
+
+#~ msgid "New Password"
+#~ msgstr "Parola noua"
+
+#~ msgid "Template"
+#~ msgstr "Sablon"
+
+#~ msgid "About"
+#~ msgstr "Despre"
+
+#~ msgid "Config"
+#~ msgstr "Configureaza"
+
+#~ msgid "Logout"
+#~ msgstr "Deconectare"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Parola e gresita, incearca din nou"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Uploadeaza torrent"
+
+#~ msgid "Torrent list"
+#~ msgstr "Lista torrentelor"
+
+#~ msgid "Type"
+#~ msgstr "Tip"
+
+#~ msgid "Disabled"
+#~ msgstr "Dezactivat"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Vitezã:</b>"
+
+#~ msgid "translate something"
+#~ msgstr "tradu ceva"
+
+#~ msgid "Image Only"
+#~ msgstr "Doar imagine"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Alege un URL sau un torrent, nu amandoua"
+
+#~ msgid "Text Only"
+#~ msgstr "Doar text"
+
+#~ msgid "Text and image"
+#~ msgstr "Text si imagine"
+
+#~ msgid "Disable"
+#~ msgstr "Dezactivează"
+
+#~ msgid "Start"
+#~ msgstr "Start"
+
+#~ msgid "Total Size"
+#~ msgstr "Mărimea totală"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "seconds"
+#~ msgstr "secunde"
+
+#~ msgid "Clear"
+#~ msgstr "Șterge"
+
+#~ msgid "Ava"
+#~ msgstr "Ava"
+
+#~ msgid "Submit"
+#~ msgstr "Trimite"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Stare tracker"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Auto-reactualizare:"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "reactualizarea trebuie să fie > 0"
+
+#~ msgid "Reannounce"
+#~ msgstr "Reanunta"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Seteaza pauza"
+
+#~ msgid "# Of Files"
+#~ msgstr "Numărul de fişiere"
+
+#~ msgid "Admin"
+#~ msgstr "Administrator"
+
+#~ msgid "Connect"
+#~ msgstr "Connectează"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : Lista de torrente"
+
+#~ msgid "Connected to"
+#~ msgstr "Conectat la"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Autentificare deluge"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Şterge fişierele descărcate"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Åžterge fiÅŸierul .torrent"
+
+#~ msgid "File"
+#~ msgstr "FiÅŸier"
+
+#~ msgid "Download"
+#~ msgstr "Descarcă"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Filtrează după un cuvât cheie"
+
+#~ msgid "False"
+#~ msgstr "Fals"
+
+#~ msgid "Eta"
+#~ msgstr "Timp estimat"
+
+#~ msgid "Move"
+#~ msgstr "Mută"
+
+#~ msgid "Login"
+#~ msgstr "Autentificare"
+
+#~ msgid "Keyword"
+#~ msgstr "Cuvânt cheie"
+
+#~ msgid "Label torrent"
+#~ msgstr "Etichetă torrent"
+
+#~ msgid "Move torrent"
+#~ msgstr "Mută torrentul"
+
+#~ msgid "Pieces"
+#~ msgstr "Bucăți"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Neconectat la niciun daemon"
+
+#~ msgid "Next Announce"
+#~ msgstr "Următorul anunţ"
+
+#~ msgid "Restart"
+#~ msgstr "ReporneÅŸte"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Reîmprospătarea paginii la fiecare:"
+
+#~ msgid "Resume all"
+#~ msgstr "ReporneÅŸte toate"
+
+#~ msgid "Queue Position"
+#~ msgstr "Poziţie în Coadă"
+
+#~ msgid "Seed rank"
+#~ msgstr "Rangul surselor"
+
+#~ msgid "Seeding time"
+#~ msgstr "Timp de însămânţare"
+
+#~ msgid "Set"
+#~ msgstr "Aplică"
+
+#~ msgid "Save"
+#~ msgstr "Salvează"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Raţie partajare"
+
+#~ msgid "Active time"
+#~ msgstr "Timp activ"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "Conectare Daemon"
+
+#~ msgid "Update"
+#~ msgstr "Actualizează"
+
+#~ msgid "Stop"
+#~ msgstr "OpreÅŸte"
+
+#~ msgid "True"
+#~ msgstr "Adevărat"
+
+#~ msgid "no uri"
+#~ msgstr "niciun uri"
+
+#~ msgid "Pause all"
+#~ msgstr "Pauză totală"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Adaugă in stare de pauză"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Alocare compactă"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "Prima şi ultima bucată au prioritate"
+
+#~ msgid "To"
+#~ msgstr "Către"
+
+#~ msgid "Random"
+#~ msgstr "Aleator"
+
+#~ msgid "Ports"
+#~ msgstr "Porturi"
+
+#~ msgid "Extra's"
+#~ msgstr "Extraopţiuni"
+
+#~ msgid "Handshake"
+#~ msgstr "Conectare"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "DHT"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Schimb-parteneri"
+
+#~ msgid "Encryption"
+#~ msgstr "Criptare"
+
+#~ msgid "Either"
+#~ msgstr "Oricare"
+
+#~ msgid "Outbound"
+#~ msgstr "IeÅŸire"
+
+#~ msgid "Level"
+#~ msgstr "Nivel"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Nelimitat"
+
+#~ msgid "Inbound"
+#~ msgstr "Intrare"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "Activează adăugarea automată"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Salvează fişierele .torrent în"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Salvează toate descărcările în"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Număr torrente în stare de partajare"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Număr torrente în stare de descărcare"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = nelimitat"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Şterge torrentul când raţia a ajuns la"
+
+#~ msgid "Cache templates"
+#~ msgstr "Salvează şabloanele în cache"
+
+#~ msgid "Current Password"
+#~ msgstr "Parolă curentă"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Parolă nouă (confirmare)"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Aceste modificări au fost salvate"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Vechea parolă nu este validă"
+
+#~ msgid "Move To"
+#~ msgstr "Mută în"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Noua parolă introdusă greşit"
+
+#~ msgid "No"
+#~ msgstr "Nu"
+
+#~ msgid "Yes"
+#~ msgstr "Da"
+
+#~ msgid "This field is required."
+#~ msgstr "Acest câmp este obligatoriu."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Fișierul trimis este gol."
+
+#~ msgid "Statistics"
+#~ msgstr "Statistici"
+
+#~ msgid "Delete"
+#~ msgstr "Șterge"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torrentu-ul a trecut de rația necesară opririi."
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "Acest program este un produs software gratuit; poate fi redistribuit și/sau "
+#~ "modificat in conformitate cu Licența Publică GNU publicată de Free Software "
+#~ "Foundation; sau în conformitate cu versiunea a 3-a a licenței sau - la "
+#~ "alegerea dvs - orice versiune porterioară. Acest program este distribuit cu "
+#~ "speranța că va fi folositor, dar FĂRĂ NICI O GARANȚIE. Pentru mai multe "
+#~ "detalii, vedeți Licența Generală GNU. Ar fi trebuit să primiți o copie a "
+#~ "licenței respective odată cu programul acesta. Dacă nu, accesați "
+#~ "<http://www.gnu.org/licenses>."
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Verifică la (zile)"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Pauză (secunde)"
+
+#~ msgid "BlockList"
+#~ msgstr "Lista cu utilizatori blocați"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Se descarcă %.2f%%"
+
+#~ msgid "Import Now"
+#~ msgstr "Importează acum"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Număr de încercări de download"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Importă la pornirea demonului"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Regiuni blocate: %s"
+
+#~ msgid "Inactive"
+#~ msgstr "Inactiv"
+
+#~ msgid "Refresh status"
+#~ msgstr "Actualizează stare"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Se importează %s"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "page 6"
+#~ msgstr "pagina 6"
+
+#~ msgid "page 7"
+#~ msgstr "pagina 7"
+
+#~ msgid "page 8"
+#~ msgstr "pagina 8"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Adaugă torrente</b></big>"
+
+#~ msgid "From Session"
+#~ msgstr "Din sesiune"
+
+#~ msgid "FAQ"
+#~ msgstr "Întrebări frecvente"
+
+#~ msgid "Community"
+#~ msgstr "Comunitate"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Asigurați-vă ca valoarea aceasta are cel mult %(max)d caractere (are "
+#~ "lungimea de %(length)d)."
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Incluzând %i fișire"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... și sterge Toate fișierele"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... și sterge fișierul Torrent"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... și șterge fișierele Descărcate"
+
+#~ msgid "Normal priority"
+#~ msgstr "Prioritate normală"
+
+#~ msgid "Search"
+#~ msgstr "Caută"
+
+#~ msgid "page 10"
+#~ msgstr "pagina 10"
+
+#~ msgid "page 11"
+#~ msgstr "pagina 11"
+
+#~ msgid "page 12"
+#~ msgstr "pagina 12"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Acţiune în progres.."
+
+#~ msgid "no label"
+#~ msgstr "nicio etichetă"
+
+#~ msgid "State"
+#~ msgstr "Stare"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Acest email a fost trimis pentru a vă informa că Deluge a terminat de "
+#~ "descărcat %s, care include %i fişiere.\n"
+#~ "Pentru a opri recepţionarea de alerte, doar dezactivaţi opţiunea de "
+#~ "notificări prin email din setările Deluge.\n"
+#~ "\n"
+#~ "Mulţumim,\n"
+#~ "Deluge"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Împrospătare automată (secunde)"
+
+#~ msgid "All Finished!"
+#~ msgstr "Descărcări terminate"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Vrăjitor instalare Deluge"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr "Vrăjitorul vă va ajuta să setați Deluge așa cum doriți"
+
+#~ msgid "Graphs"
+#~ msgstr "Grafice"
+
+#~ msgid "Test config value:"
+#~ msgstr "Valoare test configurare"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "sloturi_macime_incarcare"
+
+#~ msgid "max_connections"
+#~ msgstr "conexiuni_maximie"
+
+#~ msgid "apply_queue"
+#~ msgstr "aplica_cerere"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "este_auto_administrat"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "oprire_la_rata"
+
+#~ msgid "stop_ratio"
+#~ msgstr "oprire_rata"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "viteza_maxima_incarcare"
+
+#~ msgid "max_download_speed"
+#~ msgstr "viteza_maxima_descarcare"
+
+#~ msgid "apply_max"
+#~ msgstr "aplica_max"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Eroare la setarea opțiunilor de etichetă"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "sterge_la_rata"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "aplicare_mutare_incheiata"
+
+#~ msgid "move_completed"
+#~ msgstr "mutare_incheiata"
+
+#~ msgid "move_completed_path"
+#~ msgstr "cale_mutare_completa"
+
+#~ msgid "Test config value"
+#~ msgstr "Valoare test configurare"
+
+#~ msgid "Stats"
+#~ msgstr "Statistici"
+
+#~ msgid "Force Download"
+#~ msgstr "Forțează descărcarea"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "adaugare_automata_trackere"
+
+#~ msgid "auto_add"
+#~ msgstr "adaugare_automata"
+
+#~ msgid "Show trackers"
+#~ msgstr "Arată trackere"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Arată căutare cuvinte cheie"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Arată bara laterală"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Repornire manuală a interfeței web pentru aplicarea modificărilor."
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "Nu s-a găsit certificatul la '%s'"
+
+#~ msgid "Sidebar"
+#~ msgstr "Bară laterală"
+
+#~ msgid "Cancel"
+#~ msgstr "Anulează"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Limită conexiune"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "Limită descărcare/încărcare"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Nu există coenexiuni de intrare"
+
+#~ msgid "Disk Space"
+#~ msgstr "Spațiu pe disc"
+
+#~ msgid "Do not download"
+#~ msgstr "Nu descărca"
+
+#~ msgid "Highest priority"
+#~ msgstr "Prioritate maximă"
+
+#~ msgid "High priority"
+#~ msgstr "Prioritate ridicată"
+
+#~ msgid "From Url"
+#~ msgstr "De la adresa URL"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Forțare reverificare"
+
+#~ msgid "Ok"
+#~ msgstr "OK"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "Limită viteză incărcare/descărcare"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Limită sloturi încărcare"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Actualizare tracker"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Nu este conectat.."
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s nu este un URL valabil."
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge este protejat cu parolă!</big></b>"
+
+#~ msgid "Downloading.."
+#~ msgstr "Descărcare.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Nu s-a putut descărca : %s"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Introduceți parola pentru a continua</i>"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "acesta nu face încă nimic..\n"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "Acest program este un software gratuit; îl poți redistribui și/sau modifica "
+#~ "în concordanță cu termenii licenței GNU General Public License cum a fost "
+#~ "publicată de Free Software Foundation; fie versiunea 3 a Licenței, sau (după "
+#~ "opinia ta) oricare dintre versiunile viitoare. Acest program este distribuit "
+#~ "în speranța că va fi folositor, dar FĂRĂ NICI O GARANȚIE; fără garanția "
+#~ "implicită a COMERCIALIZĂRII sau a POTRIVIRII PENTRU UN ANUMIT SCOP. Consultă "
+#~ "GNU General Public License pentru mai multe detalii. ÃŽn mod normal trebuie "
+#~ "să fi primit o copie a GNU General Public License împreună cu acest program; "
+#~ "dacă nu, verifică <http://www.gnu.org/licenses>. În continuare, ca o "
+#~ "excepție specială, deținătorii dreptului de autor vă dă permisiunea de a "
+#~ "conecta codul sursă a unor părți din acest program cu librăria OpenSSL. "
+#~ "Trebuie să respecți GNU General Public License în toate privințele pentru "
+#~ "folosirea codului în alte scopuri în afară de OpenSSL. Dacă modifici "
+#~ "fișier(e), cu această excepție poți extinde excepția pentru versiunea ta de "
+#~ "fișier(e), dar nu ești obligat să faci asta. Dacă nu dorești să procedezi "
+#~ "așa, șterge această afirmație a excepției din versiunea ta. Dacă ștergi "
+#~ "afirmația de excepție din toate fișierele sursă ale acestui program, atunci "
+#~ "șterge-o și de aici."
+
+#~ msgid "Other.."
+#~ msgstr "Alta..."
+
+#~ msgid "_Quit"
+#~ msgstr "_Ieșire"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "Nu s-a găsit cheia la '%s'"
+
+#~ msgid "Show zero hits"
+#~ msgstr "Arată loviturile zero"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Depășire raport IP limită"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Surse/Parteneri"
diff --git a/deluge/i18n/ru.po b/deluge/i18n/ru.po
new file mode 100644
index 0000000..693e3cc
--- /dev/null
+++ b/deluge/i18n/ru.po
@@ -0,0 +1,6158 @@
+# Russian translation for deluge
+# Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2018-09-22 12:37+0000\n"
+"Last-Translator: adem <adem4ik@gmail.com>\n"
+"Language-Team: Russian <ru@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr "Б"
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr "КиБ"
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr "МиБ"
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr "ГиБ"
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr "ТиБ"
+
+#: deluge/common.py:410
+msgid "K"
+msgstr "К"
+
+#: deluge/common.py:411
+msgid "M"
+msgstr "M"
+
+#: deluge/common.py:412
+msgid "G"
+msgstr "Г"
+
+#: deluge/common.py:413
+msgid "T"
+msgstr "T"
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr "К/c"
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr "КиБ/Ñ"
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr "Ðœ/Ñ"
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr "МиБ/Ñ"
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr "Г/Ñ"
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr "ГиБ/Ñ"
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr "Т/Ñ"
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr "ТиБ/Ñ"
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr "Параметры демона"
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr "IP адреÑÑ, проÑлушиваемый Ð´Ð»Ñ Ñоединений Ñ UI"
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr "Порт, проÑлушиваемый Ð´Ð»Ñ Ñоединений Ñ UI"
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr "IP адреÑÑ, проÑлушиваемый Ð´Ð»Ñ Ñоединений BitTorrent"
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr "Ðктивен"
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr "Ошибка"
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr "Владелец"
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:"
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr "Пароль:"
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr "Включён"
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr "УдалÑÑ‚ÑŒ копию торрент-файла при удалении торрента"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr "От:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr "Порт:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr "ÐаÑтройки"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr "<b>Общие</b>"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr "СÑылка:"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr ""
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr "СпиÑок IP Emule (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr "ТекÑÑ‚ SafePeer (Ñжатый)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "ТекÑÑ‚ PeerGuardian (неÑжатый)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr "Чёрный ÑпиÑок"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr "Ðеверный заголовок"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr "ПроверÑÑ‚ÑŒ ÑпиÑок каждые:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr "Импортировать чёрный ÑпиÑок при запуÑке"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr "<b>ÐаÑтройки</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr "Скачать новый файл чёрного ÑпиÑка и импортировать его."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr "<b>Параметры</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr "Тип:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr "Дата:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr "Размер файла:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr "<b>ИнформациÑ</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr "<b>Белый ÑпиÑок</b>"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr "Путь"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr "ОтÑÐ»ÐµÐ¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° не ÑущеÑтвует."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr "Путь не ÑущеÑтвует."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr "Параметры отÑлеживаемой папки"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr "Выберите папку"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr "ОтÑлеживать Ñту папку"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr "<b>Папка Ð´Ð»Ñ ÑлежениÑ</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr "Удалить файл .torrent поÑле добавлениÑ"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr "ДопиÑать раÑширение поÑле добавлениÑ:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr "<b>ДейÑтвие над торрент-файлом</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr "Указать папку Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ðº"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr "<b>Папка Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ðº</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr "Метка: "
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr "<b>Метка</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr "ОÑновное"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr "Веб-интерфейÑ"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr "Включить веб-интерфейÑ"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr "ПроÑлушиваемый порт:"
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr "Показывать мигающее уведомление"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr "Ð’Ñплывающее уведомление не включено."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr "Показать вÑплывающее уведомление"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr "Звуковое уведомление не включено"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr "pygame не уÑтановлено"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr "Звуковое оповещение не удалоÑÑŒ %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr "Звуковое оповещение уÑпешно"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr "Торрент завершён"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+"Загрузка торрента \"%(name)s\", Ñодержащего %(num_files)i файл(а/ов), "
+"завершена."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr "УведомлениÑ"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr "Выберите звуковой файл"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr "Ошибка при отправке ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð½Ð° Ñлектронную почту: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr "Сервер неверно ответил на приветÑтвие HELO: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr "Уведомление на Ñлектронную почту отправлено."
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr "Завершён торрент \"%(name)s\""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr "Мигающий значок в облаÑти уведомлений включён"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr "Ð’Ñплывающие ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ñ‹"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr "Звук включён"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr "<b>Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого интерфейÑа</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr "<b>Получатели</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr "Сервер требует TLS/SSL"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr "ПодпиÑки"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr "РаÑпаковщик"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr "Извлечь в:"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr "Создать подпапку Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ торрента"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr "ÐедейÑтвительный торрент"
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr "ОÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ:"
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr "Дата добавлениÑ:"
+
+#~ msgid "pynotify is not installed"
+#~ msgstr "pynotify не уÑтановлено"
+
+#~ msgid "pynotify failed to show notification"
+#~ msgstr "pynotify не удалоÑÑŒ показать уведомление"
+
+#~ msgid "<b><i><big>Notifications</big></i></b>"
+#~ msgstr "<b><i><big>УведомлениÑ</big></i></b>"
diff --git a/deluge/i18n/si.po b/deluge/i18n/si.po
new file mode 100644
index 0000000..8c07443
--- /dev/null
+++ b/deluge/i18n/si.po
@@ -0,0 +1,3712 @@
+# Sinhalese translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2007-10-20 04:07+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Sinhalese <si@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:02+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
diff --git a/deluge/i18n/sk.po b/deluge/i18n/sk.po
new file mode 100644
index 0000000..f05a133
--- /dev/null
+++ b/deluge/i18n/sk.po
@@ -0,0 +1,6147 @@
+# Slovak translation for deluge
+# Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2017-11-12 08:27+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Slovak <sk@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr ""
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr ""
+
+#: deluge/common.py:410
+msgid "K"
+msgstr ""
+
+#: deluge/common.py:411
+msgid "M"
+msgstr ""
+
+#: deluge/common.py:412
+msgid "G"
+msgstr ""
+
+#: deluge/common.py:413
+msgid "T"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr ""
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr ""
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr ""
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr ""
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr ""
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr ""
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr ""
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr ""
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr ""
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr ""
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr ""
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr ""
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr ""
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr ""
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr ""
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr ""
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr ""
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr ""
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr ""
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr ""
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr ""
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr ""
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr ""
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr ""
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr ""
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr ""
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr ""
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr ""
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr ""
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr ""
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr ""
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr ""
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr ""
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr ""
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr ""
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr ""
diff --git a/deluge/i18n/sl.po b/deluge/i18n/sl.po
new file mode 100644
index 0000000..4f99686
--- /dev/null
+++ b/deluge/i18n/sl.po
@@ -0,0 +1,4544 @@
+# Slovenian translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2011-06-20 11:29+0000\n"
+"Last-Translator: Klemen Košir <klemen.kosir@gmx.com>\n"
+"Language-Team: Slovenian <sl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+"X-Poedit-Country: SLOVENIA\n"
+"X-Poedit-Language: Slovenian\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr "KiB"
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr "MiB"
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr "GiB"
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr "Utripanje obvestil je prikazano"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr "ObveÅ¡Äanje s pojavnim oknom ni omogoÄeno."
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr "Program pynotify ni nameÅ¡Äen"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr "Programu pynotify ni uspelo prikazati obvestila"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr "Pojavno okno je prikazano"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr "Obvestilo z zvokom ni omogoÄeno"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr "Program pygame ni nameÅ¡Äen"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr "Obvestilo z zvokom ni uspelo %s"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr "Obvestilo z zvokom je bilo uspešno"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr "Prejemanje torrenta je konÄano"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+"Prejemanje torrenta \"%(name)s, ki vsebuje %(num_files)i datotek, je konÄano."
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr "Izberite zvoÄno datoteko"
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr "Med pošiljanjem obvestilne e-pošte je prišlo do napake: %s"
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr "Strežnik se ni pravilno odzval pozdravnemu sporoÄilu: %s"
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr "Strežnik ni sprejel uporabniškega imena in gesla: %s"
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr "Obvestilna e-pošta poslana."
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr "Prejemanje torrenta \"%(name)s\" je konÄano"
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+"Ta e-poÅ¡ta vas obveÅ¡Äa, da je Deluge konÄal s prejemanjem torrenta "
+"\"%(name)s\", ki vsebuje %(num_files)i datotek.\n"
+"ÄŒe ne želite veÄ prejemati teh obvestil, jih lahko izkljuÄite v nastavitvah "
+"programa Deluge.\n"
+"\n"
+"Hvala,\n"
+"Deluge"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr "<b><i><big>Obvestila</big></i></b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr "Utripanje ikone sistemske vrstice omogoÄeno"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr "Pojavna okna so omogoÄena"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr "Zvok je omogoÄen"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr "<b>Obvestila uporabniškega vmesnika</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Ime gostitelja:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Vrata:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Uporabniško ime:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Geslo:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr "<b>Prejemniki</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr "Strežnik potrebuje TLS/SSL"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Od:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "OmogoÄeno"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr "<b>Obvestila po elektronski pošti</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Nastavitve"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+"Te nastavitve ne pomenijo, da boste prejeli obvestila za vse te dogodke."
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr "NaroÄnine"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr "Prilagajanje zvoka"
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr "Opazovana mapa ne obstaja."
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr "Pot ne obstaja."
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr "Napaka AutoAdd"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr "Lastnosti opazovane mape"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Izberite mapo"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr "OmogoÄi to opazovano mapo"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr "<b>Opazovana mapa</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr "Po dodajanju izbriši datoteko .torrent"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr "Po dodajanju dodaj pripono:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ".dodano"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr "<b>Datoteka .torrent</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr "Nastavi mesto shranjevanja"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Mesto shranjevanja</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr "Nastavi mesto shranjevanja dokonÄanih datotek"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr "<b>Premakni dokonÄano</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr "Oznaka: "
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr "<b>Oznaka</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr "Glavno"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Najvišja hitrost pošiljanja:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "NajveÄje Å¡tevilo povezav:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "NajveÄje Å¡tevilo mest za poÅ¡iljanje:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Najvišja hitrost prejemanja:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Pasovna Å¡irina</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Ustavi sejanje pri delilnem razmerju:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Odstrani pri delilnem razmerju"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr "Samodejno upravljanje:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr "Dodaj v stanju premora:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr "Dodaj v Äakalno vrsto:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Na vrh"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Na dno"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>ÄŒakalna vrsta</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Možnosti"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr "<b>Opazovane mape:</b>"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Omejitev prejemanja:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Omejitev pošiljanja:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Dejavni torrenti:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr "Dejavni prejemi:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr "Dejavna sejanja:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Nastavitve</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Neveljavna oznaka, veljavni znaki: [a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Prazna oznaka"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Oznaka že obstaja"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Neznana oznaka"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Neznan torrent"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Oznaka"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Možnosti _oznake"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_Odstrani oznako"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_Dodaj oznako"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Možnosti oznake"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Možnosti oznake</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Mesta za pošiljanje:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Hitrost pošiljanja:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Hitrost prejemanja:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Povezave:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Uveljavi omejitve glede na torrent:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "Omejitve"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Samodejno upravljanje"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Uveljavi nastavitve Äakalne vrste:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "ÄŒakalna vrsta"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Premakni dokonÄane v:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Uveljavi nastavitve mesta:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Mesto"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(1 vrstica na sledilnik)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Samodejno uveljavi oznako:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Sledilniki"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Dodaj oznako"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Dodaj oznako</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Ime:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Za dodajanje, urejanje ali odstranjevanje oznak uporabite stransko "
+"vrstico. </i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Oznake</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Razširi v:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Ustvari podmapo z imenom torrenta"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Ta možnost bo ustvarila podmapo z imenom torrenta in v izbrano mapo "
+"razširila datoteke."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Splošno</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+"Spletni vmesnik programa Deluge ni nameÅ¡Äen.\n"
+"Prosimo, namestite ga in poskusite znova"
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "OmogoÄi spletni vmesnik"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "OmogoÄi SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Vrata za poslušanje:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Nastavitve</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Seznam Emule IP (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "Besedilo SafePeer (Zip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "Besedilo PeerGuardian (nestisnjeno)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Neveljaven povzetek"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Neveljavna Äarobna koda"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Neveljavna razliÄica"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "ÄŒrni seznam"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "dni"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Preveri za nov seznam vsakih:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Uvozi Ärni seznam ob zagonu"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "ÄŒe je potrebno, datoteko s Ärnim seznamom prenese in uvozi."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Preveri prejem in uvoz"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Prenese nov Ärni seznam in ga uvozi."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "Vsili prejem in uvoz"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "ÄŒrni seznam je posodobljen"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Možnosti</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Vrsta:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Datum:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Velikost datoteke:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Podatki</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torrent je dokonÄan"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torrent je dodan"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Izvedi"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Dogodek"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Ukaz"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Dodaj ukaz</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Ukazi</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Najava je v redu"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Najava poslana"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Opozorilo"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Napaka"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Afganistan"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "OtoÄje Aland"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Albanija"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Alžirija"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Ameriška Samoa"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andora"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Angvila"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antarktika"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antigva in Barbuda"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Argentina"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Armenija"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "Avstralija"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Avstrija"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Azerbajdžan"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Bahami"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bahrajn"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Bangladeš"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Belorusija"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Belgija"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermudi"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Butan"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Bolivija"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bosna in Hercegovina"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Bocvana"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Bouvetov otok"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brazilija"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Britanska ozemlja v Indijskem oceanu"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Brunej"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Bolgarija"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Kambodža"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Kamerun"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Kanada"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Zelenortski otoki"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Kajmanski otoki"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Srednjeafriška republika"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "ÄŒad"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "ÄŒile"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Kitajska"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "BožiÄni otoki"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Kokosovi (Keelingovi) otoki"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Kolumbija"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Komori"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Kongo"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "DemokratiÄna republika Kongo"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Cookovi otoki"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Kostarika"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "SlonokoÅ¡Äena obala"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "Hrvaška"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Kuba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Ciper"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Češka"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Danska"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Džibuti"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominika"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Dominikanska republika"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Ekvador"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Egipt"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "Salvador"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Ekvatorialna Gvineja"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Eritreja"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Estonija"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Etiopija"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falklandski otoki (Malvini)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Ferski otoki"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fidži"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Finska"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Francija"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "Francoska Gvajana"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "Francoska Polinezija"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "Francoska južna ozemlja"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambija"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Gruzija"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "NemÄija"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Velika Britanija"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Gana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "GrÄija"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Grenlandija"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Gvadelup"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Gvatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Gvineja"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Gvineja Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Gvajana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Otok Heard in otoÄje McDonald"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Vatikan"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Madžarska"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Islandija"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "Indija"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonezija"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Iran"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Irak"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Irska"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Otok Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Izrael"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italija"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamajka"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japonska"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordanija"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazahstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenija"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Severna Koreja"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Južna Koreja"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuvajt"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kirgizistan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Laos"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Latvija"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Libanon"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesoto"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberija"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libija"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Litva"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luksemburg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Makao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Makedonija"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagaskar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malavi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malezija"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldivi"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Marshallovi otoki"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinik"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mavretanija"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Mehika"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Mikronezija"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldavija"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monako"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongolija"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "ÄŒrna gora"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Maroko"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambik"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Mjanmar"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibija"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Nizozemska"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Nizozemski Antili"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Nova Kaledonija"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Nova Zelandija"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nikaragva"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigerija"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Otok Norfolk"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Severni Marianski otoki"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norveška"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palestinsko ozemlje, okupirano"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua Nova Gvineja"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paragvaj"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filipini"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Poljska"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugalska"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Portoriko"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Katar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Romunija"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Rusija"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Ruanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Saint Barthelemy"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Sveta Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Saint Kitts in Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Sveta Lucija"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Saint Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint Pierre in Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Saint Vincent in Grenadine"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Zahodna Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Sao Tome in Principe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Saudova Arabija"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Srbija"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Sejšeli"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapur"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slovaška"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slovenija"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Salomonovi otoki"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalija"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Južna Afrika"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Južna Georgia in Južni Sandwichevi otoki"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Å panija"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Å rilanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Surinam"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard in Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Svazi"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Å vedska"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Å vica"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Sirija"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Tajvan"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tadžikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzanija"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Tajska"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Timor-Leste"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad in Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunizija"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "TurÄija"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Otoki Turks in Caicos"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukrajina"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Združeni arabski emirati"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Združene države Amerike"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Manjši zunanji otoki Združenih držav Amerike"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Urugvaj"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Uzbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Britanski Deviški otoki"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Ameriški Deviški otoki"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis in Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Zahodna Sahara"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Jemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambija"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabve"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Nedosegljiv"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Dosegljiv"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Povezan"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Ozadnji program ne obstaja"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Ozadnji program ni zagnan"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "Zaganjanje strežnika v PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Naslov"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Odjemalec"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Napredek"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Hitrost prejemanja"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Hitrost pošiljanja"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " torrentov v Äakalni vrsti"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " torrent v Äakalni vrsti"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Neomejeno"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "OmogoÄeno"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "Drugo ..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Prejemanje:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Pošiljanje:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr "Ni povezave ..."
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Prejemanje"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Pošiljanje"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Nastavi najvišjo hitrost prejemanja"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Nastavi najvišjo hitrost pošiljanja"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr "Deluge je zaÅ¡Äiten z geslom."
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr "Za nadaljevanje vnesite geslo"
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Prejemanje torrenta konÄano"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Ta e-poÅ¡ta vas obveÅ¡Äa, da je Deluge konÄal s prejemanjem torrenta %(name)s, "
+"ki vsebuje %(num_files)i datotek.\n"
+"ÄŒe ne želite veÄ prejemati teh obvestil, jih lahko izkljuÄite v nastavitvah "
+"programa Deluge.\n"
+"\n"
+"Hvala,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr "Kategorije"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Prejemi"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Omrežje"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Pasovna Å¡irina"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Vmesnik"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "Drugo"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Ozadnji program"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Posredniški strežnik"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Predpomnilnik"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Vstavki"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Vstavek"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Izberite vstavek"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Datoteke Egg"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Ime datoteke"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Velikost"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Neveljavna datoteka"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Podvojen torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Enakega torrenta ne morete dodati dvakrat."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Prednosti datoteke ni mogoÄe nastaviti!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+"Pri strnjenem dodeljevanju nastavljanje prednosti datotekam ni na voljo. Ali "
+"želite preklopiti na polno dodeljevanje?"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Izberite datoteko .torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Datoteke Torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Vse datoteke"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Neveljaven naslov URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr "ni veljaven naslov URL."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr "Prejemanje ..."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Prejemanje ni uspelo"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Stopnja"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Sledilnik"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Izberite datoteko"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Izberite mapo"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Shrani datoteko .torrent"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Brez povezave"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Povezave"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Hitrost prejemanja"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Hitrost pošiljanja"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Promet"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "VozliÅ¡Äa DHT"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr "Nezaseden prostor na disku"
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Ni dohodnih povezav!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Nastavi najveÄje Å¡tevilo povezav"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torrenti"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr "Stanja"
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Oznake"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Vsi"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Prejemanje"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Sejanje"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "V premoru"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Preverjanje"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "V Äakalni vrsti"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr "Dejaven"
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Brez"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Brez oznake"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr "Stanje"
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Gostitelj"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr "RazliÄica"
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr "Zau_stavi ozadnji program"
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr "_Zaženi ozadnji program"
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr "Ozadnjega programa ni mogoÄe zagnati!"
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+"Izvedljive datoteke 'deluged' ni mogoÄe najti. Ali ste pozabili namestiti "
+"paket deluged ali pa ni naveden v spremenljivki PATH."
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr "Za veÄ podatkov si oglejte podrobnosti."
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Napaka med dodajanjem gostitelja"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Ali želite izkljuÄiti obiÄajni naÄin?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Izgleda, da je ozadnji program Deluge (deluged) že zagnan.\n"
+"\n"
+"Za nadaljevanje boste morali zaustaviti ozadnji program ali izkljuÄiti "
+"obiÄajni naÄin."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Napaka med zaganjanjem jedra"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"Med zaganjanjem jedra, ki je potrebno za delovanje programa Deluge v "
+"obiÄajnem naÄinu, je priÅ¡lo do napake.\n"
+"\n"
+"Za veÄ podrobnosti si oglejte spodnje podatke."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Ali želite zaradi napake med zaganjanjem obiÄajnega naÄina le-tega "
+"izkljuÄiti?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Napaka med zaganjanjem ozadnjega programa"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"Med zaganjanjem ozadnjega programa je prišlo do napake. Poskusite ga zagnati "
+"iz terminala."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "VkljuÄeno"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "IzkljuÄeno"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Nastavi na neomejeno"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Izberite mapo, v katero želite premakniti datoteke"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Nastavi najveÄje Å¡tevilo mest za poÅ¡iljanje"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr "Ne prejmi"
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr "ObiÄajna prednost"
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr "Visoka prednost"
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr "Najvišja prednost"
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Prednost"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Podrobnosti:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Ime"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Prejeto"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Poslano"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Sejalci"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "Soležniki"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr "Omejitev prejemanja"
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr "Omejitev pošiljanja"
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "PÄŒP"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Razmerje"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Razpoložljivost"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Dodano dne"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr "Mesto shranjevanja"
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Datoteka"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Dodaj torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "_Ustvari torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr "_KonÄaj in izklopi ozadnji program"
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "Ur_edi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "Upravljalnik _povezav"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Pogled"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "_Orodna vrstica"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Stranska vrstica"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "_Vrstica stanja"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "_Zavihki"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Stolpci"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "_Stranska vrstica"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "Pokaži stanja, ki ne vsebujejo torrentov"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "Pokaži _sledilnike"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "Pomo_Ä"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr "_Spletna stran"
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr "_FAQ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Pogosto zastavljena vprašanja"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr "_Skupnost"
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Dodaj torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Dodaj torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Odstrani torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Odstrani torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "ZaÄasno ustavi trenutno izbrane torrente"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Premor"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Nadaljuj trenutno izbrane torrente"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Nadaljuj"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Premakni v Äakalni vrsti navzgor"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Premakni navzgor"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Premakni v Äakalni vrsti navzdol"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Premakni navzdol"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Možnosti"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Upravljalnik povezav"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Razširi vse"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Ne prejmi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_ObiÄajna prednost"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Visoka prednost"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Naj_višja prednost"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Samodejno upravljanje:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Nivo sejanja:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>ÄŒas sejanja:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>ÄŒas dejavnosti:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Stanje sledilnika:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>Razpoložljivost:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>Soležniki:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Sejalci:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Kosi:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>PÄŒP:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Naslednja najava:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Delilno razmerje:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Poslano:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Prejeto:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Dodano dne:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Stanje"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Opombe:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>Å tevilo datotek:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Razpršilo:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Sledilnik:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Skupna velikost:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Ime:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Mesto:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Stanje:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Podrobnosti"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Datoteke"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "_Soležniki"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Premakni dokonÄane:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Zasebno"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "ZaÄni s prvimi/zadnjimi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "Ur_edi sledilnike"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Možnosti"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Ali želite odstraniti izbrane torrente?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+"<big><b>Ali ste prepriÄani, da želite odstraniti izbrane torrente?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>Povezana datoteka .torrent bo izbrisana!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Prejeti podatki bodo izbrisani!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Odstrani izbrane torrente"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Nova razliÄica"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Na voljo je nova razliÄica!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Razpoložljiva razliÄica:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Trenutna razliÄica:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Tega pogovornega okna v prihodnje ne pokaži"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "Pojdi na _spletno stran"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr "_Dodaj soležnika"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "Dodaj soležnika z njegovim naslovom IP"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "Izberi _vse"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Premor vseh"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Nadaljuj izbrane torrente."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Na_daljuj vse"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Dodaj torrente"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Razpršilo"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "Odst_rani"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrenti</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Da_toteke"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Polno"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Strnjeno"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Dodeljevanje</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Najvišja hitrost prejemanja:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Najvišja hitrost pošiljanja:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Dodaj v stanju _premora"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "ZaÄni s prvimi/zadnjimi kosi"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Povrni privzeto"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Uveljavi za vse"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Dodaj URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Dodaj URL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Dodaj razpršilo"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>Dodaj razpršilo</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "Razpršilo:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Sledilniki:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Ustvari torrent"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Ustvari torrent</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "_Mapa"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Oddaljena pot"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Datoteke</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Avtor:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Opombe:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Podatki"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Spletni sejalci"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Velikost kosa:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Nastavi zasebno zastavico"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Dodaj torrent k seji"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Vnesite oddaljeno pot"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Oddaljena pot</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Pot:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Ustvarjanje torrenta"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Shrani datoteko .torrent kot"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Shrani datoteko .torrent</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Torrenti v Äakalni vrsti"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Dodaj torrente iz Äakalne vrste</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Ob vzpostavitvi povezave samodejno dodaj torrente"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "oznaka"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "Dodaj soležnika"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>Dodaj soležnika</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "gostitelj:vrata"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Dodaj gostitelja"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Upravljalnik povezav</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "_Zaženi krajevni ozadnji program"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Ob zagonu se samodejno poveži z izbranim gostiteljem"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Po potrebi samodejno zaženi krajevnega gostitelja"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Ob zagonu ne pokaži tega pogovornega okna"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Prejemi</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Samodejno dodaj datoteke .torrent iz:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Prejmi v:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Kopije datotek .torrent v:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr "Ob odstranitvi izbriši kopijo datoteke torrent"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr "Izbriši kopijo datoteke torrent, ko je torrent odstranjen"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Mape</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Uporabi polno dodeljevanje"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Polno dodeljevanje zapolni celoten prostor, ki ga torrent potrebuje in s tem "
+"prepreÄi razdrobljenost diska"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Uporabi strnjeno dodeljevanje"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Strnjeno dodeljevanje zasede prostor po potrebi"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "ZaÄni s prvimi in zadnjimi kosi torrenta"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Najprej prenesi prve in zadnje kose torrenta"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "Dodaj torrente v stanju premora"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Omrežje</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Uporabi nakljuÄna vrata"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge bo vsakiÄ samodejno izbral druga vrata."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Dejavna vrata:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Do:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Preizkusi dejavna vrata"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Vrata za dohodne povezave</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Vrata za odhodne povezave</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Vnesite naslov IP vmesnika, ki Äaka na dohodne bittorrent povezave. To polje "
+"pustite prazno, Äe želite, da se uporabi privzeta vrednost."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>Vmesnik</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"TOS-bajt, ki bo nastavljen v glavi vsakega paketa, ki bo poslan soležnikom "
+"(tudi spletnim sejalcem). PriÄakovana je Å¡estnajstiÅ¡ka vrednost."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "TOS-bajt soležnika:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT Port Mapping Protocol"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Peer Exchange"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery poiÅ¡Äe krajevne soležnike na vaÅ¡em omrežju."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Distributed Hash Table lahko poveÄa koliÄino dejavnih povezav."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Omrežni dodatki</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Vhodno:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Nivo:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Vsiljeno\n"
+"OmogoÄeno\n"
+"OnemogoÄeno"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Izmenjava signalov\n"
+"Polni pretok\n"
+"Eno ali drugo"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Izhodno:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Å ifriraj celoten pretok"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Å ifriranje</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Pasovna Å¡irina</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "NajveÄje Å¡tevilo poskusov povezav na sekundo:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "NajveÄje Å¡tevilo napol odprtih povezav:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Najvišja hitrost pošiljanja za vse torrente. Za neomejeno nastavite na -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Najvišja hitrost pošiljanja (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "NajveÄje dovoljeno Å¡tevilo povezav. Za neomejeno nastavite na -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "NajveÄje Å¡tevilo povezav:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"NajveÄje Å¡tevilo mest za poÅ¡iljanje za vse torrente. Za neomejeno nastavite "
+"na -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "NajveÄje Å¡tevilo mest za poÅ¡iljanje:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Najvišja hitrost prejemanja za vse torrente. Za neomejeno nastavite na -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Najvišja hitrost prejemanja (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Na krajevnem omrežju prezri omejitve"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "UpoÅ¡tevaj prekoraÄitev TCP/IP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"ÄŒe je to polje oznaÄeno, se prekoraÄitev TCP/IP odÅ¡teje od omejitev. S tem "
+"se prepreÄi prekoraÄitev skupnega prometa"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Splošna uporaba pasovne širine</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"NajveÄje Å¡tevilo mest za poÅ¡iljanje na torrent. Za neomejeno nastavite na -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "NajveÄje Å¡tevilo povezav na torrent. Za neomejeno nastavite na -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Uporaba pasovne Å¡irine na torrent</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Vmesnik</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "OmogoÄi"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"ObiÄajni naÄin skrije veÄino zmožnosti ozadnjega programa, da Deluge deluje "
+"kot en sam program. To možnost uporabite, Äe ne želite zagnati programa "
+"Deluge kot ozadnji program. Ta možnost se bo uveljavila ob naslednjem zagonu "
+"programa Deluge."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>ObiÄajni naÄin</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "V nazivni vrstici pokaži hitrost seje"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Glavno okno</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Vedno prikaži"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Postavi okno v žariÅ¡Äe"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Pogovorno okno \"Dodaj torrent\"</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "OmogoÄi ikono sistemske vrstice"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Ob zaprtju pomanjšaj v sistemsko vrstico"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Zaženi v sistemski vrstici"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "ZaÅ¡Äiti sistemsko vrstico z geslom"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Sistemska vrstica</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>Drugo</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "ObveÅ¡Äanje o novih razliÄicah"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge bo samodejno preveril, Äe je na voljo novejÅ¡a razliÄica programa"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Posodobitve</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Pomagajte nam izboljÅ¡ati Deluge tako, da nam poÅ¡ljete podatki o razliÄici "
+"Pythona in PyGTK, vrsti operacijskega sistema in procesorja. Poslani ne bodo "
+"nobeni drugi podatki."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Da, prosim, pošlji brezimno statistiko"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Podatki o sistemu</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Mesto:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Če Deluge na temu mestu ne najde podatkovne zbirke, bo državo soležnika "
+"prepoznal z uporabo strežnika DNS."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>Podatkovna zbirka GeoIP</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Poveži povezave Magnet s programom Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Ozadnji program</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Vrata ozadnjega programa:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Vrata</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Dovoli oddaljene povezave"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Povezave</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "ObveÅ¡Äanje o novih razliÄicah"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>Drugo</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>ÄŒakalna vrsta</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Postavi nove torrente na vrh Äakalne vrste"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Skupno dejavnih sejanj:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Skupno dejavnih:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Skupno dejavnih prejemanj:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Ne upoÅ¡tevaj poÄasnih torrentov"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Dejavni torrenti</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Omejitev delilnega razmerja:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "ÄŒasovno razmerje sejanja:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "ÄŒas sejanja (min):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Ustavi sejanje, ko delilno razmerje doseže:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Odstrani torrent, ko je delilno razmerje doseženo"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Sejanje</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Posredniški strežnik</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Gostitelj:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Brez\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 z overitvijo\n"
+"HTTP\n"
+"HTTP z overitvijo"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>Soležnik</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Spletni sejalec</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Sledilnik</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Predpomnilnik</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Velikost predpomnilnika (16 KiB bloki):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Å tevilo sekund od zadnjega zapisa v predpomnilnik, preden se le-ta vsiljeno "
+"poÄisti na disk. Privzeto je 60 sekund."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Potek predpomnilnika (v sekundah):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr "Skupno Å¡tevilo 16 KiB blokov, zapisanih na disk od zaÄetka seje."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Zapisani bloki:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr "Skupno Å¡tevilo izvedenih pisanj od zaÄetka seje."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Å tevilo pisanj:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"Razmerje ((zapisani_bloki - pisanj) / zapisani_bloki) predstavlja Å¡tevilo "
+"shranjenih zapisov na skupno Å¡tevilo zapisov oz. Å¡tevilo zadetkov pisalnega "
+"predpomnilnika."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "Razmerje pisalnega predpomnilnika:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Pisanje</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Število blokov, ki jih je zahteval pogon bittorrent (ali soležniki), "
+"prebranih iz diska ali predpomnilnika."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Na zahtevo prebrani bloki:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "Å tevilo blokov, prebranih z diska ali predpomnilnika."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "Prebrani bloki:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "Razmerje zadetkov za bralni predpomnilnik."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "Razmerje bralnega predpomnilnika:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr "Skupno Å¡tevilo izvedenih branj od zaÄetka seje."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Å tevilo branj:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Branje</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Å tevilo 16 KiB blokov, ki so trenutno v predpomnilniku diska. Le-ta "
+"vkljuÄuje bralni in pisalni predpomnilnik."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Predpomnilnik:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Bralni predpomnilnik:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Velikost</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Stanje</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Vstavki</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "RazliÄica:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Spletna stran:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "E-poštni naslov avtorja:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_Namesti vstavek"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "_Osveži vstavke"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "_Najdi nove vstavke"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Pokaži Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Nadaljuj vse"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_Omejitev hitrosti prejemanja"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "Omejitev hitrosti _pošiljanja"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "KonÄaj in izklopi ozadnji program"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Odpri mapo"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Na_daljuj"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "_Možnosti"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "Postavi v Äakalno _vrsto"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Osveži sledilnike"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "Odst_rani torrent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "_Vsili ponovno preverjanje"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "_Premakni podatke"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "_Omejitev Å¡tevila povezav"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Omejitev _mest za pošiljanje"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Samodejno upravljanje"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Ali želite odstraniti izbrane torrente?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "ÄŒe odstranite podatke, bodo le-ti izgubljeni za vedno."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr "Odstrani datoteke"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr "Ohrani datoteke"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Uredi sledilnike"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Uredi sledilnike</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Dodaj sledilnik"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Dodaj sledilnike</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Uredi sledilnik"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Uredi sledilnik</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Sledilnik:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Odstrani s _podatki"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Odstrani _torrent"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Premakni podatke"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Premakni podatke</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Cilj:"
+
+#~ msgid "seconds"
+#~ msgstr "sekund"
+
+#~ msgid "Unknown"
+#~ msgstr "Neznan"
+
+#~ msgid "Download"
+#~ msgstr "Prejemanje"
+
+#~ msgid "Upload"
+#~ msgstr "Oddajanje"
+
+#~ msgid "Update Tracker"
+#~ msgstr "Osveži sledilnik"
+
+#~ msgid "Total Size"
+#~ msgstr "Celotna velikost"
+
+#~ msgid "Pieces"
+#~ msgstr "Kosi"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Delilno razmerje"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Status sledilnika"
+
+#~ msgid "Next Announce"
+#~ msgstr "Naslednje obvestilo"
+
+#~ msgid "Details"
+#~ msgstr "Podrobnosti"
+
+#~ msgid "Files"
+#~ msgstr "Datoteke"
+
+#~ msgid "General"
+#~ msgstr "Splošno"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "NajveÄje Å¡tevilo povezav"
+
+#~ msgid "Availability"
+#~ msgstr "Razpoložljivost"
+
+#~ msgid "Select All"
+#~ msgstr "Izberi vse"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Izbriši .torrent datoteko"
+
+#~ msgid "Remove"
+#~ msgstr "Odstrani"
+
+#~ msgid "Clear"
+#~ msgstr "PoÄisti"
+
+#~ msgid "Add"
+#~ msgstr "Dodaj"
+
+#~ msgid "Speed"
+#~ msgstr "Hitrost"
+
+#~ msgid "Username"
+#~ msgstr "Uporabniško Ime"
+
+#~ msgid "Password"
+#~ msgstr "Geslo"
+
+#~ msgid "Port"
+#~ msgstr "Vrata"
+
+#~ msgid "Server"
+#~ msgstr "Strežnik"
+
+#~ msgid "Filters"
+#~ msgstr "Filtri"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge je zaklenjen"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge je zaklenjen z geslom.\n"
+#~ "Če želite prikazati Deluge, vpišite geslo."
+
+#~ msgid "Graph"
+#~ msgstr "Graf"
+
+#~ msgid "New Password"
+#~ msgstr "Novo geslo"
+
+#~ msgid "Text Only"
+#~ msgstr "Samo besedilo"
+
+#~ msgid "# Of Files"
+#~ msgstr "# datotek"
+
+#~ msgid "Template"
+#~ msgstr "Predloga"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Izberite povezavo ali torrent, ne pa oboje."
+
+#~ msgid "translate something"
+#~ msgstr "prevedite nekaj"
+
+#~ msgid "Image Only"
+#~ msgstr "Samo slika"
+
+#~ msgid "Text and image"
+#~ msgstr "Tekst in slika"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "Osveževanje mora biti veÄ kot 0"
+
+#~ msgid "About"
+#~ msgstr "O programu"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Izbriši prenešene podatke"
+
+#~ msgid "Disable"
+#~ msgstr "OnemogoÄi"
+
+#~ msgid "Login"
+#~ msgstr "Prijava"
+
+#~ msgid "Eta"
+#~ msgstr "Eta"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Osveži stran vsakih:"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Nepravilno geslo, poskusite znova"
+
+#~ msgid "Pause all"
+#~ msgstr "ZaÄasno zaustavi vse"
+
+#~ msgid "Logout"
+#~ msgstr "Odjava"
+
+#~ msgid "Url"
+#~ msgstr "Url"
+
+#~ msgid "Set"
+#~ msgstr "Nastavi"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Naloži torrent"
+
+#~ msgid "Submit"
+#~ msgstr "Pošlji"
+
+#~ msgid "Torrent list"
+#~ msgstr "Seznam torrentov"
+
+#~ msgid "Resume all"
+#~ msgstr "Nadaljuj vse prenose"
+
+#~ msgid "Start"
+#~ msgstr "ZaÄni"
+
+#~ msgid "Type"
+#~ msgstr "Tip"
+
+#~ msgid "From"
+#~ msgstr "Od"
+
+#~ msgid "Disabled"
+#~ msgstr "IzkljuÄeno"
+
+#~ msgid "Config"
+#~ msgstr "Nastavi"
+
+#~ msgid "Queue Position"
+#~ msgstr "Pozicija v vrsti"
+
+#~ msgid "Reannounce"
+#~ msgstr "Ponovno oznani"
+
+#~ msgid "Ava"
+#~ msgstr "Pov"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Samodejno osveževanje:"
+
+#~ msgid "File"
+#~ msgstr "Datoteka"
+
+#~ msgid "Save"
+#~ msgstr "Shrani"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Dodaj v stanju premora"
+
+#~ msgid "Download Location"
+#~ msgstr "Mesto prenosa"
+
+#~ msgid "no uri"
+#~ msgstr "brez naslova"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Najvišja hitrost oddajanja"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Najvišja hitrost sprejemanja"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "Kompaktna alokacija"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "NajveÄje Å¡tevilo povezav oddajanja"
+
+#~ msgid "To"
+#~ msgstr "Za"
+
+#~ msgid "Random"
+#~ msgstr "NakljuÄno"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Napaka v možnostih torrenta"
+
+#~ msgid "Ports"
+#~ msgstr "Vrata"
+
+#~ msgid "No data"
+#~ msgstr "Ni podatkov"
+
+#~ msgid "Extra's"
+#~ msgstr "Dodatki"
+
+#~ msgid "Handshake"
+#~ msgstr "Preverjanje istovetnosti"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "Imenjava vrstnikov"
+
+#~ msgid "Forced"
+#~ msgstr "Vsiljen"
+
+#~ msgid "Encryption"
+#~ msgstr "Å ifriranje"
+
+#~ msgid "Either"
+#~ msgstr "Katerokoli"
+
+#~ msgid "Inbound"
+#~ msgstr "Vhodno"
+
+#~ msgid "Outbound"
+#~ msgstr "Izhodno"
+
+#~ msgid "Level"
+#~ msgstr "Nivo"
+
+#~ msgid "Global"
+#~ msgstr "Globalno"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Neomejeno"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Najvišja hitrost prenosa (Kib/s)"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Najvišja hitrost nalaganja (Kib/s)"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "NajveÄje Å¡tevilo na pol odprtih povezav"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr ""
+#~ "Ponovni zagon prikritega procesa in spletnega vmesnika po spremembi teh "
+#~ "nastavitev"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Samodejno dodaj mapo"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "Shrani .torrent datoteke v"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Shrani vse prenose v"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Na torrent"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "NajveÄje Å¡tevilo poskusov povezav v sekundi"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Skupno Å¡tevilo aktivnih sejanj"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Prenehaj sejanje ko delilno razmerje doseže"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Skupno Å¡tevilo aktivnih torrentov"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Skupno Å¡tevilo aktivnih prenosov"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = neomejeno"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Odstrani torrent ko delilno razmerje doseže"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "OmogoÄeni vtiÄniki"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Staro geslo ni pravo"
+
+#~ msgid "Cache templates"
+#~ msgstr "Predpomni predloge"
+
+#~ msgid "Button style"
+#~ msgstr "Slog gumbov"
+
+#~ msgid "Current Password"
+#~ msgstr "Trenutno geslo"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Novo geslo (potrditev)"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Ustavi sejanje pri delilnem razmerju"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Spremembe so shranjene"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Popravite napake in poskusite znova"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Novo geslo ni enako geslu za potrditev"
+
+#~ msgid "Move To"
+#~ msgstr "Premakni v"
+
+#~ msgid "Error in Path."
+#~ msgstr "Napaka v poti."
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "PrepriÄajte se, da ima ta vrednost najveÄ %(max)d znakov (ima %(length)d)."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Vpišite veljavno vrednost."
+
+#~ msgid "This field is required."
+#~ msgstr "To polje je obvezno."
+
+#~ msgid "No"
+#~ msgstr "Ne"
+
+#~ msgid "Yes"
+#~ msgstr "Da"
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Izberite veljavno možnost. %s ni razpoložljiva."
+
+#~ msgid "Enter a list of values."
+#~ msgstr "Vpišite seznam vrednosti."
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr "Izberite veljavno možnost. Izbrana ni na seznamu razpoložljivih."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "PrepriÄajte se, da niste vpisali veÄ kot %s cifer."
+
+#~ msgid "Enter a number."
+#~ msgstr "Vpišite številko."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "PrepriÄajte se, da je vrednost veÄja ali enaka %s."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "PrepriÄajte se, da je vrednost manjÅ¡a ali enaka %s."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Vpišite celo številko."
+
+#~ msgid "Mainline DHT"
+#~ msgstr "Mainline DHT"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "OmogoÄeno je samodejno dodajanje"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "ZaÄni s prvimi in zadnjimi kosi"
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Vpišite veljavni datum."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "PrepriÄajte se, da ni vpisanih veÄ kot %s decimalnih Å¡tevilk."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "VpiÅ¡iti veljavni Äas."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Vpišite veljavni datum/uro."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Vpišite veljavni e-naslov."
+
+#~ msgid "No file was submitted."
+#~ msgstr "Nobena datoteka ni bila poslana."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Poslana datoteka je prazna."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "Nobena datoteka ni bila poslana. Preverite vrsto kodiranja obrazca."
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Ta mapa ne obstaja."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Vpišite veljaven IPv4 naslov."
+
+#~ msgid "Connect"
+#~ msgstr "Priklopi"
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Naložite veljavno sliko. Izbrana datoteka ni slikovna ali pa vsebuje napake."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Vpišite veljaven URL naslov"
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "Kot kaže, URL naslov ni veljaven."
+
+#~ msgid "Statistics"
+#~ msgstr "Statistika"
+
+#~ msgid "Delete"
+#~ msgstr "Izbriši"
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr "PrepriÄajte se, da pred decimalko ni vpisanih veÄ kot %s cifer."
+
+#~ msgid "Stop"
+#~ msgstr "Zaustavi"
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Poskrbite, da bo niz vseboval vsaj %(min)d znakov (trenutno jih vsebuje "
+#~ "%(length)d)."
+
+#~ msgid "Recheck"
+#~ msgstr "Ponovno preveri"
+
+#~ msgid "Move"
+#~ msgstr "Prestavi"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Preveri vsakih (dni)"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "ÄŒasovna omejitev (sek.)"
+
+#~ msgid "BlockList"
+#~ msgstr "Blokirni seznam"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Prenašanje %.2f%%"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Uvažanje %s"
+
+#~ msgid "Import Now"
+#~ msgstr "Uvozi sedaj"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Uvozi ob zagonu demona"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Blokirani obsegi: %s"
+
+#~ msgid "Inactive"
+#~ msgstr "Nedejaven"
+
+#~ msgid "Refresh status"
+#~ msgstr "Osveži stanje"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Dno vrste"
+
+#~ msgid "Queue Top"
+#~ msgstr "Vrh vrste"
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr "Izberite veljavno izbiro. %(value)s ni ena izmed veljavnih izbir."
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Dodaj torrente</b></big>"
+
+#~ msgid "From Session"
+#~ msgstr "Iz seje"
+
+#~ msgid "page 6"
+#~ msgstr "stran 6"
+
+#~ msgid "page 8"
+#~ msgstr "stran 8"
+
+#~ msgid "page 7"
+#~ msgstr "stran 7"
+
+#~ msgid "page 10"
+#~ msgstr "stran 10"
+
+#~ msgid "page 11"
+#~ msgstr "stran 11"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "ÄŒarovnik nastavitev Deluge"
+
+#~ msgid "All Finished!"
+#~ msgstr "Vse je dokonÄano!"
+
+#~ msgid "Graphs"
+#~ msgstr "Grafi"
+
+#~ msgid "Other.."
+#~ msgstr "Drugo ..."
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB\n"
+#~ "1 MiB\n"
+#~ "2 MiB\n"
+#~ "4 MiB\n"
+#~ "8 MiB\n"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB\n"
+#~ "1 MiB\n"
+#~ "2 MiB\n"
+#~ "4 MiB\n"
+#~ "8 MiB\n"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Za nadaljevanje vnesite geslo</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge je zavarovan z geslom!</big></b>"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Torrent vsebuje %i datotek"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s ni veljaven naslov URL."
+
+#~ msgid "Downloading.."
+#~ msgstr "Prejemanje ..."
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Hitrost:</b>"
+
+#~ msgid "page 12"
+#~ msgstr "stran 12"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "You're running low on disk space:\n"
+#~ msgstr "Na disku vam zmanjkuje neporabljenega prostora:\n"
+
+#~ msgid "Low Free Space"
+#~ msgstr "Nizek neporabljen prostor"
+
+#~ msgid "of the disk is occupied."
+#~ msgstr "diska zasedenega."
+
+#~ msgid "Low Disk Space Warning"
+#~ msgstr "Opozorilo pri nizkem neporabljenem prostoru"
+
+#, python-format
+#~ msgid " %s%% ocupation in %s\n"
+#~ msgstr " %s%% zasedenost v %s\n"
+
+#~ msgid "Consider low when"
+#~ msgstr "Obravnavaj kot nizko, ko je"
+
+#~ msgid "<b>Free Space Checking</b>"
+#~ msgstr "<b>Preverjanje neporabljenega prostora</b>"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "sledilnik1.org\n"
+#~ "sledilnik2.com\n"
+#~ "to zaenkrat ne naredi Å¡e niÄesar ...\n"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Brez povezave ..."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Prejemanje ni uspelo : %s"
+
+#~ msgid "State"
+#~ msgstr "Stanje"
+
+#~ msgid "no label"
+#~ msgstr "brez oznake"
+
+#~ msgid "Community"
+#~ msgstr "Skupnost"
+
+#~ msgid "_Quit"
+#~ msgstr "_KonÄaj"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "Program je opredeljen kot prosta programska oprema; lahko ga razširjate "
+#~ "in/ali spreminjate pod pogoji dovoljenja GNU General Public License, kot ga "
+#~ "je objavila ustanova Free Software Foundation; razliÄice 3 ali (po želji) "
+#~ "katerekoli kasnejÅ¡e razliÄice. Program se razÅ¡irja v upanju, da bo "
+#~ "uporabniku koristen, vendar BREZ VSAKRÅ NE GARANCIJE; tudi brez posrednega "
+#~ "zagotovila JAMSTVA CENOVNE VREDNOSTI in PRIMERNOSTI ZA DOLOÄŒENO UPORABO. Za "
+#~ "veÄ podrobnosti si oglejte doloÄila dovoljenja GNU General Public License. "
+#~ "Kopijo tega dokumenta bi morali prejeti skupaj s programom, v kolikor pa je "
+#~ "niste, si dovoljenje poglejte na spletni strani "
+#~ "<http://www.gnu.org/licenses>. Kot posebna izjema dovoljenja s strani "
+#~ "nosilcev avtorskih pravic, je dovoljenje za povezovanje kode delov programa "
+#~ "s knjižnico OpenSSL. DoloÄilom dovoljenja GNU General Public License je "
+#~ "treba slediti v vseh pogledih in za celotno kodo, razen za dele kode, vezane "
+#~ "na knjižnico OpenSSL. V primeru, da spremenite datoteke, ki so omejene z "
+#~ "izjemnim dovoljenjem, lahko omejitev razÅ¡irite tudi na vaÅ¡o razliÄico "
+#~ "datotek, vendar pa tega niste dolžni narediti. V kolikor tega ne želite "
+#~ "narediti, izbriÅ¡ite izjavo o posebni izjemi dovoljenja iz vaÅ¡e razliÄice. ÄŒe "
+#~ "izbrišete izjavo o posebni izjemi dovoljenja iz vseh izvornih datotek "
+#~ "programa, potem izbrišite to izjavo tudi tukaj."
+
+#~ msgid "apply_max"
+#~ msgstr "uveljavi_najveÄ"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Napaka med nastavljanjem možnosti oznake"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "FAQ"
+#~ msgstr "FAQ"
+
+#~ msgid "Homepage"
+#~ msgstr "Spletna stran"
diff --git a/deluge/i18n/sr.po b/deluge/i18n/sr.po
new file mode 100644
index 0000000..67774b7
--- /dev/null
+++ b/deluge/i18n/sr.po
@@ -0,0 +1,4388 @@
+# Serbian translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-08-27 13:13+0000\n"
+"Last-Translator: Vladimir Lazic <vlazic@gmail.com>\n"
+"Language-Team: Serbian <sr@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Име домаћина:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Порт:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "КориÑничко имe:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Лозинка:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Од:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Омогућено"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Подешавања"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Изаберите фаÑциклу"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>МеÑто преузимања</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Ðајвећа брзина Ñлања:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Ðајвише веза:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Ðајвише меÑта за Ñлање:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Ðајвећа брзина преузимања:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Проток</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Прекини Ñејање код одноÑа:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Уклони код одноÑа"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "Врх"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Дно"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Ред</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "ПоÑтавке"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "Ограничење преузимања:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Ограничење Ñлања:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Ðктивни торенти:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Спора подешавања</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "ÐеиÑправна ознака, ваљани знаци:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "Празна ознака"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Ознака већ поÑтоји"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Ðепознака ознака"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Ðепознат торент"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Ознака"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Опције _ознака"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "_Уклони ознаку"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "_Додај ознаку"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Опције ознака"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Опције ознака</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Брзина Ñлања:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "Брзина преузимања:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Везе:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "МакÑимална подешавања по торенту:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "МакÑимум"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "ÐутоматÑки надгледани"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Примени подешавања реда:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Стави у ред"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "ПремеÑти завршене у:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Примени подешавања локације:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Локација"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "i>(1 линија по трекеру)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "ÐутоматÑки примени ознаку:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Трекери"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Додај ознаку"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Додај ознаку</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Име:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>КориÑтите површ Ñа Ñтране за додавање, измену и уклањање ознака. </i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Ознаке</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "РаÑпакуј у:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Ðаправи под-фаÑциклу за торент"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Ова опција ће да направи подфолдер Ñа именом торента у изабраном фолдеру за "
+"отпаковање и Ñтавити отпаковане фајлове тамо."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Опште</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Укључи Веб интерфејÑ"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "Укључи SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Порт за оÑлушкивање:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Подешавања</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP лиÑта (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "„SafePeer“ ТекÑÑ‚ (компреÑован)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian текÑÑ‚ (некомпреÑован)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "ÐеиÑправан вођа"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "ÐеиÑправан магични код"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "ÐеиÑправна верзија"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "ЛиÑта блокирања"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL(адреÑа):"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Дани"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Провери за нову лиÑту Ñваких:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Убаци блок лиÑту на покретању"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Скини фајл Ñа блок лиÑтом ако је неопходно и убаци фајл."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "Провери Преузимање и Убацивање"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Скини нову блок лиÑту и убаци је."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "ÐаÑилно Преузимање и Убацивање"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Блок лиÑта је ажурирана"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Опције</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Тип:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Датум:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Величина фајла:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<б>Информације</б>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Торент је преузет"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Торент је додат"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Изврши"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Догађај"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Ðаредба"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "Додај Команду"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "Команде"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Објава ОК"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Објава поÑлата"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Упозорeњe"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Грешка"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "ÐвганиÑтан"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "ОландÑка оÑтрва"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Ðлбанија"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Ðлжир"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Ðмеричка Самоа"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Ðндора"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Ðнгола"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Ðнгвила"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Ðнтартик"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Ðнтигва и Барбуда"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Ðргентина"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Јерменија"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Ðруба"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "ÐуÑтралија"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "ÐуÑтрија"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Ðзербејџан"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Бахами"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Бахреин"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "Бангладеш"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "БарбадоÑ"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "БелоруÑија"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Белгија"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Белизе"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Бенин"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Бермуди"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Бутан"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Боливија"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "БоÑна и Херцеговина"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Боцвана"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Бувеова оÑтрва"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Бразил"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "БританÑко ИндијÑка ОкеанÑка Територија"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Брунеј"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "БугарÑка"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Буркина ФаÑо"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Бурунди"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Камбоџа"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Камерун"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Канада"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "ЗеленортÑка оÑтрва"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "КајманÑка оÑтрва"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Централноафричка Република"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Чад"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Чиле"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Кина"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Божићна оÑтрва"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "КокоÑова оÑтрва"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Колумбија"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Комори"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Конго"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "ДемократÑка Република Конго"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Кукова оÑтрва"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "КоÑтарика"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "Обала Слоноваче"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "ХрватÑка"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Куба"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Кипар"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Чешка"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "ДанÑка"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Ðибути"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Доминика"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "ДоминиканÑка Република"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Еквадор"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Египат"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "Салвадор"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Екваторијална Гвинеја"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Еритреја"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "ЕÑтонија"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Етиопија"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "ФокландÑка оÑтрва (Малвини)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "ФарÑка оÑтрва"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Фиџи"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "ФинÑка"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Ван мреже"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Ðа вези"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Конектован"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "ÐдреÑа"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Клијент"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Ðапредак"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Брзина преузимања"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Брзина Ñлања"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Торент"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " торенти у реду"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " торент у реду"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Ðеограничено"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "Ðктивирано"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "ОÑтало..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Преуз:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Слањ:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Доле"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Горе:"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "ПоÑтави највећу брзину преузимања"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "ПоÑтави највећу брзину Ñлања"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Завршен торент"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Овај е-маил је да Ð²Ð°Ñ Ð¾Ð±Ð°Ð²ÐµÑтимо да је Deluge завршио Ñа преузимањем "
+"%(name)s , што укључује %(num_files)i датотека.\n"
+"Да биÑте преÑтали да примате ова обавештења, проÑто иÑкључите е-маил "
+"обавештеља у Deluge подешавањима.\n"
+"Хвала вам,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Преузимања"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Мрежа"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "ПропуÑни опÑег"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Сучеље"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "ОÑтало"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Демон"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Додаци"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Додатак"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Одабери додатак"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Egg-ови додатака"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Име датотеке"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Величина"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "ÐеиÑправан фајл"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Дупли торент"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Ðе можеш да додаш иÑти торент два пута."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Ðе могу да поÑтавим приоритет фајла!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Изабери .torrent датотеку"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Торент фајлови"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Сви фајлови"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "ÐеиÑправни УРЛ"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "Преузимање неуÑпело."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Положај"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Пратилац"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Изаберите фајл"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Изаберите фолдер"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "Сачувај .torrent фајл"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Ðије повезан"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Везе"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "Преузимање"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Брзина Ñлања"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "Саобраћај протокола преузимање/Ñлање"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT чворови"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Ðема долазних веза!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "ПоÑтави број највише веза"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Торенти"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Ознаке"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Све"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Сејање"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Паузиран"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Провера"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "У ред чекања"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Ðишта"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Без ознаке"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Грешка код додавања хоÑта"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "ИÑкључи КлаÑични начин?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Изгледа да је Deluge демон Ð¿Ñ€Ð¾Ñ†ÐµÑ (deluged) је већ покренут.\n"
+"\n"
+"Мораћете или да зауÑтавите демон или да иÑкључите КлаÑични начин да "
+"наÑтавите."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Грешка у покретању Језгра"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"ДеÑила Ñе грешка код покретања главне компоненте која је потребна да Ñе "
+"покрене Deluge у клаÑичном начину.\n"
+"\n"
+"Моломо Ð²Ð°Ñ Ð´Ð° погледате детаље иÑпод за више информација."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Пошти Ñе деÑила грешка код покретања КлаÑичног начина да ли би Ñте желели да "
+"наÑтавите тако што ћете га иÑкључити?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Грешка код покретања демона"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"ДеÑила Ñе грешка код покретања демон процеÑа. Покушајте да га покренете из "
+"конзоле да видите да ли поÑтоји нека грешка."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Укључено"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "ИÑкључено"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "ПоÑтави неограничено"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Изаберите директоријум у који ће датотеке бити померене"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "ПоÑтави највише меÑта за Ñлање"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Приоритет"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Детаљи:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Ðазив"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Преузето"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "ПоÑлато"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Сејачи:"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Процењено време"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "ОдноÑ"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "ДоÑÑ‚"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Додато"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Датотека"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "Дод_ај торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "Ур_еди"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Преглед"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "Палета _алата"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Колоне"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "П_омоћ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "ЧеÑто поÑтављана питања"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Додај торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Додај торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Уклони торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Уклони торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Паузирај означене торенте"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Паузирај"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "ÐаÑтави означене торенте"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "ÐаÑтави"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Промовиши торент у реду чекања"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Помери горе"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Деградирај торент у реду чекања"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Помери доле"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Подешавања"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Управник веза"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "_Рашири Ñве"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "Ðе п_реузимај"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Ðормалан приоритет"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_ВиÑок приоритет"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "Ðајви_ши приоритет"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Стање пратиоца:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>ДоÑтупноÑÑ‚:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Сејачи:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Делова:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Процењено време:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Следећа објава:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>ÐžÐ´Ð½Ð¾Ñ Ð´ÐµÑ™ÐµÑšÐ°:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>ПоÑлато:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Преузето:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>Додато дана:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b># датотека:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Пратилац:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Укупна величина:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Ðазив:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Путања:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>СтатуÑ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Детаљи"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "Дато_теке"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Приоритет на почетне/завршне"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "Ур_еди пратиоце"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Опције"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Уклони торент?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+"<big><b>ЈеÑте ли Ñигурни да желите да уклоните означени торент?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>Придружени .torrent ће бити обриÑан!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Преузети подаци ће бити бриÑани!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Уклони означени торент"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Ðово издање"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>ДоÑтупно је ново издање!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>ДоÑтупна верзија:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Тренутна верзија:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Ðе приказуј овај дијалог убудуће"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "Означи _Ñве"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Паузирај Ñве"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "ÐаÑтави означене торенте."
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "ÐаÑта_ви Ñве"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Додај торенте"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "Укл_они"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Торенти</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "Да_тотеке"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Потпуна"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "Компактно"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Ðлокација</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Ðајвећа брз. Ñкидања:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Ðајвећа брз. Ñлања:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "Додај у _паузираном Ñтању"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "Ставља приоритет на почетне/завршне делове"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Врати на подразумевано"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Примени на Ñве"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "Додај URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>Са URL-а</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Пратиоци:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Ðаправи торент"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Ðаправи торент</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "ФаÑ_цикла"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "Уда_љена путања"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Датотеке</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Ðутор:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Коментари:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Величина дела:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "ПоÑтави приватну ознаку"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Додај овај торент у ÑеÑију"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "УнеÑи удаљену путању"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Удаљена путања</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Путања:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Стварање торента"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "Сними .torrent као"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>Сними .torrent датотеку</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Торенти у реду"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Додај торенте из реда</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "ÐутоматÑки додај торенте при прикључењу"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "ознака"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Додај домаћина"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Управник веза</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "Пок_рени локалног демона"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "ÐутоматÑки Ñе повежи на одабрани хоÑÑ‚ при покретању"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "ÐутоматÑки покрени localhost ако је потребно"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Ðе показуј овај дијалог при покретању"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Преузимања</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "ÐутоматÑки додај .торенте из:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Преузми у:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "Копирај .торент датотеке у:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>ФаÑцикле</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "КориÑти пуну алокацију"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Пуна алокација унапред одваја проÑтор који је потребан за торент и Ñпречава "
+"фрагментацију диÑка"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "КориÑти компактну алокацију"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Компактна алокација одваја проÑтор Ñамо кад затреба"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Стави приоритет на почетне и завршне делове торента"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Стави приоритет на прве и задње делове датотека у торенту"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>Мрежа</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "КориÑти наÑумичне портове"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge ће аутоматÑки ваки пут изабрати различит прикључак."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Ðктиван порт:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "За:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Провери активан порт"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Долазни портови</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Одлазни портови</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "ÐÐТ-ПМП"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "ÐÐТ протокол за мапирање портова"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "Размена Ñадруга"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "РаÑподељена хеш таблица може побољшати број активних конекција."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Мрежни додаци</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Долазни:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Ðиво:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Захтевано\n"
+"Омогућено\n"
+"ИÑкључено"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"Руковање\n"
+"Пун ток\n"
+"Оба"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Одлазни:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Шифрирај Ñав ток"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Шифровање</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>Проток</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Ðајвећи број покушаја повезивања у Ñекунди:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Ðајвише полуотворених веза:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"МакÑимална брзина Ñлања за Ñве торенте. ВредноÑÑ‚ -1 значи неограничено."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "МакÑимална брзина Ñлања (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "МакÑимални дозвољени број веза. ВредноÑÑ‚ -1 значи неограничено."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "МакÑимални број веза:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"МакÑималан број Ñлотова за Ñлање за Ñве торенте. Ставите -1 за неограничено."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Ðајвише Ñлотова за Ñлање:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"МакÑимална брзина преузимања за Ñве торенте. ВредноÑÑ‚ -1 значи неограничено."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "МакÑимална брзина преузимања (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Занемари ограничења на локалној мрежи"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Глобално заузеће протока</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"Ðајвећи број Ñлотова за Ñлање по торенту. За неограничено поÑтавите на -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "Ðајвећи број веза по торенту. За неограничено поÑтавите на -1."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Заузеће протока по торенту</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Сучеље</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "Омогући"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"КлаÑични мод ће Ñакрити већину функционалноÑти демона и учиниће да Deluge "
+"одаје утиÑак једне апликације. КориÑтите ово ако не желите да иÑкориÑтите "
+"предноÑти покретања Deluge-а као демона. Ðеопходно је да поново покренете "
+"Deluge да би ово подешавање Ñтупи на Ñнагу."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>КлаÑични мод</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Прикажи брзину ÑеÑије у наÑловној линији"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Главни прозор</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Увек показуј"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Доведи дијалог у фокуÑ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Дијалог за додавање торената</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Омогући икону у обавештајној зони"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Смањуј у обавештајну зону панела при затварању"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Покрени у обавештајној зони"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Заштити лозинком обавештајну зону"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>Обавештајна зона</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>ОÑтало</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Будите обавештени о новим верзијама"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge ће проверити наше Ñервере и јавити Вам ако је објављена нова верзија"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>ОÑвежења</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Помозите нам да унапредимо Deluge тако што ћете нам поÑлати верзије Python-"
+"а, PyGTK-а и оперативног ÑиÑтема и тип процеÑора. Ðикакви други подаци неће "
+"бити поÑлати."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Да, молим те шаљи анонимне ÑтатиÑтике."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>СиÑтемÑке информације</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>Демон</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Порт демона:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Порт</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Дозволи удаљене везе"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Везе</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Периодично проверавај Ñајт за нове верзије"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>ОÑтало</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Ред</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Стави нове торенте на почетак реда"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Укупно активних Ñејања:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Укупно активно:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "Укупно активних преузимања:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "Ðе број Ñпоре торенте"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>Ðктивни торенти</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Ограничење одноÑа дељења:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "ÐžÐ´Ð½Ð¾Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð° Ñејања:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Време Ñејања (m):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Прекини Ñејање када Ð¾Ð´Ð½Ð¾Ñ Ð´ÐµÑ™ÐµÑšÐ° доÑтигне:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Уклони торент када Ð¾Ð´Ð½Ð¾Ñ Ð´ÐµÑ™ÐµÐ½Ð° доÑтигне"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Сејање</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "ХоÑÑ‚:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Ðиједно\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 Ñа ауторизацијом\n"
+"HTTP\n"
+"HTTP Ñа ауторизацијом"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Пратилац</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Додаци</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Верзија:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Страна пројекта:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "_ИнÑталирај додатак"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "П_регледај додатке"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Прикажи Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_ÐаÑтави Ñве"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "Ограничење брзине п_реузимања"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "Ограничење брзине _Ñлања"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Изађи и угаÑи демона"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "_Отвори фаÑциклу"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "ÐаÑта_ви"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "Опц_ије"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Ред чекања"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_ОÑвежи пратиоца"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "Уклони то_рент"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "ПремеÑти _Ñкладиште"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Ограничење меÑта за Ñлање"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Уклони означени торент?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Ðко уклоните податке, биће трајно изгубљени."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Уреди пратиоце"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Уреди пратиоце</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Додај пратиоца"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Додај пратиоце</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "Уреди пратиоца"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>Уреди пратиоца</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Пратилац:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "Уклони Ñа по_дацима"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Уклони _торент"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "ПремеÑти Ñкладиште"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>ПремеÑти Ñкладиште</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Одредиште:"
+
+#~ msgid "Availability"
+#~ msgstr "ДоÑтупноÑÑ‚"
+
+#~ msgid "Share Ratio"
+#~ msgstr "ÐžÐ´Ð½Ð¾Ñ Ð´ÐµÑ™ÐµÑšÐ°"
+
+#~ msgid "Details"
+#~ msgstr "Детаљи"
+
+#~ msgid "Files"
+#~ msgstr "Датотеке"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Брзина:</b>"
+
+#~ msgid "Select All"
+#~ msgstr "Одабери Ñве"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Server"
+#~ msgstr "Сервер"
+
+#~ msgid "Username"
+#~ msgstr "КориÑничко име"
+
+#~ msgid "Password"
+#~ msgstr "Лозинка"
+
+#~ msgid "Port"
+#~ msgstr "Порт"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge је закључан"
+
+#~ msgid "Unknown"
+#~ msgstr "Ðепознато"
+
+#~ msgid "Graph"
+#~ msgstr "Графикон"
+
+#~ msgid "Filters"
+#~ msgstr "Филтери"
+
+#~ msgid "Remove"
+#~ msgstr "Уклони"
+
+#~ msgid "Start"
+#~ msgstr "Покрет"
+
+#~ msgid "Add"
+#~ msgstr "Додај"
+
+#~ msgid "Pieces"
+#~ msgstr "Парчићи"
+
+#~ msgid "Speed"
+#~ msgstr "Брзина"
+
+#~ msgid "Upload"
+#~ msgstr "Слања"
+
+#~ msgid "Clear"
+#~ msgstr "ОчиÑти"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Обриши .торент датотеку"
+
+#~ msgid "_Quit"
+#~ msgstr "_Изађи"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge је заштићен лозинком.\n"
+#~ "Да биÑте приказали прозорче Deluge-а, молимо Ð²Ð°Ñ ÑƒÐºÑƒÑ†Ð°Ñ˜Ñ‚Ðµ вашу лозинку"
+
+#~ msgid "Download"
+#~ msgstr "Preuzmi"
+
+#~ msgid "New Password"
+#~ msgstr "Ðова лозинка"
+
+#~ msgid "Template"
+#~ msgstr "Шаблон"
+
+#~ msgid "Image Only"
+#~ msgstr "Само Ñлика"
+
+#~ msgid "Text Only"
+#~ msgstr "Само текÑÑ‚"
+
+#~ msgid "Text and image"
+#~ msgstr "ТекÑÑ‚ и Ñлика"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "Одаберите УРЛ или торент, али не оба"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "оÑвежавање мора бити > 0"
+
+#~ msgid "Eta"
+#~ msgstr "Процена"
+
+#~ msgid "Ava"
+#~ msgstr "ДоÑÑ‚"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "Обриши преузете датотеке."
+
+#~ msgid "Disable"
+#~ msgstr "Онемогући"
+
+#~ msgid "Config"
+#~ msgstr "Подешавање"
+
+#~ msgid "Login"
+#~ msgstr "Пријава"
+
+#~ msgid "Set"
+#~ msgstr "ПоÑтави"
+
+#~ msgid "Submit"
+#~ msgstr "Пошаљи"
+
+#~ msgid "Total Size"
+#~ msgstr "Укупна величина"
+
+#~ msgid "Torrent list"
+#~ msgstr "СпиÑак торената"
+
+#~ msgid "Resume all"
+#~ msgstr "ÐаÑтави Ñве"
+
+#~ msgid "Set Timeout"
+#~ msgstr "ПоÑтави иÑтек"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€Ð°Ñ‚Ð¸Ð¾Ñ†Ð°"
+
+#~ msgid "From"
+#~ msgstr "Од"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "ÐутоматÑко оÑвежавање"
+
+#~ msgid "Logout"
+#~ msgstr "Одјава"
+
+#~ msgid "translate something"
+#~ msgstr "преведите нешто"
+
+#~ msgid "About"
+#~ msgstr "О програму"
+
+#~ msgid "# Of Files"
+#~ msgstr "# датотека"
+
+#~ msgid "Next Announce"
+#~ msgstr "Следећа објава"
+
+#~ msgid "Disabled"
+#~ msgstr "Онемогућено"
+
+#~ msgid "Url"
+#~ msgstr "Урл"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "ОÑвежи Ñтрану Ñваких:"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Пошаљи торент"
+
+#~ msgid "Reannounce"
+#~ msgstr "Поново објави"
+
+#~ msgid "seconds"
+#~ msgstr "Ñекунди"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Погрешна лозинка, покушајте поново"
+
+#~ msgid "Pause all"
+#~ msgstr "Паузирај Ñве"
+
+#~ msgid "General"
+#~ msgstr "Опште"
+
+#~ msgid "File"
+#~ msgstr "Датотека"
+
+#~ msgid "Label torrent"
+#~ msgstr "Означи торент"
+
+#~ msgid "Restart"
+#~ msgstr "Поново покрени"
+
+#~ msgid "Move"
+#~ msgstr "ПремеÑти"
+
+#~ msgid "Save"
+#~ msgstr "Сачувај"
+
+#~ msgid "Move torrent"
+#~ msgstr "ПремеÑти торент"
+
+#~ msgid "Stop"
+#~ msgstr "ЗауÑтави"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Грешка у опцијама торента"
+
+#~ msgid "No data"
+#~ msgstr "Ðема података"
+
+#~ msgid "Ports"
+#~ msgstr "Портови"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Додај у паузираном Ñтању"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "ПовиÑи приоритет првих и поÑледњих делова"
+
+#~ msgid "Random"
+#~ msgstr "ÐаÑумично"
+
+#~ msgid "Encryption"
+#~ msgstr "Шифровање"
+
+#~ msgid "Forced"
+#~ msgstr "Захтевана"
+
+#~ msgid "Handshake"
+#~ msgstr "Руковање"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Ðајвише полуотворених веза"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Ðајвише покушаја повезивања у Ñекунди"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Ðајвећа брзина преузимања (Kib/s)"
+
+#~ msgid "Inbound"
+#~ msgstr "Долазна"
+
+#~ msgid "Either"
+#~ msgstr "Оба"
+
+#~ msgid "Level"
+#~ msgstr "Ðиво"
+
+#~ msgid "Outbound"
+#~ msgstr "Одлазна"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Ðеограничено"
+
+#~ msgid "Global"
+#~ msgstr "Опште"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Ðајвећа брзина Ñлања (Kib/s)"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr ".torrent датотеке Ñними у"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "ÐутоматÑки додај фаÑциклу"
+
+#~ msgid "Per Torrent"
+#~ msgstr "По торенту"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Чувај Ñва преузимања у"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Укупно активних торената"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = неограничено"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Уклони торент кад је поÑтигнут одноÑ"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Прекини Ñејање када Ð¾Ð´Ð½Ð¾Ñ Ð´Ð¾Ñтигне"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Укупно активних Ñлања"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Укупно активних преузимања"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Омогући прикључке"
+
+#~ msgid "Button style"
+#~ msgstr "Стил дугмади"
+
+#~ msgid "Current Password"
+#~ msgstr "Тренутна лозинка"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Ðова лозинка (потврда)"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Стара лозинка није иÑправка"
+
+#~ msgid "Yes"
+#~ msgstr "Да"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "Ðова лозинка није иÑта као и (потврда)"
+
+#~ msgid "Move To"
+#~ msgstr "ПремеÑти у"
+
+#~ msgid "Error in Path."
+#~ msgstr "Грешка у путањи."
+
+#~ msgid "These changes were saved"
+#~ msgstr "Ове промене Ñу Ñачуване"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "ИÑправите горње грешке и покушајте поново"
+
+#~ msgid "No"
+#~ msgstr "Ðе"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "УнеÑите ÑпиÑак вредноÑти."
+
+#~ msgid "This field is required."
+#~ msgstr "Ово поље је обавезно."
+
+#~ msgid "Connect"
+#~ msgstr "Повежи Ñе"
+
+#~ msgid "Connected to"
+#~ msgstr "Повезан на"
+
+#~ msgid "Admin"
+#~ msgstr "ÐдминиÑтратор"
+
+#~ msgid "False"
+#~ msgstr "Ðетачно"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : лиÑта торента"
+
+#~ msgid "Queue Position"
+#~ msgstr "МеÑто у реду"
+
+#~ msgid "Download Location"
+#~ msgstr "Локација на коју Ñе преузима"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "Ðајвише веза"
+
+#~ msgid "To"
+#~ msgstr "За"
+
+#~ msgid "Statistics"
+#~ msgstr "СтатиÑтика"
+
+#~ msgid "Delete"
+#~ msgstr "Обриши"
+
+#~ msgid "Refresh status"
+#~ msgstr "ОÑвежи ÑтатуÑ"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "ИÑтекло време (у Ñекундама)"
+
+#~ msgid "Inactive"
+#~ msgstr "Ðеактиван"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Ова порука Ð²Ð°Ñ Ð¾Ð±Ð°Ð²ÐµÑˆÑ‚Ð°Ð²Ð° да је Deluge завршио преузимање %s, који Ñадржи %i "
+#~ "датотека.\n"
+#~ "Да би иÑкључили ова упозорења Ñамо иÑкључите обавештавање електронÑком "
+#~ "поштом у подешавањима Deluge-а.\n"
+#~ "\n"
+#~ "Хвала,\n"
+#~ "Deluge"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Преузимам %.2f%%"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "Број покушаја преузимања"
+
+#~ msgid "max_download_speed"
+#~ msgstr "max_download_speed"
+
+#~ msgid "Do not download"
+#~ msgstr "Ðе преузимај"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... и обриши преузете датотеке"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "max_upload_slots"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Ðајвише меÑта за Ñлање"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "max_upload_speed"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Ограничење меÑта за Ñлање"
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Пошаљите иÑправну Ñлику. Датотека коју Ñте поÑлали или није Ñлика или је "
+#~ "неиÑправна."
+
+#~ msgid "Error setting label options"
+#~ msgstr "Грешка при поÑтављању ознаке"
+
+#~ msgid "no label"
+#~ msgstr "без ознаке"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "ово још увек не ради ништа..\n"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Додај торенте</b></big>"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "Community"
+#~ msgstr "Заједница"
+
+#~ msgid "apply_queue"
+#~ msgstr "apply_queue"
+
+#~ msgid "apply_max"
+#~ msgstr "apply_max"
+
+#~ msgid "max_connections"
+#~ msgstr "max_connections"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "is_auto_managed"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "stop_at_ratio"
+
+#~ msgid "stop_ratio"
+#~ msgstr "stop_ratio"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "remove_at_ratio"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "apply_move_completed"
+
+#~ msgid "move_completed"
+#~ msgstr "move_completed"
+
+#~ msgid "move_completed_path"
+#~ msgstr "move_completed_path"
+
+#~ msgid "auto_add"
+#~ msgstr "auto_add"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Радови у току.."
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "auto_add_trackers"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Провери Ñваких (дана)"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "Овај програм је Ñлободни Ñофтвер; можете га раÑподелити и/или мењати под "
+#~ "одредбама ГÐУ-ове опште јавне лиценце, каква је објављена од Ñтране "
+#~ "Задужбине за Ñлободни Ñофтвер; било верзије 3 Лиценце, или (по вашем избору) "
+#~ "било које Ñледеће верзије. Овај програм Ñе раÑподељује у нади да ће бити "
+#~ "кориÑтан, али БЕЗ ИКÐКВЕ ГÐРÐÐЦИЈЕ; без чак и имплицитне гаранције "
+#~ "КОМЕРЦИЈÐЛÐЕ ВРЕДÐОСТИ или ПРИКЛÐДÐОСТИ ЗРОДРЕЂЕÐУ СВРХУ. За више детаља "
+#~ "погледајте ГÐУ-ову општу јавну лиценцу. Уз овај програм би требало да "
+#~ "примите и примерак ГÐУ-ове опште јавне лиценце; ако то није Ñлучај, "
+#~ "погледајте <http://www.gnu.org/licenses>."
+
+#~ msgid "State"
+#~ msgstr "Стање"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Торент је превазишао Ð¾Ð´Ð½Ð¾Ñ Ð·Ð°ÑƒÑтављања."
+
+#~ msgid "Enter a whole number."
+#~ msgstr "УнеÑите цео број."
+
+#~ msgid "Ok"
+#~ msgstr "У реду"
+
+#~ msgid "Queue Top"
+#~ msgstr "Ðа почетак реда"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Ðа крај реда"
+
+#~ msgid "page 8"
+#~ msgstr "page 8"
+
+#~ msgid "page 11"
+#~ msgstr "page 11"
+
+#~ msgid "page 10"
+#~ msgstr "page 10"
+
+#~ msgid "page 12"
+#~ msgstr "page 12"
+
+#~ msgid "page 6"
+#~ msgstr "page 6"
+
+#~ msgid "FAQ"
+#~ msgstr "ЧПП"
+
+#~ msgid "BlockList"
+#~ msgstr "СпиÑак блокирања"
+
+#~ msgid "Import Now"
+#~ msgstr "Увези Ñад"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Увези при покретању демона"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Блокирани опÑези: %s"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "Увозим %s"
+
+#~ msgid "Other.."
+#~ msgstr "ОÑтало.."
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "Укључујем %i датотека"
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Преузимање %s неуÑпело."
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s није иÑправни УРЛ."
+
+#~ msgid "Downloading.."
+#~ msgstr "Преузимам..."
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>УнеÑи Ñвоју лозинку да наÑтавиш</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge је заштићен лозинком!</big></b>"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Ðије повезан.."
diff --git a/deluge/i18n/sv.po b/deluge/i18n/sv.po
new file mode 100644
index 0000000..e17523e
--- /dev/null
+++ b/deluge/i18n/sv.po
@@ -0,0 +1,6635 @@
+# translation of deluge.po to Swedish
+# translation of PACKAGE.
+# Copyright (C) 2006 - 2017 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Daniel Nylander <po@danielnylander.se>, 2007.
+# Josef Andersson <l10nl18nsweja@gmail.com>, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2019-03-23 13:27+0000\n"
+"Last-Translator: Jonatan Nyberg <Unknown>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+"Language: sv\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr "B"
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr "KiB"
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr "MiB"
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr "GiB"
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr "TiB"
+
+#: deluge/common.py:410
+msgid "K"
+msgstr "K"
+
+#: deluge/common.py:411
+msgid "M"
+msgstr "M"
+
+#: deluge/common.py:412
+msgid "G"
+msgstr "G"
+
+#: deluge/common.py:413
+msgid "T"
+msgstr "T"
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr "K/s"
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr "M/s"
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr "MiB/s"
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr "G/s"
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr "GiB/s"
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr "T/s"
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr "TiB/s"
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr "Vanliga alternativ"
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr "Skriv ut detta hjälpmeddelande"
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr "Skriv ut versionsinformation"
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr "Ställ in katalogsökväg för config"
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr "Utmatning till angiven loggfil istället för stdout"
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr "Ange loggnivå (ingen, fel, varning, info, felsök)"
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+"Aktivera loggfilrotation, med valfri högsta loggfilstorlek, standard: "
+"%(const)s (logfilrotationsräkning är 5)"
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr "Avsluta loggningsutmatningen (samma som `--loglevel none`)"
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+"Profil %(prog)s med cProfile. Utmatningar till stdout om inte ett filnamn är "
+"angivet"
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr "Processkontrollalternativ"
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr "Pidfile för att lagra process ID"
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr "Demonisera inte (förgrena) denna process"
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr "Byt till den här användaren vid uppstart (kräver root)"
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr "Byt till den här gruppen vid uppstart (kräver root)"
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr "Demon alternativ"
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr "IP-adress för att lyssna på användargränssnittsanslutningar"
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr "Port för att lyssna på användargränssnittsanslutningar"
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr "IP-adress för att lyssna på BitTorrent-anslutningar"
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr "Konfigurer nycklarna för att avmodifieras av `set_config` RPC"
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr "Alla"
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr "Aktiv"
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr "Allokerar"
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr "Kontrollerar"
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr "Hämtar"
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr "Distribuerar"
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr "Pausad"
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr "Köad"
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr "Fel"
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr "Namn"
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr "Förlopp"
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr "Tillstånd"
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr "Storlek"
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr "Hämtat"
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr "Skickat"
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr "Återstående"
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr "Förhållande"
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr "Hämtningshastighet"
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr "Sändningshastighet"
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr "Hämtningsgräns"
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr "Sändningsgräns"
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr "Max. antal anslutningar"
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr "Högst antal sändningsplatser"
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr "Noder"
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr "Distributörer"
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr "Tillgänglighet"
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr "Distributörer:Noder"
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr "Tillagd"
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr "Bevakare"
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr "Hämtningsmapp"
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr "Distributionstid"
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr "Aktiv tid"
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr "Senaste aktivitet"
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr "Slutförd tid"
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr "Senast sedd"
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr "Slutförd"
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr "Tid kvar"
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr "Delad"
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr "Prioritera första/sista"
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr "Sekventiell hämtning"
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr "Automatiskt hanterad"
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr "Stoppa vid förhållandet"
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr "Stoppa vid förhållande"
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr "Ta bort vid förhållandet"
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr "Flytta den när den är klar"
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr "Flytta färdig till sökväg"
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr "Flytta färdiga till sökväg"
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr "Ägare"
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr "Delar"
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr "Distributiörsrankning"
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr "Varning"
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr "Annonsering OK"
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr "Annonsering skickad"
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr "Gränssnitt"
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr "Hämtningar"
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr "Bandbredd"
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr "Kö"
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr "Nätverk"
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr "Proxy"
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr "Buffert"
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr "Övriga"
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr "Demon"
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr "Insticksmoduler"
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr "LÃ¥g"
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr "Normal"
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr "Hög"
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+"Deluge kan inte hitta körbara \"deluged\", kontrollera att deluged-paketet "
+"är installerat, eller lagt till i din SÖKVÄG."
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr "Afghanistan"
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr "Ã…land"
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr "Albanien"
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr "Algeriet"
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr "Amerikanska Samoa"
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr "Antarktis"
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr "Antigua och Barbuda"
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr "Argentina"
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr "Armenien"
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr "Australien"
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr "Österrike"
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr "Azerbajdzjan"
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr "Bahamas"
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr "Bahrain"
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr "Bangladesh"
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr "Vitryssland"
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr "Belgien"
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr "Bermuda"
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr "Bhutan"
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr "Bolivia"
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnien Hercegovina"
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr "Bouvetön"
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr "Brasilien"
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr "Brittiska territoriet i Indiska oceanen"
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr "Brunei"
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr "Bulgarien"
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr "Kambodja"
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr "Kamerun"
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr "Kanada"
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr "Kap Verde"
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr "Caymanöarna"
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr "Centralafrikanska republiken"
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr "Tchad"
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr "Chile"
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr "Kina"
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr "Julön"
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr "Kokosöarna"
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr "Colombia"
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr "Komorerna"
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr "Kongo"
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr "Kongo, demokratiska republiken"
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr "Cooköarna"
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr "Costa Rica"
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr "Elfenbenskusten"
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr "Kroatien"
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr "Kuba"
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr "Cypern"
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr "Tjeckien"
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr "Danmark"
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr "Djibouti"
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr "Samväldet Dominica"
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr "Dominikanska Republiken"
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr "Ecuador"
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr "Egypten"
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr "Ekvatorialguinea"
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr "Eritrea"
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr "Estland"
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr "Etiopien"
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falklandsöarna"
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr "Färöarna"
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr "Fiji"
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr "Finland"
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr "Frankrike"
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr "Franska Guyana"
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr "Franska Polynesien"
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr "Franska sydterritorierna"
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr "Gambia"
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr "Georgien"
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr "Tyskland"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Ghana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Gibraltar"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Grekland"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Grönland"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadeloupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Guinea"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Guinea-Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guyana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Heard- och McDonaldsöarna"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Heliga stolen (Vatikanstaten)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Ungern"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Island"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "Indien"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Indonesien"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Iran"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Irak"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Irland"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Isle of Man"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Israel"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Italien"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaica"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japan"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Jordanien"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazakstan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenya"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Nordkorea"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Sydkorea"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuwait"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kirgizistan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Laos"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Lettland"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Libanon"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberia"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libyen"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Litauen"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Luxemburg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Makedonien"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagaskar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malawi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malaysia"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldiverna"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Marshallöarna"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinique"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Mauretanien"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Mexiko"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Mikronesiens federerade stater"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldavien"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monaco"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "Mongoliet"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "Montenegro"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Marocko"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambique"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Burma"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibia"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Holland"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Nederländska Antillerna"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Nya Kaledonien"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Nya Zeeland"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nicaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Niger"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nigeria"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Norfolköarna"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Norra Marianaöarna"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norge"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Oman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palestinska territoriet, ockuperade"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua Nya Guinea"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguay"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filippinerna"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Polen"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portugal"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Puerto Rico"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Qatar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Réunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Rumänien"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Ryssland"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Rwanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Saint-Barthélemy"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Saint Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Saint Christopher och Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Saint Lucia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Saint Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint Pierre och Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Saint Vincent och Grenadinerna"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "São Tomé och Príncipe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Saudiarabien"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Serbien"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "Seychellerna"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapore"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slovakien"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slovenien"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Salomonöarna"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somalia"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Sydafrika"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Sydgeorgien och Sydsandwichöarna"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Spanien"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Surinam"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard och Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Swaziland"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "Sverige"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "Schweiz"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Syrien"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr "Taiwan"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tadzjikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzania"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Thailand"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Östtimor"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad och Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunisien"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Turkiet"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Turkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Turks- och Caicosöarna"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukraina"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Förenade Arabemiraten"
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Storbritannien"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "USA"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Förenta staternas mindre öar i Oceanien och Västindien"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Uruguay"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Uzbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuela"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Brittiska Jungfruöarna"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Amerikanska Jungfruöarna"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis och Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Västsahara"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Jemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambia"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabwe"
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr "Användargränssnitt-alternativ"
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+"Ange standardgränssnittet som ska köras, när inget användargränssnitt är "
+"angivet"
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+"Alternativ UI att starta, med valfri ui args \n"
+" (standard användargränssnitt: *)"
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr "Webbserveralternativ"
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr "IP-adress för webbserver att lyssna på"
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr "Port för webbserver att lyssna på"
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr "Ange bassökvägen som användargränssnittet körs på"
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr "Tvinga webbservern att använda SSL"
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr "Tvinga webbservern att inaktivera SSL"
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr "Demon existerar inte"
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr "Demon är inte igång"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr "Filnamn"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr "Part"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr "Välj en fil"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr "Välj en mapp"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr "Spara .torrent-fil"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr "Torrenter"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr "Alla filer"
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr "Ange ditt lösenord för att visa Deluge…"
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr "Ange ditt lösenord för att avsluta Deluge…"
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr "_Tillämpa på vald"
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr "Copyright %(year_start)s-%(year_end)s Deluge Team"
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+"Ett icke-hierarkiskt-fildelningsprogram\n"
+"som använder bittorrentprotokollet."
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr "Klient:"
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr "Nuvarande utvecklare:"
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr "Tidigare utvecklare eller medarbetare:"
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+"Detta program är fri programvara; du kan ge ut det eller ändra programmet "
+"under villkoren i GNU General Public License som getts ut av Free Software "
+"Foundation; antingen version 3 av licensen, eller (om du så vill) en senare "
+"version. \n"
+"\n"
+"Detta program ges ut i hopp om att det ska vara användbart, men UTAN NÅGON "
+"GARANTI; utan ens den indirekta garantin om SÄLJBARHET eller LÄMPLIGHET FÖR "
+"ETT VISST ÄNDAMÅL. Se GNU General Public License för mer detaljer. \n"
+"\n"
+"Du ska ha fått en kopia av GNU General Public License med detta program; om "
+"inte, var god se <http://www.gnu.org/licenses>. \n"
+"\n"
+"Dessutom, som ett speciellt undantag, ger upphovsrättsägarna tillstånd att "
+"länka koden för delar av det här programmets OpenSSL-bibliotek. Du måste "
+"lyda GNU General Public License på alla sätt för all kod som använts förutom "
+"koden för OpenSSL. \n"
+"\n"
+"Om du modifierar filer med detta undantag, kan du utvidga undantaget till "
+"dina versioner av filerna, men du är inte tvungen att göra detta. Om du "
+"känner att du inte vill göra det, radera detta meddelande från din version. "
+"Om du raderar detta meddelande från alla källkodsfiler i programmet, kan du "
+"också radera det här."
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr "Server:"
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr "libtorrent:"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr "Lägg till torrenter (%d)"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+"Du kan inte lägga till samma torrent två gånger. %d torrenter var redan "
+"tillagda."
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr "Ogiltig fil"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr "Välj en .torrent-fil"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr "Ogiltig URL"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr "är inte en giltig URL."
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr "Hämtar…"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr "Hämtningen misslyckades"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr "Hämtningen misslyckades:"
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr "Detaljer:"
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr "Autentisera"
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr "A_nslut"
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr "Användarnamn:"
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr "Lösenord:"
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr "Redigera konto"
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr "Redigera befintligt konto"
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr "Nytt konto"
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr "Skapa nytt konto"
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr "Autentiseringsnivå:"
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr "Lösenordsskyddad"
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr "Övrigt…"
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr "Inte ansluten"
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr "Anslutningar (gräns)"
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr "Hämtningshastighet (gräns)"
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr "Sändningshastighet (gräns)"
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr "Protokolltrafik (ner:upp)"
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr "DHT-noder"
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr "Ledigt diskutrymme"
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr "Extern IP-adress"
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr "<b>IP</b> <small>%s</small>"
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr "inte tillgängligt"
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr "<b><small>Portproblem</small></b>"
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr "Inga inkommande anslutningar, kontrollera port vidarebefordran"
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr "Hastighetsbegränsning för hämtning"
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr "Ange högsta hämtningshastighet"
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr "Begränsning för sändningshastighet"
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr "Ange högsta sändningshastighet"
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr "Inkommande anslutningar"
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr "Ange högst antal inkommande anslutningar"
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr "Aldrig"
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr "Ja"
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr "Nej"
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr "Prioritet"
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr "_Alla"
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr "_Status"
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr "_Detaljer"
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr "Fi_ler"
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr "_Nodar"
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr "A_lternativ"
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr "_Bevakare"
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr "Inte ansluten…"
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr "Obegränsad"
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr "Nedåt"
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr "Uppåt"
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+"En Deluge-demon (deluged) körs redan.\n"
+"För att använda fristående läge, stoppa lokala demonen och starta om Deluge."
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+"Endast tunt klientläge är tillgängligt på grund av att libtorrent inte är "
+"installerat.\n"
+"För att använda fristående läge, installera libtorrent-paketet."
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+"Endast tunt klientläge är tillgängligt på grund av okänt importfel.\n"
+"För att använda fristående läge, se loggar för felinformation."
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr "Fortsätt i tunt klientläge?"
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr "Ändra användargränssnittsläge"
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr "Frånkopplad"
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr "Ansluten"
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr "Ansluten"
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr "Status"
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr "Värd"
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr "Version"
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr "_Stoppa demon"
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr "_Koppla från"
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr "Kunde inte starta demon!"
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+"Kontrollera om deluged paketet är installerat och loggar för ytterligare "
+"detaljer"
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr "Inkompatibel klient"
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+"Att automatiskt starta demonen lokalt är inte aktiverat. Se â€Alternativ†"
+"under â€Anslutningshanterarenâ€."
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr "Misslyckades att ansluta"
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr "Redigera värd"
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr "Fel vid tillägg av värd"
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr "Fel vid uppdatering av värd"
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr "Användarnamn"
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr "Nivå"
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr "Aktiverad"
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr "Insticksmodul"
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr "Observera."
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr "Du måste välja ett språk"
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+"Du måste starta om Deluges användargränssnitt för att ändringarna ska ta "
+"effekt."
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr "Växlar Deluge klientläge..."
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr "Vill du starta om för att använda %s läge?"
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr "Välj insticksmodul"
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr "Insticksmodulägg"
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr "Serverfel"
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr "Ett fel uppstod på servern"
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr "Fel då konto lades till"
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr "Autentisering misslyckades"
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr "Ett fel uppstod vid tilläggning av konto"
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr "Fel vid uppdatering av konto"
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr "Ett fel uppstod vid uppdatering av konto"
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr "Ta bort konto"
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+"Är du säker på att du vill ta bort kontot med användarnamnet "
+"\"%(username)s\"?"
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr "Fel vid borttagning av konto"
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr "Autentisering misslyckades"
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr "Ett fel uppstod vid borttagning av konto"
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr "Tillstånd"
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr "Bevakare"
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr "Ingen"
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr "Administratör"
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr "Etiketter"
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr "Ingen etikett"
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr "Ingen ägare"
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr "<i>Klientversion</i>"
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr " köade torrenter"
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr " torrent köad"
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr "Torrent delas med andra Deluge-användare, eller inte."
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr "Ta bort markerade torrenter?"
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr "Totalt %s markerade torrenter"
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr "Obegränsat"
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr "PÃ¥"
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr "Av"
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr "Inaktivera"
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr "Aktivera…"
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr "Sändningsplatser för nod"
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr "Ange högst antal sändningplatser"
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr "Sluta distribuera vid förhållande"
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr "Fel vid ändring av ägandeskap"
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr "Fel vid försök att ändra ägandeskap."
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr "Adress"
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr "Klient"
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr "GTK-alternativ"
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+"Lägg till en eller flera torrentfiler, torrentadresser eller magnet-URI till "
+"en aktuell Deluge GTK-förekomst"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr "Skapar torrent"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr "Köade torrenter"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr "Lägg till köade torrenter"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr "_Ta bort"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr "Lägg automatiskt till torrenter vid uppkoppling"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr "_Arkiv"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr "_Lägg till torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr "_Skapa torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr "Avsluta & _stäng av demon"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr "_Redigera"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr "_Uppkopplingshanterare"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr "_Visa"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr "_Verktygsfält"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr "_Sidopanel"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr "Status_fält"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr "_Flikar"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr "_Kolumner"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr "_Sök…"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr "S_idopanel"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr "Visa _noll träffar"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr "Visa _bevakare"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr "Visa _ägare"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr "_Hjälp"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr "_Webbplats"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr "_Vanliga frågor"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr "Vanliga frågor"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr "_Gemenskap"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr "Lägg till torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr "Lägg till torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr "Ta bort torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr "Ta bort torrent"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+"Filtrera torrenter efter namn.\n"
+"Detta kommer att filtrera torrenter efter aktuellt val i sidopanelen."
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr "Pausa valda torrenter"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr "Pausa"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr "Ã…teruppta valda torrenter"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr "Ã…teruppta"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr "Flytta torrent uppåt i kön"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr "Köa uppåt"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr "Flytta torrent nedåt i kön"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr "Köa nedåt"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr "Inställningar"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr "Anslutningshanterare"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr "Stäng"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr "Filter:"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr "Töm söktexten"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr "_Matcha skiftläge"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr "Tvingad"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr "Inaktiverad"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr "Handskakning"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr "Full ström"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr "Socks4"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr "Socks5"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr "Socks5 tillstånd"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr "HTTP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr "HTTP tillstånd"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr "I2P"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr "Självständig"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr "Det självständiga, fristående programmet"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr "Tunn klient"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr "Anslut till en Deluge-demon (deluged)"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr "Programläge"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr "Visa sessionshastighet i namnlisten"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr "Fokusera fönster när torrenter läggs till"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+"Delraden\n"
+"kommer att öka bandbredden som används mellan klienterna\n"
+"och demonen (tillämpas inte i självständigt läge)."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr "Visa delar i statusfliken"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr "Slutförda:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr "Hämtar:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr "Väntar:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr "Saknar:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr "Återställ färg till standard"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr "Färg på delar"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr "Huvudfönster"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr "Visa ikon i aktivitetsfältet"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr "Programindikator"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr "Aktivitetsfält"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr "Minimera till aktivitetsfältet vid stängning"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr "Starta minimerat till aktivitetsfält"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr "Lösenordsskydda aktivitetsfält"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr "Aktivitetsfält"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr "Avisera om nya utgåvor"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr "Uppdateringar"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr "Systemstandard"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr "<b>Språk</b>"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr "Flytta slutförda till:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr "Kopieria .torrentfiler till:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr "Radera kopia av torrentfilen vid borttagning"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr "Radera kopian av torrentfilen som skapades när torrenten tas bort"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr "Hämta till:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr "Hämtningsmappar"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Prioritera första och sista delarna av torrenten"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Prioritera första och sista delarna av filer i torrent"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr "Sekventiell hämtning"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+"Om aktiverad så kommer delväljaren att plocka delar i\n"
+"sekvens istället för de mest sällsynta först.\n"
+"\n"
+"Att aktivera sekventiell hämtning kommer att påverka del-\n"
+"distributionen negativt i svärmen. Det bör användas\n"
+"sparsamt."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr "Lägg till torrenter i pausat tillstånd"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr "Förallokera diskutrymme"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr "Förallokera diskutrymme för torrenterna"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr "Lägg till torrentalternativ"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr "Alltid synlig"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr "Låt dialog få fokus"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr "Lägg till torrentdialog"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr "Anslutningsförsök per sekund:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr "Halvöppna anslutningar:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "Högst antal tillåtna anslutningar. Ange -1 för obegränsat antal."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr "Anslutningar:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Högst antal sändningsplatser för alla torrenter. Ange -1 för obegränsat."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr "Sändningsplatser:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Högsta hämtningshastigheten för alla torrenter. Ange -1 för obegränsad."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr "Hämtningshastighet:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Högsta sändningshastigheten för alla torrenter. Ange -1 för obegränsad."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr "Sändningshastighet:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr "Ignorera begränsningar i lokalt nätverk"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr "Begränsa hastigheten för IP-overhead"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Om kryssad kommer estimerad TCP/IP-overhead att tas från frekvensgränserna "
+"för att undvika att gränserna överstigs med totala trafiken"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr "Global bandbreddsbegränsningar"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+"Högst antal sändningsplatser per torrent. Ange -1 för obegränsat antal."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "Högst antal anslutningar per torrent. Ange -1 för obegränsat antal."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr "Den högsta hämtningshastigheten per torrent. Ange -1 för obegränsad."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr "Högsta sändningshastighet per torrent. Ange -1 för obegränsad."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr "Bredbandsbegränsning per torrent"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr "Köa överst"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr "Nya torrenter"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr "Distribuerar:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr "Totalt:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr "Ignorera långsamma torrenter"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+"Torrenter som inte överför någon data räknas inte för hämtning/delning aktiv "
+"räkning."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr "Föredra delningstorrenter"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr "Ge preferens till delningstorrenter över hämtningstorrenter."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr "Aktiva torrenter"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr "Delningsförhållande:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr "Tidsförhållande:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr "Tid (m):"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr "Delningsrotation"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr "Pausa torrent"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr "Delningsförhållande uppnådd"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"IP-adressen till det gränssnitt som ska lyssna efter inkommande "
+"bittorrentanslutningar. Lämna fältet blankt för att använda standardvärdet."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr "Inkommande adress"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr "Slumpmässig"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr "Använder slumpmässiga portar i intervallet 49152 till 65525"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr "Aktiv port:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr "Testa aktiv port"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr "Inkommande port"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr "Från:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr "Till:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr "Utgående portar"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr "Utgående:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr "Inkommande:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr "Nivå:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr "Kryptering"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr "Universal Plug and Play"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT portmappningsprotokoll"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr "Distributörsutbyte"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr "Utbyter noder mellan klienter. (Inaktivering kräver omstart)"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Local Service Discovery hittar lokala noder på ditt nätverk."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Distribuerad hash-tabell kan förbättra mängden aktiva anslutningar."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr "Nod-TOS-byte:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr "Extra nätverksinställningar"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr "Värdnamn:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr "Proxyvärdnamn"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+"Värdnamn ska försökas lösas genom\n"
+"proxy istället för genom den lokala DNS-tjänsten"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr "Proxynoder"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr "Använd proxy för anslutningar gällande noder och webbdistribution."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr "Proxybevakare"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr "Tvinga proxy-användning"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr "Dölj klientidentitet"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+"Försök att gömma klientidentitet och använd endast proxy för inkommande "
+"anslutningar."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr "Tvinga proxy"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Buffertstorlek (16 KiB block):"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+"Antal sekunder från den senast sparade skrivningen till en del i "
+"skrivcachen, tills då den skrivs till hårddisken. Standard är 60 sekunder."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr "Buffertförfall (sekunder):"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr "Inställningar"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"Totalt antal 16 KiB block som skrivits till disk sedan denna session "
+"startades."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr "Block skrivna:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"Totalt antal skrivoperationer som utförts sedan denna session startades."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr "Skrivningar:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+"Förhållandet (block_skrivna - skrivningar) / block_skrivna representerar "
+"antalet sparade skrivoperationer per totala skrivoperationer, det vill säga, "
+"en typ av förhållande för cacheuppslagning av skrivcachen."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr "Träfförhållande för skrivbuffert:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr "Skriv"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Antal block som begärdes från bittorrent-motorn (från noder som servades "
+"från disk eller buffert."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr "Block lästa:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr "Antalet block som hämtades från buffert."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr "Lästräffar för block:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr "Träfförhållande för läsbuffert."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr "Träfförhållande för läsbuffert:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+"Totalt antal läsoperationer som utförts sedan denna session startades."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr "Läsningar:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr "Läs"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Antal 16 KiB block för närvarande i bufferten. Detta inkluderar både läs- "
+"och skrivbuffert."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr "Buffertstorlek:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr "Läsbuffertstorlek:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr "_Uppdatera"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Hjälp oss att förbättra Deluge genom att skicka oss information om din "
+"Pythonversion, PyGTK-version, OS- och processortyp. Absolut ingen annan "
+"information sänds."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr "Ja, sänd anonym statistik"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr "Systeminformation"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr "Plats:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Om Deluge inte kan hitta databasfilen på denna plats kommer Deluge att "
+"återgå till att använda DNS för att matcha nodernas land."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr "GeoIP-databas"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr "Demon-port:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr "Port"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr "Tillåt fjärranslutningar"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr "Anslutningar"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr "Kontrollera regelbundet webbplatsen efter uppdateringar"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr "Konton"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr "Version:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr "Upphovsman:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr "Webbplats:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr "Upphovsmannens e-postadress:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr "Info"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr "_Installera"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr "_Hitta fler klienter…"
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr "Ta bort markerad(e) torrent(er)?"
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr "Omfatta hämtade filer"
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr "(Detta är permanent!)"
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr "Lägg till nod"
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr "värdnamn:port"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr "Egenskaper"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr "Högst antal utfällningsrader"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr "<b>Allmänt</b>"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr "Visa sökväg"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr "Visa filväljaren"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr "Visa mappnamn"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr "Sökvägsväljartyp"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr "Aktivera automatisk komplettering"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr "Visa dolda filer"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr "Ange ny tangent"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+"Tryck ned denna tangent för ange nya tangentkortkommandon att starta "
+"automatisk komplettering"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr "Autokomplettera"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr "Spara sökväg"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr "Ctrl+S"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr "Ctrl+E"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr "Ctrl+R"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr "Ctrl+H"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr "Ctrl+D"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr "Redigera sökväg"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr "Ta bort sökväg"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr "Växla dolda filer"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr "Standardsökväg"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr "Snabbkommandon"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr "Välj en katalog"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr "Sparade sökvägar"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr "kolumn"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr "Öppna"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr "Lägg till"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr "Lägg till aktuellt inmatningsvärde i listan"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr "Redigera"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr "Redigera den markerade posten"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr "Ta bort"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr "Ta bort den valda posten"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr "Flytta den markerade posten uppåt"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr "Flytta den markerade posten nedåt"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr "Standard"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr "Ingen standardsökväg angiven"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr "Öppna egenskapsdialogen"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr "Lägg till Infohash"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr "Från Infohash"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr "Infohash:"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr "Bevakare:"
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr "Lägg till värddator"
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr "Flytta hämtningsmappen"
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr "Flytta hämtningsmappen för torrenterna."
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr "MÃ¥l:"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr "Ny utgåva"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr "_GÃ¥ till webbplats"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr "Ny utgåva tillgänglig!"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr "Tillgänglig version:"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr "Serverversion"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr "Aktuell version:"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr "Visa inte denna dialog i framtiden"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr "Hämtningshastighet:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr "Sändningshastighet:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr "Hämtat:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr "Skickat:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr "Distributörer:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr "Noder:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr "Tillgänglighet:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr "Distrubutörsrankning:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr "Beräknad ankomsttid:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr "Senaste överföring:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr "Aktiv tid:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr "Senast sedd:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr "Distributörstid:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr "Delar:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr "Namn:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr "Hämtningsmapp:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr "Tillagd:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr "Totalstorlek:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr "Totala antalet filer:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr "Hash:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr "Skapad av:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr "Kommentarer:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr "Ägare:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr "Flytta slutförda:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr "Sluta distribuera vid förhållande:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr "Ta bort vid förhållande"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr "Bandbreddsbegränsningar"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr "Aktuell bevakare:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr "Totalt antal bevakare:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr "Bevakarstatus:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr "Nästa annonsering:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr "Privat torrent:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr "_Redigera bevakare"
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr "Överst"
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr "Nederst"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr "Lägg till torrenter"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr "_URL"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr "Info_hash"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr "Flytta mappen för slutförda"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr "Lägg till i _pausat tillstånd"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr "Prioritera första/sista delarna"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr "Hoppa över filhashkontroll"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr "Förallokera diskutrymme"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr "Förallokera diskutrymmet för torrenterna"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr "Högsta hämtningshastighet"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr "Högsta sändningshastighet för torrent"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr "Högst antal torrentanslutningar"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr "Högst antal torrentsändningsplatser"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr "Tillämpa till alla"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr "Gå tillbaka till grundinställningar"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr "_Visa Deluge"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr "_Pausa session"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr "_Ã…teruppta session"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr "Hastighetsgräns för _hämtning"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr "Hastighetsgräns för _sändning"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr "Avsluta & stäng demon"
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr "Redigera bevakare"
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr "_Lägg till nod"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr "Lägg till nod efter IP-nummer"
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr "Redigera bevakare"
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr "Bevakare:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr "Ange fjärrsökväg"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr "Fjärrsökväg"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr "Sökväg:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr "32 KiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr "64 KiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr "128 KiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr "256 KiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr "512 KiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr "1 MiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr "2 MiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr "4 MiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr "8 MiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr "16 MiB"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr "Skapa torrent"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr "Ma_pp"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr "_Fjärrsökväg"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr "Filer"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr "Webbdistributioner"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr "Delstorlek:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr "Sätt privat flagga"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr "Lägg till denna torrent till sessionen"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr "Inställningar"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr "Spara .torrent som"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr "_Öppna hämtningsmappen"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr "_Pausa"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr "Ã…teruppta"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr "Ã…teruppta valda torrenter."
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr "_Inställningar"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr "_Kö"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr "_Uppdatera bevakare"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr "_Ta bort torrent"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr "_Tvinga återkontroll"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr "_Flytta hämtningsmappen"
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr "etikett"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr "Markera _alla"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr "_Pausa alla"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr "_Ã…teruppta alla"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr "_Kopplingsbegränsning"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr "Begränsning för sändnings_platser"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr "Sluta distribuera vid _förhållande"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr "_Automatiskt hanterad"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr "_Ändra ägarskap"
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr "Lägg till bevakare"
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr "Lägg till bevakare"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr "Lägg till URL"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr "Från webbadress"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr "Deluge demoner"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr "Automatisk anslutning till vald Daemon"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr "Starta automatiskt localhost demon (om det krävs)"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr "Dölj den här dialogrutan"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr "Uppstartsalternativ"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr "_Expandera alla"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr "Deluge arbetsgruppen"
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr "Deluge är en lätt, fri, plattformsoberoende BitTorrent-klient."
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+"Deluge innehåller de vanliga funktionerna för BitTorrent-klienter som "
+"protokollkryptering, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), "
+"UPnP, NAT-PMP, Proxy-stöd, webbdelning, globala och per torrent "
+"hastighetsgränser. Eftersom Deluge utnyttjar biblioteket libtorrent har den "
+"en omfattande lista över funktionerna."
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+"Deluge har utformats för att köras som både en vanlig fristående stationär "
+"applikation och som en klient-server. I tunt klientläge hanterar en Deluge-"
+"demon alla BitTorrent-aktiviteter som kan köras på huvudlösa maskiner med "
+"användargränssnitt som fjärransluts från någon annan plattform."
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr "Bittorrentklient"
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr "Deluge bittorrentklient"
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr "Hämta och dela filer över bittorrent"
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr "Konsolalternativ"
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+"Dessa demon-anslutningsalternativen kommer att användas för kommandon, eller "
+"om automatisk anslutning till konsolanvändargränssnitt är aktiverad."
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr "IP-adress för Deluge demon att ansluta till (standard: 127.0.0.1)"
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr "Port för Deluge demon att ansluta till (standard: 58846)"
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr "Användare för Deluge demon att använda när du ansluter"
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr "Lösenord för Deluge demon att använda när du ansluter"
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr "Konsolkommandon"
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr "Beskrivning"
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr "Följande konsolkommandon är tillgängliga:"
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr "Kommando"
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr "\"%s\" alias"
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+"Användning: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr "ett uttryck matchat mot torrent ids och torrentnamn"
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr "Ange värde för denna nyckel"
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr "Värde att ange"
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr "en eller flera nycklar separerade av mellanrum"
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr "Tar också bort torrentdata"
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr "Lista de matchande torrenterna utan att ta bort."
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr "En eller flera torrent-id"
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr "Bekräfta med -c för att ta bort de listade torrenterna (antal: %d)"
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr "Användning: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+"En eller flera torrent ids. Använd \"*\" för att återuppta alla torrenter"
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+"En eller flera torrent ids. Använd \"*\" för att pausa alla torrenter"
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr "En eller flera torrentfiler, webbadresser eller magnet-URI-filer"
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr "Listar tillgängliga insticksmoduler"
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr "Visar aktiverade insticksmoduler"
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr "Aktiverar en insticksmodul"
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr "Inaktiverar en insticksmodul"
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr "Ladda om listan över tillgängliga insticksmoduler"
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr "Installera en insticksmodul från en .egg-fil"
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+"Råvärden för sändning/hämtningshastigheter (utan KiB/s-suffix) (användbart "
+"för skript som vill göra egna analyser)"
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr "Visa inte torrentstatus (förbättrar kommandohastighet)"
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr "Användning: connect <host[:port]> [<username>] [<password>]"
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr "Demon värd och port"
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr "Lösenord"
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr "Sökvägen att flytta torrenten till"
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr "Den nya statusen"
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr "En eller flera kommandon"
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr "Använd: config [--set <key> <value>] [<key> [<key>...] ]"
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr "Visa mer information per torrent."
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr "Visa mer detaljerad information inklusive filer och noder."
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr "Visa torrenter med status STATE: %s."
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr "Samma som --sort men artiklarna är i omvänd ordning."
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr "En eller flera torrent ids. Om inget ges, lista alla"
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr "Välj värd"
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr "Avsluta"
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr "Ta bort värd"
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+"Lägg till värd (upp och ner pilar för att navigera, Esc för att avbryta)"
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr "Det gick inte att lägga till värd"
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr "Kolumner"
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr "Bredd"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr "Allmänna alternativ"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr "Ring systemklockan när en hämtning slutar"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+"Lista kompletta torrenter efter ofullständiga oavsett sorteringsordning"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr "Flytta markering när du flyttar torrenter i kön"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr "Språk"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr "Kommandoradsläge"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr "Spara inte dubbla inmatningar i historiken"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr "Spara och ladda kommandoradshistorik i kommandoradsläge"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr "Tredje fliken listar alla återstående torrenter i kommandoradsläge"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr "Torrenter per flik tryck"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr "Mappar"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr "Hämta till"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr "Flytta färdig till"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr "Kopia av .torrent-filer till"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr "Lägg till pausad"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr "Fördela diskutrymme"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr "Inkommande portar"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr "Från"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr "Till"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr "Använd slumpmässiga portar"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr "Inkommande"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr "Utgående"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr "Global bredbandsanvändning"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr "Högst antal anslutningar"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr "Högst antal sändningsplatser"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr "Högsta hämtningshastighet (KiB/s)"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr "Högsta sändningshastighet (KiB/s)"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr "Högst antal halvöppna anslutningar"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr "Högst antal anslutningsförsök per sekund"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr "Frekvensgräns för IP-overhead"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr "Bredbandsanvändning per torrent"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr "Ja, skicka anonyma statistik."
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr "Demon port"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr "Tillåt fjärranslutningar"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr "Totalt"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr "Delningsförhållande"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr "Tidsförhållande"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr "Tid (m)"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr "Ta bort torrent (Avmarkerad pausar torrent)"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr "Proxyinställningar"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr "Typ"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr "Värdnamn"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr "Proxytyp hjälp"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr "Cache-storlek (16 KiB-block)"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr "Cache löper ut (sekunder)"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr "Block skrivna"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr "Skriver"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr "Träfförhållande för skrivbuffert"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr "Block lästa"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr "Lästräffar för block"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr "Läsningar"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr "Träfförhållande för läsbuffert"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr "Cache-storlek"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr "Läs cachestorlek"
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr "Tillämpa"
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr "OK"
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr "Välj språk"
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr "IP {!white,blue!}%s{!status!}"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr "IP-adressen â€%s†har fel format"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP-lista (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer-text (zippad)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian-text (okomprimerad)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr "Blockerade IP-intervall /Vitlistade IP-intervall"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr "Blockeringslista"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr "DÃ¥lig IP-adress"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr "Ogiltig ledare"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr "Felaktig magisk kod"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr "Felaktig version"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr "Dygn"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr "Kontrollera efter ny lista varje:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr "Importera blockeringslista vid uppstart"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr "<b>Inställningar</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "Hämta blockeringslistan om nödvändigt och importera filen."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr "Kontrollera hämtning och import"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr "Hämta en ny blockeringslista och importera den."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr "Tvinga hämtning och import"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr "Blockeringslistan är uppdaterad"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr "<b>Alternativ</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr "Typ:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr "Datum:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr "Filstorlek:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr "<b>Info</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr "<b>Vitlista</b>"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr "Torrent slutförd"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr "Torrent tillagd"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr "Torrent borttagen"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr "Kör"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr "Händelse"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr "<b>Lägg till kommando</b>"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr "<b>Kommandon</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr "Inkompatibelt alternativ"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+"Katalogerna för â€Bevakad mapp†och â€Kopiera .torrenter till†kan inte vara "
+"samma!"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr "AutoAdd"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr "Dubbelklicka för att växla"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr "Dubbelklicka för att redigera"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr "Sökväg"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr "Bevakad mapp finns inte."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr "Sökvägen finns inte."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr "Inställningar för bevakad mapp"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+"Om en .torrentfil läggs till i denna katalog,\n"
+"kommer den att läggas till i sessionen."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr "Välj en mapp"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr "Aktivera denna bevakade mapp"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr "<b>Bevakad mapp</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr "Radera .torrent efter att den lagts till"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+"När en torrent är tillagd till sessionen,\n"
+"kommer .torrent att tas bort."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr "Bifoga tillägg efter att den lagts till:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+"När en torrent är tillagd till sessionen,\n"
+"kommer ett tillägg att läggas till .torrent-filen\n"
+"och den kommer att finnas kvar i samma katalog."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ".tillagd"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+"När en torrent är tillagd till sessionen,\n"
+"kommer .torrent-filen att kopieras till vald katalog\n"
+"och tas bort från den bevakade mappen."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+"När en torrent är tillagd till sessionen,\n"
+"ta också bort .torrent-filen som använts för att lägga till den."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr "<b>Torrentfilåtgärd</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr "Ange hämtningsmapp"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr "Den mapp till vilken torrent-data hämtas till."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr "<b>Hämtningsmapp</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr "Ange mappen flytta slutförda"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr "<b>Flytta slutförd</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr "Etikett: "
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr "<b>Etikett</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr "Övergripande"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr "Användaren vald här kommer att bli torrentens ägare."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr "<b>Ägare</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr "Max sändningshastighet:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr "Max anslutningar:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr "Högst antal uppladdningsplatser:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr "Max hämtningshastighet:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Bandbredd</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr "Automatiskt hanterad:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr "Lägg till pausad:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr "Köa till:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr "<b>Kö</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr "<b>Bevakade mappar:</b>"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr "minuter"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr "1 minut"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr "1 sekund"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr "sekunder"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr "Statistik"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr "Upplösning"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr "Distributörer/Noder"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr "Hämtningsfärg:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr "Sändningsfärg:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr "<b>Anslutningsdiagram</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr "<b>Bandbreddsdiagram</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr "DHT-noder:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr "Cachade DHT-noder:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr "DHT-torrenter:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr "<b>Distributörer / Noder</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr "<b>Diagramfärger</b>"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr "Webbanvändargränssnitt"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+"Deluges webbgränssnitt är inte installerat, installera\n"
+"gränssnittet och försök igen"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr "Aktivera webbgränssnitt"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr "Aktivera SSL"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr "Lyssningsport:"
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Ogiltig etikett, giltiga tecken är:[a-z0-9_-]"
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr "Tom etikett"
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr "Etiketten existerar redan"
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr "Okänd etikett"
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr "Okänd torrent"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr "Etikett_alternativ"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr "_Ta bort etikett"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr "_Lägg till etikett"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr "Etikettalternativ"
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr "Etikett"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr "bevakare1.org"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr "<b>Etikettalternativ</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr "Verkställ max. inställningar per torrent:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr "Maximala"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr "Verkställ köinställningar:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr "Verkställ mappinställningar:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(en rad per bevakare)</i>"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr "Lägg till etikett automatiskt:"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr "Lägg till etikett"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr "<b>Lägg till etikett</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Använd sidopanelen för att lägga till, redigera och ta bort "
+"etiketter.</i>\n"
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr "<b>Etiketter</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr "Aviseringsblinkning visas"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr "Poppupp-avisering inte aktiverad."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr "Poppupp-avisering visas"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr "Ljudavisering inte aktiverad"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr "pygame är inte installerad"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr "Misslyckades med ljudavisering %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr "Ljudavisering lyckades"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr "Slutförde torrent"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+"Torrenten â€%(name)s†omfattande %(num_files)i fil(er) har laddats ner."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr "Aviseringar"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr "Välj ljudfil"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr "Det uppstod ett fel vid skickande av aviseringsmeddelandet: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr "Server svarade inte korrekt på HELO hälsning: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr "Server vägrade användarnamn/lösenords-kombination: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr "Aviseringsmeddelandet skickat."
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr "Slutförde torrent â€%(name)sâ€"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+"Detta e-postbrev är till för att informera dig om att Deluge har slutfört "
+"hämtning â€%(name)sâ€, vilket inkluderar %(num_files)i filer.\n"
+"För att sluta få dessa meddelanden, stäng av e-postaviseringar i Deluges "
+"inställningar.\n"
+"\n"
+"Tack,\n"
+"Deluge."
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr "Blinkningar för aktivitetfältsikon aktiverad"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr "Poppupper aktiverade"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr "Ljud aktiverat"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr "<b>Användargränssnittsaviseringar</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr "<b>Mottagare</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr "Servern kräver TLS/SSL"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr "<b>E-postaviseringar</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+"Denna konfiguration innebär inte att du kommer få aviseringar för alla dessa "
+"händelser."
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr "Prenumerationer"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr "Ljudanpassning"
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr "Extraherare"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr "Extrahera till:"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr "Skapa undermapp med torrentens namn"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Detta alternativ kommer att skapa en undermapp namngiven efter torrenten i "
+"den valda extraheringsmappen och lägga de extraherade filerna där."
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr "Schemaläggare"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr "Hämtningsgräns:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr "Sändningsgräns:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr "Aktiva torrenter:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr "Aktiva hämtningar:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr "Aktiva distributioner:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Långsamma inställningar</b>"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr "Filhanterare"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr "Bakåt"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr "Framåt"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr "Hem"
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr "Skapa"
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr "Hjälp"
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr "Logga ut"
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr "Spara"
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr "Ta bort med data"
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr "Lägg till anslutning"
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr "Värd:"
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr "Det går inte att lägga till värd: {0}"
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr "Flytta"
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr "Bläddra"
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr "Redigera anslutning"
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr "Det går inte att redigera värd"
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr "Logga in"
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr "Inloggning misslyckades"
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr "Lösenordet som du angav är felaktigt"
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr "Publikt"
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr "Senaste överföring"
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr "Ange högst antal anslutningar"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr "Hämtningshastighet"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr "5 KiB/s"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr "10 KiB/s"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr "30 KiB/s"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr "80 KiB/s"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr "300 KiB/s"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr "Ange högsta hämtningshastighet"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr "Sändningshastighet"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr "Ange högsta sändningshastighet"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr "Protokolltrafik hämtning/sändning"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr "Fritt utrymme i hämtningsmappen"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr "<b>IP</b> {0}"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr "Anslut"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr "Stoppa demon"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr "Koppla från"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr "Starta demon"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr "Ändra standardlösenordet"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+"Vi rekommenderar att ändra standardlösenordet.<br><br>Vill du ändra det nu?"
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr "Bevakarvärd"
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr "Filter"
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr "Anslutning återställd"
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr "Förlorad anslutning"
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr "Anslutningen till webbservern har förlorats!"
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr "Förlorad anslutning till webbserver"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr "Hastighetsgräns för hämtning"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr "Hastighetsgräns för uppladdning"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr "Anslutningsgräns"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr "Begränsning för sändningsplatser"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr "Uppdatera bevakare"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr "Tvinga kontroll"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr "Expandera alla"
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr "Detaljer"
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr "Kommentar:"
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr "Status:"
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr "Flytta slutförda:"
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr "Allmänt"
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr "Privat"
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr "Läser in"
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr "Sant"
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr "Bli notifierad om nya versioner"
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Hjälp oss att förbättra Deluge genom att skicka oss din Pythonversion, PyGTK-"
+"version, OS- och processortyp. Absolut ingen annan information sänds."
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr "Pausa torrent"
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr "Installera insticksmodul"
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr "Installera"
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr "Välj ett ägg"
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr "Insticksmodulägg"
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr "Bläddra..."
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr "Skickar din insticksmodul…"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr "Högst antal anslutningar:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Högsta hämtningshastighet (KiB/s):"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Högsta sändningshastighet (KiB/s):"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr "Högst antal halvöppna anslutningar:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Högst antal uppkopplingsförsök per sekund:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr "Högst antal sändningsplatser:"
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr "Cachestorlek (16 KiB block):"
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr "Tvinga användning av proxy"
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr "Hitta fler"
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr "Använd slumpmässig port"
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr "Tjänstetyp"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr "Visa filter med noll torrenter"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr "Tillåt användning av flera filter samtidigt"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr "Lösenord för webbgränssnittet"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr "Gammal:"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr "Ny:"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr "Bekräfta:"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr "Server"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr "Sessionstidsgräns:"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+"Aktivera SSL (sökvägar i förhållande till Deluge-konfigurationsmappen)"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr "Privat nyckel:"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr "Certifikat:"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr "Språket ändrat för webbgränssnittet"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr "Vill du uppdatera sidan nu för att använda det nya språket?"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr "Uppdatera"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr "Ogiltigt lösenord"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr "Dina lösenord stämmer inte överens!"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr "Ditt gamla lösenord var felaktigt!"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr "Ändring lyckades"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr "Ditt lösenordet har ändrats!"
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr "Lägg till från webbadress"
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr "Webbadress"
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr "Kakor"
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr "Arkiv"
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr "Infohash"
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr "Skickar din torrent…"
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr "Inte en giltig torrent"
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr "Mappen flytta slutförda"
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr "Max. hämtningshastighet"
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr "Max. sändningshastighet"
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr "Lägg till i pausat läge"
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr "Hämta"
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr "Tid kvar:"
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr "Tillagd:"
+
+#~ msgid "pynotify is not installed"
+#~ msgstr "pynotify är inte installerad"
+
+#~ msgid "pynotify failed to show notification"
+#~ msgstr "pynotify misslyckades med att visa meddelandet"
+
+#~ msgid "<b><i><big>Notifications</big></i></b>"
+#~ msgstr "<b><i><big>Aviseringar</big></i></b>"
+
+#~ msgid "Associate Magnet links with Deluge"
+#~ msgstr "Associera magnetlänkar med Deluge"
+
+#~ msgid "_Normal Priority"
+#~ msgstr "_Normal prioritering"
+
+#~ msgid "_High Priority"
+#~ msgstr "_Hög prioritering"
+
+#~ msgid "Breton"
+#~ msgstr "Bretonska"
+
+#~ msgid "Belarusian"
+#~ msgstr "Vitryska"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulgariska"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengaliska"
+
+#~ msgid "Afrikaans"
+#~ msgstr "Afrikaans"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabiska"
+
+#~ msgid "Asturian"
+#~ msgstr "Asturiska"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Azerbajdzjanska"
+
+#~ msgid "German"
+#~ msgstr "Tyska"
+
+#~ msgid "Danish"
+#~ msgstr "Danska"
+
+#~ msgid "Catalan"
+#~ msgstr "Katalanska"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosniska"
+
+#~ msgid "Welsh"
+#~ msgstr "Walesiska"
+
+#~ msgid "Czech"
+#~ msgstr "Tjeckiska"
+
+#~ msgid "English (Australia)"
+#~ msgstr "Engelska (Australien)"
+
+#~ msgid "English (Canada)"
+#~ msgstr "Engelska (Kanada)"
+
+#~ msgid "Greek"
+#~ msgstr "Grekiska"
+
+#~ msgid "English"
+#~ msgstr "Engelska"
+
+#~ msgid "Persian"
+#~ msgstr "Persiska"
+
+#~ msgid "Basque"
+#~ msgstr "Baskiska"
+
+#~ msgid "Estonian"
+#~ msgstr "Estniska"
+
+#~ msgid "Venezuelan Spanish"
+#~ msgstr "Venezuelansk spanska"
+
+#~ msgid "Mexican Spanish"
+#~ msgstr "Mexikansk spanska"
+
+#~ msgid "Nicaraguan Spanish"
+#~ msgstr "Nicaraguansk spanska"
+
+#~ msgid "Spanish"
+#~ msgstr "Spanska"
+
+#~ msgid "Argentinian Spanish"
+#~ msgstr "Argentinsk spanska"
+
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Engelska (Storbritanien)"
+
+#~ msgid "Esperanto"
+#~ msgstr "Esperanto"
+
+#~ msgid "Irish"
+#~ msgstr "Irländska"
+
+#~ msgid "Frisian"
+#~ msgstr "Frisiska"
+
+#~ msgid "French"
+#~ msgstr "Franska"
+
+#~ msgid "Finnish"
+#~ msgstr "Finska"
+
+#~ msgid "Galician"
+#~ msgstr "Galesiska"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindi"
+
+#~ msgid "Croatian"
+#~ msgstr "Kroatiska"
+
+#~ msgid "Hungarian"
+#~ msgstr "Bulgariska"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hebreiska"
+
+#~ msgid "Khmer"
+#~ msgstr "Khmeriska"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kazakiska"
+
+#~ msgid "Korean"
+#~ msgstr "Koreanska"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannada"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonesiska"
+
+#~ msgid "Icelandic"
+#~ msgstr "Isländska"
+
+#~ msgid "Italian"
+#~ msgstr "Italienska"
+
+#~ msgid "Japanese"
+#~ msgstr "Japanska"
+
+#~ msgid "Georgian"
+#~ msgstr "Georgiska"
+
+#~ msgid "Macedonian"
+#~ msgstr "Makedonska"
+
+#~ msgid "Latvian"
+#~ msgstr "Lettiska"
+
+#~ msgid "Latin"
+#~ msgstr "Latinska"
+
+#~ msgid "Kurdish"
+#~ msgstr "Kurdiska"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Litauiska"
+
+#~ msgid "Luxembourgish"
+#~ msgstr "Luxemburgska"
+
+#~ msgid "Mayaly"
+#~ msgstr "Malajiska"
+
+#~ msgid "Burmese"
+#~ msgstr "Burmesiska"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malayalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongoliska"
+
+#~ msgid "Punjabi"
+#~ msgstr "Punjabi"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugisiska"
+
+#~ msgid "Piedmontese"
+#~ msgstr "Piemontesiska"
+
+#~ msgid "Polish"
+#~ msgstr "Polska"
+
+#~ msgid "Low German"
+#~ msgstr "LÃ¥gtyska"
+
+#~ msgid "Dutch"
+#~ msgstr "Holländska"
+
+#~ msgid "Norwegian Bokmal"
+#~ msgstr "Norska (bokmål)"
+
+#~ msgid "Nepali"
+#~ msgstr "Nepali"
+
+#~ msgid "Norwegian Nynorsk"
+#~ msgstr "Nynorska"
+
+#~ msgid "Ossetic"
+#~ msgstr "Ossetiska"
+
+#~ msgid "Serbian"
+#~ msgstr "Serbiska"
+
+#~ msgid "Sinhalese"
+#~ msgstr "Singalesiska"
+
+#~ msgid "Slovenian"
+#~ msgstr "Slovenska"
+
+#~ msgid "Slovak"
+#~ msgstr "Slovakiska"
+
+#~ msgid "Russian"
+#~ msgstr "Ryska"
+
+#~ msgid "Romanian"
+#~ msgstr "Rumänska"
+
+#~ msgid "Brazilian Portuguese"
+#~ msgstr "Brasiliansk portugisiska"
+
+#~ msgid "Albanian"
+#~ msgstr "Albanska"
+
+#~ msgid "Serbian Latin"
+#~ msgstr "Serbisk-latinska"
+
+#~ msgid "Swedish"
+#~ msgstr "Svenska"
+
+#~ msgid "Tatar"
+#~ msgstr "Tatariska"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Ukrainska"
+
+#~ msgid "Udmurt"
+#~ msgstr "Udmurtiska"
+
+#~ msgid "Turkish"
+#~ msgstr "Turkiska"
+
+#~ msgid "Tagalog"
+#~ msgstr "Tagalog"
+
+#~ msgid "Klingon"
+#~ msgstr "Klingonska"
+
+#~ msgid "Swahili"
+#~ msgstr "Swahili"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamil"
+
+#~ msgid "Telugu"
+#~ msgstr "Telugu"
+
+#~ msgid "Thai"
+#~ msgstr "Thailändska"
+
+#~ msgid "Traditional Chinese"
+#~ msgstr "Traditionell kinesiska"
+
+#~ msgid "Simplified Chinese"
+#~ msgstr "Förenklad kinesiska"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamesiska"
+
+#~ msgid "Urdu"
+#~ msgstr "Urdu"
+
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Kinesiska (Hong Kong)"
+
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Kinesiska (förenklad)"
+
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Kinesiska (Taiwan)"
+
+#~ msgid "Ignore"
+#~ msgstr "Ignorera"
+
+#~ msgid "Inuktitut"
+#~ msgstr "Inuktitut"
+
+#~ msgid "IP address of the interface to listen on (leave empty for default)"
+#~ msgstr "IP-adress för gränssnittet att lyssna på (lämna tomt för standard)"
+
+#~ msgid "download folder for torrent"
+#~ msgstr "ladda ner mapp för torrent"
+
+#, python-format
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#~ msgid "_Start"
+#~ msgstr "_Starta"
+
+#~ msgid "_Low Priority"
+#~ msgstr "_LÃ¥g prioritet"
+
+#~ msgid "_Ignore"
+#~ msgstr "_Ignorera"
+
+#~ msgid "_Filter"
+#~ msgstr "_Filter"
+
+#~ msgid "Duplicate Torrent(s)"
+#~ msgstr "Duplicerade torrent(er)"
+
+#, python-format
+#~ msgid "D: %s U: %s - Deluge"
+#~ msgstr "H: %s U: %s - Deluge"
diff --git a/deluge/i18n/ta.po b/deluge/i18n/ta.po
new file mode 100644
index 0000000..b5a48d8
--- /dev/null
+++ b/deluge/i18n/ta.po
@@ -0,0 +1,3733 @@
+# Tamil translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2007-12-05 13:56+0000\n"
+"Last-Translator: viki <vr83@coolmail.co.in>\n"
+"Language-Team: Tamil <ta@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "வரிசை"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "வாஙà¯à®•à®¿"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "à®®à¯à®©à¯à®©à¯‡à®±à¯à®±à®®à¯"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "கீழà¯"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "மேலà¯"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "பதிவிறகà¯à®•à®™à¯à®•à®³à¯"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "வலையமைபà¯à®ªà¯"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "à®à®©à¯ˆà®¯à®µà¯ˆ"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "சொரà¯à®•à¯à®ªà¯Šà®°à¯à®³à¯à®•à®³à¯"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "இணைபà¯à®ªà¯à®•à®³à¯"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "பெயரà¯"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "கோபà¯à®ªà¯ (_F)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_டோரà¯à®±à¯‡à®©à¯à®Ÿà¯ ஠சேரà¯à®•à¯à®•à®µà¯à®®à¯"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "(_E)திரà¯à®¤à¯à®¤à¯"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_உதவி"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "டோரà¯à®±à¯‡à®©à¯à®Ÿà¯ ஠சேரà¯à®•à¯à®•à®µà¯à®®à¯"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "டோரà¯à®±à¯‡à®©à¯à®Ÿà¯ ஠நீகà¯à®•à®µà¯à®®à¯"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "தறà¯à®•à®¾à®²à®¿à®•à®®à®¾à®• நிறà¯à®¤à¯à®¤à¯"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "மீணà¯à®Ÿà¯à®®à¯ தà¯à®µà®•à¯à®•"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "டோரà¯à®±à¯‡à®©à¯à®Ÿà¯ - களை மேல௠நோகà¯à®•à®¿ வரிசைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "டோரà¯à®±à¯‡à®©à¯à®Ÿà¯ - களை கீழ௠நோகà¯à®•à®¿ வரிசைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>தà¯à®£à¯à®Ÿà¯à®•à®³à¯:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>பெயரà¯:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>விதைதà¯à®¤à®²à¯</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "Files"
+#~ msgstr "கோபà¯à®ªà¯à®•à¯à®•à®³à¯"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Start"
+#~ msgstr "தொடஙà¯à®•à¯"
+
+#~ msgid "Unknown"
+#~ msgstr "தெரியாதவை"
+
+#~ msgid "Remove"
+#~ msgstr "நீகà¯à®•à®µà¯à®®à¯"
+
+#~ msgid "Add"
+#~ msgstr "சேரà¯à®•à¯à®•à®µà¯à®®à¯"
+
+#~ msgid "Clear"
+#~ msgstr "காலியாகà¯à®•à¯"
diff --git a/deluge/i18n/th.po b/deluge/i18n/th.po
new file mode 100644
index 0000000..9c7b368
--- /dev/null
+++ b/deluge/i18n/th.po
@@ -0,0 +1,3739 @@
+# Thai translation for deluge
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-07-11 05:41+0000\n"
+"Last-Translator: Tharawut Paripaiboon <Unknown>\n"
+"Language-Team: Thai <th@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "คำเตือน"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "ความเร็วดาวน์โหลด"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "ลง"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•à¹ˆà¸­"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "ดาวน์โหลดà¹à¸¥à¹‰à¸§"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "ประมาณเวลาเสร็จ"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "เพิ่มทอเรนต์"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "เพิ่มงาน"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "ลบงาน"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "พัà¸à¸‡à¸²à¸™"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "ทำงานต่อ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>สถานะของ Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>ส่วน:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>ขนาดทั้งหมด:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>ชื่อ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>ตำà¹à¸«à¸™à¹ˆà¸‡:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "เปิดใช้"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "Clear"
+#~ msgstr "ลบงานที่โหลดเสร็จà¹à¸¥à¹‰à¸§"
+
+#~ msgid "Remove"
+#~ msgstr "ลบงาน"
+
+#~ msgid "Add"
+#~ msgstr "เพิ่มงาน"
+
+#~ msgid "About"
+#~ msgstr "เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "ลบไฟล์ทอเรนต์"
+
+#~ msgid "Details"
+#~ msgstr "รายละเอียด"
+
+#~ msgid "Disable"
+#~ msgstr "ไม่ใช้"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "ลบไฟล์ดาวน์โหลด"
+
+#~ msgid "Download"
+#~ msgstr "ดาวน์โหลด"
diff --git a/deluge/i18n/tl.po b/deluge/i18n/tl.po
new file mode 100644
index 0000000..c175e55
--- /dev/null
+++ b/deluge/i18n/tl.po
@@ -0,0 +1,3715 @@
+# Tagalog translation for deluge
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-02-04 21:25+0000\n"
+"Last-Translator: b3rx <b3rxkintanar@gmail.com>\n"
+"Language-Team: Tagalog <tl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Magdagdag ng Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Tanggalin ang Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Ipagpatuloy"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "Add"
+#~ msgstr "Magdagdag"
diff --git a/deluge/i18n/tlh.po b/deluge/i18n/tlh.po
new file mode 100644
index 0000000..7b3cb37
--- /dev/null
+++ b/deluge/i18n/tlh.po
@@ -0,0 +1,3712 @@
+# Klingon; tlhIngan-Hol translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2007-06-05 19:39+0000\n"
+"Last-Translator: Joe Anderson <computerjoe@gmail.com>\n"
+"Language-Team: Klingon; tlhIngan-Hol <tlh@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "Dotlhvam noch:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "noch:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
diff --git a/deluge/i18n/tr.po b/deluge/i18n/tr.po
new file mode 100644
index 0000000..e712140
--- /dev/null
+++ b/deluge/i18n/tr.po
@@ -0,0 +1,4771 @@
+# Turkish translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2011-05-27 03:53+0000\n"
+"Last-Translator: Sardan <serdar.zeybek@gmail.com>\n"
+"Language-Team: Turkish <tr@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "Bilgisayar adı:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Bir Dizin Seç"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "Şu orana ulaşıldığında yayınlamayı durdur:"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "Otomatik"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Ä°zleyiciler"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "Engellenmişler listesini başlangıçta içe aktar"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+"Engellenmişler listesinin dosyasını gerekliyse indir ve dosyayı içe aktar"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "Yeni bir engellenmişler listesi dosyası indir ve içe aktar."
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "İndirmeye zorla ve İçe aktar"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " Adet Torrent KuyruÄŸa Eklendi"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " Torrent KuyruÄŸa Eklendi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "Seçili torrentleri duraklat"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "Seçili torrentleri devam ettir"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "Tümünü _Genişlet"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "Birinci/Sonuncu Öncelik Sırası"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "Torenti kaldır?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+"<big><b>Seçilmiş torrenti kaldırmak istediğinize emin misiniz?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "Yeni Sürüm"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>Yeni Sürüm Var!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "Bu iletişim kutusunu bir daha gösterme"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "Seçili torentlere devam et."
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "Ka_ldır"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "D_uraklatılmış Durumda Ekle"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>URL den ekle</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "Kuyruktaki Torrentler"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>Kuyruktaki Torrentleri Ekle</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "Bağlanıldığında torrentleri otomatik ekle"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "Konakçı Ekle"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "Açılışta seçilen konakçıya otomatik olarak bağlan"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Tam alan tahsisi(torrentin diske yazılacak bölümünü önceden hazırlama) "
+"torrent için gerekli disk alanının tamamını önceden ayırır ve disk "
+"parçalanmasını engeller"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Basit alan tahsisi"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+"Basit alan tahsisi sadece ihtiyaç kadar disk alanı ayırır (indirildikleri "
+"kadar yer kaplama )"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Etkin port:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Etkin Portu Dene"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Dağıtılmış doğrulama tablosu etkin bağlantı sayısını arttırabilir."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"AnlaÅŸma\n"
+"Tam akış\n"
+"Ä°kisinden biri"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "Bütün akışı şifrele"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr "Tüm torrentler için azami gönderim hızı. Sınırsız için -1 yazınız."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "İzin verilen azami bağlantı sayısı. Sınırsız için -1 yazınız."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr "Bütün torrentler için azami indirme hızı. Sınırsız için -1 yazınız."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"Klasik Kip çoğu süreç işlevselliğini gizleyecek ve Deluge tek uygulama gibi "
+"görülecek. Deluge'un artişlem olma avantajını istemiyorsanız bunu kullanın. "
+"Bu ayarın etkili olabilmesi için Deluge yeniden başlatılmalı."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "Pencereyi aktif yap"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>Torrent Ekleme Penceresi</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "Süreç kapısı:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "Yeni sürümler için siteyi belli aralıklarla denetle"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "Yayın süresi Oranı:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "Yayın Süresi (dk):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "Paylaşım oranına ulaşınca torrenti sil"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "Dizin _Aç"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "Devam et."
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "Yeniden Denetimi _Zorla"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "_Otomatik Ayarla"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>Takipçileri Düzenle</b></big>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "Depoyu Taşı"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>Depoyu Taşı</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "Hedef:"
+
+#~ msgid "Pause all"
+#~ msgstr "Tümünü duraklat"
+
+#~ msgid "Homepage"
+#~ msgstr "Ana Sayfa"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "Torrent durma oranını geçmiş."
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr "KiB"
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr "MiB"
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr "GiB"
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KB/sn"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr "pynotify uygulaması yüklenmemiş"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr "pynotify bildirim gösteremedi"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr "Ses bildirimi etkin deÄŸil"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr "pygame uygulaması yüklenmemiş"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr "Ses bildirimi başarısız %s"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr "Ses bildirimi Başarılı"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr "Torrent Tamamlandı"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr "Ses Dosyası Seç"
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr "Bildirim e-postası gönderilirken bir hata oluştu: %s"
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr "Sunucu kullanıcı adı/şifre terkibini kabul etmedi: %s"
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr "Bildirim e-postası gönderildi."
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr "<b><i><big>Bildirimler</big></i></b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr "Sesler etkin"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr "<b>Kullanıcı Arayüzü Bildirimleri</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "Port:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "Kullanıcı adı:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "Parola:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr "<b>Alıcılar</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Gönderen:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "Etkin"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr "<b>E-posta Bildirimleri</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "Ayarlar"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr "Böyle bir konum yok"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr "Otomatik Ekleme Hatası"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr "Ekledikten sonra .torrent dosyasını sil"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr "Ä°ndirme konumunu belirle"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Ä°ndirme Konumu</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr "İndirilenlerin taşınacağı konumu belirle"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr "<b>Tamamlananları Taşı</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr "Etiket: "
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr "<b>Etiket</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "Azami Gönderim Hızı:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "Maksimum Bağlantı"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "Azami Yükleme Yuvası:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "Azami İndirme Hızı:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Bant GeniÅŸliÄŸi</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "Şu orana ulaşıldığında torrenti sil:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "En üst"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "Alt"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>Kuyruk</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "Ayarlar"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "İndirme Sınırı:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "Gönderme Sınırı:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "Aktif Torrentler"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>YavaÅŸ Ayarlar</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Geçersiz etiket, kullanabileceğiniz karakterler:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "BoÅŸ Etiket"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "Etiket zaten mevcut"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "Bilinmeyen Etiket"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "Tanımlanamayan torrent"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "Etiket"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "Etiket _Seçenekleri"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "Etiketi _Kaldır"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "Etiket _Ekle"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "Etiket seçenekleri"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>Etiket Seçenekleri</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "Gönderim Yuvaları:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "Gönderme Hızı:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "İndirme Hızı:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "Bağlantılar:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "Torrent başına azami ayarları uygula:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "En Yüksek"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "Kuyruk ayarlarını uygula:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "Kuyruk"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "Tamamlananları buraya taşı:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "Yerel ayarları uygula:"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "Konum"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(izleyici başına 1 satır)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "Otomatik etiket uygula"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "Etiket Ekle"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>Etiket Ekle</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Ä°sim:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>Etiket eklemek, değiştirmek ve kaldırmak için kenar çubuğunu "
+"kullanın.</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>Etiketler</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "Dışarı aktar:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "Torrent adı alt dizni oluştur"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Bu seçenek, seçilen çıkarma diznindeki torrentin ismini kullanarak bir alt-"
+"dizin oluşturacak ve çıkarılan dosyaları oraya yerleştirecektir."
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>Genel</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+"Deluge web arayüzü yüklenmemiş, lütfen arayüzü yükleyip\n"
+"tekrar deneyin"
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "Web arabirimini etkinleÅŸtir"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "SSL Etkin"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "Dinlenecek port:"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>Ayarlar</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP Listesi (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer Yazı (Sıkıştırılmış)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian Yazı (Sıkıştırılmamış)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "Yanlış yönlendirici"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "Yanlış sihirli kod"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "Geçersiz sürüm"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "Karaliste"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "Gün"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "Yeni liste denetimi (her):"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "İndirmeyi Denetle ve İçe Aktar"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "Engelleme listesi güncel"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>Seçenekler</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "Tür:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "Tarih:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "Dosya Boyutu:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>Bilgi</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "Torrent Tamamlandı"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "Torrent Eklendi"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "Çalıştır"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "Olay"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "Komut"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>Komut Ekle</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>Komutlar</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "Duyuru Tamam"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "Duyuru Gönderildi"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "Uyarı"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "Hata"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "Afganistan"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "Aland Adaları"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "Arnavutluk"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "Cezayir"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "Amerikan Samoası"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "Andorra"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "Angola"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "Anguilla"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "Antarktika"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "Antigua ve Barbuda"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "Arjantin"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "Ermenistan"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "Aruba"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "Avustralya"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "Avusturya"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "Azerbaycan"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "Bahama Adaları"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "Bahreyn"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "BangladeÅŸ"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "Barbados"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "Beyaz Rusya"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "Belçika"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "Belize"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "Benin"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "Bermuda"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "Butan"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "Bolivya"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "Bosna Hersek"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "Botswana"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "Bouvet Adası"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "Brezilya"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "Hint Okyanusu İngiliz Bölgesi"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "Brunei Sultanlığı"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "Bulgaristan"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "Burundi"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "Kamboçya"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "Kamerun"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "Kanada"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "Yeşil Burun Adaları"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "Cayman Adaları"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "Orta Afrika Cumhuriyeti"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "Çad"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "Åžili"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "Çin"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "Christmas Adası"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "Kokos (Keeling) Adaları"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "Kolombiya"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "Komorlar"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "Kongo"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "Kongo Demokratik Cumhuriyeti"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "Cook Adaları"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "Kosta Rika"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "FildiÅŸi Sahili"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "Hırvatistan"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "Küba"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "Kıbrıs"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "Çek Cumhuriyeti"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "Danimarka"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "Cibuti"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "Dominika"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "Dominik Cumhuriyeti"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "Ekvador"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "Mısır"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "El Salvador"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "Ekvatoral Gine"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "Eritre"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "Estonya"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "Etiyopya"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "Falkland Adaları"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "Faroe Adaları"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "Fiji"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "Finlandiya"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "Fransa"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "Fransız Guyanası"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "Fransız Polinezyası"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "Güney Fransa Bölgeleri"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "Gabon"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "Gambiya"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "Gürcistan"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "Almanya"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "Birleşik Krallık"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Gana"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Cebelitarık"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "Yunanistan"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "Grönland"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Grenada"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Guadeloupe"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Guam"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Guatemala"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "Guernsey"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "Gine"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "Gine-Bissau"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "Guyana"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Haiti"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "Heard Adası ve McDonald Adaları"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "Vatikan"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "Honduras"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Hong Kong"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Macaristan"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "Ä°zlanda"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "Hindistan"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "Endonezya"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Ä°ran Ä°slam Cumhuriyeti"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Irak"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "Ä°rlanda"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "Man Adası"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Ä°srail"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "Ä°talya"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Jamaika"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "Japonya"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "Jersey"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "Ürdün"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "Kazakistan"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "Kenya"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Kiribati"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Kore, Demokratik Halk Cumhuriyeti"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Kore Cumhuriyeti"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Kuveyt"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "Kırgızistan"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "Laos Demokratik Halk Cumhuriyeti"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "Letonya"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Lübnan"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "Lesotho"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "Liberya"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "Libya Arap Cumhuriyeti"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "LihtenÅŸtayn"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Litvanya"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "Lüksemburg"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Macao"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "Makedonya"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "Madagaskar"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Malavi"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "Malezya"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Maldivler"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Mali"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Malta"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Marşal Adaları"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Martinique"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "Moritanya"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Mauritius"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Mayotte"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "Meksika"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "Mikronezya Federe Devletleri"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Moldova"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Monako"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "MoÄŸolistan"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "KaradaÄŸ"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "Montserrat"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Fas"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Mozambik"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "Myanmar"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "Namibya"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Nauru"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Nepal"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Hollanda"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "Hollanda Antilleri"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Yeni Kaledonya"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Yeni Zelanda"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Nikaragua"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Nijer"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "Nijerya"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Niue"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "Norfolk Adası"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Kuzey Mariana Adaları"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "Norveç"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Umman"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "Pakistan"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Palau"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "Palestinian Territory, Occupied"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Panama"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Papua Yeni Gine"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Paraguay"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Peru"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Filipinler"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Pitcairn"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Polonya"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "Portekiz"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Porto Riko"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Katar"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Reunion"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "Romanya"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "Rusya Federasyonu"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Ruanda"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Saint Barthelemy"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "Saint Helena"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Saint Kitts ve Nevis"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Saint Lucia"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Saint Martin"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint Pierre ve Miquelon"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Saint Vincent ve Grenadies"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Samoa"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "San Marino"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Sao Tome ve Principe"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "Suudi Arabistan"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Senegal"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "Sırbistan"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "SeyÅŸeller"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Singapur"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Slovakya"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "Slovenya"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Solomon Adaları"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Somali"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Güney Afrika"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Güney Georgia ve Güney Sandwich Adaları"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "Ä°spanya"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Sudan"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Surinam"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard ve Jan Mayen"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Svaziland"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "İsveç"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "İsviçre"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "Suriye Arap Cumhuriyeti"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "Tayvan, Çin Eyaleti"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "Tacikistan"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "Tanzanya"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Tayland"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "DoÄŸu Timor"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Togo"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "Tokelau"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Tonga"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Trinidad ve Tobago"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "Tunus"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Türkiye"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "Türkmenistan"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "Turks ve Caicos Adaları"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Tuvalu"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Uganda"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Ukrayna"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "BirleÅŸik Arap Emirlikleri"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "Amerika BirleÅŸik Devletleri"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "ABD Küçük Denizaşırı Adalar"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Uruguay"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "Özbekistan"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Vanuatu"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "Venezuella"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "Vietnam"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "Virgin Adaları (İngiltere)"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "Virgin Adaları (ABD)"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Wallis ve Futuna"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Batı Sahra"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Yemen"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "Zambiya"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Zimbabve"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "Çevrimdışı"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "Çevrimiçi"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "Bağlı"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "Hizmet bulunamadı"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "Art hizmet çalışmıyor"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "Adres"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "Ä°stemci"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "Ä°lerleme"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "İndirme Hızı"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Gönderme Hızı"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "Torrent"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "Sınırsız"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "EtkinleÅŸtirildi"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "DiÄŸer..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "Ä°ndirilen:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "Gönderilen:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Ä°ndirilen"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Gönderilen"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "Azami İndirme Sınırını Ayarla"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "Azami Gönderme Hızını Ayarla"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "Torrent tamamlandı"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"Bu e-posta, Deluge'nin %(num_files)i dosya içeren %(name)s indirmeyi "
+"bitirdiğini bildirmek için gönderildi.\n"
+"Bu uyarıları bundan sonra almamak için, sadece Deluge'nin tercihlerinden e-"
+"posta bilgilendirmeyi etkisizleÅŸtirin.\n"
+"\n"
+"Teşekkürler,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr "Kategoriler"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Ä°ndirilenler"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "AÄŸ"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "Bant GeniÅŸliÄŸi"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "Arayüz"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "DiÄŸer"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "Artalan iÅŸlem"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "Vekil Sunucu"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "Önbellek"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Eklentiler"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "Eklenti"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "Eklentiyi Seç"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Eggs Eklentisi"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "Dosya Adı"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Boyut"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "Geçersiz Dosya"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "Tekrarlanan Torrent"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "Aynı torrent dosyasını iki kez ekleyemezsin."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "Dosya önceliği ayarlanamadı!"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "Bir .torrent dosyası seçin"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "Torrent Dosyaları"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "Tüm Dosyalar"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "Geçersiz URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "İndirme Başarısız"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "Bağlayıcı"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Ä°zleyici"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "Bir dosya seçin"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "Bir dizin seçin"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ".torrent dosyasını kaydet"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "Bağlı değil"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "Bağlantılar"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "İndirme Hızı"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "Gönderme Hızı"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "İndirme/Gönderme Aktarım Protokolü"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT Yuvası"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr "Boş Disk Alanı"
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "Gelen Bağlantı Yok!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "Azami Bağlantıyı Ayarla"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "Torentler"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "Etiketler"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "Tam"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "Ä°ndriyor"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "Kaynak/Gönderiliyor"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "Duraklatıldı"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "Denetleniyor"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "Sırada"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr "Etkin"
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "Hiçbiri"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "Etiket Yok"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr "Durum"
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "Sunucu"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr "Sürüm"
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr "Lütfen daha fazla bilgi için ayrıntıları inceleyiniz."
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "Bağlantı Noktası Ekleme Hatası"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "Klasik mod kapansın mı?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"Görünüşe göre Deluge daemon süreci (deluged) zaten çalışıyor.\n"
+"\n"
+"Devam edebilmek için; ya daemon'u durdurmalı, ya da Klasik Modu "
+"etkisizleÅŸtirmelisiniz."
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "Çekirdek Başlatma Hatası"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"Deluge'yi Klasik Mod'da çalıştırabilmek için gerekli bir çekirdek bileşeni "
+"başlatırken bir sorun oluştu.\n"
+"\n"
+"Lütfen daha fazla bilgi için aşağıdaki ayrıntıları görün."
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+"Klasik Mod'un başlatılmasında bir hata olduğu için, Klasik Modu kapatıp "
+"devam etmek istiyor musunuz?"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "Hizmet Başlatma Hatası"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+"Daemon sürecini başlatırken bir sorun oldu. Bir hata olup, olmadığını "
+"kontrol etmek için bir uçbirimden çalıştırmayı deneyin."
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "Açık"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "Kapalı"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "Sınırsız Ayarla"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "Taşınacak dosyalar için dizin belirtin"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "Azami Gönderme Yuva Sayısını Ayarla"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr "İndirmekten Vazgeç"
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr "Normal Öncelik"
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr "Yüksek Öncelik"
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr "En Yüksek Öncelik"
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "Öncelik"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "Ayrıntılar:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "Ä°sim"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "Ä°ndirilenler"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "Gönderilenler"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "Dağıtıcılar"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "EÅŸler"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "Kalan Süre"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "Oran"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "Fayda"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "Eklendi"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr "Kaydedilecek Konum"
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Dosya"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "Torrent _Ekle"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "Torrent _Yarat"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Düzenle"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "_Bağlantı Yöneticisi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Görünüm"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "Araç _Çubuğu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "_Yan Çubuk"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "Durum _Çubuğu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "S_ekmeler"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Sütunlar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "_Kenar Çubuğu"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "_İsabetsizleri Göster"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "_Takipçileri Göster"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Yardım"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr "_Anasayfa"
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr "_SSS"
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "Sık Sorulan Sorular"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr "_Topluluk"
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "Torrent ekle"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Torrent Ekle"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "Torenti kaldır"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Torrent Kaldır"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Duraklat"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Devam Et"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "Sıradaki Torrent Yukarı"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "Yukarı Taşı"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "Sıradaki Torrent Aşağı"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "Aşağı Taşı"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Tercihler"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "Bağlantı Yöneticisi"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "_Ä°ndirme"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "_Normal Öncelik"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "_Yüksek Öncelik"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "_En Yüksek Öncelik"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>Otomatik Düzenle:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>Gönderim Sırası:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>Gönderim Süresi:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>Etkin Süre:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Ä°zleyici Durumu:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>EriÅŸilebilirlik:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>EÅŸler:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>Kaynaklar:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Parçalar:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>Tahmini Kalan Süre</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Sonraki Duyuru:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Paylaşım Oranı:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Gönderilen:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Ä°ndirilen:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>EklendiÄŸi Tarih:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "_Durum"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>Yorumlar:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>Dosya sayısı:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Adresleme:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Ä°zleyici:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Toplam Boyut:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Ad:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>Yol:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>Durum:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Ayrıntılar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "_Dosyalar"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "EÅŸle_r"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "Bitirilene taşı:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "Özel"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_İzleyicileri Düzenle"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "_Seçenekler"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>Ä°lgili .torrent silinecek!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>Ä°ndirilmiÅŸ veri silinecek!</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "Seçili Torrenti Kaldır"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>Kullanılabilir Sürüm:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>Şimdiki Sürüm:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "Siteye _Git"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr "_EÅŸ Ekle"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "IP bilgisi ile eÅŸ ekle"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "_Hepsini Seç"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "_Tümünü Duraksat"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "Tümüne devam et"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "Torentleri Ekle"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "_Adres"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "Doğrulama dosyası bilgisi"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torentler</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "_Dosyalar"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "Tam"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "YoÄŸun"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Alan Tahsisi</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "Azami İndirme Hızı:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "Azami Gönderme Hızı:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "İlk/Son Parçaları Önceliklendir"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "Varsayılana döndür"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "Tümü İçin Uygula"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "URL ekle"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "Doğrulama dosyası ekle"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>DoÄŸrulama bilgisinden</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "DoÄŸrulama Bilgisi:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Ä°zleyiciler"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "Torrent OluÅŸtur"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>Torrent OluÅŸtur</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "Kl_asör"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "_Uzak Patika"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>Dosyalar</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "Yazan:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "Yorumlar:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "Bilgi"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "Web üzerinden gönderme"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "Parça Boyutu:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "Özel Bayrak Ver"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "Bu torrenti oturuma ekle"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "Uzak Patikayı Girin"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>Uzak Patika</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "Patika:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "Torrent Yaratma"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ".torrent Farklı kaydet"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>.torrent dosyasını sakla</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "etiket"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "EÅŸ Ekle"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>EÅŸ Ekle</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "bilgisayar adı:port"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>Bağlantı Yöneticisi</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "Yerel artiÅŸlemi _baÅŸlat"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "Yerel sunucuyu gerekliyse otomatik baÅŸlat"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "Bu iletişim kutusunu başlangıçta gösterme"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>Ä°ndirilenler</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "Buradan .torrents dosyaları otomatik eklensin:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "Buraya indir:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ".torrent dosyasını buraya kopyala:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr "Kaldırırken torrent dosyasının kopyasını da sil"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+"Torrent kaldırıldığında, oluşturulan torrent dosyasının kopyasını da sil"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>Klasörler</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Tam Alan Tahsisi Yap"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Torentin ilk ve son parçalarına öncelik ver"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Torentteki dosyaların ilk ve son parçalarına öncelik ver"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "DurdurulmuÅŸ torrentlere ekle"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>AÄŸ</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "Rastgele Port Kullan"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge her zaman otomatik olarak farklı bir port kullansın."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Alıcı:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>Giriş portları</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>Çıkış portları</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+"Gelen bittorrent bağlantıları için kullanılacak arabirimin IP adresini "
+"girin. Eğer öntanımlı olanı kullanmak istiyorsanız boş bırakın."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>Arayüz</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+"Eşlere (web kaynakları dahil) gönderilen her paketin IP başlığındaki TOS "
+"baytı ayarı. Bir Hex değeri beklenir."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "EÅŸ TOS Bayt:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>TOS</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "Evrensel Tak ve Çalıştır"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT Port Haritalama Protokolü"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "EÅŸ deÄŸiÅŸimi"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Yerel Hizmet Bulucu ağınızda yerel eşler buldu."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>Ağ için Ekstralar</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Gelen:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Seviye:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"Zorunlu\n"
+"Seçili\n"
+"Seçilmemiş"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Giden:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>Åžifreleme</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>BantgeniÅŸliÄŸi</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "Saniye Başı Azami Bağlantı Denemesi:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "Azami Yarım-Açık Bağlantı:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Azami Gönderme Hızı (KiB/sn)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Azami Bağlantı:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Bütün torentler için azami gönderim yuvası. Sınırsız için -1 yazınız."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Azami Gönderme Yuvası:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Azami İndirme Hızı (KB/sn):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "Yerel ağdaki sınırları yoksay"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "IP limiti aşıldı"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+"Eğer seçilirse, hesaplanan TCP/IP ek yükü, toplam trafiğin limitlerini "
+"geçmeyi önlemek için hız sınırlayıcılarından süzülür."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>Genel Bant Genişliği Kullanımı</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr "Torrent başı azami gönderme yuvası. Sınırsız için -1 yazınız."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+"Torrent başına yapılacak Maksimum bağlantı sayısı. Sınırsız için -1 yazınız."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>Bir torrentin Bantgenişliği Kullanımı</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>Arabirim</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "EtkinleÅŸtir"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>Klasik Mod</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "Oturum hızını başlık çubuğunda göster"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>Ana Pencere</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "Daima Göster"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "Sistem tepsisi simgesini etkinleÅŸtir"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "Kapattığımda simge durumuna küçült"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "Görev çubuğunda başlat"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "Sistem çekmecesi şifre koruması"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "Sistem Çekmecesi"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>DiÄŸer</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "Yeni sürüm hakkında beni uyar"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+"Deluge sunucuları kontrol ederek yeni sürüm yayımlandığında size bildirecek"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>Güncellemeler</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Python ve PyGTK sürümünüzü, işletim sisteminizi ve işlemci tipinizi "
+"göndererek bize Deluge gelişiminde yardım edebilirsiniz. Başka bilgi "
+"kesinlikle gönderilmeyecek."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "Evet, lütfen anonim istatistikleri gönder"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>Sistem Bilgisi</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "Konum:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Eğer Deluge bu konumda veritabanı dosyasını bulamazsa, eşlerin ülkelerini "
+"çözmek için DNS kullanımına geri dönecek."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP Veritabanı</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "Magnet linklerini Deluge ile iliÅŸkilendir"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>ArtiÅŸlem</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>Port</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "Uzak Bağlantılara İzin Ver"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>Bağlantılar</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>DiÄŸer</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>Kuyruk</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "Yeni eklenen torrentleri üst sıraya al"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "Toplam aktif gönderme:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "Toplam aktif:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "toplam aktif indirme:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "YavaÅŸ torentleri sayma"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "Aktif Torrentler"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "Paylaşım Oranı Sınırı:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "Paylaşım oranına ulaşınca gönderimi durdur:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Gönderiliyor</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>Proxy</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "Sunucu:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"Hiçbiri\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "EÅŸ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>Web Kaynağı (Seed)</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Ä°zleyici</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>Önbellek</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Önbellek Boyutu (16 KiB bloklar):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "Önbellek Temizlenme Tarihi (saniye):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+"Bu oturumun başından itibaren diske yazılan 16KiB'lık parçaların toplam "
+"sayısı."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "Yazılan Bloklar:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+"Bu oturumun başından itibaren gerçekteştirilen yazma işlemlerinin toplam "
+"sayısı."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "Yazma:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>Yaz</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+"Diskten veya önbellekten sunulan, bittorrent motorundan (eşler tarafından) "
+"talep edilen parçaların sayısı."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "Okunan Parçalar:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "Önbellekten sunulan parçaların sayısı."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+"Bu oturumun başından itibaren gerçekleştirilen okuma işlemlerinin toplam "
+"sayısı."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "Okunan:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>Oku</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+"Disk önbelleğindeki mevcut 16KiB'lık parçaların sayısı. Bu; hem yazma, hem "
+"de okuma önbelleklerini kapsar."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "Önbellek Boyutu:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "Okuma Önbellek Boyutu:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>Boyut</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>Durum</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>Eklentiler</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "Sürüm:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "Anasayfa:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "Yazarın E-postası:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "Eklenti _Yükle"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "Eklentileri _Tekrar Tara"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "Daha Fazla Eklenti Bul"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Deluge Göster"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Tümüne Devam Et"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_İndirme Hızı Sınırı"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "_Gönderme Hızı Sınırı"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "Çık & Artişlemi Kapat"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "S_eçenekler"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Kuyruk"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_İzleyiciyi Güncelle"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Torrenti Kaldır"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "_Depolamayı Taşı"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "_Bağlantı Sınırı"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "Gönderme _Yuvası Sınırı"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>Seçilen torrent kaldırılsın mı?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "Eğer veriyi kaldırırsanız, kalıcı olarak silinir."
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "İzleyicileri Düzenle"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "Ä°zleyici Ekle"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>Takipçileri Ekle</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "İzleyiciyi Düzenle"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>İzleyiciyi Düzenle</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Ä°zleyici:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "_Veriyle Birlikte Kaldır"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "Torrenti _Kaldır"
+
+#~ msgid "seconds"
+#~ msgstr "saniye"
+
+#~ msgid "Unknown"
+#~ msgstr "Bilinmeyen"
+
+#~ msgid "Download"
+#~ msgstr "Ä°ndir"
+
+#~ msgid "Upload"
+#~ msgstr "Gönder"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Paylaşım Oranı"
+
+#~ msgid "Details"
+#~ msgstr "Detaylar"
+
+#~ msgid "Files"
+#~ msgstr "Dosyalar"
+
+#~ msgid "General"
+#~ msgstr "Genel"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "En Çok Bağlantı Sayısı"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Hız:</b>"
+
+#~ msgid "Speed"
+#~ msgstr "Hız"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr ".torrent dosyasını sil"
+
+#~ msgid "Remove"
+#~ msgstr "Kaldır"
+
+#~ msgid "Clear"
+#~ msgstr "Temizle"
+
+#~ msgid "Add"
+#~ msgstr "Ekle"
+
+#~ msgid "Username"
+#~ msgstr "Kullanıcı Adı"
+
+#~ msgid "Password"
+#~ msgstr "Åžifre"
+
+#~ msgid "Server"
+#~ msgstr "Sunucu"
+
+#~ msgid "New Password"
+#~ msgstr "Yeni Parola"
+
+#~ msgid "About"
+#~ msgstr "Hakkında"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "Otomatik tazeleme:"
+
+#~ msgid "Logout"
+#~ msgstr "Çıkış"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "İndirilmiş dosyaları sil."
+
+#~ msgid "Login"
+#~ msgstr "GiriÅŸ"
+
+#~ msgid "Set"
+#~ msgstr "Ayarla"
+
+#~ msgid "Total Size"
+#~ msgstr "Toplam Boyut"
+
+#~ msgid "Torrent list"
+#~ msgstr "Torrent listesi"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Ä°zleyici Durumu"
+
+#~ msgid "Url"
+#~ msgstr "Adres"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "_Quit"
+#~ msgstr "Çık"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge Kilitli"
+
+#~ msgid "Template"
+#~ msgstr "Åžablon"
+
+#~ msgid "Disable"
+#~ msgstr "Devre dışı bırak"
+
+#~ msgid "Config"
+#~ msgstr "Yapılandırma"
+
+#~ msgid "Pieces"
+#~ msgstr "Parçalar"
+
+#~ msgid "Resume all"
+#~ msgstr "Hepsine Devam Et"
+
+#~ msgid "Set Timeout"
+#~ msgstr "Zamanaşımı belirle"
+
+#~ msgid "From"
+#~ msgstr "Gönderen"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "URL adresi yada torrent belirtin, biri yeterli."
+
+#~ msgid "Image Only"
+#~ msgstr "Sadece Resim"
+
+#~ msgid "Text Only"
+#~ msgstr "Sadece Yazı"
+
+#~ msgid "Text and image"
+#~ msgstr "Yazı ve resim"
+
+#~ msgid "Upload torrent"
+#~ msgstr "Torrent Yayımla"
+
+#~ msgid "Submit"
+#~ msgstr "Gönder"
+
+#~ msgid "Disabled"
+#~ msgstr "Kapalı"
+
+#~ msgid "Type"
+#~ msgstr "Tür"
+
+#~ msgid "Filters"
+#~ msgstr "Filtreler"
+
+#~ msgid "Availability"
+#~ msgstr "EriÅŸilebilirlik"
+
+#~ msgid "Select All"
+#~ msgstr "Tümünü Seç"
+
+#~ msgid "Graph"
+#~ msgstr "Grafik"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "Sayfayı yenile:"
+
+#~ msgid "Start"
+#~ msgstr "BaÅŸlat"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "Geçersiz şifre, tekrar deneyin"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "Tazeleme süresi > 0 olmalıdır"
+
+#~ msgid "# Of Files"
+#~ msgstr "Dosya Sayısı"
+
+#~ msgid "Reannounce"
+#~ msgstr "Yeniden beyan ediliyor"
+
+#~ msgid "File"
+#~ msgstr "Dosya"
+
+#~ msgid "Keyword"
+#~ msgstr "Anahtar kelime"
+
+#~ msgid "False"
+#~ msgstr "Yanlış"
+
+#~ msgid "Restart"
+#~ msgstr "Tekrar BaÅŸlat"
+
+#~ msgid "Move"
+#~ msgstr "Taşı"
+
+#~ msgid "Queue Position"
+#~ msgstr "Sıra pozisyonu"
+
+#~ msgid "True"
+#~ msgstr "DoÄŸru"
+
+#~ msgid "Stop"
+#~ msgstr "Durdur"
+
+#~ msgid "Download Location"
+#~ msgstr "Ä°ndirme Konumu"
+
+#~ msgid "Save"
+#~ msgstr "Kaydet"
+
+#~ msgid "Update"
+#~ msgstr "Güncelle"
+
+#~ msgid "Ports"
+#~ msgstr "Portlar"
+
+#~ msgid "No data"
+#~ msgstr "Veri yok"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "Duraklatılanlara Ekle"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "Azami Gönderme"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "Azami Gönderme Hızı"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "Azami İndirme Hızı"
+
+#~ msgid "To"
+#~ msgstr "Buraya"
+
+#~ msgid "Random"
+#~ msgstr "Rastgele"
+
+#~ msgid "Encryption"
+#~ msgstr "Åžifreleme"
+
+#~ msgid "Handshake"
+#~ msgstr "AnlaÅŸma"
+
+#~ msgid "Inbound"
+#~ msgstr "Gelen"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "Azami Yarı-Açık Bağlantı"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "Azami İndirme Hızı (Kib/s)"
+
+#~ msgid "Level"
+#~ msgstr "Seviye"
+
+#~ msgid "Either"
+#~ msgstr "Ä°kisi de"
+
+#~ msgid "Outbound"
+#~ msgstr "Giden"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = Sınırsız"
+
+#~ msgid "Global"
+#~ msgstr "Genel"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr ".torrent dosyalarını buraya kaydet"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "Dizinleri Otomatik ekle"
+
+#~ msgid "Per Torrent"
+#~ msgstr "Her Bir Torrent'in"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "Bütün indirilenleri buraya kaydet"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = sınırsız"
+
+#~ msgid "Total active torrents"
+#~ msgstr "Toplam aktif torrent"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "Orana ulaşınca torrenti sil"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "Orana ulaşınca torrenti gönderme"
+
+#~ msgid "Total active seeding"
+#~ msgstr "Toplam aktif"
+
+#~ msgid "Total active downloading"
+#~ msgstr "Toplam aktif indirilenler"
+
+#~ msgid "Button style"
+#~ msgstr "Düğme türü"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "Etkin Eklentiler"
+
+#~ msgid "Current Password"
+#~ msgstr "Geçerli Parola"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "Yeni Parola (DoÄŸrulama)"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "\"Yeni Parola\" ile \"Yeni Parola(doğrulama)\" birbirinden farklı"
+
+#~ msgid "Move To"
+#~ msgstr "Taşı"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "Eski parola yanlış"
+
+#~ msgid "Yes"
+#~ msgstr "Evet"
+
+#~ msgid "No"
+#~ msgstr "Hayır"
+
+#~ msgid "Enter a valid value."
+#~ msgstr "Geçerli bir değer girin."
+
+#~ msgid "This field is required."
+#~ msgstr "Gerekli Alan"
+
+#~ msgid "translate something"
+#~ msgstr "birşey tercüme et"
+
+#~ msgid "Enter a number."
+#~ msgstr "Bir sayı girin."
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "URL kırık link görünüyor."
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "Geçerli bir URL girin."
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr ""
+#~ "Geçerli bir resim gönderin. The file you uploaded was either not an image or "
+#~ "a corrupted image."
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "Sunulan dosya boÅŸ."
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "Geçerli bir e-posta adresi girin."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "Geçerli bir IPv4 adresi girin."
+
+#~ msgid "Enter a valid date."
+#~ msgstr "Geçerli bir tarih girin."
+
+#~ msgid "Enter a valid time."
+#~ msgstr "Geçerli bir saat girin."
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "Geçerli bir tarih/saat girin."
+
+#~ msgid "Active time"
+#~ msgstr "Aktiflik zamanı"
+
+#~ msgid "Admin"
+#~ msgstr "Yönetici"
+
+#~ msgid "Connect"
+#~ msgstr "BaÄŸlan"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : Torrent Listesi"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge GiriÅŸ"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "Sözcük Filtrele"
+
+#~ msgid "Next Announce"
+#~ msgstr "Sonraki Duyuru"
+
+#~ msgid "Seeding time"
+#~ msgstr "Gönderme zamanı"
+
+#~ msgid "Seed rank"
+#~ msgstr "Gönderme değeri"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "eÅŸ deÄŸiÅŸtir"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "İlk ve son parçalara öncelik ver"
+
+#~ msgid "Forced"
+#~ msgstr "Zorunlu"
+
+#~ msgid "Enter a whole number."
+#~ msgstr "Tam sayı giriniz"
+
+#~ msgid "Move torrent"
+#~ msgstr "Torrenti taşı"
+
+#~ msgid "Extra's"
+#~ msgstr "Ekstra"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "Orana ulaşınca torrenti göndermeyi kes"
+
+#~ msgid "Statistics"
+#~ msgstr "Ä°statistikler"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "Dosya bulunamadı"
+
+#~ msgid "Recheck"
+#~ msgstr "Tekrar denetle"
+
+#~ msgid "Delete"
+#~ msgstr "Sil"
+
+#~ msgid "Other.."
+#~ msgstr "DiÄŸer.."
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "Ä°ndiriliyor %.2f%%"
+
+#~ msgid "BlockList"
+#~ msgstr "Engellenenler"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "Zaman aşımı (saniye)"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "Her gün denetle"
+
+#~ msgid "Inactive"
+#~ msgstr "Aktif deÄŸil"
+
+#~ msgid "page 8"
+#~ msgstr "Sayfa 8"
+
+#~ msgid "page 10"
+#~ msgstr "Sayfa 10"
+
+#~ msgid "page 11"
+#~ msgstr "Sayfa 11"
+
+#~ msgid "no uri"
+#~ msgstr "adres yok"
+
+#~ msgid "Eta"
+#~ msgstr "Kalan süre"
+
+#~ msgid "Ava"
+#~ msgstr "Uyg"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "DHT Anahat"
+
+#~ msgid "UpNP"
+#~ msgstr "UpNP"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "Saniye Başı Azami Bağlantı Denemesi"
+
+#~ msgid "Cache templates"
+#~ msgstr "Önbellek şablonları"
+
+#~ msgid "These changes were saved"
+#~ msgstr "Bu deÄŸiÅŸiklikler kaydedildi"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "Yukarıdaki hataları giderin ve tekrar deneyin"
+
+#~ msgid "Error in Path."
+#~ msgstr "Yolda Hata."
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr ""
+#~ "Geçerli bir seçim yapın. Bu seçim kullanılabilir seçimlerden biri değil."
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "Bu değerin %s 'den büyük ya da eşit olmasını sağlayın."
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "Bu değerin %s 'den küçük ya da eşit olmasını sağlayın."
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "Geçerli bir seçim yapın. %s kullanılır seçimlerden biri değil."
+
+#~ msgid "Enter a list of values."
+#~ msgstr "DeÄŸerlerin bir listesini girin."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "Burada toplam %s ondalık basamaktan fazla olmamasını sağlayın."
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "Burada toplam %s rakamdan fazla olmamasını sağlayın."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr ""
+#~ "Ondalık ayırıcıdan önce burada toplam %s basamaktan fazla olmamasını "
+#~ "sağlayın."
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "SunulmuÅŸ dosya yok. Formdaki kodlama tipini denetleyin."
+
+#~ msgid "No file was submitted."
+#~ msgstr "SunulmuÅŸ dosya yok."
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr ""
+#~ "Geçerli bir seçim yapın. %(value)s kullanılır seçimlerden biri değil."
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge ÅŸifre ile korunmakta.\n"
+#~ "Deluge penceresini görmek için, lütfen parolanızı girin"
+
+#~ msgid "Import Now"
+#~ msgstr "Şimdi İçe Aktar"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "İndirme girişimi sayısı"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "İçe aktarılıyor %s"
+
+#~ msgid "Refresh status"
+#~ msgstr "Tazeleme durumu"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-baÄŸlan"
+
+#~ msgid "page 6"
+#~ msgstr "sayfa 6"
+
+#~ msgid "page 7"
+#~ msgstr "sayfa 7"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-düzenle"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>Torentleri Ekle</b></big>"
+
+#~ msgid "From Session"
+#~ msgstr "Oturumdan"
+
+#~ msgid "FAQ"
+#~ msgstr "SSS"
+
+#~ msgid "Community"
+#~ msgstr "Topluluk"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "Torent seçeneklerinde hata."
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "Webui ve artişlemi ayarları değiştirdikten sonra yeniden başlat"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr ""
+#~ "Bu değerin en fazla %(max)d karakteri olmasını sağlayın (%(length)d)."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr "Bu değerin en az %(min)d karakter olmasını sağlayın (%(length)d)."
+
+#~ msgid "Queue Bottom"
+#~ msgstr "Kuyruğun Altına"
+
+#~ msgid "Queue Top"
+#~ msgstr "Kuyruğun En Üstüne"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "Artişlem başlangıcında içe aktar"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "Engellenen Aralık: %s"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "YoÄŸun Alan Tahsisi"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "Bu program özgür bir yazılımdır, Özgür Yazılım Vakfı'nın yayınladığı GNU "
+#~ "Genel Kamu Lisansı'nın 2. veya daha sonraki sürümlerindeki şartlar altında "
+#~ "dağıtılabilir ve/veya değiştirilebilir. Bu program faydalı olacağı umut "
+#~ "edilerek dağıtılmaktadır, fakat HİÇBİR GARANTİSİ YOKTUR; hatta ÜRÜN DEĞERİ "
+#~ "ya da BİR AMACA UYGUNLUK gibi garantiler de vermez. Lütfen daha fazla detay "
+#~ "için GNU Genel Kamu Lisansı'nı inceleyin. Bu programla beraber GNU Genel "
+#~ "Kamu Lisansını da almış olmalısınız; eğer almadıysanız, "
+#~ "<http://www.gnu.org/licenses> ziyaret edin."
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "KendiliÄŸinden Ekleme etkinleÅŸtirildi"
+
+#~ msgid "Graphs"
+#~ msgstr "Grafikler"
+
+#~ msgid "Seeds/Peers"
+#~ msgstr "Yayıncılar/Eşler"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "bu henüz birşey yapmıyor..\n"
+
+#~ msgid "Test config value:"
+#~ msgstr "Ayar deÄŸerini test et:"
+
+#~ msgid "page 12"
+#~ msgstr "sayfa 12"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "Deluge Setup Wizard"
+#~ msgstr "Deluge Kurulum Sihirbazı"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "All Finished!"
+#~ msgstr "Hepsi Bitti!"
+
+#~ msgid "This wizard will help you set up Deluge to your liking."
+#~ msgstr "Bu sihirbaz Deluge'u isteklerinize göre kurmanıza yardım edecek"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "%i dosya içerir"
+
+#~ msgid "Test config value"
+#~ msgstr "Ayar deÄŸerini test et"
+
+#~ msgid "Stats"
+#~ msgstr "Ä°statistikler"
+
+#~ msgid "State"
+#~ msgstr "Durum"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "Otomatik yenileme (saniye)"
+
+#~ msgid "no label"
+#~ msgstr "etiket yok"
+
+#~ msgid "Show sidebar"
+#~ msgstr "Kenar çubuğunu göster"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "Değişiklikler onaylandığında webui'yi elle yeniden başlat"
+
+#~ msgid "Sidebar"
+#~ msgstr "Kenar Çubuğu"
+
+#~ msgid "Cancel"
+#~ msgstr "Ä°ptal"
+
+#~ msgid "Show trackers"
+#~ msgstr "İzleyicileri göster"
+
+#~ msgid "max_connections"
+#~ msgstr "azami_bağlantı"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "otomatik_ayarlandı"
+
+#~ msgid "apply_queue"
+#~ msgstr "sıra_uygula"
+
+#~ msgid "max_download_speed"
+#~ msgstr "azami_indirme_hızı"
+
+#~ msgid "apply_max"
+#~ msgstr "uygula_azami"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "Socksv5 W/ Auth"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "HTTP W/ Auth"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Connected to"
+#~ msgstr "Bağlanılan:"
+
+#~ msgid "Connection Limit"
+#~ msgstr "Bağlantı Sınırı"
+
+#~ msgid "Disk Space"
+#~ msgstr "Disk Alanı"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "...ve Torrent dosyasını sil"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "...ve İndirilen dosyaları sil"
+
+#~ msgid "... and delete All files"
+#~ msgstr "...ve Tüm dosyaları sil"
+
+#~ msgid "Normal priority"
+#~ msgstr "Normal öncelik"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "Gelen Bağlantı Yok"
+
+#~ msgid "Label torrent"
+#~ msgstr "Torrent etiketi"
+
+#~ msgid "Do not download"
+#~ msgstr "Ä°ndirme yapma"
+
+#~ msgid "High priority"
+#~ msgstr "Yüksek öncelik"
+
+#~ msgid "Force Recheck"
+#~ msgstr "Yeniden Denetime Zorla"
+
+#~ msgid "Highest priority"
+#~ msgstr "En yüksek öncelik"
+
+#~ msgid "Ok"
+#~ msgstr "Tamam"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "Gönderme Hız Sınırı"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "Gönderme Yuvası Sınırı"
+
+#~ msgid "Update Tracker"
+#~ msgstr "İzleyiciyi Güncelle"
+
+#~ msgid "Search"
+#~ msgstr "Ara"
+
+#~ msgid "Work in progress.."
+#~ msgstr "Çalışılıyor..."
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "İndirme Hız Sınırı"
+
+#~ msgid "From Url"
+#~ msgstr "URL Adresinden"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "azami_gönderme_sınırı"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "orana_ulaşınca_dur"
+
+#~ msgid "stop_ratio"
+#~ msgstr "oranı_durdur"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "orana_ulaşınca_kaldır"
+
+#~ msgid "auto_add"
+#~ msgstr "oto_ekleme"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "'%s' konumunda anahtar bulunamadı"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "'%s' konumunda sertifika bulunamadı"
+
+#~ msgid "Show keyword search"
+#~ msgstr "Arama sözcüklerini göster"
+
+#~ msgid "Show zero hits"
+#~ msgstr "İsabetsizleri göster"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "ArtiÅŸleme BaÄŸlan"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "Bir artişleme Bağlı Değil"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "oto_izleyici_ekleme"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "azami_gönderme_yuvası"
+
+#~ msgid "Error setting label options"
+#~ msgstr "Etiket seçenekleri ayarlama hatası"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "Bu eposta %s 'in %i dosyaları ile birlikte indirilmesinin bittiğini "
+#~ "belirtir.\n"
+#~ "Bu uyarıları almak istemiyorsanız, Deluge 'nin Ayarlar kısmında eposta "
+#~ "bilgilendirme seneçeniğini kapatınız.\n"
+#~ "\n"
+#~ "Teşekkürler,\n"
+#~ "Deluge"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "Hız limiti IP Ek Yükü"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "Bağlı değil.."
+
+#~ msgid "Downloading.."
+#~ msgstr "Ä°ndiriliyor.."
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s geçerli bir URL değil."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "Başarısız indirme : %s"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "Maksimum Gönderme Hızı (Kib/s)"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>Devam etmek için şifrenizi giriniz</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge şifre korumalı!</big></b>"
+
+#~ msgid "Force Download"
+#~ msgstr "Ä°ndirmeye Zorla"
+
+#~ msgid "move_completed"
+#~ msgstr "tamamlananı_taşı"
+
+#~ msgid "move_completed_path"
+#~ msgstr "tamamlananların_taşınacağı_yer"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "tamamlananı_taşımayı_uygula"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>. In addition, as a special exception, the "
+#~ "copyright holders give permission to link the code of portions of this "
+#~ "program with the OpenSSL library. You must obey the GNU General Public "
+#~ "License in all respects for all of the code used other than OpenSSL. If you "
+#~ "modify file(s) with this exception, you may extend this exception to your "
+#~ "version of the file(s), but you are not obligated to do so. If you do not "
+#~ "wish to do so, delete this exception statement from your version. If you "
+#~ "delete this exception statement from all source files in the program, then "
+#~ "also delete it here."
+#~ msgstr ""
+#~ "Bu uygulama özgür yazılımdır; Özgür Yazılım vakfı tarafından yayımlanan GNU "
+#~ "Genel Kamu Lisansı'nın 3 numaralı veya daha sonraki herhangi bir sürümünün "
+#~ "şartları çerçevesinde bu uygulamayı tekrar dağıtabilir ve/veya "
+#~ "değiştirebilirsiniz. Bu uygulama faydalı olabilmesi umuduyla, ancak HİÇBİR "
+#~ "GARANTİ KAPSAMINDA OLMADAN dağıtılmaktadır; ORTALAMA KALİTE GARANTİSİ veya "
+#~ "BELLİ BİR AMACA UYGUN İŞ GÖRME GARANTİSİ dahi yoktur. Daha fazla ayrıntı "
+#~ "için GNU Genel Kamu Lisansına bakınız. Bu uygulamayla birlikte Genel Kamu "
+#~ "Lisansı metninin bir kopyasını almış olmalısınız; eğer almadıysanız, "
+#~ "<http://www.gnu.org/licenses> adresine bakınız. Ayrıca, özel bir istisna "
+#~ "olarak, telif hakkı sahipleri bu uygulamanın kod parçalarına OpenSSL "
+#~ "kütüphanesiyle bağlantı verilmesine izin verir. OpenSSL haricinde bütün "
+#~ "kodların kullanımı için GNU Genel Kamu Lisansına her yönüyle uymak "
+#~ "zorundasınız. Eğer dosyayı/dosyaları bu istisna dahilinde değiştirirseniz bu "
+#~ "istisnayı kendi dosya sürümlerinize de uygulayabilirsiniz fakat böyle bir "
+#~ "zorunluluğunuz yok. Eğer bunu yapmazsanız istisnayı belirten bölümü kendi "
+#~ "sürümünüzden çıkarınız. Eğer bu istisna bölümünü bütün kaynak dosyalarından "
+#~ "silerseniz buradan da siliniz."
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB\n"
+#~ "1 MiB\n"
+#~ "2 MiB\n"
+#~ "4 MiB\n"
+#~ "8 MiB\n"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB\n"
+#~ "1 MiB\n"
+#~ "2 MiB\n"
+#~ "4 MiB\n"
+#~ "8 MiB\n"
+
+#~ msgid "Low Free Space"
+#~ msgstr "Düşük Disk Alanı"
+
+#~ msgid "Low Disk Space Warning"
+#~ msgstr "Düşük Disk Alanı Uyarısı"
+
+#~ msgid "You're running low on disk space:\n"
+#~ msgstr "Diskinizde çok az boş alan kaldı:\n"
diff --git a/deluge/i18n/uk.po b/deluge/i18n/uk.po
new file mode 100644
index 0000000..d07c27a
--- /dev/null
+++ b/deluge/i18n/uk.po
@@ -0,0 +1,6508 @@
+# Ukrainian translation for deluge
+# Copyright (c) 2018 Rosetta Contributors and Canonical Ltd 2018
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2019-06-06 11:53+0100\n"
+"PO-Revision-Date: 2018-12-21 21:49+0000\n"
+"Last-Translator: ma$terok <Unknown>\n"
+"Language-Team: Ukrainian <uk@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2019-06-06 11:12+0000\n"
+"X-Generator: Launchpad (build 18978)\n"
+
+#: deluge/common.py:405
+msgid "B"
+msgstr "байт"
+
+#: deluge/common.py:406
+msgid "KiB"
+msgstr "КіБ"
+
+#: deluge/common.py:407
+msgid "MiB"
+msgstr "МіБ"
+
+#: deluge/common.py:408
+msgid "GiB"
+msgstr "ГіБ"
+
+#: deluge/common.py:409
+msgid "TiB"
+msgstr "ТіБ"
+
+#: deluge/common.py:410
+msgid "K"
+msgstr "K"
+
+#: deluge/common.py:411
+msgid "M"
+msgstr "M"
+
+#: deluge/common.py:412
+msgid "G"
+msgstr "Г"
+
+#: deluge/common.py:413
+msgid "T"
+msgstr "Т"
+
+#: deluge/common.py:509 deluge/ui/gtk3/statusbar.py:442
+#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
+#: deluge/ui/gtk3/statusbar.py:477 deluge/ui/gtk3/statusbar.py:484
+#: deluge/ui/gtk3/statusbar.py:526 deluge/ui/gtk3/statusbar.py:542
+#: deluge/ui/gtk3/tab_data_funcs.py:37 deluge/ui/gtk3/systemtray.py:237
+#: deluge/ui/gtk3/systemtray.py:241 deluge/ui/gtk3/systemtray.py:264
+#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
+msgid "K/s"
+msgstr "K/c"
+
+#: deluge/common.py:509 deluge/ui/gtk3/menubar.py:449
+#: deluge/ui/gtk3/menubar.py:455
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:80
+#: deluge/ui/console/widgets/statusbars.py:104
+#: deluge/ui/console/widgets/statusbars.py:114
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:36
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:146
+#: deluge/ui/web/js/deluge-all/Statusbar.js:205
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:94
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:121
+msgid "KiB/s"
+msgstr "КіБ/Ñ"
+
+#: deluge/common.py:515
+msgid "M/s"
+msgstr "Ðœ/Ñ"
+
+#: deluge/common.py:515
+msgid "MiB/s"
+msgstr "МіБ/Ñ"
+
+#: deluge/common.py:521
+msgid "G/s"
+msgstr "Г/Ñ"
+
+#: deluge/common.py:521
+msgid "GiB/s"
+msgstr "ГіБ/Ñ"
+
+#: deluge/common.py:527
+msgid "T/s"
+msgstr "Т/Ñ"
+
+#: deluge/common.py:527
+msgid "TiB/s"
+msgstr "ТіБ/Ñ"
+
+#: deluge/argparserbase.py:172
+msgid "Common Options"
+msgstr "Загальні параметри"
+
+#: deluge/argparserbase.py:175
+msgid "Print this help message"
+msgstr ""
+
+#: deluge/argparserbase.py:182
+msgid "Print version information"
+msgstr ""
+
+#: deluge/argparserbase.py:194
+msgid "Set the config directory path"
+msgstr ""
+
+#: deluge/argparserbase.py:200
+msgid "Output to specified logfile instead of stdout"
+msgstr ""
+
+#: deluge/argparserbase.py:206
+msgid "Set the log level (none, error, warning, info, debug)"
+msgstr ""
+
+#: deluge/argparserbase.py:215
+#, python-format
+msgid ""
+"Enable logfile rotation, with optional maximum logfile size, default: "
+"%(const)s (Logfile rotation count is 5)"
+msgstr ""
+
+#: deluge/argparserbase.py:223
+msgid "Quieten logging output (Same as `--loglevel none`)"
+msgstr ""
+
+#: deluge/argparserbase.py:231
+#, python-format
+msgid ""
+"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
+"specified"
+msgstr ""
+
+#: deluge/argparserbase.py:351
+msgid "Process Control Options"
+msgstr ""
+
+#: deluge/argparserbase.py:357
+msgid "Pidfile to store the process id"
+msgstr ""
+
+#: deluge/argparserbase.py:365
+msgid "Do not daemonize (fork) this process"
+msgstr ""
+
+#: deluge/argparserbase.py:379
+msgid "Change to this user on startup (Requires root)"
+msgstr ""
+
+#: deluge/argparserbase.py:386
+msgid "Change to this group on startup (Requires root)"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:25
+msgid "Daemon Options"
+msgstr "Параметри фонової Ñлужби"
+
+#: deluge/core/daemon_entry.py:31
+msgid "IP address to listen for UI connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:39
+msgid "Port to listen for UI connections on"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:47
+msgid "IP address to listen for BitTorrent connections"
+msgstr ""
+
+#: deluge/core/daemon_entry.py:56
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent connections."
+msgstr ""
+
+#: deluge/core/daemon_entry.py:63
+msgid "Config keys to be unmodified by `set_config` RPC"
+msgstr ""
+
+#: deluge/ui/common.py:37 deluge/ui/gtk3/filtertreeview.py:135
+#: deluge/ui/web/js/deluge-all/UI.js:18
+msgid "All"
+msgstr "Ð’ÑÑ–"
+
+#: deluge/ui/common.py:38 deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:490
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
+#: deluge/ui/web/js/deluge-all/UI.js:19
+msgid "Active"
+msgstr "Ðктивна"
+
+#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
+msgid "Allocating"
+msgstr ""
+
+#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
+#: deluge/ui/web/js/deluge-all/UI.js:25
+msgid "Checking"
+msgstr "Перевірка"
+
+#: deluge/ui/common.py:41
+#: deluge/ui/console/modes/preferences/preference_panes.py:568
+#: deluge/ui/web/js/deluge-all/UI.js:22
+msgid "Downloading"
+msgstr "ЗвантаженнÑ"
+
+#: deluge/ui/common.py:42
+#: deluge/ui/console/modes/preferences/preference_panes.py:575
+#: deluge/ui/web/js/deluge-all/UI.js:23
+msgid "Seeding"
+msgstr "Роздача"
+
+#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
+msgid "Paused"
+msgstr "Призупинено"
+
+#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
+msgid "Queued"
+msgstr "В черзі"
+
+#: deluge/ui/common.py:45 deluge/ui/common.py:122
+#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:136
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:330
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:94
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:351
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:358
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:417
+#: deluge/ui/web/js/deluge-all/UI.js:27
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:121
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:301
+msgid "Error"
+msgstr "Помилка"
+
+#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
+#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:107
+msgid "Name"
+msgstr "Ðазва"
+
+#: deluge/ui/common.py:51 deluge/ui/common.py:53
+#: deluge/ui/gtk3/files_tab.py:126 deluge/ui/gtk3/torrentview.py:310
+#: deluge/ui/gtk3/peers_tab.py:120
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:121
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:80
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:34
+msgid "Progress"
+msgstr "ПрогреÑ"
+
+#: deluge/ui/common.py:52 deluge/ui/web/js/deluge-all/Sidebar.js:12
+msgid "State"
+msgstr "Стан"
+
+#: deluge/ui/common.py:54 deluge/ui/gtk3/createtorrentdialog.py:72
+#: deluge/ui/gtk3/addtorrentdialog.py:118 deluge/ui/gtk3/files_tab.py:113
+#: deluge/ui/gtk3/torrentview.py:283
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:174
+#: deluge/ui/console/modes/preferences/preference_panes.py:738
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:114
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:23
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:33
+msgid "Size"
+msgstr "Розмір"
+
+#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
+msgid "Downloaded"
+msgstr "Завантажено"
+
+#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
+msgid "Uploaded"
+msgstr "Віддано"
+
+#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
+msgid "Remaining"
+msgstr "ЗалишилоÑÑ"
+
+#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
+msgid "Ratio"
+msgstr "ВідношеннÑ"
+
+#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
+#: deluge/ui/gtk3/peers_tab.py:133
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
+msgid "Down Speed"
+msgstr "ШвидкіÑÑ‚ÑŒ завантаженнÑ"
+
+#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
+#: deluge/ui/gtk3/peers_tab.py:146
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
+msgid "Up Speed"
+msgstr "ШвидкіÑÑ‚ÑŒ віддачі"
+
+#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
+msgid "Down Limit"
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾ÑÑ‚Ñ– завантаженнÑ"
+
+#: deluge/ui/common.py:62 deluge/ui/gtk3/torrentview.py:359
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:276
+msgid "Up Limit"
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾ÑÑ‚Ñ– віддачі"
+
+#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
+msgid "Max Connections"
+msgstr ""
+
+#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
+msgid "Max Upload Slots"
+msgstr ""
+
+#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:46
+msgid "Peers"
+msgstr "Піри"
+
+#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
+msgid "Seeds"
+msgstr "Сіди"
+
+#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
+msgid "Avail"
+msgstr "ДоÑтупніÑÑ‚ÑŒ"
+
+#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
+msgid "Seeds:Peers"
+msgstr "Сідів:Пірів"
+
+#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
+#: deluge/ui/gtk3/torrentview.py:387
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:181
+msgid "Added"
+msgstr "Додано"
+
+#: deluge/ui/common.py:70 deluge/ui/gtk3/createtorrentdialog.py:88
+#: deluge/ui/gtk3/edittrackersdialog.py:127 deluge/ui/gtk3/torrentview.py:408
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:57
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:205
+msgid "Tracker"
+msgstr "Трекер"
+
+#: deluge/ui/common.py:72 deluge/ui/gtk3/torrentview.py:414
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:48
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
+msgid "Download Folder"
+msgstr "Тека завантаженнÑ"
+
+#: deluge/ui/common.py:75
+msgid "Seeding Time"
+msgstr ""
+
+#: deluge/ui/common.py:76
+msgid "Active Time"
+msgstr "Ð§Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ–"
+
+#: deluge/ui/common.py:78
+msgid "Last Activity"
+msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ–ÑÑ‚ÑŒ"
+
+#: deluge/ui/common.py:81
+msgid "Finished Time"
+msgstr ""
+
+#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
+msgid "Complete Seen"
+msgstr ""
+
+#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
+msgid "Completed"
+msgstr "Завершено"
+
+#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/common.py:88 deluge/ui/gtk3/torrentview.py:418
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
+msgid "Shared"
+msgstr ""
+
+#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/common.py:94 deluge/ui/gtk3/glade/main_window.tabs.ui.h:32
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
+msgid "Sequential Download"
+msgstr ""
+
+#: deluge/ui/common.py:97 deluge/ui/common.py:98
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:11
+#: deluge/ui/web/js/deluge-all/Menus.js:253
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:195
+msgid "Auto Managed"
+msgstr "Ðвтоматичний режим"
+
+#: deluge/ui/common.py:99
+msgid "Stop At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:100
+msgid "Stop Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:101
+msgid "Remove At Ratio"
+msgstr ""
+
+#: deluge/ui/common.py:102 deluge/ui/common.py:108
+msgid "Move On Completed"
+msgstr "ПереміÑтити піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ"
+
+#: deluge/ui/common.py:104
+msgid "Move Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:112
+msgid "Move On Completed Path"
+msgstr ""
+
+#: deluge/ui/common.py:115 deluge/ui/gtk3/filtertreeview.py:140
+#: deluge/ui/gtk3/torrentview.py:416
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:499
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
+msgid "Owner"
+msgstr "ВлаÑник"
+
+#: deluge/ui/common.py:116
+msgid "Pieces"
+msgstr "ЧаÑтини"
+
+#: deluge/ui/common.py:117
+msgid "Seed Rank"
+msgstr ""
+
+#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
+msgid "Super Seeding"
+msgstr ""
+
+#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
+msgid "Warning"
+msgstr "Увага"
+
+#: deluge/ui/common.py:124 deluge/ui/web/js/deluge-all/details/StatusTab.js:123
+msgid "Announce OK"
+msgstr "Запит вірний"
+
+#: deluge/ui/common.py:125 deluge/ui/web/js/deluge-all/details/StatusTab.js:124
+msgid "Announce Sent"
+msgstr "Запит надіÑлано"
+
+#: deluge/ui/common.py:129
+#: deluge/ui/console/modes/preferences/preference_panes.py:174
+#: deluge/ui/console/modes/preferences/preferences.py:89
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:18
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:31
+msgid "Interface"
+msgstr "Зовнішній виглÑд"
+
+#: deluge/ui/common.py:130
+#: deluge/ui/console/modes/preferences/preference_panes.py:230
+#: deluge/ui/console/modes/preferences/preferences.py:90
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:21
+msgid "Downloads"
+msgstr "ЗавантаженнÑ"
+
+#: deluge/ui/common.py:131 deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:409
+#: deluge/ui/console/modes/preferences/preferences.py:92
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:68
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
+msgid "Bandwidth"
+msgstr "Смуга пропуÑканнÑ"
+
+#: deluge/ui/common.py:132
+#: deluge/ui/console/modes/preferences/preference_panes.py:550
+#: deluge/ui/console/modes/preferences/preferences.py:95
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/Menus.js:277
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:176
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:18
+msgid "Queue"
+msgstr "Черга"
+
+#: deluge/ui/common.py:133
+#: deluge/ui/console/modes/preferences/preference_panes.py:300
+#: deluge/ui/console/modes/preferences/preferences.py:91
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:28
+msgid "Network"
+msgstr "Мережа"
+
+#: deluge/ui/common.py:134 deluge/ui/gtk3/glade/preferences_dialog.ui.h:146
+#: deluge/ui/console/modes/preferences/preference_panes.py:640
+#: deluge/ui/console/modes/preferences/preference_panes.py:647
+#: deluge/ui/console/modes/preferences/preferences.py:96
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
+msgid "Proxy"
+msgstr "ПрокÑÑ–-Ñервер"
+
+#: deluge/ui/common.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:685
+#: deluge/ui/console/modes/preferences/preferences.py:97
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
+msgid "Cache"
+msgstr "Кеш"
+
+#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
+#: deluge/ui/console/modes/preferences/preference_panes.py:499
+#: deluge/ui/console/modes/preferences/preferences.py:93
+#: deluge/ui/web/js/deluge-all/Statusbar.js:80
+#: deluge/ui/web/js/deluge-all/Statusbar.js:139
+#: deluge/ui/web/js/deluge-all/Statusbar.js:198
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:21
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:69
+msgid "Other"
+msgstr "Інше"
+
+#: deluge/ui/common.py:137
+#: deluge/ui/console/modes/preferences/preference_panes.py:524
+#: deluge/ui/console/modes/preferences/preferences.py:94
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:18
+msgid "Daemon"
+msgstr "Фонова Ñлужба"
+
+#: deluge/ui/common.py:138
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:18
+msgid "Plugins"
+msgstr "Додатки"
+
+#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:365
+msgid "Skip"
+msgstr ""
+
+#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
+#: deluge/ui/web/js/deluge-all/Menus.js:371
+msgid "Low"
+msgstr "Ðизький"
+
+#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
+#: deluge/ui/web/js/deluge-all/Menus.js:377
+msgid "Normal"
+msgstr "Звичайний"
+
+#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
+#: deluge/ui/web/js/deluge-all/Menus.js:383
+msgid "High"
+msgstr "ВиÑокий"
+
+#: deluge/ui/client.py:681
+msgid ""
+"Deluge cannot find the `deluged` executable, check that the deluged package "
+"is installed, or added to your PATH."
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Afghanistan"
+msgstr "ÐфганіÑтан"
+
+#: deluge/ui/countries.py:11
+msgid "Aland Islands"
+msgstr "ÐландÑькі оÑтрови"
+
+#: deluge/ui/countries.py:12
+msgid "Albania"
+msgstr "ÐлбаніÑ"
+
+#: deluge/ui/countries.py:13
+msgid "Algeria"
+msgstr "Ðлжир"
+
+#: deluge/ui/countries.py:14
+msgid "American Samoa"
+msgstr "ÐмериканÑькі Самоа"
+
+#: deluge/ui/countries.py:15
+msgid "Andorra"
+msgstr "Ðндора"
+
+#: deluge/ui/countries.py:16
+msgid "Angola"
+msgstr "Ðнгола"
+
+#: deluge/ui/countries.py:17
+msgid "Anguilla"
+msgstr "ÐнгільÑ"
+
+#: deluge/ui/countries.py:18
+msgid "Antarctica"
+msgstr "Ðнтарктида"
+
+#: deluge/ui/countries.py:19
+msgid "Antigua and Barbuda"
+msgstr "Ðнтигуа Ñ– Барбуда"
+
+#: deluge/ui/countries.py:20
+msgid "Argentina"
+msgstr "Ðргентина"
+
+#: deluge/ui/countries.py:21
+msgid "Armenia"
+msgstr "ВірменіÑ"
+
+#: deluge/ui/countries.py:22
+msgid "Aruba"
+msgstr "Ðруба"
+
+#: deluge/ui/countries.py:23
+msgid "Australia"
+msgstr "ÐвÑтраліÑ"
+
+#: deluge/ui/countries.py:24
+msgid "Austria"
+msgstr "ÐвÑтріÑ"
+
+#: deluge/ui/countries.py:25
+msgid "Azerbaijan"
+msgstr "Ðзербайджан"
+
+#: deluge/ui/countries.py:26
+msgid "Bahamas"
+msgstr "БагамÑькі оÑтрови"
+
+#: deluge/ui/countries.py:27
+msgid "Bahrain"
+msgstr "Бахрейн"
+
+#: deluge/ui/countries.py:28
+msgid "Bangladesh"
+msgstr "Бангладеш"
+
+#: deluge/ui/countries.py:29
+msgid "Barbados"
+msgstr "БарбадоÑ"
+
+#: deluge/ui/countries.py:30
+msgid "Belarus"
+msgstr "БілоруÑÑŒ"
+
+#: deluge/ui/countries.py:31
+msgid "Belgium"
+msgstr "БельгіÑ"
+
+#: deluge/ui/countries.py:32
+msgid "Belize"
+msgstr "Беліз"
+
+#: deluge/ui/countries.py:33
+msgid "Benin"
+msgstr "Бенін"
+
+#: deluge/ui/countries.py:34
+msgid "Bermuda"
+msgstr "БермудÑькі ОÑтрови"
+
+#: deluge/ui/countries.py:35
+msgid "Bhutan"
+msgstr "Бутан"
+
+#: deluge/ui/countries.py:36
+msgid "Bolivia"
+msgstr "БолівіÑ"
+
+#: deluge/ui/countries.py:37
+msgid "Bosnia and Herzegovina"
+msgstr "БоÑÐ½Ñ–Ñ Ñ– Герцеговина"
+
+#: deluge/ui/countries.py:38
+msgid "Botswana"
+msgstr "БотÑвана"
+
+#: deluge/ui/countries.py:39
+msgid "Bouvet Island"
+msgstr "ОÑтрів Буве"
+
+#: deluge/ui/countries.py:40
+msgid "Brazil"
+msgstr "БразиліÑ"
+
+#: deluge/ui/countries.py:41
+msgid "British Indian Ocean Territory"
+msgstr "БританÑька Ð¢ÐµÑ€Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ Ð² ІндійÑькому Океані"
+
+#: deluge/ui/countries.py:42
+msgid "Brunei Darussalam"
+msgstr "Бруней ДаруÑÑалам"
+
+#: deluge/ui/countries.py:43
+msgid "Bulgaria"
+msgstr "БолгаріÑ"
+
+#: deluge/ui/countries.py:44
+msgid "Burkina Faso"
+msgstr "Буркіна-ФаÑо"
+
+#: deluge/ui/countries.py:45
+msgid "Burundi"
+msgstr "Бурунді"
+
+#: deluge/ui/countries.py:46
+msgid "Cambodia"
+msgstr "Камбоджа"
+
+#: deluge/ui/countries.py:47
+msgid "Cameroon"
+msgstr "Камерун"
+
+#: deluge/ui/countries.py:48
+msgid "Canada"
+msgstr "Канада"
+
+#: deluge/ui/countries.py:49
+msgid "Cape Verde"
+msgstr "Кабо-Верде"
+
+#: deluge/ui/countries.py:50
+msgid "Cayman Islands"
+msgstr "Кайманові ОÑтрови"
+
+#: deluge/ui/countries.py:51
+msgid "Central African Republic"
+msgstr "ЦентральноафриканÑька РеÑпубліка"
+
+#: deluge/ui/countries.py:52
+msgid "Chad"
+msgstr "Чад"
+
+#: deluge/ui/countries.py:53
+msgid "Chile"
+msgstr "Чилі"
+
+#: deluge/ui/countries.py:54
+msgid "China"
+msgstr "Китай"
+
+#: deluge/ui/countries.py:55
+msgid "Christmas Island"
+msgstr "ОÑтрів Різдва"
+
+#: deluge/ui/countries.py:56
+msgid "Cocos (Keeling) Islands"
+msgstr "КокоÑові (Кілінг) оÑтрови"
+
+#: deluge/ui/countries.py:57
+msgid "Colombia"
+msgstr "КолумбіÑ"
+
+#: deluge/ui/countries.py:58
+msgid "Comoros"
+msgstr "КоморÑькі ОÑтрови"
+
+#: deluge/ui/countries.py:59
+msgid "Congo"
+msgstr "Конго"
+
+#: deluge/ui/countries.py:60
+msgid "Congo, The Democratic Republic of the"
+msgstr "Конго, демократична реÑпубліка"
+
+#: deluge/ui/countries.py:61
+msgid "Cook Islands"
+msgstr "ОÑтрови Кука"
+
+#: deluge/ui/countries.py:62
+msgid "Costa Rica"
+msgstr "КоÑта-Ріка"
+
+#: deluge/ui/countries.py:63
+msgid "Cote d'Ivoire"
+msgstr "Кот-д'Івуар"
+
+#: deluge/ui/countries.py:64
+msgid "Croatia"
+msgstr "ХорватіÑ"
+
+#: deluge/ui/countries.py:65
+msgid "Cuba"
+msgstr "Куба"
+
+#: deluge/ui/countries.py:66
+msgid "Cyprus"
+msgstr "Кіпр"
+
+#: deluge/ui/countries.py:67
+msgid "Czech Republic"
+msgstr "ЧехіÑ"
+
+#: deluge/ui/countries.py:68
+msgid "Denmark"
+msgstr "ДаніÑ"
+
+#: deluge/ui/countries.py:69
+msgid "Djibouti"
+msgstr "Джибуті"
+
+#: deluge/ui/countries.py:70
+msgid "Dominica"
+msgstr "Домініка"
+
+#: deluge/ui/countries.py:71
+msgid "Dominican Republic"
+msgstr "ДомініканÑька реÑпубліка"
+
+#: deluge/ui/countries.py:72
+msgid "Ecuador"
+msgstr "Еквадор"
+
+#: deluge/ui/countries.py:73
+msgid "Egypt"
+msgstr "Єгипет"
+
+#: deluge/ui/countries.py:74
+msgid "El Salvador"
+msgstr "Сальвадор"
+
+#: deluge/ui/countries.py:75
+msgid "Equatorial Guinea"
+msgstr "Екваторіальна ГвінеÑ"
+
+#: deluge/ui/countries.py:76
+msgid "Eritrea"
+msgstr "ЕритреÑ"
+
+#: deluge/ui/countries.py:77
+msgid "Estonia"
+msgstr "ЕÑтоніÑ"
+
+#: deluge/ui/countries.py:78
+msgid "Ethiopia"
+msgstr "ЕфіопіÑ"
+
+#: deluge/ui/countries.py:79
+msgid "Falkland Islands (Malvinas)"
+msgstr "ФолклендÑькі (МальвінÑькі) оÑтрови"
+
+#: deluge/ui/countries.py:80
+msgid "Faroe Islands"
+msgstr "ФарерÑькі ОÑтрови"
+
+#: deluge/ui/countries.py:81
+msgid "Fiji"
+msgstr "Фіджі"
+
+#: deluge/ui/countries.py:82
+msgid "Finland"
+msgstr "ФінлÑндіÑ"
+
+#: deluge/ui/countries.py:83
+msgid "France"
+msgstr "ФранціÑ"
+
+#: deluge/ui/countries.py:84
+msgid "French Guiana"
+msgstr "Французька Гвіана"
+
+#: deluge/ui/countries.py:85
+msgid "French Polynesia"
+msgstr "Французька ПолінезіÑ"
+
+#: deluge/ui/countries.py:86
+msgid "French Southern Territories"
+msgstr "Французькі Південні Території"
+
+#: deluge/ui/countries.py:87
+msgid "Gabon"
+msgstr "Òабон"
+
+#: deluge/ui/countries.py:88
+msgid "Gambia"
+msgstr "ГамбіÑ"
+
+#: deluge/ui/countries.py:89
+msgid "Georgia"
+msgstr "ГрузіÑ"
+
+#: deluge/ui/countries.py:90
+msgid "Germany"
+msgstr "Ðімеччина"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "Гана"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "Гібралтар"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "ГреціÑ"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "ГренландіÑ"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "Гренада"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "Òваделупа"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "Гуам"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "Гватемала"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "ОÑтрів ГернÑÑ–"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "ГвінеÑ"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "ГвінеÑ-БіÑау"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "ГаÑна"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "Гаїті"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "ОÑтрів Херд Ñ– оÑтрови Макдональд"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "СвÑтий ПреÑтол (Ватикан, МіÑто-Держава)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "ГондураÑ"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "Гонконг"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "Угорщина"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "ІÑландіÑ"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "ІндіÑ"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "ІндонезіÑ"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "Іран"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "Ірак"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "ІрландіÑ"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "ОÑтрів Мен"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "Ізраїль"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "ІталіÑ"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "Ямайка"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "ЯпоніÑ"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "ДжерÑÑ–"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "ЙорданіÑ"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "КазахÑтан"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "КеніÑ"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "Кірибаті"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "Північна КореÑ"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "Південна КореÑ"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "Кувейт"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "КиргизÑтан"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "ЛаоÑька Ðародно-Демократична РеÑпубліка"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "ЛатвіÑ"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "Ліван"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "ЛеÑото"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "ЛіберіÑ"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "ЛівіÑ"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "Ліхтенштейн"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "Литва"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "ЛюкÑембург"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "Макао"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "МакедоніÑ, ÐšÐ¾Ð»Ð¸ÑˆÐ½Ñ Ð®Ð³Ð¾ÑлавÑька РеÑпубліка"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "МадагаÑкар"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "Малаві"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "МалайзіÑ"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "Мальдіви"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "Малі"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "Мальта"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "Маршаллові ОÑтрови"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "Мартиніка"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "МавританіÑ"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "Маврикій"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "Майотта"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "МекÑика"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "МікронезіÑ, Федеративні Штати"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "Молдова"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "Монако"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "МонголіÑ"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "ЧорногоріÑ"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "МонтÑерат"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "Марокко"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "Мозамбік"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "М’Ñнма"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "ÐамібіÑ"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "Ðауру"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "Ðепал"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "Ðідерланди"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "ÐідерландÑькі ÐнтильÑькі ОÑтрови"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "Ðова КаледоніÑ"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "Ðова ЗелÑндіÑ"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "Ðікарагуа"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "Ðігер"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "ÐігеріÑ"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "Ðіуе"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "ОÑтрів Ðорфолк"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "Північні МаріанÑькі ОÑтрови"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "ÐорвегіÑ"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "Оман"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "ПакиÑтан"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "Палау"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "ПалеÑтинÑькі Території"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "Панама"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "Папуа Ðова ГвінеÑ"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "Парагвай"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "Перу"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "Філіппіни"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "Піткерн"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "Польща"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "ПортугаліÑ"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "Пуерто-Ріко"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "Катар"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "Реюньйон"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "РумуніÑ"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "РоÑÑ–Ñ"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "Руанда"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "Сен-Бартельмі"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "ОÑтрів СвÑтої Єлени"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "Сент-ÐšÑ–Ñ‚Ñ Ñ– ÐевіÑ"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "Сент-ЛюÑÑ–Ñ"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "Сен-Мартен"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "Сен-П'єр і Мікелон"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "Сент-ВінÑент Ñ– Гренадини"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "Самоа"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "Сан-Марино"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "Сан-Томе Ñ– ПринÑіпі"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "СаудівÑька ÐравіÑ"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "Сенегал"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "СербіÑ"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "СейшельÑькі ОÑтрови"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "Сьєра-Леоне"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "Сінгапур"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "Словаччина"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "СловеніÑ"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "Соломонові ОÑтрови"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "Сомалі"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "Південна Ðфрика"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Південна Ð”Ð¶Ð¾Ñ€Ð´Ð¶Ñ–Ñ Ñ‚Ð° Південні Сандвічеві ОÑтрови"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "ІÑпаніÑ"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "Шрі-Ланка"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "Судан"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "Суринам"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "ОÑтрови Свальбард Ñ– Ян Маєн"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "Свазіленд"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "ШвеціÑ"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "ШвейцаріÑ"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "СирійÑька ÐрабÑька РеÑпубліка"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan"
+msgstr "Тайвань"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "ТаджикіÑтан"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "ТанзаніÑ, Об’єднана РеÑпубліка"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "Таїланд"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "Східний Тимор"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "Того"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "ОÑтрови Токелау"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "Тонга"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "Тринідад та Тобаго"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "ТуніÑ"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "Туреччина"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "ТуркменіÑтан"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "ОÑтрови Ð¢ÐµÑ€ÐºÑ Ñ– КайкоÑ"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "Тувалу"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "Уганда"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "Україна"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "Об’єднані ÐрабÑькі Емірати"
+
+#: deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "ВеликобританіÑ"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "СШÐ"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "Зовнішні малі оÑтрови СШÐ"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "Уругвай"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "УзбекіÑтан"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "Вануату"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "ВенеÑуела"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "В'єтнам"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "ВіргінÑькі оÑтрови (БританіÑ)"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "ВіргінÑькі оÑтрови (СШÐ)"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "Ð’Ð¾Ð»Ð»Ñ–Ñ Ñ– Футуна"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "Західна Сахара"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "Ємен"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "ЗамбіÑ"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "Зімбабве"
+
+#: deluge/ui/ui_entry.py:51
+msgid "UI Options"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:57
+msgid "Set the default UI to be run, when no UI is specified"
+msgstr ""
+
+#: deluge/ui/ui_entry.py:91
+msgid ""
+"Alternative UI to launch, with optional ui args \n"
+" (default UI: *)"
+msgstr ""
+
+#: deluge/ui/web/web.py:32
+msgid "Web Server Options"
+msgstr "Параметри веб-Ñервера"
+
+#: deluge/ui/web/web.py:38
+msgid "IP address for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:46
+msgid "Port for web server to listen on"
+msgstr ""
+
+#: deluge/ui/web/web.py:53
+msgid "Set the base path that the ui is running on"
+msgstr ""
+
+#: deluge/ui/web/web.py:56
+msgid "Force the web server to use SSL"
+msgstr ""
+
+#: deluge/ui/web/web.py:61
+msgid "Force the web server to disable SSL"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:868
+msgid "Daemon does not exist"
+msgstr "Фонової Ñлужби не Ñ–Ñнує"
+
+#: deluge/ui/web/json_api.py:875
+msgid "Daemon not running"
+msgstr "Фонова Ñлужба не запущена"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:62
+#: deluge/ui/gtk3/addtorrentdialog.py:105 deluge/ui/gtk3/files_tab.py:92
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:18
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:28
+msgid "Filename"
+msgstr "Ðазва файла"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:85
+#: deluge/ui/gtk3/edittrackersdialog.py:124
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:52
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:128
+msgid "Choose a file"
+msgstr "Виберіть файл"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:132
+#: deluge/ui/gtk3/createtorrentdialog.py:169
+#: deluge/ui/gtk3/createtorrentdialog.py:258
+#: deluge/ui/gtk3/addtorrentdialog.py:690 deluge/ui/gtk3/dialogs.py:203
+#: deluge/ui/gtk3/dialogs.py:261 deluge/ui/gtk3/dialogs.py:273
+#: deluge/ui/gtk3/dialogs.py:364 deluge/ui/gtk3/dialogs.py:427
+#: deluge/ui/gtk3/preferences.py:1158
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:15
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:2
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:2
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:2
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:1
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:2
+msgid "_Cancel"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:134
+#: deluge/ui/gtk3/createtorrentdialog.py:171
+#: deluge/ui/gtk3/addtorrentdialog.py:692 deluge/ui/gtk3/preferences.py:1160
+msgid "_Open"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:165
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:28
+msgid "Choose a folder"
+msgstr "Оберіть теку"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:254
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:4
+msgid "Save .torrent file"
+msgstr "Зберегти .torrent файл"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:260
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:30
+msgid "_Save"
+msgstr ""
+
+#: deluge/ui/gtk3/createtorrentdialog.py:271
+#: deluge/ui/gtk3/addtorrentdialog.py:704
+msgid "Torrent files"
+msgstr "Торент файли"
+
+#: deluge/ui/gtk3/createtorrentdialog.py:275
+#: deluge/ui/gtk3/addtorrentdialog.py:708
+msgid "All files"
+msgstr "Ð’ÑÑ– файли"
+
+#: deluge/ui/gtk3/mainwindow.py:185
+msgid "Enter your password to show Deluge..."
+msgstr "Введіть ваш пароль щоб показати Deluge..."
+
+#: deluge/ui/gtk3/mainwindow.py:244
+msgid "Enter your password to Quit Deluge..."
+msgstr "Введіть ваш пароль щоб вийти з Deluge..."
+
+#: deluge/ui/gtk3/mainwindow.py:336
+#, python-brace-format
+msgid "D: {download_rate} U: {upload_rate} - Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/mainwindow.py:350 deluge/ui/gtk3/aboutdialog.py:26
+#: deluge/ui/gtk3/aboutdialog.py:27 deluge/ui/gtk3/systemtray.py:96
+#: deluge/ui/gtk3/systemtray.py:184 deluge/ui/gtk3/systemtray.py:244
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:23
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:91
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtk3/options_tab.py:136
+msgid "_Apply to selected"
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:40
+#, python-format
+msgid "Copyright %(year_start)s-%(year_end)s Deluge Team"
+msgstr "ÐвторÑькі права команди Deluge %(year_start)s-%(year_end)s"
+
+#: deluge/ui/gtk3/aboutdialog.py:44
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:52
+msgid ""
+"A peer-to-peer file sharing program\n"
+"utilizing the BitTorrent protocol."
+msgstr ""
+"Програма Ñпільного доÑтупу до файлів\n"
+"з викориÑтаннÑм протоколу BitTorrent."
+
+#: deluge/ui/gtk3/aboutdialog.py:46
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:55
+msgid "Client:"
+msgstr "Клієнт:"
+
+#: deluge/ui/gtk3/aboutdialog.py:52
+msgid "Current Developers:"
+msgstr "Поточні розробники:"
+
+#: deluge/ui/gtk3/aboutdialog.py:61
+msgid "Past Developers or Contributors:"
+msgstr "Минулі розробники чи автори:"
+
+#: deluge/ui/gtk3/aboutdialog.py:795
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtk3/aboutdialog.py:829
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
+msgid "Server:"
+msgstr "Сервер:"
+
+#: deluge/ui/gtk3/aboutdialog.py:833
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:41
+msgid "libtorrent:"
+msgstr "libtorrent:"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:97 deluge/ui/gtk3/queuedtorrents.py:51
+msgid "Torrent"
+msgstr "Торент"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:224
+#, python-format
+msgid "Add Torrents (%d)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:230
+msgid "Duplicate torrent(s)"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:232
+#, python-format
+msgid ""
+"You cannot add the same torrent twice. %d torrents were already added."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:247
+msgid "Invalid File"
+msgstr "Ðевірний файл"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:282
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:8
+msgid "Please wait for files..."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:288
+msgid "Unable to download files for this magnet"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:686
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:769
+msgid "Invalid URL"
+msgstr "Ðевірне поÑиланнÑ"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:770
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtk3/addtorrentdialog.py:776
+msgid "Downloading..."
+msgstr "ЗавантаженнÑ..."
+
+#: deluge/ui/gtk3/addtorrentdialog.py:811
+msgid "Download Failed"
+msgstr "Помилка завантаженнÑ"
+
+#: deluge/ui/gtk3/addtorrentdialog.py:812
+msgid "Failed to download:"
+msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸:"
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_No"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:110
+msgid "_Yes"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:132 deluge/ui/gtk3/dialogs.py:156
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:2
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:2
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:2
+msgid "_Close"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:179
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:195
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:38
+msgid "Details:"
+msgstr "Подробиці:"
+
+#: deluge/ui/gtk3/dialogs.py:200
+msgid "Authenticate"
+msgstr "ÐвтентифікаціÑ"
+
+#: deluge/ui/gtk3/dialogs.py:203 deluge/ui/gtk3/connectionmanager.py:211
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:3
+msgid "C_onnect"
+msgstr "З’_єднати"
+
+#: deluge/ui/gtk3/dialogs.py:209 deluge/ui/gtk3/dialogs.py:281
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:139
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:6
+#: deluge/ui/console/modes/connectionmanager.py:123
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:7
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
+msgid "Username:"
+msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:"
+
+#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
+#: deluge/ui/gtk3/dialogs.py:437
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:7
+#: deluge/ui/console/modes/connectionmanager.py:124
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:8
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:72
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:47
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:83
+msgid "Password:"
+msgstr "Пароль:"
+
+#: deluge/ui/gtk3/dialogs.py:257
+msgid "Edit Account"
+msgstr "Редагувати обліковий запиÑ"
+
+#: deluge/ui/gtk3/dialogs.py:258
+msgid "Edit existing account"
+msgstr "Змінити Ñ–Ñнуючий обліковий запиÑ"
+
+#: deluge/ui/gtk3/dialogs.py:263 deluge/ui/gtk3/dialogs.py:364
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:16
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:38
+msgid "_Apply"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:270
+msgid "New Account"
+msgstr "Ðовий обліковий запиÑ"
+
+#: deluge/ui/gtk3/dialogs.py:271
+msgid "Create a new account"
+msgstr "Створити новий обліковий запиÑ"
+
+#: deluge/ui/gtk3/dialogs.py:273 deluge/ui/gtk3/glade/queuedtorrents.ui.h:3
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:191
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:20
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:4
+msgid "_Add"
+msgstr ""
+
+#: deluge/ui/gtk3/dialogs.py:289
+msgid "Authentication Level:"
+msgstr "Рівень автентифікації:"
+
+#: deluge/ui/gtk3/dialogs.py:423
+msgid "Password Protected"
+msgstr "Захищено паролем"
+
+#: deluge/ui/gtk3/dialogs.py:429
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:17
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:3
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:3
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:3
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:3
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:2
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:3
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:3
+msgid "_OK"
+msgstr ""
+
+#: deluge/ui/gtk3/common.py:155 deluge/ui/gtk3/menubar.py:83
+msgid "Other..."
+msgstr "Інше..."
+
+#: deluge/ui/gtk3/statusbar.py:155 deluge/ui/web/js/deluge-all/Statusbar.js:18
+msgid "Not Connected"
+msgstr "Ðе з'єднано"
+
+#: deluge/ui/gtk3/statusbar.py:175
+msgid "Connections (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:182
+msgid "Download Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:189
+msgid "Upload Speed (Limit)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:196
+msgid "Protocol Traffic (Down:Up)"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:201 deluge/ui/web/js/deluge-all/Statusbar.js:234
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:207
+msgid "Free Disk Space"
+msgstr "Вільне міÑце на диÑку"
+
+#: deluge/ui/gtk3/statusbar.py:212 deluge/ui/web/js/deluge-all/Statusbar.js:226
+msgid "External IP Address"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:409
+#, python-format
+msgid "<b>IP</b> <small>%s</small>"
+msgstr "<b>IP</b> <small>%s</small>"
+
+#: deluge/ui/gtk3/statusbar.py:213 deluge/ui/gtk3/statusbar.py:408
+#: deluge/ui/console/widgets/statusbars.py:121
+#: deluge/ui/web/js/deluge-all/Statusbar.js:358
+msgid "n/a"
+msgstr "н/д"
+
+#: deluge/ui/gtk3/statusbar.py:220
+msgid "<b><small>Port Issue</small></b>"
+msgstr ""
+
+#: deluge/ui/gtk3/statusbar.py:222
+msgid "No incoming connections, check port forwarding"
+msgstr "ВідÑутні вхідні з'єднаннÑ, перевірте Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð²"
+
+#: deluge/ui/gtk3/statusbar.py:475 deluge/ui/gtk3/systemtray.py:394
+#: deluge/ui/gtk3/menubar.py:447
+msgid "Download Speed Limit"
+msgstr "ШвидкіÑÑ‚ÑŒ завантаженнÑ"
+
+#: deluge/ui/gtk3/statusbar.py:476 deluge/ui/gtk3/systemtray.py:395
+#: deluge/ui/gtk3/menubar.py:448
+msgid "Set the maximum download speed"
+msgstr "Ð’Ñтановити Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¼Ð°ÐºÑимальної швидкоÑÑ‚Ñ– завантаженнÑ."
+
+#: deluge/ui/gtk3/statusbar.py:482 deluge/ui/gtk3/systemtray.py:409
+#: deluge/ui/gtk3/menubar.py:453
+msgid "Upload Speed Limit"
+msgstr "ШвидкіÑÑ‚ÑŒ розповÑюдженнÑ"
+
+#: deluge/ui/gtk3/statusbar.py:483 deluge/ui/gtk3/systemtray.py:410
+#: deluge/ui/gtk3/menubar.py:454
+msgid "Set the maximum upload speed"
+msgstr "Ð’Ñтановити Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¼Ð°ÐºÑимальної швидкоÑÑ‚Ñ– розповÑюдженнÑ."
+
+#: deluge/ui/gtk3/statusbar.py:489 deluge/ui/gtk3/menubar.py:459
+msgid "Incoming Connections"
+msgstr "Вхідні з’єднаннÑ"
+
+#: deluge/ui/gtk3/statusbar.py:490 deluge/ui/gtk3/menubar.py:460
+msgid "Set the maximum incoming connections"
+msgstr "Ð’Ñтановити макÑимальну кількіÑÑ‚ÑŒ вхідних з'єднань"
+
+#: deluge/ui/gtk3/tab_data_funcs.py:28
+#, python-brace-format
+msgid "{state} {percent}%"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:30
+#, python-brace-format
+msgid "{state}: {err_msg}"
+msgstr ""
+
+#: deluge/ui/gtk3/tab_data_funcs.py:42
+#: deluge/ui/gtk3/torrentview_data_funcs.py:284
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:74
+msgid "Never"
+msgstr "Ðіколи"
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "Yes"
+msgstr "Так"
+
+#: deluge/ui/gtk3/tab_data_funcs.py:96
+msgid "No"
+msgstr "ÐÑ–"
+
+#: deluge/ui/gtk3/files_tab.py:140
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:48
+msgid "Priority"
+msgstr "Пріоритет"
+
+#: deluge/ui/gtk3/torrentdetails.py:142
+msgid "_All"
+msgstr "_Ð’ÑÑ–"
+
+#: deluge/ui/gtk3/torrentdetails.py:143
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:15
+msgid "_Status"
+msgstr "_Стан"
+
+#: deluge/ui/gtk3/torrentdetails.py:144
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:26
+msgid "_Details"
+msgstr "По_дробиці"
+
+#: deluge/ui/gtk3/torrentdetails.py:145
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:27
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:9
+msgid "Fi_les"
+msgstr "Фай_ли"
+
+#: deluge/ui/gtk3/torrentdetails.py:146
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:28
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/torrentdetails.py:147
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:45
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:36
+msgid "_Options"
+msgstr "П_араметри"
+
+#: deluge/ui/gtk3/torrentdetails.py:148
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:52
+msgid "_Trackers"
+msgstr "_Трекери"
+
+#: deluge/ui/gtk3/systemtray.py:184
+msgid "Not Connected..."
+msgstr "Ðе з'єднано…"
+
+#: deluge/ui/gtk3/systemtray.py:235 deluge/ui/gtk3/systemtray.py:239
+#: deluge/ui/web/js/deluge-all/Statusbar.js:73
+#: deluge/ui/web/js/deluge-all/Statusbar.js:132
+#: deluge/ui/web/js/deluge-all/Statusbar.js:191
+#: deluge/ui/web/js/deluge-all/Menus.js:109
+#: deluge/ui/web/js/deluge-all/Menus.js:154
+#: deluge/ui/web/js/deluge-all/Menus.js:199
+#: deluge/ui/web/js/deluge-all/Menus.js:244
+msgid "Unlimited"
+msgstr "Ðеобмежено"
+
+#: deluge/ui/gtk3/systemtray.py:245
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:39
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:3
+#: deluge/ui/web/js/deluge-all/Toolbar.js:77
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:298
+msgid "Down"
+msgstr "Ðижче"
+
+#: deluge/ui/gtk3/systemtray.py:248
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:37
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:2
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:33
+#: deluge/ui/web/js/deluge-all/Toolbar.js:70
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:291
+msgid "Up"
+msgstr "Вище"
+
+#: deluge/ui/gtk3/gtkui.py:318
+msgid ""
+"A Deluge daemon (deluged) is already running.\n"
+"To use Standalone mode, stop local daemon and restart Deluge."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:324
+msgid ""
+"Only Thin Client mode is available because libtorrent is not installed.\n"
+"To use Standalone mode, please install libtorrent package."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:330 deluge/ui/gtk3/gtkui.py:336
+msgid ""
+"Only Thin Client mode is available due to unknown Import Error.\n"
+"To use Standalone mode, please see logs for error details."
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:354
+msgid "Continue in Thin Client mode?"
+msgstr ""
+
+#: deluge/ui/gtk3/gtkui.py:355
+msgid "Change User Interface Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:52
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
+msgid "Offline"
+msgstr "Поза мережею"
+
+#: deluge/ui/gtk3/connectionmanager.py:53
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:53
+msgid "Online"
+msgstr "В мережі"
+
+#: deluge/ui/gtk3/connectionmanager.py:54
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:59
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:110
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:176
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:48
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:17
+msgid "Status"
+msgstr "Стан"
+
+#: deluge/ui/gtk3/connectionmanager.py:115
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:66
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:122
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:73
+msgid "Version"
+msgstr "ВерÑÑ–Ñ"
+
+#: deluge/ui/gtk3/connectionmanager.py:219
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:8
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:250
+msgid "_Stop Daemon"
+msgstr "_Зупинити фонову Ñлужбу"
+
+#: deluge/ui/gtk3/connectionmanager.py:255
+msgid "_Disconnect"
+msgstr "_Від'єднати"
+
+#: deluge/ui/gtk3/connectionmanager.py:280
+msgid "Unable to start daemon!"
+msgstr "Ðе вдаєтьÑÑ Ð·Ð°ÑƒÐ¿ÑƒÑтити фонову Ñлужбу!"
+
+#: deluge/ui/gtk3/connectionmanager.py:281
+msgid "Check deluged package is installed and logs for further details"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:332
+msgid "Incompatible Client"
+msgstr "ÐеÑуміÑний клієнт"
+
+#: deluge/ui/gtk3/connectionmanager.py:343
+msgid ""
+"Auto-starting the daemon locally is not enabled. See \"Options\" on the "
+"\"Connection Manager\"."
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:346
+msgid "Failed To Connect"
+msgstr "Помилка з'єднаннÑ"
+
+#: deluge/ui/gtk3/connectionmanager.py:403
+msgid "Edit Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:428
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtk3/connectionmanager.py:464
+msgid "Error Updating Host"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:131
+#: deluge/ui/console/cmdline/commands/connect.py:33
+#: deluge/ui/console/modes/preferences/preference_panes.py:651
+msgid "Username"
+msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
+
+#: deluge/ui/gtk3/preferences.py:135
+#: deluge/ui/console/modes/preferences/preference_panes.py:399
+msgid "Level"
+msgstr "Рівень"
+
+#: deluge/ui/gtk3/preferences.py:159
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:2
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:46
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
+msgid "Enabled"
+msgstr "Увімкнено"
+
+#: deluge/ui/gtk3/preferences.py:162
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
+msgid "Plugin"
+msgstr "Додатки"
+
+#: deluge/ui/gtk3/preferences.py:876 deluge/ui/gtk3/preferences.py:886
+msgid "Attention"
+msgstr "Увага"
+
+#: deluge/ui/gtk3/preferences.py:876
+msgid "You must choose a language"
+msgstr "Вам потрібно вибрати мову"
+
+#: deluge/ui/gtk3/preferences.py:887
+msgid "You must now restart the deluge UI for the changes to take effect."
+msgstr ""
+"Тепер вам потрібно перезапуÑтити Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, щоб зміни вÑтупили в "
+"Ñилу."
+
+#: deluge/ui/gtk3/preferences.py:942
+msgid "Switching Deluge Client Mode..."
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:943
+#, python-format
+msgid "Do you want to restart to use %s mode?"
+msgstr "ПерезапуÑтити програму Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ %s ?"
+
+#: deluge/ui/gtk3/preferences.py:1154
+msgid "Select the Plugin"
+msgstr "Виберіть додаток"
+
+#: deluge/ui/gtk3/preferences.py:1170
+msgid "Plugin Eggs"
+msgstr "Додаток Eggs"
+
+#: deluge/ui/gtk3/preferences.py:1297
+msgid "Server Side Error"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1298
+msgid "An error occurred on the server"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1368 deluge/ui/gtk3/preferences.py:1375
+msgid "Error Adding Account"
+msgstr "Помилка Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу"
+
+#: deluge/ui/gtk3/preferences.py:1369
+msgid "Authentication failed"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1376
+msgid "An error occurred while adding account"
+msgstr "Під Ñ‡Ð°Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
+
+#: deluge/ui/gtk3/preferences.py:1408
+msgid "Error Updating Account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1409
+msgid "An error occurred while updating account"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1427
+msgid "Remove Account"
+msgstr "Видалити обліковий запиÑ"
+
+#: deluge/ui/gtk3/preferences.py:1429
+#, python-format
+msgid ""
+"Are you sure you want to remove the account with the username "
+"\"%(username)s\"?"
+msgstr ""
+
+#: deluge/ui/gtk3/preferences.py:1441 deluge/ui/gtk3/preferences.py:1448
+msgid "Error Removing Account"
+msgstr "Помилка Ð²Ð¸Ð´ÐµÐ»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу"
+
+#: deluge/ui/gtk3/preferences.py:1442
+msgid "Auhentication failed"
+msgstr "Помилка аутентифікації"
+
+#: deluge/ui/gtk3/preferences.py:1449
+msgid "An error occurred while removing account"
+msgstr "Під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
+
+#: deluge/ui/gtk3/filtertreeview.py:127
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:28
+msgid "States"
+msgstr "Стани"
+
+#: deluge/ui/gtk3/filtertreeview.py:133
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:23
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:21
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:30
+msgid "Trackers"
+msgstr "Трекери"
+
+#: deluge/ui/gtk3/filtertreeview.py:137 deluge/ui/gtk3/filtertreeview.py:143
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:33
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtk3/filtertreeview.py:142
+msgid "Admin"
+msgstr "ÐдмініÑтратор"
+
+#: deluge/ui/gtk3/filtertreeview.py:164
+#: deluge/ui/web/js/deluge-all/FilterPanel.js:34
+msgid "Labels"
+msgstr "Мітки"
+
+#: deluge/ui/gtk3/filtertreeview.py:209
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:28
+msgid "No Label"
+msgstr "Мітка відÑутнÑ"
+
+#: deluge/ui/gtk3/filtertreeview.py:211
+msgid "No Owner"
+msgstr "Ðемає влаÑника"
+
+#: deluge/ui/gtk3/new_release_dialog.py:60
+msgid "<i>Client Version</i>"
+msgstr "<i>ВерÑÑ–Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°</i>"
+
+#: deluge/ui/gtk3/queuedtorrents.py:118
+msgid " Torrents Queued"
+msgstr " Торентів в черзі"
+
+#: deluge/ui/gtk3/queuedtorrents.py:120
+msgid " Torrent Queued"
+msgstr " Торент в черзі"
+
+#: deluge/ui/gtk3/torrentview.py:421
+msgid "Torrent is shared between other Deluge users or not."
+msgstr ""
+
+#: deluge/ui/gtk3/removetorrentdialog.py:67
+msgid "Remove the selected torrents?"
+msgstr "Видалити обрані торренти?"
+
+#: deluge/ui/gtk3/removetorrentdialog.py:68
+#, python-format
+msgid "Total of %s torrents selected"
+msgstr "Ð’Ñього вибрано %s торрентів"
+
+#: deluge/ui/gtk3/menubar.py:79
+msgid "Set Unlimited"
+msgstr "Без обмежень"
+
+#: deluge/ui/gtk3/menubar.py:91 deluge/ui/web/js/deluge-all/Menus.js:259
+msgid "On"
+msgstr "Увімкн."
+
+#: deluge/ui/gtk3/menubar.py:94 deluge/ui/web/js/deluge-all/Menus.js:265
+msgid "Off"
+msgstr "Вимкн."
+
+#: deluge/ui/gtk3/menubar.py:101
+msgid "Disable"
+msgstr "Вимкнути"
+
+#: deluge/ui/gtk3/menubar.py:104
+msgid "Enable..."
+msgstr "Увімкнути..."
+
+#: deluge/ui/gtk3/menubar.py:465
+msgid "Peer Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:466
+msgid "Set the maximum upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:471
+msgid "Stop Seed At Ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/menubar.py:606
+msgid "Ownership Change Error"
+msgstr "Помилка зміни влаÑноÑÑ‚Ñ–"
+
+#: deluge/ui/gtk3/menubar.py:607
+msgid "There was an error while trying changing ownership."
+msgstr "Під Ñ‡Ð°Ñ Ñпроби змінити право влаÑноÑÑ‚Ñ– ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
+
+#: deluge/ui/gtk3/peers_tab.py:91
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:66
+msgid "Address"
+msgstr "ÐдреÑи"
+
+#: deluge/ui/gtk3/peers_tab.py:107
+#: deluge/ui/web/js/deluge-all/details/PeersTab.js:73
+msgid "Client"
+msgstr "Клієнт"
+
+#: deluge/ui/gtk3/__init__.py:29
+msgid "GTK Options"
+msgstr "Параметри GTK"
+
+#: deluge/ui/gtk3/__init__.py:36
+msgid ""
+"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
+"running Deluge GTK instance"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
+msgid "Creating Torrent"
+msgstr "Створити трекер"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:1
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
+msgid "Add Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:7
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:21
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:6
+msgid "_Remove"
+msgstr "_Видалити"
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:6
+msgid "_Clear"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:7
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:12
+msgid "_File"
+msgstr "_Файл"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:2
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:2
+msgid "_Add Torrent"
+msgstr "_Додати торент"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:3
+msgid "_Create Torrent"
+msgstr "_Створити торент"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:4
+msgid "Quit & _Shutdown Daemon"
+msgstr "Вийти & _Вимкнути фонову Ñлужбу"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:5
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:8
+msgid "_Quit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:6
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:192
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:6
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:5
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:7
+msgid "_Preferences"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:8
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:9
+msgid "_Torrent"
+msgstr "_Торент"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:10
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:11
+msgid "_Toolbar"
+msgstr "Панель _інÑтрументів"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:12
+msgid "_Sidebar"
+msgstr "_Бічна панель"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:13
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:14
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:15
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:16
+msgid "_Find ..."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:17
+msgid "S_idebar"
+msgstr "_Бічна панель"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:18
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:19
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:20
+msgid "Show _Owners"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:21
+msgid "_Help"
+msgstr "_Довідка"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:22
+msgid "_Homepage"
+msgstr "_Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:23
+msgid "_FAQ"
+msgstr "_ЧаПи"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:24
+msgid "Frequently Asked Questions"
+msgstr "ÐŸÐ¸Ñ‚Ð°Ð½Ð½Ñ Ñ‰Ð¾ задаютьÑÑ Ð½Ð°Ð¹Ñ‡Ð°Ñтіше"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:25
+msgid "_Community"
+msgstr "_Спільнота"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:26
+msgid "_About"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:27
+msgid "Add torrent"
+msgstr "Додати торент"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:28
+msgid "Add Torrent"
+msgstr "Додати торрент"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:29
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:221
+msgid "Remove torrent"
+msgstr "Видалити торент"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:30
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:105
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:16
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:34
+#: deluge/ui/web/js/deluge-all/Menus.js:331
+msgid "Remove Torrent"
+msgstr "Видалити торент"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:31
+msgid ""
+"Filter torrents by name.\n"
+"This will filter torrents for the current selection on the sidebar."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:33
+msgid "Filter"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:34
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:54
+#: deluge/ui/web/js/deluge-all/Menus.js:52
+msgid "Pause"
+msgstr "Призупинити"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:36
+msgid "Resume the selected torrents"
+msgstr "Відновити обрані торенти"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:37
+#: deluge/ui/web/js/deluge-all/Toolbar.js:61
+#: deluge/ui/web/js/deluge-all/Menus.js:59
+msgid "Resume"
+msgstr "Відновити"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:38
+msgid "Queue Torrent Up"
+msgstr "ПоÑунути торент вище по черзі"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:39
+msgid "Queue Up"
+msgstr "ПереміÑтити вгору"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:40
+msgid "Queue Torrent Down"
+msgstr "ПоÑунути торент нижче по черзі"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:41
+msgid "Queue Down"
+msgstr "ПереміÑтити вниз"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:42
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:14
+#: deluge/ui/web/js/deluge-all/Toolbar.js:84
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:24
+msgid "Preferences"
+msgstr "ÐалаштуваннÑ"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:43
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:1
+#: deluge/ui/web/js/deluge-all/Toolbar.js:91
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:21
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:44
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:2
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:111
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:32
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:32
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:211
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:86
+msgid "Close"
+msgstr "Закрити"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:45
+msgid "Filter:"
+msgstr "Фільтр:"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:46
+msgid "Clear the search"
+msgstr "ОчиÑтити пошук"
+
+#: deluge/ui/gtk3/glade/main_window.ui.h:47
+msgid "_Match Case"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:1
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:45
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:66
+msgid "Forced"
+msgstr "ПримуÑово"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:3
+#: deluge/ui/console/modes/preferences/preference_panes.py:383
+#: deluge/ui/console/modes/preferences/preference_panes.py:392
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:47
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:68
+msgid "Disabled"
+msgstr "Вимкнено"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:4
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:87
+msgid "Handshake"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:5
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:88
+msgid "Full Stream"
+msgstr "Повний потік"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:6
+#: deluge/ui/console/modes/preferences/preference_panes.py:400
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:89
+msgid "Either"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:8
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:34
+msgid "Socks4"
+msgstr "Socks4"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:9
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:35
+msgid "Socks5"
+msgstr "Socks5"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
+msgid "Socks5 Auth"
+msgstr "Socks5 автентифікаціÑ"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
+msgid "HTTP"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
+msgid "HTTP Auth"
+msgstr "HTTP автентифікаціÑ"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
+msgid "I2P"
+msgstr "I2P"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:18
+msgid "Standalone"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:19
+msgid "The standalone self-contained application"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:20
+msgid "Thin Client"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
+msgid "Connect to a Deluge daemon (deluged)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
+msgid "Application Mode"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
+msgid "Show session speed in titlebar"
+msgstr "Показувати швидкіÑÑ‚ÑŒ у Ñ€Ñдку заголовка"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:24
+msgid "Focus window when adding torrent"
+msgstr "Виводити вікно Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ñ‚Ð¾Ñ€ÐµÐ½Ñ‚Ð° на передній план"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:25
+msgid ""
+"The pieces bar\n"
+"will increase bandwidth use between client\n"
+"and daemon (does not apply in Standalone mode)."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:28
+msgid "Show a pieces bar in Status tab"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:29
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:25
+#: deluge/ui/web/render/tab_status.html:27
+msgid "Completed:"
+msgstr "Завершено:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:30
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:72
+msgid "Downloading:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
+msgid "Waiting:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
+msgid "Missing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
+msgid "_Revert"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
+msgid "Revert color to default"
+msgstr "Повернути типові кольори"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
+msgid "Piece Colors"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:36
+msgid "Main Window"
+msgstr "Головне вікно"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:37
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:38
+msgid "App Indicator"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:39
+msgid "Systray"
+msgstr "СиÑтемний лоток"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:40
+msgid "Minimize to tray on close"
+msgstr "Згорнути в ÑиÑтемний лоток при закритті"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:41
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:42
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
+msgid "System Tray"
+msgstr "СиÑтемний лоток"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
+msgid "Notify about new releases"
+msgstr "ПовідомлÑти про оновленнÑ"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:46
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:38
+msgid "Updates"
+msgstr "ОновленннÑ"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:47
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:235
+msgid "System Default"
+msgstr "Типові налаштуваннÑ"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:48
+msgid "<b>Languge</b>"
+msgstr "<b>Мова</b>"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:49
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:61
+msgid "Move completed to:"
+msgstr "ПереміÑтити завантажені до:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:50
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:15
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:70
+msgid "Copy of .torrent files to:"
+msgstr "Копіювати торент-файл до:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:51
+#: deluge/ui/console/modes/preferences/preference_panes.py:275
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:19
+msgid "Delete copy of torrent file on remove"
+msgstr "Вилучити копію торрент-файлу"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:52
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:53
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:53
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
+msgid "Download Folders"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
+msgid "Prioritize first and last pieces of torrent"
+msgstr "Робити пріоритетними перші Ñ– оÑтанні чаÑтини торента"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:56
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "Робити пріоритетними перші Ñ– оÑтанні чаÑтини файлів у торенті"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:57
+#: deluge/ui/console/modes/preferences/preference_panes.py:287
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:102
+msgid "Sequential download"
+msgstr "ПоÑлідовне завантаженнÑ"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:58
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:15
+msgid ""
+"When enabled, the piece picker will pick pieces in\n"
+"sequence instead of rarest first.\n"
+"\n"
+"Enabling sequential download will affect the piece\n"
+"distribution negatively in the swarm. It should be\n"
+"used sparingly."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:64
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:111
+msgid "Add torrents in Paused state"
+msgstr "Додати торренти призупиненими"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
+msgid "Pre-allocate disk space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
+msgid "Pre-allocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
+msgid "Add Torrent Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
+msgid "Always show"
+msgstr "Завжди показувати"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:69
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
+msgid "Add Torrents Dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
+msgid "Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
+msgid "Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+"МакÑимальнo дозволена кількіÑÑ‚ÑŒ з'єднань. Ð’Ñтановіть -1 Ð´Ð»Ñ Ð½ÐµÐ¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð¾Ñ—."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:74
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:42
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:30
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:8
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:8
+msgid "Connections:"
+msgstr "З'єднаннÑ:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:75
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:76
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:43
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
+msgid "Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:78
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:41
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:7
+msgid "Download Speed:"
+msgstr "ШвидкіÑÑ‚ÑŒ завантаженнÑ:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:79
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"МакÑимальна швидкіÑÑ‚ÑŒ роздачі Ð´Ð»Ñ Ð²ÑÑ–Ñ… торентів. ПоÑтавте -1 Ð´Ð»Ñ "
+"необмеженої швидкоÑÑ‚Ñ–."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:81
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:6
+msgid "Upload Speed:"
+msgstr "ШвидкіÑÑ‚ÑŒ віддачі:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:82
+#: deluge/ui/console/modes/preferences/preference_panes.py:458
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:131
+msgid "Ignore limits on local network"
+msgstr "Ðехтувати Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ñ— мережі"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:83
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:141
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:84
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
+msgid "Global Bandwidth Limits"
+msgstr "Глобальні Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑкної здатноÑÑ‚Ñ–"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:87
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:88
+msgid "The maximum number download speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:89
+msgid "The maximum upload speed per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
+msgid "Per-Torrent Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
+#: deluge/ui/console/modes/preferences/preference_panes.py:556
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
+msgid "Queue to top"
+msgstr "Додавати у верх черги"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
+#: deluge/ui/console/modes/preferences/preference_panes.py:554
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
+msgid "New Torrents"
+msgstr "Ðові торенти"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
+msgid "Seeding:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
+msgid "Total:"
+msgstr "Ð’Ñього:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
+msgid "Ignore slow torrents"
+msgstr "Ігнорувати повільні торренти"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:96
+msgid ""
+"Torrents not transfering any data do not count towards download/seeding "
+"active count."
+msgstr ""
+"Торренти, Ñкі не приймають учаÑÑ‚Ñ– у передачі даних, не враховуютьÑÑ Ð´Ð»Ñ "
+"активного підрахунку завантаженнÑ/відвантаженнÑ."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:97
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:111
+msgid "Prefer seeding torrents"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:98
+msgid "Give preference to seeding torrents over downloading torrents."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:99
+#: deluge/ui/console/modes/preferences/preference_panes.py:558
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
+msgid "Active Torrents"
+msgstr "Ðктивні торенти"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:127
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
+#: deluge/ui/web/render/tab_status.html:4
+msgid "Share Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
+msgid "Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
+msgid "Time (m):"
+msgstr "ЧаÑ(хв)"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
+#: deluge/ui/console/modes/preferences/preference_panes.py:590
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
+msgid "Seeding Rotation"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
+msgid "Pause Torrent"
+msgstr "Призупинити торент"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:106
+#: deluge/ui/console/modes/preferences/preference_panes.py:627
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
+msgid "Share Ratio Reached"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
+msgid ""
+"The IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
+msgid "Incoming Address"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
+msgid "Random"
+msgstr "Випадковий"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:110
+msgid "Uses random ports in range 49152 to 65525"
+msgstr "ВикориÑтовувати випадкові порти в діапазоні від 49152 до 65525"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:111
+msgid "Active Port:"
+msgstr "Ðктивний порт:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:112
+msgid "Test Active Port"
+msgstr "ТеÑтувати активний порт"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
+msgid "Incoming Port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
+msgid ""
+"\n"
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.)\n"
+" "
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:117
+#: deluge/ui/console/modes/preferences/preference_panes.py:359
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
+msgid "Outgoing Interface"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
+msgid "From:"
+msgstr "Від:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:120
+#: deluge/ui/console/modes/preferences/preference_panes.py:328
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
+msgid "Outgoing Ports"
+msgstr "Вихідні порти"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
+msgid "Outgoing:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:122
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:38
+msgid "Incoming:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:123
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:80
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:124
+#: deluge/ui/console/modes/preferences/preference_panes.py:379
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:18
+msgid "Encryption"
+msgstr "ШифруваннÑ"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:125
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:194
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:126
+msgid "Universal Plug and Play"
+msgstr "УніверÑальне автоматичне Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶ÐµÐ²Ð¸Ñ… приÑтроїв"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:127
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:203
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:128
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+"Мережевий протокол Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ передачі "
+"мережевих Ð°Ð´Ñ€ÐµÑ (NAT) та конфігурацій Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ°Ð´Ñ€ÐµÑації портів (NAT-PMP)"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:129
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:213
+msgid "Peer Exchange"
+msgstr "Обмін пірами"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:130
+msgid "Exchanges peers between clients. (Disabling requires restart)"
+msgstr "Обмін пірами між клієнтами. (Ð’Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” перезапуÑку)"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:131
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:223
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:132
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "Служба пошуку локальних пірів у ваші мережі."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:133
+#: deluge/ui/console/widgets/statusbars.py:118
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:232
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:134
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Розподілена хеш-Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð»Ñ Ð·Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÐºÑ–Ð»ÑŒÐºÐ¾ÑÑ‚Ñ– активних з'єднань."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:135
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:251
+msgid "Peer TOS Byte:"
+msgstr "TOS байт учаÑника:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:136
+#: deluge/ui/console/modes/preferences/preference_panes.py:372
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
+msgid "Network Extras"
+msgstr "Додаткові мережі"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
+#: deluge/ui/console/modes/connectionmanager.py:121
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:5
+msgid "Hostname:"
+msgstr "Ðазва вузла:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:138
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:5
+#: deluge/ui/console/modes/connectionmanager.py:122
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:6
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:62
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:150
+msgid "Port:"
+msgstr "Порт:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:140
+#: deluge/ui/console/modes/preferences/preference_panes.py:658
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:94
+msgid "Proxy Hostnames"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:141
+msgid ""
+"Hostnames should be attempted to be resolved through\n"
+"the proxy instead of using the local DNS service"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:143
+#: deluge/ui/console/modes/preferences/preference_panes.py:661
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:103
+msgid "Proxy Peers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
+msgid "Proxy peer and web seed connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
+#: deluge/ui/console/modes/preferences/preference_panes.py:665
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:112
+msgid "Proxy Trackers"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
+msgid "Force Proxy Use"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
+#: deluge/ui/console/modes/preferences/preference_panes.py:671
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
+msgid "Hide Client Identity"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
+msgid ""
+"Attempt to hide client identity and only use proxy for incoming connections."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:150
+#: deluge/ui/console/modes/preferences/preference_panes.py:668
+#: deluge/ui/console/modes/preferences/preference_panes.py:669
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
+msgid "Force Proxy"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
+msgid "Cache Size (16 KiB blocks):"
+msgstr "Розмір кешу (блоки по 16 KБ):"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:152
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:153
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:53
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:154
+#: deluge/ui/console/modes/preferences/preference_panes.py:694
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:14
+#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
+msgid "Settings"
+msgstr "ÐалаштуваннÑ"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:156
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:157
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:158
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:159
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:160
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
+#: deluge/ui/console/modes/preferences/preference_panes.py:709
+msgid "Write"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:163
+msgid "Blocks Read:"
+msgstr "Блоків прочитано:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:164
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:165
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:166
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:167
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:168
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:169
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
+#: deluge/ui/console/modes/preferences/preference_panes.py:723
+msgid "Read"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:172
+msgid "Cache Size:"
+msgstr "Розмір кешу:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:173
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:175
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:7
+msgid "_Refresh"
+msgstr "_Оновити"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:177
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"Допоможіть нам вдоÑконалювати Deluge відÑилаючи нам верÑÑ–ÑŽ Python, PyGTK, ОС "
+"та тип процеÑÑора. ÐÑ–Ñкої іншої інформації відÑилатиÑÑŒ не буде."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:178
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:77
+msgid "Yes, please send anonymous statistics"
+msgstr "ÐадÑилати анонімну ÑтатиÑтику"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:179
+#: deluge/ui/console/modes/preferences/preference_panes.py:503
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:57
+msgid "System Information"
+msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ ÑиÑтему"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:180
+msgid "Location:"
+msgstr "РозташуваннÑ:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:181
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+"Якщо Deluge не може знайти файлу бази за цією адреÑою - він здійÑнить запит "
+"до DNS Ð´Ð»Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÑ€Ð°Ñ—Ð½Ð¸ піра."
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:182
+#: deluge/ui/console/modes/preferences/preference_panes.py:516
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:85
+msgid "GeoIP Database"
+msgstr "База даних GeoIP"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
+msgid "Associate with Deluge"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
+msgid "Magnet Links"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
+msgid "Daemon port:"
+msgstr "Порт фонової Ñлужби:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:186
+#: deluge/ui/console/modes/preferences/preference_panes.py:655
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:30
+msgid "Port"
+msgstr "Порт"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:187
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:61
+msgid "Allow Remote Connections"
+msgstr "Дозволити віддалені з'єднаннÑ"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:188
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:4
+#: deluge/ui/web/js/deluge-all/Statusbar.js:39
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:50
+msgid "Connections"
+msgstr "З'єднаннÑ"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:189
+#: deluge/ui/console/modes/preferences/preference_panes.py:543
+#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:80
+msgid "Periodically check the website for new releases"
+msgstr "Періодично перевірÑти доÑтупніÑÑ‚ÑŒ нових верÑій"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:193
+msgid "_Delete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:194
+msgid "Accounts"
+msgstr "Облікові запиÑи"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:196
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:29
+msgid "Version:"
+msgstr "ВерÑÑ–Ñ:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:197
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:16
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:26
+msgid "Author:"
+msgstr "Ðвтор:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:198
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:35
+msgid "Homepage:"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:199
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:32
+msgid "Author Email:"
+msgstr "ÐдреÑа ел.пошти автора:"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:200
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:18
+msgid "Info"
+msgstr "ВідомоÑÑ‚Ñ–"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:201
+msgid "_Install"
+msgstr "_Ð’Ñтановити"
+
+#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
+msgid "_Find More..."
+msgstr "_Знайти більше..."
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
+msgid "Remove the selected torrent(s)?"
+msgstr "Видалити вибрані торенти?"
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
+msgid "Include downloaded files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
+msgid "(This is permanent!)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:4
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:1
+msgid "Properties"
+msgstr "ВлаÑтивоÑÑ‚Ñ–"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:3
+msgid "Max drop down rows"
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ випадаючих Ñ€Ñдків"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:4
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:2
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:5
+msgid "<b>General</b>"
+msgstr "<b>Загальні</b>"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
+msgid "Show path entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
+msgid "Show file chooser"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
+msgid "Show folder name"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
+msgid "Path Chooser Type"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
+msgid "Enable autocomplete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:10
+msgid "Show hidden files"
+msgstr "Показувати приховані файли"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
+msgid "Set new key"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
+msgid "Press this key to set new key accelerators to trigger auto-complete"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:13
+msgid "Autocomplete"
+msgstr "ÐвтодоповненнÑ"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:14
+msgid "Save path"
+msgstr "Зберегти шлÑÑ…"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:15
+msgid "Ctrl+S"
+msgstr "Ctrl+S"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:16
+msgid "Ctrl+E"
+msgstr "Ctrl+E"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:17
+msgid "Ctrl+R"
+msgstr "Ctrl+R"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:18
+msgid "Ctrl+H"
+msgstr "Ctrl+H"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:19
+msgid "Ctrl+D"
+msgstr "Ctrl+D"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:20
+msgid "Edit path"
+msgstr "Редагувати шлÑÑ…"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:21
+msgid "Remove path"
+msgstr "Видалити шлÑÑ…"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
+msgid "Toggle hidden files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
+msgid "Default path"
+msgstr "Типовий шлÑÑ…"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
+msgid "Shortcuts"
+msgstr "Комбінації клавіш"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
+msgid "Select a Directory"
+msgstr "Обрати теку"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:26
+msgid "Saved paths"
+msgstr "Збережені шлÑхи"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:27
+msgid "column"
+msgstr "Ñтовпчик"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:29
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:42
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:33
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:32
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:36
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:34
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:51
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:64
+msgid "Cancel"
+msgstr "СкаÑувати"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:30
+msgid "Open"
+msgstr "Відкрити"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:31
+#: deluge/ui/web/js/deluge-all/Toolbar.js:39
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:43
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:92
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:94
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:27
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:65
+msgid "Add"
+msgstr "Додати"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
+msgid "Add the current entry value to the list"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:102
+msgid "Edit"
+msgstr "Редагувати"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:34
+msgid "Edit the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:35
+#: deluge/ui/web/js/deluge-all/Toolbar.js:46
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:104
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:110
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:156
+msgid "Remove"
+msgstr "Видалити"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:36
+msgid "Remove the selected entry"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:38
+msgid "Move the selected entry up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:40
+msgid "Move the selected entry down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:41
+msgid "Default"
+msgstr "Типово"
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:42
+msgid "No default path set"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:43
+msgid "Open properties dialog"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:1
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
+msgid "From Infohash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:6
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:5
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:53
+msgid "Trackers:"
+msgstr "Трекери:"
+
+#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:1
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Add Host"
+msgstr "Додати Ñервер"
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:16
+#: deluge/ui/web/js/deluge-all/Menus.js:346
+msgid "Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:4
+msgid "Move the torrent(s) download folder."
+msgstr ""
+
+#: deluge/ui/gtk3/glade/move_storage_dialog.ui.h:5
+msgid "Destination:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:1
+msgid "New Release"
+msgstr "Ðова верÑÑ–Ñ"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
+msgid "_Goto Website"
+msgstr "_Відвідати веб-Ñайт"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
+msgid "New Release Available!"
+msgstr "ДоÑтупна нова верÑÑ–Ñ!"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:5
+msgid "Available Version:"
+msgstr "ДоÑтупна верÑÑ–Ñ:"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:6
+msgid "Server Version"
+msgstr "ВерÑÑ–Ñ Ñервера"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:7
+msgid "Current Version:"
+msgstr "Поточна верÑÑ–Ñ:"
+
+#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:8
+msgid "Do not show this dialog in the future"
+msgstr "Ðе показувати цей діалог в майбутньому"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:1
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
+#: deluge/ui/web/render/tab_status.html:9
+msgid "Down Speed:"
+msgstr "ШвидкіÑÑ‚ÑŒ завантаженнÑ:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
+#: deluge/ui/web/render/tab_status.html:10
+msgid "Up Speed:"
+msgstr "ШвидкіÑÑ‚ÑŒ віддачі:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
+#: deluge/ui/web/render/tab_status.html:2
+msgid "Downloaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
+#: deluge/ui/web/render/tab_status.html:3
+msgid "Uploaded:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
+#: deluge/ui/web/render/tab_status.html:16
+msgid "Seeds:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
+#: deluge/ui/web/render/tab_status.html:17
+msgid "Peers:"
+msgstr "Пірів:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
+#: deluge/ui/web/render/tab_status.html:18
+msgid "Availability:"
+msgstr "ДоÑтупніÑÑ‚ÑŒ:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
+#: deluge/ui/web/render/tab_status.html:25
+msgid "Seed Rank:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
+msgid "ETA Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
+#: deluge/ui/web/render/tab_status.html:13
+msgid "Last Transfer:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
+#: deluge/ui/web/render/tab_status.html:23
+msgid "Active Time:"
+msgstr "Ð§Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ–:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
+#: deluge/ui/web/render/tab_status.html:20
+msgid "Complete Seen:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
+#: deluge/ui/web/render/tab_status.html:24
+msgid "Seeding Time:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
+#: deluge/ui/web/render/tab_status.html:12
+msgid "Pieces:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:17
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:3
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:23
+msgid "Name:"
+msgstr "Ім'Ñ:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:18
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:25
+msgid "Download Folder:"
+msgstr "Тека Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½ÑŒ:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:19
+msgid "Added:"
+msgstr "Додано:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:20
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:26
+msgid "Total Size:"
+msgstr "Загальний розмір:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
+msgid "Total Files:"
+msgstr "Ð’Ñього файлів:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
+msgid "Hash:"
+msgstr "Хеш:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:23
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:31
+msgid "Created By:"
+msgstr "Створений:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:24
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:17
+msgid "Comments:"
+msgstr "Коментарі:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:29
+msgid "Owner:"
+msgstr "ВлаÑник:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:34
+msgid "Move completed:"
+msgstr "ПереміÑтити завантажені:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:36
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:39
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:12
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:205
+msgid "Stop seed at ratio:"
+msgstr "Зупинити роздачу при коефіцієнті:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:37
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:40
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
+msgid "Remove at ratio"
+msgstr "Видалити при коефіцієнті"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
+msgid "Bandwidth Limits"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
+msgid "Current Tracker:"
+msgstr "Поточний трекер:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
+msgid "Total Trackers:"
+msgstr "Ð’Ñього трекерів:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
+#: deluge/ui/web/render/tab_status.html:6
+msgid "Tracker Status:"
+msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ‚Ñ€ÐµÐºÐµÑ€Ð°:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
+#: deluge/ui/web/render/tab_status.html:5
+msgid "Next Announce:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:50
+msgid "Private Torrent:"
+msgstr "Приватний торент:"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:51
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:8
+msgid "_Edit Trackers"
+msgstr "Р_едагувати трекери"
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:1
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:44
+#: deluge/ui/web/js/deluge-all/Menus.js:284
+msgid "Top"
+msgstr "Вгорі"
+
+#: deluge/ui/gtk3/glade/torrent_menu.queue.ui.h:4
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:45
+#: deluge/ui/web/js/deluge-all/Menus.js:305
+msgid "Bottom"
+msgstr "Внизу"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:1
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:50
+msgid "Add Torrents"
+msgstr "Додати торенти"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:5
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:6
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:11
+msgid "Move Complete Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:12
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:13
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:134
+msgid "Prioritize First/Last Pieces"
+msgstr "Пріоритетні перші та оÑтанні чаÑтини"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:21
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
+msgid "Skip File Hash Check"
+msgstr "ПропуÑтити перевірку"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
+msgid "Preallocate Disk Space"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
+msgid "Preallocate the disk space for the torrent files"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
+msgid "Maximum torrent download speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:27
+msgid "Maximum torrent upload speed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
+msgid "Maximum torrent connections"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
+msgid "Maximum torrent upload slots"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:34
+msgid "Apply To All"
+msgstr "ЗаÑтоÑувати до вÑÑ–Ñ…"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:35
+msgid "Revert To Defaults"
+msgstr "Ð’Ñтановити типові"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:1
+msgid "_Show Deluge"
+msgstr "По_казати Deluge"
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:3
+msgid "_Pause Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:4
+msgid "_Resume Session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:5
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:1
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:6
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:2
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/tray_menu.ui.h:7
+msgid "Quit & Shutdown Daemon"
+msgstr "Вийти за зупинити фонову Ñлужбу"
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:17
+#: deluge/ui/web/js/deluge-all/Menus.js:323
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:318
+msgid "Edit Trackers"
+msgstr "Редагувати трекери"
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:4
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:19
+msgid "_Up"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/edit_trackers.ui.h:8
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:22
+msgid "_Down"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:1
+msgid "_Add Peer"
+msgstr "_Додати Пір"
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui.h:2
+msgid "Add a peer by its IP"
+msgstr "Додати піра по IP"
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:1
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:17
+msgid "Edit Tracker"
+msgstr "Редагувати трекер"
+
+#: deluge/ui/gtk3/glade/edit_trackers.edit.ui.h:4
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:44
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:30
+msgid "Tracker:"
+msgstr "Трекер:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:1
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:4
+msgid "Remote Path"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui.h:5
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:5
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:94
+msgid "Path:"
+msgstr "ШлÑÑ…:"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:1
+msgid "32 KiB"
+msgstr "32 КіБ"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:2
+msgid "64 KiB"
+msgstr "64 КіБ"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:3
+msgid "128 KiB"
+msgstr "128 КіБ"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:4
+msgid "256 KiB"
+msgstr "256 КіБ"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:5
+msgid "512 KiB"
+msgstr "512 КіБ"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:6
+msgid "1 MiB"
+msgstr "1 МіБ"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:7
+msgid "2 MiB"
+msgstr "2 МіБ"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:8
+msgid "4 MiB"
+msgstr "4 МіБ"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:9
+msgid "8 MiB"
+msgstr "8 МіБ"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:10
+msgid "16 MiB"
+msgstr "16 МіБ"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:11
+msgid "Create Torrent"
+msgstr "Створити торент"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:13
+msgid "Fol_der"
+msgstr "Т_ека"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:14
+msgid "_Remote Path"
+msgstr "Вил_учити шлÑÑ…"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:15
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:12
+#: deluge/ui/web/js/deluge-all/details/FilesTab.js:73
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:18
+msgid "Files"
+msgstr "Файли"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:24
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:25
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:26
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:27
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.ui.h:28
+#: deluge/ui/console/modes/preferences/preference_panes.py:279
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:48
+#: deluge/ui/web/js/deluge-all/Menus.js:66
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:26
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:80
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:17
+msgid "Options"
+msgstr "Параметри"
+
+#: deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui.h:1
+msgid "Save .torrent as"
+msgstr "Зберегти .torrent Ñк"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:1
+msgid "_Open Download Folder"
+msgstr "_Відкрити теку завантаженнÑ"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:2
+msgid "_Pause"
+msgstr "При_зупинити"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:3
+msgid "Resu_me"
+msgstr "Відн_овити"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
+msgid "Resume selected torrents."
+msgstr "Відновити вибрані торенти."
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
+msgid "Opt_ions"
+msgstr "_Параметри"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:6
+msgid "_Queue"
+msgstr "_Черга"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:7
+msgid "_Update Tracker"
+msgstr "Он_овити трекер"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:9
+msgid "_Remove Torrent"
+msgstr "_Видалити торрент"
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:10
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.ui.h:11
+msgid "_Move Download Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/other_dialog.ui.h:3
+msgid "label"
+msgstr "мітка"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:1
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:2
+msgid "_Pause All"
+msgstr "П_ризупинити вÑÑ–"
+
+#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:3
+msgid "Resu_me All"
+msgstr "Відновити вÑÑ–"
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:3
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:4
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
+msgid "Stop seed at _ratio"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
+msgid "_Super Seeding"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
+msgid "_Change Ownership"
+msgstr "Зм_інити влаÑника"
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:1
+#: deluge/ui/web/js/deluge-all/AddTrackerWindow.js:26
+msgid "Add Tracker"
+msgstr "Додати трекер"
+
+#: deluge/ui/gtk3/glade/edit_trackers.add.ui.h:4
+msgid "Add Trackers"
+msgstr "Додати трекери"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:1
+msgid "Add URL"
+msgstr "Додати поÑиланнÑ"
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
+msgid "From URL"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
+msgid "URL:"
+msgstr "ÐдреÑа:"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
+msgid "Deluge Daemons"
+msgstr "Фонова Ñлужба Deluge"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
+msgid "Auto-connect to selected Daemon"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:11
+msgid "Auto-start localhost daemon (if required)"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:12
+msgid "Hide this dialog"
+msgstr "Сховати це вікно"
+
+#: deluge/ui/gtk3/glade/connection_manager.ui.h:13
+msgid "Startup Options"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:1
+msgid "_Open File"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:2
+msgid "_Show Folder"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:3
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:4
+msgid "_Skip"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:5
+msgid "_Low"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:6
+msgid "_Normal"
+msgstr ""
+
+#: deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui.h:7
+msgid "_High"
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:1
+msgid "Deluge Team"
+msgstr "Команда Deluge"
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:2
+msgid ""
+"Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
+msgstr "Deluge - легкий, вільний, кроÑ-платформенний BitTorrent клієнт."
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:3
+msgid ""
+"Deluge contains the common features to BitTorrent clients such as Protocol "
+"Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX), UPnP, NAT-"
+"PMP, Proxy support, Web seeds, global and per-torrent speed limits. As "
+"Deluge heavily utilises the libtorrent library it has a comprehensive list "
+"of the features provided."
+msgstr ""
+
+#: deluge/ui/data/share/appdata/deluge.appdata.xml.in.h:4
+msgid ""
+"Deluge has been designed to run as both a normal standalone desktop "
+"application and as a client-server. In Thinclient mode a Deluge daemon "
+"handles all the BitTorrent activity and is able to run on headless machines "
+"with the user-interfaces connecting remotely from any other platform."
+msgstr ""
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:2
+msgid "BitTorrent Client"
+msgstr "Клієнт BitTorrent"
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:3
+msgid "Deluge BitTorrent Client"
+msgstr "BitTorrent клієнт Deluge"
+
+#: deluge/ui/data/share/applications/deluge.desktop.in.h:4
+msgid "Download and share files over BitTorrent"
+msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð° обмін файлами через BitTorrent"
+
+#: deluge/ui/console/console.py:76
+msgid "Console Options"
+msgstr "Параметри конÑолі"
+
+#: deluge/ui/console/console.py:78
+msgid ""
+"These daemon connect options will be used for commands, or if console ui "
+"autoconnect is enabled."
+msgstr ""
+
+#: deluge/ui/console/console.py:87
+msgid "Deluge daemon IP address to connect to (default 127.0.0.1)"
+msgstr ""
+
+#: deluge/ui/console/console.py:96
+msgid "Deluge daemon port to connect to (default 58846)"
+msgstr ""
+
+#: deluge/ui/console/console.py:104
+msgid "Deluge daemon username to use when connecting"
+msgstr ""
+"Фонова Ñлужба Deluge викориÑтовуватиме ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача при підключенні"
+
+#: deluge/ui/console/console.py:111
+msgid "Deluge daemon password to use when connecting"
+msgstr ""
+"Фонова Ñлужба Deluge викориÑтовуватиме пароль кориÑтувача при підключенні"
+
+#: deluge/ui/console/console.py:131
+msgid "Console Commands"
+msgstr "Команди конÑолі"
+
+#: deluge/ui/console/console.py:132
+msgid "Description"
+msgstr "ОпиÑ"
+
+#: deluge/ui/console/console.py:133
+msgid "The following console commands are available:"
+msgstr ""
+
+#: deluge/ui/console/console.py:134
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:2
+msgid "Command"
+msgstr "Команда"
+
+#: deluge/ui/console/cmdline/command.py:208
+#, python-format
+msgid "`%s` alias"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:29
+msgid "Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:35
+msgid "an expression matched against torrent ids and torrent names"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:43
+#: deluge/ui/console/cmdline/commands/config.py:88
+msgid "set value for this key"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:46
+#: deluge/ui/console/cmdline/commands/config.py:91
+msgid "Value to set"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/manage.py:53
+#: deluge/ui/console/cmdline/commands/config.py:98
+msgid "one or more keys separated by space"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:33
+msgid "Also removes the torrent data"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:40
+msgid "List the matching torrents without removing."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:46
+#: deluge/ui/console/cmdline/commands/recheck.py:28
+#: deluge/ui/console/cmdline/commands/move.py:31
+msgid "One or more torrent ids"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/rm.py:66
+#, python-format
+msgid "Confirm with -c to remove the listed torrents (Count: %d)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:22
+msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/resume.py:29
+msgid "One or more torrent ids. Use \"*\" to resume all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/pause.py:29
+msgid "One or more torrent ids. Use \"*\" to pause all torrents"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:38
+msgid "Download folder for torrent"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:44
+msgid "Move the completed torrent to this folder"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/add.py:50
+msgid "One or more torrent files, URLs or magnet URIs"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/plugin.py:29
+msgid "Lists available plugins"
+msgstr "Перелік доÑтупних додатків"
+
+#: deluge/ui/console/cmdline/commands/plugin.py:37
+msgid "Shows enabled plugins"
+msgstr "Показати ввімкнені додатки"
+
+#: deluge/ui/console/cmdline/commands/plugin.py:40
+msgid "Enables a plugin"
+msgstr "Увімкнути додаток"
+
+#: deluge/ui/console/cmdline/commands/plugin.py:43
+msgid "Disables a plugin"
+msgstr "Вимкнути додаток"
+
+#: deluge/ui/console/cmdline/commands/plugin.py:51
+msgid "Reload list of available plugins"
+msgstr "Перезавантажити перелік доÑтупних додатків"
+
+#: deluge/ui/console/cmdline/commands/plugin.py:54
+msgid "Install a plugin from an .egg file"
+msgstr "Ð’Ñтановити додаток з файлу .egg"
+
+#: deluge/ui/console/cmdline/commands/status.py:36
+msgid ""
+"Raw values for upload/download rates (without KiB/s suffix)(useful for "
+"scripts that want to do their own parsing)"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/status.py:46
+msgid "Do not show torrent status (Improves command speed)"
+msgstr "Ðе відображати ÑÑ‚Ð°Ñ‚ÑƒÑ Ñ‚Ð¾Ñ€ÐµÐ½Ñ‚Ð° (пришвидшує Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´)"
+
+#: deluge/ui/console/cmdline/commands/connect.py:26
+msgid "Usage: connect <host[:port]> [<username>] [<password>]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:30
+msgid "Daemon host and port"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/connect.py:36
+#: deluge/ui/console/modes/preferences/preference_panes.py:652
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:259
+msgid "Password"
+msgstr "Пароль"
+
+#: deluge/ui/console/cmdline/commands/move.py:34
+msgid "The path to move the torrents to"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/debug.py:26
+msgid "The new state"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/help.py:29
+msgid "One or more commands"
+msgstr "Одна або декілька команд"
+
+#: deluge/ui/console/cmdline/commands/config.py:79
+msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:101
+msgid "Show more information per torrent."
+msgstr "Показати більше інформації про торент."
+
+#: deluge/ui/console/cmdline/commands/info.py:109
+msgid "Show more detailed information including files and peers."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:116
+#, python-format
+msgid "Show torrents with state STATE: %s."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:132
+msgid "Same as --sort but items are in reverse order."
+msgstr ""
+
+#: deluge/ui/console/cmdline/commands/info.py:138
+msgid "One or more torrent ids. If none is given, list all"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:44
+msgid "Select Host"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Quit"
+msgstr "Вийти"
+
+#: deluge/ui/console/modes/connectionmanager.py:51
+msgid "Delete Host"
+msgstr "Видалити Ñервер"
+
+#: deluge/ui/console/modes/connectionmanager.py:116
+msgid "Add Host (Up & Down arrows to navigate, Esc to cancel)"
+msgstr ""
+
+#: deluge/ui/console/modes/connectionmanager.py:133
+msgid "Error adding host"
+msgstr "Помилка Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ñервера"
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Columns"
+msgstr "Стовпчики"
+
+#: deluge/ui/console/modes/torrentlist/torrentviewcolumns.py:96
+msgid "Width"
+msgstr "Ширина"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:178
+msgid "General options"
+msgstr "Загальні параметри"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:182
+msgid "Ring system bell when a download finishes"
+msgstr "СиÑтемний звук піÑÐ»Ñ Ð·Ð²ÐµÑ€ÐµÑˆÐµÐ½Ð½Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:188
+msgid "List complete torrents after incomplete regardless of sorting order"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:193
+msgid "Move selection when moving torrents in the queue"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:200
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:67
+msgid "Language"
+msgstr "Мова"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:202
+msgid "Command Line Mode"
+msgstr "Режим командного Ñ€Ñдка"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:205
+msgid "Do not store duplicate input in history"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:210
+msgid "Store and load command line history in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:216
+msgid "Third tab lists all remaining torrents in command line mode"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:221
+msgid "Torrents per tab press"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:234
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
+#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:39
+msgid "Folders"
+msgstr "Теки"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:237
+msgid "Download To"
+msgstr "Завантажувати до"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:254
+msgid "Move completed to"
+msgstr "Переміщувати до"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:269
+msgid "Copy of .torrent files to"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:290
+msgid "Add Paused"
+msgstr "Додавати призупиненим"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:293
+msgid "Pre-Allocate disk space"
+msgstr "ВиділÑти міÑце під веÑÑŒ файл"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:304
+msgid "Incomming Ports"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:313
+#: deluge/ui/console/modes/preferences/preference_panes.py:337
+msgid "From"
+msgstr "Від"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:321
+#: deluge/ui/console/modes/preferences/preference_panes.py:345
+msgid "To"
+msgstr "До"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:331
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:131
+msgid "Use Random Ports"
+msgstr "ВикориÑтовувати випадкові порти"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:352
+msgid "Incoming Interface"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:355
+msgid "IP address of the interface to listen on (leave empty for default):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:363
+msgid ""
+"The network interface name or IP address for outgoing BitTorrent "
+"connections. (Leave empty for default.):"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:382
+msgid "Inbound"
+msgstr "Вхідні"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:391
+msgid "Outbound"
+msgstr "Вихідні"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:413
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
+msgid "Global Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:416
+#: deluge/ui/console/modes/preferences/preference_panes.py:469
+msgid "Maximum Connections"
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ з'єднань"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:423
+#: deluge/ui/console/modes/preferences/preference_panes.py:476
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:63
+msgid "Maximum Upload Slots"
+msgstr "МакÑимум Ñлотів роздачі"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:430
+#: deluge/ui/console/modes/preferences/preference_panes.py:483
+msgid "Maximum Download Speed (KiB/s)"
+msgstr "МакÑимальна швидкіÑÑ‚ÑŒ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ (КіБ/Ñ)"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:437
+#: deluge/ui/console/modes/preferences/preference_panes.py:490
+msgid "Maximum Upload Speed (KiB/s)"
+msgstr "МакÑимальна швидкіÑÑ‚ÑŒ роздачі (КіБ/Ñ)"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:444
+msgid "Maximum Half-Open Connections"
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ напіввідкритих з'єднань"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:451
+msgid "Maximum Connection Attempts per Second"
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ Ñпроб з'єднань за Ñекунду"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:463
+msgid "Rate Limit IP Overhead"
+msgstr "Обмежувати швидкіÑÑ‚ÑŒ із урахуваннÑм витрат протоколу IP"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:466
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
+msgid "Per Torrent Bandwidth Usage"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:513
+msgid "Yes, please send anonymous statistics."
+msgstr "Так, дÑкую, надÑилати анонімну ÑтатиÑтику."
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:531
+msgid "Daemon Port"
+msgstr "Порт фонової Ñлужби"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:538
+msgid "Allow remote connections"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:561
+msgid "Total"
+msgstr "Загалом"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:593
+msgid "Share Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:601
+msgid "Time Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:609
+msgid "Time (m)"
+msgstr "Ð§Ð°Ñ (хв)"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:633
+msgid "Remove torrent (Unchecked pauses torrent)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:646
+msgid "Proxy Settings"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ–"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:649
+msgid "Type"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:653
+msgid "Hostname"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:673
+msgid "Proxy Type Help"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:697
+msgid "Cache Size (16 KiB blocks)"
+msgstr "Розмір кеша (блоки 16 КіБ)"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:704
+msgid "Cache Expiry (seconds)"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:712
+msgid "Blocks Written"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:716
+msgid "Writes"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:720
+msgid "Write Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:725
+msgid "Blocks Read"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:729
+msgid "Blocks Read hit"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:732
+msgid "Reads"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:735
+msgid "Read Cache Hit Ratio"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:741
+msgid "Cache Size"
+msgstr "Розмір кеша"
+
+#: deluge/ui/console/modes/preferences/preference_panes.py:746
+msgid "Read Cache Size"
+msgstr ""
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:333
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:87
+msgid "Apply"
+msgstr "ЗаÑтоÑувати"
+
+#: deluge/ui/console/modes/preferences/preferences.py:145
+#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:35
+#: deluge/ui/web/js/deluge-all/OtherLimitWindow.js:52
+#: deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js:88
+msgid "OK"
+msgstr "Гаразд"
+
+#: deluge/ui/console/widgets/fields.py:1070
+msgid "Select Language"
+msgstr "Оберіть мову"
+
+#: deluge/ui/console/widgets/statusbars.py:120
+#, python-format
+msgid "IP {!white,blue!}%s{!status!}"
+msgstr "IP {!white,blue!}%s{!status!}"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:114
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:116
+#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
+#, python-format
+msgid "The IP address \"%s\" is badly formed"
+msgstr "IP-адреÑа \"%s\" погано Ñформована"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
+msgid "Emule IP list (GZip)"
+msgstr "Емулювати ÑпиÑок IP (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
+msgid "SafePeer Text (Zipped)"
+msgstr "Безпечні вузли, текÑÑ‚ (zip-архів)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:23
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:24
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:45
+msgid "Blocked IP Ranges /Whitelisted IP Ranges"
+msgstr "Перелік заблокованих та дозволених IP-діапазонів"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:56
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:156
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:204
+msgid "Blocklist"
+msgstr "Перелік блокувань"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/gtkui.py:233
+msgid "Bad IP address"
+msgstr "Ðевірна IP-адреÑа"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:40
+msgid "Invalid leader"
+msgstr "Ðевірний заголовок"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:44
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py:49
+msgid "Invalid version"
+msgstr "Ðеправильна верÑÑ–Ñ"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:3
+msgid "Days"
+msgstr "Днів"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:4
+msgid "Check for new list every:"
+msgstr "ПеревірÑти новий перелік кожні:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:5
+msgid "Import blocklist on startup"
+msgstr "Імпортувати перелік блокувань при запуÑку"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
+msgid "<b>Settings</b>"
+msgstr "<b>ÐалаштуваннÑ</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+"У разі необхідноÑÑ‚Ñ– завантажувати файл із переліком блокованих IP та "
+"імпортувати його."
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:8
+msgid "Check Download and Import"
+msgstr "Перевірити наÑвніÑÑ‚ÑŒ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑпиÑку блокувань"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:9
+msgid "Download a new blocklist file and import it."
+msgstr "Завантажити новий перелік блокувань та імпортувати його"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:10
+msgid "Force Download and Import"
+msgstr "Завантажити та імпортувати ÑпиÑок блокувань"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:11
+msgid "Blocklist is up to date"
+msgstr "Перелік блокувань вже оновлений"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:12
+msgid "<b>Options</b>"
+msgstr "<b>Опції</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:13
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:25
+msgid "Type:"
+msgstr "Тип:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:14
+msgid "Date:"
+msgstr "Дата:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:15
+msgid "File Size:"
+msgstr "Розмір файла:"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:16
+msgid "<b>Info</b>"
+msgstr "<b>ІнформаціÑ</b>"
+
+#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:17
+msgid "<b>Whitelist</b>"
+msgstr "ВинÑтки"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:36
+msgid "Torrent Complete"
+msgstr "Торент завершено"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:37
+msgid "Torrent Added"
+msgstr "Торент додано"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:38
+msgid "Torrent Removed"
+msgstr "Торент вилучено"
+
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:64
+#: deluge/plugins/Execute/deluge_execute/gtkui.py:79
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:1
+msgid "Event"
+msgstr "ПодіÑ"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:3
+msgid "<b>Add Command</b>"
+msgstr "<b>Додати команду</b>"
+
+#: deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui.h:4
+msgid "<b>Commands</b>"
+msgstr "<b>Команди</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:327
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:342
+msgid "Incompatible Option"
+msgstr "ÐеÑуміÑний варіант"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:418
+msgid ""
+"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
+"cannot be the same!"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
+msgid "AutoAdd"
+msgstr "ÐвтододаваннÑ"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:495
+msgid "Double-click to toggle"
+msgstr "Подвійне ÐºÐ»Ð°Ñ†Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ð½Ð½Ñ"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:503
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:511
+msgid "Double-click to edit"
+msgstr "Подвійне ÐºÐ»Ð°Ñ†Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
+msgid "Path"
+msgstr "ШлÑÑ…"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
+msgid "Watch folder does not exist."
+msgstr "Теки за Ñкою Ñтежите не Ñ–Ñнує"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
+#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
+msgid "Path does not exist."
+msgstr "ШлÑÑ… не Ñ–Ñнує."
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:2
+msgid ""
+"If a .torrent file is added to this directory,\n"
+"it will be added to the session."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:4
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:2
+msgid "Select A Folder"
+msgstr "Оберіть теку"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:5
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:6
+msgid "<b>Watch Folder</b>"
+msgstr "<b>Ð¡Ñ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð° текою</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:7
+msgid "Delete .torrent after adding"
+msgstr "Видалити торент-файл піÑÐ»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:8
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will be deleted."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:10
+msgid "Append extension after adding:"
+msgstr "Додати Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:11
+msgid ""
+"Once the torrent is added to the session,\n"
+"an extension will be appended to the .torrent\n"
+"and it will remain in the same directory."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:14
+msgid ".added"
+msgstr ".додано"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:16
+msgid ""
+"Once the torrent is added to the session,\n"
+"the .torrent will copied to the chosen directory\n"
+"and deleted from the watch folder."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
+msgid ""
+"Once the torrent is deleted from the session,\n"
+"also delete the .torrent file used to add it."
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:22
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:23
+msgid "Set download folder"
+msgstr "Ð’Ñтановити теку завантаженнÑ"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:24
+msgid "This folder will be where the torrent data is downloaded to."
+msgstr "Ð’ цю теку будуть завантажуватиÑÑ Ñ„Ð°Ð¹Ð»Ð¸"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:25
+msgid "<b>Download Folder</b>"
+msgstr "<b>Тека Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
+msgid "Set move completed folder"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
+msgid "<b>Move Completed</b>"
+msgstr "<b>ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð—Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:28
+msgid "Label: "
+msgstr "Мітка: "
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:29
+msgid "<b>Label</b>"
+msgstr "<b>Мітка</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:30
+msgid "Main"
+msgstr "ОÑновні"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
+msgid "The user selected here will be the owner of the torrent."
+msgstr "Вибраний тут кориÑтувач Ñтане влаÑником торрента"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
+msgid "<b>Owner</b>"
+msgstr "<b>ВлаÑник</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:33
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:103
+msgid "Max Upload Speed:"
+msgstr "МакÑ. шв-ÑÑ‚ÑŒ віддачі:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:34
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:130
+msgid "Max Connections:"
+msgstr "МакÑ. к-ÑÑ‚ÑŒ з'єднань:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:35
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:153
+msgid "Max Upload Slots:"
+msgstr "МакÑимум Ñлотів Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ð°Ñ‡Ñ–:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:37
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:77
+msgid "Max Download Speed:"
+msgstr "МакÑ. шв-ÑÑ‚ÑŒ завантаженнÑ:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:38
+msgid "<b>Bandwidth</b>"
+msgstr "<b>Смуга пропуÑканнÑ</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:41
+#: deluge/ui/web/render/tab_status.html:19
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:42
+msgid "Add Paused:"
+msgstr "Додавати призупиненими:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:43
+msgid "Queue to:"
+msgstr "МіÑце у черзі:"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:47
+msgid "<b>Queue</b>"
+msgstr "<b>Черга</b>"
+
+#: deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui.h:1
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
+msgid "minutes"
+msgstr "хвилин"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
+msgid "1 minute"
+msgstr "1 хвилина"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:64
+msgid "1 second"
+msgstr "1 Ñекунда"
+
+#: deluge/plugins/Stats/deluge_stats/gtkui.py:66
+msgid "seconds"
+msgstr "Ñекунд"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
+msgid "Stats"
+msgstr "СтатиÑтика"
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
+msgid "Resolution"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
+msgid "Seeds/Peers"
+msgstr "Сідів/Пірів"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
+msgid "Download color:"
+msgstr "Колір завантаженнÑ:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
+msgid "Upload color:"
+msgstr "Колір віддачі:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
+msgid "<b>Connections Graph</b>"
+msgstr "<b>Графік підключень</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
+msgid "<b>Bandwidth Graph</b>"
+msgstr "<b>Графік Ñмуги пропуÑканнÑ</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
+msgid "DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
+msgid "Cached DHT nodes:"
+msgstr ""
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
+msgid "DHT torrents:"
+msgstr "Торентів в DHT:"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
+msgid "<b>Seeds / Peers</b>"
+msgstr "<b>Сідів / Пірів</b>"
+
+#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
+msgid "<b>Graph Colors</b>"
+msgstr "<b>Кольори графіка</b>"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
+msgid "WebUi"
+msgstr "Веб-інтерфейÑ"
+
+#: deluge/plugins/WebUi/deluge_webui/gtkui.py:90
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+"Веб-Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Deluge не вÑтановлено, будь лаÑка,\n"
+"вÑтановіть Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ– Ñпробуйте ще раз."
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:1
+msgid "Enable web interface"
+msgstr "Увімкнути веб-інтерфейÑ"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:2
+msgid "Enable SSL"
+msgstr "Увімкнути SSL"
+
+#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/core.py:184
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "Ðевірна мітка, допуÑтимі Ñимволи:[a-z0-9_-]"
+
+#: deluge/plugins/Label/deluge_label/core.py:186
+msgid "Empty Label"
+msgstr "ÐŸÐ¾Ñ€Ð¾Ð¶Ð½Ñ Ð¼Ñ–Ñ‚ÐºÐ°"
+
+#: deluge/plugins/Label/deluge_label/core.py:187
+msgid "Label already exists"
+msgstr "Мітка вже Ñ–Ñнує"
+
+#: deluge/plugins/Label/deluge_label/core.py:195
+#: deluge/plugins/Label/deluge_label/core.py:285
+#: deluge/plugins/Label/deluge_label/core.py:320
+msgid "Unknown Label"
+msgstr "Ðевідома мітка"
+
+#: deluge/plugins/Label/deluge_label/core.py:321
+msgid "Unknown Torrent"
+msgstr "Ðевідомий торент"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:46
+msgid "Label _Options"
+msgstr "_Параметри мітки"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:47
+msgid "_Remove Label"
+msgstr "_Видалити мітку"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:48
+msgid "_Add Label"
+msgstr "_Додати мітку"
+
+#: deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py:177
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:2
+msgid "Label Options"
+msgstr "Параметри міток"
+
+#: deluge/plugins/Label/deluge_label/gtkui/submenu.py:34
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:37
+#: deluge/plugins/Label/deluge_label/gtkui/label_config.py:45
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:49
+#: deluge/plugins/Label/deluge_label/gtkui/__init__.py:77
+msgid "Label"
+msgstr "Мітка"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:1
+msgid "tracker1.org"
+msgstr "tracker1.org"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:3
+msgid "<b>Label Options</b>"
+msgstr "<b>Параметри міток</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:9
+msgid "Apply per torrent max settings:"
+msgstr "ЗаÑтоÑувати макÑимальні параметри Ð´Ð»Ñ ÑƒÑÑ–Ñ… торентів:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:10
+msgid "Maximum"
+msgstr "МакÑимум"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:14
+msgid "Apply Queue settings:"
+msgstr "ЗаÑтоÑувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€Ð³Ð¸:"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
+msgid "Apply folder settings:"
+msgstr ""
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(кожен трекер в окремому Ñ€Ñдку)</i>"
+
+#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:20
+msgid "Automatically apply label:"
+msgstr "Ðвтоматично додати мітку:"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:1
+msgid "Add Label"
+msgstr "Додати мітку"
+
+#: deluge/plugins/Label/deluge_label/data/label_add.ui.h:2
+msgid "<b>Add Label</b>"
+msgstr "<b>Додати мiтку</b>"
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:1
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+"<i>ВикориÑтовуйте бічну панель Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð½Ð½Ñ, Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¼Ñ–Ñ‚Ð¾Ðº. "
+"</i>\n"
+
+#: deluge/plugins/Label/deluge_label/data/label_pref.ui.h:3
+msgid "<b>Labels</b>"
+msgstr "<b>Мітки</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:171
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:175
+msgid "Popup notification is not enabled."
+msgstr "Спливаючі вікна вимкнено"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
+msgid "libnotify is not installed"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:183
+msgid "Failed to popup notification"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:186
+msgid "Notification popup shown"
+msgstr "Показувати Ñпливаючі вікна"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:190
+msgid "Sound notification not enabled"
+msgstr "Звук ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:192
+msgid "pygame is not installed"
+msgstr "pygame не вÑтановлено"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:204
+#, python-format
+msgid "Sound notification failed %s"
+msgstr "Звукове ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ðµ вдалоÑÑ Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:208
+msgid "Sound notification Success"
+msgstr "Звукове ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÑƒÑпішне"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:232
+msgid "Finished Torrent"
+msgstr "Завантажено торент"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:236
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i file(s) has finished "
+"downloading."
+msgstr ""
+"Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ€ÐµÐ½Ñ‚Ñƒ \"%(name)s\", що міÑтить %(num_files)i файл(-и/-ів) "
+"завершено."
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:285
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:315
+msgid "Notifications"
+msgstr "СповіщеннÑ"
+
+#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:661
+msgid "Choose Sound File"
+msgstr "Виберіть звуковий файл"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:127
+#: deluge/plugins/Notifications/deluge_notifications/core.py:158
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+"СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°, під Ñ‡Ð°Ñ Ð²Ð¸ÑÐ¸Ð»Ð°Ð½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ð³Ð¾ лиÑта зі ÑповіщеннÑм: %s"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:145
+#, python-format
+msgid "Server did not reply properly to HELO greeting: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:149
+#, python-format
+msgid "Server refused username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:174
+msgid "Notification email sent."
+msgstr "ЛиÑÑ‚ зі ÑповіщеннÑм надіÑлано"
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:181
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr "Завантажено Торрент: \"%(name)s\""
+
+#: deluge/plugins/Notifications/deluge_notifications/core.py:184
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+"Мета цього лиÑта повідомити, що Deluge закінчив Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ \"%(name)s\", "
+"Ñкий включає в Ñебе %(num_files)i файлів.\n"
+"Щоб припинити Ð¾Ñ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ такого типу проÑто відключіть "
+"ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ пошті в налаштуваннÑÑ… Deluge.\n"
+"\n"
+"З повагою,\n"
+"Deluge."
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
+msgid "Popups enabled"
+msgstr "Дозволити Ñпливаючі вікна"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
+msgid "Sound enabled"
+msgstr "Звуки увімкнено"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
+msgid "<b>UI Notifications</b>"
+msgstr "<b>UI СповіщеннÑ</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:9
+msgid "<b>Recipients</b>"
+msgstr "<b>Отримувачі</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:10
+msgid "Server requires TLS/SSL"
+msgstr "Сервер потребує TLS/SSL"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:13
+msgid "<b>Email Notifications</b>"
+msgstr "<b>Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾ÑŽ поштою</b>"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:15
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+"Ð¦Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ означає, що ви дійÑно отримаєте ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ вÑÑ– ці "
+"події."
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:16
+msgid "Subscriptions"
+msgstr "ПідпиÑки"
+
+#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:17
+msgid "Sound Customization"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð²ÑƒÐºÑƒ"
+
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:42
+#: deluge/plugins/Extractor/deluge_extractor/gtkui.py:53
+msgid "Extractor"
+msgstr ""
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:1
+msgid "Extract to:"
+msgstr "Видобути до:"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:3
+msgid "Create torrent name sub-folder"
+msgstr "Створити підтеку з назвою торента"
+
+#: deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui.h:4
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+"Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ, в обраній теці, буде Ñтворювати підтеки, з назвами торрентів Ñ– "
+"зберігати файли туди."
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:196
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:359
+msgid "Scheduler"
+msgstr "Планувальник"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
+msgid "<b>Schedule</b>"
+msgstr ""
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
+msgid "Download Limit:"
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:310
+msgid "Upload Limit:"
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:319
+msgid "Active Torrents:"
+msgstr "Ðктивних торентів:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
+msgid "Active Downloading:"
+msgstr "Ðктивних завантажень:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
+msgid "Active Seeding:"
+msgstr "Ðктивних роздач:"
+
+#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:350
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:13
+msgid "File Browser"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:25
+msgid "Back"
+msgstr "Ðазад"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:29
+msgid "Forward"
+msgstr "Далі"
+
+#: deluge/ui/web/js/deluge-all/FileBrowser.js:37
+msgid "Home"
+msgstr "Додому"
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:32
+msgid "Create"
+msgstr "Створити"
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:100
+msgid "Help"
+msgstr "Довідка"
+
+#: deluge/ui/web/js/deluge-all/Toolbar.js:108
+msgid "Logout"
+msgstr "Вийти"
+
+#: deluge/ui/web/js/deluge-all/EditTrackerWindow.js:34
+msgid "Save"
+msgstr "Зберегти"
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:19
+msgid "About Deluge"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AboutWindow.js:102
+msgid "Copyright 2007-2018 Deluge Team"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/RemoveWindow.js:33
+msgid "Remove With Data"
+msgstr "Видалити з даними"
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:17
+msgid "Add Connection"
+msgstr "Додати з’єднаннÑ"
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:44
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:53
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/AddConnectionWindow.js:96
+#, python-brace-format
+msgid "Unable to add host: {0}"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:37
+msgid "Move"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
+msgid "Browse"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
+msgid "Edit Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:115
+msgid "Unable to edit host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:22
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:31
+msgid "Login"
+msgstr "Увійти"
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:108
+msgid "Login Failed"
+msgstr "Помилка входу"
+
+#: deluge/ui/web/js/deluge-all/LoginWindow.js:109
+msgid "You entered an incorrect password"
+msgstr "Ви ввели неправильний пароль"
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:228
+msgid "Public"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/TorrentGrid.js:292
+msgid "Last Transfer"
+msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°"
+
+#: deluge/ui/web/js/deluge-all/Deluge.js:158
+msgid "Mixed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:87
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:97
+msgid "Download Speed"
+msgstr "ШвидкіÑÑ‚ÑŒ завантаженнÑ"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:102
+#: deluge/ui/web/js/deluge-all/Statusbar.js:161
+#: deluge/ui/web/js/deluge-all/Menus.js:79
+#: deluge/ui/web/js/deluge-all/Menus.js:124
+msgid "5 KiB/s"
+msgstr "5 КіБ/Ñ"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:108
+#: deluge/ui/web/js/deluge-all/Statusbar.js:167
+#: deluge/ui/web/js/deluge-all/Menus.js:85
+#: deluge/ui/web/js/deluge-all/Menus.js:130
+msgid "10 KiB/s"
+msgstr "10 КіБ/Ñ"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:114
+#: deluge/ui/web/js/deluge-all/Statusbar.js:173
+#: deluge/ui/web/js/deluge-all/Menus.js:91
+#: deluge/ui/web/js/deluge-all/Menus.js:136
+msgid "30 KiB/s"
+msgstr "30 КіБ/Ñ"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:120
+#: deluge/ui/web/js/deluge-all/Statusbar.js:179
+#: deluge/ui/web/js/deluge-all/Menus.js:97
+#: deluge/ui/web/js/deluge-all/Menus.js:142
+msgid "80 KiB/s"
+msgstr "80 КіБ/Ñ"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:126
+#: deluge/ui/web/js/deluge-all/Statusbar.js:185
+#: deluge/ui/web/js/deluge-all/Menus.js:103
+#: deluge/ui/web/js/deluge-all/Menus.js:148
+msgid "300 KiB/s"
+msgstr "300 КіБ/Ñ"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:145
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:156
+msgid "Upload Speed"
+msgstr "ШвидкіÑÑ‚ÑŒ віддачі"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:204
+msgid "Set Maximum Upload Speed"
+msgstr "Ð’Ñтановити макÑ. шв-ÑÑ‚ÑŒ віддачі"
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:215
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:242
+msgid "Freespace in download folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Statusbar.js:357
+#, python-brace-format
+msgid "<b>IP</b> {0}"
+msgstr "<b>IP</b> {0}"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:33
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:187
+msgid "Connect"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:120
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
+msgid "Stop Daemon"
+msgstr "Зупинити фонову Ñлужбу"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
+msgid "Disconnect"
+msgstr "Від'єднатиÑÑŒ"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
+msgid "Start Daemon"
+msgstr "ЗапуÑтити фонову Ñлужбу"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
+msgid "Change Default Password"
+msgstr "Змінити типовий пароль"
+
+#: deluge/ui/web/js/deluge-all/ConnectionManager.js:324
+msgid ""
+"We recommend changing the default password.<br><br>Would you like to change "
+"it now?"
+msgstr ""
+"Ми рекомендуємо змінити типовий пароль.<br><br>Бажаєте змінити його зараз?"
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:13
+msgid "Tracker Host"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Sidebar.js:33
+msgid "Filters"
+msgstr "Фільтри"
+
+#: deluge/ui/web/js/deluge-all/UI.js:142
+msgid "Connection restored"
+msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð¾"
+
+#: deluge/ui/web/js/deluge-all/UI.js:153
+msgid "Lost Connection"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:154
+msgid "The connection to the webserver has been lost!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/UI.js:160
+msgid "Lost connection to webserver"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:72
+msgid "D/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:117
+msgid "U/L Speed Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:162
+msgid "Connection Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:207
+msgid "Upload Slot Limit"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:316
+msgid "Update Tracker"
+msgstr "Оновити трекер"
+
+#: deluge/ui/web/js/deluge-all/Menus.js:339
+msgid "Force Recheck"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/Menus.js:359
+msgid "Expand All"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
+msgid "Details"
+msgstr "Подробиці"
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
+msgid "Comment:"
+msgstr "Коментар:"
+
+#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
+msgid "Status:"
+msgstr "Стан:"
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
+msgid "Move Completed:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
+msgid "General"
+msgstr "Загальні"
+
+#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:279
+msgid "Private"
+msgstr "Приватний"
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
+msgid "Loading"
+msgstr "ЗавантаженнÑ"
+
+#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
+msgid "True"
+msgstr "Вірно"
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:50
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/OtherPage.js:67
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:215
+msgid "Pause torrent"
+msgstr "Призупинити торент"
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:17
+msgid "Install Plugin"
+msgstr "Ð’Ñтановити додаток"
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
+msgid "Install"
+msgstr "Ð’Ñтановити"
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
+msgid "Select an egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:46
+msgid "Plugin Egg"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:49
+msgid "Browse..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:59
+msgid "Uploading your plugin..."
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:52
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:162
+msgid "Maximum Connections:"
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ з'єднань:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:74
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:184
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "МакÑимальна швидкіÑÑ‚ÑŒ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ (КіБ/Ñ):"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:85
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:195
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "МакÑимальна швидкіÑÑ‚ÑŒ роздачі (KiB/s):"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:96
+msgid "Maximum Half-Open Connections:"
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ напів відкритих з'єднань:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:107
+msgid "Maximum Connection Attempts per Second:"
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ Ñпроб з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð° Ñекунду:"
+
+#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:173
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
+msgid "Cache Size (16 KiB Blocks):"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
+msgid "Force Use of Proxy"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
+msgid "Find More"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:69
+msgid "Use Random Port"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
+msgid "Type Of Service"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
+msgid "Show filters with zero torrents"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:60
+msgid "Allow the use of multiple filters at once"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:94
+msgid "WebUI Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
+msgid "Old:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
+msgid "New:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
+msgid "Confirm:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:124
+msgid "Server"
+msgstr "Сервер"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
+msgid "Session Timeout:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
+msgid "Enable SSL (paths relative to Deluge config folder)"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:177
+msgid "Private Key:"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:187
+msgid "Certificate:"
+msgstr "Сертифікат:"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:205
+msgid "WebUI Language Changed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:207
+msgid "Do you want to refresh the page now to use the new language?"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
+msgid "Refresh"
+msgstr "Оновити"
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
+msgid "Invalid Password"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
+msgid "Your passwords don't match!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:260
+msgid "Your old password was incorrect!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:269
+msgid "Change Successful"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:270
+msgid "Your password was successfully changed!"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:13
+msgid "Add from Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:37
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:143
+msgid "Url"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
+msgid "Cookies"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:133
+msgid "File"
+msgstr "Файл"
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
+msgid "Infohash"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:259
+msgid "Uploading your torrent..."
+msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ торента..."
+
+#: deluge/ui/web/js/deluge-all/add/AddWindow.js:302
+msgid "Not a valid torrent"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
+msgid "Move Completed Folder"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
+msgid "Max Down Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
+msgid "Max Up Speed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
+msgid "Add In Paused State"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:161
+msgid "Super Seed"
+msgstr ""
+
+#: deluge/ui/web/js/deluge-all/add/FilesTab.js:43
+msgid "Download"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:11
+msgid "ETA:"
+msgstr ""
+
+#: deluge/ui/web/render/tab_status.html:26
+msgid "Date Added:"
+msgstr "Дата додаваннÑ:"
+
+#~ msgid "<b><i><big>Notifications</big></i></b>"
+#~ msgstr "<b><i><big>СповіщеннÑ</big></i></b>"
+
+#~ msgid "Bulgarian"
+#~ msgstr "БолгарÑька"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "ÐзербайджанÑька"
+
+#~ msgid "Afrikaans"
+#~ msgstr "ÐфрикаанÑ"
+
+#~ msgid "Arabic"
+#~ msgstr "ÐрабÑька"
+
+#~ msgid "Asturian"
+#~ msgstr "ÐÑтурійÑька"
+
+#~ msgid "German"
+#~ msgstr "Ðімецька"
+
+#~ msgid "Danish"
+#~ msgstr "ДатÑька"
+
+#~ msgid "Bosnian"
+#~ msgstr "БоÑнійÑька"
+
+#~ msgid "Welsh"
+#~ msgstr "ВалійÑька"
+
+#~ msgid "Czech"
+#~ msgstr "ЧеÑька"
+
+#~ msgid "Belarusian"
+#~ msgstr "БілоруÑька"
+
+#~ msgid "Breton"
+#~ msgstr "БретонÑька"
+
+#~ msgid "Bengali"
+#~ msgstr "БенгальÑька"
+
+#~ msgid "Greek"
+#~ msgstr "Грецька"
+
+#~ msgid "Catalan"
+#~ msgstr "КаталонÑька"
+
+#~ msgid "Argentinian Spanish"
+#~ msgstr "ІÑпанÑька (Ðргентина)"
+
+#~ msgid "Venezuelan Spanish"
+#~ msgstr "ІÑпанÑька (ВенеÑуела)"
+
+#~ msgid "Mexican Spanish"
+#~ msgstr "ІÑпанÑька (МекÑика)"
+
+#~ msgid "Nicaraguan Spanish"
+#~ msgstr "ІÑпанÑька (Ðікарагуа)"
+
+#~ msgid "English (Canada)"
+#~ msgstr "ÐнглійÑька (Канада)"
+
+#~ msgid "English"
+#~ msgstr "ÐнглійÑька"
+
+#~ msgid "Spanish"
+#~ msgstr "ІÑпанÑька"
+
+#~ msgid "English (United Kingdom)"
+#~ msgstr "ÐнглійÑька (ВеликобританіÑ)"
+
+#~ msgid "Esperanto"
+#~ msgstr "ЕÑперанто"
+
+#~ msgid "English (Australia)"
+#~ msgstr "ÐнглійÑька (ÐвÑтраліÑ)"
+
+#~ msgid "Irish"
+#~ msgstr "ІрландÑька"
+
+#~ msgid "Frisian"
+#~ msgstr "Фризька"
+
+#~ msgid "French"
+#~ msgstr "Французька"
+
+#~ msgid "Finnish"
+#~ msgstr "ФінÑька"
+
+#~ msgid "Persian"
+#~ msgstr "ПерÑька"
+
+#~ msgid "Basque"
+#~ msgstr "БаÑкÑька"
+
+#~ msgid "Estonian"
+#~ msgstr "ЕÑтонÑька"
+
+#~ msgid "Galician"
+#~ msgstr "ГаліÑійÑька"
+
+#~ msgid "Hindi"
+#~ msgstr "Гінді"
+
+#~ msgid "Hebrew"
+#~ msgstr "Іврит"
+
+#~ msgid "Georgian"
+#~ msgstr "ГрузинÑька"
+
+#~ msgid "Kazakh"
+#~ msgstr "КазахÑька"
+
+#~ msgid "Italian"
+#~ msgstr "ІталійÑька"
+
+#~ msgid "Inuktitut"
+#~ msgstr "Інуктитут"
+
+#~ msgid "Indonesian"
+#~ msgstr "ІндонезійÑька"
+
+#~ msgid "Icelandic"
+#~ msgstr "ІÑландÑька"
+
+#~ msgid "Croatian"
+#~ msgstr "ХорватÑьке"
+
+#~ msgid "Hungarian"
+#~ msgstr "УгорÑька"
+
+#~ msgid "Interlingua"
+#~ msgstr "Інтерлінгва"
+
+#~ msgid "Macedonian"
+#~ msgstr "МакедонÑька"
+
+#~ msgid "Latvian"
+#~ msgstr "ЛатвійÑька"
+
+#~ msgid "Korean"
+#~ msgstr "КорейÑька"
+
+#~ msgid "Kannada"
+#~ msgstr "КаннадÑька"
+
+#~ msgid "Latin"
+#~ msgstr "ЛатинÑька"
+
+#~ msgid "Kurdish"
+#~ msgstr "КурдÑька"
+
+#~ msgid "Lithuanian"
+#~ msgstr "ЛитовÑька"
+
+#~ msgid "Luxembourgish"
+#~ msgstr "ЛюкÑембурзька"
+
+#~ msgid "Malayalam"
+#~ msgstr "МалаÑламÑька"
+
+#~ msgid "Khmer"
+#~ msgstr "КхмерÑька"
+
+#~ msgid "Norwegian Nynorsk"
+#~ msgstr "Ðорвезька (ÐюнорÑк)"
+
+#~ msgid "Punjabi"
+#~ msgstr "Пенджабі"
+
+#~ msgid "Low German"
+#~ msgstr "Ðижньонімецька"
+
+#~ msgid "Dutch"
+#~ msgstr "ГолландÑька"
+
+#~ msgid "Norwegian Bokmal"
+#~ msgstr "Ðорвезька (Бокмал)"
+
+#~ msgid "Nepali"
+#~ msgstr "ÐепальÑька"
+
+#~ msgid "Mayaly"
+#~ msgstr "МалайÑька"
+
+#~ msgid "Burmese"
+#~ msgstr "БірманÑька"
+
+#~ msgid "Mongolian"
+#~ msgstr "МонгольÑька"
+
+#~ msgid "Ossetic"
+#~ msgstr "ОÑетинÑька"
+
+#~ msgid "Sinhalese"
+#~ msgstr "СингальÑька"
+
+#~ msgid "Russian"
+#~ msgstr "РоÑійÑька"
+
+#~ msgid "Romanian"
+#~ msgstr "РумунÑька"
+
+#~ msgid "Brazilian Portuguese"
+#~ msgstr "БразильÑька португальÑька"
+
+#~ msgid "Portuguese"
+#~ msgstr "ПортугальÑька"
+
+#~ msgid "Piedmontese"
+#~ msgstr "П'ємонтезе"
+
+#~ msgid "Polish"
+#~ msgstr "ПольÑька"
+
+#~ msgid "Slovenian"
+#~ msgstr "СловенÑька"
+
+#~ msgid "Albanian"
+#~ msgstr "ÐлбанÑька"
+
+#~ msgid "Slovak"
+#~ msgstr "Словацька"
+
+#~ msgid "Turkish"
+#~ msgstr "Турецька"
+
+#~ msgid "Tagalog"
+#~ msgstr "ТагальÑька"
+
+#~ msgid "Klingon"
+#~ msgstr "КлінгонÑька"
+
+#~ msgid "Swahili"
+#~ msgstr "Суахілі"
+
+#~ msgid "Tamil"
+#~ msgstr "ТамільÑька"
+
+#~ msgid "Telugu"
+#~ msgstr "Телугу"
+
+#~ msgid "Thai"
+#~ msgstr "ТайÑька"
+
+#~ msgid "Serbian"
+#~ msgstr "СербÑька"
+
+#~ msgid "Serbian Latin"
+#~ msgstr "СербÑька (латинь)"
+
+#~ msgid "Swedish"
+#~ msgstr "ШведÑька"
+
+#~ msgid "Traditional Chinese"
+#~ msgstr "КитайÑька традиційна"
+
+#~ msgid "Simplified Chinese"
+#~ msgstr "КитайÑька Ñпрощена"
+
+#~ msgid "Urdu"
+#~ msgstr "Урду"
+
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "КитайÑька (Ñпрощене пиÑьмо)"
+
+#~ msgid "Tatar"
+#~ msgstr "ТатарÑька"
+
+#~ msgid "Ukrainian"
+#~ msgstr "УкраїнÑька"
+
+#~ msgid "Udmurt"
+#~ msgstr "УдмуртÑька"
+
+#~ msgid "Vietnamese"
+#~ msgstr "В’єтнамÑька"
+
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "КитайÑька (Тайвань)"
+
+#~ msgid "Japanese"
+#~ msgstr "ЯпонÑька"
+
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "КитайÑька (Гонконг)"
+
+#~ msgid "pynotify is not installed"
+#~ msgstr "pynotify не вÑтановлено"
+
+#~ msgid "pynotify failed to show notification"
+#~ msgstr "pynotify не вдалоÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ‚Ð¸ ÑповіщеннÑ"
+
+#~ msgid "Ignore"
+#~ msgstr "Знехтувати"
+
+#, python-format
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#, python-format
+#~ msgid "D: %s U: %s - Deluge"
+#~ msgstr "D: %s U: %s - Deluge"
+
+#~ msgid "_Normal Priority"
+#~ msgstr "_Звичайний пріоритет"
+
+#~ msgid "_High Priority"
+#~ msgstr "_ВиÑокий пріоритет"
+
+#~ msgid "_Low Priority"
+#~ msgstr "_Ðизький пріоритет"
+
+#~ msgid "_Ignore"
+#~ msgstr "_Знехтувати"
+
+#~ msgid "_Filter"
+#~ msgstr "_Фільтр"
+
+#~ msgid "Associate Magnet links with Deluge"
+#~ msgstr "Пов'Ñзати Magnet-поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð· Deluge"
diff --git a/deluge/i18n/util.py b/deluge/i18n/util.py
new file mode 100644
index 0000000..bd002f7
--- /dev/null
+++ b/deluge/i18n/util.py
@@ -0,0 +1,150 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007,2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import ctypes
+import gettext
+import locale
+import logging
+import os
+import sys
+from glob import glob
+
+from six.moves import builtins
+
+import deluge.common
+
+from .languages import LANGUAGES
+
+log = logging.getLogger(__name__)
+
+I18N_DOMAIN = 'deluge'
+
+
+def get_translations_path():
+ """Get the absolute path to the directory containing translation files"""
+ return deluge.common.resource_filename('deluge', 'i18n')
+
+
+def get_languages():
+ lang = []
+
+ translations_path = get_translations_path()
+ lc_messages_path = os.path.join('LC_MESSAGES', I18N_DOMAIN + '.mo')
+ for root, dirs, files in os.walk(translations_path):
+ # Get the dirs
+ lang_dirs = [
+ lang_dir
+ for lang_dir in dirs
+ if glob(os.path.join(translations_path, lang_dir, lc_messages_path))
+ ]
+ break
+ else:
+ return lang
+
+ for i, lang_code in enumerate(lang_dirs):
+ name = '%s (Language name missing)' % lang_code
+ if lang_code in LANGUAGES:
+ name = LANGUAGES[lang_code]
+ lang.append([lang_code, _(name)])
+
+ lang = sorted(lang, key=lambda l: l[1])
+ return lang
+
+
+def set_language(lang):
+ """
+ Set the language to use.
+
+ gettext and GtkBuilder will load the translations from the specified
+ language.
+
+ :param lang: the language, e.g. "en", "de" or "en_GB"
+ :type lang: str
+ """
+ # Necessary to set these environment variables for GtkBuilder
+ deluge.common.set_env_variable('LANGUAGE', lang) # Windows/Linux
+ deluge.common.set_env_variable('LANG', lang) # For OSX
+
+ translations_path = get_translations_path()
+ try:
+ ro = gettext.translation(
+ 'deluge', localedir=translations_path, languages=[lang]
+ )
+ ro.install()
+ except IOError as ex:
+ log.warning('IOError when loading translations: %s', ex)
+
+
+def setup_mock_translation(warn_msg=None):
+ def _func(*txt):
+ if warn_msg:
+ log.warning(
+ '"%s" has been marked for translation, but translation is unavailable.',
+ txt[0],
+ )
+ return txt[0]
+
+ builtins.__dict__['_'] = _func
+ builtins.__dict__['ngettext'] = builtins.__dict__['_n'] = _func
+
+
+# Initialize gettext
+def setup_translation():
+ translations_path = get_translations_path()
+ log.info('Setting up translations from %s', translations_path)
+
+ try:
+ if hasattr(locale, 'bindtextdomain'):
+ locale.bindtextdomain(I18N_DOMAIN, translations_path)
+ if hasattr(locale, 'textdomain'):
+ locale.textdomain(I18N_DOMAIN)
+
+ gettext.bindtextdomain(I18N_DOMAIN, translations_path)
+ gettext.bind_textdomain_codeset(I18N_DOMAIN, 'UTF-8')
+ gettext.textdomain(I18N_DOMAIN)
+
+ # Workaround for Python 2 unicode gettext (keyword removed in Py3).
+ kwargs = {} if not deluge.common.PY2 else {'unicode': True}
+
+ gettext.install(I18N_DOMAIN, translations_path, names='ngettext', **kwargs)
+ builtins.__dict__['_n'] = builtins.__dict__['ngettext']
+
+ libintl = None
+ if deluge.common.windows_check():
+ for intl in ('libintl-8.dll', 'intl.dll'):
+ try:
+ libintl = ctypes.cdll.LoadLibrary(intl)
+ except OSError as ex:
+ exception = ex
+ else:
+ break
+ finally:
+ if not libintl:
+ log.error('Unable to initialize gettext/locale!')
+ log.error(exception)
+ setup_mock_translation()
+ elif deluge.common.osx_check():
+ libintl = ctypes.cdll.LoadLibrary('libintl.dylib')
+
+ if libintl:
+ libintl.bindtextdomain(
+ I18N_DOMAIN, translations_path.encode(sys.getfilesystemencoding())
+ )
+ libintl.textdomain(I18N_DOMAIN)
+ libintl.bind_textdomain_codeset(I18N_DOMAIN, 'UTF-8')
+ libintl.gettext.restype = ctypes.c_char_p
+
+ except Exception as ex:
+ log.error('Unable to initialize gettext/locale!')
+ log.exception(ex)
+ setup_mock_translation()
+
+ deluge.common.translate_size_units()
diff --git a/deluge/i18n/vi.po b/deluge/i18n/vi.po
new file mode 100644
index 0000000..10d96cd
--- /dev/null
+++ b/deluge/i18n/vi.po
@@ -0,0 +1,3753 @@
+# Vietnamese translation for deluge
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: Lê Bình <lebinh.it@gmail.com>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-04-18 14:31+0000\n"
+"Last-Translator: Long Tran <Unknown>\n"
+"Language-Team: Vietnamese <vi@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "Từ:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "Lá»±a chá»n má»™t thÆ° mục"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>Äịa Ä‘iểm tải xuống</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "Tên:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr ""
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "Tốc độ tải xuống"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "Tốc độ tải lên"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "Xuống"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "Lên"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "Tải xuống"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "Mạng"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "Phần bổ sung"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "Kích cỡ"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "_Tập tin"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "_Thêm torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "_Hiệu chỉnh"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "_Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "_Xem"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "Thanh _Công cụ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "_Cá»™t"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "_Trợ giúp"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "Thêm Torrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "Loại bỠTorrent"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "Tạm dừng"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "Tiếp tục"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "Tuỳ thích"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Trạng thái ngÆ°á»i theo dõi:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>Số phân mảnh:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>Thông báo kế:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>Tỷ lệ chia sẻ:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>Äã tải lên:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>Äã tải xuống:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>Số tập tin:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>NgÆ°á»i theo dõi:<b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>Kích thước tổng:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>Tên:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>ÄÆ°á»ng dẫn:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "_Chi tiết"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "_Biên tập các Tracker"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "Tạm _dừng tất cả"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>Torrents</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>Cấp phát</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "Sử dụng cấp phát toàn bộ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+"Cấp pháp toàn bộ sẽ cấp phát trước toàn bộ dung lượng đĩa cần thiết cho "
+"torrentvà ngăn ngừa được sự phân mảnh tập tin"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "Sá»­ dụng cấp phát rút gá»n"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "Cấp phát rút gá»n chỉ cấp phát đúng dung lượng cần thiết tạm thá»i"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge sẽ tá»± Ä‘á»™ng chá»n 1 cổng khác để sá»­ dụng"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "Cổng tích cực:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "Tá»›i:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "Thử cổng tích cực"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "Bảng băm phân tán (DHT) có thể cải thiện số lượng kết nối tích cực."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "Dữ liệu nhận"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "Cấp:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "Dữ liệu truyá»n Ä‘i"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "Mã hóa"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Tốc Ä‘á»™ tải lên tối Ä‘a, áp dụng cho tất cả torrent. Äặt giá trị -1 là không "
+"giới hạn."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "Tốc độ tải lên lớn nhất (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "Số kết nối cho phép nhiá»u nhất. Äặt giá trị -1 là không giá»›i hạn."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "Kết nối nhiá»u nhất:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+"Số Ä‘Æ°á»ng tải lên nhiá»u nhất, áp dụng cho tất cả torrent. Äặt giá trị -1 là "
+"không giới hạn."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "Số Ä‘Æ°á»ng tải lên lá»›n nhất:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+"Tốc Ä‘á»™ tải xuống lá»›n nhất, áp dụng cho tất cả torrent. Äặt giá trị -1 là "
+"không giới hạn."
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "Tốc độ tải xuống lớn nhất (KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>Äang tải lên</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "_Hiện Deluge"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "_Tiếp tục tất cả"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "_Giới hạn tốc độ tải xuống"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "Giới _hạn tốc độ tải lên"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "_Hàng đợi"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "_Cập nhật Tracker"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "_Loại bỠTorrent"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "Biên tập các Tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "Details"
+#~ msgstr "Chi tiết"
+
+#~ msgid "Add"
+#~ msgstr "Thêm"
+
+#~ msgid "Remove"
+#~ msgstr "Loại bá»"
+
+#~ msgid "Share Ratio"
+#~ msgstr "Tỷ lệ chia sẻ"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>Tốc độ:</b>"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "Xoá tập tin .torrent"
+
+#~ msgid "Select All"
+#~ msgstr "Chá»n tất cả"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "_Quit"
+#~ msgstr "_Thoát"
+
+#~ msgid "Clear"
+#~ msgstr "Xóa"
+
+#~ msgid "Availability"
+#~ msgstr "Khả dụng"
diff --git a/deluge/i18n/zh_CN.po b/deluge/i18n/zh_CN.po
new file mode 100644
index 0000000..f3fec42
--- /dev/null
+++ b/deluge/i18n/zh_CN.po
@@ -0,0 +1,4613 @@
+# Chinese (China) translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2009-06-17 03:09+0000\n"
+"Last-Translator: Xu Zehua <hhhpppsss1@hotmail.com>\n"
+"Language-Team: Chinese (China) <zh_CN@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/s"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "主机å:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "端å£ï¼š"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "用户å:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "密ç :"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "起始端å£:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "å·²å¯ç”¨"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "设置"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "选择一个文件夹"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>下载ä½ç½®</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "最大上传速度"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "åšå¤§è¿žæŽ¥æ•°ï¼š"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "最大上传通é“:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "最大下载速度"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "带宽"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "åšç§åœæ­¢çš„分享率:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "移除当分享率达到"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "顶部"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "底部"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>队列</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "选项"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "下载é™é€Ÿï¼š"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "上传é™é€Ÿï¼š"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "活动ç§å­ï¼š"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>Slow Settings</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "无效标签,有效字符:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "空标签"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "标签已存在"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "未知标签"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "未知的ç§å­"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "标签"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "标签选项"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "移除标签 (_R)"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "添加标签 (_A)"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "标签选项"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>标签选项</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "上传通é“\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "上传速度:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "下载速度:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "连接数:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "应用æ¯ä¸ªç§å­çš„最大设置"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "最大"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "自动管ç†"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "应用队列设置:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "队列"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "将已完æˆçš„任务移动到:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "应用ä½ç½®è®¾ç½®ï¼š"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "ä½ç½®"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(æ¯ä¸ª tracker 一行)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "自动应用标签"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "Trackers"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "添加标签"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>添加标签</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "å称:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr "<i>使用侧æ æ¥æ·»åŠ ï¼Œç¼–辑和删除标签。</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>标签</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "æå–到:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "创建与ç§å­åŒåçš„å­æ–‡ä»¶å¤¹"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr "此选项在选定的文件夹下创建与ç§å­é‡åçš„å­æ–‡ä»¶å¤¹å¹¶æ”¾ç½®æå–的文件"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>常规</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "å¯ç”¨ web ç•Œé¢"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "å¼€å¯ SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "监å¬ç«¯å£ï¼š"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>设置</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP 列表 (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer 文本 (zip æ ¼å¼)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian 文本 (已解压缩)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "无效引导"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "无效magic代ç "
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "无效版本"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "过滤列表"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "网å€ï¼š"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "天"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "检查第个新åå•"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "å¯åŠ¨æ—¶å¯¼å…¥é˜»æ­¢åå•"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "如果需è¦ï¼Œä¸‹è½½å±è”½åˆ—表文件并导入。"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "检查下载并导入"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "下载并导入一个新的阻止åå•æ–‡ä»¶"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "强制下载并导入"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "å±è”½åˆ—表已更新"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>选项</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "类型:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "日期:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "文件大å°:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>ä¿¡æ¯</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "ç§å­å®Œæ•´"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "已添加ç§å­"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "执行"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "事件"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "命令"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>添加命令</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>命令</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "通告正常"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "å·²å‘é€é€šå‘Š"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "警告"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "错误"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "阿富汗"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "奥兰群岛"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "阿尔巴尼亚"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "阿尔åŠåˆ©äºš"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "美属è¨æ‘©äºš"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "安é“å°”"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "安哥拉"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "阿瓜迪利亚"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "å—æžæ´²"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "安æ瓜和巴布达"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "阿根廷"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "亚美尼亚"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "阿é²å·´"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "澳大利亚"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "奥地利"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "阿塞拜疆"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "巴哈马群岛"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "å·´æž—"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "孟加拉国"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "巴巴多斯"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "白俄罗斯"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "比利时"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "伯利兹"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "è´å®"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "百慕大群岛"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "ä¸ä¸¹"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "玻利维亚"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "波斯尼亚和黑塞哥维那"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "åšèŒ¨ç“¦çº³"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "布维岛"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "巴西"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "英属å°åº¦æ´‹é¢†åœ°"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "文莱达é²è¨å…°å›½"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "ä¿åŠ åˆ©äºš"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "布基纳法索"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "布隆迪"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "柬埔寨"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "喀麦隆"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "加拿大"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "佛得角"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "开曼群岛"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "中éžå…±å’Œå›½"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "ä¹å¾—"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "智利"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "中国"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "圣诞岛"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "科科斯(基林)群岛"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "哥伦比亚"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "科摩罗"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "刚果"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "刚果民主共和国"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "库克群岛"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "哥斯达黎加"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "科特迪瓦"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "克罗地亚"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "å¤å·´"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "塞浦路斯"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "æ·å…‹å…±å’Œå›½"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "丹麦"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "å‰å¸ƒæ"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "多米尼加"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "多米尼加共和国"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "厄瓜多尔"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "埃åŠ"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "厄瓜多尔"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "赤é“几内亚"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "厄立特里亚"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "爱沙尼亚"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "埃塞俄比亚"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "ç¦å…‹å…°ç¾¤å²›ï¼ˆé©¬å°”维纳斯群岛)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "法罗群岛"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "æ–济"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "芬兰"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "法国"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "法属圭亚那"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "法属波利尼西亚"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "法属å—部领土"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "加蓬"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "冈比亚"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "æ ¼é²å‰äºš"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "德国"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "大ä¸åˆ—颠åŠåŒ—爱尔兰è”åˆçŽ‹å›½"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "加纳"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "直布罗陀"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "希腊"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "格陵兰岛"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "格林纳达"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "瓜德罗普"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "关岛"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "å±åœ°é©¬æ‹‰"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "几内亚"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "几内亚比ç»"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "圭亚那"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "海地"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "赫德岛与麦克å”纳群岛"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "梵地冈"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "洪都拉斯"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "香港"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "匈牙利"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "冰岛"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "å°åº¦"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "å°åº¦å°¼è¥¿äºš"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "伊朗伊斯兰共和国"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "伊拉克"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "爱尔兰"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "以色列"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "æ„大利"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "牙买加"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "日本"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "泽西岛"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "约旦"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "哈è¨å…‹æ–¯å¦"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "肯尼亚"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "基里巴斯"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "æœé²œ"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "韩国"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "科å¨ç‰¹"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "å‰å°”å‰æ–¯æ–¯å¦"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "è€æŒäººæ°‘民主共和国"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "拉脱维亚"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "黎巴嫩"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "莱索托"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "利比里亚"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "列支敦士登"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "立陶宛"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "å¢æ£®å ¡"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "澳门"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "马达加斯加"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "马拉维"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "马æ¥è¥¿äºš"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "马尔代夫"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "马里"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "马尔他"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "马ç»å°”群岛"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "马æ尼克岛"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "毛里塔尼亚"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "毛里求斯"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "马约特"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "墨西哥"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "密克罗尼西亚è”邦"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "摩尔多瓦"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "摩纳哥"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "è’™å¤"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "黑山共和国"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "蒙特塞拉特"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "摩洛哥"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "莫桑比克"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "缅甸"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "纳米比亚"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "ç‘™é²"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "尼泊尔"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "è·å…°"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "è·å±žå®‰çš„列斯"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "新喀里多尼亚"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "新西兰"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "尼加拉瓜"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "尼日尔"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "尼日利亚"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "尼斯"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "诺ç¦å…‹å²›"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "北马里亚纳群岛"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "挪å¨"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "阿曼"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "巴基斯å¦"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "å·´å‹’æ–¯å¦è¢«å é¢†åœŸ"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "巴拿马"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "巴布亚新几内亚"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "巴拉圭"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "秘é²"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "è²å¾‹å®¾"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "波兰"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "è‘¡è„牙"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "波多黎å„"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "å¡å¡”å°”"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "罗马尼亚"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "ä¿„ç½—æ–¯è”邦"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "å¢æ—ºè¾¾"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "圣å¢è¥¿äºš"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "法属圣马ä¸"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "圣皮埃尔和密克隆"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "圣文森特和格林纳ä¸æ–¯"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "è¨æ‘©äºš"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "圣马力诺"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "圣多美和普林西比"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "沙特阿拉伯"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "塞内加尔"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "塞尔维亚"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "塞舌尔"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "塞拉利昂"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "新加å¡"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "斯洛ä¼å…‹"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "斯洛文尼亚"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "所罗门群岛"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "索马里"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "å—éž"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "西ç­ç‰™"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "斯里兰å¡"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "è‹ä¸¹"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "ç‘žå…¸"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "瑞士"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "å™åˆ©äºš"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "中国å°æ¹¾çœ"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "å¡”å‰å…‹æ–¯å¦"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "å¦æ¡‘尼亚è”åˆå…±å’Œå›½"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "泰国"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "东å¸æ±¶æ°‘主共和国"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "多哥"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "汤加"
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "çªå°¼æ–¯"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "土耳其"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "土库曼斯å¦"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "特克斯和凯科斯群岛"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "图瓦å¢"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "乌干达"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "乌克兰"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "阿拉伯è”åˆé…‹é•¿å›½"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "美国"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "美国å°åž‹å¤–å²›"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "乌拉圭"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "乌兹别克斯å¦"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "瓦努阿图"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "委内瑞拉"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "越å—"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "英属维京群岛"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "美属维京群岛"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "瓦利斯和富图纳群岛"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "西撒哈拉"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "也门"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "赞比亚"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "津巴布韦"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "离线"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "在线"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "已连接"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "守护进程ä¸å­˜åœ¨"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "守护进程未è¿è¡Œ"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "地å€"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "客户端"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "进度"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "下行速度"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "上传速度"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "ç§å­"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " ç§å­å·²åŠ å…¥é˜Ÿåˆ—"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " ç§å­å·²åŠ å…¥é˜Ÿåˆ—"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "æ— é™åˆ¶"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "活动的"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "其他..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "下载:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "上传:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "下载"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "上传"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "设置最大下载速度"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "设置最大上传速度"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "ç§å­å®Œæˆ"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"您的任务 %(name)s å·²ç»å®Œæˆï¼Œå…±åŒ…å« %(num_files)i 个文件。\n"
+"如果您ä¸æƒ³å†æ”¶åˆ°è¿™ç§é€šçŸ¥é‚®ä»¶ï¼Œæ‚¨åªéœ€åœ¨Deluge的首选项中关闭邮件通知å³å¯ã€‚\n"
+"\n"
+"谢谢您的使用,\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "下载"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "网络"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "带宽"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "ç•Œé¢"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "其他"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "守护程åº"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "代ç†æœåŠ¡å™¨"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "缓存"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "æ’件"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "æ’件"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "选择æ’件"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "Plugin Eggs"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "文件å"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "大å°"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "无效的文件"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "é‡å¤çš„ç§å­"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "无法增加åŒæ ·çš„ç§å­ä¸¤æ¬¡ã€‚"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "无法设置文件优先级ï¼"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "选择ç§å­æ–‡ä»¶"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "ç§å­æ–‡ä»¶"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "所有文件"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "无效的 URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "下载失败"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "列"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "Tracker"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "选择文件"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "选择文件夹"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "ä¿å­˜ç§å­æ–‡ä»¶"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "未连接"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "连接"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "下载速度"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "上传速度"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "å议传输下载/上传速度"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT 节点"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "没有连入的连接!"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "设置最大连接数"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "ç§å­"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "标签"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "全部"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "正在下载"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "åšç§ä¸­"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "已暂åœ"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "正在检查"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "已排列"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "æ— "
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "没有标签"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "主机"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "添加主机出错"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "关闭ç»å…¸æ¨¡å¼å—?"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"一个Deluge进程已ç»åœ¨è¿è¡Œä¸­ã€‚\n"
+"\n"
+"您è¦åœæ­¢è¯¥è¿›ç¨‹æˆ–者关闭ç»å…¸æ¨¡å¼æ‰èƒ½ç»§ç»­ã€‚"
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "å¯åŠ¨å†…核失败"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "å¯åŠ¨å®ˆæŠ¤è¿›ç¨‹å¤±è´¥"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr "å¯åŠ¨è¿›ç¨‹çš„时候å‘生错误。您å¯ä»¥å°è¯•åœ¨å‘½ä»¤è¡Œä¸­è¿è¡Œçœ‹çœ‹æ˜¯å¦è¿˜æœ‰é”™è¯¯ã€‚"
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "å¼€"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "关闭"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "设为无é™åˆ¶"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "选择è¦æŠŠæ–‡ä»¶ç§»åŠ¨åˆ°çš„目录"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "设置最大上传通é“æ•°"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "优先级"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "细节:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "å称"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "已下载"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "已上传"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "ç§å­"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "对等连接"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "估计剩余时间"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "分享率"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "å¥åº·åº¦"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "已添加"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "文件(_F)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "添加ç§å­(_A)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "创建ç§å­ (_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "编辑(_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "连接管ç†ï¼ˆ_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "ç§å­(_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "查看(_V)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "工具æ (_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "ä¾§è¾¹æ  (_S)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "状æ€æ ï¼ˆ_B)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "表å•ï¼ˆ_A)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "列(_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "ä¾§è¾¹æ  (_I)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "显示空项目 (_Z)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "显示Tracker (_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "帮助(_H)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "常è§é—®é¢˜"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "添加ç§å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "添加ç§å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "删除ç§å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "删除ç§å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "æš‚åœå·²é€‰æ‹©çš„任务"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "æš‚åœ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "开始已选择的任务"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "ç»­ä¼ "
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "在队列中上移ç§å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "队列å‘下移动"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "在队列中下移ç§å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "队列å‘上移动"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "首选项"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "连接管ç†"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "全部展开(_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "ä¸è¦ä¸‹è½½ï¼ˆ_D)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "标准优先(_N)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "高优先级(_H)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "最高优先级(_G)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>自动管ç†ï¼š</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>ç§å­ç­‰çº§ï¼š</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>åšç§æ—¶é—´ï¼š</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>活跃时间:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>Tracker状æ€:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>å¥åº·åº¦:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>连接数:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>ç§å­æ•°:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>å—:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>估计剩余时间:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>下次通报:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>分享率:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>已上传:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>已下载:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>添加日期:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "çŠ¶æ€ (_S)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>评论:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>文件书:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>Hash:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>Tracker:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>总大å°:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>å称:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>路径:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>状æ€ï¼š</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "详细信æ¯(_D)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "文件(_F)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "Peers(_P)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "完æˆåŽç§»è‡³"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "ç§æœ‰çš„"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "区分先åŽ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "编辑Trackers(_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "选项(_O)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "删除任务?"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>您肯定您è¦åˆ é™¤å·²é€‰ä»»åŠ¡ï¼Ÿ</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>该è”åˆç§å­æ–‡ä»¶å°†è¢«åˆ é™¤ï¼</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>该已下载数æ®å°†è¢«åˆ é™¤ï¼</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "删除已选ç§å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "æ–°å‘布"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>æ–°å‘布å¯ç”¨!</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>å¯ç”¨ç‰ˆæœ¬:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "当å‰ç‰ˆæœ¬"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "ä¸å†æ˜¾ç¤ºè¿™ä¸ªå¯¹è¯æ¡†"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "转到站点(_G)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "通过IP地å€æ·»åŠ è¿žæŽ¥"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "全选 (_S)"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "全部暂åœ(_P)"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "开始已选任务"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "继续所有 (_M)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "添加任务"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "ç½‘ç»œåœ°å€ (_U)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "å“ˆå¸Œä¿¡æ¯ (_H)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "移除(_R)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>ç§å­</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "文件(_L)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "完全"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "紧凑"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>存储分é…</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "最大下载速度"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "最大上传速度:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "添加到暂åœçŠ¶æ€ï¼ˆ_P)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "区分å‰åŽä¼˜å…ˆå—"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "æ¢å¤åˆ°é»˜è®¤"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "全部应用"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "添加 URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>æ¥è‡ªURL</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "添加哈希信æ¯"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>æ¥è‡ªå“ˆå¸Œä¿¡æ¯</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "哈希信æ¯ï¼š"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "Trackers:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "新建ç§å­"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>新建ç§å­</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "文件夹 (_D)"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "远程路径 (_R)"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>文件</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "作者:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "注释:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "ä¿¡æ¯"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "网络ç§å­"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "å—大å°"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "设置ç§æœ‰æ ‡è®°"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "å‘会è¯æ·»åŠ æ­¤ç§å­"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "键入远程路径"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>远程路径</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "路径:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "正在新建ç§å­"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "ç§å­æ–‡ä»¶å¦å­˜ä¸º"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>ä¿å­˜ç§å­æ–‡ä»¶</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "任务队列"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>添加任务队列</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "连接时自动添加任务"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "标签"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "添加对等连接"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>添加对等连接</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "主机å:端å£"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "添加主机"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>连接管ç†</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "å¯åŠ¨æœ¬åœ°åŽå°ï¼ˆ_S)"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "å¯åŠ¨æ—¶è‡ªåŠ¨è¿žæŽ¥åˆ°é€‰æ‹©çš„主机"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "如需è¦ï¼Œè‡ªåŠ¨å¯åŠ¨æœ¬åœ°ä¸»æœº"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "开始时ä¸è¦æ˜¾ç¤ºè¿™ä¸ªå¯¹è¯æ¡†"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>下载</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "从选中目录中自动添加ç§å­:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "下载到:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "å°†ç§å­æ–‡ä»¶å¤åˆ¶åˆ°:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>文件夹</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "使用完全分é…"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr "对ç§å­æ–‡ä»¶æ‰€éœ€çš„ç£ç›˜ç©ºé—´è¿›è¡Œå®Œå…¨é¢„分é…以防止ç£ç›˜ç¢Žç‰‡"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "使用紧凑分é…"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "紧凑分é…仅对所需的ç£ç›˜ç©ºé—´è¿›è¡Œåˆ†é…"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "任务首尾å—优先"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "优先下载文件的首尾部分"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "添加ç§å­æ—¶æš‚åœ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>网络</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "使用有机端å£"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Delugeæ¯æ¬¡ä¼šéšæœºé€‰æ‹©ä¸€ä¸ªä¸åŒçš„端å£ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "活动端å£:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "结æŸç«¯å£:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "测试活动端å£"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "连入端å£"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "连出端å£"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>ç•Œé¢</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr "å‘é€åˆ°å¯¹ç­‰ç‚¹ï¼ˆåŒ…括网络ç§å­ï¼‰çš„æ¯ä¸€ä¸ªåŒ…çš„IP头部的æœåŠ¡ç±»åž‹å­—段的设置。期望一个å六进制值"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "对等点æœåŠ¡ç±»åž‹å­—段"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>æœåŠ¡ç±»åž‹</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT端å£æ˜ å°„åè®®"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "æ¥æºäº¤æ¢"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "在网络上探索å‘现本地用户"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "分布å¼å“ˆå¸Œè¡¨(DHT)技术å¯ä»¥æ高å¯ç”¨è¿žæŽ¥æ•°é‡ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>附加外部网络</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "本地网络:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "加密级别"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"强制\n"
+"使用\n"
+"ç¦ç”¨"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"æ¡æ‰‹(简å•åŠ å¯†)\n"
+"全数æ®æµ(RC4加密)\n"
+"两者择一"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "外部网络:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "加密全部数æ®æµ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>加密传输</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>带宽</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "æ¯ç§’最大å°è¯•è¿žæŽ¥æ•°ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "最大åŠå¼€è¿žæŽ¥æ•°ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr "全局最大上传速度。-1为无é™åˆ¶ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "最大上传速度(KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "全局最大连接数。-1为无é™åˆ¶ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "最大连接数:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr "全局最大上传通é“。-1为无é™åˆ¶ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "最大上传通é“:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr "全局最大下载速度。-1为无é™åˆ¶ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "最大下载速度(KiB/s):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "在局域网内忽略é™åˆ¶"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "é™åˆ¶IP开销的æµé‡"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr "若选中,为了é¿å…超出总体æµé‡é™åˆ¶ï¼Œå·²å»ºç«‹è¿žæŽ¥çš„TCP/IPé¢å¤–开销将ä¸è®¡å…¥æµé‡é™åˆ¶"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>全局带宽使用情况</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr "æ¯ä¸ªç§å­çš„最大上传通é“。-1为无é™åˆ¶ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "æ¯ä¸ªç§å­çš„最大连接数。-1为无é™åˆ¶ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>æ¯ä¸ªç§å­çš„带宽使用情况</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>ç•Œé¢</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "å¯ç”¨"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"标准模å¼å°†éšè—大多数的åŽå°åŠŸèƒ½ï¼Œå¹¶ä½¿Delugeå˜æˆå•ä¸€ç¨‹åºã€‚使用这个功能,如果您ä¸æƒ³è¿è¡ŒDeluge作为åŽå°è¿›ç¨‹ã€‚您需è¦é‡å¯Delugeæ¥åº”用所作的更改"
+"。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>ç»å…¸æ¨¡å¼</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "在标题æ æ˜¾ç¤ºé€Ÿåº¦"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>主窗å£</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "总是显示"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "将对è¯æ¡†æ”¾åˆ°å‰é¢"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "添加任务对è¯æ¡†"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "å¯ç”¨ç³»ç»Ÿæ‰˜ç›˜å›¾æ ‡"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "关闭åŽæœ€å°åŒ–到系统托盘"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "å¯åŠ¨åŽæ”¾å…¥ç³»ç»Ÿæ‰˜ç›˜"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "从系统托盘打开时,需è¦è¾“入密ç "
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>系统托盘</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>其他</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "自动报告新版本"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr "Deluge会自动检查我们的æœåŠ¡å™¨ï¼Œå½“有新版本å‘布时会通知您"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>å‡çº§</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr "å‘é€ä½ çš„Pythonå’ŒPyGTK版本åŠç³»ç»Ÿå’Œå¤„ç†å™¨ç±»åž‹æ¥å¸®åŠ©æˆ‘们改进Deluge。ç»å¯¹ä¸ä¼šå‘é€å…¶ä»–ä¿¡æ¯ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "是的,请å‘é€åŒ¿å统计"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>系统信æ¯</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "ä½ç½®ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIPæ•°æ®åº“</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "å…³è”magnet链接到Deluge"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>åŽå°</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "åŽå°ç«¯å£"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>端å£</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "å…许远程连接"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "连接"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "定期检查更新"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>其他</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>队列</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "排列新的任务到顶端"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "所有正在åšç§çš„:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "所有活动的:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "所有正在下载的:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "ä¸è€ƒè™‘速度慢的任务"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>活跃任务</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "é™åˆ¶å…±äº«çŽ‡ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "åšç§æ—¶é—´æ¯”率:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "åšç§æ—¶é—´ï¼ˆm)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "åœæ­¢åšç§å½“共享率达到:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "删除ç§å­å½“共享率达到:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>正在åšç§</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>代ç†</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "主机å:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"æ— \n"
+"Socks4\n"
+"Socks5\n"
+"Socks5/需è¦è®¤è¯\n"
+"HTTP\n"
+"HTTP/需è¦è®¤è¯"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>对等连接</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>网络ç§å­</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>Tracker</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>缓存</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "ç¼“å­˜å¤§å° (16 KiB bå—):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "缓存过期时间(秒):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "写入的å—:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "写入:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "写入缓存命中率:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>写入</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "读å–çš„å—:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "ä½äºŽç¼“存中的å—数:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "å—读å–率:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "读缓存的命中率。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "读缓存命中率:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "读å–:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>读å–</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "缓存大å°ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "读缓存大å°ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>尺寸</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>状æ€</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>æ’件</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "版本:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "主页:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "作者电å­é‚®ä»¶ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "安装æ’件 (_I)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "é‡æ–°æ‰«ææ’件 (_R)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "寻找更多æ’件(_F)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "显示Deluge(_S)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "全部继续(_R)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "é™åˆ¶ä¸‹è½½é€Ÿåº¦(_D)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "é™åˆ¶ä¸Šä¼ é€Ÿåº¦(_U)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "退出并关闭åŽå°"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "打开文件夹(_O)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "开始(_M)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "设置(_I)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "队列(_Q)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "æ›´æ–°Tracker(_U)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "删除ç§å­(_R)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "强制é‡æ£€æŸ¥ï¼ˆ_F)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "改å˜å­˜å‚¨åœ°ï¼ˆ_S)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "é™åˆ¶è¿žæŽ¥æ•°ï¼ˆ_C)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "é™åˆ¶ä¸Šä¼ é€šé“(_S)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "自动管ç†ï¼ˆ_A)"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>删除选中的任务?</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "如果你删除这些数æ®,它将永久丢失"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "编辑Tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>编辑Tracker </b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "添加 Tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>添加Tracker</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "编辑Tracker"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>编辑Tracker</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "åŒæ—¶åˆ é™¤æ•°æ® (_D)"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "删除任务 (_T)"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "å˜æ¢å­˜å‚¨åœ°"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "å˜æ¢å­˜å‚¨åœ°"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "目标:"
+
+#~ msgid "Unknown"
+#~ msgstr "未知"
+
+#~ msgid "Pieces"
+#~ msgstr "å—"
+
+#~ msgid "Share Ratio"
+#~ msgstr "分享率"
+
+#~ msgid "Details"
+#~ msgstr "详细信æ¯"
+
+#~ msgid "Files"
+#~ msgstr "文件"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>速度:</b>"
+
+#~ msgid "Select All"
+#~ msgstr "全选"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "删除ç§å­æ–‡ä»¶"
+
+#~ msgid "_Quit"
+#~ msgstr "退出(_Q)"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge已被é”定"
+
+#~ msgid "Server"
+#~ msgstr "æœåŠ¡å™¨"
+
+#~ msgid "Username"
+#~ msgstr "用户å"
+
+#~ msgid "Password"
+#~ msgstr "密ç "
+
+#~ msgid "Port"
+#~ msgstr "端å£"
+
+#~ msgid "Availability"
+#~ msgstr "å¥åº·åº¦"
+
+#~ msgid "Filters"
+#~ msgstr "过滤器"
+
+#~ msgid "Add"
+#~ msgstr "添加"
+
+#~ msgid "Speed"
+#~ msgstr "速度"
+
+#~ msgid "seconds"
+#~ msgstr "秒"
+
+#~ msgid "Download"
+#~ msgstr "下载"
+
+#~ msgid "Upload"
+#~ msgstr "上传"
+
+#~ msgid "Update Tracker"
+#~ msgstr "æ›´æ–° Tracker"
+
+#~ msgid "Total Size"
+#~ msgstr "总共大å°"
+
+#~ msgid "Tracker Status"
+#~ msgstr "Tracker 状æ€"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "最大连接数"
+
+#~ msgid "Start"
+#~ msgstr "开始:"
+
+#~ msgid "New Password"
+#~ msgstr "新密ç "
+
+#~ msgid "Template"
+#~ msgstr "模æ¿"
+
+#~ msgid "Image Only"
+#~ msgstr "仅图åƒ"
+
+#~ msgid "Text and image"
+#~ msgstr "文本和图åƒ"
+
+#~ msgid "Submit"
+#~ msgstr "æ交"
+
+#~ msgid "Set"
+#~ msgstr "设置"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "刷新页é¢æ¯éš”:"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "密ç æ— æ•ˆï¼Œè¯·é‡è¾“"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "选择一个url或一个ç§å­ï¼Œä¸èƒ½åŒæ—¶é€‰æ‹©ã€‚"
+
+#~ msgid "translate something"
+#~ msgstr "翻译"
+
+#~ msgid "Text Only"
+#~ msgstr "仅文字"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "刷新率必须 > 0"
+
+#~ msgid "About"
+#~ msgstr "关于"
+
+#~ msgid "Upload torrent"
+#~ msgstr "上传ç§å­"
+
+#~ msgid "Url"
+#~ msgstr "网å€"
+
+#~ msgid "Logout"
+#~ msgstr "注销"
+
+#~ msgid "Pause all"
+#~ msgstr "全部暂åœ"
+
+#~ msgid "Login"
+#~ msgstr "登录"
+
+#~ msgid "Type"
+#~ msgstr "类型"
+
+#~ msgid "From"
+#~ msgstr "从"
+
+#~ msgid "Disable"
+#~ msgstr "ç¦ç”¨"
+
+#~ msgid "Config"
+#~ msgstr "设置"
+
+#~ msgid "Torrent list"
+#~ msgstr "ç§å­åˆ—表"
+
+#~ msgid "Set Timeout"
+#~ msgstr "设置超时"
+
+#~ msgid "Resume all"
+#~ msgstr "全部继续"
+
+#~ msgid "# Of Files"
+#~ msgstr "# 的文件"
+
+#~ msgid "Ava"
+#~ msgstr "å¥åº·åº¦"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge已被密ç ä¿æŠ¤ã€‚\n"
+#~ "如è¦æ˜¾ç¤ºDeluge窗å£ï¼Œè¯·è¾“入您的密ç "
+
+#~ msgid "Graph"
+#~ msgstr "图表"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "删除已下载的文件"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "自动刷新:"
+
+#~ msgid "Eta"
+#~ msgstr "估计剩余时间"
+
+#~ msgid "Next Announce"
+#~ msgstr "下次通告"
+
+#~ msgid "Reannounce"
+#~ msgstr "å†æ¬¡é€šå‘Š"
+
+#~ msgid "Disabled"
+#~ msgstr "å·²ç¦ç”¨"
+
+#~ msgid "Queue Position"
+#~ msgstr "队列ä½ç½®"
+
+#~ msgid "Remove"
+#~ msgstr "删除"
+
+#~ msgid "Clear"
+#~ msgstr "清除"
+
+#~ msgid "File"
+#~ msgstr "文件"
+
+#~ msgid "Save"
+#~ msgstr "ä¿å­˜"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "最大上传速度"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "最大下载速度"
+
+#~ msgid "Download Location"
+#~ msgstr "下载目录"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "ç§å­é€‰æ‹©ä¸­æœ‰é”™ã€‚"
+
+#~ msgid "No data"
+#~ msgstr "æ— æ•°æ®"
+
+#~ msgid "Ports"
+#~ msgstr "端å£"
+
+#~ msgid "To"
+#~ msgstr "到"
+
+#~ msgid "Random"
+#~ msgstr "éšæœº"
+
+#~ msgid "Active time"
+#~ msgstr "活动时间"
+
+#~ msgid "Admin"
+#~ msgstr "管ç†å‘˜"
+
+#~ msgid "Connect to Daemon"
+#~ msgstr "连接到守护程åº"
+
+#~ msgid "Connect"
+#~ msgstr "连接"
+
+#~ msgid "Connected to"
+#~ msgstr "连接到"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge 登录"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "关键è¯è¿‡æ»¤"
+
+#~ msgid "Keyword"
+#~ msgstr "关键è¯"
+
+#~ msgid "Move torrent"
+#~ msgstr "移动ç§å­"
+
+#~ msgid "Move"
+#~ msgstr "移动"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "没有连接到守护程åº"
+
+#~ msgid "Seed rank"
+#~ msgstr "ç§å­æŽ’åº"
+
+#~ msgid "Seeding time"
+#~ msgstr "åšç§æ—¶é—´"
+
+#~ msgid "Update"
+#~ msgstr "æ›´æ–°"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "最大上传通é“"
+
+#~ msgid "no uri"
+#~ msgstr "缺少 uri"
+
+#~ msgid "Forced"
+#~ msgstr "强制"
+
+#~ msgid "Encryption"
+#~ msgstr "加密"
+
+#~ msgid "Handshake"
+#~ msgstr "æ¡æ‰‹"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "存储所有下载到"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "最大åŠå¼€è¿žæŽ¥æ•°"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "最大上传速度(Kb/s)"
+
+#~ msgid "Global"
+#~ msgstr "全局"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "自动添加文件夹"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "改å˜è¿™äº›è®¾ç½®åŽé‡å¯å®ˆæŠ¤ç¨‹åºå’Œwebui"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = æ— é™åˆ¶"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "å…许æ’件"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "新密ç ä¸Žç¡®è®¤æ–°å¯†ç ä¸åŒ¹é…"
+
+#~ msgid "Move To"
+#~ msgstr "移至"
+
+#~ msgid "These changes were saved"
+#~ msgstr "更改已ä¿å­˜"
+
+#~ msgid "Current Password"
+#~ msgstr "当å‰å¯†ç "
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "确认新密ç "
+
+#~ msgid "Old password is invalid"
+#~ msgstr "旧密ç æ— æ•ˆ"
+
+#~ msgid "∞"
+#~ msgstr "æ— é™å¤§"
+
+#~ msgid "Yes"
+#~ msgstr "是"
+
+#~ msgid "No"
+#~ msgstr "å¦"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "到达此分享率时åœæ­¢åšç§"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "更改上述错误并é‡è¯•"
+
+#~ msgid "This field is required."
+#~ msgstr "此字段是必填的。"
+
+#~ msgid "Statistics"
+#~ msgstr "统计信æ¯"
+
+#~ msgid "Delete"
+#~ msgstr "删除"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "队列尾"
+
+#~ msgid "Queue Top"
+#~ msgstr "队列首"
+
+#~ msgid "Recheck"
+#~ msgstr "é‡æ–°æ£€æŸ¥"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "包括 %i 个文件"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "此文件夹ä¸å­˜åœ¨ã€‚"
+
+#~ msgid "Stop"
+#~ msgstr "åœæ­¢"
+
+#~ msgid "UpNP"
+#~ msgstr "UPNP"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "首先下载文件首和文件尾"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "紧凑分é…"
+
+#~ msgid "Level"
+#~ msgstr "级别"
+
+#~ msgid "Enter a list of values."
+#~ msgstr "输入值列表"
+
+#~ msgid "Button style"
+#~ msgstr "按钮风格"
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "请选择一个有效的选项。%sä¸æ˜¯ä¸€ä¸ªå¯ç”¨çš„选项。"
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "请输入一个有效的E-mail地å€ã€‚"
+
+#~ msgid "Enter a valid time."
+#~ msgstr "请输入一个有效的时间。"
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "请输入一个有效的日期/时间。"
+
+#~ msgid "Enter a number."
+#~ msgstr "请输入一个数值。"
+
+#~ msgid "Enter a valid date."
+#~ msgstr "请输入一个有效的日期。"
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s digits in total."
+#~ msgstr "请确ä¿æ­¤å€¼åŒ…å«æœ€å¤š %s 个数字。"
+
+#~ msgid "Extra's"
+#~ msgstr "é¢å¤–çš„"
+
+#~ msgid "True"
+#~ msgstr "真"
+
+#~ msgid "Label torrent"
+#~ msgstr "标记ç§å­"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : ç§å­åˆ—表"
+
+#~ msgid "From Session"
+#~ msgstr "æ¥è‡ªSession"
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>添加任务</b></big>"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "下载了 %.2f%%"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "导入了 %s"
+
+#~ msgid "Import Now"
+#~ msgstr "ç«‹å³å¯¼å…¥"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "阻止范围: %s"
+
+#~ msgid "Refresh status"
+#~ msgstr "刷新状æ€"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "下载å°è¯•æ¬¡æ•°"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "åŽå°å¼€å§‹æ˜¯å¯¼å…¥"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "检查间隔(天)"
+
+#~ msgid "BlockList"
+#~ msgstr "阻止åå•"
+
+#~ msgid "Other.."
+#~ msgstr "其他.."
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "请输入一个有效的IPv4地砋。"
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr "请上传一个有效的图åƒã€‚刚æ‰æ‚¨ä¸Šä¼ çš„ä¸æ˜¯ä¸€ä¸ªå›¾åƒæˆ–该图åƒå·²æŸå。"
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "请输入一个有效的地å€ã€‚"
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "该地å€å¯èƒ½æ˜¯ä¸€ä¸ªå的连接。"
+
+#, python-format
+#~ msgid "Select a valid choice. %(value)s is not one of the available choices."
+#~ msgstr "请选择一个有效的选择。%(value)s ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„选择。"
+
+#~ msgid "No file was submitted."
+#~ msgstr "没有文件被递交。"
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "该递交的文件是空的。"
+
+#~ msgid "Enter a whole number."
+#~ msgstr "请输入一个完整的å·ç ã€‚"
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "请确认此值大于或等于 %s"
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "请确认此值å°äºŽæˆ–等于 %s"
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "没有文件被递交。请检查构æˆç¼–ç å½¢å¼ã€‚"
+
+#, python-format
+#~ msgid ""
+#~ "Ensure this value has at least %(min)d characters (it has %(length)d)."
+#~ msgstr "请确认此值至少有 %(min)d 字符 (总共 %(length)d)."
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr "请确认å°æ•°ç‚¹ä¹‹å‰ä¸å¤§äºŽ %s."
+
+#~ msgid "Enter a valid value."
+#~ msgstr "请输入一个有效值。"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr "请确认此值最多有 %(max)d 字符 (总共 %(length)d)."
+
+#~ msgid "Error in Path."
+#~ msgstr "错误的路径。"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr "请选择一个有效的选项。该选择ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„选项。"
+
+#, python-format
+#~ msgid "Ensure that there are no more than %s decimal places."
+#~ msgstr "请确认此值å°æ•°ä½æ²¡æœ‰å¤§äºŽ %s."
+
+#~ msgid "Cache templates"
+#~ msgstr "ä¿å­˜æ¨¡æ¿"
+
+#~ msgid "Total active seeding"
+#~ msgstr "所有正在åšç§çš„"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "达到比率时åœæ­¢åšç§"
+
+#~ msgid "Total active torrents"
+#~ msgstr "所有活动的任务"
+
+#~ msgid "Total active downloading"
+#~ msgstr "所有正在下载的"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "达到比率时删除ç§å­"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "添加到暂åœçŠ¶æ€"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "主DHT"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "交æ¢Peer"
+
+#~ msgid "Either"
+#~ msgstr "任一"
+
+#~ msgid "Inbound"
+#~ msgstr "内部访问"
+
+#~ msgid "Outbound"
+#~ msgstr "外部访问"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = ä¸é™åˆ¶"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "最大下载速度(Kib/s)"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "ä¿å­˜.torrent文件到"
+
+#~ msgid "Per Torrent"
+#~ msgstr "æ¯ä¸ªä»»åŠ¡"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "æ¯ç§’最大连接å°è¯•æ¬¡æ•°"
+
+#~ msgid "General"
+#~ msgstr "常规"
+
+#~ msgid "Torrent is past stop ratio."
+#~ msgstr "任务超出共享率已åœæ­¢"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "本程åºä¸ºè‡ªç”±è½¯ä»¶ï¼›æ‚¨å¯ä¾æ®è‡ªç”±è½¯ä»¶åŸºé‡‘会所å‘表的GNU通用公共授æƒæ¡æ¬¾ï¼Œå¯¹æœ¬ç¨‹åºå†æ¬¡å‘布和/或修改;无论您ä¾æ®çš„是本授æƒçš„第三版,或(您å¯é€‰çš„)任一日åŽå‘"
+#~ "行的版本。本程åºæ˜¯åŸºäºŽä½¿ç”¨ç›®çš„而加以å‘布,然而ä¸è´Ÿä»»ä½•æ‹…ä¿è´£ä»»ï¼›äº¦æ— å¯¹é€‚售性或特定目的适用性所为的默示性担ä¿ã€‚详情请å‚ç…§GNU通用公共授æƒã€‚您应已收到附éš"
+#~ "于本程åºçš„GNU通用公共授æƒçš„副本;如果没有,请å‚ç…§<http://www.gnu.org/licenses/>."
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "超时(秒)"
+
+#~ msgid "Inactive"
+#~ msgstr "ä¸æ´»åŠ¨çš„"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-connect"
+
+#~ msgid "page 8"
+#~ msgstr "page 8"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "Homepage"
+#~ msgstr "主页"
+
+#~ msgid "FAQ"
+#~ msgstr "常è§é—®é¢˜"
+
+#~ msgid "Community"
+#~ msgstr "社区"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "自动添加已å¯ç”¨"
+
+#~ msgid "page 6"
+#~ msgstr "第6页"
+
+#~ msgid "page 7"
+#~ msgstr "第7页"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "自动刷新(秒)"
+
+#~ msgid "Rate Limit IP Overhead"
+#~ msgstr "é™åˆ¶IP开销的æµé‡"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 11"
+#~ msgstr "第11页"
+
+#~ msgid "page 10"
+#~ msgstr "第10页"
+
+#~ msgid "page 12"
+#~ msgstr "第12页"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "什么都没åš\n"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "最大上传通é“"
+
+#~ msgid "max_download_speed"
+#~ msgstr "最大下载速度"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "最大上传速度"
+
+#~ msgid "apply_max"
+#~ msgstr "应用最大值"
+
+#~ msgid "Error setting label options"
+#~ msgstr "设置标签选项出错"
+
+#~ msgid "max_connections"
+#~ msgstr "最大连接数"
+
+#~ msgid "apply_queue"
+#~ msgstr "应用队列"
+
+#~ msgid "is_auto_managed"
+#~ msgstr "自动管ç†"
+
+#~ msgid "stop_at_ratio"
+#~ msgstr "到达分享率åœæ­¢"
+
+#~ msgid "stop_ratio"
+#~ msgstr "到达分享率åœæ­¢"
+
+#~ msgid "remove_at_ratio"
+#~ msgstr "到达分享率删除"
+
+#~ msgid "auto_add"
+#~ msgstr "自动添加"
+
+#~ msgid "move_completed"
+#~ msgstr "完æˆåŽç§»åŠ¨"
+
+#~ msgid "move_completed_path"
+#~ msgstr "移动完整路径"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "自动添加Tracker"
+
+#~ msgid "Work in progress.."
+#~ msgstr "进行中"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "è¿™å°é‚®ä»¶å‘ŠçŸ¥ä½ Delugeå·²ç»å®Œæˆ%s的下载,包括%i个文件。\n"
+#~ "è¦åœæ­¢æŽ¥æ”¶æ­¤ç±»æ示,请在Deluge的选项中关闭邮件æ示。\n"
+#~ "\n"
+#~ "谢谢,\n"
+#~ "Deluge"
+
+#~ msgid "no label"
+#~ msgstr "无标签"
+
+#~ msgid "State"
+#~ msgstr "状æ€"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "手动é‡å¯webç•Œé¢æ¥åº”用改å˜"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "在‘%s’里没有å‘现钥匙"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "在‘%s’里没有å‘现认è¯"
+
+#~ msgid "Show trackers"
+#~ msgstr "显示Tracker"
+
+#~ msgid "Show keyword search"
+#~ msgstr "显示æœç´¢å…³é”®å­—"
+
+#~ msgid "Show sidebar"
+#~ msgstr "显示侧边æ "
+
+#~ msgid "Show zero hits"
+#~ msgstr "显示值为0项"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "...并且删除ç§å­æ–‡ä»¶"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "...并且删除所有下载文件"
+
+#~ msgid "... and delete All files"
+#~ msgstr "...并且删除所有文件"
+
+#~ msgid "Sidebar"
+#~ msgstr "侧边æ "
+
+#~ msgid "Do not download"
+#~ msgstr "ä¸ä¸‹è½½"
+
+#~ msgid "Cancel"
+#~ msgstr "å–消"
+
+#~ msgid "Connection Limit"
+#~ msgstr "连接é™åˆ¶"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "下载/上传速度é™åˆ¶"
+
+#~ msgid "Disk Space"
+#~ msgstr "ç£ç›˜ç©ºé—´"
+
+#~ msgid "Force Recheck"
+#~ msgstr "强制é‡æ–°æ£€æŸ¥"
+
+#~ msgid "False"
+#~ msgstr "å‡"
+
+#~ msgid "Normal priority"
+#~ msgstr "普通优先级"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "没有外部连入连接"
+
+#~ msgid "High priority"
+#~ msgstr "高优先级"
+
+#~ msgid "From Url"
+#~ msgstr "æ¥è‡ªé“¾æŽ¥"
+
+#~ msgid "Highest priority"
+#~ msgstr "最高优先级"
+
+#~ msgid "Ok"
+#~ msgstr "确定"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "上传通é“é™åˆ¶"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "上传速度é™åˆ¶"
+
+#~ msgid "Search"
+#~ msgstr "æœç´¢"
+
+#~ msgid "Restart"
+#~ msgstr "é‡æ–°å¯åŠ¨"
+
+#~ msgid "apply_move_completed"
+#~ msgstr "应用完æˆåŽç§»åŠ¨"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#~ msgid "HTTP W/ Auth"
+#~ msgstr "带认è¯çš„HTTP"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socks5"
+
+#~ msgid "Socksv5 W/ Auth"
+#~ msgstr "带认è¯çš„Socks5"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socks4"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s ä¸æ˜¯åˆæ³•çš„ URL。"
+
+#~ msgid "Downloading.."
+#~ msgstr "下载中..."
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>输入密ç ç»§ç»­</i>"
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge 首密ç ä¿æŠ¤</big></b>"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "未连接.."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "下载失败:%s"
diff --git a/deluge/i18n/zh_HK.po b/deluge/i18n/zh_HK.po
new file mode 100644
index 0000000..1ac2118
--- /dev/null
+++ b/deluge/i18n/zh_HK.po
@@ -0,0 +1,3754 @@
+# Chinese (Hong Kong) translation for deluge
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: deluge\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2008-09-24 15:38+0000\n"
+"Last-Translator: hoball <Unknown>\n"
+"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr ""
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr ""
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr ""
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr ""
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr ""
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr ""
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr ""
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "標籤"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr ""
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr ""
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr ""
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr ""
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr ""
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr ""
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr ""
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr ""
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr ""
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "警告"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "錯誤"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr ""
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr ""
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr ""
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr ""
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr ""
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr ""
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr ""
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr ""
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr ""
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr ""
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr ""
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr ""
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr ""
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr ""
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr ""
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr ""
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr ""
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr ""
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr ""
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr ""
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr ""
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr ""
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr ""
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr ""
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr ""
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr ""
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr ""
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr ""
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr ""
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr ""
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr ""
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr ""
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr ""
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr ""
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr ""
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr ""
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr ""
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr ""
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr ""
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr ""
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr ""
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr ""
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr ""
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr ""
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr ""
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr ""
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr ""
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr ""
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr ""
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr ""
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr ""
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr ""
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr ""
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr ""
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr ""
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr ""
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr ""
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr ""
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr ""
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr ""
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr ""
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr ""
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr ""
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr ""
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr ""
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr ""
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr ""
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr ""
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr ""
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr ""
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr ""
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr ""
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr ""
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr ""
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr ""
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr ""
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr ""
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr ""
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr ""
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr ""
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr ""
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr ""
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr ""
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr ""
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr ""
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr ""
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr ""
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr ""
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr ""
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr ""
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr ""
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr ""
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr ""
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr ""
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr ""
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr ""
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr ""
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr ""
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr ""
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr ""
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr ""
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr ""
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr ""
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr ""
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr ""
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr ""
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr ""
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr ""
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr ""
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr ""
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr ""
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr ""
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr ""
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr ""
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr ""
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr ""
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr ""
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr ""
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr ""
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr ""
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr ""
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr ""
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr ""
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr ""
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr ""
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr ""
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr ""
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr ""
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr ""
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr ""
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr ""
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr ""
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr ""
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr ""
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr ""
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr ""
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr ""
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr ""
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr ""
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr ""
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr ""
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr ""
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr ""
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr ""
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr ""
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr ""
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr ""
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr ""
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr ""
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr ""
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr ""
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr ""
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr ""
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr ""
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr ""
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr ""
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr ""
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr ""
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr ""
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr ""
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr ""
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr ""
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr ""
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr ""
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr ""
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr ""
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr ""
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr ""
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr ""
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr ""
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr ""
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr ""
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr ""
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr ""
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr ""
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr ""
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr ""
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr ""
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr ""
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr ""
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr ""
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr ""
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr ""
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr ""
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr ""
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr ""
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr ""
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr ""
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr ""
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr ""
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr ""
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr ""
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr ""
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr ""
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr ""
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr ""
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr ""
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr ""
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr ""
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr ""
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr ""
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr ""
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr ""
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr ""
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr ""
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "網å€"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "用戶端"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr ""
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr ""
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr ""
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr ""
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr ""
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr ""
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "連線"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr ""
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr ""
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr ""
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr ""
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr ""
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "å稱"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "已下載"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr ""
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "啟用"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr ""
+
+#~ msgid "About"
+#~ msgstr "關於"
+
+#~ msgid "Clear"
+#~ msgstr "清除"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "自動更新"
+
+#~ msgid "Connect"
+#~ msgstr "連線"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "刪除已下載的檔案"
+
+#~ msgid "Config"
+#~ msgstr "設定"
+
+#~ msgid "File"
+#~ msgstr "檔案"
+
+#~ msgid "Download"
+#~ msgstr "下載"
+
+#~ msgid "Disable"
+#~ msgstr "åœç”¨"
+
+#~ msgid "Move"
+#~ msgstr "移動"
+
+#~ msgid "General"
+#~ msgstr "一般"
+
+#~ msgid "Keyword"
+#~ msgstr "é—œéµå­—"
+
+#~ msgid "Login"
+#~ msgstr "登入"
+
+#~ msgid "Logout"
+#~ msgstr "登出"
diff --git a/deluge/i18n/zh_TW.po b/deluge/i18n/zh_TW.po
new file mode 100644
index 0000000..94a8a75
--- /dev/null
+++ b/deluge/i18n/zh_TW.po
@@ -0,0 +1,4603 @@
+# Chinese (Taiwan) translation for deluge
+# Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006
+# This file is distributed under the same license as the deluge package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Deluge VERSION\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-07-10 16:58+0100\n"
+"PO-Revision-Date: 2011-06-25 15:03+0000\n"
+"Last-Translator: Pin-hsien Li <pspeter9931@gmail.com>\n"
+"Language-Team: Jose Sun <josesun@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-07-11 13:01+0000\n"
+"X-Generator: Launchpad (build 13388)\n"
+"X-Poedit-Country: Taiwan\n"
+"X-Poedit-Language: Chinese\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: deluge/plugins/blocklist/blocklist/gtkui.py:67
+#: deluge/plugins/blocklist/blocklist/gtkui.py:155
+#: deluge/plugins/blocklist/blocklist/gtkui.py:186
+msgid "Blocklist"
+msgstr "黑åå–®"
+
+#: deluge/common.py:274
+msgid "KiB"
+msgstr "KiB"
+
+#: deluge/common.py:277
+msgid "MiB"
+msgstr "MiB"
+
+#: deluge/common.py:279
+msgid "GiB"
+msgstr "GiB"
+
+#: deluge/common.py:315
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:638
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:652
+#: deluge/plugins/label/label/data/label_options.glade:132
+#: deluge/plugins/label/label/data/label_options.glade:195
+#: deluge/ui/gtkui/systemtray.py:251 deluge/ui/gtkui/systemtray.py:255
+#: deluge/ui/gtkui/systemtray.py:271 deluge/ui/gtkui/systemtray.py:277
+#: deluge/ui/gtkui/systemtray.py:422 deluge/ui/gtkui/systemtray.py:427
+#: deluge/ui/gtkui/statusbar.py:363 deluge/ui/gtkui/statusbar.py:373
+#: deluge/ui/gtkui/statusbar.py:378 deluge/ui/gtkui/statusbar.py:390
+#: deluge/ui/gtkui/statusbar.py:401 deluge/ui/gtkui/statusbar.py:418
+#: deluge/ui/gtkui/statusbar.py:429 deluge/ui/gtkui/status_tab.py:62
+#: deluge/ui/gtkui/menubar.py:436 deluge/ui/gtkui/menubar.py:437
+#: deluge/ui/gtkui/glade/main_window.glade:1834
+#: deluge/ui/gtkui/glade/main_window.glade:1846
+#: deluge/ui/console/statusbars.py:96 deluge/ui/console/statusbars.py:101
+msgid "KiB/s"
+msgstr "KiB/秒"
+
+#: deluge/common.py:318
+msgid "MiB/s"
+msgstr ""
+
+#: deluge/common.py:320
+msgid "GiB/s"
+msgstr ""
+
+#: deluge/plugins/notifications/notifications/gtkui.py:178
+msgid "Notification Blink shown"
+msgstr "顯示閃çˆé€šçŸ¥"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:183
+msgid "Popup notification is not enabled."
+msgstr "彈出通知未被啟用。"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:185
+msgid "pynotify is not installed"
+msgstr "pynotify 未被安è£"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:193
+msgid "pynotify failed to show notification"
+msgstr "pynotify 顯示通知失敗"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:196
+msgid "Notification popup shown"
+msgstr "顯示通知彈出視窗"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:200
+msgid "Sound notification not enabled"
+msgstr "音效通知未被啟用"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:202
+msgid "pygame is not installed"
+msgstr "pygame 未被安è£"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:214
+#, python-format
+msgid "Sound notification failed %s"
+msgstr "音效通知失敗 %s"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:218
+msgid "Sound notification Success"
+msgstr "音效通知æˆåŠŸ"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:241
+msgid "Finished Torrent"
+msgstr "種å­å·²å®Œæˆ"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:242
+#, python-format
+msgid ""
+"The torrent \"%(name)s\" including %(num_files)i has finished downloading."
+msgstr "種å­ã€Œ%(name)sã€(å…§å« %(num_files)i 項檔案) 已經完æˆä¸‹è¼‰ã€‚"
+
+#: deluge/plugins/notifications/notifications/gtkui.py:646
+msgid "Choose Sound File"
+msgstr "é¸æ“‡è²éŸ³æª”案"
+
+#: deluge/plugins/notifications/notifications/core.py:138
+#: deluge/plugins/notifications/notifications/core.py:171
+#, python-format
+msgid "There was an error sending the notification email: %s"
+msgstr "在發é€é€šçŸ¥éƒµä»¶æ™‚發生錯誤:%s"
+
+#: deluge/plugins/notifications/notifications/core.py:157
+#, python-format
+msgid "The server didn't reply properly to the helo greeting: %s"
+msgstr "伺æœå™¨å°å•å€™æ²’有正常回應:%s"
+
+#: deluge/plugins/notifications/notifications/core.py:162
+#, python-format
+msgid "The server didn't accept the username/password combination: %s"
+msgstr "伺æœå™¨ä¸æŽ¥å—該帳號/密碼組åˆï¼š%s"
+
+#: deluge/plugins/notifications/notifications/core.py:186
+msgid "Notification email sent."
+msgstr "通知郵件已é€å‡ºã€‚"
+
+#: deluge/plugins/notifications/notifications/core.py:194
+#, python-format
+msgid "Finished Torrent \"%(name)s\""
+msgstr "完æˆç¨®å­ã€Œ%(name)sã€"
+
+#: deluge/plugins/notifications/notifications/core.py:196
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading "
+"\"%(name)s\", which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email notification in "
+"Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge."
+msgstr ""
+"這å°é›»å­éƒµä»¶æ˜¯ä¾†æ醒您,Deluge 已經完æˆä¸‹è¼‰ã€Œ%(name)sã€ï¼Œå…¶ä¸­åŒ…å«äº† %(num_files)i 項檔案。\n"
+"è‹¥è¦åœæ­¢æŽ¥æ”¶é€™é¡žæ醒,請在 Deluge çš„å好設定內關閉電郵通知。\n"
+"\n"
+"è¬è¬æ‚¨ï¼Œ\n"
+"Deluge"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:29
+msgid "<b><i><big>Notifications</big></i></b>"
+msgstr "<b><i><big>通知</big></i></b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:81
+msgid "Tray icon blinks enabled"
+msgstr "啟用系統列圖示閃çˆ"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:93
+msgid "Popups enabled"
+msgstr "啟用彈出視窗"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:108
+msgid "Sound enabled"
+msgstr "啟用音效"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:144
+msgid "<b>UI Notifications</b>"
+msgstr "<b>使用者介é¢é€šçŸ¥</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:175
+#: deluge/ui/gtkui/glade/connection_manager.glade:28
+msgid "Hostname:"
+msgstr "主機å稱:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:199
+#: deluge/ui/gtkui/glade/connection_manager.glade:56
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3358
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3542
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3726
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3912
+msgid "Port:"
+msgstr "連接埠:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:231
+#: deluge/ui/gtkui/glade/connection_manager.glade:143
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3439
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3623
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3807
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3994
+msgid "Username:"
+msgstr "帳號:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:255
+#: deluge/ui/gtkui/glade/connection_manager.glade:132
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2129
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3306
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3490
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3674
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3858
+msgid "Password:"
+msgstr "密碼:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:360
+msgid "<b>Recipients</b>"
+msgstr "<b>收件人</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:383
+msgid "Server requires TLS/SSL"
+msgstr "伺æœå™¨éœ€è¦ TLS/SSL"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:398
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:633
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:783
+msgid "From:"
+msgstr "從:"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:421
+#: deluge/ui/gtkui/preferences.py:91
+msgid "Enabled"
+msgstr "已啟用"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:443
+msgid "<b>Email Notifications</b>"
+msgstr "<b>電郵通知</b>"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:460
+msgid "Settings"
+msgstr "設定"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:495
+msgid ""
+"This configuration does not mean that you'll actually receive notifications "
+"for all these events."
+msgstr "這個設定ä¸ä»£è¡¨æ‚¨å¯¦éš›ä¸Šå¯æŽ¥å—到所有這些事件的通知。"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:513
+msgid "Subscriptions"
+msgstr "訂閱"
+
+#: deluge/plugins/notifications/notifications/data/config.glade:594
+msgid "Sound Customization"
+msgstr "音效自訂"
+
+#: deluge/plugins/autoadd/autoadd/core.py:136
+msgid "Watch folder does not exist."
+msgstr "監控資料夾ä¸å­˜åœ¨ã€‚"
+
+#: deluge/plugins/autoadd/autoadd/core.py:139
+#: deluge/plugins/autoadd/autoadd/core.py:308
+msgid "Path does not exist."
+msgstr "路徑ä¸å­˜åœ¨ã€‚"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:7
+msgid "AutoAdd Error"
+msgstr "AutoAdd 錯誤"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:78
+msgid "Watch Folder Properties"
+msgstr "監控資料夾屬性"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:130
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:306
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:384
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:41
+#: deluge/ui/gtkui/glade/main_window.glade:2031
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:373
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:162
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:228
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:288
+msgid "Select A Folder"
+msgstr "é¸æ“‡ä¸€å€‹è³‡æ–™å¤¾"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:143
+msgid "Enable this watch folder"
+msgstr "啟用此監控資料夾"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:164
+msgid "<b>Watch Folder</b>"
+msgstr "<b>監控資料夾</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:195
+msgid "Delete .torrent after adding"
+msgstr "加入後刪除種å­æª”"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:211
+msgid "Append extension after adding:"
+msgstr "加入後附上副檔å:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:228
+msgid ".added"
+msgstr ".added"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:248
+msgid "<b>Torrent File Action</b>"
+msgstr "<b>種å­æª”案動作</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:275
+msgid "Set download location"
+msgstr "設定下載ä½ç½®"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:325
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:396
+msgid "<b>Download Location</b>"
+msgstr "<b>下載ä½ç½®</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:353
+msgid "Set move completed location"
+msgstr "設定檔案下載完後的移動ä½ç½®"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:418
+msgid "<b>Move Completed</b>"
+msgstr "<b>移動完整檔</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:444
+msgid "Label: "
+msgstr "標籤: "
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:475
+msgid "<b>Label</b>"
+msgstr "<b>標籤</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:492
+msgid "Main"
+msgstr "主è¦"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:524
+#: deluge/ui/gtkui/glade/main_window.glade:1811
+msgid "Max Upload Speed:"
+msgstr "最高上傳速度:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:541
+#: deluge/ui/gtkui/glade/main_window.glade:1798
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:551
+msgid "Max Connections:"
+msgstr "最大連接數目:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:558
+#: deluge/ui/gtkui/glade/main_window.glade:1861
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:565
+msgid "Max Upload Slots:"
+msgstr "最大上傳連接數é‡ï¼š"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:665
+#: deluge/ui/gtkui/glade/main_window.glade:1824
+msgid "Max Download Speed:"
+msgstr "最高下載速度:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:691
+#: deluge/ui/gtkui/glade/main_window.glade:1900
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:634
+msgid "<b>Bandwidth</b>"
+msgstr "<b>æµé‡</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:722
+#: deluge/plugins/label/label/data/label_options.glade:349
+#: deluge/ui/gtkui/glade/main_window.glade:1952
+msgid "Stop seed at ratio:"
+msgstr "é”到指定的分享率時åœæ­¢ç¨®å­ï¼š"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:746
+#: deluge/plugins/label/label/data/label_options.glade:364
+#: deluge/ui/gtkui/glade/main_window.glade:1993
+msgid "Remove at ratio"
+msgstr "é”到分享率時刪除"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:762
+msgid "Auto Managed:"
+msgstr "自動管ç†ï¼š"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:890
+msgid "Add Paused:"
+msgstr "加入暫åœï¼š"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:936
+msgid "Queue to:"
+msgstr "佇列於:"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:954
+msgid "Top"
+msgstr "最上方"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:967
+msgid "Bottom"
+msgstr "最下方"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1017
+#: deluge/ui/gtkui/glade/main_window.glade:2069
+msgid "<b>Queue</b>"
+msgstr "<b>佇列</b>"
+
+#: deluge/plugins/autoadd/autoadd/data/autoadd_options.glade:1037
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:624
+#: deluge/ui/gtkui/glade/connection_manager.glade:457
+msgid "Options"
+msgstr "é¸é …"
+
+#: deluge/plugins/autoadd/autoadd/data/config.glade:41
+msgid "<b>Watch Folders:</b>"
+msgstr "<b>監控資料夾:</b>"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:238
+msgid "Download Limit:"
+msgstr "下載é™åˆ¶ï¼š"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:247
+msgid "Upload Limit:"
+msgstr "上傳é™åˆ¶ï¼š"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:256
+msgid "Active Torrents:"
+msgstr "æ´»èºçš„種å­æ•¸ï¼š"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:265
+msgid "Active Downloading:"
+msgstr "æ´»èºçš„下載數:"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:274
+msgid "Active Seeding:"
+msgstr "æ´»èºçš„åšç¨®æ•¸ï¼š"
+
+#: deluge/plugins/scheduler/scheduler/gtkui.py:288
+msgid "<b>Slow Settings</b>"
+msgstr "<b>慢速設定</b>"
+
+#: deluge/plugins/label/label/core.py:189
+msgid "Invalid label, valid characters:[a-z0-9_-]"
+msgstr "無效的標籤,有效字元:[a-z0-9_-]"
+
+#: deluge/plugins/label/label/core.py:190
+msgid "Empty Label"
+msgstr "空白的標籤"
+
+#: deluge/plugins/label/label/core.py:191
+msgid "Label already exists"
+msgstr "標籤已存在"
+
+#: deluge/plugins/label/label/core.py:199
+#: deluge/plugins/label/label/core.py:279
+#: deluge/plugins/label/label/core.py:314
+msgid "Unknown Label"
+msgstr "ä¸æ˜Žçš„標籤"
+
+#: deluge/plugins/label/label/core.py:315
+msgid "Unknown Torrent"
+msgstr "ä¸æ˜Žçš„種å­"
+
+#: deluge/plugins/label/label/gtkui/submenu.py:48
+#: deluge/plugins/label/label/gtkui/__init__.py:77
+#: deluge/plugins/label/label/gtkui/__init__.py:111
+#: deluge/plugins/label/label/gtkui/label_config.py:59
+#: deluge/plugins/label/label/gtkui/label_config.py:66
+msgid "Label"
+msgstr "標籤"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:66
+msgid "Label _Options"
+msgstr "標籤é¸é …(_O)"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:67
+msgid "_Remove Label"
+msgstr "刪除標籤(_R)"
+
+#: deluge/plugins/label/label/gtkui/sidebar_menu.py:68
+msgid "_Add Label"
+msgstr "新增標籤(_A)"
+
+#: deluge/plugins/label/label/data/label_options.glade:7
+msgid "Label Options"
+msgstr "標籤é¸é …"
+
+#: deluge/plugins/label/label/data/label_options.glade:36
+msgid "<b>Label Options</b>"
+msgstr "<b>標籤é¸é …</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:158
+msgid "Upload Slots:\t"
+msgstr "上傳槽:\t"
+
+#: deluge/plugins/label/label/data/label_options.glade:171
+msgid "Upload Speed:"
+msgstr "上傳速度:"
+
+#: deluge/plugins/label/label/data/label_options.glade:184
+msgid "Download Speed:"
+msgstr "下載速度:"
+
+#: deluge/plugins/label/label/data/label_options.glade:226
+msgid "Connections:"
+msgstr "連接數:"
+
+#: deluge/plugins/label/label/data/label_options.glade:270
+msgid "Apply per torrent max settings:"
+msgstr "æ¯å€‹ç¨®å­å¥—用最大值:"
+
+#: deluge/plugins/label/label/data/label_options.glade:283
+msgid "Maximum"
+msgstr "最大值"
+
+#: deluge/plugins/label/label/data/label_options.glade:336
+#: deluge/ui/gtkui/glade/main_window.glade:1930
+msgid "Auto Managed"
+msgstr "自動管ç†"
+
+#: deluge/plugins/label/label/data/label_options.glade:410
+msgid "Apply Queue settings:"
+msgstr "套用佇列設定:"
+
+#: deluge/plugins/label/label/data/label_options.glade:426
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Queue"
+msgstr "佇列"
+
+#: deluge/plugins/label/label/data/label_options.glade:453
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:204
+msgid "Move completed to:"
+msgstr "將完æˆçš„下載移至:"
+
+#: deluge/plugins/label/label/data/label_options.glade:504
+msgid "Apply location settings:"
+msgstr "套用ä½ç½®è¨­å®šï¼š"
+
+#: deluge/plugins/label/label/data/label_options.glade:520
+msgid "Location"
+msgstr "ä½ç½®"
+
+#: deluge/plugins/label/label/data/label_options.glade:560
+msgid "<i>(1 line per tracker)</i>"
+msgstr "<i>(æ¯å€‹è¿½è¹¤ä¼ºæœå™¨ä¸€è¡Œ)</i>"
+
+#: deluge/plugins/label/label/data/label_options.glade:576
+msgid "Automatically apply label:"
+msgstr "自動套用標籤:"
+
+#: deluge/plugins/label/label/data/label_options.glade:593
+#: deluge/ui/gtkui/filtertreeview.py:70
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:462
+msgid "Trackers"
+msgstr "追蹤伺æœå™¨"
+
+#: deluge/plugins/label/label/data/label_options.glade:646
+msgid "Add Label"
+msgstr "加入標籤"
+
+#: deluge/plugins/label/label/data/label_options.glade:680
+msgid "<b>Add Label</b>"
+msgstr "<b>加入標籤</b>"
+
+#: deluge/plugins/label/label/data/label_options.glade:711
+msgid "Name:"
+msgstr "å稱:"
+
+#: deluge/plugins/label/label/data/label_pref.glade:22
+msgid "<i>Use the sidebar to add,edit and remove labels. </i>\n"
+msgstr "<i>使用å´é‚Šæ¬„來新增ã€ä¿®æ”¹èˆ‡åˆªé™¤æ¨™ç±¤ã€‚</i>\n"
+
+#: deluge/plugins/label/label/data/label_pref.glade:32
+msgid "<b>Labels</b>"
+msgstr "<b>標籤</b>"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:27
+msgid "Extract to:"
+msgstr "解壓縮到:"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:69
+msgid "Create torrent name sub-folder"
+msgstr "以種å­å稱建立å­è³‡æ–™å¤¾"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:73
+msgid ""
+"This option will create a sub-folder using the torrent's name within the "
+"selected extract folder and put the extracted files there."
+msgstr "這個é¸é …將會以種å­å稱建立å­è³‡æ–™å¤¾ï¼Œä¹‹å¾Œå°‡æª”案解壓縮到那裡。"
+
+#: deluge/plugins/extractor/extractor/data/extractor_prefs.glade:87
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:53
+#: deluge/ui/gtkui/glade/main_window.glade:2183
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:705
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2847
+msgid "<b>General</b>"
+msgstr "<b>一般</b>"
+
+#: deluge/plugins/webui/webui/gtkui.py:97
+msgid ""
+"The Deluge web interface is not installed, please install the\n"
+"interface and try again"
+msgstr ""
+"Deluge 網é ä»‹é¢å°šæœªè¢«å®‰è£ï¼Œè«‹å…ˆå®‰è£å¥½\n"
+"介é¢å†é‡è©¦ä¸€æ¬¡"
+
+#: deluge/plugins/webui/webui/data/config.glade:27
+msgid "Enable web interface"
+msgstr "啟動網é ç®¡ç†ä»‹é¢"
+
+#: deluge/plugins/webui/webui/data/config.glade:41
+msgid "Enable SSL"
+msgstr "å•Ÿå‹• SSL"
+
+#: deluge/plugins/webui/webui/data/config.glade:60
+msgid "Listening port:"
+msgstr "監è½é€£æŽ¥åŸ ï¼š"
+
+#: deluge/plugins/webui/webui/data/config.glade:94
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:153
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4173
+msgid "<b>Settings</b>"
+msgstr "<b>設定</b>"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:49
+msgid "Emule IP list (GZip)"
+msgstr "Emule IP 列表 (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:50
+msgid "SafePeer Text (Zipped)"
+msgstr "SafePeer 文字檔 (已壓縮)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:51
+msgid "PeerGuardian Text (Uncompressed)"
+msgstr "PeerGuardian 文字檔 (未壓縮)"
+
+#: deluge/plugins/blocklist/blocklist/webui.py:52
+msgid "PeerGuardian P2B (GZip)"
+msgstr "PeerGuardian P2B (GZip)"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:31
+msgid "Invalid leader"
+msgstr "無效的 Leader"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:35
+msgid "Invalid magic code"
+msgstr "無效的 Magic Code"
+
+#: deluge/plugins/blocklist/blocklist/peerguardian.py:40
+msgid "Invalid version"
+msgstr "無效的版本"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:27
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:385
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1018
+msgid "URL:"
+msgstr "URL:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:91
+msgid "Days"
+msgstr "æ—¥"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:117
+msgid "Check for new list every:"
+msgstr "確èªæ–°æ¸…å–® æ¯"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:133
+msgid "Import blocklist on startup"
+msgstr "啟動時匯入阻擋清單"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:190
+msgid "Download the blocklist file if necessary and import the file."
+msgstr "下載阻擋清單(如果需è¦)並匯入檔案。"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:210
+msgid "Check Download and Import"
+msgstr "確èªä¸‹è¼‰ä¸¦åŒ¯å…¥"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:232
+msgid "Download a new blocklist file and import it."
+msgstr "下載新的阻擋清單並匯入檔案。"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:252
+msgid "Force Download and Import"
+msgstr "強制下載並匯入"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:276
+msgid "Blocklist is up to date"
+msgstr "阻擋清單已更新"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:293
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:472
+msgid "<b>Options</b>"
+msgstr "<b>é¸é …</b>"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:397
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3427
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3611
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3795
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3982
+msgid "Type:"
+msgstr "類型:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:409
+msgid "Date:"
+msgstr "日期:"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:421
+msgid "File Size:"
+msgstr "檔案大å°ï¼š"
+
+#: deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4822
+msgid "<b>Info</b>"
+msgstr "<b>資訊</b>"
+
+#: deluge/plugins/execute/execute/gtkui.py:51
+msgid "Torrent Complete"
+msgstr "種å­å®Œæˆ"
+
+#: deluge/plugins/execute/execute/gtkui.py:52
+msgid "Torrent Added"
+msgstr "新增種å­"
+
+#: deluge/plugins/execute/execute/gtkui.py:77
+#: deluge/plugins/execute/execute/gtkui.py:88
+msgid "Execute"
+msgstr "執行"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:29
+msgid "Event"
+msgstr "事件"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:41
+msgid "Command"
+msgstr "指令"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:112
+msgid "<b>Add Command</b>"
+msgstr "<b>新增指令</b>"
+
+#: deluge/plugins/execute/execute/data/execute_prefs.glade:151
+msgid "<b>Commands</b>"
+msgstr "<b>指令</b>"
+
+#: deluge/core/torrentmanager.py:937
+msgid "Announce OK"
+msgstr "通告完æˆ"
+
+#: deluge/core/torrentmanager.py:953
+msgid "Announce Sent"
+msgstr "通告已é€å‡º"
+
+#: deluge/core/torrentmanager.py:961
+msgid "Warning"
+msgstr "警告"
+
+#: deluge/core/torrentmanager.py:971 deluge/core/filtermanager.py:94
+#: deluge/ui/gtkui/filtertreeview.py:78
+msgid "Error"
+msgstr "錯誤"
+
+#: deluge/ui/countries.py:9
+msgid "Afghanistan"
+msgstr "阿富汗"
+
+#: deluge/ui/countries.py:10
+msgid "Aland Islands"
+msgstr "奧蘭群島"
+
+#: deluge/ui/countries.py:11
+msgid "Albania"
+msgstr "阿爾巴尼亞"
+
+#: deluge/ui/countries.py:12
+msgid "Algeria"
+msgstr "阿爾åŠåˆ©äºž"
+
+#: deluge/ui/countries.py:13
+msgid "American Samoa"
+msgstr "美屬薩摩亞"
+
+#: deluge/ui/countries.py:14
+msgid "Andorra"
+msgstr "安é“爾"
+
+#: deluge/ui/countries.py:15
+msgid "Angola"
+msgstr "安哥拉"
+
+#: deluge/ui/countries.py:16
+msgid "Anguilla"
+msgstr "安圭拉"
+
+#: deluge/ui/countries.py:17
+msgid "Antarctica"
+msgstr "å—極洲"
+
+#: deluge/ui/countries.py:18
+msgid "Antigua and Barbuda"
+msgstr "安地å¡åŠå·´å¸ƒé”"
+
+#: deluge/ui/countries.py:19
+msgid "Argentina"
+msgstr "阿根廷"
+
+#: deluge/ui/countries.py:20
+msgid "Armenia"
+msgstr "亞美尼亞"
+
+#: deluge/ui/countries.py:21
+msgid "Aruba"
+msgstr "阿魯巴"
+
+#: deluge/ui/countries.py:22
+msgid "Australia"
+msgstr "澳大利亞"
+
+#: deluge/ui/countries.py:23
+msgid "Austria"
+msgstr "奧地利"
+
+#: deluge/ui/countries.py:24
+msgid "Azerbaijan"
+msgstr "亞塞拜然"
+
+#: deluge/ui/countries.py:25
+msgid "Bahamas"
+msgstr "巴哈馬"
+
+#: deluge/ui/countries.py:26
+msgid "Bahrain"
+msgstr "å·´æž—"
+
+#: deluge/ui/countries.py:27
+msgid "Bangladesh"
+msgstr "孟加拉"
+
+#: deluge/ui/countries.py:28
+msgid "Barbados"
+msgstr "å·´è²å¤š"
+
+#: deluge/ui/countries.py:29
+msgid "Belarus"
+msgstr "白俄羅斯"
+
+#: deluge/ui/countries.py:30
+msgid "Belgium"
+msgstr "比利時"
+
+#: deluge/ui/countries.py:31
+msgid "Belize"
+msgstr "è²é‡Œæ–¯"
+
+#: deluge/ui/countries.py:32
+msgid "Benin"
+msgstr "è²å—"
+
+#: deluge/ui/countries.py:33
+msgid "Bermuda"
+msgstr "百慕é”"
+
+#: deluge/ui/countries.py:34
+msgid "Bhutan"
+msgstr "ä¸ä¸¹"
+
+#: deluge/ui/countries.py:35
+msgid "Bolivia"
+msgstr "玻利維亞"
+
+#: deluge/ui/countries.py:36
+msgid "Bosnia and Herzegovina"
+msgstr "波士尼亞與赫塞哥維ç´"
+
+#: deluge/ui/countries.py:37
+msgid "Botswana"
+msgstr "åšèŒ²ç“¦ç´"
+
+#: deluge/ui/countries.py:38
+msgid "Bouvet Island"
+msgstr "布å¨å³¶"
+
+#: deluge/ui/countries.py:39
+msgid "Brazil"
+msgstr "巴西"
+
+#: deluge/ui/countries.py:40
+msgid "British Indian Ocean Territory"
+msgstr "英屬å°åº¦æ´‹é ˜åœ°"
+
+#: deluge/ui/countries.py:41
+msgid "Brunei Darussalam"
+msgstr "汶èŠ"
+
+#: deluge/ui/countries.py:42
+msgid "Bulgaria"
+msgstr "ä¿åŠ åˆ©äºž"
+
+#: deluge/ui/countries.py:43
+msgid "Burkina Faso"
+msgstr "布å‰ç´æ³•ç´¢"
+
+#: deluge/ui/countries.py:44
+msgid "Burundi"
+msgstr "蒲隆地"
+
+#: deluge/ui/countries.py:45
+msgid "Cambodia"
+msgstr "柬埔寨"
+
+#: deluge/ui/countries.py:46
+msgid "Cameroon"
+msgstr "喀麥隆"
+
+#: deluge/ui/countries.py:47
+msgid "Canada"
+msgstr "加拿大"
+
+#: deluge/ui/countries.py:48
+msgid "Cape Verde"
+msgstr "維德角"
+
+#: deluge/ui/countries.py:49
+msgid "Cayman Islands"
+msgstr "開曼群島"
+
+#: deluge/ui/countries.py:50
+msgid "Central African Republic"
+msgstr "中éžå…±å’Œåœ‹"
+
+#: deluge/ui/countries.py:51
+msgid "Chad"
+msgstr "查德"
+
+#: deluge/ui/countries.py:52
+msgid "Chile"
+msgstr "智利"
+
+#: deluge/ui/countries.py:53
+msgid "China"
+msgstr "中國"
+
+#: deluge/ui/countries.py:54
+msgid "Christmas Island"
+msgstr "è–誕島"
+
+#: deluge/ui/countries.py:55
+msgid "Cocos (Keeling) Islands"
+msgstr "科科斯(基林)群島"
+
+#: deluge/ui/countries.py:56
+msgid "Colombia"
+msgstr "哥倫比亞"
+
+#: deluge/ui/countries.py:57
+msgid "Comoros"
+msgstr "葛摩"
+
+#: deluge/ui/countries.py:58
+msgid "Congo"
+msgstr "剛果"
+
+#: deluge/ui/countries.py:59
+msgid "Congo, The Democratic Republic of the"
+msgstr "剛果民主共和國"
+
+#: deluge/ui/countries.py:60
+msgid "Cook Islands"
+msgstr "庫克群島"
+
+#: deluge/ui/countries.py:61
+msgid "Costa Rica"
+msgstr "哥斯大黎加"
+
+#: deluge/ui/countries.py:62
+msgid "Cote d'Ivoire"
+msgstr "象牙海岸"
+
+#: deluge/ui/countries.py:63
+msgid "Croatia"
+msgstr "克羅埃西亞"
+
+#: deluge/ui/countries.py:64
+msgid "Cuba"
+msgstr "å¤å·´"
+
+#: deluge/ui/countries.py:65
+msgid "Cyprus"
+msgstr "賽普勒斯"
+
+#: deluge/ui/countries.py:66
+msgid "Czech Republic"
+msgstr "æ·å…‹"
+
+#: deluge/ui/countries.py:67
+msgid "Denmark"
+msgstr "丹麥"
+
+#: deluge/ui/countries.py:68
+msgid "Djibouti"
+msgstr "å‰å¸ƒåœ°"
+
+#: deluge/ui/countries.py:69
+msgid "Dominica"
+msgstr "多米尼克"
+
+#: deluge/ui/countries.py:70
+msgid "Dominican Republic"
+msgstr "多明尼加"
+
+#: deluge/ui/countries.py:71
+msgid "Ecuador"
+msgstr "厄瓜多"
+
+#: deluge/ui/countries.py:72
+msgid "Egypt"
+msgstr "埃åŠ"
+
+#: deluge/ui/countries.py:73
+msgid "El Salvador"
+msgstr "薩爾瓦多"
+
+#: deluge/ui/countries.py:74
+msgid "Equatorial Guinea"
+msgstr "赤é“幾內亞"
+
+#: deluge/ui/countries.py:75
+msgid "Eritrea"
+msgstr "厄利垂亞"
+
+#: deluge/ui/countries.py:76
+msgid "Estonia"
+msgstr "愛沙尼亞"
+
+#: deluge/ui/countries.py:77
+msgid "Ethiopia"
+msgstr "衣索比亞"
+
+#: deluge/ui/countries.py:78
+msgid "Falkland Islands (Malvinas)"
+msgstr "ç¦å…‹è˜­ç¾¤å³¶(馬爾維ç´æ–¯ç¾¤å³¶)"
+
+#: deluge/ui/countries.py:79
+msgid "Faroe Islands"
+msgstr "法羅群島"
+
+#: deluge/ui/countries.py:80
+msgid "Fiji"
+msgstr "æ–æ¿Ÿ"
+
+#: deluge/ui/countries.py:81
+msgid "Finland"
+msgstr "芬蘭"
+
+#: deluge/ui/countries.py:82
+msgid "France"
+msgstr "法國"
+
+#: deluge/ui/countries.py:83
+msgid "French Guiana"
+msgstr "法屬圭亞那"
+
+#: deluge/ui/countries.py:84
+msgid "French Polynesia"
+msgstr "法屬玻里尼西亞"
+
+#: deluge/ui/countries.py:85
+msgid "French Southern Territories"
+msgstr "法屬å—部領地"
+
+#: deluge/ui/countries.py:86
+msgid "Gabon"
+msgstr "加彭"
+
+#: deluge/ui/countries.py:87
+msgid "Gambia"
+msgstr "甘比亞"
+
+#: deluge/ui/countries.py:88
+msgid "Georgia"
+msgstr "喬治亞"
+
+#: deluge/ui/countries.py:89
+msgid "Germany"
+msgstr "德國"
+
+#: deluge/ui/countries.py:90 deluge/ui/countries.py:241
+msgid "United Kingdom"
+msgstr "英國"
+
+#: deluge/ui/countries.py:91
+msgid "Ghana"
+msgstr "迦ç´"
+
+#: deluge/ui/countries.py:92
+msgid "Gibraltar"
+msgstr "直布羅陀"
+
+#: deluge/ui/countries.py:93
+msgid "Greece"
+msgstr "希臘"
+
+#: deluge/ui/countries.py:94
+msgid "Greenland"
+msgstr "格陵蘭"
+
+#: deluge/ui/countries.py:95
+msgid "Grenada"
+msgstr "格瑞那é”"
+
+#: deluge/ui/countries.py:96
+msgid "Guadeloupe"
+msgstr "瓜德羅普"
+
+#: deluge/ui/countries.py:97
+msgid "Guam"
+msgstr "關島"
+
+#: deluge/ui/countries.py:98
+msgid "Guatemala"
+msgstr "瓜地馬拉"
+
+#: deluge/ui/countries.py:99
+msgid "Guernsey"
+msgstr "æ ¹æ¯å³¶"
+
+#: deluge/ui/countries.py:100
+msgid "Guinea"
+msgstr "幾內亞"
+
+#: deluge/ui/countries.py:101
+msgid "Guinea-Bissau"
+msgstr "幾內亞比索"
+
+#: deluge/ui/countries.py:102
+msgid "Guyana"
+msgstr "蓋亞那"
+
+#: deluge/ui/countries.py:103
+msgid "Haiti"
+msgstr "海地"
+
+#: deluge/ui/countries.py:104
+msgid "Heard Island and McDonald Islands"
+msgstr "赫德島和麥克å”ç´ç¾¤å³¶"
+
+#: deluge/ui/countries.py:105
+msgid "Holy See (Vatican City State)"
+msgstr "教廷 (梵蒂岡)"
+
+#: deluge/ui/countries.py:106
+msgid "Honduras"
+msgstr "å®éƒ½æ‹‰æ–¯"
+
+#: deluge/ui/countries.py:107
+msgid "Hong Kong"
+msgstr "香港"
+
+#: deluge/ui/countries.py:108
+msgid "Hungary"
+msgstr "匈牙利"
+
+#: deluge/ui/countries.py:109
+msgid "Iceland"
+msgstr "冰島"
+
+#: deluge/ui/countries.py:110
+msgid "India"
+msgstr "å°åº¦"
+
+#: deluge/ui/countries.py:111
+msgid "Indonesia"
+msgstr "å°å°¼"
+
+#: deluge/ui/countries.py:112
+msgid "Iran, Islamic Republic of"
+msgstr "伊朗"
+
+#: deluge/ui/countries.py:113
+msgid "Iraq"
+msgstr "伊拉克"
+
+#: deluge/ui/countries.py:114
+msgid "Ireland"
+msgstr "愛爾蘭"
+
+#: deluge/ui/countries.py:115
+msgid "Isle of Man"
+msgstr "曼島"
+
+#: deluge/ui/countries.py:116
+msgid "Israel"
+msgstr "以色列"
+
+#: deluge/ui/countries.py:117
+msgid "Italy"
+msgstr "義大利"
+
+#: deluge/ui/countries.py:118
+msgid "Jamaica"
+msgstr "牙買加"
+
+#: deluge/ui/countries.py:119
+msgid "Japan"
+msgstr "日本"
+
+#: deluge/ui/countries.py:120
+msgid "Jersey"
+msgstr "澤西島"
+
+#: deluge/ui/countries.py:121
+msgid "Jordan"
+msgstr "ç´„æ—¦"
+
+#: deluge/ui/countries.py:122
+msgid "Kazakhstan"
+msgstr "哈薩克"
+
+#: deluge/ui/countries.py:123
+msgid "Kenya"
+msgstr "肯亞"
+
+#: deluge/ui/countries.py:124
+msgid "Kiribati"
+msgstr "å‰é‡Œå·´æ–¯"
+
+#: deluge/ui/countries.py:125
+msgid "Korea, Democratic People's Republic of"
+msgstr "北韓"
+
+#: deluge/ui/countries.py:126
+msgid "Korea, Republic of"
+msgstr "韓國"
+
+#: deluge/ui/countries.py:127
+msgid "Kuwait"
+msgstr "科å¨ç‰¹"
+
+#: deluge/ui/countries.py:128
+msgid "Kyrgyzstan"
+msgstr "å‰çˆ¾å‰æ–¯"
+
+#: deluge/ui/countries.py:129
+msgid "Lao People's Democratic Republic"
+msgstr "寮國"
+
+#: deluge/ui/countries.py:130
+msgid "Latvia"
+msgstr "拉脫維亞"
+
+#: deluge/ui/countries.py:131
+msgid "Lebanon"
+msgstr "黎巴嫩"
+
+#: deluge/ui/countries.py:132
+msgid "Lesotho"
+msgstr "賴索托"
+
+#: deluge/ui/countries.py:133
+msgid "Liberia"
+msgstr "賴比瑞亞"
+
+#: deluge/ui/countries.py:134
+msgid "Libyan Arab Jamahiriya"
+msgstr "利比亞"
+
+#: deluge/ui/countries.py:135
+msgid "Liechtenstein"
+msgstr "列支敦斯登"
+
+#: deluge/ui/countries.py:136
+msgid "Lithuania"
+msgstr "立陶宛"
+
+#: deluge/ui/countries.py:137
+msgid "Luxembourg"
+msgstr "盧森堡"
+
+#: deluge/ui/countries.py:138
+msgid "Macao"
+msgstr "澳門"
+
+#: deluge/ui/countries.py:139
+msgid "Macedonia, The Former Yugoslav Republic of"
+msgstr "馬其頓"
+
+#: deluge/ui/countries.py:140
+msgid "Madagascar"
+msgstr "馬é”加斯加"
+
+#: deluge/ui/countries.py:141
+msgid "Malawi"
+msgstr "馬拉å¨"
+
+#: deluge/ui/countries.py:142
+msgid "Malaysia"
+msgstr "馬來西亞"
+
+#: deluge/ui/countries.py:143
+msgid "Maldives"
+msgstr "馬爾地夫"
+
+#: deluge/ui/countries.py:144
+msgid "Mali"
+msgstr "馬利"
+
+#: deluge/ui/countries.py:145
+msgid "Malta"
+msgstr "馬爾他"
+
+#: deluge/ui/countries.py:146
+msgid "Marshall Islands"
+msgstr "馬紹爾群島"
+
+#: deluge/ui/countries.py:147
+msgid "Martinique"
+msgstr "馬æ尼克"
+
+#: deluge/ui/countries.py:148
+msgid "Mauritania"
+msgstr "茅利塔尼亞"
+
+#: deluge/ui/countries.py:149
+msgid "Mauritius"
+msgstr "模里西斯"
+
+#: deluge/ui/countries.py:150
+msgid "Mayotte"
+msgstr "馬約特"
+
+#: deluge/ui/countries.py:151
+msgid "Mexico"
+msgstr "墨西哥"
+
+#: deluge/ui/countries.py:152
+msgid "Micronesia, Federated States of"
+msgstr "密克羅尼西亞è¯é‚¦"
+
+#: deluge/ui/countries.py:153
+msgid "Moldova"
+msgstr "摩爾多瓦"
+
+#: deluge/ui/countries.py:154
+msgid "Monaco"
+msgstr "æ‘©ç´å“¥"
+
+#: deluge/ui/countries.py:155
+msgid "Mongolia"
+msgstr "è’™å¤"
+
+#: deluge/ui/countries.py:156
+msgid "Montenegro"
+msgstr "蒙特內哥羅"
+
+#: deluge/ui/countries.py:157
+msgid "Montserrat"
+msgstr "蒙特塞拉特"
+
+#: deluge/ui/countries.py:158
+msgid "Morocco"
+msgstr "摩洛哥"
+
+#: deluge/ui/countries.py:159
+msgid "Mozambique"
+msgstr "莫三比克"
+
+#: deluge/ui/countries.py:160
+msgid "Myanmar"
+msgstr "緬甸"
+
+#: deluge/ui/countries.py:161
+msgid "Namibia"
+msgstr "ç´ç±³æ¯”亞"
+
+#: deluge/ui/countries.py:162
+msgid "Nauru"
+msgstr "諾魯"
+
+#: deluge/ui/countries.py:163
+msgid "Nepal"
+msgstr "尼泊爾"
+
+#: deluge/ui/countries.py:164
+msgid "Netherlands"
+msgstr "è·è˜­"
+
+#: deluge/ui/countries.py:165
+msgid "Netherlands Antilles"
+msgstr "è·å±¬å®‰åœ°åˆ—æ–¯"
+
+#: deluge/ui/countries.py:166
+msgid "New Caledonia"
+msgstr "新喀里多尼亞"
+
+#: deluge/ui/countries.py:167
+msgid "New Zealand"
+msgstr "ç´è¥¿è˜­"
+
+#: deluge/ui/countries.py:168
+msgid "Nicaragua"
+msgstr "尼加拉瓜"
+
+#: deluge/ui/countries.py:169
+msgid "Niger"
+msgstr "尼日"
+
+#: deluge/ui/countries.py:170
+msgid "Nigeria"
+msgstr "奈åŠåˆ©äºž"
+
+#: deluge/ui/countries.py:171
+msgid "Niue"
+msgstr "ç´åŸƒ"
+
+#: deluge/ui/countries.py:172
+msgid "Norfolk Island"
+msgstr "諾ç¦å…‹å³¶"
+
+#: deluge/ui/countries.py:173
+msgid "Northern Mariana Islands"
+msgstr "北馬里安ç´ç¾¤å³¶"
+
+#: deluge/ui/countries.py:174
+msgid "Norway"
+msgstr "挪å¨"
+
+#: deluge/ui/countries.py:175
+msgid "Oman"
+msgstr "阿曼"
+
+#: deluge/ui/countries.py:176
+msgid "Pakistan"
+msgstr "巴基斯å¦"
+
+#: deluge/ui/countries.py:177
+msgid "Palau"
+msgstr "帛ç‰"
+
+#: deluge/ui/countries.py:178
+msgid "Palestinian Territory, Occupied"
+msgstr "å·´å‹’æ–¯å¦ä½”é ˜å€"
+
+#: deluge/ui/countries.py:179
+msgid "Panama"
+msgstr "巴拿馬"
+
+#: deluge/ui/countries.py:180
+msgid "Papua New Guinea"
+msgstr "巴布亞ç´å¹¾å…§äºž"
+
+#: deluge/ui/countries.py:181
+msgid "Paraguay"
+msgstr "巴拉圭"
+
+#: deluge/ui/countries.py:182
+msgid "Peru"
+msgstr "秘魯"
+
+#: deluge/ui/countries.py:183
+msgid "Philippines"
+msgstr "è²å¾‹è³“"
+
+#: deluge/ui/countries.py:184
+msgid "Pitcairn"
+msgstr "皮特肯群島"
+
+#: deluge/ui/countries.py:185
+msgid "Poland"
+msgstr "波蘭"
+
+#: deluge/ui/countries.py:186
+msgid "Portugal"
+msgstr "è‘¡è„牙"
+
+#: deluge/ui/countries.py:187
+msgid "Puerto Rico"
+msgstr "波多黎å„"
+
+#: deluge/ui/countries.py:188
+msgid "Qatar"
+msgstr "å¡é”"
+
+#: deluge/ui/countries.py:189
+msgid "Reunion"
+msgstr "留尼旺"
+
+#: deluge/ui/countries.py:190
+msgid "Romania"
+msgstr "羅馬尼亞"
+
+#: deluge/ui/countries.py:191
+msgid "Russian Federation"
+msgstr "ä¿„ç¾…æ–¯"
+
+#: deluge/ui/countries.py:192
+msgid "Rwanda"
+msgstr "盧安é”"
+
+#: deluge/ui/countries.py:193
+msgid "Saint Barthelemy"
+msgstr "è–巴托洛繆島"
+
+#: deluge/ui/countries.py:194
+msgid "Saint Helena"
+msgstr "è–赫勒拿島"
+
+#: deluge/ui/countries.py:195
+msgid "Saint Kitts and Nevis"
+msgstr "è–克里斯多ç¦èˆ‡å°¼ç¶­æ–¯"
+
+#: deluge/ui/countries.py:196
+msgid "Saint Lucia"
+msgstr "è–露西亞"
+
+#: deluge/ui/countries.py:197
+msgid "Saint Martin"
+msgstr "è–馬ä¸å³¶"
+
+#: deluge/ui/countries.py:198
+msgid "Saint Pierre and Miquelon"
+msgstr "è–皮耶與密克隆群島"
+
+#: deluge/ui/countries.py:199
+msgid "Saint Vincent and the Grenadines"
+msgstr "è–文森åŠæ ¼ç‘žé‚£ä¸"
+
+#: deluge/ui/countries.py:200
+msgid "Samoa"
+msgstr "薩摩亞"
+
+#: deluge/ui/countries.py:201
+msgid "San Marino"
+msgstr "è–馬利諾"
+
+#: deluge/ui/countries.py:202
+msgid "Sao Tome and Principe"
+msgstr "è–多美普林西比"
+
+#: deluge/ui/countries.py:203
+msgid "Saudi Arabia"
+msgstr "æ²™çƒåœ°é˜¿æ‹‰ä¼¯"
+
+#: deluge/ui/countries.py:204
+msgid "Senegal"
+msgstr "塞內加爾"
+
+#: deluge/ui/countries.py:205
+msgid "Serbia"
+msgstr "塞爾維亞"
+
+#: deluge/ui/countries.py:206
+msgid "Seychelles"
+msgstr "塞席爾"
+
+#: deluge/ui/countries.py:207
+msgid "Sierra Leone"
+msgstr "ç…å­å±±"
+
+#: deluge/ui/countries.py:208
+msgid "Singapore"
+msgstr "新加å¡"
+
+#: deluge/ui/countries.py:209
+msgid "Slovakia"
+msgstr "斯洛ä¼å…‹"
+
+#: deluge/ui/countries.py:210
+msgid "Slovenia"
+msgstr "斯洛維尼亞"
+
+#: deluge/ui/countries.py:211
+msgid "Solomon Islands"
+msgstr "索羅門群島"
+
+#: deluge/ui/countries.py:212
+msgid "Somalia"
+msgstr "索馬利亞"
+
+#: deluge/ui/countries.py:213
+msgid "South Africa"
+msgstr "å—éž"
+
+#: deluge/ui/countries.py:214
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "å—喬治亞與å—三明治群島"
+
+#: deluge/ui/countries.py:215
+msgid "Spain"
+msgstr "西ç­ç‰™"
+
+#: deluge/ui/countries.py:216
+msgid "Sri Lanka"
+msgstr "斯里蘭å¡"
+
+#: deluge/ui/countries.py:217
+msgid "Sudan"
+msgstr "蘇丹"
+
+#: deluge/ui/countries.py:218
+msgid "Suriname"
+msgstr "蘇利å—"
+
+#: deluge/ui/countries.py:219
+msgid "Svalbard and Jan Mayen"
+msgstr "斯瓦巴åŠå°–棉"
+
+#: deluge/ui/countries.py:220
+msgid "Swaziland"
+msgstr "å²ç“¦æ¿Ÿè˜­"
+
+#: deluge/ui/countries.py:221
+msgid "Sweden"
+msgstr "ç‘žå…¸"
+
+#: deluge/ui/countries.py:222
+msgid "Switzerland"
+msgstr "瑞士"
+
+#: deluge/ui/countries.py:223
+msgid "Syrian Arab Republic"
+msgstr "敘利亞"
+
+#: deluge/ui/countries.py:224
+msgid "Taiwan, Province of China"
+msgstr "臺ç£"
+
+#: deluge/ui/countries.py:225
+msgid "Tajikistan"
+msgstr "å¡”å‰å…‹"
+
+#: deluge/ui/countries.py:226
+msgid "Tanzania, United Republic of"
+msgstr "å¦å°šå°¼äºž"
+
+#: deluge/ui/countries.py:227
+msgid "Thailand"
+msgstr "泰國"
+
+#: deluge/ui/countries.py:228
+msgid "Timor-Leste"
+msgstr "æ±å¸æ±¶"
+
+#: deluge/ui/countries.py:229
+msgid "Togo"
+msgstr "多哥"
+
+#: deluge/ui/countries.py:230
+msgid "Tokelau"
+msgstr "托克勞"
+
+#: deluge/ui/countries.py:231
+msgid "Tonga"
+msgstr "æ±åŠ "
+
+#: deluge/ui/countries.py:232
+msgid "Trinidad and Tobago"
+msgstr "åƒé‡Œé”"
+
+#: deluge/ui/countries.py:233
+msgid "Tunisia"
+msgstr "çªå°¼è¥¿äºž"
+
+#: deluge/ui/countries.py:234
+msgid "Turkey"
+msgstr "土耳其"
+
+#: deluge/ui/countries.py:235
+msgid "Turkmenistan"
+msgstr "土庫曼"
+
+#: deluge/ui/countries.py:236
+msgid "Turks and Caicos Islands"
+msgstr "土克凱å¯ç¾¤å³¶"
+
+#: deluge/ui/countries.py:237
+msgid "Tuvalu"
+msgstr "å瓦魯"
+
+#: deluge/ui/countries.py:238
+msgid "Uganda"
+msgstr "çƒå¹²é”"
+
+#: deluge/ui/countries.py:239
+msgid "Ukraine"
+msgstr "çƒå…‹è˜­"
+
+#: deluge/ui/countries.py:240
+msgid "United Arab Emirates"
+msgstr "阿拉伯è¯åˆå¤§å…¬åœ‹"
+
+#: deluge/ui/countries.py:242
+msgid "United States"
+msgstr "美國"
+
+#: deluge/ui/countries.py:243
+msgid "United States Minor Outlying Islands"
+msgstr "美國本土外å°å³¶å¶¼"
+
+#: deluge/ui/countries.py:244
+msgid "Uruguay"
+msgstr "çƒæ‹‰åœ­"
+
+#: deluge/ui/countries.py:245
+msgid "Uzbekistan"
+msgstr "çƒèŒ²åˆ¥å…‹"
+
+#: deluge/ui/countries.py:246
+msgid "Vanuatu"
+msgstr "è¬é‚£æœ"
+
+#: deluge/ui/countries.py:247
+msgid "Venezuela"
+msgstr "委內瑞拉"
+
+#: deluge/ui/countries.py:248
+msgid "Viet Nam"
+msgstr "越å—"
+
+#: deluge/ui/countries.py:249
+msgid "Virgin Islands, British"
+msgstr "英屬維京群島"
+
+#: deluge/ui/countries.py:250
+msgid "Virgin Islands, U.S."
+msgstr "美屬維京群島"
+
+#: deluge/ui/countries.py:251
+msgid "Wallis and Futuna"
+msgstr "瓦利斯群島和富圖ç´ç¾¤å³¶"
+
+#: deluge/ui/countries.py:252
+msgid "Western Sahara"
+msgstr "西撒哈拉"
+
+#: deluge/ui/countries.py:253
+msgid "Yemen"
+msgstr "葉門"
+
+#: deluge/ui/countries.py:254
+msgid "Zambia"
+msgstr "尚比亞"
+
+#: deluge/ui/countries.py:255
+msgid "Zimbabwe"
+msgstr "辛巴å¨"
+
+#: deluge/ui/web/json_api.py:733 deluge/ui/web/json_api.py:750
+#: deluge/ui/web/json_api.py:759 deluge/ui/web/json_api.py:762
+#: deluge/ui/web/json_api.py:769 deluge/ui/gtkui/connectionmanager.py:75
+#: deluge/ui/gtkui/connectionmanager.py:215
+#: deluge/ui/gtkui/connectionmanager.py:246
+#: deluge/ui/gtkui/connectionmanager.py:283
+#: deluge/ui/gtkui/connectionmanager.py:296
+#: deluge/ui/gtkui/connectionmanager.py:378
+#: deluge/ui/gtkui/connectionmanager.py:389
+#: deluge/ui/gtkui/connectionmanager.py:452
+#: deluge/ui/gtkui/connectionmanager.py:569
+msgid "Offline"
+msgstr "離線"
+
+#: deluge/ui/web/json_api.py:755 deluge/ui/gtkui/connectionmanager.py:76
+#: deluge/ui/gtkui/connectionmanager.py:274
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Online"
+msgstr "上線"
+
+#: deluge/ui/web/json_api.py:775 deluge/ui/gtkui/connectionmanager.py:77
+#: deluge/ui/gtkui/connectionmanager.py:313
+#: deluge/ui/gtkui/connectionmanager.py:372
+#: deluge/ui/gtkui/connectionmanager.py:382
+#: deluge/ui/gtkui/connectionmanager.py:440
+#: deluge/ui/gtkui/connectionmanager.py:552
+msgid "Connected"
+msgstr "已連接"
+
+#: deluge/ui/web/json_api.py:802
+msgid "Daemon doesn't exist"
+msgstr "常é§ç¨‹å¼ä¸¦ä¸å­˜åœ¨"
+
+#: deluge/ui/web/json_api.py:808
+msgid "Daemon not running"
+msgstr "常é§ç¨‹å¼ä¸¦æœªåŸ·è¡Œ"
+
+#: deluge/ui/web/server.py:661
+msgid "Starting server in PID"
+msgstr "啟動伺æœå™¨æ–¼ PID"
+
+#: deluge/ui/gtkui/peers_tab.py:100
+msgid "Address"
+msgstr "ä½å€"
+
+#: deluge/ui/gtkui/peers_tab.py:116
+msgid "Client"
+msgstr "用戶端"
+
+#: deluge/ui/gtkui/peers_tab.py:129 deluge/ui/gtkui/files_tab.py:156
+#: deluge/ui/gtkui/torrentview.py:225 deluge/ui/gtkui/torrentview.py:555
+msgid "Progress"
+msgstr "進度"
+
+#: deluge/ui/gtkui/peers_tab.py:142 deluge/ui/gtkui/torrentview.py:237
+msgid "Down Speed"
+msgstr "下載速度"
+
+#: deluge/ui/gtkui/peers_tab.py:155 deluge/ui/gtkui/torrentview.py:239
+msgid "Up Speed"
+msgstr "上傳速度"
+
+#: deluge/ui/gtkui/queuedtorrents.py:75
+#: deluge/ui/gtkui/addtorrentdialog.py:103
+msgid "Torrent"
+msgstr "種å­"
+
+#: deluge/ui/gtkui/queuedtorrents.py:135
+msgid " Torrents Queued"
+msgstr " 種å­å·²æŽ’入佇列"
+
+#: deluge/ui/gtkui/queuedtorrents.py:137
+msgid " Torrent Queued"
+msgstr " 種å­å·²ä½‡åˆ—"
+
+#: deluge/ui/gtkui/common.py:67 deluge/ui/gtkui/systemtray.py:249
+#: deluge/ui/gtkui/systemtray.py:253 deluge/ui/gtkui/systemtray.py:423
+#: deluge/ui/gtkui/statusbar.py:397 deluge/ui/gtkui/statusbar.py:425
+#: deluge/ui/gtkui/statusbar.py:452
+msgid "Unlimited"
+msgstr "未é™åˆ¶"
+
+#: deluge/ui/gtkui/common.py:70
+msgid "Activated"
+msgstr "正在下載"
+
+#: deluge/ui/gtkui/common.py:124 deluge/ui/gtkui/common.py:125
+#: deluge/ui/gtkui/systemtray.py:426 deluge/ui/gtkui/statusbar.py:399
+#: deluge/ui/gtkui/statusbar.py:427 deluge/ui/gtkui/statusbar.py:454
+#: deluge/ui/gtkui/menubar.py:81
+msgid "Other..."
+msgstr "其他..."
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Down:"
+msgstr "下載:"
+
+#: deluge/ui/gtkui/mainwindow.py:235
+msgid "Up:"
+msgstr "上傳:"
+
+#: deluge/ui/gtkui/systemtray.py:201 deluge/ui/gtkui/systemtray.py:258
+msgid "Deluge"
+msgstr "Deluge"
+
+#: deluge/ui/gtkui/systemtray.py:201
+msgid "Not Connected..."
+msgstr "未連接..."
+
+#: deluge/ui/gtkui/systemtray.py:258
+msgid "Down"
+msgstr "下載速度"
+
+#: deluge/ui/gtkui/systemtray.py:259
+msgid "Up"
+msgstr "上傳速度"
+
+#: deluge/ui/gtkui/systemtray.py:403 deluge/ui/gtkui/statusbar.py:401
+#: deluge/ui/gtkui/menubar.py:436
+msgid "Set Maximum Download Speed"
+msgstr "設定最大下載速度"
+
+#: deluge/ui/gtkui/systemtray.py:417 deluge/ui/gtkui/statusbar.py:429
+#: deluge/ui/gtkui/menubar.py:437
+msgid "Set Maximum Upload Speed"
+msgstr "設定最大上傳速度"
+
+#: deluge/ui/gtkui/systemtray.py:470
+msgid "Deluge is password protected!"
+msgstr "Deluge å—到密碼ä¿è­·ï¼"
+
+#: deluge/ui/gtkui/systemtray.py:476
+msgid "Enter your password to continue"
+msgstr "輸入您的密碼以繼續"
+
+#: deluge/ui/gtkui/notification.py:79
+msgid "Torrent complete"
+msgstr "種å­ä¸‹è¼‰å®Œæˆ"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "Including"
+msgstr "包å«"
+
+#: deluge/ui/gtkui/notification.py:80
+msgid "files"
+msgstr "檔案"
+
+#: deluge/ui/gtkui/notification.py:109
+#, python-format
+msgid ""
+"This email is to inform you that Deluge has finished downloading %(name)s , "
+" which includes %(num_files)i files.\n"
+"To stop receiving these alerts, simply turn off email "
+"notification in Deluge's preferences.\n"
+"\n"
+"Thank you,\n"
+"Deluge"
+msgstr ""
+"這å°é›»å­éƒµä»¶æ˜¯ä¾†æ醒您,Deluge 已經完æˆä¸‹è¼‰ %(name)s,其中包å«äº† %(num_files)i 項檔案。\n"
+"è‹¥è¦åœæ­¢æŽ¥æ”¶é€™é¡žæ醒,請在 Deluge çš„å好設定內關閉電郵通知。\n"
+"\n"
+"è¬è¬æ‚¨ï¼Œ\n"
+"Deluge"
+
+#: deluge/ui/gtkui/new_release_dialog.py:72
+msgid "<i>Client Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/preferences.py:72
+msgid "Categories"
+msgstr "類別"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Downloads"
+msgstr "下載"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Network"
+msgstr "網路"
+
+#: deluge/ui/gtkui/preferences.py:76
+msgid "Bandwidth"
+msgstr "頻寬"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Interface"
+msgstr "介é¢"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Other"
+msgstr "其他"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Daemon"
+msgstr "常é§ç¨‹å¼"
+
+#: deluge/ui/gtkui/preferences.py:77
+msgid "Proxy"
+msgstr "代ç†ä¼ºæœå™¨"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Cache"
+msgstr "å¿«å–"
+
+#: deluge/ui/gtkui/preferences.py:78
+msgid "Plugins"
+msgstr "外掛模組"
+
+#: deluge/ui/gtkui/preferences.py:93
+msgid "Plugin"
+msgstr "外掛模組"
+
+#: deluge/ui/gtkui/preferences.py:891
+msgid "Select the Plugin"
+msgstr "é¸å–外掛"
+
+#: deluge/ui/gtkui/preferences.py:902
+msgid "Plugin Eggs"
+msgstr "外掛 Egg"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:111
+#: deluge/ui/gtkui/createtorrentdialog.py:80 deluge/ui/gtkui/files_tab.py:122
+msgid "Filename"
+msgstr "檔案å稱"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:124
+#: deluge/ui/gtkui/createtorrentdialog.py:90 deluge/ui/gtkui/files_tab.py:143
+#: deluge/ui/gtkui/torrentview.py:216
+msgid "Size"
+msgstr "大å°"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:206
+msgid "Invalid File"
+msgstr "無效的檔案"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "Duplicate Torrent"
+msgstr "é‡è¤‡çš„種å­"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:211
+msgid "You cannot add the same torrent twice."
+msgstr "ä½ ä¸èƒ½é‡è¤‡æ–°å¢žç›¸åŒçš„種å­ã€‚"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid "Unable to set file priority!"
+msgstr "無法設定優先權ï¼"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:492
+msgid ""
+"File prioritization is unavailable when using Compact allocation. Would you "
+"like to switch to Full allocation?"
+msgstr "在使用緊密檔案分é…時無法設定檔案優先權。您è¦åˆ‡æ›è‡³å®Œæ•´æª”案分é…嗎?"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:541
+msgid "Choose a .torrent file"
+msgstr "è«‹é¸å–一個種å­æª”案 (.torrent)"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:553
+#: deluge/ui/gtkui/createtorrentdialog.py:253
+msgid "Torrent files"
+msgstr "種å­æª”案"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:557
+#: deluge/ui/gtkui/createtorrentdialog.py:257
+msgid "All files"
+msgstr "所有檔案"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "Invalid URL"
+msgstr "無效的 URL"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:622
+msgid "is not a valid URL."
+msgstr "ä¸æ˜¯ä¸€å€‹æœ‰æ•ˆçš„ URL。"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:626
+msgid "Downloading..."
+msgstr "下載中..."
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Download Failed"
+msgstr "下載失敗"
+
+#: deluge/ui/gtkui/addtorrentdialog.py:668
+msgid "Failed to download:"
+msgstr "下載失敗:"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:103
+#: deluge/ui/gtkui/edittrackersdialog.py:84
+msgid "Tier"
+msgstr "階"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:105
+#: deluge/ui/gtkui/edittrackersdialog.py:86 deluge/ui/gtkui/torrentview.py:253
+msgid "Tracker"
+msgstr "追蹤伺æœå™¨"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:143
+msgid "Choose a file"
+msgstr "é¸æ“‡æª”案"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:172
+msgid "Choose a folder"
+msgstr "é¸æ“‡è³‡æ–™å¤¾"
+
+#: deluge/ui/gtkui/createtorrentdialog.py:241
+msgid "Save .torrent file"
+msgstr "儲存種å­æª”案"
+
+#: deluge/ui/gtkui/statusbar.py:146
+msgid "Not Connected"
+msgstr "未連線"
+
+#: deluge/ui/gtkui/statusbar.py:163
+msgid "Connections"
+msgstr "連接數"
+
+#: deluge/ui/gtkui/statusbar.py:168
+msgid "Download Speed"
+msgstr "下載速度"
+
+#: deluge/ui/gtkui/statusbar.py:173
+msgid "Upload Speed"
+msgstr "上傳速度"
+
+#: deluge/ui/gtkui/statusbar.py:178
+msgid "Protocol Traffic Download/Upload"
+msgstr "下載/上傳å”定æµé‡"
+
+#: deluge/ui/gtkui/statusbar.py:181
+msgid "DHT Nodes"
+msgstr "DHT 節點"
+
+#: deluge/ui/gtkui/statusbar.py:186
+msgid "Free Disk Space"
+msgstr "å¯ç”¨ç£ç¢Ÿç©ºé–“"
+
+#: deluge/ui/gtkui/statusbar.py:190
+msgid "No Incoming Connections!"
+msgstr "沒有連入的連接ï¼"
+
+#: deluge/ui/gtkui/statusbar.py:456 deluge/ui/gtkui/menubar.py:438
+msgid "Set Maximum Connections"
+msgstr "設定最大連線數"
+
+#: deluge/ui/gtkui/removetorrentdialog.py:78
+msgid "Torrents"
+msgstr "種å­"
+
+#: deluge/ui/gtkui/filtertreeview.py:69
+msgid "States"
+msgstr "狀態"
+
+#: deluge/ui/gtkui/filtertreeview.py:71
+msgid "Labels"
+msgstr "標示"
+
+#: deluge/ui/gtkui/filtertreeview.py:72
+msgid "All"
+msgstr "全部"
+
+#: deluge/ui/gtkui/filtertreeview.py:73
+msgid "Downloading"
+msgstr "下載中"
+
+#: deluge/ui/gtkui/filtertreeview.py:74
+msgid "Seeding"
+msgstr "作種中"
+
+#: deluge/ui/gtkui/filtertreeview.py:75
+msgid "Paused"
+msgstr "æš«åœ"
+
+#: deluge/ui/gtkui/filtertreeview.py:76
+msgid "Checking"
+msgstr "檢查中"
+
+#: deluge/ui/gtkui/filtertreeview.py:77
+msgid "Queued"
+msgstr "已排入佇列"
+
+#: deluge/ui/gtkui/filtertreeview.py:79
+msgid "Active"
+msgstr "æ´»èº"
+
+#: deluge/ui/gtkui/filtertreeview.py:80
+msgid "None"
+msgstr "ç„¡"
+
+#: deluge/ui/gtkui/filtertreeview.py:81
+msgid "No Label"
+msgstr "無標籤"
+
+#: deluge/ui/gtkui/aboutdialog.py:253
+msgid ""
+"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. \n"
+"\n"
+"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. \n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"this program; if not, see <http://www.gnu.org/licenses>. \n"
+"\n"
+"In addition, as a special exception, the copyright holders give permission "
+"to link the code of portions of this program with the OpenSSL library. You "
+"must obey the GNU General Public License in all respects for all of the code "
+"used other than OpenSSL. \n"
+"\n"
+"If you modify file(s) with this exception, you may extend this exception to "
+"your version of the file(s), but you are not obligated to do so. If you do "
+"not wish to do so, delete this exception statement from your version. If you "
+"delete this exception statement from all source files in the program, then "
+"also delete it here."
+msgstr ""
+
+#: deluge/ui/gtkui/connectionmanager.py:149
+msgid "Status"
+msgstr "狀態"
+
+#: deluge/ui/gtkui/connectionmanager.py:153
+msgid "Host"
+msgstr "主機"
+
+#: deluge/ui/gtkui/connectionmanager.py:158
+msgid "Version"
+msgstr "版本"
+
+#: deluge/ui/gtkui/connectionmanager.py:386
+msgid "_Stop Daemon"
+msgstr "åœæ­¢å¸¸é§(_S)"
+
+#: deluge/ui/gtkui/connectionmanager.py:394
+msgid "_Start Daemon"
+msgstr "啟動常é§(_S)"
+
+#: deluge/ui/gtkui/connectionmanager.py:414
+#: deluge/ui/gtkui/connectionmanager.py:424
+msgid "Unable to start daemon!"
+msgstr "無法啟動常é§ç¨‹å¼ï¼"
+
+#: deluge/ui/gtkui/connectionmanager.py:415
+msgid ""
+"Deluge cannot find the 'deluged' executable, it is likely that you forgot to "
+"install the deluged package or it's not in your PATH."
+msgstr ""
+"Deluge 無法找到å¯åŸ·è¡Œçš„「delugedã€ï¼Œå¯èƒ½æ˜¯æ‚¨æ²’æœ‰å®‰è£ deluged 套件,或者 deluged 並ä¸åœ¨æ‚¨çš„ PATH 環境åƒæ•¸å…§ã€‚"
+
+#: deluge/ui/gtkui/connectionmanager.py:425
+msgid "Please examine the details for more information."
+msgstr "請檢查詳細資料以ç²å¾—更多資訊。"
+
+#: deluge/ui/gtkui/connectionmanager.py:509
+msgid "Error Adding Host"
+msgstr "加入主機時發生錯誤"
+
+#: deluge/ui/gtkui/gtkui.py:302 deluge/ui/gtkui/gtkui.py:317
+msgid "Turn off Classic Mode?"
+msgstr "關閉傳統模å¼ï¼Ÿ"
+
+#: deluge/ui/gtkui/gtkui.py:303
+msgid ""
+"It appears that a Deluge daemon process (deluged) is already running.\n"
+"\n"
+"You will either need to stop the daemon or turn off Classic Mode to continue."
+msgstr ""
+"似乎有一個 Deluge 常é§ç¨‹å¼è¡Œç¨‹ (deluged) 正在執行當中。\n"
+"\n"
+"您需è¦åœæ­¢è©²å¸¸é§ï¼Œæˆ–者關閉傳統模å¼ä»¥ä¾¿ç¹¼çºŒã€‚"
+
+#: deluge/ui/gtkui/gtkui.py:312
+msgid "Error Starting Core"
+msgstr "啟動核心時發生錯誤"
+
+#: deluge/ui/gtkui/gtkui.py:313
+msgid ""
+"There was an error starting the core component which is required to run "
+"Deluge in Classic Mode.\n"
+"\n"
+"Please see the details below for more information."
+msgstr ""
+"當載入執行 Deluge 傳統模å¼çš„核心組件時發生錯誤。\n"
+"\n"
+"請查看詳細資料以ç²å¾—更多資訊。"
+
+#: deluge/ui/gtkui/gtkui.py:318
+msgid ""
+"Since there was an error starting in Classic Mode would you like to continue "
+"by turning it off?"
+msgstr "以傳統模å¼å•Ÿå‹•æ™‚發生錯誤,您是å¦è¦é—œé–‰å‚³çµ±æ¨¡å¼ä»¥ä¾¿ç¹¼çºŒï¼Ÿ"
+
+#: deluge/ui/gtkui/gtkui.py:342
+msgid "Error Starting Daemon"
+msgstr "啟動常é§æ™‚發生錯誤"
+
+#: deluge/ui/gtkui/gtkui.py:343
+msgid ""
+"There was an error starting the daemon process. Try running it from a "
+"console to see if there is an error."
+msgstr "在啟動常é§ç¨‹åºæ™‚發生錯誤。請嘗試在終端機執行,看看是å¦æœ‰ä»»ä½•éŒ¯èª¤ç™¼ç”Ÿã€‚"
+
+#: deluge/ui/gtkui/status_tab.py:128 deluge/ui/gtkui/menubar.py:89
+msgid "On"
+msgstr "é–‹å•Ÿ"
+
+#: deluge/ui/gtkui/status_tab.py:130 deluge/ui/gtkui/menubar.py:92
+msgid "Off"
+msgstr "關閉"
+
+#: deluge/ui/gtkui/menubar.py:77
+msgid "Set Unlimited"
+msgstr "設為無é™åˆ¶"
+
+#: deluge/ui/gtkui/menubar.py:319
+msgid "Choose a directory to move files to"
+msgstr "é¸æ“‡è¦ç§»å‹•çš„目的資料夾"
+
+#: deluge/ui/gtkui/menubar.py:439
+msgid "Set Maximum Upload Slots"
+msgstr "設定最大åŒæ™‚上傳數"
+
+#: deluge/ui/gtkui/files_tab.py:56
+msgid "Do Not Download"
+msgstr "ä¸è¦ä¸‹è¼‰"
+
+#: deluge/ui/gtkui/files_tab.py:57
+msgid "Normal Priority"
+msgstr "一般優先"
+
+#: deluge/ui/gtkui/files_tab.py:58
+msgid "High Priority"
+msgstr "高優先"
+
+#: deluge/ui/gtkui/files_tab.py:59
+msgid "Highest Priority"
+msgstr "最高優先"
+
+#: deluge/ui/gtkui/files_tab.py:169
+msgid "Priority"
+msgstr "優先權"
+
+#: deluge/ui/gtkui/dialogs.py:174
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4730
+msgid "Details:"
+msgstr "詳細資料:"
+
+#: deluge/ui/gtkui/torrentview.py:213
+msgid "Name"
+msgstr "å稱"
+
+#: deluge/ui/gtkui/torrentview.py:219
+msgid "Downloaded"
+msgstr "已下載"
+
+#: deluge/ui/gtkui/torrentview.py:222
+msgid "Uploaded"
+msgstr "已上傳"
+
+#: deluge/ui/gtkui/torrentview.py:229 deluge/ui/gtkui/torrentview.py:235
+msgid "Seeders"
+msgstr "種å­æ•¸"
+
+#: deluge/ui/gtkui/torrentview.py:232 deluge/ui/gtkui/torrentview.py:235
+msgid "Peers"
+msgstr "用戶數"
+
+#: deluge/ui/gtkui/torrentview.py:241
+msgid "Down Limit"
+msgstr "下é™"
+
+#: deluge/ui/gtkui/torrentview.py:243
+msgid "Up Limit"
+msgstr "上é™"
+
+#: deluge/ui/gtkui/torrentview.py:245
+msgid "ETA"
+msgstr "é è¨ˆå®Œæˆæ™‚é–“"
+
+#: deluge/ui/gtkui/torrentview.py:247
+msgid "Ratio"
+msgstr "分享率"
+
+#: deluge/ui/gtkui/torrentview.py:249
+msgid "Avail"
+msgstr "å¯å¾—性"
+
+#: deluge/ui/gtkui/torrentview.py:251
+msgid "Added"
+msgstr "加入日期"
+
+#: deluge/ui/gtkui/torrentview.py:257
+msgid "Save Path"
+msgstr "儲存路徑"
+
+#: deluge/ui/gtkui/glade/main_window.glade:21
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:99
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:122
+msgid "_File"
+msgstr "檔案(_F)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:27
+#: deluge/ui/gtkui/glade/tray_menu.glade:26
+msgid "_Add Torrent"
+msgstr "新增種å­(_A)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:45
+msgid "_Create Torrent"
+msgstr "建立種å­(_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:65
+msgid "Quit & _Shutdown Daemon"
+msgstr "離開並關閉常é§(_S)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:101
+msgid "_Edit"
+msgstr "編輯(_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:118
+msgid "_Connection Manager"
+msgstr "連線管ç†å“¡(_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:140
+msgid "_Torrent"
+msgstr "種å­(_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:147
+msgid "_View"
+msgstr "檢視(_V)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:155
+msgid "_Toolbar"
+msgstr "工具列(_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:165
+msgid "_Sidebar"
+msgstr "å´é‚Šæ¬„(_S)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:174
+msgid "Status_bar"
+msgstr "狀態列(_B)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:188
+msgid "T_abs"
+msgstr "索引標籤(_A)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:195
+msgid "_Columns"
+msgstr "欄ä½(_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:203
+msgid "S_idebar"
+msgstr "å´é‚Šæ¬„(_I)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:212
+msgid "Show _Zero Hits"
+msgstr "顯示空的項目(_Z)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:221
+msgid "Show _Trackers"
+msgstr "顯示追蹤伺æœå™¨(_T)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:238
+msgid "_Help"
+msgstr "說明(_H)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:244
+msgid "_Homepage"
+msgstr "首é (_H)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:261
+msgid "_FAQ"
+msgstr "常見å•é¡Œ(_F)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:264
+msgid "Frequently Asked Questions"
+msgstr "常見å•é¡Œ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:280
+msgid "_Community"
+msgstr "社群(_C)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:327
+msgid "Add torrent"
+msgstr "新增種å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:328
+msgid "Add Torrent"
+msgstr "新增種å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:342
+msgid "Remove torrent"
+msgstr "移除種å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:343
+msgid "Remove Torrent"
+msgstr "移除種å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:364
+msgid "Pause the selected torrents"
+msgstr "æš«åœé¸å–的種å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:365
+msgid "Pause"
+msgstr "æš«åœ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:380
+msgid "Resume the selected torrents"
+msgstr "繼續é¸å–的種å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:381
+msgid "Resume"
+msgstr "æ¢å¾©"
+
+#: deluge/ui/gtkui/glade/main_window.glade:403
+msgid "Queue Torrent Up"
+msgstr "佇列中種å­ä¸Šç§»"
+
+#: deluge/ui/gtkui/glade/main_window.glade:404
+msgid "Queue Up"
+msgstr "往上移"
+
+#: deluge/ui/gtkui/glade/main_window.glade:418
+msgid "Queue Torrent Down"
+msgstr "佇列中種å­ä¸‹ç§»"
+
+#: deluge/ui/gtkui/glade/main_window.glade:419
+msgid "Queue Down"
+msgstr "往下移"
+
+#: deluge/ui/gtkui/glade/main_window.glade:440
+#: deluge/ui/gtkui/glade/main_window.glade:441
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:8
+msgid "Preferences"
+msgstr "å好設定"
+
+#: deluge/ui/gtkui/glade/main_window.glade:455
+#: deluge/ui/gtkui/glade/main_window.glade:456
+#: deluge/ui/gtkui/glade/connection_manager.glade:204
+msgid "Connection Manager"
+msgstr "連線管ç†å“¡"
+
+#: deluge/ui/gtkui/glade/main_window.glade:570
+msgid "_Expand All"
+msgstr "全部展開(_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:591
+msgid "_Do Not Download"
+msgstr "ä¸è¦ä¸‹è¼‰(_D)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:607
+msgid "_Normal Priority"
+msgstr "一般優先(_N)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:623
+msgid "_High Priority"
+msgstr "高優先(_H)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:639
+msgid "Hi_ghest Priority"
+msgstr "最高優先(_G)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:721
+msgid "<b>Auto Managed:</b>"
+msgstr "<b>自動管ç†ï¼š</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:762
+msgid "<b>Seed Rank:</b>"
+msgstr "<b>種å­ç­‰ç´šï¼š</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:777
+msgid "<b>Seeding Time:</b>"
+msgstr "<b>åšç¨®æ™‚間:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:803
+msgid "<b>Active Time:</b>"
+msgstr "<b>活動時間:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:860
+msgid "<b>Tracker Status:</b>"
+msgstr "<b>追蹤伺æœå™¨ç‹€æ…‹ï¼š</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:890
+msgid "<b>Availability:</b>"
+msgstr "<b>å¯å¾—性:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:944
+msgid "<b>Peers:</b>"
+msgstr "<b>用戶數:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:970
+msgid "<b>Seeders:</b>"
+msgstr "<b>種å­æ•¸ï¼š</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:988
+msgid "<b>Pieces:</b>"
+msgstr "<b>å€å¡Šï¼š</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1010
+msgid "<b>ETA:</b>"
+msgstr "<b>剩餘時間:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1032
+msgid "<b>Up Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1054
+msgid "<b>Down Speed:</b>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:1073
+msgid "<b>Next Announce:</b>"
+msgstr "<b>下次發佈:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1092
+msgid "<b>Share Ratio:</b>"
+msgstr "<b>分享率:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1111
+msgid "<b>Uploaded:</b>"
+msgstr "<b>已上傳:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1130
+msgid "<b>Downloaded:</b>"
+msgstr "<b>已下載:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1191
+msgid "<b>Date Added:</b>"
+msgstr "<b>加入時間:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1249
+msgid "_Status"
+msgstr "狀態(_S)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1310
+msgid "<b>Comments:</b>"
+msgstr "<b>註解:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1339
+msgid "<b># of files:</b>"
+msgstr "<b>檔案總數:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1371
+msgid "<b>Hash:</b>"
+msgstr "<b>驗證碼 (Hash):</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1401
+msgid "<b>Tracker:</b>"
+msgstr "<b>追蹤伺æœå™¨ï¼š</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1421
+msgid "<b>Total Size:</b>"
+msgstr "<b>總大å°ï¼š</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1459
+msgid "<b>Name:</b>"
+msgstr "<b>å稱:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1479
+msgid "<b>Path:</b>"
+msgstr "<b>路徑:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1513
+msgid "<b>Status:</b>"
+msgstr "<b>狀態:</b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1594
+msgid "_Details"
+msgstr "詳細資訊(_D)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1646
+msgid "_Files"
+msgstr "檔案(_F)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:1698
+msgid "_Peers"
+msgstr "用戶(_P)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2009
+msgid "Move completed:"
+msgstr "移動完整檔:"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2105
+msgid "Private"
+msgstr "éš±ç§"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2120
+msgid "Prioritize First/Last"
+msgstr "優先下載頭尾部份"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2158
+#: deluge/ui/gtkui/glade/torrent_menu.glade:130
+msgid "_Edit Trackers"
+msgstr "編輯追蹤伺æœå™¨(_E)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2265
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:867
+msgid "_Options"
+msgstr "é¸é …(_O)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2285
+msgid "Remove Torrent?"
+msgstr "移除種å­ï¼Ÿ"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2324
+msgid ""
+"<big><b>Are you sure you want to remove the selected torrent?</b></big>"
+msgstr "<big><b>您確定è¦ç§»é™¤å·²é¸æ“‡çš„種å­æª”?</b></big>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2376
+msgid "<i>The associated .torrent will be deleted!</i>"
+msgstr "<i>將移除相關的種å­æª”ï¼</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2416
+msgid "<i>The downloaded data will be deleted!</i>"
+msgstr "<i>將移除已下載的資料ï¼</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2460
+msgid "Remove Selected Torrent"
+msgstr "移除已é¸æ“‡çš„種å­"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2484
+msgid "New Release"
+msgstr "新版本"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2518
+msgid "<b><big>New Release Available!</big></b>"
+msgstr "<b><big>ç¾åœ¨å¯ä»¥å–å¾— Deluge 的新版本了ï¼</big></b>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2570
+msgid "<i>Available Version:</i>"
+msgstr "<i>新版本:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2593
+msgid "<i>Current Version:</i>"
+msgstr "<i>ç›®å‰çš„版本:</i>"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2604
+msgid "<i>Server Version</i>"
+msgstr ""
+
+#: deluge/ui/gtkui/glade/main_window.glade:2637
+msgid "Do not show this dialog in the future"
+msgstr "以後ä¸è¦é¡¯ç¤ºé€™å€‹å°è©±è¦–窗"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2676
+msgid "_Goto Website"
+msgstr "å‰å¾€ç¶²ç«™(_G)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2704
+msgid "_Add Peer"
+msgstr "加入用戶(_A)"
+
+#: deluge/ui/gtkui/glade/main_window.glade:2706
+msgid "Add a peer by its IP"
+msgstr "以 IP 加入一個用戶"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:10
+msgid "_Select All"
+msgstr "å…¨é¸(_S)"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:26
+#: deluge/ui/gtkui/glade/tray_menu.glade:48
+msgid "_Pause All"
+msgstr "全部暫åœ(_P)"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:41
+#: deluge/ui/gtkui/glade/torrent_menu.glade:48
+msgid "Resume selected torrents."
+msgstr "繼續é¸å–的種å­æª”。"
+
+#: deluge/ui/gtkui/glade/filtertree_menu.glade:42
+msgid "Resu_me All"
+msgstr "全部繼續(_M)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:8
+msgid "Add Torrents"
+msgstr "增加種å­"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:147
+msgid "_URL"
+msgstr "網å€(_U)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:195
+msgid "Info_hash"
+msgstr "資訊驗證碼(_H)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:241
+msgid "_Remove"
+msgstr "移除(_R)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:274
+msgid "<b>Torrents</b>"
+msgstr "<b>種å­</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:331
+msgid "Fi_les"
+msgstr "檔案(_L)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:434
+msgid "Full"
+msgstr "完整"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:450
+msgid "Compact"
+msgstr "ç°¡æ½”"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:472
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:409
+msgid "<b>Allocation</b>"
+msgstr "<b>檔案分é…</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:525
+msgid "Max Down Speed:"
+msgstr "最高下載速度:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:537
+msgid "Max Up Speed:"
+msgstr "最高上傳速度:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:668
+msgid "Add In _Paused State"
+msgstr "以暫åœç‹€æ…‹æ–°å¢ž(_P)"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:684
+msgid "Prioritize First/Last Pieces"
+msgstr "開頭與çµå°¾å€å¡Šå„ªå…ˆ"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:762
+msgid "Revert To Defaults"
+msgstr "回復é è¨­å€¼"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:816
+msgid "Apply To All"
+msgstr "全部套用"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:944
+msgid "Add URL"
+msgstr "新增 URL"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:983
+msgid "<b>From URL</b>"
+msgstr "<b>從 URL 新增</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1104
+msgid "Add Infohash"
+msgstr "新增資訊雜湊"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1143
+msgid "<b>From Infohash</b>"
+msgstr "<b>來自資訊雜湊</b>"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1178
+msgid "Infohash:"
+msgstr "資訊雜湊:"
+
+#: deluge/ui/gtkui/glade/add_torrent_dialog.glade:1214
+#: deluge/ui/gtkui/glade/edit_trackers.glade:296
+msgid "Trackers:"
+msgstr "追蹤伺æœå™¨ï¼š"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:7
+msgid "Create Torrent"
+msgstr "建立種å­"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:34
+msgid "<big><b>Create Torrent</b></big>"
+msgstr "<big><b>建立種å­</b></big>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:159
+msgid "Fol_der"
+msgstr "資料夾(_D)"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:199
+msgid "_Remote Path"
+msgstr "é ç«¯è·¯å¾‘(_R)"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:229
+msgid "<b>Files</b>"
+msgstr "<b>檔案</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:263
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4756
+msgid "Author:"
+msgstr "作者:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:292
+msgid "Comments:"
+msgstr "註解:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:331
+msgid "Info"
+msgstr "資訊"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:512
+msgid "Webseeds"
+msgstr "網路種å­"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:542
+msgid "Piece Size:"
+msgstr "片段大å°ï¼š"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:552
+msgid ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+msgstr ""
+"32 KiB\n"
+"64 KiB\n"
+"128 KiB\n"
+"256 KiB\n"
+"512 KiB\n"
+"1 MiB\n"
+"2 MiB\n"
+"4 MiB\n"
+"8 MiB\n"
+"16 MiB\n"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:580
+msgid "Set Private Flag"
+msgstr "設定ç§äººæ¨™ç±¤"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:594
+msgid "Add this torrent to the session"
+msgstr "新增這個種å­è‡³æ­¤å·¥ä½œéšŽæ®µ"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:692
+msgid "Enter Remote Path"
+msgstr "輸入é ç«¯è·¯å¾‘"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:728
+msgid "<b>Remote Path</b>"
+msgstr "<b>é ç«¯è·¯å¾‘</b>"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:762
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:944
+msgid "Path:"
+msgstr "路徑:"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:837
+msgid "Creating Torrent"
+msgstr "正在建立種å­"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:874
+msgid "Save .torrent as"
+msgstr "å¦å­˜ç¨®å­ç‚º"
+
+#: deluge/ui/gtkui/glade/create_torrent_dialog.glade:910
+msgid "<b>Save .torrent file</b>"
+msgstr "<b>儲存種å­æª”案</b>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:8
+msgid "Queued Torrents"
+msgstr "已佇列的種å­"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:47
+msgid "<big><b>Add Queued Torrents</b></big>"
+msgstr "<big><b>新增佇列的種å­</b></big>"
+
+#: deluge/ui/gtkui/glade/queuedtorrents.glade:127
+msgid "Automatically add torrents on connect"
+msgstr "連線時自動加入種å­"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:98
+msgid "label"
+msgstr "標籤"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:154
+msgid "Add Peer"
+msgstr "加入用戶"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:187
+msgid "<b>Add Peer</b>"
+msgstr "<b>加入用戶</b>"
+
+#: deluge/ui/gtkui/glade/dgtkpopups.glade:211
+msgid "hostname:port"
+msgstr "主機å稱:通訊埠"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:8
+msgid "Add Host"
+msgstr "新增主機"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:237
+msgid "<big><b>Connection Manager</b></big>"
+msgstr "<big><b>連çµç®¡ç†</b></big>"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:363
+msgid "_Start local daemon"
+msgstr "啟動本地常é§(_S)"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:415
+msgid "Automatically connect to selected host on start-up"
+msgstr "啟動時自動連線到é¸å®šçš„主機"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:426
+msgid "Automatically start localhost if needed"
+msgstr "需è¦æ™‚自動啟動 localhost"
+
+#: deluge/ui/gtkui/glade/connection_manager.glade:440
+msgid "Do not show this dialog on start-up"
+msgstr "啟動時ä¸è¦é¡¯ç¤ºé€™å€‹å°è©±è¦–窗"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:78
+msgid "<b><i><big>Downloads</big></i></b>"
+msgstr "<b><i><big>下載</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:188
+msgid "Auto add .torrents from:"
+msgstr "自動從這裡新增種å­ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:253
+msgid "Download to:"
+msgstr "下載到:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:261
+msgid "Copy of .torrent files to:"
+msgstr "複製種å­æª”案到:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:316
+msgid "Delete copy of torrent file on remove"
+msgstr "移除時刪除種å­æª”副本"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:320
+msgid ""
+"Delete the copy of the torrent file created when the torrent is removed"
+msgstr "當種å­è¢«ç§»é™¤æ™‚也刪除建立的種å­æª”案副本"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:337
+msgid "<b>Folders</b>"
+msgstr "<b>資料夾</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:370
+msgid "Use Full Allocation"
+msgstr "使用完整檔案分é…"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:375
+msgid ""
+"Full allocation preallocates all of the space that is needed for the torrent "
+"and prevents disk fragmentation"
+msgstr "é å…ˆåˆ†é…完整的檔案空間,é¿å…產生ä¸é€£çºŒç‰‡æ®µ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:387
+msgid "Use Compact Allocation"
+msgstr "使用緊密檔案分é…"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:392
+msgid "Compact allocation only allocates space as needed"
+msgstr "ä¾ä¸‹è¼‰å¤§å°åˆ†é…檔案空間"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:440
+msgid "Prioritize first and last pieces of torrent"
+msgstr "優先下載種å­çš„開頭和最後的部份"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:445
+msgid "Prioritize first and last pieces of files in torrent"
+msgstr "先下載種å­çš„頭尾部份"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:455
+msgid "Add torrents in Paused state"
+msgstr "以暫åœç‹€æ…‹åŠ å…¥ç¨®å­"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:529
+msgid "<b><i><big>Network</big></i></b>"
+msgstr "<b><i><big>網路</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:569
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:763
+msgid "Use Random Ports"
+msgstr "使用隨機連接埠"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:574
+msgid "Deluge will automatically choose a different port to use every time."
+msgstr "Deluge æ¯æ¬¡å•Ÿå‹•æ™‚隨機é¸æ“‡ä¸€å€‹é€šè¨ŠåŸ ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:592
+msgid "Active Port:"
+msgstr "啟用的通訊埠:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:662
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:812
+msgid "To:"
+msgstr "至:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:690
+msgid "Test Active Port"
+msgstr "測試å¯ç”¨é€šè¨ŠåŸ "
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:732
+msgid "<b>Incoming Ports</b>"
+msgstr "<b>連入通訊埠</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:850
+msgid "<b>Outgoing Ports</b>"
+msgstr "<b>連出通訊埠</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:882
+msgid ""
+"Enter the IP address of the interface to listen for incoming bittorrent "
+"connections on. Leave this empty if you want to use the default."
+msgstr "輸入介é¢çš„ IP ä½å€ä»¥ç›£è½å‚³å…¥çš„ BT 連接。若您è¦ä½¿ç”¨é è¨­å€¼å‰‡ç•™ç©ºã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:903
+msgid "<b>Interface</b>"
+msgstr "<b>介é¢</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:939
+msgid ""
+"The TOS byte set in the IP header of every packet sent to peers (including "
+"web seeds). Expects a Hex value."
+msgstr "æœå‹™é¡žåž‹ï¼ˆTOS)ä½å…ƒçµ„設定於æ¯å€‹é€è‡³ç”¨æˆ¶ï¼ˆåŒ…括網路種å­ï¼‰çš„å°åŒ… IP 標頭。應為一個å六進制(Hex)值。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:940
+msgid "Peer TOS Byte:"
+msgstr "用戶æœå‹™é¡žåž‹ä½å…ƒçµ„:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:973
+msgid "<b>TOS</b>"
+msgstr "<b>æœå‹™é¡žåž‹</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1006
+msgid "UPnP"
+msgstr "UPnP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1010
+msgid "Universal Plug and Play"
+msgstr "通用隨æ’å³ç”¨"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1021
+msgid "NAT-PMP"
+msgstr "NAT-PMP"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1025
+msgid "NAT Port Mapping Protocol"
+msgstr "NAT 通訊埠å°æ˜ å”定"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1038
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1042
+msgid "Peer Exchange"
+msgstr "用戶交æ›"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1055
+msgid "LSD"
+msgstr "LSD"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1060
+msgid "Local Service Discovery finds local peers on your network."
+msgstr "本地æœå‹™æŽ¢ç´¢å¯åœ¨æ‚¨çš„網路上尋找本地用戶。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1071
+#: deluge/ui/console/statusbars.py:104
+msgid "DHT"
+msgstr "DHT"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1075
+msgid "Distributed hash table may improve the amount of active connections."
+msgstr "分散å¼é›œæ¹Šè¡¨ (DHT) å¯ä»¥å¢žåŠ æœ‰æ•ˆçš„連線數。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1097
+msgid "<b>Network Extras</b>"
+msgstr "<b>網路附加功能</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1136
+msgid "Inbound:"
+msgstr "å‘內連線:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1146
+msgid "Level:"
+msgstr "層級:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1167
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1217
+msgid ""
+"Forced\n"
+"Enabled\n"
+"Disabled"
+msgstr ""
+"強制\n"
+"啟用\n"
+"åœç”¨"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1178
+msgid ""
+"Handshake\n"
+"Full Stream\n"
+"Either"
+msgstr ""
+"交æ¡éšŽæ®µ\n"
+"整個串æµ\n"
+"兩者皆å¯"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1206
+msgid "Outbound:"
+msgstr "å‘外連線:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1233
+msgid "Encrypt entire stream"
+msgstr "加密整個串æµ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1258
+msgid "<b>Encryption</b>"
+msgstr "<b>加密</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1319
+msgid "<b><i><big>Bandwidth</big></i></b>"
+msgstr "<b><i><big>æµé‡</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1396
+msgid "Maximum Connection Attempts per Second:"
+msgstr "æ¯ç§’嘗試的最大連線數:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1408
+msgid "Maximum Half-Open Connections:"
+msgstr "最大åŠé–‹é€£ç·šæ•¸ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1419
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1509
+msgid "The maximum upload speed for all torrents. Set -1 for unlimited."
+msgstr "最大總上傳速度。若ä¸é™åˆ¶ï¼Œè«‹è¨­ç‚º -1。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1421
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1706
+msgid "Maximum Upload Speed (KiB/s):"
+msgstr "最大總上傳速度 (KiB/秒):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1432
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1457
+msgid "The maximum number of connections allowed. Set -1 for unlimited."
+msgstr "å…許的最大連線數。若ä¸é™åˆ¶è«‹è¨­ç‚º-1。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1434
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1669
+msgid "Maximum Connections:"
+msgstr "最大連線數:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1443
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1528
+msgid "The maximum upload slots for all torrents. Set -1 for unlimited."
+msgstr "最大總上傳å€æ®µã€‚è‹¥ä¸é™åˆ¶ï¼Œè«‹è¨­ç‚º -1。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1445
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1680
+msgid "Maximum Upload Slots:"
+msgstr "最大上傳å€æ®µï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1475
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1490
+msgid "The maximum download speed for all torrents. Set -1 for unlimited."
+msgstr "最大總下載速度。若ä¸é™åˆ¶ï¼Œè«‹è¨­ç‚º -1。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1477
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1693
+msgid "Maximum Download Speed (KiB/s):"
+msgstr "最大總下載速度 (KiB/秒):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1554
+msgid "Ignore limits on local network"
+msgstr "本地網路忽略é™åˆ¶"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1573
+msgid "Rate limit IP overhead"
+msgstr "æµé‡ç®¡åˆ¶ IP 資訊é‡"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1577
+msgid ""
+"If checked, the estimated TCP/IP overhead is drained from the rate limiters, "
+"to avoid exceeding the limits with the total traffic"
+msgstr "一旦勾é¸ï¼Œä¼°è¨ˆçš„ TCP/IP 資料é‡å°‡ç”±æµé‡ç®¡åˆ¶å™¨æŽ§åˆ¶ï¼Œä»¥é¿å…æ•´é«”æµé‡è¶…出這些é™åˆ¶"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1594
+msgid "<b>Global Bandwidth Usage</b>"
+msgstr "<b>全域頻寬設定</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1633
+msgid "The maximum upload slots per torrent. Set -1 for unlimited."
+msgstr "å„種å­æœ€å¤§ä¸Šå‚³å€æ®µã€‚è‹¥ä¸é™åˆ¶ï¼Œè«‹è¨­ç‚º -1。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1652
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1718
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1736
+msgid "The maximum number of connections per torrent. Set -1 for unlimited."
+msgstr "å„種å­æœ€å¤§é€£ç·šæ•¸ã€‚è‹¥ä¸é™åˆ¶ï¼Œè«‹è¨­ç‚º -1。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1758
+msgid "<b>Per Torrent Bandwidth Usage</b>"
+msgstr "<b>å„種å­é »å¯¬è¨­å®š</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1818
+msgid "<i><b><big>Interface</big></b></i>"
+msgstr "<i><b><big>介é¢</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1851
+msgid "Enable"
+msgstr "啟用"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1856
+msgid ""
+"Classic Mode will hide most of the daemon functionality and will make Deluge "
+"appear to be a single application. Use this if you do not want to take "
+"advantage of running Deluge as a daemon. You need to restart Deluge for this "
+"setting to take effect."
+msgstr ""
+"傳統模å¼æœƒéš±è—常é§ç¨‹å¼çš„大部分功能,並使 Deluge æˆç‚ºä¸€å€‹å–®ç¨çš„應用程å¼ã€‚è‹¥ä¸æƒ³è®“ Deluge 以常é§åŸ·è¡Œå‰‡é¸æ“‡æ­¤é …。您必須é‡æ–°å•Ÿå‹• "
+"Deluge 使設定生效。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1866
+msgid "<b>Classic Mode</b>"
+msgstr "<b>傳統模å¼</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1899
+msgid "Show session speed in titlebar"
+msgstr "在標題列顯示速度"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1917
+msgid "<b>Main Window</b>"
+msgstr "<b>主視窗</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1950
+msgid "Always show"
+msgstr "æ°¸é é¡¯ç¤º"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1968
+msgid "Bring the dialog to focus"
+msgstr "å–å¾—å°è©±æ¡†ç„¦é»ž"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:1988
+msgid "<b>Add Torrents Dialog</b>"
+msgstr "<b>新增種å­å°è©±è¦–窗</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2020
+msgid "Enable system tray icon"
+msgstr "啟用系統列圖示"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2038
+msgid "Minimize to tray on close"
+msgstr "關閉時最å°åŒ–到系統列"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2058
+msgid "Start in tray"
+msgstr "啟動於系統列"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2078
+msgid "Enable Application Indicator"
+msgstr "啟用程å¼é€šçŸ¥å™¨"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2099
+msgid "Password protect system tray"
+msgstr "縮å°åˆ°ç³»çµ±åˆ—的密碼ä¿è­·"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2165
+msgid "<b>System Tray</b>"
+msgstr "<b>系統列</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2224
+msgid "<i><b><big>Other</big></b></i>"
+msgstr "<i><b><big>其他</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2265
+msgid "Be alerted about new releases"
+msgstr "有新版本發佈時通知我"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2270
+msgid ""
+"Deluge will check our servers and will tell you if a newer version has been "
+"released"
+msgstr "Deluge 會定時檢查伺æœå™¨ä¸¦é€šçŸ¥æ‚¨æœ‰ç„¡æ–°ç‰ˆæœ¬ç™¼ä½ˆ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2289
+msgid "<b>Updates</b>"
+msgstr "<b>æ›´æ–°</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2326
+msgid ""
+"Help us improve Deluge by sending us your Python version, PyGTK version, OS "
+"and processor types. Absolutely no other information is sent."
+msgstr ""
+"傳é€æ‚¨ä½¿ç”¨çš„ Python 版本ã€PyGTK 版本ã€ä½œæ¥­ç³»çµ±èˆ‡è™•ç†å™¨(CPU)種類來幫助我們改善 Deluge。絕å°ä¸æœƒæœ‰é¡å¤–的資訊被傳é€å‡ºåŽ»ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2343
+msgid "Yes, please send anonymous statistics"
+msgstr "是的,請傳é€åŒ¿å統計"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2365
+msgid "<b>System Information</b>"
+msgstr "<b>系統資訊</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2408
+msgid "Location:"
+msgstr "ä½ç½®ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2420
+msgid ""
+"If Deluge cannot find the database file at this location it will fallback to "
+"using DNS to resolve the peer's country."
+msgstr "è‹¥ Deluge 無法在該ä½ç½®æ‰¾åˆ°è³‡æ–™åº«æª”案,將會回退至使用 DNS 來解æžç”¨æˆ¶æ‰€åœ¨åœ‹å®¶ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2444
+msgid "<b>GeoIP Database</b>"
+msgstr "<b>GeoIP 資料庫</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2489
+msgid "Associate Magnet links with Deluge"
+msgstr "讓 Magnet 連çµå’Œ Deluge 產生關è¯"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2558
+msgid "<i><b><big>Daemon</big></b></i>"
+msgstr "<i><b><big>常é§ç¨‹å¼</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2602
+msgid "Daemon port:"
+msgstr "常é§ç¨‹å¼é€£æŽ¥åŸ ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2639
+msgid "<b>Port</b>"
+msgstr "<b>連接埠</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2668
+msgid "Allow Remote Connections"
+msgstr "å…許é ç«¯é€£çµ"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2682
+msgid "<b>Connections</b>"
+msgstr "<b>連接數é‡</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2711
+msgid "Periodically check the website for new releases"
+msgstr "定期檢查此版本的更新"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2725
+msgid "<b>Other</b>"
+msgstr "<b>其它</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2785
+msgid "<i><b><big>Queue</big></b></i>"
+msgstr "<i><b><big>佇列</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2828
+msgid "Queue new torrents to top"
+msgstr "增加新的種å­åˆ°ä½‡åˆ—的首ä½"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2923
+msgid "Total active seeding:"
+msgstr "æ´»èºçš„åšç¨®æ•¸é‡ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2936
+msgid "Total active:"
+msgstr "æ´»èºçš„:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2965
+msgid "Total active downloading:"
+msgstr "æ´»èºçš„下載數é‡ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2980
+msgid "Do not count slow torrents"
+msgstr "ä¸è¨ˆå…¥éŽæ…¢çš„種å­"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:2998
+msgid "<b>Active Torrents</b>"
+msgstr "<b>æ´»èºçš„種å­</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3040
+msgid "Share Ratio Limit:"
+msgstr "分享率é™åˆ¶ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3050
+msgid "Seed Time Ratio:"
+msgstr "åšç¨®æ™‚間率:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3062
+msgid "Seed Time (m):"
+msgstr "åšç¨®æ™‚é–“ (分é˜):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3130
+msgid "Stop seeding when share ratio reaches:"
+msgstr "é”到分享率時åœæ­¢åšç¨®ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3175
+msgid "Remove torrent when share ratio reached"
+msgstr "刪除已é”到分享率的種å­"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3197
+msgid "<b>Seeding</b>"
+msgstr "<b>作種中</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3262
+msgid "<i><b><big>Proxy</big></b></i>"
+msgstr "<i><b><big>代ç†ä¼ºæœå™¨</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3333
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3517
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3701
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3886
+msgid "Host:"
+msgstr "主機:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3407
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3591
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3775
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3962
+msgid ""
+"None\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 W/ Auth\n"
+"HTTP\n"
+"HTTP W/ Auth"
+msgstr ""
+"ç„¡\n"
+"Socksv4\n"
+"Socksv5\n"
+"Socksv5 需è¦èªè­‰\n"
+"HTTP\n"
+"HTTP 需è¦èªè­‰"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3454
+msgid "<b>Peer</b>"
+msgstr "<b>用戶</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3638
+msgid "<b>Web Seed</b>"
+msgstr "<b>網路種å­</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:3822
+msgid "<b>Tracker</b>"
+msgstr "<b>追蹤伺æœå™¨</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4010
+msgid "<b>DHT</b>"
+msgstr "<b>DHT</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4067
+msgid "<b><i><big>Cache</big></i></b>"
+msgstr "<b><i><big>å¿«å–</big></i></b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4112
+msgid "Cache Size (16 KiB blocks):"
+msgstr "å¿«å–å¤§å° (16 KiB å€å¡Š):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4122
+msgid ""
+"The number of seconds from the last cached write to a piece in the write "
+"cache, to when it's forcefully flushed to disk. Default is 60 seconds."
+msgstr "從最後一次寫入快å–的時間到它強制寫入硬碟所經éŽçš„秒數。é è¨­ç‚º 60 秒。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4124
+msgid "Cache Expiry (seconds):"
+msgstr "å¿«å–失效 (秒):"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4220
+msgid ""
+"The total number of 16 KiB blocks written to disk since this session was "
+"started."
+msgstr "自此工作階段開始以來,寫入硬碟的 16 KiB å€å¡Šç¸½æ•¸ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4222
+msgid "Blocks Written:"
+msgstr "已寫入å€å¡Šï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4231
+msgid ""
+"The total number of write operations performed since this session was "
+"started."
+msgstr "自此工作階段開始以來,寫入動作的總次數。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4233
+msgid "Writes:"
+msgstr "寫入:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4244
+msgid ""
+"The ratio (blocks_written - writes) / blocks_written represents the number "
+"of saved write operations per total write operations, i.e. a kind of cache "
+"hit ratio for the write cache."
+msgstr "比率「(已寫入å€å¡Š - 寫入)/已寫入å€å¡Šã€ä»£è¡¨æ¯ä¸€å€‹å¯«å…¥æ“作內有被儲存的個數,å³å¯«å…¥ç”¨å¿«å–çš„å¿«å–命中率。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4246
+msgid "Write Cache Hit Ratio:"
+msgstr "寫入快å–命中率:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4298
+msgid "<b>Write</b>"
+msgstr "<b>寫入</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4328
+msgid ""
+"The number of blocks that were requested from the bittorrent engine (from "
+"peers), that were served from disk or cache."
+msgstr "BT 引擎 (用戶) 所è¦æ±‚çš„å€å¡Šæ•¸é‡ï¼Œé€™äº›å€å¡Šç”±ç£ç¢Ÿæˆ–å¿«å–所æ供。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4330
+msgid "Blocks Read:"
+msgstr "已讀å–å€å¡Šï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4339
+msgid "The number of blocks that were served from cache."
+msgstr "由快å–æ供的å€å¡Šå€‹æ•¸ã€‚"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4341
+msgid "Blocks Read Hit:"
+msgstr "讀å–å¿«å–命中:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4352
+msgid "The cache hit ratio for the read cache."
+msgstr "讀å–用快å–çš„å¿«å–命中率。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4354
+msgid "Read Cache Hit Ratio:"
+msgstr "讀å–å¿«å–命中率:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4403
+msgid ""
+"The total number of read operations performed since this session was started."
+msgstr "自此工作階段開始以來,讀å–動作的總次數。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4405
+msgid "Reads:"
+msgstr "讀å–:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4432
+msgid "<b>Read</b>"
+msgstr "<b>讀å–</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4462
+msgid ""
+"The number of 16 KiB blocks currently in the disk cache. This includes both "
+"read and write cache."
+msgstr "ç›®å‰æ–¼ç£ç¢Ÿå¿«å–內的 16 KiB å€å¡Šå€‹æ•¸ã€‚包括讀å–與寫入快å–。"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4464
+msgid "Cache Size:"
+msgstr "å¿«å–大å°ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4474
+msgid "Read Cache Size:"
+msgstr "讀å–å¿«å–大å°ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4513
+msgid "<b>Size</b>"
+msgstr "<b>大å°</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4556
+msgid "<b>Status</b>"
+msgstr "<b>狀態</b>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4618
+msgid "<i><b><big>Plugins</big></b></i>"
+msgstr "<i><b><big>外掛模組</big></b></i>"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4743
+msgid "Version:"
+msgstr "版本:"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4767
+msgid "Homepage:"
+msgstr "首é ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4780
+msgid "Author Email:"
+msgstr "作者電å­éƒµä»¶åœ°å€ï¼š"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4872
+msgid "_Install Plugin"
+msgstr "安è£å¤–掛(_I)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4915
+msgid "_Rescan Plugins"
+msgstr "é‡æ–°æŽƒæ外掛(_R)"
+
+#: deluge/ui/gtkui/glade/preferences_dialog.glade:4968
+msgid "_Find More Plugins"
+msgstr "尋找更多外掛(_F)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:12
+msgid "_Show Deluge"
+msgstr "顯示 Deluge 視窗(_S)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:65
+msgid "_Resume All"
+msgstr "全部續傳(_R)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:87
+#: deluge/ui/gtkui/glade/torrent_menu.glade:212
+msgid "_Download Speed Limit"
+msgstr "下載速é™(_D)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:103
+#: deluge/ui/gtkui/glade/torrent_menu.glade:227
+msgid "_Upload Speed Limit"
+msgstr "上傳速é™(_U)"
+
+#: deluge/ui/gtkui/glade/tray_menu.glade:124
+msgid "Quit & Shutdown Daemon"
+msgstr "離開並關閉常é§"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:11
+msgid "_Open Folder"
+msgstr "開啟資料夾(_O)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:49
+msgid "Resu_me"
+msgstr "繼續(_M)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:71
+msgid "Opt_ions"
+msgstr "é¸é …(_I)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:93
+msgid "_Queue"
+msgstr "佇列(_Q)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:113
+msgid "_Update Tracker"
+msgstr "更新追蹤伺æœå™¨(_U)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:152
+msgid "_Remove Torrent"
+msgstr "移除種å­(_R)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:174
+msgid "_Force Re-check"
+msgstr "強制é‡æ–°æª¢æŸ¥ (_F)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:191
+msgid "Move _Storage"
+msgstr "更改儲存ä½ç½®(_S)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:242
+msgid "_Connection Limit"
+msgstr "最大連接數é‡(_C)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:258
+msgid "Upload _Slot Limit"
+msgstr "上傳連接數é™åˆ¶(_S)"
+
+#: deluge/ui/gtkui/glade/torrent_menu.glade:273
+msgid "_Auto Managed"
+msgstr "自動管ç†(_A)"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:51
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:45
+msgid "<big><b>Remove the selected torrent?</b></big>"
+msgstr "<big><b>刪除é¸å–的種å­ï¼Ÿ</b></big>"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:66
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:57
+msgid "If you remove the data, it will be lost permanently."
+msgstr "若刪除本資料,它將永久消失。"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:127
+msgid "action"
+msgstr "動作"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:129
+msgid "Remove Files"
+msgstr "移除檔案"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog2.glade:198
+msgid "Keep Files"
+msgstr "ä¿ç•™æª”案"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:9
+msgid "Edit Trackers"
+msgstr "編輯追蹤伺æœå™¨"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:47
+msgid "<big><b>Edit Trackers</b></big>"
+msgstr "<big><b>編輯追蹤伺æœå™¨</b></big>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:224
+msgid "Add Tracker"
+msgstr "增加追蹤伺æœå™¨"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:260
+msgid "<b>Add Trackers</b>"
+msgstr "<b>增加追蹤伺æœå™¨</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:380
+msgid "Edit Tracker"
+msgstr "編輯追蹤伺æœå™¨"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:416
+msgid "<b>Edit Tracker</b>"
+msgstr "<b>編輯追蹤伺æœå™¨</b>"
+
+#: deluge/ui/gtkui/glade/edit_trackers.glade:450
+msgid "Tracker:"
+msgstr "追蹤伺æœå™¨ï¼š"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:117
+msgid "Remove With _Data"
+msgstr "與資料一起刪除(_D)"
+
+#: deluge/ui/gtkui/glade/remove_torrent_dialog.glade:155
+msgid "Remove _Torrent"
+msgstr "刪除種å­(_T)"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:9
+msgid "Move Storage"
+msgstr "變更儲存ä½ç½®"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:44
+msgid "<b>Move Storage</b>"
+msgstr "<b>變更儲存ä½ç½®</b>"
+
+#: deluge/ui/gtkui/glade/move_storage_dialog.glade:78
+msgid "Destination:"
+msgstr "目的地:"
+
+#~ msgid "seconds"
+#~ msgstr "秒"
+
+#~ msgid "Unknown"
+#~ msgstr "未知"
+
+#~ msgid "Download"
+#~ msgstr "下載"
+
+#~ msgid "Upload"
+#~ msgstr "上傳"
+
+#~ msgid "Update Tracker"
+#~ msgstr "更新伺æœå™¨"
+
+#~ msgid "No"
+#~ msgstr "å–消"
+
+#~ msgid "Remove"
+#~ msgstr "移除"
+
+#~ msgid "Yes"
+#~ msgstr "確定"
+
+#~ msgid "Mainline DHT"
+#~ msgstr "連接 DHT (分散å¼é›œæ¹Šè¡¨) 網絡"
+
+#~ msgid "Total Size"
+#~ msgstr "總大å°"
+
+#~ msgid "Pieces"
+#~ msgstr "片段"
+
+#~ msgid "Share Ratio"
+#~ msgstr "分享率"
+
+#~ msgid "Tracker Status"
+#~ msgstr "伺æœå™¨ç‹€æ…‹"
+
+#~ msgid "Details"
+#~ msgstr "詳細資訊"
+
+#~ msgid "Files"
+#~ msgstr "檔案"
+
+#~ msgid "General"
+#~ msgstr "一般"
+
+#~ msgid "0000"
+#~ msgstr "0000"
+
+#~ msgid "Maximum Connections"
+#~ msgstr "最大連線數"
+
+#~ msgid "Start"
+#~ msgstr "開始"
+
+#~ msgid "Deluge is locked"
+#~ msgstr "Deluge 已鎖ä½"
+
+#~ msgid ""
+#~ "Deluge is password protected.\n"
+#~ "To show the Deluge window, please enter your password"
+#~ msgstr ""
+#~ "Deluge å·²å—密碼ä¿è­·ã€‚\n"
+#~ "è‹¥è¦é¡¯ç¤º Deluge 視窗,請輸入您的密碼"
+
+#~ msgid "Select All"
+#~ msgstr "å…¨é¸"
+
+#~ msgid "Port"
+#~ msgstr "通訊埠"
+
+#~ msgid "_Quit"
+#~ msgstr "çµæŸ(_Q)"
+
+#~ msgid "Delete .torrent file"
+#~ msgstr "刪除 .torrent 檔"
+
+#~ msgid "Server"
+#~ msgstr "伺æœå™¨"
+
+#~ msgid "Username"
+#~ msgstr "使用者å稱"
+
+#~ msgid "Password"
+#~ msgstr "密碼"
+
+#~ msgid "Clear"
+#~ msgstr "清除"
+
+#~ msgid "Add"
+#~ msgstr "新增"
+
+#~ msgid "Availability"
+#~ msgstr "å¯å¾—性"
+
+#~ msgid "Graph"
+#~ msgstr "æµé‡åœ–"
+
+#~ msgid "Speed"
+#~ msgstr "速度"
+
+#~ msgid "New Password"
+#~ msgstr "新密碼"
+
+#~ msgid "Template"
+#~ msgstr "樣æ¿"
+
+#~ msgid "Image Only"
+#~ msgstr "åªé¡¯ç¤ºåœ–片"
+
+#~ msgid "Text and image"
+#~ msgstr "文字åŠåœ–片"
+
+#~ msgid "Set"
+#~ msgstr "設定"
+
+#~ msgid "Auto refresh:"
+#~ msgstr "自動更新間隔:"
+
+#~ msgid "Password is invalid,try again"
+#~ msgstr "密碼無效,請å†è©¦ä¸€æ¬¡"
+
+#~ msgid "Delete downloaded files."
+#~ msgstr "刪除已下載檔案"
+
+#~ msgid "Submit"
+#~ msgstr "é€å‡º"
+
+#~ msgid "<b>Speed:</b>"
+#~ msgstr "<b>速度:</b>"
+
+#~ msgid "Type"
+#~ msgstr "é¡žåž‹"
+
+#~ msgid "Disabled"
+#~ msgstr "å·²åœç”¨"
+
+#~ msgid "From"
+#~ msgstr "開始於"
+
+#~ msgid "Url"
+#~ msgstr "網å€"
+
+#~ msgid "Upload torrent"
+#~ msgstr "上傳種å­"
+
+#~ msgid "Torrent list"
+#~ msgstr "種å­æ¸…å–®"
+
+#~ msgid "Resume all"
+#~ msgstr "全部續傳"
+
+#~ msgid "Set Timeout"
+#~ msgstr "設定逾時時間"
+
+#~ msgid "Reannounce"
+#~ msgstr "é‡æ–°é€šå‘Š"
+
+#~ msgid "Next Announce"
+#~ msgstr "下次通告時間"
+
+#~ msgid "Pause all"
+#~ msgstr "全部暫åœ"
+
+#~ msgid "Login"
+#~ msgstr "登入"
+
+#~ msgid "Logout"
+#~ msgstr "登出"
+
+#~ msgid "Refresh page every:"
+#~ msgstr "æ›´æ–°é é¢é »çŽ‡:"
+
+#~ msgid "Ava"
+#~ msgstr "å¯å¾—性"
+
+#~ msgid "Eta"
+#~ msgstr "完æˆæ™‚é–“"
+
+#~ msgid "Disable"
+#~ msgstr "åœç”¨"
+
+#~ msgid "Config"
+#~ msgstr "設定"
+
+#~ msgid "Choose an url or a torrent, not both."
+#~ msgstr "è«‹é¸æ“‡ç¶²å€æˆ–種å­ï¼Œä¸è¦åŒæ™‚é¸æ“‡"
+
+#~ msgid "refresh must be > 0"
+#~ msgstr "更新頻率è¦å¤§æ–¼ 0"
+
+#~ msgid "About"
+#~ msgstr "關於"
+
+#~ msgid "# Of Files"
+#~ msgstr "檔案總數"
+
+#~ msgid "translate something"
+#~ msgstr "翻譯æˆåˆ¥ç¨®èªžè¨€"
+
+#~ msgid "Text Only"
+#~ msgstr "åªé¡¯ç¤ºæ–‡å­—"
+
+#~ msgid "Queue Position"
+#~ msgstr "佇列ä½ç½®"
+
+#~ msgid "Download Location"
+#~ msgstr "下載ä½ç½®"
+
+#~ msgid "Maximum Up Speed"
+#~ msgstr "最高上傳速度"
+
+#~ msgid "Maximum Down Speed"
+#~ msgstr "最高下載速度"
+
+#~ msgid "Forced"
+#~ msgstr "強制加密"
+
+#~ msgid "Maximum Download Speed (Kib/s)"
+#~ msgstr "最高下載速度 (Kib/s)"
+
+#~ msgid "Maximum Upload Speed (Kib/s)"
+#~ msgstr "最高上傳速度 (Kib/s)"
+
+#~ msgid "Save .torrent files to"
+#~ msgstr "儲存.torrent檔案於"
+
+#~ msgid "Store all downoads in"
+#~ msgstr "將所有新的下載放在"
+
+#~ msgid "Restart daemon and webui after changing these settings"
+#~ msgstr "儲存設定後é‡é–‹ä¼ºæœç¨‹å¼ä»¥åŠç¶²é ä»‹é¢"
+
+#~ msgid "-1 = unlimited"
+#~ msgstr "-1 = ä¸é™"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "啟用的外掛"
+
+#~ msgid "Current Password"
+#~ msgstr "ç›®å‰çš„密碼"
+
+#~ msgid "New Password (Confirm)"
+#~ msgstr "新的密碼 (確èª)"
+
+#~ msgid "These changes were saved"
+#~ msgstr "æˆåŠŸå„²å­˜è®Šæ›´"
+
+#~ msgid "∞"
+#~ msgstr "∞"
+
+#~ msgid "This folder does not exist."
+#~ msgstr "資料夾ä¸å­˜åœ¨"
+
+#~ msgid "Recheck"
+#~ msgstr "é‡æ–°æª¢å¯Ÿ"
+
+#~ msgid "Queue Top"
+#~ msgstr "在隊列上移"
+
+#~ msgid "Queue Bottom"
+#~ msgstr "在隊列下移"
+
+#~ msgid "Other.."
+#~ msgstr "其他.."
+
+#~ msgid "Total active torrents"
+#~ msgstr "æ´»èºçš„Torrent數é‡"
+
+#~ msgid "Total active seeding"
+#~ msgstr "æ´»èºçš„åšç¨®æ•¸é‡"
+
+#~ msgid "Total active downloading"
+#~ msgstr "æ´»èºçš„下載數é‡"
+
+#~ msgid "Peer-Exchange"
+#~ msgstr "使用者資訊交æ›"
+
+#~ msgid "UpNP"
+#~ msgstr "UPnP"
+
+#~ msgid "Per Torrent"
+#~ msgstr "æ¯å€‹Torrent"
+
+#~ msgid "Import Now"
+#~ msgstr "ç¾åœ¨åŒ¯å…¥"
+
+#~ msgid "page 7"
+#~ msgstr "第7é "
+
+#~ msgid "page 8"
+#~ msgstr "第8é "
+
+#~ msgid "<big><b>Add Torrents</b></big>"
+#~ msgstr "<big><b>增加Torrent檔</b></big>"
+
+#~ msgid "Maximum Half-Open Connections"
+#~ msgstr "最大åŠé–‹é€£çµçš„數é‡"
+
+#~ msgid "Maximum Upload Slots"
+#~ msgstr "最大上傳連接數é‡"
+
+#~ msgid "-1 = Unlimited"
+#~ msgstr "-1 = ä¸é™"
+
+#~ msgid "File"
+#~ msgstr "檔案"
+
+#~ msgid "Save"
+#~ msgstr "儲存"
+
+#~ msgid "No data"
+#~ msgstr "無資料"
+
+#~ msgid "Ports"
+#~ msgstr "通訊埠"
+
+#~ msgid "To"
+#~ msgstr "至"
+
+#~ msgid "Random"
+#~ msgstr "隨機"
+
+#~ msgid "Encryption"
+#~ msgstr "加密"
+
+#~ msgid "Handshake"
+#~ msgstr "æ¡æ‰‹"
+
+#~ msgid "Global"
+#~ msgstr "全域"
+
+#~ msgid "Move To"
+#~ msgstr "移動到"
+
+#~ msgid "Button style"
+#~ msgstr "按鈕類型"
+
+#~ msgid "Statistics"
+#~ msgstr "統計"
+
+#~ msgid "Delete"
+#~ msgstr "刪除"
+
+#~ msgid "Move"
+#~ msgstr "移動"
+
+#~ msgid "Stop"
+#~ msgstr "åœæ­¢"
+
+#~ msgid "Inactive"
+#~ msgstr "ä¸æ´»èº"
+
+#~ msgid "gtk-connect"
+#~ msgstr "gtk-連接"
+
+#~ msgid "page 6"
+#~ msgstr "第6é "
+
+#~ msgid "Homepage"
+#~ msgstr "首é "
+
+#~ msgid "Community"
+#~ msgstr "社群"
+
+#~ msgid "FAQ"
+#~ msgstr "常見å•é¡Œ"
+
+#~ msgid "Filters"
+#~ msgstr "éŽæ¿¾å™¨"
+
+#~ msgid "no uri"
+#~ msgstr "沒有URI"
+
+#~ msgid "Error in torrent options."
+#~ msgstr "種å­æª”案有錯誤發生"
+
+#~ msgid "Add In Paused State"
+#~ msgstr "新增為暫åœç‹€æ…‹"
+
+#~ msgid "Compact Allocation"
+#~ msgstr "緊密é…ç½®"
+
+#~ msgid "Prioritize first and last pieces"
+#~ msgstr "優先下載檔案的頭尾部份"
+
+#~ msgid "Extra's"
+#~ msgstr "é¡å¤–çš„"
+
+#~ msgid "Outbound"
+#~ msgstr "æµå‡º"
+
+#~ msgid "Maximum Connection Attempts per Second"
+#~ msgstr "æ¯ç§’最大連接數é‡"
+
+#~ msgid "Auto Add folder"
+#~ msgstr "自動新增資料夾"
+
+#~ msgid "Stop seeding when ratio reaches"
+#~ msgstr "比例到é”時åœæ­¢ä½œç¨®"
+
+#~ msgid "Old password is invalid"
+#~ msgstr "舊密碼錯誤"
+
+#~ msgid "New Password is not equal to New Password(confirm)"
+#~ msgstr "二次新密碼ä¸ç›¸åŒ"
+
+#~ msgid "Cache templates"
+#~ msgstr "å¿«å–範本"
+
+#~ msgid "Stop seed at ratio"
+#~ msgstr "åœæ­¢ä½œç¨®åœ¨æ¯”例"
+
+#~ msgid "Correct the errors above and try again"
+#~ msgstr "修正錯誤並é‡è©¦"
+
+#~ msgid "Enter a whole number."
+#~ msgstr "請輸入完整的數字"
+
+#~ msgid "Enter a valid value."
+#~ msgstr "請輸入åˆæ³•çš„值"
+
+#~ msgid "This field is required."
+#~ msgstr "此為必è¦æ¬„ä½"
+
+#~ msgid ""
+#~ "Select a valid choice. That choice is not one of the available choices."
+#~ msgstr "該é¸é …ä¸å¯ç”¨ï¼Œè«‹é¸æ“‡æ­£ç¢ºçš„é¸é …。"
+
+#, python-format
+#~ msgid "Select a valid choice. %s is not one of the available choices."
+#~ msgstr "%s é¸é …ä¸å¯ç”¨ï¼Œè«‹é¸æ“‡æ­£ç¢ºçš„é¸é …。"
+
+#~ msgid "BlockList"
+#~ msgstr "黑åå–®"
+
+#~ msgid "gtk-edit"
+#~ msgstr "gtk-edit"
+
+#~ msgid "0x00"
+#~ msgstr "0x00"
+
+#~ msgid "page 11"
+#~ msgstr "第11é "
+
+#~ msgid "page 12"
+#~ msgstr "第12é "
+
+#~ msgid "page 10"
+#~ msgstr "第10é "
+
+#~ msgid "Error setting label options"
+#~ msgstr "標籤é¸é …設定錯誤"
+
+#~ msgid "Check for every (days)"
+#~ msgstr "æ¯ (天) 檢查"
+
+#~ msgid "Import on daemon startup"
+#~ msgstr "當 daemon 啟動時匯入"
+
+#~ msgid "Times to attempt download"
+#~ msgstr "下載嘗試次數"
+
+#, python-format
+#~ msgid "Importing %s"
+#~ msgstr "%s 匯入中"
+
+#, python-format
+#~ msgid "Downloading %.2f%%"
+#~ msgstr "%.2f%% 下載中"
+
+#, python-format
+#~ msgid "Blocked Ranges: %s"
+#~ msgstr "å°é–‰ç¯„åœï¼š%s"
+
+#~ msgid "Refresh status"
+#~ msgstr "狀態é‡æ–°æ•´ç†"
+
+#~ msgid ""
+#~ "This program is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the Free "
+#~ "Software Foundation; either version 3 of the License, or (at your option) "
+#~ "any later version. This program is distributed in the hope that it will be "
+#~ "useful, but WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details. You should have received a copy of the GNU "
+#~ "General Public License along with this program; if not, see "
+#~ "<http://www.gnu.org/licenses>."
+#~ msgstr ""
+#~ "本程å¼ç‚ºè‡ªç”±è»Ÿé«”:您å¯ä»¥åœ¨ç¬¦åˆ 自由軟體基金會(Free Software Foundation) 發佈的 GNU通用公共許å¯è­‰(GNU General "
+#~ "Public License) "
+#~ "é™åˆ¶ä¸‹é‡æ–°æ•£ä½ˆã€ä¿®æ”¹æœ¬è»Ÿé«”;您å¯ä»¥é¸æ“‡ç¬¬ä¸‰ç‰ˆæˆ–任何後續的版本。期望本程å¼èƒ½å¸¶ä¾†å¹«åŠ©ï¼Œä½†ä¸åŒ…å«ä»»ä½•ä¿è­‰ï¼›å³ä¾¿æ˜¯å¯å”®æ€§æˆ–é©ç”¨æ–¼ä»»ä½•ç‰¹å®šç›®çš„çš„ä¿è­‰ã€‚細節請åƒé–± "
+#~ "GNU通用公共許å¯è­‰(GNU General Public License)。GNU通用公共許å¯è­‰(GNU General Public "
+#~ "License) 您應該會隨著本程å¼ä¸€èµ·å–得;如果找ä¸åˆ°ï¼Œè«‹åƒé–± <http://www.gnu.org/licenses> 。"
+
+#~ msgid "no label"
+#~ msgstr "沒有標籤"
+
+#~ msgid "Inbound"
+#~ msgstr "å‘å…§"
+
+#~ msgid "Either"
+#~ msgstr "任一"
+
+#~ msgid "Connect"
+#~ msgstr "連線"
+
+#~ msgid "Level"
+#~ msgstr "等級"
+
+#~ msgid "Auto Add enabled"
+#~ msgstr "自動新增啟用"
+
+#~ msgid "Enter a number."
+#~ msgstr "輸入一個數字。"
+
+#~ msgid "No file was submitted. Check the encoding type on the form."
+#~ msgstr "沒有檔案被寄出。 檢查表單的編碼種類。"
+
+#~ msgid "Enter a valid e-mail address."
+#~ msgstr "輸入有效電å­éƒµä»¶ä½å€ã€‚"
+
+#~ msgid "Enter a valid date."
+#~ msgstr "輸入有效日期。"
+
+#~ msgid "Enter a valid time."
+#~ msgstr "輸入有效時間。"
+
+#, python-format
+#~ msgid ""
+#~ "Ensure that there are no more than %s digits before the decimal point."
+#~ msgstr "確ä¿å°æ•¸é»žå‰ä¸è¶…éŽ %s ä½æ•¸ã€‚"
+
+#~ msgid ""
+#~ "Upload a valid image. The file you uploaded was either not an image or a "
+#~ "corrupted image."
+#~ msgstr "上傳有效的圖片。 您上傳的檔案ä¸æ˜¯åœ–片,或是已經毀æ。"
+
+#~ msgid "No file was submitted."
+#~ msgstr "沒有檔案被寄出。"
+
+#~ msgid "Auto refresh (seconds)"
+#~ msgstr "自動é‡æ–°æ•´ç† (秒)"
+
+#~ msgid "Error in Path."
+#~ msgstr "路徑錯誤。"
+
+#~ msgid "Enter a valid URL."
+#~ msgstr "輸入有效的網å€ã€‚"
+
+#~ msgid "Enter a valid IPv4 address."
+#~ msgstr "輸入有效的 IPv4 ä½å€ã€‚"
+
+#~ msgid "This URL appears to be a broken link."
+#~ msgstr "這個網å€æœ‰éŒ¯ã€‚"
+
+#~ msgid "Manually restart webui to apply changes."
+#~ msgstr "手動é‡æ–°å•Ÿå‹•ç¶²é ä»‹é¢ä»¥å¥—用變更。"
+
+#~ msgid "Show keyword search"
+#~ msgstr "顯示關éµå­—æœå°‹"
+
+#~ msgid "Show sidebar"
+#~ msgstr "顯示å´é‚Šæ¬„"
+
+#, python-format
+#~ msgid "Key not found at '%s'"
+#~ msgstr "無法在 '%s' 找到金鑰"
+
+#, python-format
+#~ msgid "Certificate not found at '%s'"
+#~ msgstr "無法在 '%s' 找到證書"
+
+#~ msgid "Sidebar"
+#~ msgstr "å´é‚Šæ¬„"
+
+#~ msgid "Cancel"
+#~ msgstr "å–消"
+
+#~ msgid "Active time"
+#~ msgstr "活動時間"
+
+#~ msgid "... and delete Torrent file"
+#~ msgstr "... 與刪除 Torrent 檔案"
+
+#~ msgid "... and delete Downloaded files"
+#~ msgstr "... 與刪除已下載的檔案"
+
+#~ msgid "... and delete All files"
+#~ msgstr "... 與刪除所有檔案"
+
+#~ msgid "Connected to"
+#~ msgstr "連線到"
+
+#~ msgid "Connection Limit"
+#~ msgstr "連線é™åˆ¶"
+
+#~ msgid "Deluge : Torrent List"
+#~ msgstr "Deluge : Torrent 清單"
+
+#~ msgid "Deluge Login"
+#~ msgstr "Deluge 登入"
+
+#~ msgid "Disk Space"
+#~ msgstr "ç£è«œç©ºé–“"
+
+#~ msgid "Do not download"
+#~ msgstr "ä¸è¦ä¸‹è¼‰"
+
+#~ msgid "Force Recheck"
+#~ msgstr "強制é‡æ–°æª¢æŸ¥"
+
+#~ msgid "Filter on a keyword"
+#~ msgstr "é—œéµå­—篩é¸"
+
+#~ msgid "Normal priority"
+#~ msgstr "一般優先權"
+
+#~ msgid "No Incoming Connections"
+#~ msgstr "沒有進入的連線"
+
+#~ msgid "Move torrent"
+#~ msgstr "移動 torrent"
+
+#~ msgid "Label torrent"
+#~ msgstr "為 Torrent 加上標籤"
+
+#~ msgid "From Url"
+#~ msgstr "從網å€"
+
+#~ msgid "Keyword"
+#~ msgstr "é—œéµå­—"
+
+#~ msgid "Highest priority"
+#~ msgstr "最高優先權"
+
+#~ msgid "Seed rank"
+#~ msgstr "種å­ç­‰ç´š"
+
+#~ msgid "Seeding time"
+#~ msgstr "作種時間"
+
+#~ msgid "Ok"
+#~ msgstr "確定"
+
+#~ msgid "Not Connected to a daemon"
+#~ msgstr "沒有連線到 daemon"
+
+#~ msgid "U/L Speed Limit"
+#~ msgstr "上傳速度é™åˆ¶"
+
+#~ msgid "Update"
+#~ msgstr "æ›´æ–°"
+
+#~ msgid "Search"
+#~ msgstr "æœå°‹"
+
+#~ msgid "Restart"
+#~ msgstr "é‡æ–°å•Ÿå‹•"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB"
+
+#~ msgid "Remove torrent when ratio reached"
+#~ msgstr "分享率到é”時移除種å­æª”案"
+
+#~ msgid "max_connections"
+#~ msgstr "最大連線數目"
+
+#~ msgid "max_upload_speed"
+#~ msgstr "最低上傳速度"
+
+#~ msgid "max_download_speed"
+#~ msgstr "最高下載速度"
+
+#~ msgid "auto_add"
+#~ msgstr "自動新增"
+
+#, python-format
+#~ msgid ""
+#~ "This email is to inform you that Deluge has finished downloading %s , "
+#~ " which includes %i files.\n"
+#~ "To stop receiving these alerts, simply turn off email "
+#~ "notification in Deluge's preferences.\n"
+#~ "\n"
+#~ "Thank you,\n"
+#~ "Deluge"
+#~ msgstr ""
+#~ "這å°éƒµä»¶æ˜¯Deluge通知你%s(共包å«%i個檔案)已經下載完æˆã€‚\n"
+#~ "想è¦åœæ­¢æ”¶å–這類的通知,åªæœ‰é—œé–‰Delugeå好設定中的電å­éƒµä»¶é€šçŸ¥å³å¯ã€‚\n"
+#~ "\n"
+#~ "è¬è¬ä½ ï¼Œ\n"
+#~ "Deluge"
+
+#~ msgid "Socksv5"
+#~ msgstr "Socksv5"
+
+#~ msgid "Socksv4"
+#~ msgstr "Socksv4"
+
+#, python-format
+#~ msgid "Ensure this value is less than or equal to %s."
+#~ msgstr "確èªé€™å€‹å€¼å°æ–¼ç­‰æ–¼%s。"
+
+#~ msgid "HTTP"
+#~ msgstr "HTTP"
+
+#, python-format
+#~ msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+#~ msgstr "確ä¿æœ¬å€¼è‡³å¤šåˆ° %(max)d 個字元(共有 %(length)d)"
+
+#, python-format
+#~ msgid "Ensure this value is greater than or equal to %s."
+#~ msgstr "確èªé€™å€‹å€¼å¤§æ–¼ç­‰æ–¼%s。"
+
+#~ msgid "Enter a valid date/time."
+#~ msgstr "輸入有效的日期/時間。"
+
+#~ msgid "Https"
+#~ msgstr "Https"
+
+#~ msgid "Upload Slot Limit"
+#~ msgstr "上傳連接數é™åˆ¶"
+
+#~ msgid "High priority"
+#~ msgstr "高優先權"
+
+#~ msgid "max_upload_slots"
+#~ msgstr "最大上傳連接數"
+
+#~ msgid "Show trackers"
+#~ msgstr "顯示追蹤伺æœå™¨"
+
+#~ msgid "auto_add_trackers"
+#~ msgstr "自動新增追蹤伺æœå™¨"
+
+#~ msgid "D/L Speed Limit"
+#~ msgstr "上傳/下載速度é™åˆ¶"
+
+#~ msgid "The submitted file is empty."
+#~ msgstr "æ交的檔案是空的。"
+
+#~ msgid "State"
+#~ msgstr "狀態"
+
+#~ msgid "Timeout (seconds)"
+#~ msgstr "逾時(秒)"
+
+#, python-format
+#~ msgid "%.2f%%"
+#~ msgstr "%.2f%%"
+
+#~ msgid "Downloading.."
+#~ msgstr "下載中..."
+
+#, python-format
+#~ msgid "Failed to download : %s"
+#~ msgstr "無法下載:%s"
+
+#~ msgid ""
+#~ "Deluge\n"
+#~ "Not Connected.."
+#~ msgstr ""
+#~ "Deluge\n"
+#~ "未連接.."
+
+#~ msgid "<b><big>Deluge is password protected!</big></b>"
+#~ msgstr "<b><big>Deluge å·²å—密碼ä¿è­·ï¼</big></b>"
+
+#~ msgid "<i>Enter your password to continue</i>"
+#~ msgstr "<i>輸入密碼以便繼續</i>"
+
+#, python-format
+#~ msgid "Including %i files"
+#~ msgstr "åŒ…å« %i 項檔案"
+
+#, python-format
+#~ msgid "%s is not a valid URL."
+#~ msgstr "%s ä¸æ˜¯åˆæ³•çš„網å€ã€‚"
+
+#~ msgid ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB\n"
+#~ "1 MiB\n"
+#~ "2 MiB\n"
+#~ "4 MiB\n"
+#~ "8 MiB\n"
+#~ msgstr ""
+#~ "32 KiB\n"
+#~ "64 KiB\n"
+#~ "128 KiB\n"
+#~ "256 KiB\n"
+#~ "512 KiB\n"
+#~ "1 MiB\n"
+#~ "2 MiB\n"
+#~ "4 MiB\n"
+#~ "8 MiB\n"
+
+#~ msgid "Low Free Space"
+#~ msgstr "ä¸è¶³çš„å¯ç”¨ç©ºé–“"
+
+#~ msgid "Low Disk Space Warning"
+#~ msgstr "ç£ç¢Ÿç©ºé–“ä¸è¶³è­¦å‘Š"
+
+#~ msgid "You're running low on disk space:\n"
+#~ msgstr "您的ç£ç¢Ÿç©ºé–“å³å°‡ç”¨ç½„:\n"
+
+#, python-format
+#~ msgid " %s%% ocupation in %s\n"
+#~ msgstr " %s%% 的佔用空間於 %s\n"
+
+#~ msgid "Consider low when"
+#~ msgstr "評定空間ä¸è¶³ï¼Œç•¶æœ‰"
+
+#~ msgid "of the disk is occupied."
+#~ msgstr "çš„ç£ç¢Ÿå¤§å°è¢«ä½”用。"
+
+#~ msgid "<b>Free Space Checking</b>"
+#~ msgstr "<b>檢查å¯ç”¨ç©ºé–“中</b>"
+
+#~ msgid ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "this doesn't do anything yet..\n"
+#~ msgstr ""
+#~ "tracker1.org\n"
+#~ "tracker2.com\n"
+#~ "這是無效的..\n"
diff --git a/deluge/log.py b/deluge/log.py
new file mode 100644
index 0000000..75e8308
--- /dev/null
+++ b/deluge/log.py
@@ -0,0 +1,348 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2010 Pedro Algarvio <pedro@algarvio.me>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""Logging functions"""
+from __future__ import unicode_literals
+
+import inspect
+import logging
+import logging.handlers
+import os
+import sys
+
+from twisted.internet import defer
+from twisted.python.log import PythonLoggingObserver
+
+from deluge import common
+
+__all__ = ('setup_logger', 'set_logger_level', 'get_plugin_logger', 'LOG')
+
+LoggingLoggerClass = logging.getLoggerClass()
+
+if 'dev' in common.get_version():
+ DEFAULT_LOGGING_FORMAT = '%%(asctime)s.%%(msecs)03.0f [%%(levelname)-8s][%%(name)-%ds:%%(lineno)-4d] %%(message)s'
+else:
+ DEFAULT_LOGGING_FORMAT = (
+ '%%(asctime)s [%%(levelname)-8s][%%(name)-%ds:%%(lineno)-4d] %%(message)s'
+ )
+MAX_LOGGER_NAME_LENGTH = 10
+
+
+class Logging(LoggingLoggerClass):
+ def __init__(self, logger_name):
+ super(Logging, self).__init__(logger_name)
+
+ # This makes module name padding increase to the biggest module name
+ # so that logs keep readability.
+ global MAX_LOGGER_NAME_LENGTH
+ if len(logger_name) > MAX_LOGGER_NAME_LENGTH:
+ MAX_LOGGER_NAME_LENGTH = len(logger_name)
+ for handler in logging.getLogger().handlers:
+ handler.setFormatter(
+ logging.Formatter(
+ DEFAULT_LOGGING_FORMAT % MAX_LOGGER_NAME_LENGTH,
+ datefmt='%H:%M:%S',
+ )
+ )
+
+ @defer.inlineCallbacks
+ def garbage(self, msg, *args, **kwargs):
+ yield LoggingLoggerClass.log(self, 1, msg, *args, **kwargs)
+
+ @defer.inlineCallbacks
+ def trace(self, msg, *args, **kwargs):
+ yield LoggingLoggerClass.log(self, 5, msg, *args, **kwargs)
+
+ @defer.inlineCallbacks
+ def debug(self, msg, *args, **kwargs):
+ yield LoggingLoggerClass.debug(self, msg, *args, **kwargs)
+
+ @defer.inlineCallbacks
+ def info(self, msg, *args, **kwargs):
+ yield LoggingLoggerClass.info(self, msg, *args, **kwargs)
+
+ @defer.inlineCallbacks
+ def warning(self, msg, *args, **kwargs):
+ yield LoggingLoggerClass.warning(self, msg, *args, **kwargs)
+
+ warn = warning
+
+ @defer.inlineCallbacks
+ def error(self, msg, *args, **kwargs):
+ yield LoggingLoggerClass.error(self, msg, *args, **kwargs)
+
+ @defer.inlineCallbacks
+ def critical(self, msg, *args, **kwargs):
+ yield LoggingLoggerClass.critical(self, msg, *args, **kwargs)
+
+ @defer.inlineCallbacks
+ def exception(self, msg, *args, **kwargs):
+ yield LoggingLoggerClass.exception(self, msg, *args, **kwargs)
+
+ def findCaller(self, stack_info=False): # NOQA: N802
+ f = logging.currentframe().f_back
+ rv = '(unknown file)', 0, '(unknown function)'
+ while hasattr(f, 'f_code'):
+ co = f.f_code
+ filename = os.path.normcase(co.co_filename)
+ if filename in (
+ __file__.replace('.pyc', '.py'),
+ defer.__file__.replace('.pyc', '.py'),
+ ):
+ f = f.f_back
+ continue
+ if common.PY2:
+ rv = (filename, f.f_lineno, co.co_name)
+ else:
+ rv = (filename, f.f_lineno, co.co_name, None)
+ break
+ return rv
+
+
+levels = {
+ 'info': logging.INFO,
+ 'warn': logging.WARNING,
+ 'warning': logging.WARNING,
+ 'error': logging.ERROR,
+ 'none': logging.CRITICAL,
+ 'debug': logging.DEBUG,
+ 'trace': 5,
+ 'garbage': 1,
+}
+
+
+def setup_logger(
+ level='error',
+ filename=None,
+ filemode='w',
+ logrotate=None,
+ output_stream=sys.stdout,
+ twisted_observer=True,
+):
+ """
+ Sets up the basic logger and if `:param:filename` is set, then it will log
+ to that file instead of stdout.
+
+ Args:
+ level (str): The log level to use (Default: 'error')
+ filename (str, optional): The log filename. Default is None meaning log
+ to terminal
+ filemode (str): The filemode to use when opening the log file
+ logrotate (int, optional): The size of the logfile in bytes when enabling
+ log rotation (Default is None meaning disabled)
+ output_stream (file descriptor): File descriptor to log to if not logging to file
+ twisted_observer (bool): Whether to setup the custom twisted logging observer.
+ """
+ if logging.getLoggerClass() is not Logging:
+ logging.setLoggerClass(Logging)
+ logging.addLevelName(levels['trace'], 'TRACE')
+ logging.addLevelName(levels['garbage'], 'GARBAGE')
+
+ level = levels.get(level, logging.ERROR)
+
+ root_logger = logging.getLogger()
+
+ if filename and logrotate:
+ handler = logging.handlers.RotatingFileHandler(
+ filename, maxBytes=logrotate, backupCount=5, encoding='utf-8'
+ )
+ elif filename and filemode == 'w':
+ handler_cls = logging.FileHandler
+ if not common.windows_check():
+ handler_cls = getattr(
+ logging.handlers, 'WatchedFileHandler', logging.FileHandler
+ )
+ handler = handler_cls(filename, mode=filemode, encoding='utf-8')
+ else:
+ handler = logging.StreamHandler(stream=output_stream)
+
+ handler.setLevel(level)
+
+ formatter = logging.Formatter(
+ DEFAULT_LOGGING_FORMAT % MAX_LOGGER_NAME_LENGTH, datefmt='%H:%M:%S'
+ )
+
+ handler.setFormatter(formatter)
+
+ # Check for existing handler to prevent duplicate logging.
+ if root_logger.handlers:
+ for handle in root_logger.handlers:
+ if not isinstance(handle, type(handler)):
+ root_logger.addHandler(handler)
+ else:
+ root_logger.addHandler(handler)
+ root_logger.setLevel(level)
+
+ if twisted_observer:
+ twisted_logging = TwistedLoggingObserver()
+ twisted_logging.start()
+
+
+class TwistedLoggingObserver(PythonLoggingObserver):
+ """
+ Custom logging class to fix missing exception tracebacks in log output with new
+ twisted.logger module in twisted version >= 15.2.
+
+ Related twisted bug ticket: https://twistedmatrix.com/trac/ticket/7927
+
+ """
+
+ def __init__(self):
+ PythonLoggingObserver.__init__(self, loggerName='twisted')
+
+ def emit(self, event_dict):
+ log = logging.getLogger(__name__)
+ if 'log_failure' in event_dict:
+ fmt = '%(log_namespace)s \n%(log_failure)s'
+ getattr(LoggingLoggerClass, event_dict['log_level'].name)(
+ log, fmt % (event_dict)
+ )
+ else:
+ PythonLoggingObserver.emit(self, event_dict)
+
+
+def tweak_logging_levels():
+ """This function allows tweaking the logging levels for all or some loggers.
+ This is mostly usefull for developing purposes hence the contents of the
+ file are NOT like regular deluge config file's.
+
+ To use is, create a file named "logging.conf" on your Deluge's config dir
+ with contents like for example:
+ deluge:warn
+ deluge.core:debug
+ deluge.plugin:error
+
+ What the above mean is the logger "deluge" will be set to the WARN level,
+ the "deluge.core" logger will be set to the DEBUG level and the
+ "deluge.plugin" will be set to the ERROR level.
+
+ Remember, one rule per line and this WILL override the setting passed from
+ the command line.
+ """
+ from deluge import configmanager
+
+ logging_config_file = os.path.join(configmanager.get_config_dir(), 'logging.conf')
+ if not os.path.isfile(logging_config_file):
+ return
+ log = logging.getLogger(__name__)
+ log.warning(
+ 'logging.conf found! tweaking logging levels from %s', logging_config_file
+ )
+ with open(logging_config_file, 'r') as _file:
+ for line in _file:
+ if line.strip().startswith('#'):
+ continue
+ name, level = line.strip().split(':')
+ if level not in levels:
+ continue
+
+ log.warning('Setting logger "%s" to logging level "%s"', name, level)
+ set_logger_level(level, name)
+
+
+def set_logger_level(level, logger_name=None):
+ """
+ Sets the logger level.
+
+ :param level: str, a string representing the desired level
+ :param logger_name: str, a string representing desired logger name for which
+ the level should change. The default is "None" will tweak
+ the root logger level.
+
+ """
+ logging.getLogger(logger_name).setLevel(levels.get(level, 'error'))
+
+
+def get_plugin_logger(logger_name):
+ import warnings
+
+ stack = inspect.stack()
+ stack.pop(0) # The logging call from this module
+ module_stack = stack.pop(0) # The module that called the log function
+ caller_module = inspect.getmodule(module_stack[0])
+ # In some weird cases caller_module might be None, try to continue
+ caller_module_name = getattr(caller_module, '__name__', '')
+ warnings.warn_explicit(
+ DEPRECATION_WARNING,
+ DeprecationWarning,
+ module_stack[1],
+ module_stack[2],
+ caller_module_name,
+ )
+
+ if 'deluge.plugins.' in logger_name:
+ return logging.getLogger(logger_name)
+ return logging.getLogger('deluge.plugin.%s' % logger_name)
+
+
+DEPRECATION_WARNING = """You seem to be using old style logging on your code, ie:
+ from deluge.log import LOG as log
+
+or:
+ from deluge.log import get_plugin_logger
+
+This has been deprecated in favour of an enhanced logging system and both "LOG"
+and "get_plugin_logger" will be removed on the next major version release of Deluge,
+meaning, code will break, specially plugins.
+If you're seeing this message and you're not the developer of the plugin which
+triggered this warning, please report to it's author.
+If you're the developer, please stop using the above code and instead use:
+
+ import logging
+ log = logging.getLogger(__name__)
+
+
+The above will result in, regarding the "Label" plugin for example a log message similar to:
+ 15:33:54 [deluge.plugins.label.core:78 ][INFO ] *** Start Label plugin ***
+
+Triggering code:
+"""
+
+
+class _BackwardsCompatibleLOG(object):
+ def __getattribute__(self, name):
+ import warnings
+
+ logger_name = 'deluge'
+ stack = inspect.stack()
+ stack.pop(0) # The logging call from this module
+ module_stack = stack.pop(0) # The module that called the log function
+ caller_module = inspect.getmodule(module_stack[0])
+ # In some weird cases caller_module might be None, try to continue
+ caller_module_name = getattr(caller_module, '__name__', '')
+ warnings.warn_explicit(
+ DEPRECATION_WARNING,
+ DeprecationWarning,
+ module_stack[1],
+ module_stack[2],
+ caller_module_name,
+ )
+ if caller_module:
+ for member in stack:
+ module = inspect.getmodule(member[0])
+ if not module:
+ continue
+ if module.__name__ in (
+ 'deluge.plugins.pluginbase',
+ 'deluge.plugins.init',
+ ):
+ logger_name += '.plugin.%s' % caller_module_name
+ # Monkey Patch The Plugin Module
+ caller_module.log = logging.getLogger(logger_name)
+ break
+ else:
+ logging.getLogger(logger_name).warning(
+ "Unable to monkey-patch the calling module's `log` attribute! "
+ 'You should really update and rebuild your plugins...'
+ )
+ return getattr(logging.getLogger(logger_name), name)
+
+
+LOG = _BackwardsCompatibleLOG()
diff --git a/deluge/maketorrent.py b/deluge/maketorrent.py
new file mode 100644
index 0000000..528638e
--- /dev/null
+++ b/deluge/maketorrent.py
@@ -0,0 +1,379 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import os
+from hashlib import sha1 as sha
+
+from deluge.bencode import bencode
+from deluge.common import get_path_size, utf8_encode_structure
+
+
+class InvalidPath(Exception):
+ """Raised when an invalid path is supplied."""
+
+ pass
+
+
+class InvalidPieceSize(Exception):
+ """Raised when an invalid piece size is set.
+
+ Note:
+ Piece sizes must be multiples of 16KiB.
+ """
+
+ pass
+
+
+class TorrentMetadata(object):
+ """This class is used to create .torrent files.
+
+ Examples:
+
+ >>> t = TorrentMetadata()
+ >>> t.data_path = '/tmp/torrent'
+ >>> t.comment = 'My Test Torrent'
+ >>> t.trackers = [['http://tracker.openbittorent.com']]
+ >>> t.save('/tmp/test.torrent')
+
+ """
+
+ def __init__(self):
+ self.__data_path = None
+ self.__piece_size = 0
+ self.__comment = ''
+ self.__private = False
+ self.__trackers = []
+ self.__webseeds = []
+ self.__pad_files = False
+
+ def save(self, torrent_path, progress=None):
+ """Creates and saves the torrent file to `path`.
+
+ Args:
+ torrent_path (str): Location to save the torrent file.
+ progress(func, optional): The function to be called when a piece is hashed. The
+ provided function should be in the format `func(num_completed, num_pieces)`.
+
+ Raises:
+ InvalidPath: If the data_path has not been set.
+
+ """
+ if not self.data_path:
+ raise InvalidPath('Need to set a data_path!')
+
+ torrent = {'info': {}}
+
+ if self.comment:
+ torrent['comment'] = self.comment
+
+ if self.private:
+ torrent['info']['private'] = True
+
+ if self.trackers:
+ torrent['announce'] = self.trackers[0][0]
+ torrent['announce-list'] = self.trackers
+ else:
+ torrent['announce'] = ''
+
+ if self.webseeds:
+ httpseeds = []
+ webseeds = []
+ for w in self.webseeds:
+ if w.endswith('.php'):
+ httpseeds.append(w)
+ else:
+ webseeds.append(w)
+
+ if httpseeds:
+ torrent['httpseeds'] = httpseeds
+ if webseeds:
+ torrent['url-list'] = webseeds
+
+ datasize = get_path_size(self.data_path)
+
+ if self.piece_size:
+ piece_size = self.piece_size * 1024
+ else:
+ # We need to calculate a piece size
+ piece_size = 16384
+ while (datasize // piece_size) > 1024 and piece_size < (8192 * 1024):
+ piece_size *= 2
+
+ # Calculate the number of pieces we will require for the data
+ num_pieces = datasize // piece_size
+ if datasize % piece_size:
+ num_pieces += 1
+
+ torrent['info']['piece length'] = piece_size
+ torrent['info']['name'] = os.path.split(self.data_path)[1]
+
+ # Create the info
+ if os.path.isdir(self.data_path):
+ files = []
+ padding_count = 0
+ # Collect a list of file paths and add padding files if necessary
+ for (dirpath, dirnames, filenames) in os.walk(self.data_path):
+ for index, filename in enumerate(filenames):
+ size = get_path_size(
+ os.path.join(self.data_path, dirpath, filename)
+ )
+ p = dirpath[len(self.data_path) :]
+ p = p.lstrip('/')
+ p = p.split('/')
+ if p[0]:
+ p += [filename]
+ else:
+ p = [filename]
+ files.append((size, p))
+ # Add a padding file if necessary
+ if self.pad_files and (index + 1) < len(filenames):
+ left = size % piece_size
+ if left:
+ p = list(p)
+ p[-1] = '_____padding_file_' + str(padding_count)
+ files.append((piece_size - left, p))
+ padding_count += 1
+
+ # Run the progress function with 0 completed pieces
+ if progress:
+ progress(0, num_pieces)
+
+ fs = []
+ pieces = []
+ # Create the piece hashes
+ buf = b''
+ for size, path in files:
+ path = [s.encode('UTF-8') for s in path]
+ fs.append({b'length': size, b'path': path})
+ if path[-1].startswith(b'_____padding_file_'):
+ buf += b'\0' * size
+ pieces.append(sha(buf).digest())
+ buf = b''
+ fs[-1][b'attr'] = b'p'
+ else:
+ with open(
+ os.path.join(self.data_path.encode('utf8'), *path), 'rb'
+ ) as _file:
+ r = _file.read(piece_size - len(buf))
+ while r:
+ buf += r
+ if len(buf) == piece_size:
+ pieces.append(sha(buf).digest())
+ # Run the progress function if necessary
+ if progress:
+ progress(len(pieces), num_pieces)
+ buf = b''
+ else:
+ break
+ r = _file.read(piece_size - len(buf))
+ torrent['info']['files'] = fs
+ if buf:
+ pieces.append(sha(buf).digest())
+ if progress:
+ progress(len(pieces), num_pieces)
+ buf = ''
+
+ elif os.path.isfile(self.data_path):
+ torrent['info']['length'] = get_path_size(self.data_path)
+ pieces = []
+
+ with open(self.data_path, 'rb') as _file:
+ r = _file.read(piece_size)
+ while r:
+ pieces.append(sha(r).digest())
+ if progress:
+ progress(len(pieces), num_pieces)
+
+ r = _file.read(piece_size)
+
+ torrent['info']['pieces'] = b''.join(pieces)
+
+ # Write out the torrent file
+ with open(torrent_path, 'wb') as _file:
+ _file.write(bencode(utf8_encode_structure(torrent)))
+
+ def get_data_path(self):
+ """Get the path to the files that the torrent will contain.
+
+ Note:
+ It can be either a file or a folder.
+
+ Returns:
+ str: The torrent data path, either a file or a folder.
+
+ """
+ return self.__data_path
+
+ def set_data_path(self, path):
+ """Set the path to the files (data) that the torrent will contain.
+
+ Note:
+ This property needs to be set before the torrent file can be created and saved.
+
+ Args:
+ path (str): The path to the torrent data and can be either a file or a folder.
+
+ Raises:
+ InvalidPath: If the path is not found.
+
+ """
+ if os.path.exists(path) and (os.path.isdir(path) or os.path.isfile(path)):
+ self.__data_path = os.path.abspath(path)
+ else:
+ raise InvalidPath('No such file or directory: %s' % path)
+
+ def get_piece_size(self):
+ """The size of the pieces.
+
+ Returns:
+ int: The piece size in multiples of 16 KiBs.
+ """
+ return self.__piece_size
+
+ def set_piece_size(self, size):
+ """Set piece size.
+
+ Note:
+ If no piece size is set, one will be automatically selected to
+ produce a torrent with less than 1024 pieces or the smallest possible
+ with a 8192KiB piece size.
+
+ Args:
+ size (int): The desired piece size in multiples of 16 KiBs.
+
+ Raises:
+ InvalidPieceSize: If the piece size is not a valid multiple of 16 KiB.
+
+ """
+ if size % 16 and size:
+ raise InvalidPieceSize('Piece size must be a multiple of 16 KiB')
+ self.__piece_size = size
+
+ def get_comment(self):
+ """Get the torrent comment.
+
+ Returns:
+ str: An informational string about the torrent.
+
+ """
+ return self.__comment
+
+ def set_comment(self, comment):
+ """Set the comment for the torrent.
+
+ Args:
+ comment (str): An informational string about the torrent.
+
+ """
+ self.__comment = comment
+
+ def get_private(self):
+ """Get the private flag of the torrent.
+
+ Returns:
+ bool: True if private flag has been set, else False.
+
+ """
+ return self.__private
+
+ def set_private(self, private):
+ """Set the torrent private flag.
+
+ Note:
+ Private torrents only announce to trackers and will not use DHT or
+ Peer Exchange. See http://bittorrent.org/beps/bep_0027.html
+
+ Args:
+ private (bool): True if the torrent is to be private.
+
+ """
+ self.__private = private
+
+ def get_trackers(self):
+ """Get the announce trackers.
+
+ Note:
+ See http://bittorrent.org/beps/bep_0012.html
+
+ Returns:
+ list of lists: A list containing a list of trackers.
+
+ """
+ return self.__trackers
+
+ def set_trackers(self, trackers):
+ """Set the announce trackers.
+
+ Args:
+ private (list of lists): A list containing lists of trackers as strings, each list is a tier.
+
+ """
+ self.__trackers = trackers
+
+ def get_webseeds(self):
+ """Get the webseeds.
+
+ Note:
+ The web seeds can either be:
+ Hoffman-style: http://bittorrent.org/beps/bep_0017.html
+ GetRight-style: http://bittorrent.org/beps/bep_0019.html
+
+ If the url ends in '.php' then it will be considered Hoffman-style, if
+ not it will be considered GetRight-style.
+
+ Returns:
+ list: The webseeds.
+
+ """
+ return self.__webseeds
+
+ def set_webseeds(self, webseeds):
+ """Set webseeds.
+
+ Note:
+ The web seeds can either be:
+ Hoffman-style: http://bittorrent.org/beps/bep_0017.html
+ GetRight-style: http://bittorrent.org/beps/bep_0019.html
+
+ If the url ends in '.php' then it will be considered Hoffman-style, if
+ not it will be considered GetRight-style.
+
+ Args:
+ private (list): The webseeds URLs which can be either Hoffman or GetRight style.
+
+ """
+ self.__webseeds = webseeds
+
+ def get_pad_files(self):
+ """Get status of padding files for the torrent.
+
+ Returns:
+ bool: True if padding files have been enabled to align files on piece boundaries.
+
+ """
+ return self.__pad_files
+
+ def set_pad_files(self, pad):
+ """Enable padding files for the torrent.
+
+ Args:
+ private (bool): True adds padding files to align files on piece boundaries.
+
+ """
+ self.__pad_files = pad
+
+ data_path = property(get_data_path, set_data_path)
+ piece_size = property(get_piece_size, set_piece_size)
+ comment = property(get_comment, set_comment)
+ private = property(get_private, set_private)
+ trackers = property(get_trackers, set_trackers)
+ webseeds = property(get_webseeds, set_webseeds)
+ pad_files = property(get_pad_files, set_pad_files)
diff --git a/deluge/metafile.py b/deluge/metafile.py
new file mode 100644
index 0000000..8c28c7e
--- /dev/null
+++ b/deluge/metafile.py
@@ -0,0 +1,246 @@
+# -*- coding: utf-8 -*-
+#
+# Original file from BitTorrent-5.3-GPL.tar.gz
+# Copyright (C) Bram Cohen
+#
+# Modifications for use in Deluge:
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import logging
+import os.path
+import time
+from hashlib import sha1 as sha
+
+import deluge.component as component
+from deluge.bencode import bencode
+from deluge.common import utf8_encode_structure
+from deluge.event import CreateTorrentProgressEvent
+
+log = logging.getLogger(__name__)
+
+ignore = ['core', 'CVS', 'Thumbs.db', 'desktop.ini']
+
+noncharacter_translate = {}
+for i in range(0xD800, 0xE000):
+ noncharacter_translate[i] = ord('-')
+for i in range(0xFDD0, 0xFDF0):
+ noncharacter_translate[i] = ord('-')
+for i in (0xFFFE, 0xFFFF):
+ noncharacter_translate[i] = ord('-')
+
+
+def gmtime():
+ return time.mktime(time.gmtime())
+
+
+def dummy(*v):
+ pass
+
+
+class RemoteFileProgress(object):
+ def __init__(self, session_id):
+ self.session_id = session_id
+
+ def __call__(self, piece_count, num_pieces):
+ component.get('RPCServer').emit_event_for_session_id(
+ self.session_id, CreateTorrentProgressEvent(piece_count, num_pieces)
+ )
+
+
+def make_meta_file(
+ path,
+ url,
+ piece_length,
+ progress=None,
+ title=None,
+ comment=None,
+ safe=None,
+ content_type=None,
+ target=None,
+ webseeds=None,
+ name=None,
+ private=False,
+ created_by=None,
+ trackers=None,
+):
+ data = {'creation date': int(gmtime())}
+ if url:
+ data['announce'] = url.strip()
+ a, b = os.path.split(path)
+ if not target:
+ if b == '':
+ f = a + '.torrent'
+ else:
+ f = os.path.join(a, b + '.torrent')
+ else:
+ f = target
+
+ if progress is None:
+ progress = dummy
+ try:
+ session_id = component.get('RPCServer').get_session_id()
+ except KeyError:
+ pass
+ else:
+ if session_id:
+ progress = RemoteFileProgress(session_id)
+
+ info = makeinfo(path, piece_length, progress, name, content_type, private)
+
+ # check_info(info)
+ data['info'] = info
+ if title:
+ data['title'] = title.encode('utf8')
+ if comment:
+ data['comment'] = comment.encode('utf8')
+ if safe:
+ data['safe'] = safe.encode('utf8')
+
+ httpseeds = []
+ url_list = []
+
+ if webseeds:
+ for webseed in webseeds:
+ if webseed.endswith('.php'):
+ httpseeds.append(webseed)
+ else:
+ url_list.append(webseed)
+
+ if url_list:
+ data['url-list'] = url_list
+ if httpseeds:
+ data['httpseeds'] = httpseeds
+ if created_by:
+ data['created by'] = created_by.encode('utf8')
+
+ if trackers and (len(trackers[0]) > 1 or len(trackers) > 1):
+ data['announce-list'] = trackers
+
+ data['encoding'] = 'UTF-8'
+ with open(f, 'wb') as file_:
+ file_.write(bencode(utf8_encode_structure(data)))
+
+
+def calcsize(path):
+ total = 0
+ for s in subfiles(os.path.abspath(path)):
+ total += os.path.getsize(s[1])
+ return total
+
+
+def makeinfo(path, piece_length, progress, name=None, content_type=None, private=False):
+ # HEREDAVE. If path is directory, how do we assign content type?
+ path = os.path.abspath(path)
+ piece_count = 0
+ if os.path.isdir(path):
+ subs = sorted(subfiles(path))
+ pieces = []
+ sh = sha()
+ done = 0
+ fs = []
+ totalsize = 0.0
+ totalhashed = 0
+ for p, f in subs:
+ totalsize += os.path.getsize(f)
+ if totalsize >= piece_length:
+ import math
+
+ num_pieces = math.ceil(totalsize / piece_length)
+ else:
+ num_pieces = 1
+
+ for p, f in subs:
+ pos = 0
+ size = os.path.getsize(f)
+ p2 = [n.encode('utf8') for n in p]
+ if content_type:
+ fs.append(
+ {'length': size, 'path': p2, 'content_type': content_type}
+ ) # HEREDAVE. bad for batch!
+ else:
+ fs.append({'length': size, 'path': p2})
+ with open(f, 'rb') as file_:
+ while pos < size:
+ a = min(size - pos, piece_length - done)
+ sh.update(file_.read(a))
+ done += a
+ pos += a
+ totalhashed += a
+
+ if done == piece_length:
+ pieces.append(sh.digest())
+ piece_count += 1
+ done = 0
+ sh = sha()
+ progress(piece_count, num_pieces)
+ if done > 0:
+ pieces.append(sh.digest())
+ piece_count += 1
+ progress(piece_count, num_pieces)
+
+ if not name:
+ name = os.path.split(path)[1]
+
+ return {
+ 'pieces': b''.join(pieces),
+ 'piece length': piece_length,
+ 'files': fs,
+ 'name': name.encode('utf8'),
+ 'private': private,
+ }
+ else:
+ size = os.path.getsize(path)
+ if size >= piece_length:
+ num_pieces = size // piece_length
+ else:
+ num_pieces = 1
+
+ pieces = []
+ p = 0
+ with open(path, 'rb') as _file:
+ while p < size:
+ x = _file.read(min(piece_length, size - p))
+ pieces.append(sha(x).digest())
+ piece_count += 1
+ p += piece_length
+ if p > size:
+ p = size
+ progress(piece_count, num_pieces)
+ name = os.path.split(path)[1].encode('utf8')
+ if content_type is not None:
+ return {
+ 'pieces': b''.join(pieces),
+ 'piece length': piece_length,
+ 'length': size,
+ 'name': name,
+ 'content_type': content_type,
+ 'private': private,
+ }
+ return {
+ 'pieces': b''.join(pieces),
+ 'piece length': piece_length,
+ 'length': size,
+ 'name': name,
+ 'private': private,
+ }
+
+
+def subfiles(d):
+ r = []
+ stack = [([], d)]
+ while stack:
+ p, n = stack.pop()
+ if os.path.isdir(n):
+ for s in os.listdir(n):
+ if s not in ignore and not s.startswith('.'):
+ stack.append((p + [s], os.path.join(n, s)))
+ else:
+ r.append((p, n))
+ return r
diff --git a/deluge/path_chooser_common.py b/deluge/path_chooser_common.py
new file mode 100644
index 0000000..0f93fee
--- /dev/null
+++ b/deluge/path_chooser_common.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013 Bro <bro.development@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os
+
+from deluge.common import PY2
+
+
+def is_hidden(filepath):
+ def has_hidden_attribute(filepath):
+ import win32api
+ import win32con
+
+ try:
+ attribute = win32api.GetFileAttributes(filepath)
+ return attribute & (
+ win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM
+ )
+ except (AttributeError, AssertionError):
+ return False
+
+ name = os.path.basename(os.path.abspath(filepath))
+ # Windows
+ if os.name == 'nt':
+ return has_hidden_attribute(filepath)
+ return name.startswith('.')
+
+
+def get_completion_paths(args):
+ """
+ Takes a path value and returns the available completions.
+ If the path_value is a valid path, return all sub-directories.
+ If the path_value is not a valid path, remove the basename from the
+ path and return all sub-directories of path that start with basename.
+
+ :param args: options
+ :type args: dict
+ :returns: the args argument containing the available completions for the completion_text
+ :rtype: list
+
+ """
+ args['paths'] = []
+ path_value = args['completion_text']
+ hidden_files = args['show_hidden_files']
+
+ def get_subdirs(dirname):
+ try:
+ if PY2:
+ return os.walk(dirname).__next__[1]
+ else:
+ return next(os.walk(dirname))[1]
+ except StopIteration:
+ # Invalid dirname
+ return []
+
+ dirname = os.path.dirname(path_value)
+ basename = os.path.basename(path_value)
+
+ dirs = get_subdirs(dirname)
+ # No completions available
+ if not dirs:
+ return args
+
+ # path_value ends with path separator so
+ # we only want all the subdirectories
+ if not basename:
+ # Lets remove hidden files
+ if not hidden_files:
+ old_dirs = dirs
+ dirs = []
+ for d in old_dirs:
+ if not is_hidden(os.path.join(dirname, d)):
+ dirs.append(d)
+ matching_dirs = []
+ for s in dirs:
+ if s.startswith(basename):
+ p = os.path.join(dirname, s)
+ if not p.endswith(os.path.sep):
+ p += os.path.sep
+ matching_dirs.append(p)
+
+ args['paths'] = sorted(matching_dirs)
+ return args
diff --git a/deluge/pluginmanagerbase.py b/deluge/pluginmanagerbase.py
new file mode 100644
index 0000000..f838cd3
--- /dev/null
+++ b/deluge/pluginmanagerbase.py
@@ -0,0 +1,282 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+
+"""PluginManagerBase"""
+from __future__ import unicode_literals
+
+import logging
+import os.path
+
+import pkg_resources
+from twisted.internet import defer
+from twisted.python.failure import Failure
+
+import deluge.common
+import deluge.component as component
+import deluge.configmanager
+
+log = logging.getLogger(__name__)
+
+METADATA_KEYS = [
+ 'Name',
+ 'License',
+ 'Author',
+ 'Home-page',
+ 'Summary',
+ 'Platform',
+ 'Version',
+ 'Author-email',
+ 'Description',
+]
+
+DEPRECATION_WARNING = """
+The plugin %s is not using the "deluge.plugins" namespace.
+In order to avoid package name clashes between regular python packages and
+deluge plugins, the way deluge plugins should be created has changed.
+If you're seeing this message and you're not the developer of the plugin which
+triggered this warning, please report to it's author.
+If you're the developer, please take a look at the plugins hosted on deluge's
+git repository to have an idea of what needs to be changed.
+"""
+
+
+class PluginManagerBase(object):
+ """PluginManagerBase is a base class for PluginManagers to inherit"""
+
+ def __init__(self, config_file, entry_name):
+ log.debug('Plugin manager init..')
+
+ self.config = deluge.configmanager.ConfigManager(config_file)
+
+ # Create the plugins folder if it doesn't exist
+ if not os.path.exists(
+ os.path.join(deluge.configmanager.get_config_dir(), 'plugins')
+ ):
+ os.mkdir(os.path.join(deluge.configmanager.get_config_dir(), 'plugins'))
+
+ # This is the entry we want to load..
+ self.entry_name = entry_name
+
+ # Loaded plugins
+ self.plugins = {}
+
+ # Scan the plugin folders for plugins
+ self.scan_for_plugins()
+
+ def enable_plugins(self):
+ # Load plugins that are enabled in the config.
+ for name in self.config['enabled_plugins']:
+ self.enable_plugin(name)
+
+ def disable_plugins(self):
+ """Disable all plugins that are enabled"""
+ # Dict will be modified so iterate over generated list
+ for key in list(self.plugins):
+ self.disable_plugin(key)
+
+ def __getitem__(self, key):
+ return self.plugins[key]
+
+ def get_available_plugins(self):
+ """Returns a list of the available plugins name"""
+ return self.available_plugins
+
+ def get_enabled_plugins(self):
+ """Returns a list of enabled plugins"""
+ return list(self.plugins)
+
+ def scan_for_plugins(self):
+ """Scans for available plugins"""
+ base_dir = deluge.common.resource_filename('deluge', 'plugins')
+ user_dir = os.path.join(deluge.configmanager.get_config_dir(), 'plugins')
+ base_subdir = [
+ os.path.join(base_dir, f)
+ for f in os.listdir(base_dir)
+ if os.path.isdir(os.path.join(base_dir, f))
+ ]
+ plugin_dirs = [base_dir, user_dir] + base_subdir
+
+ for dirname in plugin_dirs:
+ pkg_resources.working_set.add_entry(dirname)
+ self.pkg_env = pkg_resources.Environment(plugin_dirs, None)
+
+ self.available_plugins = []
+ for name in self.pkg_env:
+ log.debug(
+ 'Found plugin: %s %s at %s',
+ self.pkg_env[name][0].project_name,
+ self.pkg_env[name][0].version,
+ self.pkg_env[name][0].location,
+ )
+ self.available_plugins.append(self.pkg_env[name][0].project_name)
+
+ def enable_plugin(self, plugin_name):
+ """Enable a plugin.
+
+ Args:
+ plugin_name (str): The plugin name.
+
+ Returns:
+ Deferred: A deferred with callback value True or False indicating
+ whether the plugin is enabled or not.
+
+ """
+ if plugin_name not in self.available_plugins:
+ log.warning('Cannot enable non-existant plugin %s', plugin_name)
+ return defer.succeed(False)
+
+ if plugin_name in self.plugins:
+ log.warning('Cannot enable already enabled plugin %s', plugin_name)
+ return defer.succeed(True)
+
+ plugin_name = plugin_name.replace(' ', '-')
+ egg = self.pkg_env[plugin_name][0]
+ # Activate is required by non-namespace plugins.
+ egg.activate()
+ return_d = defer.succeed(True)
+
+ for name in egg.get_entry_map(self.entry_name):
+ try:
+ cls = egg.load_entry_point(self.entry_name, name)
+ instance = cls(plugin_name.replace('-', '_'))
+ except component.ComponentAlreadyRegistered as ex:
+ log.error(ex)
+ return defer.succeed(False)
+ except Exception as ex:
+ log.error(
+ 'Unable to instantiate plugin %r from %r!', name, egg.location
+ )
+ log.exception(ex)
+ continue
+ try:
+ return_d = defer.maybeDeferred(instance.enable)
+ except Exception as ex:
+ log.error('Unable to enable plugin: %s', name)
+ log.exception(ex)
+ return_d = defer.fail(False)
+
+ if not instance.__module__.startswith('deluge.plugins.'):
+ import warnings
+
+ warnings.warn_explicit(
+ DEPRECATION_WARNING % name,
+ DeprecationWarning,
+ instance.__module__,
+ 0,
+ )
+ if self._component_state == 'Started':
+
+ def on_enabled(result, instance):
+ return component.start([instance.plugin._component_name])
+
+ return_d.addCallback(on_enabled, instance)
+
+ def on_started(result, instance):
+ plugin_name_space = plugin_name.replace('-', ' ')
+ self.plugins[plugin_name_space] = instance
+ if plugin_name_space not in self.config['enabled_plugins']:
+ log.debug(
+ 'Adding %s to enabled_plugins list in config', plugin_name_space
+ )
+ self.config['enabled_plugins'].append(plugin_name_space)
+ log.info('Plugin %s enabled...', plugin_name_space)
+ return True
+
+ def on_started_error(result, instance):
+ log.error(
+ 'Failed to start plugin: %s\n%s',
+ plugin_name,
+ result.getTraceback(elideFrameworkCode=1, detail='brief'),
+ )
+ self.plugins[plugin_name.replace('-', ' ')] = instance
+ self.disable_plugin(plugin_name)
+ return False
+
+ return_d.addCallbacks(
+ on_started,
+ on_started_error,
+ callbackArgs=[instance],
+ errbackArgs=[instance],
+ )
+ return return_d
+
+ return defer.succeed(False)
+
+ def disable_plugin(self, name):
+ """Disable a plugin.
+
+ Args:
+ plugin_name (str): The plugin name.
+
+ Returns:
+ Deferred: A deferred with callback value True or False indicating
+ whether the plugin is disabled or not.
+
+ """
+ if name not in self.plugins:
+ log.warning('Plugin "%s" is not enabled...', name)
+ return defer.succeed(True)
+
+ try:
+ d = defer.maybeDeferred(self.plugins[name].disable)
+ except Exception as ex:
+ log.error('Error when disabling plugin: %s', self.plugin._component_name)
+ log.debug(ex)
+ d = defer.succeed(False)
+
+ def on_disabled(result):
+ ret = True
+ if isinstance(result, Failure):
+ log.debug(
+ 'Error when disabling plugin %s: %s', name, result.getTraceback()
+ )
+ ret = False
+ try:
+ component.deregister(self.plugins[name].plugin)
+ del self.plugins[name]
+ self.config['enabled_plugins'].remove(name)
+ except Exception as ex:
+ log.warning('Problems occured disabling plugin: %s', name)
+ log.debug(ex)
+ ret = False
+ else:
+ log.info('Plugin %s disabled...', name)
+ return ret
+
+ d.addBoth(on_disabled)
+ return d
+
+ def get_plugin_info(self, name):
+ """Returns a dictionary of plugin info from the metadata"""
+ info = {}.fromkeys(METADATA_KEYS)
+ last_header = ''
+ cont_lines = []
+ # Missing plugin info
+ if not self.pkg_env[name]:
+ log.warning('Failed to retrive info for plugin: %s', name)
+ for k in info:
+ info[k] = 'not available'
+ return info
+ for line in self.pkg_env[name][0].get_metadata('PKG-INFO').splitlines():
+ if not line:
+ continue
+ if line[0] in ' \t' and (
+ len(line.split(':', 1)) == 1 or line.split(':', 1)[0] not in info
+ ):
+ # This is a continuation
+ cont_lines.append(line.strip())
+ else:
+ if cont_lines:
+ info[last_header] = '\n'.join(cont_lines).strip()
+ cont_lines = []
+ if line.split(':', 1)[0] in info:
+ last_header = line.split(':', 1)[0]
+ info[last_header] = line.split(':', 1)[1].strip()
+ return info
diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/__init__.py b/deluge/plugins/AutoAdd/deluge_autoadd/__init__.py
new file mode 100644
index 0000000..a409cfc
--- /dev/null
+++ b/deluge/plugins/AutoAdd/deluge_autoadd/__init__.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.plugins.init import PluginInitBase
+
+
+class CorePlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .core import Core as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(CorePlugin, self).__init__(plugin_name)
+
+
+class Gtk3UIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .gtkui import GtkUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(Gtk3UIPlugin, self).__init__(plugin_name)
+
+
+class WebUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .webui import WebUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(WebUIPlugin, self).__init__(plugin_name)
diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/common.py b/deluge/plugins/AutoAdd/deluge_autoadd/common.py
new file mode 100644
index 0000000..9b4b1e7
--- /dev/null
+++ b/deluge/plugins/AutoAdd/deluge_autoadd/common.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# 2009 Damien Churchill <damoxc@gmail.com>
+# 2010 Pedro Algarvio <pedro@algarvio.me>
+# 2017 Calum Lind <calumlind+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os.path
+
+from pkg_resources import resource_filename
+
+
+def get_resource(filename, subdir=False):
+ folder = os.path.join('data', 'autoadd_options') if subdir else 'data'
+ return resource_filename(__package__, os.path.join(folder, filename))
diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/core.py b/deluge/plugins/AutoAdd/deluge_autoadd/core.py
new file mode 100644
index 0000000..79e5327
--- /dev/null
+++ b/deluge/plugins/AutoAdd/deluge_autoadd/core.py
@@ -0,0 +1,522 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com>
+# Copyright (C) 2011 Pedro Algarvio <pedro@algarvio.me>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+import shutil
+from base64 import b64encode
+
+from twisted.internet import reactor
+from twisted.internet.task import LoopingCall, deferLater
+
+import deluge.component as component
+import deluge.configmanager
+from deluge._libtorrent import lt
+from deluge.common import AUTH_LEVEL_ADMIN, is_magnet
+from deluge.core.rpcserver import export
+from deluge.error import AddTorrentError
+from deluge.event import DelugeEvent
+from deluge.plugins.pluginbase import CorePluginBase
+
+log = logging.getLogger(__name__)
+
+
+DEFAULT_PREFS = {'watchdirs': {}, 'next_id': 1}
+
+
+OPTIONS_AVAILABLE = { # option: builtin
+ 'enabled': False,
+ 'path': False,
+ 'append_extension': False,
+ 'copy_torrent': False,
+ 'delete_copy_torrent_toggle': False,
+ 'abspath': False,
+ 'download_location': True,
+ 'max_download_speed': True,
+ 'max_upload_speed': True,
+ 'max_connections': True,
+ 'max_upload_slots': True,
+ 'prioritize_first_last': True,
+ 'auto_managed': True,
+ 'stop_at_ratio': True,
+ 'stop_ratio': True,
+ 'remove_at_ratio': True,
+ 'move_completed': True,
+ 'move_completed_path': True,
+ 'label': False,
+ 'add_paused': True,
+ 'queue_to_top': False,
+ 'owner': True,
+ 'seed_mode': True,
+}
+
+MAX_NUM_ATTEMPTS = 10
+
+
+class AutoaddOptionsChangedEvent(DelugeEvent):
+ """Emitted when the options for the plugin are changed."""
+
+ def __init__(self):
+ pass
+
+
+def check_input(cond, message):
+ if not cond:
+ raise Exception(message)
+
+
+class Core(CorePluginBase):
+ def enable(self):
+
+ # reduce typing, assigning some values to self...
+ self.config = deluge.configmanager.ConfigManager('autoadd.conf', DEFAULT_PREFS)
+ self.config.run_converter((0, 1), 2, self.__migrate_config_1_to_2)
+ self.config.save()
+ self.watchdirs = self.config['watchdirs']
+
+ self.rpcserver = component.get('RPCServer')
+ component.get('EventManager').register_event_handler(
+ 'PreTorrentRemovedEvent', self.__on_pre_torrent_removed
+ )
+
+ # Dict of Filename:Attempts
+ self.invalid_torrents = {}
+ # Loopingcall timers for each enabled watchdir
+ self.update_timers = {}
+ deferLater(reactor, 5, self.enable_looping)
+
+ def enable_looping(self):
+ # Enable all looping calls for enabled watchdirs here
+ for watchdir_id, watchdir in self.watchdirs.items():
+ if watchdir['enabled']:
+ self.enable_watchdir(watchdir_id)
+
+ def disable(self):
+ # disable all running looping calls
+ component.get('EventManager').deregister_event_handler(
+ 'PreTorrentRemovedEvent', self.__on_pre_torrent_removed
+ )
+ for loopingcall in self.update_timers.values():
+ loopingcall.stop()
+ self.config.save()
+
+ def update(self):
+ pass
+
+ @export
+ def set_options(self, watchdir_id, options):
+ """Update the options for a watch folder."""
+ watchdir_id = str(watchdir_id)
+ options = self._make_unicode(options)
+ check_input(watchdir_id in self.watchdirs, _('Watch folder does not exist.'))
+ if 'path' in options:
+ options['abspath'] = os.path.abspath(options['path'])
+ check_input(os.path.isdir(options['abspath']), _('Path does not exist.'))
+ for w_id, w in self.watchdirs.items():
+ if options['abspath'] == w['abspath'] and watchdir_id != w_id:
+ raise Exception('Path is already being watched.')
+ for key in options:
+ if key not in OPTIONS_AVAILABLE:
+ if key not in [key2 + '_toggle' for key2 in OPTIONS_AVAILABLE]:
+ raise Exception('autoadd: Invalid options key:%s' % key)
+ # disable the watch loop if it was active
+ if watchdir_id in self.update_timers:
+ self.disable_watchdir(watchdir_id)
+
+ self.watchdirs[watchdir_id].update(options)
+ # re-enable watch loop if appropriate
+ if self.watchdirs[watchdir_id]['enabled']:
+ self.enable_watchdir(watchdir_id)
+ self.config.save()
+ component.get('EventManager').emit(AutoaddOptionsChangedEvent())
+
+ def load_torrent(self, filename, magnet):
+ log.debug('Attempting to open %s for add.', filename)
+ file_mode = 'r' if magnet else 'rb'
+ try:
+ with open(filename, file_mode) as _file:
+ filedump = _file.read()
+ except IOError as ex:
+ log.warning('Unable to open %s: %s', filename, ex)
+ raise ex
+
+ if not filedump:
+ raise EOFError('Torrent is 0 bytes!')
+
+ # Get the info to see if any exceptions are raised
+ if not magnet:
+ lt.torrent_info(lt.bdecode(filedump))
+
+ return filedump
+
+ def split_magnets(self, filename):
+ log.debug('Attempting to open %s for splitting magnets.', filename)
+ magnets = []
+ try:
+ with open(filename, 'r') as _file:
+ magnets = list(filter(len, _file.read().splitlines()))
+ except IOError as ex:
+ log.warning('Unable to open %s: %s', filename, ex)
+
+ if len(magnets) < 2:
+ return []
+
+ path = filename.rsplit(os.sep, 1)[0]
+ for magnet in magnets:
+ if not is_magnet(magnet):
+ log.warning('Found line which is not a magnet: %s', magnet)
+ continue
+
+ for part in magnet.split('&'):
+ if part.startswith('dn='):
+ name = part[3:].strip()
+ if name:
+ mname = os.sep.join([path, name + '.magnet'])
+ break
+ else:
+ short_hash = magnet.split('btih:')[1][:8]
+ mname = '.'.join([os.path.splitext(filename)[0], short_hash, 'magnet'])
+
+ try:
+ with open(mname, 'w') as _mfile:
+ _mfile.write(magnet)
+ except IOError as ex:
+ log.warning('Unable to open %s: %s', mname, ex)
+ return magnets
+
+ def update_watchdir(self, watchdir_id):
+ """Check the watch folder for new torrents to add."""
+ log.trace('Updating watchdir id: %s', watchdir_id)
+ watchdir_id = str(watchdir_id)
+ watchdir = self.watchdirs[watchdir_id]
+ if not watchdir['enabled']:
+ # We shouldn't be updating because this watchdir is not enabled
+ log.debug('Watchdir id %s is not enabled. Disabling it.', watchdir_id)
+ self.disable_watchdir(watchdir_id)
+ return
+
+ if not os.path.isdir(watchdir['abspath']):
+ log.warning('Invalid AutoAdd folder: %s', watchdir['abspath'])
+ self.disable_watchdir(watchdir_id)
+ return
+
+ # Generate options dict for watchdir
+ options = {}
+ if 'stop_at_ratio_toggle' in watchdir:
+ watchdir['stop_ratio_toggle'] = watchdir['stop_at_ratio_toggle']
+ # We default to True when reading _toggle values, so a config
+ # without them is valid, and applies all its settings.
+ for option, value in watchdir.items():
+ if OPTIONS_AVAILABLE.get(option):
+ if watchdir.get(option + '_toggle', True) or option in [
+ 'owner',
+ 'seed_mode',
+ ]:
+ options[option] = value
+
+ # Check for .magnet files containing multiple magnet links and
+ # create a new .magnet file for each of them.
+ for filename in os.listdir(watchdir['abspath']):
+ try:
+ filepath = os.path.join(watchdir['abspath'], filename)
+ except UnicodeDecodeError as ex:
+ log.error(
+ 'Unable to auto add torrent due to improper filename encoding: %s',
+ ex,
+ )
+ continue
+ if os.path.isdir(filepath):
+ # Skip directories
+ continue
+ elif os.path.splitext(filename)[1] == '.magnet' and self.split_magnets(
+ filepath
+ ):
+ os.remove(filepath)
+
+ for filename in os.listdir(watchdir['abspath']):
+ try:
+ filepath = os.path.join(watchdir['abspath'], filename)
+ except UnicodeDecodeError as ex:
+ log.error(
+ 'Unable to auto add torrent due to improper filename encoding: %s',
+ ex,
+ )
+ continue
+
+ if os.path.isdir(filepath):
+ # Skip directories
+ continue
+
+ ext = os.path.splitext(filename)[1].lower()
+ magnet = ext == '.magnet'
+ if not magnet and not ext == '.torrent':
+ log.debug('File checked for auto-loading is invalid: %s', filename)
+ continue
+
+ try:
+ filedump = self.load_torrent(filepath, magnet)
+ except (IOError, EOFError) as ex:
+ # If torrent is invalid, keep track of it so can try again on the next pass.
+ # This catches torrent files that may not be fully saved to disk at load time.
+ log.debug('Torrent is invalid: %s', ex)
+ if filename in self.invalid_torrents:
+ self.invalid_torrents[filename] += 1
+ if self.invalid_torrents[filename] >= MAX_NUM_ATTEMPTS:
+ log.warning(
+ 'Maximum attempts reached while trying to add the '
+ 'torrent file with the path %s',
+ filepath,
+ )
+ os.rename(filepath, filepath + '.invalid')
+ del self.invalid_torrents[filename]
+ else:
+ self.invalid_torrents[filename] = 1
+ continue
+
+ def on_torrent_added(torrent_id, filename, filepath):
+ if 'Label' in component.get('CorePluginManager').get_enabled_plugins():
+ if watchdir.get('label_toggle', True) and watchdir.get('label'):
+ label = component.get('CorePlugin.Label')
+ if not watchdir['label'] in label.get_labels():
+ label.add(watchdir['label'])
+ try:
+ label.set_torrent(torrent_id, watchdir['label'])
+ except Exception as ex:
+ log.error('Unable to set label: %s', ex)
+
+ if (
+ watchdir.get('queue_to_top_toggle', True)
+ and 'queue_to_top' in watchdir
+ ):
+ if watchdir['queue_to_top']:
+ component.get('TorrentManager').queue_top(torrent_id)
+ else:
+ component.get('TorrentManager').queue_bottom(torrent_id)
+
+ # Rename, copy or delete the torrent once added to deluge.
+ if watchdir.get('append_extension_toggle'):
+ if not watchdir.get('append_extension'):
+ watchdir['append_extension'] = '.added'
+ os.rename(filepath, filepath + watchdir['append_extension'])
+ elif watchdir.get('copy_torrent_toggle'):
+ copy_torrent_path = watchdir['copy_torrent']
+ copy_torrent_file = os.path.join(copy_torrent_path, filename)
+ log.debug(
+ 'Moving added torrent file "%s" to "%s"',
+ os.path.basename(filepath),
+ copy_torrent_path,
+ )
+ shutil.move(filepath, copy_torrent_file)
+ else:
+ os.remove(filepath)
+
+ def fail_torrent_add(err_msg, filepath, magnet):
+ # torrent handle is invalid and so is the magnet link
+ log.error(
+ 'Cannot Autoadd %s: %s: %s',
+ 'magnet' if magnet else 'torrent file',
+ filepath,
+ err_msg,
+ )
+ os.rename(filepath, filepath + '.invalid')
+
+ try:
+ # The torrent looks good, so lets add it to the session.
+ if magnet:
+ d = component.get('Core').add_torrent_magnet(
+ filedump.strip(), options
+ )
+ else:
+ d = component.get('Core').add_torrent_file_async(
+ filename, b64encode(filedump), options
+ )
+ d.addCallback(on_torrent_added, filename, filepath)
+ d.addErrback(fail_torrent_add, filepath, magnet)
+ except AddTorrentError as ex:
+ fail_torrent_add(str(ex), filepath, magnet)
+
+ def on_update_watchdir_error(self, failure, watchdir_id):
+ """Disables any watch folders with un-handled exceptions."""
+ self.disable_watchdir(watchdir_id)
+ log.error(
+ 'Disabling "%s", error during update: %s',
+ self.watchdirs[watchdir_id]['path'],
+ failure,
+ )
+
+ @export
+ def enable_watchdir(self, watchdir_id):
+ w_id = str(watchdir_id)
+ # Enable the looping call
+ if w_id not in self.update_timers or not self.update_timers[w_id].running:
+ self.update_timers[w_id] = LoopingCall(self.update_watchdir, w_id)
+ self.update_timers[w_id].start(5).addErrback(
+ self.on_update_watchdir_error, w_id
+ )
+ # Update the config
+ if not self.watchdirs[w_id]['enabled']:
+ self.watchdirs[w_id]['enabled'] = True
+ self.config.save()
+ component.get('EventManager').emit(AutoaddOptionsChangedEvent())
+
+ @export
+ def disable_watchdir(self, watchdir_id):
+ w_id = str(watchdir_id)
+ # Disable the looping call
+ if w_id in self.update_timers:
+ if self.update_timers[w_id].running:
+ self.update_timers[w_id].stop()
+ del self.update_timers[w_id]
+ # Update the config
+ if self.watchdirs[w_id]['enabled']:
+ self.watchdirs[w_id]['enabled'] = False
+ self.config.save()
+ component.get('EventManager').emit(AutoaddOptionsChangedEvent())
+
+ @export
+ def set_config(self, config):
+ """Sets the config dictionary."""
+ config = self._make_unicode(config)
+ for key in config:
+ self.config[key] = config[key]
+ self.config.save()
+ component.get('EventManager').emit(AutoaddOptionsChangedEvent())
+
+ @export
+ def get_config(self):
+ """Returns the config dictionary."""
+ return self.config.config
+
+ @export
+ def get_watchdirs(self):
+ session_user = self.rpcserver.get_session_user()
+ session_auth_level = self.rpcserver.get_session_auth_level()
+ if session_auth_level == AUTH_LEVEL_ADMIN:
+ log.debug(
+ 'Current logged in user %s is an ADMIN, send all ' 'watchdirs',
+ session_user,
+ )
+ return self.watchdirs
+
+ watchdirs = {}
+ for watchdir_id, watchdir in self.watchdirs.items():
+ if watchdir.get('owner', 'localclient') == session_user:
+ watchdirs[watchdir_id] = watchdir
+
+ log.debug(
+ 'Current logged in user %s is not an ADMIN, send only '
+ 'their watchdirs: %s',
+ session_user,
+ list(watchdirs),
+ )
+ return watchdirs
+
+ def _make_unicode(self, options):
+ opts = {}
+ for key in options:
+ if isinstance(options[key], bytes):
+ options[key] = options[key].decode('utf8')
+ opts[key] = options[key]
+ return opts
+
+ @export
+ def add(self, options=None):
+ """Add a watch folder."""
+ if options is None:
+ options = {}
+ options = self._make_unicode(options)
+ abswatchdir = os.path.abspath(options['path'])
+ check_input(os.path.isdir(abswatchdir), _('Path does not exist.'))
+ check_input(
+ os.access(abswatchdir, os.R_OK | os.W_OK),
+ 'You must have read and write access to watch folder.',
+ )
+ if abswatchdir in [wd['abspath'] for wd in self.watchdirs.values()]:
+ raise Exception('Path is already being watched.')
+ options.setdefault('enabled', False)
+ options['abspath'] = abswatchdir
+ watchdir_id = self.config['next_id']
+ self.watchdirs[str(watchdir_id)] = options
+ if options.get('enabled'):
+ self.enable_watchdir(watchdir_id)
+ self.config['next_id'] = watchdir_id + 1
+ self.config.save()
+ component.get('EventManager').emit(AutoaddOptionsChangedEvent())
+ return watchdir_id
+
+ @export
+ def remove(self, watchdir_id):
+ """Remove a watch folder."""
+ watchdir_id = str(watchdir_id)
+ check_input(
+ watchdir_id in self.watchdirs, 'Unknown Watchdir: %s' % self.watchdirs
+ )
+ if self.watchdirs[watchdir_id]['enabled']:
+ self.disable_watchdir(watchdir_id)
+ del self.watchdirs[watchdir_id]
+ self.config.save()
+ component.get('EventManager').emit(AutoaddOptionsChangedEvent())
+
+ def __migrate_config_1_to_2(self, config):
+ for watchdir_id in config['watchdirs']:
+ config['watchdirs'][watchdir_id]['owner'] = 'localclient'
+ return config
+
+ def __on_pre_torrent_removed(self, torrent_id):
+ try:
+ torrent = component.get('TorrentManager')[torrent_id]
+ except KeyError:
+ log.warning(
+ 'Unable to remove torrent file for torrent id %s. It'
+ 'was already deleted from the TorrentManager',
+ torrent_id,
+ )
+ return
+ torrent_fname = torrent.filename
+ for watchdir in self.watchdirs.values():
+ if not watchdir.get('copy_torrent_toggle', False):
+ # This watchlist does copy torrents
+ continue
+ elif not watchdir.get('delete_copy_torrent_toggle', False):
+ # This watchlist is not set to delete finished torrents
+ continue
+ copy_torrent_path = watchdir['copy_torrent']
+ torrent_fname_path = os.path.join(copy_torrent_path, torrent_fname)
+ if os.path.isfile(torrent_fname_path):
+ try:
+ os.remove(torrent_fname_path)
+ log.info(
+ 'Removed torrent file "%s" from "%s"',
+ torrent_fname,
+ copy_torrent_path,
+ )
+ break
+ except OSError as ex:
+ log.info(
+ 'Failed to removed torrent file "%s" from "%s": %s',
+ torrent_fname,
+ copy_torrent_path,
+ ex,
+ )
+
+ @export
+ def is_admin_level(self):
+ return self.rpcserver.get_session_auth_level() == deluge.common.AUTH_LEVEL_ADMIN
+
+ @export
+ def get_auth_user(self):
+ return self.rpcserver.get_session_user()
diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd.js b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd.js
new file mode 100644
index 0000000..40086b3
--- /dev/null
+++ b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd.js
@@ -0,0 +1,239 @@
+/**
+ * Script: autoadd.js
+ * The client-side javascript code for the AutoAdd plugin.
+ *
+ * Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.ns('Deluge.ux.AutoAdd');
+Deluge.ux.AutoAdd.onClickFunctions = {};
+
+Ext.ns('Deluge.ux.preferences');
+
+/**
+ * @class Deluge.ux.preferences.AutoAddPage
+ * @extends Ext.Panel
+ */
+Deluge.ux.preferences.AutoAddPage = Ext.extend(Ext.Panel, {
+ title: _('AutoAdd'),
+ header: false,
+ layout: 'fit',
+ border: false,
+ watchdirs: {},
+
+ initComponent: function() {
+ Deluge.ux.preferences.AutoAddPage.superclass.initComponent.call(this);
+
+ var autoAdd = this;
+
+ this.list = new Ext.list.ListView({
+ store: new Ext.data.JsonStore({
+ fields: ['id', 'enabled', 'owner', 'path'],
+ }),
+ columns: [
+ {
+ id: 'enabled',
+ header: _('Active'),
+ sortable: true,
+ dataIndex: 'enabled',
+ tpl: new Ext.XTemplate('{enabled:this.getCheckbox}', {
+ getCheckbox: function(checked, selected) {
+ Deluge.ux.AutoAdd.onClickFunctions[
+ selected.id
+ ] = function() {
+ if (selected.enabled) {
+ deluge.client.autoadd.disable_watchdir(
+ selected.id
+ );
+ checked = false;
+ } else {
+ deluge.client.autoadd.enable_watchdir(
+ selected.id
+ );
+ checked = true;
+ }
+ autoAdd.updateWatchDirs();
+ };
+ return (
+ '<input id="enabled-' +
+ selected.id +
+ '" type="checkbox"' +
+ (checked ? ' checked' : '') +
+ ' onclick="Deluge.ux.AutoAdd.onClickFunctions[' +
+ selected.id +
+ ']()" />'
+ );
+ },
+ }),
+ width: 0.15,
+ },
+ {
+ id: 'owner',
+ header: _('Owner'),
+ sortable: true,
+ dataIndex: 'owner',
+ width: 0.2,
+ },
+ {
+ id: 'path',
+ header: _('Path'),
+ sortable: true,
+ dataIndex: 'path',
+ },
+ ],
+ singleSelect: true,
+ autoExpandColumn: 'path',
+ });
+ this.list.on('selectionchange', this.onSelectionChange, this);
+
+ this.panel = this.add({
+ items: [this.list],
+ bbar: {
+ items: [
+ {
+ text: _('Add'),
+ iconCls: 'icon-add',
+ handler: this.onAddClick,
+ scope: this,
+ },
+ {
+ text: _('Edit'),
+ iconCls: 'icon-edit',
+ handler: this.onEditClick,
+ scope: this,
+ disabled: true,
+ },
+ '->',
+ {
+ text: _('Remove'),
+ iconCls: 'icon-remove',
+ handler: this.onRemoveClick,
+ scope: this,
+ disabled: true,
+ },
+ ],
+ },
+ });
+
+ this.on('show', this.onPreferencesShow, this);
+ },
+
+ updateWatchDirs: function() {
+ deluge.client.autoadd.get_watchdirs({
+ success: function(watchdirs) {
+ this.watchdirs = watchdirs;
+ var watchdirsArray = [];
+ for (var id in watchdirs) {
+ if (watchdirs.hasOwnProperty(id)) {
+ var watchdir = {};
+ watchdir['id'] = id;
+ watchdir['enabled'] = watchdirs[id].enabled;
+ watchdir['owner'] =
+ watchdirs[id].owner || 'localclient';
+ watchdir['path'] = watchdirs[id].path;
+
+ watchdirsArray.push(watchdir);
+ }
+ }
+ this.list.getStore().loadData(watchdirsArray);
+ },
+ scope: this,
+ });
+ },
+
+ onAddClick: function() {
+ if (!this.addWin) {
+ this.addWin = new Deluge.ux.AutoAdd.AddAutoAddCommandWindow();
+ this.addWin.on(
+ 'watchdiradd',
+ function() {
+ this.updateWatchDirs();
+ },
+ this
+ );
+ }
+ this.addWin.show();
+ },
+
+ onEditClick: function() {
+ if (!this.editWin) {
+ this.editWin = new Deluge.ux.AutoAdd.EditAutoAddCommandWindow();
+ this.editWin.on(
+ 'watchdiredit',
+ function() {
+ this.updateWatchDirs();
+ },
+ this
+ );
+ }
+ var id = this.list.getSelectedRecords()[0].id;
+ this.editWin.show(id, this.watchdirs[id]);
+ },
+
+ onPreferencesShow: function() {
+ this.updateWatchDirs();
+ },
+
+ onRemoveClick: function() {
+ var record = this.list.getSelectedRecords()[0];
+ deluge.client.autoadd.remove(record.id, {
+ success: function() {
+ this.updateWatchDirs();
+ },
+ scope: this,
+ });
+ },
+
+ onSelectionChange: function(dv, selections) {
+ if (selections.length) {
+ this.panel
+ .getBottomToolbar()
+ .items.get(1)
+ .enable();
+ this.panel
+ .getBottomToolbar()
+ .items.get(3)
+ .enable();
+ } else {
+ this.panel
+ .getBottomToolbar()
+ .items.get(1)
+ .disable();
+ this.panel
+ .getBottomToolbar()
+ .items.get(3)
+ .disable();
+ }
+ },
+});
+
+Deluge.plugins.AutoAddPlugin = Ext.extend(Deluge.Plugin, {
+ name: 'AutoAdd',
+
+ static: {
+ prefsPage: null,
+ },
+
+ onDisable: function() {
+ deluge.preferences.removePage(Deluge.plugins.AutoAddPlugin.prefsPage);
+ Deluge.plugins.AutoAddPlugin.prefsPage = null;
+ },
+
+ onEnable: function() {
+ /*
+ * Called for each of the JavaScript files.
+ * This will prevent adding unnecessary tabs to the preferences window.
+ */
+ if (!Deluge.plugins.AutoAddPlugin.prefsPage) {
+ Deluge.plugins.AutoAddPlugin.prefsPage = deluge.preferences.addPage(
+ new Deluge.ux.preferences.AutoAddPage()
+ );
+ }
+ },
+});
+
+Deluge.registerPlugin('AutoAdd', Deluge.plugins.AutoAddPlugin);
diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.js b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.js
new file mode 100644
index 0000000..49f752f
--- /dev/null
+++ b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.js
@@ -0,0 +1,475 @@
+/**
+ * Script: autoadd.js
+ * The client-side javascript code for the AutoAdd plugin.
+ *
+ * Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.ns('Deluge.ux.AutoAdd');
+
+/**
+ * @class Deluge.ux.AutoAdd.AutoAddWindowBase
+ * @extends Ext.Window
+ */
+Deluge.ux.AutoAdd.AutoAddWindowBase = Ext.extend(Ext.Window, {
+ width: 350,
+ autoHeight: true,
+ closeAction: 'hide',
+
+ spin_ids: ['max_download_speed', 'max_upload_speed', 'stop_ratio'],
+ spin_int_ids: ['max_upload_slots', 'max_connections'],
+ chk_ids: [
+ 'stop_at_ratio',
+ 'remove_at_ratio',
+ 'move_completed',
+ 'add_paused',
+ 'auto_managed',
+ 'queue_to_top',
+ ],
+ toggle_ids: [
+ 'append_extension_toggle',
+ 'download_location_toggle',
+ 'label_toggle',
+ 'copy_torrent_toggle',
+ 'delete_copy_torrent_toggle',
+ 'seed_mode',
+ ],
+
+ accounts: new Ext.data.ArrayStore({
+ storeId: 'accountStore',
+ id: 0,
+ fields: [
+ {
+ name: 'displayText',
+ type: 'string',
+ },
+ ],
+ }),
+ labels: new Ext.data.ArrayStore({
+ storeId: 'labelStore',
+ id: 0,
+ fields: [
+ {
+ name: 'displayText',
+ type: 'string',
+ },
+ ],
+ }),
+
+ initComponent: function() {
+ Deluge.ux.AutoAdd.AutoAddWindowBase.superclass.initComponent.call(this);
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+
+ this.MainTab = new Deluge.ux.AutoAdd.AutoAddMainPanel();
+ this.OptionsTab = new Deluge.ux.AutoAdd.AutoAddOptionsPanel();
+
+ this.form = this.add({
+ xtype: 'form',
+ baseCls: 'x-plain',
+ bodyStyle: 'padding: 5px',
+ items: [
+ {
+ xtype: 'tabpanel',
+ activeTab: 0,
+ items: [this.MainTab, this.OptionsTab],
+ },
+ ],
+ });
+ },
+
+ onCancelClick: function() {
+ this.hide();
+ },
+
+ getOptions: function() {
+ var options = {};
+
+ options['enabled'] = Ext.getCmp('enabled').getValue();
+ options['path'] = Ext.getCmp('path').getValue();
+ options['download_location'] = Ext.getCmp(
+ 'download_location'
+ ).getValue();
+ options['move_completed_path'] = Ext.getCmp(
+ 'move_completed_path'
+ ).getValue();
+ options['copy_torrent'] = Ext.getCmp('copy_torrent').getValue();
+
+ options['label'] = Ext.getCmp('label').getValue();
+ options['append_extension'] = Ext.getCmp('append_extension').getValue();
+ options['owner'] = Ext.getCmp('owner').getValue();
+
+ this.toggle_ids.forEach(function(toggle_id) {
+ options[toggle_id] = Ext.getCmp(toggle_id).getValue();
+ });
+ this.spin_ids.forEach(function(spin_id) {
+ options[spin_id] = Ext.getCmp(spin_id).getValue();
+ options[spin_id + '_toggle'] = Ext.getCmp(
+ spin_id + '_toggle'
+ ).getValue();
+ });
+ this.spin_int_ids.forEach(function(spin_int_id) {
+ options[spin_int_id] = Ext.getCmp(spin_int_id).getValue();
+ options[spin_int_id + '_toggle'] = Ext.getCmp(
+ spin_int_id + '_toggle'
+ ).getValue();
+ });
+ this.chk_ids.forEach(function(chk_id) {
+ options[chk_id] = Ext.getCmp(chk_id).getValue();
+ options[chk_id + '_toggle'] = Ext.getCmp(
+ chk_id + '_toggle'
+ ).getValue();
+ });
+
+ if (
+ options['copy_torrent_toggle'] &&
+ options['path'] === options['copy_torrent']
+ ) {
+ throw _(
+ '"Watch Folder" directory and "Copy of .torrent' +
+ ' files to" directory cannot be the same!'
+ );
+ }
+
+ return options;
+ },
+
+ loadOptions: function(options) {
+ /*
+ * Populate all available options data to the UI
+ */
+ var value;
+
+ if (options === undefined) {
+ options = {};
+ }
+ Ext.getCmp('enabled').setValue(
+ options['enabled'] !== undefined ? options['enabled'] : true
+ );
+ Ext.getCmp('isnt_append_extension').setValue(true);
+ Ext.getCmp('append_extension_toggle').setValue(
+ options['append_extension_toggle'] !== undefined
+ ? options['append_extension_toggle']
+ : false
+ );
+ Ext.getCmp('append_extension').setValue(
+ options['append_extension'] !== undefined
+ ? options['append_extension']
+ : '.added'
+ );
+ Ext.getCmp('download_location_toggle').setValue(
+ options['download_location_toggle'] !== undefined
+ ? options['download_location_toggle']
+ : false
+ );
+ Ext.getCmp('copy_torrent_toggle').setValue(
+ options['copy_torrent_toggle'] !== undefined
+ ? options['copy_torrent_toggle']
+ : false
+ );
+ Ext.getCmp('delete_copy_torrent_toggle').setValue(
+ options['delete_copy_torrent_toggle'] !== undefined
+ ? options['delete_copy_torrent_toggle']
+ : false
+ );
+
+ value =
+ options['seed_mode'] !== undefined ? options['seed_mode'] : false;
+ Ext.getCmp('seed_mode').setValue(value);
+
+ this.accounts.removeAll(true);
+ this.labels.removeAll(true);
+ Ext.getCmp('owner').store = this.accounts;
+ Ext.getCmp('label').store = this.labels;
+ Ext.getCmp('label').setValue(
+ options['label'] !== undefined ? options['label'] : ''
+ );
+ Ext.getCmp('label_toggle').setValue(
+ options['label_toggle'] !== undefined
+ ? options['label_toggle']
+ : false
+ );
+
+ this.spin_ids.forEach(function(spin_id) {
+ Ext.getCmp(spin_id).setValue(
+ options[spin_id] !== undefined ? options[spin_id] : 0
+ );
+ Ext.getCmp(spin_id + '_toggle').setValue(
+ options[spin_id + '_toggle'] !== undefined
+ ? options[spin_id + '_toggle']
+ : false
+ );
+ });
+ this.chk_ids.forEach(function(chk_id) {
+ Ext.getCmp(chk_id).setValue(
+ options[chk_id] !== undefined ? options[chk_id] : true
+ );
+ Ext.getCmp(chk_id + '_toggle').setValue(
+ options[chk_id + '_toggle'] !== undefined
+ ? options[chk_id + '_toggle']
+ : false
+ );
+ });
+ value =
+ options['add_paused'] !== undefined ? options['add_paused'] : true;
+ if (!value) {
+ Ext.getCmp('not_add_paused').setValue(true);
+ }
+ value =
+ options['queue_to_top'] !== undefined
+ ? options['queue_to_top']
+ : true;
+ if (!value) {
+ Ext.getCmp('not_queue_to_top').setValue(true);
+ }
+ value =
+ options['auto_managed'] !== undefined
+ ? options['auto_managed']
+ : true;
+ if (!value) {
+ Ext.getCmp('not_auto_managed').setValue(true);
+ }
+ [
+ 'move_completed_path',
+ 'path',
+ 'download_location',
+ 'copy_torrent',
+ ].forEach(function(field) {
+ value = options[field] !== undefined ? options[field] : '';
+ Ext.getCmp(field).setValue(value);
+ });
+
+ if (Object.keys(options).length === 0) {
+ deluge.client.core.get_config({
+ success: function(config) {
+ var value;
+ Ext.getCmp('download_location').setValue(
+ options['download_location'] !== undefined
+ ? options['download_location']
+ : config['download_location']
+ );
+ value =
+ options['move_completed_toggle'] !== undefined
+ ? options['move_completed_toggle']
+ : config['move_completed'];
+ if (value) {
+ Ext.getCmp('move_completed_toggle').setValue(
+ options['move_completed_toggle'] !== undefined
+ ? options['move_completed_toggle']
+ : false
+ );
+ Ext.getCmp('move_completed_path').setValue(
+ options['move_completed_path'] !== undefined
+ ? options['move_completed_path']
+ : config['move_completed_path']
+ );
+ }
+ value =
+ options['copy_torrent_toggle'] !== undefined
+ ? options['copy_torrent_toggle']
+ : config['copy_torrent_file'];
+ if (value) {
+ Ext.getCmp('copy_torrent_toggle').setValue(true);
+ Ext.getCmp('copy_torrent').setValue(
+ options['copy_torrent'] !== undefined
+ ? options['copy_torrent']
+ : config['torrentfiles_location']
+ );
+ }
+ value =
+ options['delete_copy_torrent_toggle'] !== undefined
+ ? options['copy_torrent_toggle']
+ : config['del_copy_torrent_file'];
+ if (value) {
+ Ext.getCmp('delete_copy_torrent_toggle').setValue(true);
+ }
+ },
+ });
+ }
+
+ deluge.client.core.get_enabled_plugins({
+ success: function(plugins) {
+ if (plugins !== undefined && plugins.indexOf('Label') > -1) {
+ this.MainTab.LabelFset.setVisible(true);
+ deluge.client.label.get_labels({
+ success: function(labels) {
+ for (
+ var index = 0;
+ index < labels.length;
+ index++
+ ) {
+ labels[index] = [labels[index]];
+ }
+ this.labels.loadData(labels, false);
+ },
+ failure: function(failure) {
+ console.error(failure);
+ },
+ scope: this,
+ });
+ } else {
+ this.MainTab.LabelFset.setVisible(false);
+ }
+ },
+ scope: this,
+ });
+
+ var me = this;
+
+ function on_accounts(accounts, owner) {
+ for (var index = 0; index < accounts.length; index++) {
+ accounts[index] = [accounts[index]['username']];
+ }
+ me.accounts.loadData(accounts, false);
+ Ext.getCmp('owner')
+ .setValue(owner)
+ .enable();
+ }
+
+ function on_accounts_failure(failure) {
+ deluge.client.autoadd.get_auth_user({
+ success: function(user) {
+ me.accounts.loadData([[user]], false);
+ Ext.getCmp('owner')
+ .setValue(user)
+ .disable(true);
+ },
+ scope: this,
+ });
+ }
+
+ deluge.client.autoadd.is_admin_level({
+ success: function(is_admin) {
+ if (is_admin) {
+ deluge.client.core.get_known_accounts({
+ success: function(accounts) {
+ deluge.client.autoadd.get_auth_user({
+ success: function(user) {
+ on_accounts(
+ accounts,
+ options['owner'] !== undefined
+ ? options['owner']
+ : user
+ );
+ },
+ scope: this,
+ });
+ },
+ failure: on_accounts_failure,
+ scope: this,
+ });
+ } else {
+ on_accounts_failure(null);
+ }
+ },
+ scope: this,
+ });
+ },
+});
+
+/**
+ * @class Deluge.ux.AutoAdd.EditAutoAddCommandWindow
+ * @extends Deluge.ux.AutoAdd.AutoAddWindowBase
+ */
+Deluge.ux.AutoAdd.EditAutoAddCommandWindow = Ext.extend(
+ Deluge.ux.AutoAdd.AutoAddWindowBase,
+ {
+ title: _('Edit Watch Folder'),
+
+ initComponent: function() {
+ Deluge.ux.AutoAdd.EditAutoAddCommandWindow.superclass.initComponent.call(
+ this
+ );
+ this.addButton(_('Save'), this.onSaveClick, this);
+ this.addEvents({
+ watchdiredit: true,
+ });
+ },
+
+ show: function(watchdir_id, options) {
+ Deluge.ux.AutoAdd.EditAutoAddCommandWindow.superclass.show.call(
+ this
+ );
+ this.watchdir_id = watchdir_id;
+ this.loadOptions(options);
+ },
+
+ onSaveClick: function() {
+ try {
+ var options = this.getOptions();
+ deluge.client.autoadd.set_options(this.watchdir_id, options, {
+ success: function() {
+ this.fireEvent('watchdiredit', this, options);
+ },
+ scope: this,
+ });
+ } catch (err) {
+ Ext.Msg.show({
+ title: _('Incompatible Option'),
+ msg: err,
+ buttons: Ext.Msg.OK,
+ scope: this,
+ });
+ }
+
+ this.hide();
+ },
+ }
+);
+
+/**
+ * @class Deluge.ux.AutoAdd.AddAutoAddCommandWindow
+ * @extends Deluge.ux.AutoAdd.AutoAddWindowBase
+ */
+Deluge.ux.AutoAdd.AddAutoAddCommandWindow = Ext.extend(
+ Deluge.ux.AutoAdd.AutoAddWindowBase,
+ {
+ title: _('Add Watch Folder'),
+
+ initComponent: function() {
+ Deluge.ux.AutoAdd.AddAutoAddCommandWindow.superclass.initComponent.call(
+ this
+ );
+ this.addButton(_('Add'), this.onAddClick, this);
+ this.addEvents({
+ watchdiradd: true,
+ });
+ },
+
+ show: function() {
+ Deluge.ux.AutoAdd.AddAutoAddCommandWindow.superclass.show.call(
+ this
+ );
+ this.loadOptions();
+ },
+
+ onAddClick: function() {
+ var options = this.getOptions();
+ deluge.client.autoadd.add(options, {
+ success: function() {
+ this.fireEvent('watchdiradd', this, options);
+ this.hide();
+ },
+ failure: function(err) {
+ const regex = /: (.*\n)\n?\]/m;
+ var error;
+ if ((error = regex.exec(err.error.message)) !== null) {
+ error = error[1];
+ } else {
+ error = err.error.message;
+ }
+ Ext.Msg.show({
+ title: _('Incompatible Option'),
+ msg: error,
+ buttons: Ext.Msg.OK,
+ scope: this,
+ });
+ },
+ scope: this,
+ });
+ },
+ }
+);
diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui
new file mode 100644
index 0000000..a4cd364
--- /dev/null
+++ b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui
@@ -0,0 +1,1342 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">-1</property>
+ <property name="upper">10000</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="lower">-1</property>
+ <property name="upper">10000</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment3">
+ <property name="lower">-1</property>
+ <property name="upper">10000</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment4">
+ <property name="lower">-1</property>
+ <property name="upper">10000</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment5">
+ <property name="upper">100</property>
+ <property name="value">2</property>
+ <property name="step_increment">0.10000000149</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkDialog" id="options_dialog">
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">Watch Folder Properties</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="type_hint">dialog</property>
+ <signal name="close" handler="on_options_dialog_close" swapped="no"/>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="opts_cancel_button">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_opts_cancel" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="opts_add_button">
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_opts_add" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="opts_apply_button">
+ <property name="label">gtk-apply</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_opts_apply" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkNotebook" id="notebook1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkEntry" id="path_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">If a .torrent file is added to this directory,
+it will be added to the session.</property>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFileChooserButton" id="path_chooser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">If a .torrent file is added to this directory,
+it will be added to the session.</property>
+ <property name="action">select-folder</property>
+ <property name="title" translatable="yes">Select A Folder</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="enabled">
+ <property name="label" translatable="yes">Enable this watch folder</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Watch Folder&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="vbox7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkRadioButton" id="isnt_append_extension">
+ <property name="label" translatable="yes">Delete .torrent after adding</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Once the torrent is added to the session,
+the .torrent will be deleted.</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkRadioButton" id="append_extension_toggle">
+ <property name="label" translatable="yes">Append extension after adding:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Once the torrent is added to the session,
+an extension will be appended to the .torrent
+and it will remain in the same directory.</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">isnt_append_extension</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="append_extension">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="text" translatable="yes">.added</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="GtkRadioButton" id="copy_torrent_toggle">
+ <property name="label" translatable="yes">Copy of .torrent files to:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Once the torrent is added to the session,
+the .torrent will copied to the chosen directory
+and deleted from the watch folder.</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">isnt_append_extension</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkEntry" id="copy_torrent_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFileChooserButton" id="copy_torrent_chooser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action">select-folder</property>
+ <property name="title" translatable="yes">Select A Folder</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="delete_copy_torrent_toggle">
+ <property name="label" translatable="yes">Delete copy of torrent file on remove</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">Once the torrent is deleted from the session,
+also delete the .torrent file used to add it.</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_padding">15</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Torrent File Action&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="download_location_toggle">
+ <property name="label" translatable="yes">Set download folder</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">This folder will be where the torrent data is downloaded to.</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkEntry" id="download_location_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFileChooserButton" id="download_location_chooser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action">select-folder</property>
+ <property name="title" translatable="yes">Select A Folder</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Download Folder&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="move_completed_toggle">
+ <property name="label" translatable="yes">Set move completed folder</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkEntry" id="move_completed_path_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFileChooserButton" id="move_completed_path_chooser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action">select-folder</property>
+ <property name="title" translatable="yes">Select A Folder</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="move_completed">
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Move Completed&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="label_frame">
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="hbox11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckButton" id="label_toggle">
+ <property name="label" translatable="yes">Label: </property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="has_entry">True</property>
+ <child internal-child="entry">
+ <object class="GtkEntry" id="combobox-entry1">
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Label&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Main</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="spacing">5</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="OwnerFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkComboBox" id="OwnerCombobox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">The user selected here will be the owner of the torrent.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Owner&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">3</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">3</property>
+ <property name="column_spacing">2</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="max_upload_speed_toggle">
+ <property name="label" translatable="yes">Max Upload Speed:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="max_connections_toggle">
+ <property name="label" translatable="yes">Max Connections:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="max_upload_slots_toggle">
+ <property name="label" translatable="yes">Max Upload Slots:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="max_download_speed">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="max_upload_speed">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment2</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="max_connections">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment3</property>
+ <property name="climb_rate">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="max_upload_slots">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment4</property>
+ <property name="climb_rate">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">KiB/s</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">KiB/s</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="max_download_speed_toggle">
+ <property name="label" translatable="yes">Max Download Speed:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Bandwidth&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">6</property>
+ <property name="n_columns">3</property>
+ <property name="column_spacing">2</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckButton" id="stop_at_ratio_toggle">
+ <property name="label" translatable="yes">Stop seed at ratio:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkCheckButton" id="remove_at_ratio">
+ <property name="label" translatable="yes">Remove at ratio</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="auto_managed_toggle">
+ <property name="label" translatable="yes">Auto Managed:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="remove_at_ratio_toggle">
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="stop_ratio_toggle">
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="stop_ratio">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment5</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="auto_managed_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkRadioButton" id="auto_managed">
+ <property name="label">gtk-yes</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="isnt_auto_managed">
+ <property name="label">gtk-no</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">auto_managed</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="stop_at_ratio">
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="add_paused_toggle">
+ <property name="label" translatable="yes">Add Paused:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="add_paused_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkRadioButton" id="add_paused">
+ <property name="label">gtk-yes</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="isnt_add_paused">
+ <property name="label">gtk-no</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">add_paused</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="queue_to_top_toggle">
+ <property name="label" translatable="yes">Queue to:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkRadioButton" id="queue_to_top">
+ <property name="label" translatable="yes">Top</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="isnt_queue_to_top">
+ <property name="label" translatable="yes">Bottom</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">queue_to_top</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="seed_mode">
+ <property name="label" translatable="yes">Skip File Hash Check</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Queue&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Options</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">opts_cancel_button</action-widget>
+ <action-widget response="0">opts_add_button</action-widget>
+ <action-widget response="0">opts_apply_button</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/main_tab.js b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/main_tab.js
new file mode 100644
index 0000000..79d2600
--- /dev/null
+++ b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/main_tab.js
@@ -0,0 +1,304 @@
+/**
+ * Script: main_tab.js
+ * The client-side javascript code for the AutoAdd plugin.
+ *
+ * Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.ns('Deluge.ux.AutoAdd');
+
+/**
+ * @class Deluge.ux.AutoAdd.AutoAddMainPanel
+ * @extends Ext.Panel
+ */
+Deluge.ux.AutoAdd.AutoAddMainPanel = Ext.extend(Ext.Panel, {
+ id: 'main_tab_panel',
+ title: _('Main'),
+
+ initComponent: function() {
+ Deluge.ux.AutoAdd.AutoAddMainPanel.superclass.initComponent.call(this);
+ this.watchFolderFset = new Ext.form.FieldSet({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Watch Folder'),
+ defaultType: 'textfield',
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ width: '85%',
+ labelWidth: 1,
+ items: [
+ {
+ xtype: 'textfield',
+ id: 'path',
+ hideLabel: true,
+ width: 304,
+ },
+ {
+ hideLabel: true,
+ id: 'enabled',
+ xtype: 'checkbox',
+ boxLabel: _('Enable this watch folder'),
+ checked: true,
+ },
+ ],
+ });
+
+ this.torrentActionFset = new Ext.form.FieldSet({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Torrent File Action'),
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ width: '85%',
+ labelWidth: 1,
+ defaults: {
+ style: 'margin-bottom: 2px',
+ },
+ items: [
+ {
+ xtype: 'radiogroup',
+ columns: 1,
+ items: [
+ {
+ xtype: 'radio',
+ name: 'torrent_action',
+ id: 'isnt_append_extension',
+ boxLabel: _('Delete .torrent after adding'),
+ checked: true,
+ hideLabel: true,
+ listeners: {
+ check: function(cb, newValue) {
+ if (newValue) {
+ Ext.getCmp(
+ 'append_extension'
+ ).setDisabled(newValue);
+ Ext.getCmp('copy_torrent').setDisabled(
+ newValue
+ );
+ Ext.getCmp(
+ 'delete_copy_torrent_toggle'
+ ).setDisabled(newValue);
+ }
+ },
+ },
+ },
+ {
+ xtype: 'container',
+ layout: 'hbox',
+ hideLabel: true,
+ items: [
+ {
+ xtype: 'radio',
+ name: 'torrent_action',
+ id: 'append_extension_toggle',
+ boxLabel: _(
+ 'Append extension after adding:'
+ ),
+ hideLabel: true,
+ listeners: {
+ check: function(cb, newValue) {
+ if (newValue) {
+ Ext.getCmp(
+ 'append_extension'
+ ).setDisabled(!newValue);
+ Ext.getCmp(
+ 'copy_torrent'
+ ).setDisabled(newValue);
+ Ext.getCmp(
+ 'delete_copy_torrent_toggle'
+ ).setDisabled(newValue);
+ }
+ },
+ },
+ },
+ {
+ xtype: 'textfield',
+ id: 'append_extension',
+ hideLabel: true,
+ disabled: true,
+ style: 'margin-left: 2px',
+ width: 112,
+ },
+ ],
+ },
+ {
+ xtype: 'container',
+ hideLabel: true,
+ items: [
+ {
+ xtype: 'container',
+ layout: 'hbox',
+ hideLabel: true,
+ items: [
+ {
+ xtype: 'radio',
+ name: 'torrent_action',
+ id: 'copy_torrent_toggle',
+ boxLabel: _(
+ 'Copy of .torrent files to:'
+ ),
+ hideLabel: true,
+ listeners: {
+ check: function(cb, newValue) {
+ if (newValue) {
+ Ext.getCmp(
+ 'append_extension'
+ ).setDisabled(newValue);
+ Ext.getCmp(
+ 'copy_torrent'
+ ).setDisabled(
+ !newValue
+ );
+ Ext.getCmp(
+ 'delete_copy_torrent_toggle'
+ ).setDisabled(
+ !newValue
+ );
+ }
+ },
+ },
+ },
+ {
+ xtype: 'textfield',
+ id: 'copy_torrent',
+ hideLabel: true,
+ disabled: true,
+ style: 'margin-left: 2px',
+ width: 152,
+ },
+ ],
+ },
+ {
+ xtype: 'checkbox',
+ id: 'delete_copy_torrent_toggle',
+ boxLabel: _(
+ 'Delete copy of torrent file on remove'
+ ),
+ style: 'margin-left: 10px',
+ disabled: true,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ });
+
+ this.downloadFolderFset = new Ext.form.FieldSet({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Download Folder'),
+ defaultType: 'textfield',
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ width: '85%',
+ labelWidth: 1,
+ items: [
+ {
+ hideLabel: true,
+ id: 'download_location_toggle',
+ xtype: 'checkbox',
+ boxLabel: _('Set download folder'),
+ listeners: {
+ check: function(cb, checked) {
+ Ext.getCmp('download_location').setDisabled(
+ !checked
+ );
+ },
+ },
+ },
+ {
+ xtype: 'textfield',
+ id: 'download_location',
+ hideLabel: true,
+ width: 304,
+ disabled: true,
+ },
+ ],
+ });
+
+ this.moveCompletedFset = new Ext.form.FieldSet({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Move Completed'),
+ defaultType: 'textfield',
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ width: '85%',
+ labelWidth: 1,
+ items: [
+ {
+ hideLabel: true,
+ id: 'move_completed_toggle',
+ xtype: 'checkbox',
+ boxLabel: _('Set move completed folder'),
+ listeners: {
+ check: function(cb, checked) {
+ Ext.getCmp('move_completed_path').setDisabled(
+ !checked
+ );
+ },
+ },
+ },
+ {
+ xtype: 'textfield',
+ id: 'move_completed_path',
+ hideLabel: true,
+ width: 304,
+ disabled: true,
+ },
+ ],
+ });
+
+ this.LabelFset = new Ext.form.FieldSet({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Label'),
+ defaultType: 'textfield',
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 3px;',
+ //width: '85%',
+ labelWidth: 1,
+ //hidden: true,
+ items: [
+ {
+ xtype: 'container',
+ layout: 'hbox',
+ hideLabel: true,
+ items: [
+ {
+ hashLabel: false,
+ id: 'label_toggle',
+ xtype: 'checkbox',
+ boxLabel: _('Label:'),
+ listeners: {
+ check: function(cb, checked) {
+ Ext.getCmp('label').setDisabled(!checked);
+ },
+ },
+ },
+ {
+ xtype: 'combo',
+ id: 'label',
+ hideLabel: true,
+ //width: 220,
+ width: 254,
+ disabled: true,
+ style: 'margin-left: 2px',
+ mode: 'local',
+ valueField: 'displayText',
+ displayField: 'displayText',
+ },
+ ],
+ },
+ ],
+ });
+
+ this.add([
+ this.watchFolderFset,
+ this.torrentActionFset,
+ this.downloadFolderFset,
+ this.moveCompletedFset,
+ this.LabelFset,
+ ]);
+ },
+});
diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/options_tab.js b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/options_tab.js
new file mode 100644
index 0000000..a69490c
--- /dev/null
+++ b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/options_tab.js
@@ -0,0 +1,302 @@
+/**
+ * Script: options_tab.js
+ * The client-side javascript code for the AutoAdd plugin.
+ *
+ * Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.ns('Deluge.ux.AutoAdd');
+
+/**
+ * @class Deluge.ux.AutoAdd.AutoAddOptionsPanel
+ * @extends Ext.Panel
+ */
+Deluge.ux.AutoAdd.AutoAddOptionsPanel = Ext.extend(Ext.Panel, {
+ id: 'options_tab_panel',
+ title: _('Options'),
+
+ initComponent: function() {
+ Deluge.ux.AutoAdd.AutoAddOptionsPanel.superclass.initComponent.call(
+ this
+ );
+ var maxDownload = {
+ idCheckbox: 'max_download_speed_toggle',
+ labelCheckbox: 'Max Download Speed (KiB/s):',
+ idSpinner: 'max_download_speed',
+ decimalPrecision: 1,
+ };
+ var maxUploadSpeed = {
+ idCheckbox: 'max_upload_speed_toggle',
+ labelCheckbox: 'Max upload Speed (KiB/s):',
+ idSpinner: 'max_upload_speed',
+ decimalPrecision: 1,
+ };
+ var maxConnections = {
+ idCheckbox: 'max_connections_toggle',
+ labelCheckbox: 'Max Connections::',
+ idSpinner: 'max_connections',
+ decimalPrecision: 0,
+ };
+ var maxUploadSlots = {
+ idCheckbox: 'max_upload_slots_toggle',
+ labelCheckbox: 'Max Upload Slots:',
+ idSpinner: 'max_upload_slots',
+ decimalPrecision: 0,
+ };
+ // queue data
+ var addPause = {
+ idCheckbox: 'add_paused_toggle',
+ labelCheckbox: 'Add Pause:',
+ nameRadio: 'add_paused',
+ labelRadio: {
+ yes: 'Yes',
+ no: 'No',
+ },
+ };
+ var queueTo = {
+ idCheckbox: 'queue_to_top_toggle',
+ labelCheckbox: 'Queue To:',
+ nameRadio: 'queue_to_top',
+ labelRadio: {
+ yes: 'Top',
+ no: 'Bottom',
+ },
+ };
+ var autoManaged = {
+ idCheckbox: 'auto_managed_toggle',
+ labelCheckbox: 'Auto Managed:',
+ nameRadio: 'auto_managed',
+ labelRadio: {
+ yes: 'Yes',
+ no: 'No',
+ },
+ };
+
+ this.ownerFset = new Ext.form.FieldSet({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Owner'),
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ //width: '85%',
+ labelWidth: 1,
+ items: [
+ {
+ xtype: 'combo',
+ id: 'owner',
+ hideLabel: true,
+ width: 312,
+ mode: 'local',
+ valueField: 'displayText',
+ displayField: 'displayText',
+ },
+ ],
+ });
+
+ this.bandwidthFset = new Ext.form.FieldSet({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Bandwidth'),
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ //width: '85%',
+ labelWidth: 1,
+ defaults: {
+ style: 'margin-bottom: 5px',
+ },
+ });
+ this.bandwidthFset.add(this._getBandwidthContainer(maxDownload));
+ this.bandwidthFset.add(this._getBandwidthContainer(maxUploadSpeed));
+ this.bandwidthFset.add(this._getBandwidthContainer(maxConnections));
+ this.bandwidthFset.add(this._getBandwidthContainer(maxUploadSlots));
+
+ this.queueFset = new Ext.form.FieldSet({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Queue'),
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ //width: '85%',
+ labelWidth: 1,
+ defaults: {
+ style: 'margin-bottom: 5px',
+ },
+ items: [
+ {
+ xtype: 'container',
+ layout: 'hbox',
+ hideLabel: true,
+ },
+ ],
+ });
+ this.queueFset.add(this._getQueueContainer(addPause));
+ this.queueFset.add(this._getQueueContainer(queueTo));
+ this.queueFset.add(this._getQueueContainer(autoManaged));
+ this.queueFset.add({
+ xtype: 'container',
+ hideLabel: true,
+ items: [
+ {
+ xtype: 'container',
+ layout: 'hbox',
+ hideLabel: true,
+ items: [
+ {
+ xtype: 'checkbox',
+ id: 'stop_at_ratio_toggle',
+ boxLabel: _('Stop seed at ratio:'),
+ hideLabel: true,
+ width: 175,
+ listeners: {
+ check: function(cb, checked) {
+ Ext.getCmp('stop_ratio').setDisabled(
+ !checked
+ );
+ Ext.getCmp('remove_at_ratio').setDisabled(
+ !checked
+ );
+ },
+ },
+ },
+ {
+ xtype: 'spinnerfield',
+ id: 'stop_ratio',
+ hideLabel: true,
+ disabled: true,
+ value: 0.0,
+ minValue: 0.0,
+ maxValue: 100.0,
+ decimalPrecision: 1,
+ incrementValue: 0.1,
+ style: 'margin-left: 2px',
+ width: 100,
+ },
+ ],
+ },
+ {
+ xtype: 'container',
+ layout: 'hbox',
+ hideLabel: true,
+ style: 'margin-left: 10px',
+ items: [
+ {
+ xtype: 'checkbox',
+ id: 'remove_at_ratio',
+ boxLabel: _('Remove at ratio'),
+ disabled: true,
+ checked: true,
+ },
+ {
+ xtype: 'checkbox',
+ id: 'remove_at_ratio_toggle',
+ disabled: true,
+ checked: true,
+ hidden: true,
+ },
+ {
+ xtype: 'checkbox',
+ id: 'stop_ratio_toggle',
+ disabled: true,
+ checked: true,
+ hidden: true,
+ },
+ {
+ xtype: 'checkbox',
+ id: 'stop_ratio_toggle',
+ disabled: true,
+ checked: true,
+ hidden: true,
+ },
+ ],
+ },
+ ],
+ });
+ this.queueFset.add({
+ xtype: 'checkbox',
+ id: 'seed_mode',
+ boxLabel: _('Skip File Hash Check'),
+ hideLabel: true,
+ width: 175,
+ });
+
+ this.add([this.ownerFset, this.bandwidthFset, this.queueFset]);
+ },
+
+ _getBandwidthContainer: function(values) {
+ return new Ext.Container({
+ xtype: 'container',
+ layout: 'hbox',
+ hideLabel: true,
+ items: [
+ {
+ xtype: 'checkbox',
+ hideLabel: true,
+ id: values.idCheckbox,
+ boxLabel: _(values.labelCheckbox),
+ width: 175,
+ listeners: {
+ check: function(cb, checked) {
+ Ext.getCmp(values.idSpinner).setDisabled(!checked);
+ },
+ },
+ },
+ {
+ xtype: 'spinnerfield',
+ id: values.idSpinner,
+ hideLabel: true,
+ disabled: true,
+ minValue: -1,
+ maxValue: 10000,
+ value: 0.0,
+ decimalPrecision: values.decimalPrecision,
+ style: 'margin-left: 2px',
+ width: 100,
+ },
+ ],
+ });
+ },
+
+ _getQueueContainer: function(values) {
+ return new Ext.Container({
+ xtype: 'container',
+ layout: 'hbox',
+ hideLabel: true,
+ items: [
+ {
+ xtype: 'checkbox',
+ hideLabel: true,
+ id: values.idCheckbox,
+ boxLabel: _(values.labelCheckbox),
+ width: 175,
+ listeners: {
+ check: function(cb, checked) {
+ Ext.getCmp(values.nameRadio).setDisabled(!checked);
+ Ext.getCmp('not_' + values.nameRadio).setDisabled(
+ !checked
+ );
+ },
+ },
+ },
+ {
+ xtype: 'radio',
+ name: values.nameRadio,
+ id: values.nameRadio,
+ boxLabel: _(values.labelRadio.yes),
+ hideLabel: true,
+ checked: true,
+ disabled: true,
+ width: 50,
+ },
+ {
+ xtype: 'radio',
+ name: values.nameRadio,
+ id: 'not_' + values.nameRadio,
+ boxLabel: _(values.labelRadio.no),
+ hideLabel: true,
+ disabled: true,
+ },
+ ],
+ });
+ },
+});
diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui b/deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui
new file mode 100644
index 0000000..0e645d3
--- /dev/null
+++ b/deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkWindow" id="prefs_window">
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="prefs_box_1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="prefs_box">
+ <property name="width_request">340</property>
+ <property name="height_request">390</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">3</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="watchdirs_vbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="homogeneous">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Watch Folders:&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="add_button">
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_add_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="remove_button">
+ <property name="label">gtk-remove</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_remove_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="edit_button">
+ <property name="label">gtk-edit</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_edit_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py b/deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py
new file mode 100644
index 0000000..16f0f7a
--- /dev/null
+++ b/deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py
@@ -0,0 +1,580 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+
+import gi # isort:skip (Required before Gtk import).
+
+gi.require_version('Gtk', '3.0') # NOQA: E402
+
+# isort:imports-thirdparty
+from gi.repository import Gtk
+
+# isort:imports-firstparty
+import deluge.common
+import deluge.component as component
+from deluge.plugins.pluginbase import Gtk3PluginBase
+from deluge.ui.client import client
+from deluge.ui.gtk3 import dialogs
+
+# isort:imports-localfolder
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+
+class IncompatibleOption(Exception):
+ pass
+
+
+class OptionsDialog(object):
+ spin_ids = ['max_download_speed', 'max_upload_speed', 'stop_ratio']
+ spin_int_ids = ['max_upload_slots', 'max_connections']
+ chk_ids = [
+ 'stop_at_ratio',
+ 'remove_at_ratio',
+ 'move_completed',
+ 'add_paused',
+ 'auto_managed',
+ 'queue_to_top',
+ ]
+
+ def __init__(self):
+ self.accounts = Gtk.ListStore(str)
+ self.labels = Gtk.ListStore(str)
+ self.core_config = {}
+
+ def show(self, options=None, watchdir_id=None):
+ if options is None:
+ options = {}
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(get_resource('autoadd_options.ui'))
+ self.builder.connect_signals(
+ {
+ 'on_opts_add': self.on_add,
+ 'on_opts_apply': self.on_apply,
+ 'on_opts_cancel': self.on_cancel,
+ 'on_options_dialog_close': self.on_cancel,
+ 'on_toggle_toggled': self.on_toggle_toggled,
+ }
+ )
+ self.dialog = self.builder.get_object('options_dialog')
+ self.dialog.set_transient_for(component.get('Preferences').pref_dialog)
+
+ if watchdir_id:
+ # We have an existing watchdir_id, we are editing
+ self.builder.get_object('opts_add_button').hide()
+ self.builder.get_object('opts_apply_button').show()
+ self.watchdir_id = watchdir_id
+ else:
+ # We don't have an id, adding
+ self.builder.get_object('opts_add_button').show()
+ self.builder.get_object('opts_apply_button').hide()
+ self.watchdir_id = None
+
+ self.load_options(options)
+ self.dialog.run()
+
+ def load_options(self, options):
+ self.builder.get_object('enabled').set_active(options.get('enabled', True))
+ self.builder.get_object('append_extension_toggle').set_active(
+ options.get('append_extension_toggle', False)
+ )
+ self.builder.get_object('append_extension').set_text(
+ options.get('append_extension', '.added')
+ )
+ self.builder.get_object('download_location_toggle').set_active(
+ options.get('download_location_toggle', False)
+ )
+ self.builder.get_object('copy_torrent_toggle').set_active(
+ options.get('copy_torrent_toggle', False)
+ )
+ self.builder.get_object('delete_copy_torrent_toggle').set_active(
+ options.get('delete_copy_torrent_toggle', False)
+ )
+ self.builder.get_object('seed_mode').set_active(options.get('seed_mode', False))
+ self.accounts.clear()
+ self.labels.clear()
+ combobox = self.builder.get_object('OwnerCombobox')
+ combobox_render = Gtk.CellRendererText()
+ combobox.pack_start(combobox_render, True)
+ combobox.add_attribute(combobox_render, 'text', 0)
+ combobox.set_model(self.accounts)
+
+ label_widget = self.builder.get_object('label')
+ label_widget.get_child().set_text(options.get('label', ''))
+ label_widget.set_model(self.labels)
+ label_widget.set_entry_text_column(0)
+ self.builder.get_object('label_toggle').set_active(
+ options.get('label_toggle', False)
+ )
+
+ for spin_id in self.spin_ids + self.spin_int_ids:
+ self.builder.get_object(spin_id).set_value(options.get(spin_id, 0))
+ self.builder.get_object(spin_id + '_toggle').set_active(
+ options.get(spin_id + '_toggle', False)
+ )
+ for chk_id in self.chk_ids:
+ self.builder.get_object(chk_id).set_active(bool(options.get(chk_id, True)))
+ self.builder.get_object(chk_id + '_toggle').set_active(
+ options.get(chk_id + '_toggle', False)
+ )
+ if not options.get('add_paused', True):
+ self.builder.get_object('isnt_add_paused').set_active(True)
+ if not options.get('queue_to_top', True):
+ self.builder.get_object('isnt_queue_to_top').set_active(True)
+ if not options.get('auto_managed', True):
+ self.builder.get_object('isnt_auto_managed').set_active(True)
+ for field in [
+ 'move_completed_path',
+ 'path',
+ 'download_location',
+ 'copy_torrent',
+ ]:
+ if client.is_localhost():
+ self.builder.get_object(field + '_chooser').set_current_folder(
+ options.get(field, os.path.expanduser('~'))
+ )
+ self.builder.get_object(field + '_chooser').show()
+ self.builder.get_object(field + '_entry').hide()
+ else:
+ self.builder.get_object(field + '_entry').set_text(
+ options.get(field, '')
+ )
+ self.builder.get_object(field + '_entry').show()
+ self.builder.get_object(field + '_chooser').hide()
+ self.set_sensitive()
+
+ def on_core_config(config):
+ if client.is_localhost():
+ self.builder.get_object('download_location_chooser').set_current_folder(
+ options.get('download_location', config['download_location'])
+ )
+ if options.get('move_completed_toggle', config['move_completed']):
+ self.builder.get_object('move_completed_toggle').set_active(True)
+ self.builder.get_object(
+ 'move_completed_path_chooser'
+ ).set_current_folder(
+ options.get(
+ 'move_completed_path', config['move_completed_path']
+ )
+ )
+ if options.get('copy_torrent_toggle', config['copy_torrent_file']):
+ self.builder.get_object('copy_torrent_toggle').set_active(True)
+ self.builder.get_object('copy_torrent_chooser').set_current_folder(
+ options.get('copy_torrent', config['torrentfiles_location'])
+ )
+ else:
+ self.builder.get_object('download_location_entry').set_text(
+ options.get('download_location', config['download_location'])
+ )
+ if options.get('move_completed_toggle', config['move_completed']):
+ self.builder.get_object('move_completed_toggle').set_active(
+ options.get('move_completed_toggle', False)
+ )
+ self.builder.get_object('move_completed_path_entry').set_text(
+ options.get(
+ 'move_completed_path', config['move_completed_path']
+ )
+ )
+ if options.get('copy_torrent_toggle', config['copy_torrent_file']):
+ self.builder.get_object('copy_torrent_toggle').set_active(True)
+ self.builder.get_object('copy_torrent_entry').set_text(
+ options.get('copy_torrent', config['torrentfiles_location'])
+ )
+
+ if options.get(
+ 'delete_copy_torrent_toggle', config['del_copy_torrent_file']
+ ):
+ self.builder.get_object('delete_copy_torrent_toggle').set_active(True)
+
+ if not options:
+ client.core.get_config().addCallback(on_core_config)
+
+ def on_accounts(accounts, owner):
+ log.debug('Got Accounts')
+ selected_iter = None
+ for account in accounts:
+ acc_iter = self.accounts.append()
+ self.accounts.set_value(acc_iter, 0, account['username'])
+ if account['username'] == owner:
+ selected_iter = acc_iter
+ self.builder.get_object('OwnerCombobox').set_active_iter(selected_iter)
+
+ def on_accounts_failure(failure):
+ log.debug('Failed to get accounts!!! %s', failure)
+ acc_iter = self.accounts.append()
+ self.accounts.set_value(acc_iter, 0, client.get_auth_user())
+ self.builder.get_object('OwnerCombobox').set_active(0)
+ self.builder.get_object('OwnerCombobox').set_sensitive(False)
+
+ def on_labels(labels):
+ log.debug('Got Labels: %s', labels)
+ for label in labels:
+ self.labels.set_value(self.labels.append(), 0, label)
+ label_widget = self.builder.get_object('label')
+ label_widget.set_model(self.labels)
+ label_widget.set_entry_text_column(0)
+
+ def on_failure(failure):
+ log.exception(failure)
+
+ def on_get_enabled_plugins(result):
+ if 'Label' in result:
+ self.builder.get_object('label_frame').show()
+ client.label.get_labels().addCallback(on_labels).addErrback(on_failure)
+ else:
+ self.builder.get_object('label_frame').hide()
+ self.builder.get_object('label_toggle').set_active(False)
+
+ client.core.get_enabled_plugins().addCallback(on_get_enabled_plugins)
+ if client.get_auth_level() == deluge.common.AUTH_LEVEL_ADMIN:
+ client.core.get_known_accounts().addCallback(
+ on_accounts, options.get('owner', client.get_auth_user())
+ ).addErrback(on_accounts_failure)
+ else:
+ acc_iter = self.accounts.append()
+ self.accounts.set_value(acc_iter, 0, client.get_auth_user())
+ self.builder.get_object('OwnerCombobox').set_active(0)
+ self.builder.get_object('OwnerCombobox').set_sensitive(False)
+
+ def set_sensitive(self):
+ maintoggles = [
+ 'download_location',
+ 'append_extension',
+ 'move_completed',
+ 'label',
+ 'max_download_speed',
+ 'max_upload_speed',
+ 'max_connections',
+ 'max_upload_slots',
+ 'add_paused',
+ 'auto_managed',
+ 'stop_at_ratio',
+ 'queue_to_top',
+ 'copy_torrent',
+ ]
+ for maintoggle in maintoggles:
+ self.on_toggle_toggled(self.builder.get_object(maintoggle + '_toggle'))
+
+ def on_toggle_toggled(self, tb):
+ toggle = tb.get_name().replace('_toggle', '')
+ isactive = tb.get_active()
+ if toggle == 'download_location':
+ self.builder.get_object('download_location_chooser').set_sensitive(isactive)
+ self.builder.get_object('download_location_entry').set_sensitive(isactive)
+ elif toggle == 'append_extension':
+ self.builder.get_object('append_extension').set_sensitive(isactive)
+ elif toggle == 'copy_torrent':
+ self.builder.get_object('copy_torrent_entry').set_sensitive(isactive)
+ self.builder.get_object('copy_torrent_chooser').set_sensitive(isactive)
+ self.builder.get_object('delete_copy_torrent_toggle').set_sensitive(
+ isactive
+ )
+ elif toggle == 'move_completed':
+ self.builder.get_object('move_completed_path_chooser').set_sensitive(
+ isactive
+ )
+ self.builder.get_object('move_completed_path_entry').set_sensitive(isactive)
+ self.builder.get_object('move_completed').set_active(isactive)
+ elif toggle == 'label':
+ self.builder.get_object('label').set_sensitive(isactive)
+ elif toggle == 'max_download_speed':
+ self.builder.get_object('max_download_speed').set_sensitive(isactive)
+ elif toggle == 'max_upload_speed':
+ self.builder.get_object('max_upload_speed').set_sensitive(isactive)
+ elif toggle == 'max_connections':
+ self.builder.get_object('max_connections').set_sensitive(isactive)
+ elif toggle == 'max_upload_slots':
+ self.builder.get_object('max_upload_slots').set_sensitive(isactive)
+ elif toggle == 'add_paused':
+ self.builder.get_object('add_paused').set_sensitive(isactive)
+ self.builder.get_object('isnt_add_paused').set_sensitive(isactive)
+ elif toggle == 'queue_to_top':
+ self.builder.get_object('queue_to_top').set_sensitive(isactive)
+ self.builder.get_object('isnt_queue_to_top').set_sensitive(isactive)
+ elif toggle == 'auto_managed':
+ self.builder.get_object('auto_managed').set_sensitive(isactive)
+ self.builder.get_object('isnt_auto_managed').set_sensitive(isactive)
+ elif toggle == 'stop_at_ratio':
+ self.builder.get_object('remove_at_ratio_toggle').set_active(isactive)
+ self.builder.get_object('stop_ratio_toggle').set_active(isactive)
+ self.builder.get_object('stop_at_ratio').set_active(isactive)
+ self.builder.get_object('stop_ratio').set_sensitive(isactive)
+ self.builder.get_object('remove_at_ratio').set_sensitive(isactive)
+
+ def on_apply(self, event=None):
+ try:
+ options = self.generate_opts()
+ client.autoadd.set_options(str(self.watchdir_id), options).addCallbacks(
+ self.on_added, self.on_error_show
+ )
+ except IncompatibleOption as ex:
+ dialogs.ErrorDialog(_('Incompatible Option'), str(ex), self.dialog).run()
+
+ def on_error_show(self, result):
+ d = dialogs.ErrorDialog(_('Error'), result.value.exception_msg, self.dialog)
+ result.cleanFailure()
+ d.run()
+
+ def on_added(self, result):
+ self.dialog.destroy()
+
+ def on_add(self, event=None):
+ try:
+ options = self.generate_opts()
+ client.autoadd.add(options).addCallbacks(self.on_added, self.on_error_show)
+ except IncompatibleOption as ex:
+ dialogs.ErrorDialog(_('Incompatible Option'), str(ex), self.dialog).run()
+
+ def on_cancel(self, event=None):
+ self.dialog.destroy()
+
+ def generate_opts(self):
+ # generate options dict based on gtk objects
+ options = {}
+ options['enabled'] = self.builder.get_object('enabled').get_active()
+ if client.is_localhost():
+ options['path'] = self.builder.get_object('path_chooser').get_filename()
+ options['download_location'] = self.builder.get_object(
+ 'download_location_chooser'
+ ).get_filename()
+ options['move_completed_path'] = self.builder.get_object(
+ 'move_completed_path_chooser'
+ ).get_filename()
+ options['copy_torrent'] = self.builder.get_object(
+ 'copy_torrent_chooser'
+ ).get_filename()
+ else:
+ options['path'] = self.builder.get_object('path_entry').get_text()
+ options['download_location'] = self.builder.get_object(
+ 'download_location_entry'
+ ).get_text()
+ options['move_completed_path'] = self.builder.get_object(
+ 'move_completed_path_entry'
+ ).get_text()
+ options['copy_torrent'] = self.builder.get_object(
+ 'copy_torrent_entry'
+ ).get_text()
+
+ options['label'] = (
+ self.builder.get_object('label').get_child().get_text().lower()
+ )
+ options['append_extension'] = self.builder.get_object(
+ 'append_extension'
+ ).get_text()
+ options['owner'] = self.accounts[
+ self.builder.get_object('OwnerCombobox').get_active()
+ ][0]
+
+ for key in [
+ 'append_extension_toggle',
+ 'download_location_toggle',
+ 'label_toggle',
+ 'copy_torrent_toggle',
+ 'delete_copy_torrent_toggle',
+ 'seed_mode',
+ ]:
+ options[key] = self.builder.get_object(key).get_active()
+
+ for spin_id in self.spin_ids:
+ options[spin_id] = self.builder.get_object(spin_id).get_value()
+ options[spin_id + '_toggle'] = self.builder.get_object(
+ spin_id + '_toggle'
+ ).get_active()
+ for spin_int_id in self.spin_int_ids:
+ options[spin_int_id] = self.builder.get_object(
+ spin_int_id
+ ).get_value_as_int()
+ options[spin_int_id + '_toggle'] = self.builder.get_object(
+ spin_int_id + '_toggle'
+ ).get_active()
+ for chk_id in self.chk_ids:
+ options[chk_id] = self.builder.get_object(chk_id).get_active()
+ options[chk_id + '_toggle'] = self.builder.get_object(
+ chk_id + '_toggle'
+ ).get_active()
+
+ if (
+ options['copy_torrent_toggle']
+ and options['path'] == options['copy_torrent']
+ ):
+ raise IncompatibleOption(
+ _(
+ '"Watch Folder" directory and "Copy of .torrent'
+ ' files to" directory cannot be the same!'
+ )
+ )
+ return options
+
+
+class GtkUI(Gtk3PluginBase):
+ def enable(self):
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(get_resource('config.ui'))
+ self.builder.connect_signals(self)
+ self.opts_dialog = OptionsDialog()
+
+ component.get('PluginManager').register_hook(
+ 'on_apply_prefs', self.on_apply_prefs
+ )
+ component.get('PluginManager').register_hook(
+ 'on_show_prefs', self.on_show_prefs
+ )
+ client.register_event_handler(
+ 'AutoaddOptionsChangedEvent', self.on_options_changed_event
+ )
+
+ self.watchdirs = {}
+
+ vbox = self.builder.get_object('watchdirs_vbox')
+ sw = Gtk.ScrolledWindow()
+ sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN)
+ sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
+
+ vbox.pack_start(sw, True, True, 0)
+
+ self.store = self.create_model()
+
+ self.treeView = Gtk.TreeView(self.store)
+ self.treeView.connect('cursor-changed', self.on_listitem_activated)
+ self.treeView.connect('row-activated', self.on_edit_button_clicked)
+ self.treeView.set_rules_hint(True)
+
+ self.create_columns(self.treeView)
+ sw.add(self.treeView)
+ sw.show_all()
+ component.get('Preferences').add_page(
+ _('AutoAdd'), self.builder.get_object('prefs_box')
+ )
+
+ def disable(self):
+ component.get('Preferences').remove_page(_('AutoAdd'))
+ component.get('PluginManager').deregister_hook(
+ 'on_apply_prefs', self.on_apply_prefs
+ )
+ component.get('PluginManager').deregister_hook(
+ 'on_show_prefs', self.on_show_prefs
+ )
+
+ def create_model(self):
+ store = Gtk.ListStore(str, bool, str, str)
+ for watchdir_id, watchdir in self.watchdirs.items():
+ store.append(
+ [
+ watchdir_id,
+ watchdir['enabled'],
+ watchdir.get('owner', 'localclient'),
+ watchdir['path'],
+ ]
+ )
+ return store
+
+ def create_columns(self, treeview):
+ renderer_toggle = Gtk.CellRendererToggle()
+ column = Gtk.TreeViewColumn(
+ _('Active'), renderer_toggle, activatable=1, active=1
+ )
+ column.set_sort_column_id(1)
+ treeview.append_column(column)
+ tt = Gtk.Tooltip()
+ tt.set_text(_('Double-click to toggle'))
+ treeview.set_tooltip_cell(tt, None, None, renderer_toggle)
+
+ renderertext = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn(_('Owner'), renderertext, text=2)
+ column.set_sort_column_id(2)
+ treeview.append_column(column)
+ tt2 = Gtk.Tooltip()
+ tt2.set_text(_('Double-click to edit'))
+ treeview.set_has_tooltip(True)
+
+ renderertext = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn(_('Path'), renderertext, text=3)
+ column.set_sort_column_id(3)
+ treeview.append_column(column)
+ tt2 = Gtk.Tooltip()
+ tt2.set_text(_('Double-click to edit'))
+ treeview.set_has_tooltip(True)
+
+ def load_watchdir_list(self):
+ pass
+
+ def add_watchdir_entry(self):
+ pass
+
+ def on_add_button_clicked(self, event=None):
+ # display options_window
+ self.opts_dialog.show()
+
+ def on_remove_button_clicked(self, event=None):
+ tree, tree_id = self.treeView.get_selection().get_selected()
+ watchdir_id = str(self.store.get_value(tree_id, 0))
+ if watchdir_id:
+ client.autoadd.remove(watchdir_id)
+
+ def on_edit_button_clicked(self, event=None, a=None, col=None):
+ tree, tree_id = self.treeView.get_selection().get_selected()
+ watchdir_id = str(self.store.get_value(tree_id, 0))
+ if watchdir_id:
+ if col and col.get_title() == _('Active'):
+ if self.watchdirs[watchdir_id]['enabled']:
+ client.autoadd.disable_watchdir(watchdir_id)
+ else:
+ client.autoadd.enable_watchdir(watchdir_id)
+ else:
+ self.opts_dialog.show(self.watchdirs[watchdir_id], watchdir_id)
+
+ def on_listitem_activated(self, treeview):
+ tree, tree_id = self.treeView.get_selection().get_selected()
+ if tree_id:
+ self.builder.get_object('edit_button').set_sensitive(True)
+ self.builder.get_object('remove_button').set_sensitive(True)
+ else:
+ self.builder.get_object('edit_button').set_sensitive(False)
+ self.builder.get_object('remove_button').set_sensitive(False)
+
+ def on_apply_prefs(self):
+ log.debug('applying prefs for AutoAdd')
+ for watchdir_id, watchdir in self.watchdirs.items():
+ client.autoadd.set_options(watchdir_id, watchdir)
+
+ def on_show_prefs(self):
+ client.autoadd.get_watchdirs().addCallback(self.cb_get_config)
+
+ def on_options_changed_event(self):
+ client.autoadd.get_watchdirs().addCallback(self.cb_get_config)
+
+ def cb_get_config(self, watchdirs):
+ """callback for on show_prefs"""
+ log.trace('Got whatchdirs from core: %s', watchdirs)
+ self.watchdirs = watchdirs or {}
+ self.store.clear()
+ for watchdir_id, watchdir in self.watchdirs.items():
+ self.store.append(
+ [
+ watchdir_id,
+ watchdir['enabled'],
+ watchdir.get('owner', 'localclient'),
+ watchdir['path'],
+ ]
+ )
+ # Workaround for cached glade signal appearing when re-enabling plugin in same session
+ if self.builder.get_object('edit_button'):
+ # Disable the remove and edit buttons, because nothing in the store is selected
+ self.builder.get_object('remove_button').set_sensitive(False)
+ self.builder.get_object('edit_button').set_sensitive(False)
diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/webui.py b/deluge/plugins/AutoAdd/deluge_autoadd/webui.py
new file mode 100644
index 0000000..7f36ba6
--- /dev/null
+++ b/deluge/plugins/AutoAdd/deluge_autoadd/webui.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.plugins.pluginbase import WebPluginBase
+
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+
+class WebUI(WebPluginBase):
+ scripts = [
+ get_resource('autoadd.js'),
+ get_resource('autoadd_options.js'),
+ get_resource('main_tab.js', True),
+ get_resource('options_tab.js', True),
+ ]
+
+ def enable(self):
+ pass
+
+ def disable(self):
+ pass
diff --git a/deluge/plugins/AutoAdd/setup.py b/deluge/plugins/AutoAdd/setup.py
new file mode 100644
index 0000000..fcd0183
--- /dev/null
+++ b/deluge/plugins/AutoAdd/setup.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com>
+# Copyright (C) 2011 Pedro Algarvio <pedro@algarvio.me>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from setuptools import find_packages, setup
+
+__plugin_name__ = 'AutoAdd'
+__author__ = 'Chase Sterling, Pedro Algarvio'
+__author_email__ = 'chase.sterling@gmail.com, pedro@algarvio.me'
+__version__ = '1.8'
+__url__ = 'http://dev.deluge-torrent.org/wiki/Plugins/AutoAdd'
+__license__ = 'GPLv3'
+__description__ = 'Monitors folders for .torrent files.'
+__long_description__ = """"""
+__pkg_data__ = {'deluge_' + __plugin_name__.lower(): ['data/*', 'data/*/*']}
+
+setup(
+ name=__plugin_name__,
+ version=__version__,
+ description=__description__,
+ author=__author__,
+ author_email=__author_email__,
+ url=__url__,
+ license=__license__,
+ long_description=__long_description__ if __long_description__ else __description__,
+ packages=find_packages(),
+ package_data=__pkg_data__,
+ entry_points="""
+ [deluge.plugin.core]
+ %s = deluge_%s:CorePlugin
+ [deluge.plugin.gtk3ui]
+ %s = deluge_%s:Gtk3UIPlugin
+ [deluge.plugin.web]
+ %s = deluge_%s:WebUIPlugin
+ """
+ % ((__plugin_name__, __plugin_name__.lower()) * 3),
+)
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/__init__.py b/deluge/plugins/Blocklist/deluge_blocklist/__init__.py
new file mode 100644
index 0000000..96ccc02
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/__init__.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.plugins.init import PluginInitBase
+
+
+class CorePlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .core import Core as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(CorePlugin, self).__init__(plugin_name)
+
+
+class GtkUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .gtkui import GtkUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(GtkUIPlugin, self).__init__(plugin_name)
+
+
+class WebUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .webui import WebUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(WebUIPlugin, self).__init__(plugin_name)
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/common.py b/deluge/plugins/Blocklist/deluge_blocklist/common.py
new file mode 100644
index 0000000..a9299cd
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/common.py
@@ -0,0 +1,176 @@
+# -*- coding: utf-8 -*-
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# 2009 Damien Churchill <damoxc@gmail.com>
+# 2010 Pedro Algarvio <pedro@algarvio.me>
+# 2017 Calum Lind <calumlind+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os.path
+from functools import wraps
+from sys import exc_info
+
+import six
+from pkg_resources import resource_filename
+
+
+def get_resource(filename):
+ return resource_filename(__package__, os.path.join('data', filename))
+
+
+def raises_errors_as(error):
+ """Factory class that returns a decorator which wraps the decorated
+ function to raise all exceptions as the specified error type.
+
+ """
+
+ def decorator(func):
+ """Returns a function which wraps the given func to raise all exceptions as error."""
+
+ @wraps(func)
+ def wrapper(self, *args, **kwargs):
+ """Wraps the function in a try..except block and calls it with the specified args.
+
+ Raises:
+ Any exceptions as error preserving the message and traceback.
+
+ """
+ try:
+ return func(self, *args, **kwargs)
+ except Exception:
+ (value, tb) = exc_info()[1:]
+ six.reraise(error, value, tb)
+
+ return wrapper
+
+ return decorator
+
+
+def remove_zeros(ip):
+ """Removes unneeded zeros from ip addresses.
+
+ Args:
+ ip (str): The ip address.
+
+ Returns:
+ str: The ip address without the unneeded zeros.
+
+ Example:
+ 000.000.000.003 -> 0.0.0.3
+
+ """
+ return '.'.join([part.lstrip('0').zfill(1) for part in ip.split('.')])
+
+
+class BadIP(Exception):
+ _message = None
+
+ def __init__(self, message):
+ super(BadIP, self).__init__(message)
+
+ def __set_message(self, message):
+ self._message = message
+
+ def __get_message(self):
+ return self._message
+
+ message = property(__get_message, __set_message)
+ del __get_message, __set_message
+
+
+class IP(object):
+ __slots__ = ('q1', 'q2', 'q3', 'q4', '_long')
+
+ def __init__(self, q1, q2, q3, q4):
+ self.q1 = q1
+ self.q2 = q2
+ self.q3 = q3
+ self.q4 = q4
+ self._long = 0
+ for q in self.quadrants():
+ self._long = (self._long << 8) | int(q)
+
+ @property
+ def address(self):
+ return '.'.join([str(q) for q in [self.q1, self.q2, self.q3, self.q4]])
+
+ @property
+ def long(self):
+ return self._long
+
+ @classmethod
+ def parse(cls, ip):
+ try:
+ q1, q2, q3, q4 = [int(q) for q in ip.split('.')]
+ except ValueError:
+ raise BadIP(_('The IP address "%s" is badly formed' % ip))
+ if q1 < 0 or q2 < 0 or q3 < 0 or q4 < 0:
+ raise BadIP(_('The IP address "%s" is badly formed' % ip))
+ elif q1 > 255 or q2 > 255 or q3 > 255 or q4 > 255:
+ raise BadIP(_('The IP address "%s" is badly formed' % ip))
+ return cls(q1, q2, q3, q4)
+
+ def quadrants(self):
+ return (self.q1, self.q2, self.q3, self.q4)
+
+ # def next_ip(self):
+ # (q1, q2, q3, q4) = self.quadrants()
+ # if q4 >= 255:
+ # if q3 >= 255:
+ # if q2 >= 255:
+ # if q1 >= 255:
+ # raise BadIP(_('There is not a next IP address'))
+ # q1 += 1
+ # else:
+ # q2 += 1
+ # else:
+ # q3 += 1
+ # else:
+ # q4 += 1
+ # return IP(q1, q2, q3, q4)
+ #
+ # def previous_ip(self):
+ # (q1, q2, q3, q4) = self.quadrants()
+ # if q4 <= 1:
+ # if q3 <= 1:
+ # if q2 <= 1:
+ # if q1 <= 1:
+ # raise BadIP(_('There is not a previous IP address'))
+ # q1 -= 1
+ # else:
+ # q2 -= 1
+ # else:
+ # q3 -= 1
+ # else:
+ # q4 -= 1
+ # return IP(q1, q2, q3, q4)
+
+ def __lt__(self, other):
+ if isinstance(other, ''.__class__):
+ other = IP.parse(other)
+ return self.long < other.long
+
+ def __gt__(self, other):
+ if isinstance(other, ''.__class__):
+ other = IP.parse(other)
+ return self.long > other.long
+
+ def __eq__(self, other):
+ if isinstance(other, ''.__class__):
+ other = IP.parse(other)
+ return self.long == other.long
+
+ def __repr__(self):
+ return '<%s long=%s address="%s">' % (
+ self.__class__.__name__,
+ self.long,
+ self.address,
+ )
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/core.py b/deluge/plugins/Blocklist/deluge_blocklist/core.py
new file mode 100644
index 0000000..a096b8a
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/core.py
@@ -0,0 +1,557 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009-2010 John Garland <johnnybg+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import logging
+import os
+import shutil
+import time
+from datetime import datetime, timedelta
+from email.utils import formatdate
+
+from twisted.internet import defer, threads
+from twisted.internet.task import LoopingCall
+from twisted.web import error
+
+import deluge.component as component
+import deluge.configmanager
+from deluge.common import is_url
+from deluge.core.rpcserver import export
+from deluge.httpdownloader import download_file
+from deluge.plugins.pluginbase import CorePluginBase
+
+from .common import IP, BadIP
+from .detect import UnknownFormatError, create_reader, detect_compression, detect_format
+from .readers import ReaderParseError
+
+try:
+ from urllib.parse import urljoin
+except ImportError:
+ # PY2 fallback
+ from urlparse import urljoin # pylint: disable=ungrouped-imports
+
+# TODO: check return values for deferred callbacks
+# TODO: review class attributes for redundancy
+
+log = logging.getLogger(__name__)
+
+DEFAULT_PREFS = {
+ 'url': '',
+ 'load_on_start': False,
+ 'check_after_days': 4,
+ 'list_compression': '',
+ 'list_type': '',
+ 'last_update': 0.0,
+ 'list_size': 0,
+ 'timeout': 180,
+ 'try_times': 3,
+ 'whitelisted': [],
+}
+
+# Constants
+ALLOW_RANGE = 0
+BLOCK_RANGE = 1
+
+
+class Core(CorePluginBase):
+ def enable(self):
+ log.debug('Blocklist: Plugin enabled...')
+
+ self.is_url = True
+ self.is_downloading = False
+ self.is_importing = False
+ self.has_imported = False
+ self.up_to_date = False
+ self.need_to_resume_session = False
+ self.num_whited = 0
+ self.num_blocked = 0
+ self.file_progress = 0.0
+
+ self.core = component.get('Core')
+ self.config = deluge.configmanager.ConfigManager(
+ 'blocklist.conf', DEFAULT_PREFS
+ )
+ if 'whitelisted' not in self.config:
+ self.config['whitelisted'] = []
+
+ self.reader = create_reader(
+ self.config['list_type'], self.config['list_compression']
+ )
+
+ if not isinstance(self.config['last_update'], float):
+ self.config.config['last_update'] = 0.0
+
+ update_now = False
+ if self.config['load_on_start']:
+ self.pause_session()
+ if self.config['last_update']:
+ last_update = datetime.fromtimestamp(self.config['last_update'])
+ check_period = timedelta(days=self.config['check_after_days'])
+ if (
+ not self.config['last_update']
+ or last_update + check_period < datetime.now()
+ ):
+ update_now = True
+ else:
+ d = self.import_list(
+ deluge.configmanager.get_config_dir('blocklist.cache')
+ )
+ d.addCallbacks(self.on_import_complete, self.on_import_error)
+ if self.need_to_resume_session:
+ d.addBoth(self.resume_session)
+
+ # This function is called every 'check_after_days' days, to download
+ # and import a new list if needed.
+ self.update_timer = LoopingCall(self.check_import)
+ if self.config['check_after_days'] > 0:
+ self.update_timer.start(
+ self.config['check_after_days'] * 24 * 60 * 60, update_now
+ )
+
+ def disable(self):
+ self.config.save()
+ log.debug('Reset IP filter')
+ self.core.session.get_ip_filter().add_rule(
+ '0.0.0.0', '255.255.255.255', ALLOW_RANGE
+ )
+ log.debug('Blocklist: Plugin disabled')
+
+ def update(self):
+ pass
+
+ # Exported RPC methods #
+ @export
+ def check_import(self, force=False):
+ """Imports latest blocklist specified by blocklist url.
+
+ Args:
+ force (bool, optional): Force the download/import, default is False.
+
+ Returns:
+ Deferred: A Deferred which fires when the blocklist has been imported.
+
+ """
+ if not self.config['url']:
+ return
+
+ # Reset variables
+ self.filename = None
+ self.force_download = force
+ self.failed_attempts = 0
+ self.auto_detected = False
+ self.up_to_date = False
+ if force:
+ self.reader = None
+ self.is_url = is_url(self.config['url'])
+
+ # Start callback chain
+ if self.is_url:
+ d = self.download_list()
+ d.addCallbacks(self.on_download_complete, self.on_download_error)
+ d.addCallback(self.import_list)
+ else:
+ d = self.import_list(self.config['url'])
+ d.addCallbacks(self.on_import_complete, self.on_import_error)
+ if self.need_to_resume_session:
+ d.addBoth(self.resume_session)
+
+ return d
+
+ @export
+ def get_config(self):
+ """Gets the blocklist config dictionary.
+
+ Returns:
+ dict: The config dictionary.
+
+ """
+ return self.config.config
+
+ @export
+ def set_config(self, config):
+ """Sets the blocklist config.
+
+ Args:
+ config (dict): config to set.
+
+ """
+ needs_blocklist_import = False
+ for key in config:
+ if key == 'whitelisted':
+ saved = set(self.config[key])
+ update = set(config[key])
+ diff = saved.symmetric_difference(update)
+ if diff:
+ log.debug('Whitelist changed. Updating...')
+ added = update.intersection(diff)
+ removed = saved.intersection(diff)
+ if added:
+ for ip in added:
+ try:
+ ip = IP.parse(ip)
+ self.blocklist.add_rule(
+ ip.address, ip.address, ALLOW_RANGE
+ )
+ saved.add(ip.address)
+ log.debug('Added %s to whitelisted', ip)
+ self.num_whited += 1
+ except BadIP as ex:
+ log.error('Bad IP: %s', ex)
+ continue
+ if removed:
+ needs_blocklist_import = True
+ for ip in removed:
+ try:
+ ip = IP.parse(ip)
+ saved.remove(ip.address)
+ log.debug('Removed %s from whitelisted', ip)
+ except BadIP as ex:
+ log.error('Bad IP: %s', ex)
+ continue
+
+ self.config[key] = list(saved)
+ continue
+ elif key == 'check_after_days':
+ if self.config[key] != config[key]:
+ self.config[key] = config[key]
+ update_now = False
+ if self.config['last_update']:
+ last_update = datetime.fromtimestamp(self.config['last_update'])
+ check_period = timedelta(days=self.config['check_after_days'])
+ if (
+ not self.config['last_update']
+ or last_update + check_period < datetime.now()
+ ):
+ update_now = True
+ if self.update_timer.running:
+ self.update_timer.stop()
+ if self.config['check_after_days'] > 0:
+ self.update_timer.start(
+ self.config['check_after_days'] * 24 * 60 * 60, update_now
+ )
+ continue
+ self.config[key] = config[key]
+
+ if needs_blocklist_import:
+ log.debug(
+ 'IP addresses were removed from the whitelist. Since we '
+ 'do not know if they were blocked before. Re-import '
+ 'current blocklist and re-add whitelisted.'
+ )
+ self.has_imported = False
+ d = self.import_list(deluge.configmanager.get_config_dir('blocklist.cache'))
+ d.addCallbacks(self.on_import_complete, self.on_import_error)
+
+ @export
+ def get_status(self):
+ """Get the status of the plugin.
+
+ Returns:
+ dict: The status dict of the plugin.
+
+ """
+ status = {}
+ if self.is_downloading:
+ status['state'] = 'Downloading'
+ elif self.is_importing:
+ status['state'] = 'Importing'
+ else:
+ status['state'] = 'Idle'
+
+ status['up_to_date'] = self.up_to_date
+ status['num_whited'] = self.num_whited
+ status['num_blocked'] = self.num_blocked
+ status['file_progress'] = self.file_progress
+ status['file_url'] = self.config['url']
+ status['file_size'] = self.config['list_size']
+ status['file_date'] = self.config['last_update']
+ status['file_type'] = self.config['list_type']
+ status['whitelisted'] = self.config['whitelisted']
+ if self.config['list_compression']:
+ status['file_type'] += ' (%s)' % self.config['list_compression']
+ return status
+
+ ####
+
+ def update_info(self, blocklist):
+ """Updates blocklist info.
+
+ Args:
+ blocklist (str): Path of blocklist.
+
+ Returns:
+ str: Path of blocklist.
+
+ """
+ log.debug('Updating blocklist info: %s', blocklist)
+ self.config['last_update'] = time.time()
+ self.config['list_size'] = os.path.getsize(blocklist)
+ self.filename = blocklist
+ return blocklist
+
+ def download_list(self, url=None):
+ """Downloads the blocklist specified by 'url' in the config.
+
+ Args:
+ url (str, optional): url to download from, defaults to config value.
+
+ Returns:
+ Deferred: a Deferred which fires once the blocklist has been downloaded.
+
+ """
+
+ def on_retrieve_data(data, current_length, total_length):
+ if total_length:
+ fp = current_length / total_length
+ if fp > 1.0:
+ fp = 1.0
+ else:
+ fp = 0.0
+
+ self.file_progress = fp
+
+ import socket
+
+ socket.setdefaulttimeout(self.config['timeout'])
+
+ if not url:
+ url = self.config['url']
+
+ headers = {}
+ if self.config['last_update'] and not self.force_download:
+ headers['If-Modified-Since'] = formatdate(
+ self.config['last_update'], usegmt=True
+ )
+
+ log.debug('Attempting to download blocklist %s', url)
+ log.debug('Sending headers: %s', headers)
+ self.is_downloading = True
+ return download_file(
+ url,
+ deluge.configmanager.get_config_dir('blocklist.download'),
+ on_retrieve_data,
+ headers,
+ )
+
+ def on_download_complete(self, blocklist):
+ """Runs any download clean up functions.
+
+ Args:
+ blocklist (str): Path of blocklist.
+
+ Returns:
+ Deferred: a Deferred which fires when clean up is done.
+
+ """
+ log.debug('Blocklist download complete: %s', blocklist)
+ self.is_downloading = False
+ return threads.deferToThread(self.update_info, blocklist)
+
+ def on_download_error(self, f):
+ """Recovers from download error.
+
+ Args:
+ f (Failure): Failure that occurred.
+
+ Returns:
+ Deferred or Failure: A Deferred if recovery was possible else original Failure.
+
+ """
+ self.is_downloading = False
+ error_msg = f.getErrorMessage()
+ d = f
+ if f.check(error.PageRedirect):
+ # Handle redirect errors
+ location = urljoin(self.config['url'], error_msg.split(' to ')[1])
+ if 'Moved Permanently' in error_msg:
+ log.debug('Setting blocklist url to %s', location)
+ self.config['url'] = location
+ d = self.download_list(location)
+ d.addCallbacks(self.on_download_complete, self.on_download_error)
+ else:
+ if 'Not Modified' in error_msg:
+ log.debug('Blocklist is up-to-date!')
+ self.up_to_date = True
+ blocklist = deluge.configmanager.get_config_dir('blocklist.cache')
+ d = threads.deferToThread(self.update_info, blocklist)
+ else:
+ log.warning('Blocklist download failed: %s', error_msg)
+ if self.failed_attempts < self.config['try_times']:
+ log.debug(
+ 'Try downloading blocklist again... (%s/%s)',
+ self.failed_attempts,
+ self.config['try_times'],
+ )
+ self.failed_attempts += 1
+ d = self.download_list()
+ d.addCallbacks(self.on_download_complete, self.on_download_error)
+ return d
+
+ def import_list(self, blocklist):
+ """Imports the downloaded blocklist into the session.
+
+ Args:
+ blocklist (str): path of blocklist.
+
+ Returns:
+ Deferred: A Deferred that fires when the blocklist has been imported.
+
+ """
+ log.trace('on import_list')
+
+ def on_read_ip_range(start, end):
+ """Add ip range to blocklist"""
+ # log.trace('Adding ip range %s - %s to ipfilter as blocked', start, end)
+ self.blocklist.add_rule(start.address, end.address, BLOCK_RANGE)
+ self.num_blocked += 1
+
+ def on_finish_read(result):
+ """Add any whitelisted IP's and add the blocklist to session"""
+ # White listing happens last because the last rules added have
+ # priority
+ log.info('Added %d ranges to ipfilter as blocked', self.num_blocked)
+ for ip in self.config['whitelisted']:
+ ip = IP.parse(ip)
+ self.blocklist.add_rule(ip.address, ip.address, ALLOW_RANGE)
+ self.num_whited += 1
+ log.trace('Added %s to the ipfiler as white-listed', ip.address)
+ log.info('Added %d ranges to ipfilter as white-listed', self.num_whited)
+ self.core.session.set_ip_filter(self.blocklist)
+ return result
+
+ # TODO: double check logic
+ if self.up_to_date and self.has_imported:
+ log.debug('Latest blocklist is already imported')
+ return defer.succeed(blocklist)
+
+ self.is_importing = True
+ self.num_blocked = 0
+ self.num_whited = 0
+ self.blocklist = self.core.session.get_ip_filter()
+
+ if not blocklist:
+ blocklist = self.filename
+
+ if not self.reader:
+ self.auto_detect(blocklist)
+ self.auto_detected = True
+
+ def on_reader_failure(failure):
+ log.error('Failed to read!!!!!!')
+ log.exception(failure)
+
+ log.debug('Importing using reader: %s', self.reader)
+ log.debug(
+ 'Reader type: %s compression: %s',
+ self.config['list_type'],
+ self.config['list_compression'],
+ )
+ log.debug('Clearing current ip filtering')
+ # self.blocklist.add_rule('0.0.0.0', '255.255.255.255', ALLOW_RANGE)
+ d = threads.deferToThread(self.reader(blocklist).read, on_read_ip_range)
+ d.addCallback(on_finish_read).addErrback(on_reader_failure)
+
+ return d
+
+ def on_import_complete(self, blocklist):
+ """Runs any import clean up functions.
+
+ Args:
+ blocklist (str): Path of blocklist.
+
+ Returns:
+ Deferred: A Deferred that fires when clean up is done.
+
+ """
+ log.trace('on_import_list_complete')
+ d = blocklist
+ self.is_importing = False
+ self.has_imported = True
+ log.debug('Blocklist import complete!')
+ cache = deluge.configmanager.get_config_dir('blocklist.cache')
+ if blocklist != cache:
+ if self.is_url:
+ log.debug('Moving %s to %s', blocklist, cache)
+ d = threads.deferToThread(shutil.move, blocklist, cache)
+ else:
+ log.debug('Copying %s to %s', blocklist, cache)
+ d = threads.deferToThread(shutil.copy, blocklist, cache)
+ return d
+
+ def on_import_error(self, f):
+ """Recovers from import error.
+
+ Args:
+ f (Failure): Failure that occurred.
+
+ Returns:
+ Deferred or Failure: A Deferred if recovery was possible else original Failure.
+
+ """
+ log.trace('on_import_error: %s', f)
+ d = f
+ self.is_importing = False
+ try_again = False
+ cache = deluge.configmanager.get_config_dir('blocklist.cache')
+
+ if f.check(ReaderParseError) and not self.auto_detected:
+ # Invalid / corrupt list, let's detect it
+ log.warning('Invalid / corrupt blocklist')
+ self.reader = None
+ blocklist = None
+ try_again = True
+ elif self.filename != cache and os.path.exists(cache):
+ # If we have a backup and we haven't already used it
+ log.warning('Error reading blocklist: %s', f.getErrorMessage())
+ blocklist = cache
+ try_again = True
+
+ if try_again:
+ d = self.import_list(blocklist)
+ d.addCallbacks(self.on_import_complete, self.on_import_error)
+
+ return d
+
+ def auto_detect(self, blocklist):
+ """Attempts to auto-detect the blocklist type.
+
+ Args:
+ blocklist (str): Path of blocklist.
+
+ Raises:
+ UnknownFormatError: If the format cannot be detected.
+
+ """
+ self.config['list_compression'] = detect_compression(blocklist)
+ self.config['list_type'] = detect_format(
+ blocklist, self.config['list_compression']
+ )
+ log.debug(
+ 'Auto-detected type: %s compression: %s',
+ self.config['list_type'],
+ self.config['list_compression'],
+ )
+ if not self.config['list_type']:
+ self.config['list_compression'] = ''
+ raise UnknownFormatError
+ else:
+ self.reader = create_reader(
+ self.config['list_type'], self.config['list_compression']
+ )
+
+ def pause_session(self):
+ self.need_to_resume_session = not self.core.session.is_paused()
+ self.core.pause_session()
+
+ def resume_session(self, result):
+ self.core.resume_session()
+ self.need_to_resume_session = False
+ return result
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist.js b/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist.js
new file mode 100644
index 0000000..8e4769c
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist.js
@@ -0,0 +1,429 @@
+/**
+ * blocklist.js
+ *
+ * Copyright (C) Omar Alvarez 2014 <omar.alvarez@udc.es>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ *
+ */
+
+Ext.ns('Deluge.ux.preferences');
+
+/**
+ * @class Deluge.ux.preferences.BlocklistPage
+ * @extends Ext.Panel
+ */
+Deluge.ux.preferences.BlocklistPage = Ext.extend(Ext.Panel, {
+ title: _('Blocklist'),
+ header: false,
+ layout: 'fit',
+ border: false,
+ autoScroll: true,
+
+ initComponent: function() {
+ Deluge.ux.preferences.BlocklistPage.superclass.initComponent.call(this);
+
+ this.URLFset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('General'),
+ autoHeight: true,
+ defaultType: 'textfield',
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ autoWidth: true,
+ labelWidth: 40,
+ });
+
+ this.URL = this.URLFset.add({
+ fieldLabel: _('URL:'),
+ labelSeparator: '',
+ name: 'url',
+ width: '80%',
+ });
+
+ this.SettingsFset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Settings'),
+ autoHeight: true,
+ defaultType: 'spinnerfield',
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ autoWidth: true,
+ labelWidth: 160,
+ });
+
+ this.checkListDays = this.SettingsFset.add({
+ fieldLabel: _('Check for new list every:'),
+ labelSeparator: '',
+ name: 'check_list_days',
+ value: 4,
+ decimalPrecision: 0,
+ width: 80,
+ });
+
+ this.chkImportOnStart = this.SettingsFset.add({
+ xtype: 'checkbox',
+ fieldLabel: _('Import blocklist on startup'),
+ name: 'check_import_startup',
+ });
+
+ this.OptionsFset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Options'),
+ autoHeight: true,
+ defaultType: 'button',
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ autoWidth: false,
+ width: '80%',
+ labelWidth: 0,
+ });
+
+ this.checkDownload = this.OptionsFset.add({
+ fieldLabel: _(''),
+ name: 'check_download',
+ xtype: 'container',
+ layout: 'hbox',
+ margins: '4 0 0 5',
+ items: [
+ {
+ xtype: 'button',
+ text: ' Check Download and Import ',
+ scale: 'medium',
+ },
+ {
+ xtype: 'box',
+ autoEl: {
+ tag: 'img',
+ src: '../icons/ok.png',
+ },
+ margins: '4 0 0 3',
+ },
+ ],
+ });
+
+ this.forceDownload = this.OptionsFset.add({
+ fieldLabel: _(''),
+ name: 'force_download',
+ text: ' Force Download and Import ',
+ margins: '2 0 0 0',
+ //icon: '../icons/blocklist_import24.png',
+ scale: 'medium',
+ });
+
+ this.ProgressFset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Info'),
+ autoHeight: true,
+ defaultType: 'progress',
+ style: 'margin-top: 1px; margin-bottom: 0px; padding-bottom: 0px;',
+ autoWidth: true,
+ labelWidth: 0,
+ hidden: true,
+ });
+
+ this.downProgBar = this.ProgressFset.add({
+ fieldLabel: _(''),
+ name: 'progress_bar',
+ width: '90%',
+ });
+
+ this.InfoFset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Info'),
+ autoHeight: true,
+ defaultType: 'label',
+ style: 'margin-top: 0px; margin-bottom: 0px; padding-bottom: 0px;',
+ labelWidth: 60,
+ });
+
+ this.lblFileSize = this.InfoFset.add({
+ fieldLabel: _('File Size:'),
+ labelSeparator: '',
+ name: 'file_size',
+ });
+
+ this.lblDate = this.InfoFset.add({
+ fieldLabel: _('Date:'),
+ labelSeparator: '',
+ name: 'date',
+ });
+
+ this.lblType = this.InfoFset.add({
+ fieldLabel: _('Type:'),
+ labelSeparator: '',
+ name: 'type',
+ });
+
+ this.lblURL = this.InfoFset.add({
+ fieldLabel: _('URL:'),
+ labelSeparator: '',
+ name: 'lbl_URL',
+ });
+
+ this.WhitelistFset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Whitelist'),
+ autoHeight: true,
+ defaultType: 'editorgrid',
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ autoWidth: true,
+ labelWidth: 0,
+ items: [
+ {
+ fieldLabel: _(''),
+ name: 'whitelist',
+ margins: '2 0 5 5',
+ height: 100,
+ width: 260,
+ autoExpandColumn: 'ip',
+ viewConfig: {
+ emptyText: _('Add an IP...'),
+ deferEmptyText: false,
+ },
+ colModel: new Ext.grid.ColumnModel({
+ columns: [
+ {
+ id: 'ip',
+ header: _('IP'),
+ dataIndex: 'ip',
+ sortable: true,
+ hideable: false,
+ editable: true,
+ editor: {
+ xtype: 'textfield',
+ },
+ },
+ ],
+ }),
+ selModel: new Ext.grid.RowSelectionModel({
+ singleSelect: false,
+ moveEditorOnEnter: false,
+ }),
+ store: new Ext.data.ArrayStore({
+ autoDestroy: true,
+ fields: [{ name: 'ip' }],
+ }),
+ listeners: {
+ afteredit: function(e) {
+ e.record.commit();
+ },
+ },
+ setEmptyText: function(text) {
+ if (this.viewReady) {
+ this.getView().emptyText = text;
+ this.getView().refresh();
+ } else {
+ Ext.apply(this.viewConfig, { emptyText: text });
+ }
+ },
+ loadData: function(data) {
+ this.getStore().loadData(data);
+ if (this.viewReady) {
+ this.getView().updateHeaders();
+ }
+ },
+ },
+ ],
+ });
+
+ this.ipButtonsContainer = this.WhitelistFset.add({
+ xtype: 'container',
+ layout: 'hbox',
+ margins: '4 0 0 5',
+ items: [
+ {
+ xtype: 'button',
+ text: ' Add IP ',
+ margins: '0 5 0 0',
+ },
+ {
+ xtype: 'button',
+ text: ' Delete IP ',
+ },
+ ],
+ });
+
+ this.updateTask = Ext.TaskMgr.start({
+ interval: 2000,
+ run: this.onUpdate,
+ scope: this,
+ });
+
+ this.on('show', this.updateConfig, this);
+
+ this.ipButtonsContainer.getComponent(0).setHandler(this.addIP, this);
+ this.ipButtonsContainer.getComponent(1).setHandler(this.deleteIP, this);
+
+ this.checkDownload.getComponent(0).setHandler(this.checkDown, this);
+ this.forceDownload.setHandler(this.forceDown, this);
+ },
+
+ onApply: function() {
+ var config = {};
+
+ config['url'] = this.URL.getValue();
+ config['check_after_days'] = this.checkListDays.getValue();
+ config['load_on_start'] = this.chkImportOnStart.getValue();
+
+ var ipList = [];
+ var store = this.WhitelistFset.getComponent(0).getStore();
+
+ for (var i = 0; i < store.getCount(); i++) {
+ var record = store.getAt(i);
+ var ip = record.get('ip');
+ ipList.push(ip);
+ }
+
+ config['whitelisted'] = ipList;
+
+ deluge.client.blocklist.set_config(config);
+ },
+
+ onOk: function() {
+ this.onApply();
+ },
+
+ onUpdate: function() {
+ deluge.client.blocklist.get_status({
+ success: function(status) {
+ if (status['state'] == 'Downloading') {
+ this.InfoFset.hide();
+ this.checkDownload.getComponent(0).setDisabled(true);
+ this.checkDownload.getComponent(1).hide();
+ this.forceDownload.setDisabled(true);
+
+ this.ProgressFset.show();
+ this.downProgBar.updateProgress(
+ status['file_progress'],
+ 'Downloading '
+ .concat((status['file_progress'] * 100).toFixed(2))
+ .concat('%'),
+ true
+ );
+ } else if (status['state'] == 'Importing') {
+ this.InfoFset.hide();
+ this.checkDownload.getComponent(0).setDisabled(true);
+ this.checkDownload.getComponent(1).hide();
+ this.forceDownload.setDisabled(true);
+
+ this.ProgressFset.show();
+ this.downProgBar.updateText(
+ 'Importing '.concat(status['num_blocked'])
+ );
+ } else if (status['state'] == 'Idle') {
+ this.ProgressFset.hide();
+ this.checkDownload.getComponent(0).setDisabled(false);
+ this.forceDownload.setDisabled(false);
+ if (status['up_to_date']) {
+ this.checkDownload.getComponent(1).show();
+ this.checkDownload.doLayout();
+ } else {
+ this.checkDownload.getComponent(1).hide();
+ }
+ this.InfoFset.show();
+ this.lblFileSize.setText(fsize(status['file_size']));
+ this.lblDate.setText(fdate(status['file_date']));
+ this.lblType.setText(status['file_type']);
+ this.lblURL.setText(
+ status['file_url'].substr(0, 40).concat('...')
+ );
+ }
+ },
+ scope: this,
+ });
+ },
+
+ checkDown: function() {
+ this.onApply();
+ deluge.client.blocklist.check_import();
+ },
+
+ forceDown: function() {
+ this.onApply();
+ deluge.client.blocklist.check_import((force = true));
+ },
+
+ updateConfig: function() {
+ deluge.client.blocklist.get_config({
+ success: function(config) {
+ this.URL.setValue(config['url']);
+ this.checkListDays.setValue(config['check_after_days']);
+ this.chkImportOnStart.setValue(config['load_on_start']);
+
+ var data = [];
+ var keys = Ext.keys(config['whitelisted']);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ data.push([config['whitelisted'][key]]);
+ }
+
+ this.WhitelistFset.getComponent(0).loadData(data);
+ },
+ scope: this,
+ });
+
+ deluge.client.blocklist.get_status({
+ success: function(status) {
+ this.lblFileSize.setText(fsize(status['file_size']));
+ this.lblDate.setText(fdate(status['file_date']));
+ this.lblType.setText(status['file_type']);
+ this.lblURL.setText(
+ status['file_url'].substr(0, 40).concat('...')
+ );
+ },
+ scope: this,
+ });
+ },
+
+ addIP: function() {
+ var store = this.WhitelistFset.getComponent(0).getStore();
+ var IP = store.recordType;
+ var i = new IP({
+ ip: '',
+ });
+ this.WhitelistFset.getComponent(0).stopEditing();
+ store.insert(0, i);
+ this.WhitelistFset.getComponent(0).startEditing(0, 0);
+ },
+
+ deleteIP: function() {
+ var selections = this.WhitelistFset.getComponent(0)
+ .getSelectionModel()
+ .getSelections();
+ var store = this.WhitelistFset.getComponent(0).getStore();
+
+ this.WhitelistFset.getComponent(0).stopEditing();
+ for (var i = 0; i < selections.length; i++) store.remove(selections[i]);
+ store.commitChanges();
+ },
+
+ onDestroy: function() {
+ Ext.TaskMgr.stop(this.updateTask);
+
+ deluge.preferences.un('show', this.updateConfig, this);
+
+ Deluge.ux.preferences.BlocklistPage.superclass.onDestroy.call(this);
+ },
+});
+
+Deluge.plugins.BlocklistPlugin = Ext.extend(Deluge.Plugin, {
+ name: 'Blocklist',
+
+ onDisable: function() {
+ deluge.preferences.removePage(this.prefsPage);
+ },
+
+ onEnable: function() {
+ this.prefsPage = deluge.preferences.addPage(
+ new Deluge.ux.preferences.BlocklistPage()
+ );
+ },
+});
+
+Deluge.registerPlugin('Blocklist', Deluge.plugins.BlocklistPlugin);
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist16.png b/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist16.png
new file mode 100644
index 0000000..15b4299
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist16.png
Binary files differ
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_download24.png b/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_download24.png
new file mode 100644
index 0000000..6de3a0d
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_download24.png
Binary files differ
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_import24.png b/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_import24.png
new file mode 100644
index 0000000..9441214
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_import24.png
Binary files differ
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui b/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui
new file mode 100644
index 0000000..013d8e7
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui
@@ -0,0 +1,607 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">1</property>
+ <property name="upper">100</property>
+ <property name="value">1</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkWindow" id="window1">
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="blocklist_prefs_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">URL:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_url">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;General&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_columns">3</property>
+ <property name="column_spacing">5</property>
+ <property name="row_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Days</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_check_days">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Check for new list every:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_import_on_start">
+ <property name="label" translatable="yes">Import blocklist on startup</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;Settings&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xscale">0</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkButton" id="button_check_download">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Download the blocklist file if necessary and import the file.</property>
+ <signal name="clicked" handler="on_button_check_download_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image_download">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-missing-image</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Check Download and Import</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_force_download">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Download a new blocklist file and import it.</property>
+ <signal name="clicked" handler="on_button_force_download_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image_import">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-missing-image</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Force Download and Import</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="image_up_to_date">
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Blocklist is up to date</property>
+ <property name="yalign">0.15000000596046448</property>
+ <property name="xpad">2</property>
+ <property name="stock">gtk-yes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;Options&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkProgressBar" id="progressbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table_info">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label_url">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_type">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_modified">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_filesize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">URL:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Type:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Date:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">File Size:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Info&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="whitelist_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkTreeView" id="whitelist_treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVButtonBox" id="vbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="homogeneous">True</property>
+ <property name="layout_style">start</property>
+ <child>
+ <object class="GtkButton" id="whitelist_add">
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_whitelist_add_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="whitelist_delete">
+ <property name="label">gtk-delete</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_whitelist_remove_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Whitelist&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui~ b/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui~
new file mode 100644
index 0000000..e8b48c3
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui~
@@ -0,0 +1,603 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">1</property>
+ <property name="upper">100</property>
+ <property name="value">1</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkWindow" id="window1">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkVBox" id="blocklist_prefs_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">URL:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_url">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;General&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_columns">3</property>
+ <property name="column_spacing">5</property>
+ <property name="row_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Days</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_check_days">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ <property name="adjustment">adjustment1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Check for new list every:</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_import_on_start">
+ <property name="label" translatable="yes">Import blocklist on startup</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;Settings&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xscale">0</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkHBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkVBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="button_check_download">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Download the blocklist file if necessary and import the file.</property>
+ <signal name="clicked" handler="on_button_check_download_clicked" swapped="no"/>
+ <child>
+ <object class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image_download">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-missing-image</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Check Download and Import</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_force_download">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Download a new blocklist file and import it.</property>
+ <signal name="clicked" handler="on_button_force_download_clicked" swapped="no"/>
+ <child>
+ <object class="GtkHBox" id="hbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image_import">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-missing-image</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Force Download and Import</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="image_up_to_date">
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Blocklist is up to date</property>
+ <property name="yalign">0.15000000596046448</property>
+ <property name="xpad">2</property>
+ <property name="stock">gtk-yes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;Options&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="vbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkProgressBar" id="progressbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table_info">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label_url">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_type">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_modified">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_filesize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">URL:</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Type:</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Date:</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">File Size:</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Info&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="whitelist_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkTreeView" id="whitelist_treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVButtonBox" id="vbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="homogeneous">True</property>
+ <property name="layout_style">start</property>
+ <child>
+ <object class="GtkButton" id="whitelist_add">
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_whitelist_add_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="whitelist_delete">
+ <property name="label">gtk-delete</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_whitelist_remove_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Whitelist&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/decompressers.py b/deluge/plugins/Blocklist/deluge_blocklist/decompressers.py
new file mode 100644
index 0000000..35211b7
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/decompressers.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2010 John Garland <johnnybg+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+# pylint: disable=redefined-builtin
+
+from __future__ import unicode_literals
+
+import bz2
+import gzip
+import zipfile
+
+
+def Zipped(reader): # NOQA: N802
+ """Blocklist reader for zipped blocklists"""
+
+ def _open(self):
+ z = zipfile.ZipFile(self.file)
+ f = z.open(z.namelist()[0])
+ return f
+
+ reader.open = _open
+ return reader
+
+
+def GZipped(reader): # NOQA: N802
+ """Blocklist reader for gzipped blocklists"""
+
+ def _open(self):
+ return gzip.open(self.file)
+
+ reader.open = _open
+ return reader
+
+
+def BZipped2(reader): # NOQA: N802
+ """Blocklist reader for bzipped2 blocklists"""
+
+ def _open(self):
+ return bz2.BZ2File(self.file)
+
+ reader.open = _open
+ return reader
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/detect.py b/deluge/plugins/Blocklist/deluge_blocklist/detect.py
new file mode 100644
index 0000000..262d5de
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/detect.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2010 John Garland <johnnybg+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from .decompressers import BZipped2, GZipped, Zipped
+from .readers import EmuleReader, PeerGuardianReader, SafePeerReader
+
+COMPRESSION_TYPES = {b'PK': 'Zip', b'\x1f\x8b': 'GZip', b'BZ': 'BZip2'}
+
+DECOMPRESSERS = {'Zip': Zipped, 'GZip': GZipped, 'BZip2': BZipped2}
+
+READERS = {
+ 'Emule': EmuleReader,
+ 'SafePeer': SafePeerReader,
+ 'PeerGuardian': PeerGuardianReader,
+}
+
+
+class UnknownFormatError(Exception):
+ pass
+
+
+def detect_compression(filename):
+ with open(filename, 'rb') as _file:
+ magic_number = _file.read(2)
+ return COMPRESSION_TYPES.get(magic_number, '')
+
+
+def detect_format(filename, compression=''):
+ file_format = ''
+ for reader in READERS:
+ if create_reader(reader, compression)(filename).is_valid():
+ file_format = reader
+ break
+ return file_format
+
+
+def create_reader(file_format, compression=''):
+ reader = READERS.get(file_format)
+ if reader and compression:
+ decompressor = DECOMPRESSERS.get(compression)
+ if decompressor:
+ reader = decompressor(reader)
+ return reader
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/gtkui.py b/deluge/plugins/Blocklist/deluge_blocklist/gtkui.py
new file mode 100644
index 0000000..b6e5d55
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/gtkui.py
@@ -0,0 +1,257 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+from datetime import datetime
+
+import gi # isort:skip (Required before Gtk import).
+
+gi.require_version('Gtk', '3.0') # NOQA: E402
+
+# isort:imports-thirdparty
+from gi.repository import Gtk
+
+# isort:imports-firstparty
+import deluge.common
+import deluge.component as component
+from deluge.plugins.pluginbase import Gtk3PluginBase
+from deluge.ui.client import client
+
+# isort:imports-localfolder
+from . import common
+
+log = logging.getLogger(__name__)
+
+
+class GtkUI(Gtk3PluginBase):
+ def enable(self):
+ log.debug('Blocklist GtkUI enable..')
+ self.plugin = component.get('PluginManager')
+
+ self.load_preferences_page()
+
+ self.status_item = component.get('StatusBar').add_item(
+ image=common.get_resource('blocklist16.png'),
+ text='',
+ callback=self._on_status_item_clicked,
+ tooltip=_('Blocked IP Ranges /Whitelisted IP Ranges'),
+ )
+
+ # Register some hooks
+ self.plugin.register_hook('on_apply_prefs', self._on_apply_prefs)
+ self.plugin.register_hook('on_show_prefs', self._on_show_prefs)
+
+ def disable(self):
+ log.debug('Blocklist GtkUI disable..')
+
+ # Remove the preferences page
+ self.plugin.remove_preferences_page(_('Blocklist'))
+
+ # Remove status item
+ component.get('StatusBar').remove_item(self.status_item)
+ del self.status_item
+
+ # Deregister the hooks
+ self.plugin.deregister_hook('on_apply_prefs', self._on_apply_prefs)
+ self.plugin.deregister_hook('on_show_prefs', self._on_show_prefs)
+
+ del self.glade
+
+ def update(self):
+ def _on_get_status(status):
+ if status['state'] == 'Downloading':
+ self.table_info.hide()
+ self.builder.get_object('button_check_download').set_sensitive(False)
+ self.builder.get_object('button_force_download').set_sensitive(False)
+ self.builder.get_object('image_up_to_date').hide()
+
+ self.status_item.set_text(
+ 'Downloading %.2f%%' % (status['file_progress'] * 100)
+ )
+ self.progress_bar.set_text(
+ 'Downloading %.2f%%' % (status['file_progress'] * 100)
+ )
+ self.progress_bar.set_fraction(status['file_progress'])
+ self.progress_bar.show()
+
+ elif status['state'] == 'Importing':
+ self.table_info.hide()
+ self.builder.get_object('button_check_download').set_sensitive(False)
+ self.builder.get_object('button_force_download').set_sensitive(False)
+ self.builder.get_object('image_up_to_date').hide()
+
+ self.status_item.set_text('Importing ' + str(status['num_blocked']))
+ self.progress_bar.set_text('Importing %s' % (status['num_blocked']))
+ self.progress_bar.pulse()
+ self.progress_bar.show()
+
+ elif status['state'] == 'Idle':
+ self.progress_bar.hide()
+ self.builder.get_object('button_check_download').set_sensitive(True)
+ self.builder.get_object('button_force_download').set_sensitive(True)
+ if status['up_to_date']:
+ self.builder.get_object('image_up_to_date').show()
+ else:
+ self.builder.get_object('image_up_to_date').hide()
+
+ self.table_info.show()
+ self.status_item.set_text('%(num_blocked)s/%(num_whited)s' % status)
+
+ self.builder.get_object('label_filesize').set_text(
+ deluge.common.fsize(status['file_size'])
+ )
+ self.builder.get_object('label_modified').set_text(
+ datetime.fromtimestamp(status['file_date']).strftime('%c')
+ )
+ self.builder.get_object('label_type').set_text(status['file_type'])
+ self.builder.get_object('label_url').set_text(status['file_url'])
+
+ client.blocklist.get_status().addCallback(_on_get_status)
+
+ def _on_show_prefs(self):
+ def _on_get_config(config):
+ log.trace('Loaded config: %s', config)
+ self.builder.get_object('entry_url').set_text(config['url'])
+ self.builder.get_object('spin_check_days').set_value(
+ config['check_after_days']
+ )
+ self.builder.get_object('chk_import_on_start').set_active(
+ config['load_on_start']
+ )
+ self.populate_whitelist(config['whitelisted'])
+
+ client.blocklist.get_config().addCallback(_on_get_config)
+
+ def _on_apply_prefs(self):
+ config = {}
+ config['url'] = self.builder.get_object('entry_url').get_text().strip()
+ config['check_after_days'] = self.builder.get_object(
+ 'spin_check_days'
+ ).get_value_as_int()
+ config['load_on_start'] = self.builder.get_object(
+ 'chk_import_on_start'
+ ).get_active()
+ config['whitelisted'] = [
+ ip[0] for ip in self.whitelist_model if ip[0] != 'IP HERE'
+ ]
+ client.blocklist.set_config(config)
+
+ def _on_button_check_download_clicked(self, widget):
+ self._on_apply_prefs()
+ client.blocklist.check_import()
+
+ def _on_button_force_download_clicked(self, widget):
+ self._on_apply_prefs()
+ client.blocklist.check_import(force=True)
+
+ def _on_status_item_clicked(self, widget, event):
+ component.get('Preferences').show(_('Blocklist'))
+
+ def load_preferences_page(self):
+ """Initializes the preferences page and adds it to the preferences dialog"""
+ # Load the preferences page
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(common.get_resource('blocklist_pref.ui'))
+
+ self.whitelist_frame = self.builder.get_object('whitelist_frame')
+ self.progress_bar = self.builder.get_object('progressbar')
+ self.table_info = self.builder.get_object('table_info')
+
+ # Hide the progress bar initially
+ self.progress_bar.hide()
+ self.table_info.show()
+
+ # Create the whitelisted model
+ self.build_whitelist_model_treeview()
+
+ self.builder.connect_signals(
+ {
+ 'on_button_check_download_clicked': self._on_button_check_download_clicked,
+ 'on_button_force_download_clicked': self._on_button_force_download_clicked,
+ 'on_whitelist_add_clicked': (
+ self.on_add_button_clicked,
+ self.whitelist_treeview,
+ ),
+ 'on_whitelist_remove_clicked': (
+ self.on_delete_button_clicked,
+ self.whitelist_treeview,
+ ),
+ }
+ )
+
+ # Set button icons
+ self.builder.get_object('image_download').set_from_file(
+ common.get_resource('blocklist_download24.png')
+ )
+
+ self.builder.get_object('image_import').set_from_file(
+ common.get_resource('blocklist_import24.png')
+ )
+
+ # Update the preferences page with config values from the core
+ self._on_show_prefs()
+
+ # Add the page to the preferences dialog
+ self.plugin.add_preferences_page(
+ _('Blocklist'), self.builder.get_object('blocklist_prefs_box')
+ )
+
+ def build_whitelist_model_treeview(self):
+ self.whitelist_treeview = self.builder.get_object('whitelist_treeview')
+ treeview_selection = self.whitelist_treeview.get_selection()
+ treeview_selection.connect(
+ 'changed', self.on_whitelist_treeview_selection_changed
+ )
+ self.whitelist_model = Gtk.ListStore(str, bool)
+ renderer = Gtk.CellRendererText()
+ renderer.connect('edited', self.on_cell_edited, self.whitelist_model)
+ renderer.ip = 0
+
+ column = Gtk.TreeViewColumn('IPs', renderer, text=0, editable=1)
+ column.set_expand(True)
+ self.whitelist_treeview.append_column(column)
+ self.whitelist_treeview.set_model(self.whitelist_model)
+
+ def on_cell_edited(self, cell, path_string, new_text, model):
+ # iter = model.get_iter_from_string(path_string)
+ # path = model.get_path(iter)[0]
+ try:
+ ip = common.IP.parse(new_text)
+ model.set(model.get_iter_from_string(path_string), 0, ip.address)
+ except common.BadIP as ex:
+ model.remove(model.get_iter_from_string(path_string))
+ from deluge.ui.gtkui import dialogs
+
+ d = dialogs.ErrorDialog(_('Bad IP address'), ex.message)
+ d.run()
+
+ def on_whitelist_treeview_selection_changed(self, selection):
+ model, selected_connection_iter = selection.get_selected()
+ if selected_connection_iter:
+ self.builder.get_object('whitelist_delete').set_property('sensitive', True)
+ else:
+ self.builder.get_object('whitelist_delete').set_property('sensitive', False)
+
+ def on_add_button_clicked(self, widget, treeview):
+ model = treeview.get_model()
+ model.set(model.append(), 0, 'IP HERE', 1, True)
+
+ def on_delete_button_clicked(self, widget, treeview):
+ selection = treeview.get_selection()
+ model, selected_iter = selection.get_selected()
+ if selected_iter:
+ # path = model.get_path(iter)[0]
+ model.remove(selected_iter)
+
+ def populate_whitelist(self, whitelist):
+ self.whitelist_model.clear()
+ for ip in whitelist:
+ self.whitelist_model.set(self.whitelist_model.append(), 0, ip, 1, True)
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py b/deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py
new file mode 100644
index 0000000..ba410c2
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Steve 'Tarka' Smith (tarka@internode.on.net)
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import gzip
+import logging
+import socket
+from struct import unpack
+
+log = logging.getLogger(__name__)
+
+
+class PGException(Exception):
+ pass
+
+
+# Incrementally reads PeerGuardian blocklists v1 and v2.
+# See http://wiki.phoenixlabs.org/wiki/P2B_Format
+class PGReader(object):
+ def __init__(self, filename):
+ log.debug('PGReader loading: %s', filename)
+
+ try:
+ with gzip.open(filename, 'rb') as _file:
+ self.fd = _file
+ except IOError:
+ log.debug('Blocklist: PGReader: Incorrect file type or list is corrupt')
+
+ # 4 bytes, should be 0xffffffff
+ buf = self.fd.read(4)
+ hdr = unpack('l', buf)[0]
+ if hdr != -1:
+ raise PGException(_('Invalid leader') + ' %d' % hdr)
+
+ magic = self.fd.read(3)
+ if magic != 'P2B':
+ raise PGException(_('Invalid magic code'))
+
+ buf = self.fd.read(1)
+ ver = ord(buf)
+ if ver != 1 and ver != 2:
+ raise PGException(_('Invalid version') + ' %d' % ver)
+
+ def __next__(self):
+ # Skip over the string
+ buf = -1
+ while buf != 0:
+ buf = self.fd.read(1)
+ if buf == '': # EOF
+ return False
+ buf = ord(buf)
+
+ buf = self.fd.read(4)
+ start = socket.inet_ntoa(buf)
+
+ buf = self.fd.read(4)
+ end = socket.inet_ntoa(buf)
+
+ return (start, end)
+
+ # Python 2 compatibility
+ next = __next__
+
+ def close(self):
+ self.fd.close()
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/readers.py b/deluge/plugins/Blocklist/deluge_blocklist/readers.py
new file mode 100644
index 0000000..4079e84
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/readers.py
@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2010 John Garland <johnnybg+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import re
+
+from deluge.common import decode_bytes
+
+from .common import IP, BadIP, raises_errors_as
+
+log = logging.getLogger(__name__)
+
+
+class ReaderParseError(Exception):
+ pass
+
+
+class BaseReader(object):
+ """Base reader for blocklist files"""
+
+ def __init__(self, _file):
+ """Creates a new BaseReader given a file"""
+ self.file = _file
+
+ def open(self):
+ """Opens the associated file for reading"""
+ return open(self.file)
+
+ def parse(self, line):
+ """Extracts ip range from given line"""
+ raise NotImplementedError
+
+ def read(self, callback):
+ """Calls callback on each ip range in the file"""
+ for start, end in self.readranges():
+ try:
+ callback(IP.parse(start), IP.parse(end))
+ except BadIP as ex:
+ log.error('Failed to parse IP: %s', ex)
+ return self.file
+
+ def is_ignored(self, line):
+ """Ignore commented lines and blank lines"""
+ line = line.strip()
+ return line.startswith('#') or not line
+
+ def is_valid(self):
+ """Determines whether file is valid for this reader"""
+ blocklist = self.open()
+ valid = True
+ for line in blocklist:
+ line = decode_bytes(line)
+ if not self.is_ignored(line):
+ try:
+ (start, end) = self.parse(line)
+ if not re.match(r'^(\d{1,3}\.){4}$', start + '.') or not re.match(
+ r'^(\d{1,3}\.){4}$', end + '.'
+ ):
+ valid = False
+ except Exception:
+ valid = False
+ break
+ blocklist.close()
+ return valid
+
+ @raises_errors_as(ReaderParseError)
+ def readranges(self):
+ """Yields each ip range from the file"""
+ blocklist = self.open()
+ for line in blocklist:
+ line = decode_bytes(line)
+ if not self.is_ignored(line):
+ yield self.parse(line)
+ blocklist.close()
+
+
+class EmuleReader(BaseReader):
+ """Blocklist reader for emule style blocklists"""
+
+ def parse(self, line):
+ return line.strip().split(' , ')[0].split(' - ')
+
+
+class SafePeerReader(BaseReader):
+ """Blocklist reader for SafePeer style blocklists"""
+
+ def parse(self, line):
+ return line.strip().split(':')[-1].split('-')
+
+
+class PeerGuardianReader(SafePeerReader):
+ """Blocklist reader for PeerGuardian style blocklists"""
+
+ pass
diff --git a/deluge/plugins/Blocklist/deluge_blocklist/webui.py b/deluge/plugins/Blocklist/deluge_blocklist/webui.py
new file mode 100644
index 0000000..3da43c4
--- /dev/null
+++ b/deluge/plugins/Blocklist/deluge_blocklist/webui.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.plugins.pluginbase import WebPluginBase
+
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+FORMAT_LIST = [
+ ('gzmule', _('Emule IP list (GZip)')),
+ ('spzip', _('SafePeer Text (Zipped)')),
+ ('pgtext', _('PeerGuardian Text (Uncompressed)')),
+ ('p2bgz', _('PeerGuardian P2B (GZip)')),
+]
+
+
+class WebUI(WebPluginBase):
+
+ scripts = [get_resource('blocklist.js')]
+ debug_scripts = scripts
diff --git a/deluge/plugins/Blocklist/setup.py b/deluge/plugins/Blocklist/setup.py
new file mode 100644
index 0000000..54ad002
--- /dev/null
+++ b/deluge/plugins/Blocklist/setup.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from setuptools import find_packages, setup
+
+__plugin_name__ = 'Blocklist'
+__author__ = 'John Garland'
+__author_email__ = 'johnnybg+deluge@gmail.com'
+__version__ = '1.4'
+__url__ = 'http://deluge-torrent.org'
+__license__ = 'GPLv3'
+__description__ = 'Download and import IP blocklists'
+__long_description__ = __description__
+__pkg_data__ = {'deluge_' + __plugin_name__.lower(): ['data/*']}
+
+setup(
+ name=__plugin_name__,
+ version=__version__,
+ description=__description__,
+ author=__author__,
+ author_email=__author_email__,
+ url=__url__,
+ license=__license__,
+ zip_safe=False,
+ long_description=__long_description__,
+ packages=find_packages(),
+ package_data=__pkg_data__,
+ entry_points="""
+ [deluge.plugin.core]
+ %s = deluge_%s:CorePlugin
+ [deluge.plugin.gtk3ui]
+ %s = deluge_%s:GtkUIPlugin
+ [deluge.plugin.web]
+ %s = deluge_%s:WebUIPlugin
+ """
+ % ((__plugin_name__, __plugin_name__.lower()) * 3),
+)
diff --git a/deluge/plugins/Execute/deluge_execute/__init__.py b/deluge/plugins/Execute/deluge_execute/__init__.py
new file mode 100644
index 0000000..c6d55f4
--- /dev/null
+++ b/deluge/plugins/Execute/deluge_execute/__init__.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.plugins.init import PluginInitBase
+
+
+class CorePlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .core import Core as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(CorePlugin, self).__init__(plugin_name)
+
+
+class GtkUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .gtkui import GtkUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(GtkUIPlugin, self).__init__(plugin_name)
+
+
+class WebUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .webui import WebUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(WebUIPlugin, self).__init__(plugin_name)
diff --git a/deluge/plugins/Execute/deluge_execute/common.py b/deluge/plugins/Execute/deluge_execute/common.py
new file mode 100644
index 0000000..4c9db09
--- /dev/null
+++ b/deluge/plugins/Execute/deluge_execute/common.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# 2009 Damien Churchill <damoxc@gmail.com>
+# 2010 Pedro Algarvio <pedro@algarvio.me>
+# 2017 Calum Lind <calumlind+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os.path
+
+from pkg_resources import resource_filename
+
+
+def get_resource(filename):
+ return resource_filename(__package__, os.path.join('data', filename))
diff --git a/deluge/plugins/Execute/deluge_execute/core.py b/deluge/plugins/Execute/deluge_execute/core.py
new file mode 100644
index 0000000..9dcd97a
--- /dev/null
+++ b/deluge/plugins/Execute/deluge_execute/core.py
@@ -0,0 +1,185 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import hashlib
+import logging
+import os
+import time
+
+from twisted.internet.utils import getProcessOutputAndValue
+
+import deluge.component as component
+from deluge.common import windows_check
+from deluge.configmanager import ConfigManager
+from deluge.core.rpcserver import export
+from deluge.event import DelugeEvent
+from deluge.plugins.pluginbase import CorePluginBase
+
+log = logging.getLogger(__name__)
+
+DEFAULT_CONFIG = {'commands': []}
+
+EXECUTE_ID = 0
+EXECUTE_EVENT = 1
+EXECUTE_COMMAND = 2
+
+EVENT_MAP = {
+ 'complete': 'TorrentFinishedEvent',
+ 'added': 'TorrentAddedEvent',
+ 'removed': 'TorrentRemovedEvent',
+}
+
+
+class ExecuteCommandAddedEvent(DelugeEvent):
+ """
+ Emitted when a new command is added.
+ """
+
+ def __init__(self, command_id, event, command):
+ self._args = [command_id, event, command]
+
+
+class ExecuteCommandRemovedEvent(DelugeEvent):
+ """
+ Emitted when a command is removed.
+ """
+
+ def __init__(self, command_id):
+ self._args = [command_id]
+
+
+class Core(CorePluginBase):
+ def enable(self):
+ self.config = ConfigManager('execute.conf', DEFAULT_CONFIG)
+ event_manager = component.get('EventManager')
+ self.registered_events = {}
+ self.preremoved_cache = {}
+
+ # Go through the commands list and register event handlers
+ for command in self.config['commands']:
+ event = command[EXECUTE_EVENT]
+ if event in self.registered_events:
+ continue
+
+ def create_event_handler(event):
+ def event_handler(torrent_id, *arg):
+ self.execute_commands(torrent_id, event, *arg)
+
+ return event_handler
+
+ event_handler = create_event_handler(event)
+ event_manager.register_event_handler(EVENT_MAP[event], event_handler)
+ if event == 'removed':
+ event_manager.register_event_handler(
+ 'PreTorrentRemovedEvent', self.on_preremoved
+ )
+ self.registered_events[event] = event_handler
+
+ log.debug('Execute core plugin enabled!')
+
+ def on_preremoved(self, torrent_id):
+ # Get and store the torrent info before it is removed
+ torrent = component.get('TorrentManager').torrents[torrent_id]
+ info = torrent.get_status(['name', 'download_location'])
+ self.preremoved_cache[torrent_id] = [
+ torrent_id,
+ info['name'],
+ info['download_location'],
+ ]
+
+ def execute_commands(self, torrent_id, event, *arg):
+ if event == 'added' and arg[0]:
+ # No futher action as from_state (arg[0]) is True
+ return
+ elif event == 'removed':
+ torrent_id, torrent_name, download_location = self.preremoved_cache.pop(
+ torrent_id
+ )
+ else:
+ torrent = component.get('TorrentManager').torrents[torrent_id]
+ info = torrent.get_status(['name', 'download_location'])
+ # Grab the torrent name and download location
+ # getProcessOutputAndValue requires args to be str
+ torrent_name = info['name']
+ download_location = info['download_location']
+
+ log.debug('Running commands for %s', event)
+
+ def log_error(result, command):
+ (stdout, stderr, exit_code) = result
+ if exit_code:
+ log.warning('Command "%s" failed with exit code %d', command, exit_code)
+ if stdout:
+ log.warning('stdout: %s', stdout)
+ if stderr:
+ log.warning('stderr: %s', stderr)
+
+ # Go through and execute all the commands
+ for command in self.config['commands']:
+ if command[EXECUTE_EVENT] == event:
+ command = os.path.expandvars(command[EXECUTE_COMMAND])
+ command = os.path.expanduser(command)
+
+ cmd_args = [
+ torrent_id.encode('utf8'),
+ torrent_name.encode('utf8'),
+ download_location.encode('utf8'),
+ ]
+ if windows_check():
+ # Escape ampersand on windows (see #2784)
+ cmd_args = [cmd_arg.replace('&', '^^^&') for cmd_arg in cmd_args]
+
+ if os.path.isfile(command) and os.access(command, os.X_OK):
+ log.debug('Running %s with args: %s', command, cmd_args)
+ d = getProcessOutputAndValue(command, cmd_args, env=os.environ)
+ d.addCallback(log_error, command)
+ else:
+ log.error('Execute script not found or not executable')
+
+ def disable(self):
+ self.config.save()
+ event_manager = component.get('EventManager')
+ for event, handler in self.registered_events.items():
+ event_manager.deregister_event_handler(event, handler)
+ log.debug('Execute core plugin disabled!')
+
+ # Exported RPC methods #
+ @export
+ def add_command(self, event, command):
+ command_id = hashlib.sha1(str(time.time()).encode()).hexdigest()
+ self.config['commands'].append((command_id, event, command))
+ self.config.save()
+ component.get('EventManager').emit(
+ ExecuteCommandAddedEvent(command_id, event, command)
+ )
+
+ @export
+ def get_commands(self):
+ return self.config['commands']
+
+ @export
+ def remove_command(self, command_id):
+ for command in self.config['commands']:
+ if command[EXECUTE_ID] == command_id:
+ self.config['commands'].remove(command)
+ component.get('EventManager').emit(
+ ExecuteCommandRemovedEvent(command_id)
+ )
+ break
+ self.config.save()
+
+ @export
+ def save_command(self, command_id, event, cmd):
+ for i, command in enumerate(self.config['commands']):
+ if command[EXECUTE_ID] == command_id:
+ self.config['commands'][i] = (command_id, event, cmd)
+ break
+ self.config.save()
diff --git a/deluge/plugins/Execute/deluge_execute/data/execute.js b/deluge/plugins/Execute/deluge_execute/data/execute.js
new file mode 100644
index 0000000..bd6ac98
--- /dev/null
+++ b/deluge/plugins/Execute/deluge_execute/data/execute.js
@@ -0,0 +1,312 @@
+/**
+ * execute.js
+ * The client-side javascript code for the Execute plugin.
+ *
+ * Copyright (C) Damien Churchill 2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ *
+ */
+
+Ext.ns('Deluge.ux');
+
+Deluge.ux.ExecuteWindowBase = Ext.extend(Ext.Window, {
+ layout: 'fit',
+ width: 400,
+ height: 130,
+ closeAction: 'hide',
+
+ initComponent: function() {
+ Deluge.ux.ExecuteWindowBase.superclass.initComponent.call(this);
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ baseCls: 'x-plain',
+ bodyStyle: 'padding: 5px',
+ items: [
+ {
+ xtype: 'combo',
+ width: 270,
+ fieldLabel: _('Event'),
+ store: new Ext.data.ArrayStore({
+ fields: ['id', 'text'],
+ data: [
+ ['complete', _('Torrent Complete')],
+ ['added', _('Torrent Added')],
+ ['removed', _('Torrent Removed')],
+ ],
+ }),
+ name: 'event',
+ mode: 'local',
+ editable: false,
+ triggerAction: 'all',
+ valueField: 'id',
+ displayField: 'text',
+ },
+ {
+ xtype: 'textfield',
+ fieldLabel: _('Command'),
+ name: 'command',
+ width: 270,
+ },
+ ],
+ });
+ },
+
+ onCancelClick: function() {
+ this.hide();
+ },
+});
+
+Deluge.ux.EditExecuteCommandWindow = Ext.extend(Deluge.ux.ExecuteWindowBase, {
+ title: _('Edit Command'),
+
+ initComponent: function() {
+ Deluge.ux.EditExecuteCommandWindow.superclass.initComponent.call(this);
+ this.addButton(_('Save'), this.onSaveClick, this);
+ this.addEvents({
+ commandedit: true,
+ });
+ },
+
+ show: function(command) {
+ Deluge.ux.EditExecuteCommandWindow.superclass.show.call(this);
+ this.command = command;
+ this.form.getForm().setValues({
+ event: command.get('event'),
+ command: command.get('name'),
+ });
+ },
+
+ onSaveClick: function() {
+ var values = this.form.getForm().getFieldValues();
+ deluge.client.execute.save_command(
+ this.command.id,
+ values.event,
+ values.command,
+ {
+ success: function() {
+ this.fireEvent(
+ 'commandedit',
+ this,
+ values.event,
+ values.command
+ );
+ },
+ scope: this,
+ }
+ );
+ this.hide();
+ },
+});
+
+Deluge.ux.AddExecuteCommandWindow = Ext.extend(Deluge.ux.ExecuteWindowBase, {
+ title: _('Add Command'),
+
+ initComponent: function() {
+ Deluge.ux.AddExecuteCommandWindow.superclass.initComponent.call(this);
+ this.addButton(_('Add'), this.onAddClick, this);
+ this.addEvents({
+ commandadd: true,
+ });
+ },
+
+ onAddClick: function() {
+ var values = this.form.getForm().getFieldValues();
+ deluge.client.execute.add_command(values.event, values.command, {
+ success: function() {
+ this.fireEvent(
+ 'commandadd',
+ this,
+ values.event,
+ values.command
+ );
+ },
+ scope: this,
+ });
+ this.hide();
+ },
+});
+
+Ext.ns('Deluge.ux.preferences');
+
+/**
+ * @class Deluge.ux.preferences.ExecutePage
+ * @extends Ext.Panel
+ */
+Deluge.ux.preferences.ExecutePage = Ext.extend(Ext.Panel, {
+ title: _('Execute'),
+ header: false,
+ layout: 'fit',
+ border: false,
+
+ initComponent: function() {
+ Deluge.ux.preferences.ExecutePage.superclass.initComponent.call(this);
+ var event_map = (this.event_map = {
+ complete: _('Torrent Complete'),
+ added: _('Torrent Added'),
+ removed: _('Torrent Removed'),
+ });
+
+ this.list = new Ext.list.ListView({
+ store: new Ext.data.SimpleStore({
+ fields: [
+ { name: 'event', mapping: 1 },
+ { name: 'name', mapping: 2 },
+ ],
+ id: 0,
+ }),
+ columns: [
+ {
+ width: 0.3,
+ header: _('Event'),
+ sortable: true,
+ dataIndex: 'event',
+ tpl: new Ext.XTemplate('{[this.getEvent(values.event)]}', {
+ getEvent: function(e) {
+ return event_map[e] ? event_map[e] : e;
+ },
+ }),
+ },
+ {
+ id: 'name',
+ header: _('Command'),
+ sortable: true,
+ dataIndex: 'name',
+ },
+ ],
+ singleSelect: true,
+ autoExpandColumn: 'name',
+ });
+ this.list.on('selectionchange', this.onSelectionChange, this);
+
+ this.panel = this.add({
+ items: [this.list],
+ bbar: {
+ items: [
+ {
+ text: _('Add'),
+ iconCls: 'icon-add',
+ handler: this.onAddClick,
+ scope: this,
+ },
+ {
+ text: _('Edit'),
+ iconCls: 'icon-edit',
+ handler: this.onEditClick,
+ scope: this,
+ disabled: true,
+ },
+ '->',
+ {
+ text: _('Remove'),
+ iconCls: 'icon-remove',
+ handler: this.onRemoveClick,
+ scope: this,
+ disabled: true,
+ },
+ ],
+ },
+ });
+
+ this.on('show', this.onPreferencesShow, this);
+ },
+
+ updateCommands: function() {
+ deluge.client.execute.get_commands({
+ success: function(commands) {
+ this.list.getStore().loadData(commands);
+ },
+ scope: this,
+ });
+ },
+
+ onAddClick: function() {
+ if (!this.addWin) {
+ this.addWin = new Deluge.ux.AddExecuteCommandWindow();
+ this.addWin.on(
+ 'commandadd',
+ function() {
+ this.updateCommands();
+ },
+ this
+ );
+ }
+ this.addWin.show();
+ },
+
+ onCommandAdded: function(win, evt, cmd) {
+ var record = new this.list.getStore().recordType({
+ event: evt,
+ command: cmd,
+ });
+ },
+
+ onEditClick: function() {
+ if (!this.editWin) {
+ this.editWin = new Deluge.ux.EditExecuteCommandWindow();
+ this.editWin.on(
+ 'commandedit',
+ function() {
+ this.updateCommands();
+ },
+ this
+ );
+ }
+ this.editWin.show(this.list.getSelectedRecords()[0]);
+ },
+
+ onPreferencesShow: function() {
+ this.updateCommands();
+ },
+
+ onRemoveClick: function() {
+ var record = this.list.getSelectedRecords()[0];
+ deluge.client.execute.remove_command(record.id, {
+ success: function() {
+ this.updateCommands();
+ },
+ scope: this,
+ });
+ },
+
+ onSelectionChange: function(dv, selections) {
+ if (selections.length) {
+ this.panel
+ .getBottomToolbar()
+ .items.get(1)
+ .enable();
+ this.panel
+ .getBottomToolbar()
+ .items.get(3)
+ .enable();
+ } else {
+ this.panel
+ .getBottomToolbar()
+ .items.get(1)
+ .disable();
+ this.panel
+ .getBottomToolbar()
+ .items.get(3)
+ .disable();
+ }
+ },
+});
+
+Deluge.plugins.ExecutePlugin = Ext.extend(Deluge.Plugin, {
+ name: 'Execute',
+
+ onDisable: function() {
+ deluge.preferences.removePage(this.prefsPage);
+ },
+
+ onEnable: function() {
+ this.prefsPage = deluge.preferences.addPage(
+ new Deluge.ux.preferences.ExecutePage()
+ );
+ },
+});
+Deluge.registerPlugin('Execute', Deluge.plugins.ExecutePlugin);
diff --git a/deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui b/deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui
new file mode 100644
index 0000000..e2a5cd5
--- /dev/null
+++ b/deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkListStore" id="liststore1">
+ <columns>
+ <!-- column-name item -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkWindow" id="execute_window">
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="execute_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="add_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="add_alignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">10</property>
+ <child>
+ <object class="GtkTable" id="add_table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="GtkLabel" id="event_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Event</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ <property name="x_padding">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="command_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Command</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ <property name="x_padding">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="command_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="event_combobox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="model">liststore1</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_add">
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_add_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="add_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Add Command&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="commands_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="commands_alignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="commands_vbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="halign">start</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="commands_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Commands&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui~ b/deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui~
new file mode 100644
index 0000000..cd9b4d4
--- /dev/null
+++ b/deluge/plugins/Execute/deluge_execute/data/execute_prefs.ui~
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkListStore" id="liststore1">
+ <columns>
+ <!-- column-name item text -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkWindow" id="execute_window">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkVBox" id="execute_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkFrame" id="add_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="add_alignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="add_table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="GtkLabel" id="event_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Event</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ <property name="x_padding">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="command_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Command</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ <property name="x_padding">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="command_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="event_combobox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="model">liststore1</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_add">
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_add_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="add_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Add Command&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="commands_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="commands_alignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="commands_vbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="commands_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Commands&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/Execute/deluge_execute/gtkui.py b/deluge/plugins/Execute/deluge_execute/gtkui.py
new file mode 100644
index 0000000..c0c7200
--- /dev/null
+++ b/deluge/plugins/Execute/deluge_execute/gtkui.py
@@ -0,0 +1,165 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import gi # isort:skip (Required before Gtk import).
+
+gi.require_version('Gtk', '3.0') # NOQA: E402
+
+# isort:imports-thirdparty
+from gi.repository import Gtk
+
+# isort:imports-firstparty
+import deluge.component as component
+from deluge.plugins.pluginbase import Gtk3PluginBase
+from deluge.ui.client import client
+
+# isort:imports-localfolder
+from . import common
+
+log = logging.getLogger(__name__)
+
+EXECUTE_ID = 0
+EXECUTE_EVENT = 1
+EXECUTE_COMMAND = 2
+
+EVENT_MAP = {
+ 'complete': _('Torrent Complete'),
+ 'added': _('Torrent Added'),
+ 'removed': _('Torrent Removed'),
+}
+
+EVENTS = ['complete', 'added', 'removed']
+
+
+class ExecutePreferences(object):
+ def __init__(self, plugin):
+ self.plugin = plugin
+
+ def load(self):
+ log.debug('Adding Execute Preferences page')
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(common.get_resource('execute_prefs.ui'))
+ self.builder.connect_signals(self)
+
+ events = self.builder.get_object('event_combobox')
+
+ store = Gtk.ListStore(str, str)
+ for event in EVENTS:
+ event_label = EVENT_MAP[event]
+ store.append((event_label, event))
+ events.set_model(store)
+ events.set_active(0)
+
+ self.plugin.add_preferences_page(
+ _('Execute'), self.builder.get_object('execute_box')
+ )
+ self.plugin.register_hook('on_show_prefs', self.load_commands)
+ self.plugin.register_hook('on_apply_prefs', self.on_apply_prefs)
+
+ self.load_commands()
+
+ client.register_event_handler(
+ 'ExecuteCommandAddedEvent', self.on_command_added_event
+ )
+ client.register_event_handler(
+ 'ExecuteCommandRemovedEvent', self.on_command_removed_event
+ )
+
+ def unload(self):
+ self.plugin.remove_preferences_page(_('Execute'))
+ self.plugin.deregister_hook('on_apply_prefs', self.on_apply_prefs)
+ self.plugin.deregister_hook('on_show_prefs', self.load_commands)
+
+ def add_command(self, command_id, event, command):
+ log.debug('Adding command `%s`', command_id)
+ vbox = self.builder.get_object('commands_vbox')
+ hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, spacing=5)
+ hbox.set_name(command_id + '_' + event)
+ label = Gtk.Label(EVENT_MAP[event])
+ entry = Gtk.Entry()
+ entry.set_text(command)
+ button = Gtk.Button()
+ button.set_name('remove_%s' % command_id)
+ button.connect('clicked', self.on_remove_button_clicked)
+
+ img = Gtk.Image()
+ img.set_from_stock(Gtk.STOCK_REMOVE, Gtk.IconSize.BUTTON)
+ button.set_image(img)
+
+ hbox.pack_start(label, False, False, 0)
+ hbox.pack_start(entry, False, False, 0)
+ hbox.pack_start(button, True, True, 0)
+ hbox.show_all()
+ vbox.pack_start(hbox, True, True, 0)
+
+ def remove_command(self, command_id):
+ vbox = self.builder.get_object('commands_vbox')
+ children = vbox.get_children()
+ for child in children:
+ if child.get_name().split('_')[0] == command_id:
+ vbox.remove(child)
+ break
+
+ def clear_commands(self):
+ vbox = self.builder.get_object('commands_vbox')
+ children = vbox.get_children()
+ for child in children:
+ vbox.remove(child)
+
+ def load_commands(self):
+ def on_get_commands(commands):
+ self.clear_commands()
+ log.debug('on_get_commands: %s', commands)
+ for command in commands:
+ command_id, event, command = command
+ self.add_command(command_id, event, command)
+
+ client.execute.get_commands().addCallback(on_get_commands)
+
+ def on_add_button_clicked(self, *args):
+ command = self.builder.get_object('command_entry').get_text()
+ events = self.builder.get_object('event_combobox')
+ event = events.get_model()[events.get_active()][1]
+ client.execute.add_command(event, command)
+
+ def on_remove_button_clicked(self, widget, *args):
+ command_id = widget.get_name().replace('remove_', '')
+ client.execute.remove_command(command_id)
+
+ def on_apply_prefs(self):
+ vbox = self.builder.get_object('commands_vbox')
+ children = vbox.get_children()
+ for child in children:
+ command_id, event = child.get_name().split('_')
+ for widget in child.get_children():
+ if isinstance(widget, Gtk.Entry):
+ command = widget.get_text()
+ client.execute.save_command(command_id, event, command)
+
+ def on_command_added_event(self, command_id, event, command):
+ log.debug('Adding command %s: %s', event, command)
+ self.add_command(command_id, event, command)
+
+ def on_command_removed_event(self, command_id):
+ log.debug('Removing command %s', command_id)
+ self.remove_command(command_id)
+
+
+class GtkUI(Gtk3PluginBase):
+ def enable(self):
+ self.plugin = component.get('PluginManager')
+ self.preferences = ExecutePreferences(self.plugin)
+ self.preferences.load()
+
+ def disable(self):
+ self.preferences.unload()
diff --git a/deluge/plugins/Execute/deluge_execute/webui.py b/deluge/plugins/Execute/deluge_execute/webui.py
new file mode 100644
index 0000000..8327001
--- /dev/null
+++ b/deluge/plugins/Execute/deluge_execute/webui.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.plugins.pluginbase import WebPluginBase
+
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+
+class WebUI(WebPluginBase):
+
+ scripts = [get_resource('execute.js')]
+ debug_scripts = scripts
diff --git a/deluge/plugins/Execute/setup.py b/deluge/plugins/Execute/setup.py
new file mode 100644
index 0000000..174d1a3
--- /dev/null
+++ b/deluge/plugins/Execute/setup.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from setuptools import find_packages, setup
+
+__plugin_name__ = 'Execute'
+__author__ = 'Damien Churchill'
+__author_email__ = 'damoxc@gmail.com'
+__version__ = '1.3'
+__url__ = 'http://deluge-torrent.org'
+__license__ = 'GPLv3'
+__description__ = 'Plugin to execute a command upon an event'
+__long_description__ = __description__
+__pkg_data__ = {'deluge_' + __plugin_name__.lower(): ['data/*']}
+
+setup(
+ name=__plugin_name__,
+ version=__version__,
+ description=__description__,
+ author=__author__,
+ author_email=__author_email__,
+ url=__url__,
+ license=__license__,
+ long_description=__long_description__,
+ packages=find_packages(),
+ package_data=__pkg_data__,
+ entry_points="""
+ [deluge.plugin.core]
+ %s = deluge_%s:CorePlugin
+ [deluge.plugin.gtk3ui]
+ %s = deluge_%s:GtkUIPlugin
+ [deluge.plugin.web]
+ %s = deluge_%s:WebUIPlugin
+ """
+ % ((__plugin_name__, __plugin_name__.lower()) * 3),
+)
diff --git a/deluge/plugins/Extractor/deluge_extractor/__init__.py b/deluge/plugins/Extractor/deluge_extractor/__init__.py
new file mode 100644
index 0000000..6db72b6
--- /dev/null
+++ b/deluge/plugins/Extractor/deluge_extractor/__init__.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.plugins.init import PluginInitBase
+
+
+class CorePlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .core import Core as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(CorePlugin, self).__init__(plugin_name)
+
+
+class GtkUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .gtkui import GtkUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(GtkUIPlugin, self).__init__(plugin_name)
+
+
+class WebUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .webui import WebUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(WebUIPlugin, self).__init__(plugin_name)
diff --git a/deluge/plugins/Extractor/deluge_extractor/common.py b/deluge/plugins/Extractor/deluge_extractor/common.py
new file mode 100644
index 0000000..4c9db09
--- /dev/null
+++ b/deluge/plugins/Extractor/deluge_extractor/common.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# 2009 Damien Churchill <damoxc@gmail.com>
+# 2010 Pedro Algarvio <pedro@algarvio.me>
+# 2017 Calum Lind <calumlind+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os.path
+
+from pkg_resources import resource_filename
+
+
+def get_resource(filename):
+ return resource_filename(__package__, os.path.join('data', filename))
diff --git a/deluge/plugins/Extractor/deluge_extractor/core.py b/deluge/plugins/Extractor/deluge_extractor/core.py
new file mode 100644
index 0000000..8fa5bd3
--- /dev/null
+++ b/deluge/plugins/Extractor/deluge_extractor/core.py
@@ -0,0 +1,192 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import errno
+import logging
+import os
+
+from twisted.internet.utils import getProcessOutputAndValue
+from twisted.python.procutils import which
+
+import deluge.component as component
+import deluge.configmanager
+from deluge.common import windows_check
+from deluge.core.rpcserver import export
+from deluge.plugins.pluginbase import CorePluginBase
+
+log = logging.getLogger(__name__)
+
+DEFAULT_PREFS = {'extract_path': '', 'use_name_folder': True}
+
+if windows_check():
+ win_7z_exes = [
+ '7z.exe',
+ 'C:\\Program Files\\7-Zip\\7z.exe',
+ 'C:\\Program Files (x86)\\7-Zip\\7z.exe',
+ ]
+
+ try:
+ import winreg
+ except ImportError:
+ import _winreg as winreg # For Python 2.
+
+ try:
+ hkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'Software\\7-Zip')
+ except WindowsError:
+ pass
+ else:
+ win_7z_path = os.path.join(winreg.QueryValueEx(hkey, 'Path')[0], '7z.exe')
+ winreg.CloseKey(hkey)
+ win_7z_exes.insert(1, win_7z_path)
+
+ switch_7z = 'x -y'
+ # Future suport:
+ # 7-zip cannot extract tar.* with single command.
+ # ".tar.gz", ".tgz",
+ # ".tar.bz2", ".tbz",
+ # ".tar.lzma", ".tlz",
+ # ".tar.xz", ".txz",
+ exts_7z = ['.rar', '.zip', '.tar', '.7z', '.xz', '.lzma']
+ for win_7z_exe in win_7z_exes:
+ if which(win_7z_exe):
+ EXTRACT_COMMANDS = dict.fromkeys(exts_7z, [win_7z_exe, switch_7z])
+ break
+else:
+ required_cmds = ['unrar', 'unzip', 'tar', 'unxz', 'unlzma', '7zr', 'bunzip2']
+ # Possible future suport:
+ # gunzip: gz (cmd will delete original archive)
+ # the following do not extract to dest dir
+ # ".xz": ["xz", "-d --keep"],
+ # ".lzma": ["xz", "-d --format=lzma --keep"],
+ # ".bz2": ["bzip2", "-d --keep"],
+
+ EXTRACT_COMMANDS = {
+ '.rar': ['unrar', 'x -o+ -y'],
+ '.tar': ['tar', '-xf'],
+ '.zip': ['unzip', ''],
+ '.tar.gz': ['tar', '-xzf'],
+ '.tgz': ['tar', '-xzf'],
+ '.tar.bz2': ['tar', '-xjf'],
+ '.tbz': ['tar', '-xjf'],
+ '.tar.lzma': ['tar', '--lzma -xf'],
+ '.tlz': ['tar', '--lzma -xf'],
+ '.tar.xz': ['tar', '--xz -xf'],
+ '.txz': ['tar', '--xz -xf'],
+ '.7z': ['7zr', 'x'],
+ }
+ # Test command exists and if not, remove.
+ for command in required_cmds:
+ if not which(command):
+ for k, v in list(EXTRACT_COMMANDS.items()):
+ if command in v[0]:
+ log.warning('%s not found, disabling support for %s', command, k)
+ del EXTRACT_COMMANDS[k]
+
+if not EXTRACT_COMMANDS:
+ raise Exception('No archive extracting programs found, plugin will be disabled')
+
+
+class Core(CorePluginBase):
+ def enable(self):
+ self.config = deluge.configmanager.ConfigManager(
+ 'extractor.conf', DEFAULT_PREFS
+ )
+ if not self.config['extract_path']:
+ self.config['extract_path'] = deluge.configmanager.ConfigManager(
+ 'core.conf'
+ )['download_location']
+ component.get('EventManager').register_event_handler(
+ 'TorrentFinishedEvent', self._on_torrent_finished
+ )
+
+ def disable(self):
+ component.get('EventManager').deregister_event_handler(
+ 'TorrentFinishedEvent', self._on_torrent_finished
+ )
+
+ def update(self):
+ pass
+
+ def _on_torrent_finished(self, torrent_id):
+ """
+ This is called when a torrent finishes and checks if any files to extract.
+ """
+ tid = component.get('TorrentManager').torrents[torrent_id]
+ tid_status = tid.get_status(['download_location', 'name'])
+
+ files = tid.get_files()
+ for f in files:
+ file_root, file_ext = os.path.splitext(f['path'])
+ file_ext_sec = os.path.splitext(file_root)[1]
+ if file_ext_sec and file_ext_sec + file_ext in EXTRACT_COMMANDS:
+ file_ext = file_ext_sec + file_ext
+ elif file_ext not in EXTRACT_COMMANDS or file_ext_sec == '.tar':
+ log.debug('Cannot extract file with unknown file type: %s', f['path'])
+ continue
+ elif file_ext == '.rar' and 'part' in file_ext_sec:
+ part_num = file_ext_sec.split('part')[1]
+ if part_num.isdigit() and int(part_num) != 1:
+ log.debug('Skipping remaining multi-part rar files: %s', f['path'])
+ continue
+
+ cmd = EXTRACT_COMMANDS[file_ext]
+ fpath = os.path.join(
+ tid_status['download_location'], os.path.normpath(f['path'])
+ )
+ dest = os.path.normpath(self.config['extract_path'])
+ if self.config['use_name_folder']:
+ dest = os.path.join(dest, tid_status['name'])
+
+ try:
+ os.makedirs(dest)
+ except OSError as ex:
+ if not (ex.errno == errno.EEXIST and os.path.isdir(dest)):
+ log.error('Error creating destination folder: %s', ex)
+ break
+
+ def on_extract(result, torrent_id, fpath):
+ # Check command exit code.
+ if not result[2]:
+ log.info('Extract successful: %s (%s)', fpath, torrent_id)
+ else:
+ log.error(
+ 'Extract failed: %s (%s) %s', fpath, torrent_id, result[1]
+ )
+
+ # Run the command and add callback.
+ log.debug(
+ 'Extracting %s from %s with %s %s to %s',
+ fpath,
+ torrent_id,
+ cmd[0],
+ cmd[1],
+ dest,
+ )
+ d = getProcessOutputAndValue(
+ cmd[0], cmd[1].split() + [str(fpath)], os.environ, str(dest)
+ )
+ d.addCallback(on_extract, torrent_id, fpath)
+
+ @export
+ def set_config(self, config):
+ """Sets the config dictionary."""
+ for key in config:
+ self.config[key] = config[key]
+ self.config.save()
+
+ @export
+ def get_config(self):
+ """Returns the config dictionary."""
+ return self.config.config
diff --git a/deluge/plugins/Extractor/deluge_extractor/data/extractor.js b/deluge/plugins/Extractor/deluge_extractor/data/extractor.js
new file mode 100644
index 0000000..b11cb30
--- /dev/null
+++ b/deluge/plugins/Extractor/deluge_extractor/data/extractor.js
@@ -0,0 +1,100 @@
+/**
+ * extractor.js
+ *
+ * Copyright (C) Calum Lind 2014 <calumlind@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ *
+ */
+
+Ext.ns('Deluge.ux.preferences');
+
+/**
+ * @class Deluge.ux.preferences.ExtractorPage
+ * @extends Ext.Panel
+ */
+Deluge.ux.preferences.ExtractorPage = Ext.extend(Ext.Panel, {
+ title: _('Extractor'),
+ header: false,
+ layout: 'fit',
+ border: false,
+
+ initComponent: function() {
+ Deluge.ux.preferences.ExtractorPage.superclass.initComponent.call(this);
+
+ this.form = this.add({
+ xtype: 'form',
+ layout: 'form',
+ border: false,
+ autoHeight: true,
+ });
+
+ fieldset = this.form.add({
+ xtype: 'fieldset',
+ border: false,
+ title: '',
+ autoHeight: true,
+ labelAlign: 'top',
+ labelWidth: 80,
+ defaultType: 'textfield',
+ });
+
+ this.extract_path = fieldset.add({
+ fieldLabel: _('Extract to:'),
+ labelSeparator: '',
+ name: 'extract_path',
+ width: '97%',
+ });
+
+ this.use_name_folder = fieldset.add({
+ xtype: 'checkbox',
+ name: 'use_name_folder',
+ height: 22,
+ hideLabel: true,
+ boxLabel: _('Create torrent name sub-folder'),
+ });
+
+ this.on('show', this.updateConfig, this);
+ },
+
+ onApply: function() {
+ // build settings object
+ var config = {};
+
+ config['extract_path'] = this.extract_path.getValue();
+ config['use_name_folder'] = this.use_name_folder.getValue();
+
+ deluge.client.extractor.set_config(config);
+ },
+
+ onOk: function() {
+ this.onApply();
+ },
+
+ updateConfig: function() {
+ deluge.client.extractor.get_config({
+ success: function(config) {
+ this.extract_path.setValue(config['extract_path']);
+ this.use_name_folder.setValue(config['use_name_folder']);
+ },
+ scope: this,
+ });
+ },
+});
+
+Deluge.plugins.ExtractorPlugin = Ext.extend(Deluge.Plugin, {
+ name: 'Extractor',
+
+ onDisable: function() {
+ deluge.preferences.removePage(this.prefsPage);
+ },
+
+ onEnable: function() {
+ this.prefsPage = deluge.preferences.addPage(
+ new Deluge.ux.preferences.ExtractorPage()
+ );
+ },
+});
+Deluge.registerPlugin('Extractor', Deluge.plugins.ExtractorPlugin);
diff --git a/deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui b/deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui
new file mode 100644
index 0000000..6f34b44
--- /dev/null
+++ b/deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkWindow" id="window1">
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="extractor_prefs_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="spacing">5</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Extract to:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkFileChooserButton" id="folderchooser_path">
+ <property name="can_focus">False</property>
+ <property name="action">select-folder</property>
+ <property name="title" translatable="yes">Select A Folder</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_path">
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_use_name">
+ <property name="label" translatable="yes">Create torrent name sub-folder</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">This option will create a sub-folder using the torrent's name within the selected extract folder and put the extracted files there.</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;General&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui~ b/deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui~
new file mode 100644
index 0000000..040e3d0
--- /dev/null
+++ b/deluge/plugins/Extractor/deluge_extractor/data/extractor_prefs.ui~
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkWindow" id="window1">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkVBox" id="extractor_prefs_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Extract to:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkFileChooserButton" id="folderchooser_path">
+ <property name="can_focus">False</property>
+ <property name="action">select-folder</property>
+ <property name="title" translatable="yes">Select A Folder</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_path">
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_use_name">
+ <property name="label" translatable="yes">Create torrent name sub-folder</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">This option will create a sub-folder using the torrent's name within the selected extract folder and put the extracted files there.</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;General&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/Extractor/deluge_extractor/gtkui.py b/deluge/plugins/Extractor/deluge_extractor/gtkui.py
new file mode 100644
index 0000000..113b33f
--- /dev/null
+++ b/deluge/plugins/Extractor/deluge_extractor/gtkui.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import gi # isort:skip (Required before Gtk import).
+
+gi.require_version('Gtk', '3.0') # NOQA: E402
+
+# isort:imports-thirdparty
+from gi.repository import Gtk
+
+# isort:imports-firstparty
+import deluge.component as component
+from deluge.plugins.pluginbase import Gtk3PluginBase
+from deluge.ui.client import client
+
+# isort:imports-localfolder
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+
+class GtkUI(Gtk3PluginBase):
+ def enable(self):
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(get_resource('extractor_prefs.ui'))
+
+ component.get('Preferences').add_page(
+ _('Extractor'), self.builder.get_object('extractor_prefs_box')
+ )
+ component.get('PluginManager').register_hook(
+ 'on_apply_prefs', self.on_apply_prefs
+ )
+ component.get('PluginManager').register_hook(
+ 'on_show_prefs', self.on_show_prefs
+ )
+ self.on_show_prefs()
+
+ def disable(self):
+ component.get('Preferences').remove_page(_('Extractor'))
+ component.get('PluginManager').deregister_hook(
+ 'on_apply_prefs', self.on_apply_prefs
+ )
+ component.get('PluginManager').deregister_hook(
+ 'on_show_prefs', self.on_show_prefs
+ )
+ del self.builder
+
+ def on_apply_prefs(self):
+ log.debug('applying prefs for Extractor')
+ if client.is_localhost():
+ path = self.builder.get_object('folderchooser_path').get_filename()
+ else:
+ path = self.builder.get_object('entry_path').get_text()
+
+ config = {
+ 'extract_path': path,
+ 'use_name_folder': self.builder.get_object('chk_use_name').get_active(),
+ }
+
+ client.extractor.set_config(config)
+
+ def on_show_prefs(self):
+ if client.is_localhost():
+ self.builder.get_object('folderchooser_path').show()
+ self.builder.get_object('entry_path').hide()
+ else:
+ self.builder.get_object('folderchooser_path').hide()
+ self.builder.get_object('entry_path').show()
+
+ def on_get_config(config):
+ if client.is_localhost():
+ self.builder.get_object('folderchooser_path').set_current_folder(
+ config['extract_path']
+ )
+ else:
+ self.builder.get_object('entry_path').set_text(config['extract_path'])
+
+ self.builder.get_object('chk_use_name').set_active(
+ config['use_name_folder']
+ )
+
+ client.extractor.get_config().addCallback(on_get_config)
diff --git a/deluge/plugins/Extractor/deluge_extractor/webui.py b/deluge/plugins/Extractor/deluge_extractor/webui.py
new file mode 100644
index 0000000..feb7b4a
--- /dev/null
+++ b/deluge/plugins/Extractor/deluge_extractor/webui.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.plugins.pluginbase import WebPluginBase
+
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+
+class WebUI(WebPluginBase):
+
+ scripts = [get_resource('extractor.js')]
+ debug_scripts = scripts
diff --git a/deluge/plugins/Extractor/setup.py b/deluge/plugins/Extractor/setup.py
new file mode 100644
index 0000000..25ab153
--- /dev/null
+++ b/deluge/plugins/Extractor/setup.py
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from setuptools import find_packages, setup
+
+__plugin_name__ = 'Extractor'
+__author__ = 'Andrew Resch'
+__author_email__ = 'andrewresch@gmail.com'
+__version__ = '0.7'
+__url__ = 'http://deluge-torrent.org'
+__license__ = 'GPLv3'
+__description__ = 'Extract files upon torrent completion'
+__long_description__ = """
+Extract files upon torrent completion
+
+Supports: .rar, .tar, .zip, .7z .tar.gz, .tgz, .tar.bz2, .tbz .tar.lzma, .tlz, .tar.xz, .txz
+
+Windows support: .rar, .zip, .tar, .7z, .xz, .lzma
+( Requires 7-zip installed: http://www.7-zip.org/ )
+
+Note: Will not extract with 'Move Completed' enabled
+"""
+__pkg_data__ = {'deluge_' + __plugin_name__.lower(): ['data/*']}
+
+setup(
+ name=__plugin_name__,
+ version=__version__,
+ description=__description__,
+ author=__author__,
+ author_email=__author_email__,
+ url=__url__,
+ license=__license__,
+ long_description=__long_description__ if __long_description__ else __description__,
+ packages=find_packages(),
+ package_data=__pkg_data__,
+ entry_points="""
+ [deluge.plugin.core]
+ %s = deluge_%s:CorePlugin
+ [deluge.plugin.gtk3ui]
+ %s = deluge_%s:GtkUIPlugin
+ [deluge.plugin.web]
+ %s = deluge_%s:WebUIPlugin
+ """
+ % ((__plugin_name__, __plugin_name__.lower()) * 3),
+)
diff --git a/deluge/plugins/Label/TODO b/deluge/plugins/Label/TODO
new file mode 100644
index 0000000..c6a5daa
--- /dev/null
+++ b/deluge/plugins/Label/TODO
@@ -0,0 +1,11 @@
+*grey bars are hard-coded , use theme to get bg-color.
+*label sub-menu is broken on 1'st popup.
+*replacing/restoring the sidebar model is a hack
+*config should save a label on bottom ok-button, not a seperate save-button per label
+*filters : add "Traffic" , use label-core for filtering ; needs hooks in torrentview.
+*torrentview: bugs/hacks in adding and removing columns
+*webui is functional but not polished.
+*move_torrent_to is not implemeted
+*no client-side validation (could be solved by a ui.aclient exception-plugin)
+*expand/arrows in sidebar are disabled to save space, fix the space issue or implement an alternative
+*fix and move tracker_host column+status-field to core.
diff --git a/deluge/plugins/Label/deluge_label/__init__.py b/deluge/plugins/Label/deluge_label/__init__.py
new file mode 100644
index 0000000..bc0b0f2
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/__init__.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.plugins.init import PluginInitBase
+
+
+class CorePlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .core import Core as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(CorePlugin, self).__init__(plugin_name)
+
+
+class GtkUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .gtkui import GtkUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(GtkUIPlugin, self).__init__(plugin_name)
+
+
+class WebUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .webui import WebUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(WebUIPlugin, self).__init__(plugin_name)
diff --git a/deluge/plugins/Label/deluge_label/common.py b/deluge/plugins/Label/deluge_label/common.py
new file mode 100644
index 0000000..4c9db09
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/common.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# 2009 Damien Churchill <damoxc@gmail.com>
+# 2010 Pedro Algarvio <pedro@algarvio.me>
+# 2017 Calum Lind <calumlind+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os.path
+
+from pkg_resources import resource_filename
+
+
+def get_resource(filename):
+ return resource_filename(__package__, os.path.join('data', filename))
diff --git a/deluge/plugins/Label/deluge_label/core.py b/deluge/plugins/Label/deluge_label/core.py
new file mode 100644
index 0000000..b16156c
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/core.py
@@ -0,0 +1,351 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""
+torrent-label core plugin.
+adds a status field for tracker.
+"""
+from __future__ import unicode_literals
+
+import logging
+import re
+
+import deluge.component as component
+from deluge.configmanager import ConfigManager
+from deluge.core.rpcserver import export
+from deluge.plugins.pluginbase import CorePluginBase
+
+log = logging.getLogger(__name__)
+
+RE_VALID = re.compile(r'[a-z0-9_\-\.]*\Z')
+
+KNOWN_STATES = ['Downloading', 'Seeding', 'Paused', 'Checking', 'Queued', 'Error']
+STATE = 'state'
+TRACKER = 'tracker'
+KEYWORD = 'keyword'
+LABEL = 'label'
+CONFIG_DEFAULTS = {
+ 'torrent_labels': {}, # torrent_id:label_id
+ 'labels': {}, # label_id:{name:value}
+}
+
+CORE_OPTIONS = ['auto_add_trackers']
+
+OPTIONS_DEFAULTS = {
+ 'apply_max': False,
+ 'max_download_speed': -1,
+ 'max_upload_speed': -1,
+ 'max_connections': -1,
+ 'max_upload_slots': -1,
+ 'prioritize_first_last': False,
+ 'apply_queue': False,
+ 'is_auto_managed': False,
+ 'stop_at_ratio': False,
+ 'stop_ratio': 2.0,
+ 'remove_at_ratio': False,
+ 'apply_move_completed': False,
+ 'move_completed': False,
+ 'move_completed_path': '',
+ 'auto_add': False,
+ 'auto_add_trackers': [],
+}
+
+NO_LABEL = 'No Label'
+
+
+def check_input(cond, message):
+ if not cond:
+ raise Exception(message)
+
+
+class Core(CorePluginBase):
+ """
+ self.labels = {label_id:label_options_dict}
+ self.torrent_labels = {torrent_id:label_id}
+ """
+
+ def enable(self):
+ log.info('*** Start Label plugin ***')
+ self.plugin = component.get('CorePluginManager')
+ self.plugin.register_status_field('label', self._status_get_label)
+
+ # __init__
+ core = component.get('Core')
+ self.config = ConfigManager('label.conf', defaults=CONFIG_DEFAULTS)
+ self.core_cfg = ConfigManager('core.conf')
+
+ # reduce typing, assigning some values to self...
+ self.torrents = core.torrentmanager.torrents
+ self.labels = self.config['labels']
+ self.torrent_labels = self.config['torrent_labels']
+
+ self.clean_initial_config()
+
+ component.get('EventManager').register_event_handler(
+ 'TorrentAddedEvent', self.post_torrent_add
+ )
+ component.get('EventManager').register_event_handler(
+ 'TorrentRemovedEvent', self.post_torrent_remove
+ )
+
+ # register tree:
+ component.get('FilterManager').register_tree_field(
+ 'label', self.init_filter_dict
+ )
+
+ log.debug('Label plugin enabled..')
+
+ def disable(self):
+ self.plugin.deregister_status_field('label')
+ component.get('FilterManager').deregister_tree_field('label')
+ component.get('EventManager').deregister_event_handler(
+ 'TorrentAddedEvent', self.post_torrent_add
+ )
+ component.get('EventManager').deregister_event_handler(
+ 'TorrentRemovedEvent', self.post_torrent_remove
+ )
+
+ def update(self):
+ pass
+
+ def init_filter_dict(self):
+ filter_dict = {label: 0 for label in self.labels}
+ filter_dict['All'] = len(self.torrents)
+ return filter_dict
+
+ # Plugin hooks #
+ def post_torrent_add(self, torrent_id, from_state):
+ if from_state:
+ return
+ log.debug('post_torrent_add')
+ torrent = self.torrents[torrent_id]
+
+ for label_id, options in self.labels.items():
+ if options['auto_add']:
+ if self._has_auto_match(torrent, options):
+ self.set_torrent(torrent_id, label_id)
+ return
+
+ def post_torrent_remove(self, torrent_id):
+ log.debug('post_torrent_remove')
+ if torrent_id in self.torrent_labels:
+ del self.torrent_labels[torrent_id]
+
+ # Utils #
+ def clean_config(self):
+ """remove invalid data from config-file"""
+ for torrent_id, label_id in list(self.torrent_labels.items()):
+ if (label_id not in self.labels) or (torrent_id not in self.torrents):
+ log.debug('label: rm %s:%s', torrent_id, label_id)
+ del self.torrent_labels[torrent_id]
+
+ def clean_initial_config(self):
+ """
+ *add any new keys in OPTIONS_DEFAULTS
+ *set all None values to default <-fix development config
+ """
+ log.debug(list(self.labels))
+ for key in self.labels:
+ options = dict(OPTIONS_DEFAULTS)
+ options.update(self.labels[key])
+ self.labels[key] = options
+
+ for label, options in self.labels.items():
+ for key, value in options.items():
+ if value is None:
+ self.labels[label][key] = OPTIONS_DEFAULTS[key]
+
+ def save_config(self):
+ self.clean_config()
+ self.config.save()
+
+ @export
+ def get_labels(self):
+ return sorted(self.labels)
+
+ # Labels:
+ @export
+ def add(self, label_id):
+ """add a label
+ see label_set_options for more options.
+ """
+ label_id = label_id.lower()
+ check_input(
+ RE_VALID.match(label_id), _('Invalid label, valid characters:[a-z0-9_-]')
+ )
+ check_input(label_id, _('Empty Label'))
+ check_input(not (label_id in self.labels), _('Label already exists'))
+
+ self.labels[label_id] = dict(OPTIONS_DEFAULTS)
+ self.config.save()
+
+ @export
+ def remove(self, label_id):
+ """remove a label"""
+ check_input(label_id in self.labels, _('Unknown Label'))
+ del self.labels[label_id]
+ self.clean_config()
+ self.config.save()
+
+ def _set_torrent_options(self, torrent_id, label_id):
+ options = self.labels[label_id]
+ torrent = self.torrents[torrent_id]
+
+ if not options['move_completed_path']:
+ options['move_completed_path'] = '' # no None.
+
+ if options['apply_max']:
+ torrent.set_max_download_speed(options['max_download_speed'])
+ torrent.set_max_upload_speed(options['max_upload_speed'])
+ torrent.set_max_connections(options['max_connections'])
+ torrent.set_max_upload_slots(options['max_upload_slots'])
+ torrent.set_prioritize_first_last_pieces(options['prioritize_first_last'])
+
+ if options['apply_queue']:
+ torrent.set_auto_managed(options['is_auto_managed'])
+ torrent.set_stop_at_ratio(options['stop_at_ratio'])
+ torrent.set_stop_ratio(options['stop_ratio'])
+ torrent.set_remove_at_ratio(options['remove_at_ratio'])
+
+ if options['apply_move_completed']:
+ torrent.set_options(
+ {
+ 'move_completed': options['move_completed'],
+ 'move_completed_path': options['move_completed_path'],
+ }
+ )
+
+ def _unset_torrent_options(self, torrent_id, label_id):
+ options = self.labels[label_id]
+ torrent = self.torrents[torrent_id]
+
+ if options['apply_max']:
+ torrent.set_max_download_speed(
+ self.core_cfg.config['max_download_speed_per_torrent']
+ )
+ torrent.set_max_upload_speed(
+ self.core_cfg.config['max_upload_speed_per_torrent']
+ )
+ torrent.set_max_connections(
+ self.core_cfg.config['max_connections_per_torrent']
+ )
+ torrent.set_max_upload_slots(
+ self.core_cfg.config['max_upload_slots_per_torrent']
+ )
+ torrent.set_prioritize_first_last_pieces(
+ self.core_cfg.config['prioritize_first_last_pieces']
+ )
+
+ if options['apply_queue']:
+ torrent.set_auto_managed(self.core_cfg.config['auto_managed'])
+ torrent.set_stop_at_ratio(self.core_cfg.config['stop_seed_at_ratio'])
+ torrent.set_stop_ratio(self.core_cfg.config['stop_seed_ratio'])
+ torrent.set_remove_at_ratio(self.core_cfg.config['remove_seed_at_ratio'])
+
+ if options['apply_move_completed']:
+ torrent.set_options(
+ {
+ 'move_completed': self.core_cfg.config['move_completed'],
+ 'move_completed_path': self.core_cfg.config['move_completed_path'],
+ }
+ )
+
+ def _has_auto_match(self, torrent, label_options):
+ """match for auto_add fields"""
+ for tracker_match in label_options['auto_add_trackers']:
+ for tracker in torrent.trackers:
+ if tracker_match in tracker['url']:
+ return True
+ return False
+
+ @export
+ def set_options(self, label_id, options_dict):
+ """update the label options
+
+ options_dict :
+ {"max_download_speed":float(),
+ "max_upload_speed":float(),
+ "max_connections":int(),
+ "max_upload_slots":int(),
+ #"prioritize_first_last":bool(),
+ "apply_max":bool(),
+ "move_completed_to":string() or None
+ }
+ """
+ check_input(label_id in self.labels, _('Unknown Label'))
+ for key in options_dict:
+ if key not in OPTIONS_DEFAULTS:
+ raise Exception('label: Invalid options_dict key:%s' % key)
+
+ self.labels[label_id].update(options_dict)
+
+ # apply
+ for torrent_id, label in self.torrent_labels.items():
+ if label_id == label and torrent_id in self.torrents:
+ self._set_torrent_options(torrent_id, label_id)
+
+ # auto add
+ options = self.labels[label_id]
+ if options['auto_add']:
+ for torrent_id, torrent in self.torrents.items():
+ if self._has_auto_match(torrent, options):
+ self.set_torrent(torrent_id, label_id)
+
+ self.config.save()
+
+ @export
+ def get_options(self, label_id):
+ """returns the label options"""
+ return self.labels[label_id]
+
+ @export
+ def set_torrent(self, torrent_id, label_id):
+ """
+ assign a label to a torrent
+ removes a label if the label_id parameter is empty.
+ """
+ if label_id == NO_LABEL:
+ label_id = None
+
+ check_input((not label_id) or (label_id in self.labels), _('Unknown Label'))
+ check_input(torrent_id in self.torrents, _('Unknown Torrent'))
+
+ if torrent_id in self.torrent_labels:
+ self._unset_torrent_options(torrent_id, self.torrent_labels[torrent_id])
+ del self.torrent_labels[torrent_id]
+ self.clean_config()
+ if label_id:
+ self.torrent_labels[torrent_id] = label_id
+ self._set_torrent_options(torrent_id, label_id)
+
+ self.config.save()
+
+ @export
+ def get_config(self):
+ """see : label_set_config"""
+ return {
+ key: self.config[key] for key in CORE_OPTIONS if key in self.config.config
+ }
+
+ @export
+ def set_config(self, options):
+ """global_options:"""
+ if options:
+ for key, value in options.items:
+ if key in CORE_OPTIONS:
+ self.config[key] = value
+
+ self.config.save()
+
+ def _status_get_label(self, torrent_id):
+ return self.torrent_labels.get(torrent_id) or ''
diff --git a/deluge/plugins/Label/deluge_label/data/label.js b/deluge/plugins/Label/deluge_label/data/label.js
new file mode 100644
index 0000000..cb0c1fe
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/data/label.js
@@ -0,0 +1,642 @@
+/**
+ * label.js
+ *
+ * Copyright (C) Damien Churchill 2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ *
+ */
+
+Ext.ns('Deluge.ux.preferences');
+
+/**
+ * @class Deluge.ux.preferences.LabelPage
+ * @extends Ext.Panel
+ */
+Deluge.ux.preferences.LabelPage = Ext.extend(Ext.Panel, {
+ title: _('Label'),
+ layout: 'fit',
+ border: false,
+
+ initComponent: function() {
+ Deluge.ux.preferences.LabelPage.superclass.initComponent.call(this);
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Label Preferences'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'panel',
+ });
+ fieldset.add({
+ border: false,
+ bodyCfg: {
+ html: _(
+ '<p>The Label plugin is enabled.</p><br>' +
+ '<p>To add, remove or edit labels right-click on the Label filter ' +
+ 'entry in the sidebar.</p><br>' +
+ '<p>To apply a label right-click on torrent(s).<p>'
+ ),
+ },
+ });
+ },
+});
+
+Ext.ns('Deluge.ux');
+
+/**
+ * @class Deluge.ux.AddLabelWindow
+ * @extends Ext.Window
+ */
+Deluge.ux.AddLabelWindow = Ext.extend(Ext.Window, {
+ title: _('Add Label'),
+ width: 300,
+ height: 100,
+
+ initComponent: function() {
+ Deluge.ux.AddLabelWindow.superclass.initComponent.call(this);
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+ this.addButton(_('Ok'), this.onOkClick, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ height: 35,
+ baseCls: 'x-plain',
+ bodyStyle: 'padding:5px 5px 0',
+ defaultType: 'textfield',
+ labelWidth: 50,
+ items: [
+ {
+ fieldLabel: _('Name'),
+ name: 'name',
+ allowBlank: false,
+ width: 220,
+ listeners: {
+ specialkey: {
+ fn: function(field, e) {
+ if (e.getKey() == 13) this.onOkClick();
+ },
+ scope: this,
+ },
+ },
+ },
+ ],
+ });
+ },
+
+ onCancelClick: function() {
+ this.hide();
+ },
+
+ onOkClick: function() {
+ var label = this.form.getForm().getValues().name;
+ deluge.client.label.add(label, {
+ success: function() {
+ deluge.ui.update();
+ this.fireEvent('labeladded', label);
+ },
+ scope: this,
+ });
+ this.hide();
+ },
+
+ onHide: function(comp) {
+ Deluge.ux.AddLabelWindow.superclass.onHide.call(this, comp);
+ this.form.getForm().reset();
+ },
+
+ onShow: function(comp) {
+ Deluge.ux.AddLabelWindow.superclass.onShow.call(this, comp);
+ this.form
+ .getForm()
+ .findField('name')
+ .focus(false, 150);
+ },
+});
+
+/**
+ * @class Deluge.ux.LabelOptionsWindow
+ * @extends Ext.Window
+ */
+Deluge.ux.LabelOptionsWindow = Ext.extend(Ext.Window, {
+ title: _('Label Options'),
+ width: 325,
+ height: 240,
+
+ initComponent: function() {
+ Deluge.ux.LabelOptionsWindow.superclass.initComponent.call(this);
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+ this.addButton(_('Ok'), this.onOkClick, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ });
+
+ this.tabs = this.form.add({
+ xtype: 'tabpanel',
+ height: 175,
+ border: false,
+ items: [
+ {
+ title: _('Maximum'),
+ items: [
+ {
+ border: false,
+ items: [
+ {
+ xtype: 'fieldset',
+ border: false,
+ labelWidth: 1,
+ style:
+ 'margin-bottom: 0px; padding-bottom: 0px;',
+ items: [
+ {
+ xtype: 'checkbox',
+ name: 'apply_max',
+ fieldLabel: '',
+ boxLabel: _(
+ 'Apply per torrent max settings:'
+ ),
+ listeners: {
+ check: this.onFieldChecked,
+ },
+ },
+ ],
+ },
+ {
+ xtype: 'fieldset',
+ border: false,
+ defaultType: 'spinnerfield',
+ style: 'margin-top: 0px; padding-top: 0px;',
+ items: [
+ {
+ fieldLabel: _('Download Speed'),
+ name: 'max_download_speed',
+ width: 80,
+ disabled: true,
+ value: -1,
+ minValue: -1,
+ },
+ {
+ fieldLabel: _('Upload Speed'),
+ name: 'max_upload_speed',
+ width: 80,
+ disabled: true,
+ value: -1,
+ minValue: -1,
+ },
+ {
+ fieldLabel: _('Upload Slots'),
+ name: 'max_upload_slots',
+ width: 80,
+ disabled: true,
+ value: -1,
+ minValue: -1,
+ },
+ {
+ fieldLabel: _('Connections'),
+ name: 'max_connections',
+ width: 80,
+ disabled: true,
+ value: -1,
+ minValue: -1,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ {
+ title: _('Queue'),
+ items: [
+ {
+ border: false,
+ items: [
+ {
+ xtype: 'fieldset',
+ border: false,
+ labelWidth: 1,
+ style:
+ 'margin-bottom: 0px; padding-bottom: 0px;',
+ items: [
+ {
+ xtype: 'checkbox',
+ name: 'apply_queue',
+ fieldLabel: '',
+ boxLabel: _(
+ 'Apply queue settings:'
+ ),
+ listeners: {
+ check: this.onFieldChecked,
+ },
+ },
+ ],
+ },
+ {
+ xtype: 'fieldset',
+ border: false,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ style: 'margin-top: 0px; padding-top: 0px;',
+ defaults: {
+ style: 'margin-left: 20px',
+ },
+ items: [
+ {
+ boxLabel: _('Auto Managed'),
+ name: 'is_auto_managed',
+ disabled: true,
+ },
+ {
+ boxLabel: _('Stop seed at ratio:'),
+ name: 'stop_at_ratio',
+ disabled: true,
+ },
+ {
+ xtype: 'spinnerfield',
+ name: 'stop_ratio',
+ width: 60,
+ decimalPrecision: 2,
+ incrementValue: 0.1,
+ style:
+ 'position: relative; left: 100px',
+ disabled: true,
+ },
+ {
+ boxLabel: _('Remove at ratio'),
+ name: 'remove_at_ratio',
+ disabled: true,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ {
+ title: _('Folders'),
+ items: [
+ {
+ border: false,
+ items: [
+ {
+ xtype: 'fieldset',
+ border: false,
+ labelWidth: 1,
+ style:
+ 'margin-bottom: 0px; padding-bottom: 0px;',
+ items: [
+ {
+ xtype: 'checkbox',
+ name: 'apply_move_completed',
+ fieldLabel: '',
+ boxLabel: _(
+ 'Apply folder settings:'
+ ),
+ listeners: {
+ check: this.onFieldChecked,
+ },
+ },
+ ],
+ },
+ {
+ xtype: 'fieldset',
+ border: false,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ labelWidth: 1,
+ style: 'margin-top: 0px; padding-top: 0px;',
+ defaults: {
+ style: 'margin-left: 20px',
+ },
+ items: [
+ {
+ boxLabel: _('Move completed to:'),
+ name: 'move_completed',
+ disabled: true,
+ },
+ {
+ xtype: 'textfield',
+ name: 'move_completed_path',
+ width: 250,
+ disabled: true,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ {
+ title: _('Trackers'),
+ items: [
+ {
+ border: false,
+ items: [
+ {
+ xtype: 'fieldset',
+ border: false,
+ labelWidth: 1,
+ style:
+ 'margin-bottom: 0px; padding-bottom: 0px;',
+ items: [
+ {
+ xtype: 'checkbox',
+ name: 'auto_add',
+ fieldLabel: '',
+ boxLabel: _(
+ 'Automatically apply label:'
+ ),
+ listeners: {
+ check: this.onFieldChecked,
+ },
+ },
+ ],
+ },
+ {
+ xtype: 'fieldset',
+ border: false,
+ labelWidth: 1,
+ style: 'margin-top: 0px; padding-top: 0px;',
+ defaults: {
+ style: 'margin-left: 20px',
+ },
+ defaultType: 'textarea',
+ items: [
+ {
+ boxLabel: _('Move completed to:'),
+ name: 'auto_add_trackers',
+ width: 250,
+ height: 100,
+ disabled: true,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ });
+ },
+
+ getLabelOptions: function() {
+ deluge.client.label.get_options(this.label, {
+ success: this.gotOptions,
+ scope: this,
+ });
+ },
+
+ gotOptions: function(options) {
+ this.form.getForm().setValues(options);
+ },
+
+ show: function(label) {
+ Deluge.ux.LabelOptionsWindow.superclass.show.call(this);
+ this.label = label;
+ this.setTitle(_('Label Options') + ': ' + this.label);
+ this.tabs.setActiveTab(0);
+ this.getLabelOptions();
+ },
+
+ onCancelClick: function() {
+ this.hide();
+ },
+
+ onOkClick: function() {
+ var values = this.form.getForm().getFieldValues();
+ if (values['auto_add_trackers']) {
+ values['auto_add_trackers'] = values['auto_add_trackers'].split(
+ '\n'
+ );
+ }
+ deluge.client.label.set_options(this.label, values);
+ this.hide();
+ },
+
+ onFieldChecked: function(field, checked) {
+ var fs = field.ownerCt.nextSibling();
+ fs.items.each(function(field) {
+ field.setDisabled(!checked);
+ });
+ },
+});
+
+Ext.ns('Deluge.plugins');
+
+/**
+ * @class Deluge.plugins.LabelPlugin
+ * @extends Deluge.Plugin
+ */
+Deluge.plugins.LabelPlugin = Ext.extend(Deluge.Plugin, {
+ name: 'Label',
+
+ createMenu: function() {
+ this.labelMenu = new Ext.menu.Menu({
+ items: [
+ {
+ text: _('Add Label'),
+ iconCls: 'icon-add',
+ handler: this.onLabelAddClick,
+ scope: this,
+ },
+ {
+ text: _('Remove Label'),
+ disabled: true,
+ iconCls: 'icon-remove',
+ handler: this.onLabelRemoveClick,
+ scope: this,
+ },
+ {
+ text: _('Label Options'),
+ disabled: true,
+ handler: this.onLabelOptionsClick,
+ scope: this,
+ },
+ ],
+ });
+ },
+
+ setFilter: function(filter) {
+ filter.show_zero = true;
+
+ filter.list.on('contextmenu', this.onLabelContextMenu, this);
+ filter.header.on('contextmenu', this.onLabelHeaderContextMenu, this);
+ this.filter = filter;
+ },
+
+ updateTorrentMenu: function(states) {
+ this.torrentMenu.removeAll(true);
+ this.torrentMenu.addMenuItem({
+ text: _('No Label'),
+ label: '',
+ handler: this.onTorrentMenuClick,
+ scope: this,
+ });
+ for (var state in states) {
+ if (!state || state == 'All') continue;
+ this.torrentMenu.addMenuItem({
+ text: state,
+ label: state,
+ handler: this.onTorrentMenuClick,
+ scope: this,
+ });
+ }
+ },
+
+ onDisable: function() {
+ deluge.sidebar.un('filtercreate', this.onFilterCreate);
+ deluge.sidebar.un('afterfiltercreate', this.onAfterFilterCreate);
+ delete Deluge.FilterPanel.templates.label;
+ this.deregisterTorrentStatus('label');
+ deluge.menus.torrent.remove(this.tmSep);
+ deluge.menus.torrent.remove(this.tm);
+ deluge.preferences.removePage(this.prefsPage);
+ },
+
+ onEnable: function() {
+ this.prefsPage = deluge.preferences.addPage(
+ new Deluge.ux.preferences.LabelPage()
+ );
+ this.torrentMenu = new Ext.menu.Menu();
+
+ this.tmSep = deluge.menus.torrent.add({
+ xtype: 'menuseparator',
+ });
+
+ this.tm = deluge.menus.torrent.add({
+ text: _('Label'),
+ menu: this.torrentMenu,
+ });
+
+ var lbltpl =
+ '<div class="x-deluge-filter">' +
+ '<tpl if="filter">{filter}</tpl>' +
+ '<tpl if="!filter">No Label</tpl>' +
+ ' ({count})' +
+ '</div>';
+
+ if (deluge.sidebar.hasFilter('label')) {
+ var filter = deluge.sidebar.getFilter('label');
+ filter.list.columns[0].tpl = new Ext.XTemplate(lbltpl);
+ this.setFilter(filter);
+ this.updateTorrentMenu(filter.getStates());
+ filter.list.refresh();
+ } else {
+ deluge.sidebar.on('filtercreate', this.onFilterCreate, this);
+ deluge.sidebar.on(
+ 'afterfiltercreate',
+ this.onAfterFilterCreate,
+ this
+ );
+ Deluge.FilterPanel.templates.label = lbltpl;
+ }
+ this.registerTorrentStatus('label', _('Label'));
+ },
+
+ onAfterFilterCreate: function(sidebar, filter) {
+ if (filter.filter != 'label') return;
+ this.updateTorrentMenu(filter.getStates());
+ },
+
+ onFilterCreate: function(sidebar, filter) {
+ if (filter.filter != 'label') return;
+ this.setFilter(filter);
+ },
+
+ onLabelAddClick: function() {
+ if (!this.addWindow) {
+ this.addWindow = new Deluge.ux.AddLabelWindow();
+ this.addWindow.on('labeladded', this.onLabelAdded, this);
+ }
+ this.addWindow.show();
+ },
+
+ onLabelAdded: function(label) {
+ var filter = deluge.sidebar.getFilter('label');
+ var states = filter.getStates();
+ var statesArray = [];
+
+ for (state in states) {
+ if (!state || state == 'All') continue;
+ statesArray.push(state);
+ }
+
+ statesArray.push(label.toLowerCase());
+ statesArray.sort();
+
+ //console.log(states);
+ //console.log(statesArray);
+
+ states = {};
+
+ for (i = 0; i < statesArray.length; ++i) {
+ states[statesArray[i]] = 0;
+ }
+
+ this.updateTorrentMenu(states);
+ },
+
+ onLabelContextMenu: function(dv, i, node, e) {
+ e.preventDefault();
+ if (!this.labelMenu) this.createMenu();
+ var r = dv.getRecord(node).get('filter');
+ if (!r || r == 'All') {
+ this.labelMenu.items.get(1).setDisabled(true);
+ this.labelMenu.items.get(2).setDisabled(true);
+ } else {
+ this.labelMenu.items.get(1).setDisabled(false);
+ this.labelMenu.items.get(2).setDisabled(false);
+ }
+ dv.select(i);
+ this.labelMenu.showAt(e.getXY());
+ },
+
+ onLabelHeaderContextMenu: function(e, t) {
+ e.preventDefault();
+ if (!this.labelMenu) this.createMenu();
+ this.labelMenu.items.get(1).setDisabled(true);
+ this.labelMenu.items.get(2).setDisabled(true);
+ this.labelMenu.showAt(e.getXY());
+ },
+
+ onLabelOptionsClick: function() {
+ if (!this.labelOpts)
+ this.labelOpts = new Deluge.ux.LabelOptionsWindow();
+ this.labelOpts.show(this.filter.getState());
+ },
+
+ onLabelRemoveClick: function() {
+ var state = this.filter.getState();
+ deluge.client.label.remove(state, {
+ success: function() {
+ deluge.ui.update();
+ this.torrentMenu.items.each(function(item) {
+ if (item.text != state) return;
+ this.torrentMenu.remove(item);
+ var i = item;
+ }, this);
+ },
+ scope: this,
+ });
+ },
+
+ onTorrentMenuClick: function(item, e) {
+ var ids = deluge.torrents.getSelectedIds();
+ Ext.each(ids, function(id, i) {
+ if (ids.length == i + 1) {
+ deluge.client.label.set_torrent(id, item.label, {
+ success: function() {
+ deluge.ui.update();
+ },
+ });
+ } else {
+ deluge.client.label.set_torrent(id, item.label);
+ }
+ });
+ },
+});
+Deluge.registerPlugin('Label', Deluge.plugins.LabelPlugin);
diff --git a/deluge/plugins/Label/deluge_label/data/label_add.ui b/deluge/plugins/Label/deluge_label/data/label_add.ui
new file mode 100644
index 0000000..68f8a72
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/data/label_add.ui
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="dlg_label_add">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Add Label</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="window_position">mouse</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button2">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_add_cancel" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button1">
+ <property name="label">gtk-ok</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_add_ok" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-add</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Add Label&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHSeparator" id="hseparator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Name:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="txt_add">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button2</action-widget>
+ <action-widget response="0">button1</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/plugins/Label/deluge_label/data/label_options.ui b/deluge/plugins/Label/deluge_label/data/label_options.ui
new file mode 100644
index 0000000..c0fca4f
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/data/label_options.ui
@@ -0,0 +1,735 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="value">-1</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="value">-1</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment3">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="value">-1</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment4">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="value">-1</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment5">
+ <property name="lower">0.10000000000000001</property>
+ <property name="upper">100</property>
+ <property name="value">2</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkTextBuffer" id="textbuffer1">
+ <property name="text" translatable="yes">tracker1.org</property>
+ </object>
+ <object class="GtkDialog" id="dlg_label_options">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Label Options</property>
+ <property name="modal">True</property>
+ <property name="window_position">mouse</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button4">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_options_cancel" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button3">
+ <property name="label">gtk-ok</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_options_ok" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-preferences</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_header">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Label Options&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="notebook2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">2</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">5</property>
+ <property name="n_columns">4</property>
+ <property name="column_spacing">5</property>
+ <property name="row_spacing">5</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="max_upload_speed">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options"/>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">KiB/s</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="max_download_speed">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment2</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options"/>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Upload Slots:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Upload Speed:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Download Speed:</property>
+ <property name="use_markup">True</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">KiB/s</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="max_upload_slots">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment3</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options"/>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Connections:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="max_connections">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment4</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options"/>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkCheckButton" id="apply_max">
+ <property name="label" translatable="yes">Apply per torrent max settings:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Maximum</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">2</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">3</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="is_auto_managed">
+ <property name="label" translatable="yes">Auto Managed</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="stop_at_ratio">
+ <property name="label" translatable="yes">Stop seed at ratio:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="remove_at_ratio">
+ <property name="label" translatable="yes">Remove at ratio</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="stop_ratio">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment5</property>
+ <property name="digits">2</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options"/>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkCheckButton" id="apply_queue">
+ <property name="label" translatable="yes">Apply Queue settings:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Queue</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">2</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="table3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="GtkCheckButton" id="move_completed">
+ <property name="label" translatable="yes">Move completed to:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFileChooserButton" id="move_completed_path">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action">select-folder</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="move_completed_path_entry">
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkCheckButton" id="apply_move_completed">
+ <property name="label" translatable="yes">Apply folder settings:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Folders</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">2</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTextView" id="auto_add_trackers">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="buffer">textbuffer1</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;i&gt;(1 line per tracker)&lt;/i&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkCheckButton" id="auto_add">
+ <property name="label" translatable="yes">Automatically apply label:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label99">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Trackers</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button4</action-widget>
+ <action-widget response="0">button3</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/plugins/Label/deluge_label/data/label_pref.ui b/deluge/plugins/Label/deluge_label/data/label_pref.ui
new file mode 100644
index 0000000..81edc37
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/data/label_pref.ui
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkWindow" id="window1">
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="label_prefs_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;i&gt;Use the sidebar to add,edit and remove labels. &lt;/i&gt;
+</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Labels&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/Label/deluge_label/gtkui/__init__.py b/deluge/plugins/Label/deluge_label/gtkui/__init__.py
new file mode 100644
index 0000000..eeaeadc
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/gtkui/__init__.py
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge import component # for systray
+from deluge.plugins.pluginbase import Gtk3PluginBase
+
+from . import label_config, sidebar_menu, submenu
+
+log = logging.getLogger(__name__)
+
+NO_LABEL = 'No Label'
+
+
+def cell_data_label(column, cell, model, row, data):
+ cell.set_property('text', str(model.get_value(row, data)))
+
+
+class GtkUI(Gtk3PluginBase):
+ def start(self):
+ if self.label_menu:
+ self.label_menu.on_show()
+
+ def enable(self):
+ self.plugin = component.get('PluginManager')
+ self.torrentmenu = component.get('MenuBar').torrentmenu
+ self.label_menu = None
+ self.labelcfg = None
+ self.sidebar_menu = None
+ self.load_interface()
+
+ def disable(self):
+ if self.label_menu in self.torrentmenu.get_children():
+ self.torrentmenu.remove(self.label_menu)
+
+ self.labelcfg.unload()
+ self.sidebar_menu.unload()
+ del self.sidebar_menu
+
+ component.get('TorrentView').remove_column(_('Label'))
+
+ def load_interface(self):
+ # sidebar
+ # disabled
+ if not self.sidebar_menu:
+ self.sidebar_menu = sidebar_menu.LabelSidebarMenu()
+ # self.sidebar.load()
+
+ # menu:
+ log.debug('add items to torrentview-popup menu.')
+ self.label_menu = submenu.LabelMenu()
+ self.torrentmenu.append(self.label_menu)
+ self.label_menu.show_all()
+
+ # columns:
+ self.load_columns()
+
+ # config:
+ if not self.labelcfg:
+ self.labelcfg = label_config.LabelConfig(self.plugin)
+ self.labelcfg.load()
+
+ log.debug('Finished loading Label plugin')
+
+ def load_columns(self):
+ log.debug('add columns')
+
+ component.get('TorrentView').add_text_column(_('Label'), status_field=['label'])
diff --git a/deluge/plugins/Label/deluge_label/gtkui/label_config.py b/deluge/plugins/Label/deluge_label/gtkui/label_config.py
new file mode 100644
index 0000000..b1bf56d
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/gtkui/label_config.py
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from gi.repository.Gtk import Builder
+
+from deluge.ui.client import client
+
+from ..common import get_resource
+
+log = logging.getLogger(__name__)
+
+
+class LabelConfig(object):
+ """
+ there used to be some options here...
+ """
+
+ def __init__(self, plugin):
+ self.plugin = plugin
+
+ def load(self):
+ log.debug('Adding Label Preferences page')
+ builder = Builder()
+ builder.add_from_file(get_resource('label_pref.ui'))
+
+ self.plugin.add_preferences_page(
+ _('Label'), builder.get_object('label_prefs_box')
+ )
+ self.plugin.register_hook('on_show_prefs', self.load_settings)
+ self.plugin.register_hook('on_apply_prefs', self.on_apply_prefs)
+
+ self.load_settings()
+
+ def unload(self):
+ self.plugin.remove_preferences_page(_('Label'))
+ self.plugin.deregister_hook('on_apply_prefs', self.on_apply_prefs)
+ self.plugin.deregister_hook('on_show_prefs', self.load_settings)
+
+ def load_settings(self, widget=None, data=None):
+ client.label.get_config().addCallback(self.cb_global_options)
+
+ def cb_global_options(self, options):
+ log.debug('options=%s', options)
+
+ # for id in self.chk_ids:
+ # self.glade.get_widget(id).set_active(bool(options[id]))
+
+ def on_apply_prefs(self):
+ options = {}
+ # update options dict here.
+ client.label.set_config(options)
diff --git a/deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py b/deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py
new file mode 100644
index 0000000..34358db
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/gtkui/sidebar_menu.py
@@ -0,0 +1,263 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import gi # isort:skip (Required before Gtk import).
+
+gi.require_version('Gtk', '3.0') # NOQA: E402
+
+# isort:imports-thirdparty
+from gi.repository import Gtk
+
+# isort:imports-firstparty
+import deluge.component as component
+from deluge.ui.client import client
+
+# isort:imports-localfolder
+from ..common import get_resource
+
+log = logging.getLogger(__name__)
+
+NO_LABEL = 'No Label'
+
+
+# menu
+class LabelSidebarMenu(object):
+ def __init__(self):
+
+ self.treeview = component.get('FilterTreeView')
+ self.menu = self.treeview.menu
+ self.items = []
+
+ # add items, in reverse order, because they are prepended.
+ sep = Gtk.SeparatorMenuItem()
+ self.items.append(sep)
+ self.menu.prepend(sep)
+ self._add_item('options', _('Label _Options'))
+ self._add_item('remove', _('_Remove Label'))
+ self._add_item('add', _('_Add Label'))
+
+ self.menu.show_all()
+ # dialogs:
+ self.add_dialog = AddDialog()
+ self.options_dialog = OptionsDialog()
+ # hooks:
+ self.menu.connect('show', self.on_show, None)
+
+ def _add_item(self, item_id, label):
+ """
+ id is automatically-added as self.item_<id>
+ """
+ item = Gtk.MenuItem.new_with_mnemonic(label)
+ func = getattr(self, 'on_%s' % item_id)
+ item.connect('activate', func)
+ self.menu.prepend(item)
+ setattr(self, 'item_%s' % item_id, item)
+ self.items.append(item)
+ return item
+
+ def on_add(self, event=None):
+ self.add_dialog.show()
+
+ def on_remove(self, event=None):
+ client.label.remove(self.treeview.value)
+
+ def on_options(self, event=None):
+ self.options_dialog.show(self.treeview.value)
+
+ def on_show(self, widget=None, data=None):
+ """No Label:disable options/del."""
+ log.debug('label-sidebar-popup:on-show')
+
+ cat = self.treeview.cat
+ label = self.treeview.value
+ if cat == 'label' or (cat == 'cat' and label == 'label'):
+ # is a label : show menu-items
+ for item in self.items:
+ item.show()
+ # default items
+ sensitive = (label not in (NO_LABEL, None, '', 'All')) and (cat != 'cat')
+ for item in self.items:
+ item.set_sensitive(sensitive)
+
+ # add is allways enabled.
+ self.item_add.set_sensitive(True)
+ else:
+ # not a label -->hide everything.
+ for item in self.items:
+ item.hide()
+
+ def unload(self):
+ log.debug('disable01')
+ for item in list(self.items):
+ item.hide()
+ item.destroy()
+ log.debug('disable02')
+ self.items = []
+
+
+# dialogs:
+class AddDialog(object):
+ def __init__(self):
+ pass
+
+ def show(self):
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(get_resource('label_add.ui'))
+ self.dialog = self.builder.get_object('dlg_label_add')
+ self.dialog.set_transient_for(component.get('MainWindow').window)
+
+ self.builder.connect_signals(self)
+ self.dialog.run()
+
+ def on_add_ok(self, event=None):
+ value = self.builder.get_object('txt_add').get_text()
+ client.label.add(value)
+ self.dialog.destroy()
+
+ def on_add_cancel(self, event=None):
+ self.dialog.destroy()
+
+
+class OptionsDialog(object):
+ spin_ids = ['max_download_speed', 'max_upload_speed', 'stop_ratio']
+ spin_int_ids = ['max_upload_slots', 'max_connections']
+ chk_ids = [
+ 'apply_max',
+ 'apply_queue',
+ 'stop_at_ratio',
+ 'apply_queue',
+ 'remove_at_ratio',
+ 'apply_move_completed',
+ 'move_completed',
+ 'is_auto_managed',
+ 'auto_add',
+ ]
+
+ # list of tuples, because order matters when nesting.
+ sensitive_groups = [
+ (
+ 'apply_max',
+ [
+ 'max_download_speed',
+ 'max_upload_speed',
+ 'max_upload_slots',
+ 'max_connections',
+ ],
+ ),
+ ('apply_queue', ['is_auto_managed', 'stop_at_ratio']),
+ ('stop_at_ratio', ['remove_at_ratio', 'stop_ratio']), # nested
+ ('apply_move_completed', ['move_completed']),
+ ('move_completed', ['move_completed_path']), # nested
+ ('auto_add', ['auto_add_trackers']),
+ ]
+
+ def __init__(self):
+ pass
+
+ def show(self, label):
+ self.label = label
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(get_resource('label_options.ui'))
+ self.dialog = self.builder.get_object('dlg_label_options')
+ self.dialog.set_transient_for(component.get('MainWindow').window)
+ self.builder.connect_signals(self)
+ # Show the label name in the header label
+ self.builder.get_object('label_header').set_markup(
+ '<b>%s:</b> %s' % (_('Label Options'), self.label)
+ )
+
+ for chk_id, group in self.sensitive_groups:
+ chk = self.builder.get_object(chk_id)
+ chk.connect('toggled', self.apply_sensitivity)
+
+ client.label.get_options(self.label).addCallback(self.load_options)
+
+ self.dialog.run()
+
+ def load_options(self, options):
+ log.debug(list(options))
+
+ for spin_id in self.spin_ids + self.spin_int_ids:
+ self.builder.get_object(spin_id).set_value(options[spin_id])
+ for chk_id in self.chk_ids:
+ self.builder.get_object(chk_id).set_active(bool(options[chk_id]))
+
+ if client.is_localhost():
+ self.builder.get_object('move_completed_path').set_filename(
+ options['move_completed_path']
+ )
+ self.builder.get_object('move_completed_path').show()
+ self.builder.get_object('move_completed_path_entry').hide()
+ else:
+ self.builder.get_object('move_completed_path_entry').set_text(
+ options['move_completed_path']
+ )
+ self.builder.get_object('move_completed_path_entry').show()
+ self.builder.get_object('move_completed_path').hide()
+
+ self.builder.get_object('auto_add_trackers').get_buffer().set_text(
+ '\n'.join(options['auto_add_trackers'])
+ )
+
+ self.apply_sensitivity()
+
+ def on_options_ok(self, event=None):
+ """Save options."""
+ options = {}
+
+ for spin_id in self.spin_ids:
+ options[spin_id] = self.builder.get_object(spin_id).get_value()
+ for spin_int_id in self.spin_int_ids:
+ options[spin_int_id] = self.builder.get_object(
+ spin_int_id
+ ).get_value_as_int()
+ for chk_id in self.chk_ids:
+ options[chk_id] = self.builder.get_object(chk_id).get_active()
+
+ if client.is_localhost():
+ options['move_completed_path'] = self.builder.get_object(
+ 'move_completed_path'
+ ).get_filename()
+ else:
+ options['move_completed_path'] = self.builder.get_object(
+ 'move_completed_path_entry'
+ ).get_text()
+
+ buff = self.builder.get_object(
+ 'auto_add_trackers'
+ ).get_buffer() # sometimes I hate gtk...
+ tracker_lst = (
+ buff.get_text(
+ buff.get_start_iter(), buff.get_end_iter(), include_hidden_chars=False
+ )
+ .strip()
+ .split('\n')
+ )
+ options['auto_add_trackers'] = [
+ x for x in tracker_lst if x
+ ] # filter out empty lines.
+
+ log.debug(options)
+ client.label.set_options(self.label, options)
+ self.dialog.destroy()
+
+ def apply_sensitivity(self, event=None):
+ for chk_id, sensitive_list in self.sensitive_groups:
+ chk = self.builder.get_object(chk_id)
+ sens = chk.get_active() and chk.get_property('sensitive')
+ for widget_id in sensitive_list:
+ self.builder.get_object(widget_id).set_sensitive(sens)
+
+ def on_options_cancel(self, event=None):
+ self.dialog.destroy()
diff --git a/deluge/plugins/Label/deluge_label/gtkui/submenu.py b/deluge/plugins/Label/deluge_label/gtkui/submenu.py
new file mode 100644
index 0000000..c5f80e7
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/gtkui/submenu.py
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+
+from __future__ import unicode_literals
+
+import logging
+
+from gi.repository.Gtk import Menu, MenuItem
+
+from deluge import component # for systray
+from deluge.ui.client import client
+
+log = logging.getLogger(__name__)
+
+
+# Deferred Translation
+def _(message):
+ return message
+
+
+NO_LABEL = _('No Label')
+del _
+
+
+class LabelMenu(MenuItem):
+ def __init__(self):
+ MenuItem.__init__(self, _('Label')) # noqa: F821
+
+ self.sub_menu = Menu()
+ self.set_submenu(self.sub_menu)
+ self.items = []
+
+ # attach..
+ self.sub_menu.connect('show', self.on_show, None)
+
+ def get_torrent_ids(self):
+ return component.get('TorrentView').get_selected_torrents()
+
+ def on_show(self, widget=None, data=None):
+ log.debug('label-on-show')
+ client.label.get_labels().addCallback(self.cb_labels)
+
+ def cb_labels(self, labels):
+ for child in self.sub_menu.get_children():
+ self.sub_menu.remove(child)
+ for label in [NO_LABEL] + list(labels):
+ if label == NO_LABEL:
+ item = MenuItem(_(NO_LABEL)) # noqa: F821
+ else:
+ item = MenuItem(label.replace('_', '__'))
+ item.connect('activate', self.on_select_label, label)
+ self.sub_menu.append(item)
+ self.show_all()
+
+ def on_select_label(self, widget=None, label_id=None):
+ log.debug('select label:%s,%s', label_id, self.get_torrent_ids())
+ for torrent_id in self.get_torrent_ids():
+ client.label.set_torrent(torrent_id, label_id)
diff --git a/deluge/plugins/Label/deluge_label/test.py b/deluge/plugins/Label/deluge_label/test.py
new file mode 100644
index 0000000..5c9ffcd
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/test.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+from deluge.ui.client import sclient
+
+sclient.set_core_uri()
+
+print(sclient.get_enabled_plugins())
+
+# enable plugin.
+if 'label' not in sclient.get_enabled_plugins():
+ sclient.enable_plugin('label')
+
+
+# test labels.
+print('#init labels')
+try:
+ sclient.label_remove('test')
+except Exception:
+ pass
+sess_id = sclient.get_session_state()[0]
+
+print('#add')
+sclient.label_add('test')
+print('#set')
+sclient.label_set_torrent(id, 'test')
+
+print(sclient.get_torrents_status({'label': 'test'}, 'name'))
+
+
+print('#set options')
+sclient.label_set_options('test', {'max_download_speed': 999}, True)
+print(sclient.get_torrent_status(sess_id, ['max_download_speed']), '999')
+sclient.label_set_options('test', {'max_download_speed': 9}, True)
+print(sclient.get_torrent_status(sess_id, ['max_download_speed']), '9')
+sclient.label_set_options('test', {'max_download_speed': 888}, False)
+print(sclient.get_torrent_status(sess_id, ['max_download_speed']), '9 (888)')
+
+print(sclient.get_torrent_status(sess_id, ['name', 'tracker_host', 'label']))
diff --git a/deluge/plugins/Label/deluge_label/webui.py b/deluge/plugins/Label/deluge_label/webui.py
new file mode 100644
index 0000000..58c38e9
--- /dev/null
+++ b/deluge/plugins/Label/deluge_label/webui.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.plugins.pluginbase import WebPluginBase
+
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+
+class WebUI(WebPluginBase):
+ scripts = [get_resource('label.js')]
+ debug_scripts = scripts
diff --git a/deluge/plugins/Label/setup.py b/deluge/plugins/Label/setup.py
new file mode 100644
index 0000000..567335b
--- /dev/null
+++ b/deluge/plugins/Label/setup.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from setuptools import find_packages, setup
+
+__plugin_name__ = 'Label'
+__author__ = 'Martijn Voncken'
+__author_email__ = 'mvoncken@gmail.com'
+__version__ = '0.3'
+__url__ = 'http://deluge-torrent.org'
+__license__ = 'GPLv3'
+__description__ = 'Allows labels to be assigned to torrents'
+__long_description__ = """
+Allows labels to be assigned to torrents
+
+Also offers filters on state, tracker and keywords
+"""
+__pkg_data__ = {'deluge_' + __plugin_name__.lower(): ['data/*']}
+
+setup(
+ name=__plugin_name__,
+ version=__version__,
+ description=__description__,
+ author=__author__,
+ author_email=__author_email__,
+ url=__url__,
+ license=__license__,
+ long_description=__long_description__,
+ packages=find_packages(),
+ package_data=__pkg_data__,
+ entry_points="""
+ [deluge.plugin.core]
+ %s = deluge_%s:CorePlugin
+ [deluge.plugin.gtk3ui]
+ %s = deluge_%s:GtkUIPlugin
+ [deluge.plugin.web]
+ %s = deluge_%s:WebUIPlugin
+ """
+ % ((__plugin_name__, __plugin_name__.lower()) * 3),
+)
diff --git a/deluge/plugins/Notifications/deluge_notifications/__init__.py b/deluge/plugins/Notifications/deluge_notifications/__init__.py
new file mode 100644
index 0000000..810e284
--- /dev/null
+++ b/deluge/plugins/Notifications/deluge_notifications/__init__.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2010 Pedro Algarvio <pedro@algarvio.me>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.plugins.init import PluginInitBase
+
+
+class CorePlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .core import Core as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(CorePlugin, self).__init__(plugin_name)
+
+
+class GtkUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .gtkui import GtkUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(GtkUIPlugin, self).__init__(plugin_name)
+
+
+class WebUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .webui import WebUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(WebUIPlugin, self).__init__(plugin_name)
diff --git a/deluge/plugins/Notifications/deluge_notifications/common.py b/deluge/plugins/Notifications/deluge_notifications/common.py
new file mode 100644
index 0000000..6966122
--- /dev/null
+++ b/deluge/plugins/Notifications/deluge_notifications/common.py
@@ -0,0 +1,117 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2010 Pedro Algarvio <pedro@algarvio.me>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os.path
+
+from pkg_resources import resource_filename
+from twisted.internet import defer
+
+from deluge import component
+from deluge.event import known_events
+
+log = logging.getLogger(__name__)
+
+
+def get_resource(filename):
+ return resource_filename(__package__, os.path.join('data', filename))
+
+
+class CustomNotifications(object):
+ def __init__(self, plugin_name=None):
+ self.custom_notifications = {'email': {}, 'popup': {}, 'blink': {}, 'sound': {}}
+
+ def enable(self):
+ pass
+
+ def disable(self):
+ for kind in self.custom_notifications:
+ for eventtype in list(self.custom_notifications[kind]):
+ wrapper, handler = self.custom_notifications[kind][eventtype]
+ self._deregister_custom_provider(kind, eventtype)
+
+ def _handle_custom_providers(self, kind, eventtype, *args, **kwargs):
+ log.debug(
+ 'Calling CORE custom %s providers for %s: %s %s',
+ kind,
+ eventtype,
+ args,
+ kwargs,
+ )
+ if eventtype in self.config['subscriptions'][kind]:
+ wrapper, handler = self.custom_notifications[kind][eventtype]
+ log.debug('Found handler for kind %s: %s', kind, handler)
+ custom_notif_func = getattr(self, 'handle_custom_%s_notification' % kind)
+ d = defer.maybeDeferred(handler, *args, **kwargs)
+ d.addCallback(custom_notif_func, eventtype)
+ d.addCallback(self._on_notify_sucess, kind)
+ d.addErrback(self._on_notify_failure, kind)
+ return d
+
+ def _register_custom_provider(self, kind, eventtype, handler):
+ if not self._handled_eventtype(eventtype, handler):
+ return defer.succeed('Event not handled')
+ if eventtype not in self.custom_notifications:
+
+ def wrapper(*args, **kwargs):
+ return self._handle_custom_providers(kind, eventtype, *args, **kwargs)
+
+ self.custom_notifications[kind][eventtype] = (wrapper, handler)
+ else:
+ wrapper, handler = self.custom_notifications[kind][eventtype]
+ try:
+ component.get('EventManager').register_event_handler(eventtype, wrapper)
+ except KeyError:
+ from deluge.ui.client import client
+
+ client.register_event_handler(eventtype, wrapper)
+
+ def _deregister_custom_provider(self, kind, eventtype):
+ try:
+ wrapper, handler = self.custom_notifications[kind][eventtype]
+ try:
+ component.get('EventManager').deregister_event_handler(
+ eventtype, wrapper
+ )
+ except KeyError:
+ from deluge.ui.client import client
+
+ client.deregister_event_handler(eventtype, wrapper)
+ self.custom_notifications[kind].pop(eventtype)
+ except KeyError:
+ pass
+
+ def _handled_eventtype(self, eventtype, handler):
+ if eventtype not in known_events:
+ log.error('The event "%s" is not known', eventtype)
+ return False
+ if known_events[eventtype].__module__.startswith('deluge.event'):
+ if handler.__self__ is self:
+ return True
+ log.error(
+ 'You cannot register custom notification providers '
+ 'for built-in event types.'
+ )
+ return False
+ return True
+
+ def _on_notify_sucess(self, result, kind):
+ log.debug('Notification success using %s: %s', kind, result)
+ return result
+
+ def _on_notify_failure(self, failure, kind):
+ log.debug('Notification failure using %s: %s', kind, failure)
+ return failure
diff --git a/deluge/plugins/Notifications/deluge_notifications/core.py b/deluge/plugins/Notifications/deluge_notifications/core.py
new file mode 100644
index 0000000..123f9cf
--- /dev/null
+++ b/deluge/plugins/Notifications/deluge_notifications/core.py
@@ -0,0 +1,232 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2010 Pedro Algarvio <pedro@algarvio.me>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import smtplib
+from email.utils import formatdate
+
+from twisted.internet import defer, threads
+
+import deluge.configmanager
+from deluge import component
+from deluge.core.rpcserver import export
+from deluge.event import known_events
+from deluge.plugins.pluginbase import CorePluginBase
+
+from .common import CustomNotifications
+
+log = logging.getLogger(__name__)
+
+DEFAULT_PREFS = {
+ 'smtp_enabled': False,
+ 'smtp_host': '',
+ 'smtp_port': 25,
+ 'smtp_user': '',
+ 'smtp_pass': '',
+ 'smtp_from': '',
+ 'smtp_tls': False, # SSL or TLS
+ 'smtp_recipients': [],
+ # Subscriptions
+ 'subscriptions': {'email': []},
+}
+
+
+class CoreNotifications(CustomNotifications):
+ def __init__(self, plugin_name=None):
+ CustomNotifications.__init__(self, plugin_name)
+
+ def enable(self):
+ CustomNotifications.enable(self)
+ self.register_custom_email_notification(
+ 'TorrentFinishedEvent', self._on_torrent_finished_event
+ )
+
+ def disable(self):
+ self.deregister_custom_email_notification('TorrentFinishedEvent')
+ CustomNotifications.disable(self)
+
+ def register_custom_email_notification(self, eventtype, handler):
+ """This is used to register email notifications for custom event types.
+
+ :param event: str, the event name
+ :param handler: function, to be called when `:param:event` is emitted
+
+ Your handler should return a tuple of (email_subject, email_contents).
+ """
+ self._register_custom_provider('email', eventtype, handler)
+
+ def deregister_custom_email_notification(self, eventtype):
+ self._deregister_custom_provider('email', eventtype)
+
+ def handle_custom_email_notification(self, result, eventtype):
+ if not self.config['smtp_enabled']:
+ return defer.succeed('SMTP notification not enabled.')
+ subject, message = result
+ log.debug(
+ 'Spawning new thread to send email with subject: %s: %s', subject, message
+ )
+ # Spawn thread because we don't want Deluge to lock up while we send the
+ # email.
+ return threads.deferToThread(self._notify_email, subject, message)
+
+ def get_handled_events(self):
+ handled_events = []
+ for evt in sorted(known_events):
+ if known_events[evt].__module__.startswith('deluge.event'):
+ if evt not in ('TorrentFinishedEvent',):
+ # Skip all un-handled built-in events
+ continue
+ classdoc = known_events[evt].__doc__.strip()
+ handled_events.append((evt, classdoc))
+ log.debug('Handled Notification Events: %s', handled_events)
+ return handled_events
+
+ def _notify_email(self, subject='', message=''):
+ log.debug('Email prepared')
+ to_addrs = self.config['smtp_recipients']
+ to_addrs_str = ', '.join(self.config['smtp_recipients'])
+ headers_dict = {
+ 'smtp_from': self.config['smtp_from'],
+ 'subject': subject,
+ 'smtp_recipients': to_addrs_str,
+ 'date': formatdate(),
+ }
+ headers = (
+ """\
+From: %(smtp_from)s
+To: %(smtp_recipients)s
+Subject: %(subject)s
+Date: %(date)s
+
+
+"""
+ % headers_dict
+ )
+
+ message = '\r\n'.join((headers + message).splitlines())
+
+ try:
+ # Python 2.6
+ server = smtplib.SMTP(
+ self.config['smtp_host'], self.config['smtp_port'], timeout=60
+ )
+ except Exception as ex:
+ err_msg = _('There was an error sending the notification email: %s') % ex
+ log.error(err_msg)
+ return ex
+
+ security_enabled = self.config['smtp_tls']
+
+ if security_enabled:
+ server.ehlo()
+ if 'starttls' not in server.esmtp_features:
+ log.warning('TLS/SSL enabled but server does not support it')
+ else:
+ server.starttls()
+ server.ehlo()
+
+ if self.config['smtp_user'] and self.config['smtp_pass']:
+ try:
+ server.login(self.config['smtp_user'], self.config['smtp_pass'])
+ except smtplib.SMTPHeloError as ex:
+ err_msg = _('Server did not reply properly to HELO greeting: %s') % ex
+ log.error(err_msg)
+ return ex
+ except smtplib.SMTPAuthenticationError as ex:
+ err_msg = _('Server refused username/password combination: %s') % ex
+ log.error(err_msg)
+ return ex
+
+ try:
+ try:
+ server.sendmail(self.config['smtp_from'], to_addrs, message)
+ except smtplib.SMTPException as ex:
+ err_msg = (
+ _('There was an error sending the notification email: %s') % ex
+ )
+ log.error(err_msg)
+ return ex
+ finally:
+ if security_enabled:
+ # avoid false failure detection when the server closes
+ # the SMTP connection with TLS enabled
+ import socket
+
+ try:
+ server.quit()
+ except socket.sslerror:
+ pass
+ else:
+ server.quit()
+ return _('Notification email sent.')
+
+ def _on_torrent_finished_event(self, torrent_id):
+ log.debug('Handler for TorrentFinishedEvent called for CORE')
+ torrent = component.get('TorrentManager')[torrent_id]
+ torrent_status = torrent.get_status({})
+ # Email
+ subject = _('Finished Torrent "%(name)s"') % torrent_status
+ message = (
+ _(
+ 'This email is to inform you that Deluge has finished '
+ 'downloading "%(name)s", which includes %(num_files)i files.'
+ '\nTo stop receiving these alerts, simply turn off email '
+ "notification in Deluge's preferences.\n\n"
+ 'Thank you,\nDeluge.'
+ )
+ % torrent_status
+ )
+ return subject, message
+
+ # d = defer.maybeDeferred(self.handle_custom_email_notification,
+ # [subject, message],
+ # 'TorrentFinishedEvent')
+ # d.addCallback(self._on_notify_sucess, 'email')
+ # d.addErrback(self._on_notify_failure, 'email')
+ # return d
+
+
+class Core(CorePluginBase, CoreNotifications):
+ def __init__(self, plugin_name):
+ CorePluginBase.__init__(self, plugin_name)
+ CoreNotifications.__init__(self)
+
+ def enable(self):
+ CoreNotifications.enable(self)
+ self.config = deluge.configmanager.ConfigManager(
+ 'notifications-core.conf', DEFAULT_PREFS
+ )
+ log.debug('ENABLING CORE NOTIFICATIONS')
+
+ def disable(self):
+ log.debug('DISABLING CORE NOTIFICATIONS')
+ CoreNotifications.disable(self)
+
+ @export
+ def set_config(self, config):
+ """Sets the config dictionary."""
+ for key in config:
+ self.config[key] = config[key]
+ self.config.save()
+
+ @export
+ def get_config(self):
+ """Returns the config dictionary."""
+ return self.config.config
+
+ @export
+ def get_handled_events(self):
+ return CoreNotifications.get_handled_events(self)
diff --git a/deluge/plugins/Notifications/deluge_notifications/data/config.ui b/deluge/plugins/Notifications/deluge_notifications/data/config.ui
new file mode 100644
index 0000000..c16b37a
--- /dev/null
+++ b/deluge/plugins/Notifications/deluge_notifications/data/config.ui
@@ -0,0 +1,651 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">1</property>
+ <property name="upper">65535</property>
+ <property name="value">25</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkWindow" id="window">
+ <property name="can_focus">False</property>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="prefs_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkViewport" id="viewport1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <child>
+ <object class="GtkNotebook" id="notebook1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_border">False</property>
+ <child>
+ <object class="GtkBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="margin_left">9</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">10</property>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="blink_enabled">
+ <property name="label" translatable="yes">Tray icon blinks enabled</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="popup_enabled">
+ <property name="label" translatable="yes">Popups enabled</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckButton" id="sound_enabled">
+ <property name="label" translatable="yes">Sound enabled</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_sound_enabled_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFileChooserButton" id="sound_path">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="create_folders">False</property>
+ <signal name="update-preview" handler="on_sound_path_update_preview" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">2</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="margin_top">5</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;UI Notifications&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="margin_left">10</property>
+ <property name="margin_top">7</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">10</property>
+ <child>
+ <object class="GtkTable" id="prefs_table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">7</property>
+ <property name="n_columns">4</property>
+ <property name="column_spacing">2</property>
+ <property name="row_spacing">2</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Hostname:</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="smtp_host">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Port:</property>
+ <property name="justify">right</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="smtp_port">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">5</property>
+ <property name="width_chars">5</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="climb_rate">1</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Username:</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="smtp_user">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Password:</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="smtp_pass">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="bottom_padding">10</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="smtp_recipients">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <property name="enable_grid_lines">horizontal</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVButtonBox" id="vbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <property name="layout_style">start</property>
+ <child>
+ <object class="GtkButton" id="add_button">
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_add_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="delete_button">
+ <property name="label">gtk-delete</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_delete_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">3</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_bottom">3</property>
+ <property name="ypad">0</property>
+ <property name="label" translatable="yes">&lt;b&gt;Recipients&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">4</property>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="smtp_tls">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Server requires TLS/SSL</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">From:</property>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="smtp_from">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="smtp_enabled">
+ <property name="label" translatable="yes">Enabled</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_enabled_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="right_attach">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;Email Notifications&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="settings_page_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Settings</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">15</property>
+ <property name="margin_right">10</property>
+ <property name="margin_bottom">10</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkTreeView" id="subscriptions_treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="enable_grid_lines">horizontal</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">This configuration does not mean that you'll actually receive notifications for all these events.</property>
+ <property name="justify">fill</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">2</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="subscriptions_page_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Subscriptions</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="sounds_page">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">15</property>
+ <property name="margin_right">10</property>
+ <property name="margin_bottom">10</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkTreeView" id="sounds_treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">10</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="sounds_revert_button">
+ <property name="label">gtk-revert-to-saved</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_sounds_revert_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="sounds_edit_button">
+ <property name="label">gtk-edit</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_sounds_edit_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="sounds_page_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Sound Customization</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/Notifications/deluge_notifications/data/config.ui~ b/deluge/plugins/Notifications/deluge_notifications/data/config.ui~
new file mode 100644
index 0000000..f26275b
--- /dev/null
+++ b/deluge/plugins/Notifications/deluge_notifications/data/config.ui~
@@ -0,0 +1,643 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.0 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">1</property>
+ <property name="upper">65535</property>
+ <property name="value">25</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkWindow" id="window">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkVBox" id="prefs_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkViewport" id="viewport1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <child>
+ <object class="GtkNotebook" id="notebook1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_border">False</property>
+ <child>
+ <object class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="margin_left">9</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">10</property>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckButton" id="blink_enabled">
+ <property name="label" translatable="yes">Tray icon blinks enabled</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="popup_enabled">
+ <property name="label" translatable="yes">Popups enabled</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckButton" id="sound_enabled">
+ <property name="label" translatable="yes">Sound enabled</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_sound_enabled_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFileChooserButton" id="sound_path">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="create_folders">False</property>
+ <signal name="update-preview" handler="on_sound_path_update_preview" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">2</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="margin_top">5</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;UI Notifications&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="margin_left">10</property>
+ <property name="margin_top">7</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">10</property>
+ <child>
+ <object class="GtkTable" id="prefs_table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">7</property>
+ <property name="n_columns">4</property>
+ <property name="column_spacing">2</property>
+ <property name="row_spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Hostname:</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="smtp_host">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Port:</property>
+ <property name="justify">right</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="smtp_port">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">5</property>
+ <property name="width_chars">5</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="climb_rate">1</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Username:</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="smtp_user">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Password:</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="smtp_pass">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="bottom_padding">10</property>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="smtp_recipients">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <property name="enable_grid_lines">horizontal</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVButtonBox" id="vbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <property name="layout_style">start</property>
+ <child>
+ <object class="GtkButton" id="add_button">
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_add_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="delete_button">
+ <property name="label">gtk-delete</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_delete_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">3</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Recipients&lt;/b&gt;</property>
+ <property name="margin_bottom">3</property>
+ <property name="use_markup">True</property>
+ <property name="ypad">0</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">4</property>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="smtp_tls">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Server requires TLS/SSL</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">From:</property>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="smtp_from">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="smtp_enabled">
+ <property name="label" translatable="yes">Enabled</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_enabled_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="right_attach">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;Email Notifications&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="settings_page_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Settings</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">15</property>
+ <property name="margin_right">10</property>
+ <property name="margin_bottom">10</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkTreeView" id="subscriptions_treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="enable_grid_lines">horizontal</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">This configuration does not mean that you'll actually receive notifications for all these events.</property>
+ <property name="justify">fill</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">2</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="subscriptions_page_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Subscriptions</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="sounds_page">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">15</property>
+ <property name="margin_right">10</property>
+ <property name="margin_bottom">10</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkTreeView" id="sounds_treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">10</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="sounds_revert_button">
+ <property name="label">gtk-revert-to-saved</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_sounds_revert_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="sounds_edit_button">
+ <property name="label">gtk-edit</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_sounds_edit_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="sounds_page_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Sound Customization</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/Notifications/deluge_notifications/data/notifications.js b/deluge/plugins/Notifications/deluge_notifications/data/notifications.js
new file mode 100644
index 0000000..c9fb71f
--- /dev/null
+++ b/deluge/plugins/Notifications/deluge_notifications/data/notifications.js
@@ -0,0 +1,522 @@
+/**
+ * notifications.js
+ *
+ * Copyright (c) Omar Alvarez 2014 <omar.alvarez@udc.es>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ *
+ */
+
+Ext.ns('Deluge.ux.preferences');
+
+/**
+ * @class Deluge.ux.preferences.NotificationsPage
+ * @extends Ext.Panel
+ */
+Deluge.ux.preferences.NotificationsPage = Ext.extend(Ext.Panel, {
+ title: _('Notifications'),
+ header: false,
+ layout: 'fit',
+ border: false,
+
+ initComponent: function() {
+ Deluge.ux.preferences.NotificationsPage.superclass.initComponent.call(
+ this
+ );
+
+ this.emailNotiFset = new Ext.form.FieldSet({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Email Notifications'),
+ autoHeight: true,
+ defaultType: 'textfield',
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ width: '85%',
+ labelWidth: 1,
+ });
+
+ this.chkEnableEmail = this.emailNotiFset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ name: 'enable_email',
+ xtype: 'checkbox',
+ boxLabel: _('Enabled'),
+ listeners: {
+ check: function(object, checked) {
+ this.setSmtpDisabled(!checked);
+ },
+ scope: this,
+ },
+ });
+
+ this.hBoxHost = this.emailNotiFset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ name: 'host',
+ xtype: 'container',
+ layout: 'hbox',
+ disabled: true,
+ items: [
+ {
+ xtype: 'label',
+ text: _('Hostname:'),
+ margins: '6 0 0 6',
+ },
+ {
+ xtype: 'textfield',
+ margins: '2 0 0 4',
+ },
+ ],
+ });
+
+ this.hBoxPort = this.emailNotiFset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ name: 'port',
+ xtype: 'container',
+ layout: 'hbox',
+ disabled: true,
+ items: [
+ {
+ xtype: 'label',
+ text: _('Port:'),
+ margins: '6 0 0 6',
+ },
+ {
+ xtype: 'spinnerfield',
+ margins: '2 0 0 34',
+ width: 64,
+ decimalPrecision: 0,
+ minValue: 0,
+ maxValue: 65535,
+ },
+ ],
+ });
+
+ this.hBoxUser = this.emailNotiFset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ name: 'username',
+ xtype: 'container',
+ layout: 'hbox',
+ disabled: true,
+ items: [
+ {
+ xtype: 'label',
+ text: _('Username:'),
+ margins: '6 0 0 6',
+ },
+ {
+ xtype: 'textfield',
+ margins: '2 0 0 3',
+ },
+ ],
+ });
+
+ this.hBoxPassword = this.emailNotiFset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ name: 'password',
+ xtype: 'container',
+ layout: 'hbox',
+ disabled: true,
+ items: [
+ {
+ xtype: 'label',
+ text: _('Password:'),
+ margins: '6 0 0 6',
+ },
+ {
+ xtype: 'textfield',
+ inputType: 'password',
+ margins: '2 0 0 5',
+ },
+ ],
+ });
+
+ this.hBoxFrom = this.emailNotiFset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ name: 'from',
+ xtype: 'container',
+ layout: 'hbox',
+ disabled: true,
+ items: [
+ {
+ xtype: 'label',
+ text: _('From:'),
+ margins: '6 0 0 6',
+ },
+ {
+ xtype: 'textfield',
+ margins: '2 0 0 28',
+ },
+ ],
+ });
+
+ this.chkTLS = this.emailNotiFset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ name: 'enable_tls_ssl',
+ xtype: 'checkbox',
+ disabled: true,
+ boxLabel: _('Server requires TLS/SSL'),
+ });
+
+ this.recipientsFset = new Ext.form.FieldSet({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Recipients'),
+ autoHeight: true,
+ defaultType: 'editorgrid',
+ style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
+ autoWidth: true,
+ items: [
+ {
+ fieldLabel: '',
+ name: 'recipients',
+ margins: '2 0 5 5',
+ height: 130,
+ hideHeaders: true,
+ width: 260,
+ disabled: true,
+ autoExpandColumn: 'recipient',
+ bbar: {
+ items: [
+ {
+ text: _('Add'),
+ iconCls: 'icon-add',
+ handler: this.onAddClick,
+ scope: this,
+ },
+ {
+ text: _('Remove'),
+ iconCls: 'icon-remove',
+ handler: this.onRemoveClick,
+ scope: this,
+ },
+ ],
+ },
+ viewConfig: {
+ emptyText: _('Add an recipient...'),
+ deferEmptyText: false,
+ },
+ colModel: new Ext.grid.ColumnModel({
+ columns: [
+ {
+ id: 'recipient',
+ header: _('Recipient'),
+ dataIndex: 'recipient',
+ sortable: true,
+ hideable: false,
+ editable: true,
+ editor: {
+ xtype: 'textfield',
+ },
+ },
+ ],
+ }),
+ selModel: new Ext.grid.RowSelectionModel({
+ singleSelect: false,
+ moveEditorOnEnter: false,
+ }),
+ store: new Ext.data.ArrayStore({
+ autoDestroy: true,
+ fields: [{ name: 'recipient' }],
+ }),
+ listeners: {
+ afteredit: function(e) {
+ e.record.commit();
+ },
+ },
+ setEmptyText: function(text) {
+ if (this.viewReady) {
+ this.getView().emptyText = text;
+ this.getView().refresh();
+ } else {
+ Ext.apply(this.viewConfig, { emptyText: text });
+ }
+ },
+ loadData: function(data) {
+ this.getStore().loadData(data);
+ if (this.viewReady) {
+ this.getView().updateHeaders();
+ }
+ },
+ },
+ ],
+ });
+
+ this.edGridSubs = new Ext.grid.EditorGridPanel({
+ xtype: 'editorgrid',
+ autoHeight: true,
+ autoExpandColumn: 'event',
+ viewConfig: {
+ emptyText: _('Loading events...'),
+ deferEmptyText: false,
+ },
+ colModel: new Ext.grid.ColumnModel({
+ defaults: {
+ renderer: function(
+ value,
+ meta,
+ record,
+ rowIndex,
+ colIndex,
+ store
+ ) {
+ if (Ext.isNumber(value) && parseInt(value) !== value) {
+ return value.toFixed(6);
+ } else if (Ext.isBoolean(value)) {
+ return (
+ '<div class="x-grid3-check-col' +
+ (value ? '-on' : '') +
+ '" style="width: 20px;">&#160;</div>'
+ );
+ }
+ return value;
+ },
+ },
+ columns: [
+ {
+ id: 'event',
+ header: 'Event',
+ dataIndex: 'event',
+ sortable: true,
+ hideable: false,
+ },
+ {
+ id: 'email',
+ header: _('Email'),
+ dataIndex: 'email',
+ sortable: true,
+ hideable: false,
+ menuDisabled: true,
+ width: 40,
+ },
+ ],
+ }),
+ store: new Ext.data.ArrayStore({
+ autoDestroy: true,
+ fields: [
+ {
+ name: 'event',
+ },
+ {
+ name: 'email',
+ },
+ ],
+ }),
+ listeners: {
+ cellclick: function(grid, rowIndex, colIndex, e) {
+ var record = grid.getStore().getAt(rowIndex);
+ var field = grid.getColumnModel().getDataIndex(colIndex);
+ var value = record.get(field);
+
+ if (colIndex == 1) {
+ if (Ext.isBoolean(value)) {
+ record.set(field, !value);
+ record.commit();
+ }
+ }
+ },
+ beforeedit: function(e) {
+ if (Ext.isBoolean(e.value)) {
+ return false;
+ }
+
+ return e.record.get('enabled');
+ },
+ afteredit: function(e) {
+ e.record.commit();
+ },
+ },
+ setEmptyText: function(text) {
+ if (this.viewReady) {
+ this.getView().emptyText = text;
+ this.getView().refresh();
+ } else {
+ Ext.apply(this.viewConfig, { emptyText: text });
+ }
+ },
+ setSub: function(eventName) {
+ var store = this.getStore();
+ var index = store.find('event', eventName);
+ store.getAt(index).set('email', true);
+ store.getAt(index).commit();
+ },
+ loadData: function(data) {
+ this.getStore().loadData(data);
+ if (this.viewReady) {
+ this.getView().updateHeaders();
+ }
+ },
+ });
+
+ this.tabPanSettings = this.add({
+ xtype: 'tabpanel',
+ activeTab: 0,
+ items: [
+ {
+ title: _('Settings'),
+ items: [this.emailNotiFset, this.recipientsFset],
+ autoScroll: true,
+ },
+ {
+ title: _('Subscriptions'),
+ items: this.edGridSubs,
+ },
+ ],
+ });
+
+ this.on('show', this.updateConfig, this);
+ },
+
+ updateConfig: function() {
+ deluge.client.notifications.get_handled_events({
+ success: function(events) {
+ var data = [];
+ var keys = Ext.keys(events);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ data.push([events[key][0], false]);
+ }
+ this.edGridSubs.loadData(data);
+ },
+ scope: this,
+ });
+ deluge.client.notifications.get_config({
+ success: function(config) {
+ this.chkEnableEmail.setValue(config['smtp_enabled']);
+ this.setSmtpDisabled(!config['smtp_enabled']);
+
+ this.hBoxHost.getComponent(1).setValue(config['smtp_host']);
+ this.hBoxPort.getComponent(1).setValue(config['smtp_port']);
+ this.hBoxUser.getComponent(1).setValue(config['smtp_user']);
+ this.hBoxPassword.getComponent(1).setValue(config['smtp_pass']);
+ this.hBoxFrom.getComponent(1).setValue(config['smtp_from']);
+ this.chkTLS.setValue(config['smtp_tls']);
+
+ var data = [];
+ var keys = Ext.keys(config['smtp_recipients']);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ data.push([config['smtp_recipients'][key]]);
+ }
+ this.recipientsFset.getComponent(0).loadData(data);
+
+ data = [];
+ keys = Ext.keys(config['subscriptions']['email']);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ this.edGridSubs.setSub(
+ config['subscriptions']['email'][key]
+ );
+ }
+ },
+ scope: this,
+ });
+ },
+
+ onApply: function() {
+ var config = {};
+
+ config['smtp_enabled'] = this.chkEnableEmail.getValue();
+ config['smtp_host'] = this.hBoxHost.getComponent(1).getValue();
+ config['smtp_port'] = Number(this.hBoxPort.getComponent(1).getValue());
+ config['smtp_user'] = this.hBoxUser.getComponent(1).getValue();
+ config['smtp_pass'] = this.hBoxPassword.getComponent(1).getValue();
+ config['smtp_from'] = this.hBoxFrom.getComponent(1).getValue();
+ config['smtp_tls'] = this.chkTLS.getValue();
+
+ var recipientsList = [];
+ var store = this.recipientsFset.getComponent(0).getStore();
+
+ for (var i = 0; i < store.getCount(); i++) {
+ var record = store.getAt(i);
+ var recipient = record.get('recipient');
+ recipientsList.push(recipient);
+ }
+
+ config['smtp_recipients'] = recipientsList;
+
+ var subscriptions = {};
+ var eventList = [];
+ store = this.edGridSubs.getStore();
+
+ for (var i = 0; i < store.getCount(); i++) {
+ var record = store.getAt(i);
+ var ev = record.get('event');
+ var email = record.get('email');
+ if (email) {
+ eventList.push(ev);
+ }
+ }
+
+ subscriptions['email'] = eventList;
+ config['subscriptions'] = subscriptions;
+
+ deluge.client.notifications.set_config(config);
+ },
+
+ onOk: function() {
+ this.onApply();
+ },
+
+ onAddClick: function() {
+ var store = this.recipientsFset.getComponent(0).getStore();
+ var Recipient = store.recordType;
+ var i = new Recipient({
+ recipient: '',
+ });
+ this.recipientsFset.getComponent(0).stopEditing();
+ store.insert(0, i);
+ this.recipientsFset.getComponent(0).startEditing(0, 0);
+ },
+
+ onRemoveClick: function() {
+ var selections = this.recipientsFset
+ .getComponent(0)
+ .getSelectionModel()
+ .getSelections();
+ var store = this.recipientsFset.getComponent(0).getStore();
+
+ this.recipientsFset.getComponent(0).stopEditing();
+ for (var i = 0; i < selections.length; i++) store.remove(selections[i]);
+ store.commitChanges();
+ },
+
+ setSmtpDisabled: function(disable) {
+ this.hBoxHost.setDisabled(disable);
+ this.hBoxPort.setDisabled(disable);
+ this.hBoxUser.setDisabled(disable);
+ this.hBoxPassword.setDisabled(disable);
+ this.hBoxFrom.setDisabled(disable);
+ this.chkTLS.setDisabled(disable);
+ this.recipientsFset.getComponent(0).setDisabled(disable);
+ },
+
+ onDestroy: function() {
+ deluge.preferences.un('show', this.updateConfig, this);
+
+ Deluge.ux.preferences.NotificationsPage.superclass.onDestroy.call(this);
+ },
+});
+
+Deluge.plugins.NotificationsPlugin = Ext.extend(Deluge.Plugin, {
+ name: 'Notifications',
+
+ onDisable: function() {
+ deluge.preferences.removePage(this.prefsPage);
+ },
+
+ onEnable: function() {
+ this.prefsPage = deluge.preferences.addPage(
+ new Deluge.ux.preferences.NotificationsPage()
+ );
+ },
+});
+
+Deluge.registerPlugin('Notifications', Deluge.plugins.NotificationsPlugin);
diff --git a/deluge/plugins/Notifications/deluge_notifications/gtkui.py b/deluge/plugins/Notifications/deluge_notifications/gtkui.py
new file mode 100644
index 0000000..816cb36
--- /dev/null
+++ b/deluge/plugins/Notifications/deluge_notifications/gtkui.py
@@ -0,0 +1,742 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2010 Pedro Algarvio <pedro@algarvio.me>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+from os.path import basename
+
+from gi import require_version
+from gi.repository import Gtk
+from twisted.internet import defer
+
+import deluge.common
+import deluge.component as component
+import deluge.configmanager
+from deluge.plugins.pluginbase import Gtk3PluginBase
+from deluge.ui.client import client
+
+from .common import CustomNotifications, get_resource
+
+# Relative imports
+
+log = logging.getLogger(__name__)
+
+try:
+ import pygame
+
+ SOUND_AVAILABLE = True
+except ImportError:
+ SOUND_AVAILABLE = False
+
+try:
+ require_version('Notify', '0.7')
+ from gi.repository import Notify
+except (ValueError, ImportError):
+ POPUP_AVAILABLE = False
+else:
+ POPUP_AVAILABLE = not deluge.common.windows_check()
+
+
+DEFAULT_PREFS = {
+ # BLINK
+ 'blink_enabled': False,
+ # FLASH
+ 'flash_enabled': False,
+ # POPUP
+ 'popup_enabled': False,
+ # SOUND
+ 'sound_enabled': False,
+ 'sound_path': '',
+ 'custom_sounds': {},
+ # Subscriptions
+ 'subscriptions': {'popup': [], 'blink': [], 'sound': []},
+}
+
+RECIPIENT_FIELD, RECIPIENT_EDIT = list(range(2))
+(
+ SUB_EVENT,
+ SUB_EVENT_DOC,
+ SUB_NOT_EMAIL,
+ SUB_NOT_POPUP,
+ SUB_NOT_BLINK,
+ SUB_NOT_SOUND,
+) = list(range(6))
+SND_EVENT, SND_EVENT_DOC, SND_NAME, SND_PATH = list(range(4))
+
+
+class GtkUiNotifications(CustomNotifications):
+ def __init__(self, plugin_name=None):
+ CustomNotifications.__init__(self, plugin_name)
+
+ def enable(self):
+ CustomNotifications.enable(self)
+ self.register_custom_blink_notification(
+ 'TorrentFinishedEvent', self._on_torrent_finished_event_blink
+ )
+ self.register_custom_sound_notification(
+ 'TorrentFinishedEvent', self._on_torrent_finished_event_sound
+ )
+ self.register_custom_popup_notification(
+ 'TorrentFinishedEvent', self._on_torrent_finished_event_popup
+ )
+
+ def disable(self):
+ self.deregister_custom_blink_notification('TorrentFinishedEvent')
+ self.deregister_custom_sound_notification('TorrentFinishedEvent')
+ self.deregister_custom_popup_notification('TorrentFinishedEvent')
+ CustomNotifications.disable(self)
+
+ def register_custom_popup_notification(self, eventtype, handler):
+ """This is used to register popup notifications for custom event types.
+
+ :param event: the event name
+ :param type: string
+ :param handler: function, to be called when `:param:event` is emitted
+
+ Your handler should return a tuple of (popup_title, popup_contents).
+ """
+ self._register_custom_provider('popup', eventtype, handler)
+
+ def deregister_custom_popup_notification(self, eventtype):
+ self._deregister_custom_provider('popup', eventtype)
+
+ def register_custom_blink_notification(self, eventtype, handler):
+ """This is used to register blink notifications for custom event types.
+
+ :param event: str, the event name
+ :param handler: function, to be called when `:param:event` is emitted
+
+ Your handler should return `True` or `False` to blink or not the
+ trayicon.
+ """
+ self._register_custom_provider('blink', eventtype, handler)
+
+ def deregister_custom_blink_notification(self, eventtype):
+ self._deregister_custom_provider('blink', eventtype)
+
+ def register_custom_sound_notification(self, eventtype, handler):
+ """This is used to register sound notifications for custom event types.
+
+ :param event: the event name
+ :type event: string
+ :param handler: function to be called when `:param:event` is emitted
+
+ Your handler should return either '' to use the sound defined on the
+ notification preferences, the path to a sound file, which will then be
+ played or None, where no sound will be played at all.
+ """
+ self._register_custom_provider('sound', eventtype, handler)
+
+ def deregister_custom_sound_notification(self, eventtype):
+ self._deregister_custom_provider('sound', eventtype)
+
+ def handle_custom_popup_notification(self, result, eventtype):
+ title, message = result
+ return defer.maybeDeferred(self.__popup, title, message)
+
+ def handle_custom_blink_notification(self, result, eventtype):
+ if result:
+ return defer.maybeDeferred(self.__blink)
+ return defer.succeed(
+ 'Will not blink. The returned value from the custom '
+ 'handler was: %s' % result
+ )
+
+ def handle_custom_sound_notification(self, result, eventtype):
+ if isinstance(result, ''.__class__):
+ if not result and eventtype in self.config['custom_sounds']:
+ return defer.maybeDeferred(
+ self.__play_sound, self.config['custom_sounds'][eventtype]
+ )
+ return defer.maybeDeferred(self.__play_sound, result)
+ return defer.succeed(
+ 'Will not play sound. The returned value from the '
+ 'custom handler was: %s' % result
+ )
+
+ def __blink(self):
+ self.systray.blink(True)
+ return defer.succeed(_('Notification Blink shown'))
+
+ def __popup(self, title='', message=''):
+ if not self.config['popup_enabled']:
+ return defer.succeed(_('Popup notification is not enabled.'))
+ if not POPUP_AVAILABLE:
+ return defer.fail(_('libnotify is not installed'))
+
+ if Notify.init('Deluge'):
+ self.note = Notify.Notification.new(title, message, 'deluge-panel')
+ self.note.set_hint('desktop-entry', 'deluge')
+ if not self.note.show():
+ err_msg = _('Failed to popup notification')
+ log.warning(err_msg)
+ return defer.fail(err_msg)
+ return defer.succeed(_('Notification popup shown'))
+
+ def __play_sound(self, sound_path=''):
+ if not self.config['sound_enabled']:
+ return defer.succeed(_('Sound notification not enabled'))
+ if not SOUND_AVAILABLE:
+ err_msg = _('pygame is not installed')
+ log.warning(err_msg)
+ return defer.fail(err_msg)
+
+ pygame.init()
+ try:
+ if not sound_path:
+ sound_path = self.config['sound_path']
+ alert_sound = pygame.mixer.music
+ alert_sound.load(sound_path)
+ alert_sound.play()
+ except pygame.error as ex:
+ err_msg = _('Sound notification failed %s') % ex
+ log.warning(err_msg)
+ return defer.fail(err_msg)
+ else:
+ msg = _('Sound notification Success')
+ log.info(msg)
+ return defer.succeed(msg)
+
+ def _on_torrent_finished_event_blink(self, torrent_id):
+ return True # Yes, Blink
+
+ def _on_torrent_finished_event_sound(self, torrent_id):
+ # Since there's no custom sound hardcoded, just return ''
+ return ''
+
+ def _on_torrent_finished_event_popup(self, torrent_id):
+ d = client.core.get_torrent_status(torrent_id, ['name', 'file_progress'])
+ d.addCallback(self._on_torrent_finished_event_got_torrent_status)
+ d.addErrback(self._on_torrent_finished_event_torrent_status_failure)
+ return d
+
+ def _on_torrent_finished_event_torrent_status_failure(self, failure):
+ log.debug('Failed to get torrent status to be able to show the popup')
+
+ def _on_torrent_finished_event_got_torrent_status(self, torrent_status):
+ log.debug(
+ 'Handler for TorrentFinishedEvent GTKUI called. ' 'Got Torrent Status'
+ )
+ title = _('Finished Torrent')
+ torrent_status['num_files'] = torrent_status['file_progress'].count(1.0)
+ message = (
+ _(
+ 'The torrent "%(name)s" including %(num_files)i file(s) '
+ 'has finished downloading.'
+ )
+ % torrent_status
+ )
+ return title, message
+
+
+class GtkUI(Gtk3PluginBase, GtkUiNotifications):
+ def __init__(self, plugin_name):
+ Gtk3PluginBase.__init__(self, plugin_name)
+ GtkUiNotifications.__init__(self)
+
+ def enable(self):
+ self.config = deluge.configmanager.ConfigManager(
+ 'notifications-gtk.conf', DEFAULT_PREFS
+ )
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(get_resource('config.ui'))
+ self.builder.get_object('smtp_port').set_value(25)
+ self.prefs = self.builder.get_object('prefs_box')
+ self.prefs.show_all()
+
+ self.build_recipients_model_populate_treeview()
+ self.build_sounds_model_populate_treeview()
+ self.build_notifications_model_populate_treeview()
+
+ client.notifications.get_handled_events().addCallback(
+ self.popuplate_what_needs_handled_events
+ )
+
+ self.builder.connect_signals(
+ {
+ 'on_add_button_clicked': (
+ self.on_add_button_clicked,
+ self.recipients_treeview,
+ ),
+ 'on_delete_button_clicked': (
+ self.on_delete_button_clicked,
+ self.recipients_treeview,
+ ),
+ 'on_enabled_toggled': self.on_enabled_toggled,
+ 'on_sound_enabled_toggled': self.on_sound_enabled_toggled,
+ 'on_sounds_edit_button_clicked': self.on_sounds_edit_button_clicked,
+ 'on_sounds_revert_button_clicked': self.on_sounds_revert_button_clicked,
+ 'on_sound_path_update_preview': self.on_sound_path_update_preview,
+ }
+ )
+
+ component.get('Preferences').add_page(_('Notifications'), self.prefs)
+
+ component.get('PluginManager').register_hook(
+ 'on_apply_prefs', self.on_apply_prefs
+ )
+ component.get('PluginManager').register_hook(
+ 'on_show_prefs', self.on_show_prefs
+ )
+
+ if not POPUP_AVAILABLE:
+ self.builder.get_object('popup_enabled').set_property('sensitive', False)
+ if not SOUND_AVAILABLE:
+ # for widget_name in ('sound_enabled', 'sound_path', 'sounds_page', 'sounds_page_label'):
+ # self.builder.get_object(widget_name).set_property('sensitive', False)
+ self.builder.get_object('sound_enabled').set_property('sensitive', False)
+ self.builder.get_object('sound_path').set_property('sensitive', False)
+ self.builder.get_object('sounds_page').set_property('sensitive', False)
+ self.builder.get_object('sounds_page_label').set_property(
+ 'sensitive', False
+ )
+
+ self.systray = component.get('SystemTray')
+ if not hasattr(self.systray, 'tray'):
+ # Tray is not beeing used
+ self.builder.get_object('blink_enabled').set_property('sensitive', False)
+
+ GtkUiNotifications.enable(self)
+
+ def disable(self):
+ GtkUiNotifications.disable(self)
+ component.get('Preferences').remove_page(_('Notifications'))
+ component.get('PluginManager').deregister_hook(
+ 'on_apply_prefs', self.on_apply_prefs
+ )
+ component.get('PluginManager').deregister_hook(
+ 'on_show_prefs', self.on_show_prefs
+ )
+
+ def build_recipients_model_populate_treeview(self):
+ # SMTP Recipients treeview/model
+ self.recipients_treeview = self.builder.get_object('smtp_recipients')
+ treeview_selection = self.recipients_treeview.get_selection()
+ treeview_selection.connect(
+ 'changed', self.on_recipients_treeview_selection_changed
+ )
+ self.recipients_model = Gtk.ListStore(str, bool)
+
+ renderer = Gtk.CellRendererText()
+ renderer.connect('edited', self.on_cell_edited, self.recipients_model)
+ renderer.recipient = RECIPIENT_FIELD
+ column = Gtk.TreeViewColumn(
+ 'Recipients', renderer, text=RECIPIENT_FIELD, editable=RECIPIENT_EDIT
+ )
+ column.set_expand(True)
+ self.recipients_treeview.append_column(column)
+ self.recipients_treeview.set_model(self.recipients_model)
+
+ def build_sounds_model_populate_treeview(self):
+ # Sound customisation treeview/model
+ self.sounds_treeview = self.builder.get_object('sounds_treeview')
+ sounds_selection = self.sounds_treeview.get_selection()
+ sounds_selection.connect('changed', self.on_sounds_treeview_selection_changed)
+
+ self.sounds_treeview.set_tooltip_column(SND_EVENT_DOC)
+ self.sounds_model = Gtk.ListStore(str, str, str, str)
+
+ renderer = Gtk.CellRendererText()
+ renderer.event = SND_EVENT
+ column = Gtk.TreeViewColumn('Event', renderer, text=SND_EVENT)
+ column.set_expand(True)
+ self.sounds_treeview.append_column(column)
+
+ renderer = Gtk.CellRendererText()
+ renderer.event_doc = SND_EVENT_DOC
+ column = Gtk.TreeViewColumn('Doc', renderer, text=SND_EVENT_DOC)
+ column.set_property('visible', False)
+ self.sounds_treeview.append_column(column)
+
+ renderer = Gtk.CellRendererText()
+ renderer.sound_name = SND_NAME
+ column = Gtk.TreeViewColumn('Name', renderer, text=SND_NAME)
+ self.sounds_treeview.append_column(column)
+
+ renderer = Gtk.CellRendererText()
+ renderer.sound_path = SND_PATH
+ column = Gtk.TreeViewColumn('Path', renderer, text=SND_PATH)
+ column.set_property('visible', False)
+ self.sounds_treeview.append_column(column)
+
+ self.sounds_treeview.set_model(self.sounds_model)
+
+ def build_notifications_model_populate_treeview(self):
+ # Notification Subscriptions treeview/model
+ self.subscriptions_treeview = self.builder.get_object('subscriptions_treeview')
+ subscriptions_selection = self.subscriptions_treeview.get_selection()
+ subscriptions_selection.connect(
+ 'changed', self.on_subscriptions_treeview_selection_changed
+ )
+ self.subscriptions_treeview.set_tooltip_column(SUB_EVENT_DOC)
+ self.subscriptions_model = Gtk.ListStore(str, str, bool, bool, bool, bool)
+
+ renderer = Gtk.CellRendererText()
+ setattr(renderer, 'event', SUB_EVENT)
+ column = Gtk.TreeViewColumn('Event', renderer, text=SUB_EVENT)
+ column.set_expand(True)
+ self.subscriptions_treeview.append_column(column)
+
+ renderer = Gtk.CellRendererText()
+ setattr(renderer, 'event_doc', SUB_EVENT)
+ column = Gtk.TreeViewColumn('Doc', renderer, text=SUB_EVENT_DOC)
+ column.set_property('visible', False)
+ self.subscriptions_treeview.append_column(column)
+
+ renderer = Gtk.CellRendererToggle()
+ renderer.set_property('activatable', True)
+ renderer.connect('toggled', self._on_email_col_toggled)
+ column = Gtk.TreeViewColumn('Email', renderer, active=SUB_NOT_EMAIL)
+ column.set_clickable(True)
+ self.subscriptions_treeview.append_column(column)
+
+ renderer = Gtk.CellRendererToggle()
+ renderer.set_property('activatable', True)
+ renderer.connect('toggled', self._on_popup_col_toggled)
+ column = Gtk.TreeViewColumn('Popup', renderer, active=SUB_NOT_POPUP)
+ column.set_clickable(True)
+ self.subscriptions_treeview.append_column(column)
+
+ renderer = Gtk.CellRendererToggle()
+ renderer.set_property('activatable', True)
+ renderer.connect('toggled', self._on_blink_col_toggled)
+ column = Gtk.TreeViewColumn('Blink', renderer, active=SUB_NOT_BLINK)
+ column.set_clickable(True)
+ self.subscriptions_treeview.append_column(column)
+
+ renderer = Gtk.CellRendererToggle()
+ renderer.set_property('activatable', True)
+ renderer.connect('toggled', self._on_sound_col_toggled)
+ column = Gtk.TreeViewColumn('Sound', renderer, active=SUB_NOT_SOUND)
+ column.set_clickable(True)
+ self.subscriptions_treeview.append_column(column)
+ self.subscriptions_treeview.set_model(self.subscriptions_model)
+
+ def popuplate_what_needs_handled_events(
+ self, handled_events, email_subscriptions=None
+ ):
+ if email_subscriptions is None:
+ email_subscriptions = []
+ self.populate_subscriptions(handled_events, email_subscriptions)
+ self.populate_sounds(handled_events)
+
+ def populate_sounds(self, handled_events):
+ self.sounds_model.clear()
+ for event_name, event_doc in handled_events:
+ if event_name in self.config['custom_sounds']:
+ snd_path = self.config['custom_sounds'][event_name]
+ else:
+ snd_path = self.config['sound_path']
+
+ if snd_path:
+ self.sounds_model.set(
+ self.sounds_model.append(),
+ SND_EVENT,
+ event_name,
+ SND_EVENT_DOC,
+ event_doc,
+ SND_NAME,
+ basename(snd_path),
+ SND_PATH,
+ snd_path,
+ )
+
+ def populate_subscriptions(self, handled_events, email_subscriptions=None):
+ if email_subscriptions is None:
+ email_subscriptions = []
+ subscriptions_dict = self.config['subscriptions']
+ self.subscriptions_model.clear()
+ # self.handled_events = handled_events
+ for event_name, event_doc in handled_events:
+ self.subscriptions_model.set(
+ self.subscriptions_model.append(),
+ SUB_EVENT,
+ event_name,
+ SUB_EVENT_DOC,
+ event_doc,
+ SUB_NOT_EMAIL,
+ event_name in email_subscriptions,
+ SUB_NOT_POPUP,
+ event_name in subscriptions_dict['popup'],
+ SUB_NOT_BLINK,
+ event_name in subscriptions_dict['blink'],
+ SUB_NOT_SOUND,
+ event_name in subscriptions_dict['sound'],
+ )
+
+ def on_apply_prefs(self):
+ log.debug('applying prefs for Notifications')
+
+ current_popup_subscriptions = []
+ current_blink_subscriptions = []
+ current_sound_subscriptions = []
+ current_email_subscriptions = []
+ for event, doc, email, popup, blink, sound in self.subscriptions_model:
+ if email:
+ current_email_subscriptions.append(event)
+ if popup:
+ current_popup_subscriptions.append(event)
+ if blink:
+ current_blink_subscriptions.append(event)
+ if sound:
+ current_sound_subscriptions.append(event)
+
+ old_sound_file = self.config['sound_path']
+ new_sound_file = self.builder.get_object('sound_path').get_filename()
+ log.debug(
+ 'Old Default sound file: %s New one: %s', old_sound_file, new_sound_file
+ )
+ custom_sounds = {}
+ for event_name, event_doc, filename, filepath in self.sounds_model:
+ log.debug('Custom sound for event "%s": %s', event_name, filename)
+ if filepath == old_sound_file:
+ continue
+ custom_sounds[event_name] = filepath
+
+ self.config.config.update(
+ {
+ 'popup_enabled': self.builder.get_object('popup_enabled').get_active(),
+ 'blink_enabled': self.builder.get_object('blink_enabled').get_active(),
+ 'sound_enabled': self.builder.get_object('sound_enabled').get_active(),
+ 'sound_path': new_sound_file,
+ 'subscriptions': {
+ 'popup': current_popup_subscriptions,
+ 'blink': current_blink_subscriptions,
+ 'sound': current_sound_subscriptions,
+ },
+ 'custom_sounds': custom_sounds,
+ }
+ )
+ self.config.save()
+
+ core_config = {
+ 'smtp_enabled': self.builder.get_object('smtp_enabled').get_active(),
+ 'smtp_host': self.builder.get_object('smtp_host').get_text(),
+ 'smtp_port': self.builder.get_object('smtp_port').get_value(),
+ 'smtp_user': self.builder.get_object('smtp_user').get_text(),
+ 'smtp_pass': self.builder.get_object('smtp_pass').get_text(),
+ 'smtp_from': self.builder.get_object('smtp_from').get_text(),
+ 'smtp_tls': self.builder.get_object('smtp_tls').get_active(),
+ 'smtp_recipients': [
+ dest[0] for dest in self.recipients_model if dest[0] != 'USER@HOST'
+ ],
+ 'subscriptions': {'email': current_email_subscriptions},
+ }
+
+ client.notifications.set_config(core_config)
+ client.notifications.get_config().addCallback(self.cb_get_config)
+
+ def on_show_prefs(self):
+ client.notifications.get_config().addCallback(self.cb_get_config)
+
+ def cb_get_config(self, core_config):
+ """Callback for on show_prefs."""
+ self.builder.get_object('smtp_host').set_text(core_config['smtp_host'])
+ self.builder.get_object('smtp_port').set_value(core_config['smtp_port'])
+ self.builder.get_object('smtp_user').set_text(core_config['smtp_user'])
+ self.builder.get_object('smtp_pass').set_text(core_config['smtp_pass'])
+ self.builder.get_object('smtp_from').set_text(core_config['smtp_from'])
+ self.builder.get_object('smtp_tls').set_active(core_config['smtp_tls'])
+ self.recipients_model.clear()
+ for recipient in core_config['smtp_recipients']:
+ self.recipients_model.set(
+ self.recipients_model.append(),
+ RECIPIENT_FIELD,
+ recipient,
+ RECIPIENT_EDIT,
+ False,
+ )
+ self.builder.get_object('smtp_enabled').set_active(core_config['smtp_enabled'])
+ self.builder.get_object('sound_enabled').set_active(
+ self.config['sound_enabled']
+ )
+ self.builder.get_object('popup_enabled').set_active(
+ self.config['popup_enabled']
+ )
+ self.builder.get_object('blink_enabled').set_active(
+ self.config['blink_enabled']
+ )
+ if self.config['sound_path']:
+ sound_path = self.config['sound_path']
+ else:
+ sound_path = deluge.common.get_default_download_dir()
+ self.builder.get_object('sound_path').set_filename(sound_path)
+ # Force toggle
+ self.on_enabled_toggled(self.builder.get_object('smtp_enabled'))
+ self.on_sound_enabled_toggled(self.builder.get_object('sound_enabled'))
+
+ client.notifications.get_handled_events().addCallback(
+ self.popuplate_what_needs_handled_events,
+ core_config['subscriptions']['email'],
+ )
+
+ def on_sound_path_update_preview(self, filechooser):
+ client.notifications.get_handled_events().addCallback(self.populate_sounds)
+
+ def on_add_button_clicked(self, widget, treeview):
+ model = treeview.get_model()
+ model.set(model.append(), RECIPIENT_FIELD, 'USER@HOST', RECIPIENT_EDIT, True)
+
+ def on_delete_button_clicked(self, widget, treeview):
+ selection = treeview.get_selection()
+ model, selected_iter = selection.get_selected()
+ if selected_iter:
+ model.remove(selected_iter)
+
+ def on_cell_edited(self, cell, path_string, new_text, model):
+ str_iter = model.get_iter_from_string(path_string)
+ model.set(str_iter, RECIPIENT_FIELD, new_text)
+
+ def on_recipients_treeview_selection_changed(self, selection):
+ model, selected_connection_iter = selection.get_selected()
+ if selected_connection_iter:
+ self.builder.get_object('delete_button').set_property('sensitive', True)
+ else:
+ self.builder.get_object('delete_button').set_property('sensitive', False)
+
+ def on_subscriptions_treeview_selection_changed(self, selection):
+ model, selected_connection_iter = selection.get_selected()
+ if selected_connection_iter:
+ self.builder.get_object('delete_button').set_property('sensitive', True)
+ else:
+ self.builder.get_object('delete_button').set_property('sensitive', False)
+
+ def on_sounds_treeview_selection_changed(self, selection):
+ model, selected_iter = selection.get_selected()
+ if selected_iter:
+ self.builder.get_object('sounds_edit_button').set_property(
+ 'sensitive', True
+ )
+ path = model.get(selected_iter, SND_PATH)[0]
+ log.debug('Sound selection changed: %s', path)
+ if path != self.config['sound_path']:
+ self.builder.get_object('sounds_revert_button').set_property(
+ 'sensitive', True
+ )
+ else:
+ self.builder.get_object('sounds_revert_button').set_property(
+ 'sensitive', False
+ )
+ else:
+ self.builder.get_object('sounds_edit_button').set_property(
+ 'sensitive', False
+ )
+ self.builder.get_object('sounds_revert_button').set_property(
+ 'sensitive', False
+ )
+
+ def on_sounds_revert_button_clicked(self, widget):
+ log.debug('on_sounds_revert_button_clicked')
+ selection = self.sounds_treeview.get_selection()
+ model, selected_iter = selection.get_selected()
+ if selected_iter:
+ log.debug('on_sounds_revert_button_clicked: got iter')
+ model.set(
+ selected_iter,
+ SND_PATH,
+ self.config['sound_path'],
+ SND_NAME,
+ basename(self.config['sound_path']),
+ )
+
+ def on_sounds_edit_button_clicked(self, widget):
+ log.debug('on_sounds_edit_button_clicked')
+ selection = self.sounds_treeview.get_selection()
+ model, selected_iter = selection.get_selected()
+ if selected_iter:
+ path = model.get(selected_iter, SND_PATH)[0]
+ dialog = Gtk.FileChooserDialog(
+ title=_('Choose Sound File'),
+ buttons=(
+ Gtk.STOCK_CANCEL,
+ Gtk.ResponseType.CANCEL,
+ Gtk.STOCK_OPEN,
+ Gtk.ResponseType.OK,
+ ),
+ )
+ dialog.set_filename(path)
+
+ def update_model(response):
+ if response == Gtk.ResponseType.OK:
+ new_filename = dialog.get_filename()
+ dialog.destroy()
+ log.debug(new_filename)
+ model.set(
+ selected_iter,
+ SND_PATH,
+ new_filename,
+ SND_NAME,
+ basename(new_filename),
+ )
+
+ d = defer.maybeDeferred(dialog.run)
+ d.addCallback(update_model)
+
+ log.debug('dialog should have been shown')
+
+ def on_enabled_toggled(self, widget):
+ for widget_name in (
+ 'smtp_host',
+ 'smtp_port',
+ 'smtp_user',
+ 'smtp_pass',
+ 'smtp_pass',
+ 'smtp_tls',
+ 'smtp_from',
+ 'smtp_recipients',
+ ):
+ self.builder.get_object(widget_name).set_property(
+ 'sensitive', widget.get_active()
+ )
+
+ def on_sound_enabled_toggled(self, widget):
+ if widget.get_active():
+ self.builder.get_object('sound_path').set_property('sensitive', True)
+ self.builder.get_object('sounds_page').set_property('sensitive', True)
+ self.builder.get_object('sounds_page_label').set_property('sensitive', True)
+ else:
+ self.builder.get_object('sound_path').set_property('sensitive', False)
+ self.builder.get_object('sounds_page').set_property('sensitive', False)
+ self.builder.get_object('sounds_page_label').set_property(
+ 'sensitive', False
+ )
+
+ # for widget_name in ('sounds_path', 'sounds_page', 'sounds_page_label'):
+ # self.builder.get_object(widget_name).set_property('sensitive',
+ # widget.get_active())
+
+ def _on_email_col_toggled(self, cell, path):
+ self.subscriptions_model[path][SUB_NOT_EMAIL] = not self.subscriptions_model[
+ path
+ ][SUB_NOT_EMAIL]
+ return
+
+ def _on_popup_col_toggled(self, cell, path):
+ self.subscriptions_model[path][SUB_NOT_POPUP] = not self.subscriptions_model[
+ path
+ ][SUB_NOT_POPUP]
+ return
+
+ def _on_blink_col_toggled(self, cell, path):
+ self.subscriptions_model[path][SUB_NOT_BLINK] = not self.subscriptions_model[
+ path
+ ][SUB_NOT_BLINK]
+ return
+
+ def _on_sound_col_toggled(self, cell, path):
+ self.subscriptions_model[path][SUB_NOT_SOUND] = not self.subscriptions_model[
+ path
+ ][SUB_NOT_SOUND]
+ return
diff --git a/deluge/plugins/Notifications/deluge_notifications/test.py b/deluge/plugins/Notifications/deluge_notifications/test.py
new file mode 100644
index 0000000..2e6f975
--- /dev/null
+++ b/deluge/plugins/Notifications/deluge_notifications/test.py
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+# vim: sw=4 ts=4 fenc=utf-8 et
+# ==============================================================================
+# Copyright © 2009-2010 UfSoft.org - Pedro Algarvio <pedro@algarvio.me>
+#
+# License: BSD - Please view the LICENSE file for additional information.
+# ==============================================================================
+
+from __future__ import unicode_literals
+
+import logging
+
+from twisted.internet import task
+
+from deluge import component
+from deluge.event import DelugeEvent
+
+log = logging.getLogger(__name__)
+
+
+class FooEvent(DelugeEvent):
+ """foo Event"""
+
+
+class CustomEvent(DelugeEvent):
+ """Just a custom event to test"""
+
+
+class TestEmailNotifications(component.Component):
+ def __init__(self, imp):
+ component.Component.__init__(self, self.__class__.__name__, 5)
+ self.__imp = imp
+ self.lc = task.LoopingCall(self.update)
+ self.n = 1
+ self.events = [FooEvent(), CustomEvent()]
+ self.events_classes = []
+
+ def enable(self):
+ log.debug('\n\nEnabling %s', self.__class__.__name__)
+ for event in self.events:
+ if self.__imp == 'core':
+ # component.get('CorePlugin.Notifications').register_custom_email_notification(
+ component.get('Notifications').register_custom_email_notification(
+ event.__class__.__name__, self.custom_email_message_provider
+ )
+ elif self.__imp == 'gtk':
+ notifications_component = component.get('Notifications')
+ notifications_component.register_custom_popup_notification(
+ event.__class__.__name__, self.custom_popup_message_provider
+ )
+ notifications_component.register_custom_blink_notification(
+ event.__class__.__name__, self.custom_blink_message_provider
+ )
+ notifications_component.register_custom_sound_notification(
+ event.__class__.__name__, self.custom_sound_message_provider
+ )
+
+ self.lc.start(60, False)
+
+ def disable(self):
+ log.debug('\n\nDisabling %s', self.__class__.__name__)
+ self.lc.stop()
+
+ def update(self):
+ if self.__imp == 'core':
+ log.debug('\n\nUpdating %s', self.__class__.__name__)
+ self.events.append(self.events.pop(0)) # Re-Queue
+ self.n += 1
+ component.get('EventManager').emit(self.events[0])
+
+ def custom_email_message_provider(self, *evt_args, **evt_kwargs):
+ log.debug('Running custom email message provider: %s %s', evt_args, evt_kwargs)
+ subject = '%s Email Subject: %s' % (self.events[0].__class__.__name__, self.n)
+ message = '%s Email Message: %s' % (self.events[0].__class__.__name__, self.n)
+ return subject, message
+
+ def custom_popup_message_provider(self, *evt_args, **evt_kwargs):
+ log.debug('Running custom popup message provider: %s %s', evt_args, evt_kwargs)
+ title = '%s Popup Title: %s' % (self.events[0].__class__.__name__, self.n)
+ message = '%s Popup Message: %s' % (self.events[0].__class__.__name__, self.n)
+ return title, message
+
+ def custom_blink_message_provider(self, *evt_args, **evt_kwargs):
+ log.debug('Running custom blink message provider: %s %s', evt_args, evt_kwargs)
+ return True
+
+ def custom_sound_message_provider(self, *evt_args, **evt_kwargs):
+ log.debug('Running custom sound message provider: %s %s', evt_args, evt_kwargs)
+ return ''
diff --git a/deluge/plugins/Notifications/deluge_notifications/webui.py b/deluge/plugins/Notifications/deluge_notifications/webui.py
new file mode 100644
index 0000000..d3529c4
--- /dev/null
+++ b/deluge/plugins/Notifications/deluge_notifications/webui.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2010 Pedro Algarvio <pedro@algarvio.me>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.plugins.pluginbase import WebPluginBase
+
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+
+class WebUI(WebPluginBase):
+
+ scripts = [get_resource('notifications.js')]
+ debug_scripts = scripts
+
+ def enable(self):
+ log.debug('Enabling Web UI notifications')
+
+ def disable(self):
+ log.debug('Disabling Web UI notifications')
diff --git a/deluge/plugins/Notifications/setup.py b/deluge/plugins/Notifications/setup.py
new file mode 100755
index 0000000..d9a9e42
--- /dev/null
+++ b/deluge/plugins/Notifications/setup.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2010 Pedro Algarvio <pedro@algarvio.me>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from setuptools import find_packages, setup
+
+__plugin_name__ = 'Notifications'
+__author__ = 'Pedro Algarvio'
+__author_email__ = 'pedro@algarvio.me'
+__version__ = '0.3'
+__url__ = 'http://dev.deluge-torrent.org/'
+__license__ = 'GPLv3'
+__description__ = 'Plugin which provides notifications to Deluge.'
+__long_description__ = """
+Plugin which provides notifications to Deluge
+
+Email, Popup, Blink and Sound notifications
+
+The plugin also allows other plugins to make
+ use of itself for their own custom notifications
+"""
+__pkg_data__ = {'deluge_' + __plugin_name__.lower(): ['data/*']}
+
+setup(
+ name=__plugin_name__,
+ version=__version__,
+ description=__description__,
+ author=__author__,
+ author_email=__author_email__,
+ url=__url__,
+ license=__license__,
+ long_description=__long_description__ if __long_description__ else __description__,
+ packages=find_packages(),
+ package_data=__pkg_data__,
+ entry_points="""
+ [deluge.plugin.core]
+ %s = deluge_%s:CorePlugin
+ [deluge.plugin.gtk3ui]
+ %s = deluge_%s:GtkUIPlugin
+ [deluge.plugin.web]
+ %s = deluge_%s:WebUIPlugin
+ """
+ % ((__plugin_name__, __plugin_name__.lower()) * 3),
+)
diff --git a/deluge/plugins/Scheduler/deluge_scheduler/__init__.py b/deluge/plugins/Scheduler/deluge_scheduler/__init__.py
new file mode 100644
index 0000000..6db72b6
--- /dev/null
+++ b/deluge/plugins/Scheduler/deluge_scheduler/__init__.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.plugins.init import PluginInitBase
+
+
+class CorePlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .core import Core as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(CorePlugin, self).__init__(plugin_name)
+
+
+class GtkUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .gtkui import GtkUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(GtkUIPlugin, self).__init__(plugin_name)
+
+
+class WebUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .webui import WebUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(WebUIPlugin, self).__init__(plugin_name)
diff --git a/deluge/plugins/Scheduler/deluge_scheduler/common.py b/deluge/plugins/Scheduler/deluge_scheduler/common.py
new file mode 100644
index 0000000..4c9db09
--- /dev/null
+++ b/deluge/plugins/Scheduler/deluge_scheduler/common.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# 2009 Damien Churchill <damoxc@gmail.com>
+# 2010 Pedro Algarvio <pedro@algarvio.me>
+# 2017 Calum Lind <calumlind+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os.path
+
+from pkg_resources import resource_filename
+
+
+def get_resource(filename):
+ return resource_filename(__package__, os.path.join('data', filename))
diff --git a/deluge/plugins/Scheduler/deluge_scheduler/core.py b/deluge/plugins/Scheduler/deluge_scheduler/core.py
new file mode 100644
index 0000000..388e4f0
--- /dev/null
+++ b/deluge/plugins/Scheduler/deluge_scheduler/core.py
@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import time
+
+from twisted.internet import reactor
+
+import deluge.component as component
+import deluge.configmanager
+from deluge.core.rpcserver import export
+from deluge.event import DelugeEvent
+from deluge.plugins.pluginbase import CorePluginBase
+
+log = logging.getLogger(__name__)
+
+DEFAULT_PREFS = {
+ 'low_down': -1.0,
+ 'low_up': -1.0,
+ 'low_active': -1,
+ 'low_active_down': -1,
+ 'low_active_up': -1,
+ 'button_state': [[0] * 7 for dummy in range(24)],
+}
+
+STATES = {0: 'Green', 1: 'Yellow', 2: 'Red'}
+
+CONTROLLED_SETTINGS = [
+ 'max_download_speed',
+ 'max_upload_speed',
+ 'max_active_limit',
+ 'max_active_downloading',
+ 'max_active_seeding',
+]
+
+
+class SchedulerEvent(DelugeEvent):
+ """
+ Emitted when a schedule state changes.
+ """
+
+ def __init__(self, colour):
+ """
+ :param colour: str, the current scheduler state
+ """
+ self._args = [colour]
+
+
+class Core(CorePluginBase):
+ def enable(self):
+ # Create the defaults with the core config
+ core_config = component.get('Core').config
+ DEFAULT_PREFS['low_down'] = core_config['max_download_speed']
+ DEFAULT_PREFS['low_up'] = core_config['max_upload_speed']
+ DEFAULT_PREFS['low_active'] = core_config['max_active_limit']
+ DEFAULT_PREFS['low_active_down'] = core_config['max_active_downloading']
+ DEFAULT_PREFS['low_active_up'] = core_config['max_active_seeding']
+
+ self.config = deluge.configmanager.ConfigManager(
+ 'scheduler.conf', DEFAULT_PREFS
+ )
+
+ self.state = self.get_state()
+
+ # Apply the scheduling rules
+ self.do_schedule(False)
+
+ # Schedule the next do_schedule() call for on the next hour
+ now = time.localtime(time.time())
+ secs_to_next_hour = ((60 - now[4]) * 60) + (60 - now[5])
+ self.timer = reactor.callLater(secs_to_next_hour, self.do_schedule)
+
+ # Register for config changes so state isn't overridden
+ component.get('EventManager').register_event_handler(
+ 'ConfigValueChangedEvent', self.on_config_value_changed
+ )
+
+ def disable(self):
+ if self.timer.active():
+ self.timer.cancel()
+ component.get('EventManager').deregister_event_handler(
+ 'ConfigValueChangedEvent', self.on_config_value_changed
+ )
+ self.__apply_set_functions()
+
+ def update(self):
+ pass
+
+ def on_config_value_changed(self, key, value):
+ if key in CONTROLLED_SETTINGS:
+ self.do_schedule(False)
+
+ def __apply_set_functions(self):
+ """
+ Have the core apply it's bandwidth settings as specified in core.conf.
+ """
+ core_config = deluge.configmanager.ConfigManager('core.conf')
+ for setting in CONTROLLED_SETTINGS:
+ component.get('PreferencesManager').do_config_set_func(
+ setting, core_config[setting]
+ )
+ # Resume the session if necessary
+ component.get('Core').resume_session()
+
+ def do_schedule(self, timer=True):
+ """
+ This is where we apply schedule rules.
+ """
+
+ state = self.get_state()
+
+ if state == 'Green':
+ # This is Green (Normal) so we just make sure we've applied the
+ # global defaults
+ self.__apply_set_functions()
+ elif state == 'Yellow':
+ # This is Yellow (Slow), so use the settings provided from the user
+ settings = {
+ 'active_limit': self.config['low_active'],
+ 'active_downloads': self.config['low_active_down'],
+ 'active_seeds': self.config['low_active_up'],
+ 'download_rate_limit': int(self.config['low_down'] * 1024),
+ 'upload_rate_limit': int(self.config['low_up'] * 1024),
+ }
+ component.get('Core').apply_session_settings(settings)
+ # Resume the session if necessary
+ component.get('Core').resume_session()
+ elif state == 'Red':
+ # This is Red (Stop), so pause the libtorrent session
+ component.get('Core').pause_session()
+
+ if state != self.state:
+ # The state has changed since last update so we need to emit an event
+ self.state = state
+ component.get('EventManager').emit(SchedulerEvent(self.state))
+
+ if timer:
+ # Call this again in 1 hour
+ self.timer = reactor.callLater(3600, self.do_schedule)
+
+ @export()
+ def set_config(self, config):
+ """Sets the config dictionary."""
+ for key in config:
+ self.config[key] = config[key]
+ self.config.save()
+ self.do_schedule(False)
+
+ @export()
+ def get_config(self):
+ """Returns the config dictionary."""
+ return self.config.config
+
+ @export()
+ def get_state(self):
+ now = time.localtime(time.time())
+ level = self.config['button_state'][now[3]][now[6]]
+ return STATES[level]
diff --git a/deluge/plugins/Scheduler/deluge_scheduler/data/green.svg b/deluge/plugins/Scheduler/deluge_scheduler/data/green.svg
new file mode 100644
index 0000000..ff3f5d6
--- /dev/null
+++ b/deluge/plugins/Scheduler/deluge_scheduler/data/green.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 16 16" width="16" height="16"><defs><clipPath id="_clipPath_Ng8EWXQF95Gs7ywflmaKe8f73244LGgx"><rect width="16" height="16"/></clipPath></defs><g clip-path="url(#_clipPath_Ng8EWXQF95Gs7ywflmaKe8f73244LGgx)"><clipPath id="_clipPath_fEKXMbJwavdXcwSIsEYpsxFyYERCnK2c"><rect x="0" y="0" width="16" height="16" transform="matrix(1,0,0,1,0,0)" fill="rgb(255,255,255)"/></clipPath><g clip-path="url(#_clipPath_fEKXMbJwavdXcwSIsEYpsxFyYERCnK2c)"><g><g><radialGradient id="_rgradient_9" fx="0.5" fy="0.5" cx="0.5" cy="0.5" r="0.5" gradientTransform="matrix(12,0,0,12,1.5,1.5)" gradientUnits="userSpaceOnUse"><stop offset="0%" stop-opacity="1" style="stop-color:rgb(22,200,22)"/><stop offset="100%" stop-opacity="1" style="stop-color:rgb(22,200,22)"/></radialGradient><circle vector-effect="non-scaling-stroke" cx="7.5" cy="7.5" r="6" fill="url(#_rgradient_9)"/><path d=" M 7.5 0.013 C 3.37 0.013 0.013 3.37 0.013 7.5 C 0.013 11.63 3.37 14.987 7.5 14.987 C 11.63 14.987 14.987 11.63 14.987 7.5 C 14.987 3.37 11.63 0.013 7.5 0.013 Z M 7.5 1.987 C 10.549 1.987 13.013 4.451 13.013 7.5 C 13.013 10.549 10.549 13.013 7.5 13.013 C 4.451 13.013 1.987 10.549 1.987 7.5 C 1.987 4.451 4.451 1.987 7.5 1.987 Z " fill="rgb(18,155,0)"/><path d=" M 10.406 4 C 10.309 4.026 10.222 4.08 10.156 4.156 L 7.5 6.813 L 5.844 5.156 C 5.736 4.98 5.53 4.888 5.326 4.925 C 5.123 4.963 4.963 5.123 4.925 5.326 C 4.888 5.53 4.98 5.736 5.156 5.844 L 7.156 7.844 C 7.349 8.026 7.651 8.026 7.844 7.844 L 10.844 4.844 C 10.995 4.689 11.03 4.455 10.931 4.263 C 10.831 4.071 10.62 3.965 10.406 4 Z " fill="rgb(43,46,57)"/></g></g></g></g></svg>
diff --git a/deluge/plugins/Scheduler/deluge_scheduler/data/red.svg b/deluge/plugins/Scheduler/deluge_scheduler/data/red.svg
new file mode 100644
index 0000000..ccb0822
--- /dev/null
+++ b/deluge/plugins/Scheduler/deluge_scheduler/data/red.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 16 16" width="16" height="16"><defs><clipPath id="_clipPath_b9idtDkK5ON8Jka415AjKueNrp89rRRq"><rect width="16" height="16"/></clipPath></defs><g clip-path="url(#_clipPath_b9idtDkK5ON8Jka415AjKueNrp89rRRq)"><clipPath id="_clipPath_vxaOVU0QEXAkOxrpA9AlU4ChkMqnhw1h"><rect x="0" y="0" width="16" height="16" transform="matrix(1,0,0,1,0,0)" fill="rgb(255,255,255)"/></clipPath><g clip-path="url(#_clipPath_vxaOVU0QEXAkOxrpA9AlU4ChkMqnhw1h)"><g><g><g style="opacity:0.98;"><g opacity="0.98"><circle vector-effect="non-scaling-stroke" cx="7.5" cy="7.5" r="6" fill="rgb(230,56,31)"/></g></g><path d=" M 7.5 0.013 C 3.37 0.013 0.013 3.37 0.013 7.5 C 0.013 11.63 3.37 14.987 7.5 14.987 C 11.63 14.987 14.987 11.63 14.987 7.5 C 14.987 3.37 11.63 0.013 7.5 0.013 Z M 7.5 1.987 C 10.549 1.987 13.013 4.451 13.013 7.5 C 13.013 10.549 10.549 13.013 7.5 13.013 C 4.451 13.013 1.987 10.549 1.987 7.5 C 1.987 4.451 4.451 1.987 7.5 1.987 Z " fill="rgb(166,14,14)"/><path d=" M 10.406 4 C 10.309 4.026 10.222 4.08 10.156 4.156 L 7.5 6.813 L 5.844 5.156 C 5.736 4.98 5.53 4.888 5.326 4.925 C 5.123 4.963 4.963 5.123 4.925 5.326 C 4.888 5.53 4.98 5.736 5.156 5.844 L 7.156 7.844 C 7.349 8.026 7.651 8.026 7.844 7.844 L 10.844 4.844 C 10.995 4.689 11.03 4.455 10.931 4.263 C 10.831 4.071 10.62 3.965 10.406 4 Z " fill="rgb(43,46,57)"/></g></g></g></g></svg>
diff --git a/deluge/plugins/Scheduler/deluge_scheduler/data/scheduler.js b/deluge/plugins/Scheduler/deluge_scheduler/data/scheduler.js
new file mode 100644
index 0000000..13bec46
--- /dev/null
+++ b/deluge/plugins/Scheduler/deluge_scheduler/data/scheduler.js
@@ -0,0 +1,621 @@
+/**
+ * scheduler.js
+ * The client-side javascript code for the Scheduler plugin.
+ *
+ * Copyright (C) samuel337 2011
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ *
+ */
+
+Ext.ns('Deluge.ux');
+
+Deluge.ux.ScheduleSelector = Ext.extend(Ext.form.FieldSet, {
+ title: _('Schedule'),
+ autoHeight: true,
+ style: 'margin-bottom: 0px; padding-bottom: 0px;',
+ border: false,
+
+ states: [
+ {
+ name: 'Normal',
+ backgroundColor: 'LightGreen',
+ borderColor: 'DarkGreen',
+ value: 0,
+ },
+ {
+ name: 'Throttled',
+ backgroundColor: 'Yellow',
+ borderColor: 'Gold',
+ value: 1,
+ },
+ {
+ name: 'Paused',
+ backgroundColor: 'OrangeRed',
+ borderColor: 'FireBrick',
+ value: 2,
+ },
+ ],
+ daysOfWeek: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+
+ initComponent: function() {
+ Deluge.ux.ScheduleSelector.superclass.initComponent.call(this);
+
+ // ExtJS' radiogroup implementation is very broken for styling.
+ /*this.stateBrush = this.add({
+ xtype: 'radiogroup',
+ fieldLabel: _('State Brush'),
+ name: 'current_state_brush',
+ submitValue: false,
+ items: [
+ { boxLabel: 'Normal', name: 'current_state_brush', inputValue: 0 },
+ { boxLabel: 'Throttled', name: 'current_state_brush', inputValue: 1, checked: true },
+ { boxLabel: 'Paused', name: 'current_state_brush', inputValue: 2 },
+ ]
+ });*/
+ },
+
+ onRender: function(ct, position) {
+ Deluge.ux.ScheduleSelector.superclass.onRender.call(this, ct, position);
+
+ var dom = this.body.dom;
+
+ function createEl(parent, type) {
+ var el = document.createElement(type);
+ parent.appendChild(el);
+ return el;
+ }
+
+ // create state brushes
+ // tack a random number to the end to avoid clashes
+ this.stateBrushName =
+ 'schedule-state-brush-' + Math.round(Math.random() * 10000);
+
+ var el1 = createEl(dom, 'div');
+
+ var el2 = createEl(el1, 'div');
+ this.stateBrush = el2;
+ el2.id = this.stateBrushName;
+
+ // for webkit
+ var floatAttr = 'float';
+ if (el2.style.float == undefined) {
+ // for firefox
+ if (el2.style.cssFloat != undefined) floatAttr = 'cssFloat';
+ // for IE
+ if (el2.style.styleFloat != undefined) floatAttr = 'styleFloat';
+ }
+ el2.style[floatAttr] = 'right';
+
+ for (var i = 0; i < this.states.length; i++) {
+ var el3 = createEl(el2, 'input');
+ el3.type = 'radio';
+ el3.value = this.states[i].value;
+ el3.name = this.stateBrushName;
+ el3.id = this.stateBrushName + '-' + this.states[i].name;
+
+ // isn't the first one
+ if (i > 0) el3.style.marginLeft = '7px';
+
+ // assume the first is the default state, so make the 2nd one the default brush
+ if (i == 1) el3.checked = true;
+
+ var el4 = createEl(el2, 'label');
+ el4.appendChild(document.createTextNode(this.states[i].name));
+ el4.htmlFor = el3.id;
+ el4.style.backgroundColor = this.states[i].backgroundColor;
+ el4.style.borderBottom = '2px solid ' + this.states[i].borderColor;
+ el4.style.padding = '2px 3px';
+ el4.style.marginLeft = '3px';
+ }
+
+ el1.appendChild(document.createTextNode('Select a state brush:'));
+
+ el1.style.marginBottom = '10px';
+
+ // keep the radio buttons separate from the time bars
+ createEl(dom, 'div').style.clear = 'both';
+
+ var table = createEl(dom, 'table');
+ table.cellSpacing = 0;
+
+ // cache access to cells for easier access later
+ this.scheduleCells = {};
+
+ Ext.each(
+ this.daysOfWeek,
+ function(day) {
+ var cells = [];
+ var row = createEl(table, 'tr');
+ var label = createEl(row, 'th');
+ label.setAttribute(
+ 'style',
+ 'font-weight: bold; padding-right: 5px;'
+ );
+ label.appendChild(document.createTextNode(day));
+ for (var hour = 0; hour < 24; hour++) {
+ var cell = createEl(row, 'td');
+
+ // assume the first state is the default state
+ cell.currentValue = cell.oldValue = this.states[0].value;
+ cell.day = day;
+ cell.hour = hour;
+
+ cell.width = '16px';
+ cell.height = '20px';
+
+ cell.style.border = '1px solid #999999';
+ // don't repeat borders in between cells
+ if (hour != 23)
+ // not the last cell
+ cell.style.borderRight = 'none';
+
+ this.updateCell(cell);
+
+ cells.push(cell);
+
+ cell = Ext.get(cell);
+ cell.on('click', this.onCellClick, this);
+ cell.on('mouseover', this.onCellMouseOver, this);
+ cell.on('mouseout', this.onCellMouseOut, this);
+ cell.on('mousedown', this.onCellMouseDown, this);
+ cell.on('mouseup', this.onCellMouseUp, this);
+ }
+
+ // insert gap row to provide visual separation
+ row = createEl(table, 'tr');
+ // blank cell to create gap
+ createEl(row, 'td').height = '3px';
+
+ this.scheduleCells[day] = cells;
+ },
+ this
+ );
+ },
+
+ updateCell: function(cell) {
+ // sanity check
+ if (cell.currentValue == undefined) return;
+
+ for (var i in this.states) {
+ var curState = this.states[i];
+ if (curState.value == cell.currentValue) {
+ cell.style.background = curState.backgroundColor;
+ break;
+ }
+ }
+ },
+
+ getCurrentBrushValue: function() {
+ var v = null;
+ var brushes = Ext.get(this.body.dom).findParent('form').elements[
+ this.stateBrushName
+ ];
+ Ext.each(brushes, function(b) {
+ if (b.checked) v = b.value;
+ });
+
+ return v;
+ },
+
+ onCellClick: function(event, cell) {
+ cell.oldValue = cell.currentValue;
+
+ this.dragAnchor = null;
+ },
+
+ onCellMouseDown: function(event, cell) {
+ this.dragAnchor = cell;
+ },
+
+ onCellMouseUp: function(event, cell) {
+ // if we're dragging...
+ if (this.dragAnchor) {
+ // set all those between here and the anchor to the new values
+ if (cell.hour > this.dragAnchor.hour)
+ this.confirmCells(cell.day, this.dragAnchor.hour, cell.hour);
+ else if (cell.hour < this.dragAnchor.hour)
+ this.confirmCells(cell.day, cell.hour, this.dragAnchor.hour);
+ else this.confirmCells(cell.day, cell.hour, cell.hour);
+
+ this.hideCellLeftTooltip();
+ this.hideCellRightTooltip();
+ this.dragAnchor = null;
+ }
+ },
+
+ onCellMouseOver: function(event, cell) {
+ // LEFT TOOL TIP
+ // if it isn't showing and we're dragging, show it.
+ // otherwise if dragging, leave it alone unless we're dragging to the left.
+ // if we're not dragging, show it.
+ var leftTooltipCell = null;
+ if (!this.dragAnchor) leftTooltipCell = cell;
+ else if (
+ (this.dragAnchor && this.isCellLeftTooltipHidden()) ||
+ (this.dragAnchor && this.dragAnchor.hour > cell.hour)
+ )
+ leftTooltipCell = this.dragAnchor;
+
+ if (leftTooltipCell) {
+ var hour = leftTooltipCell.hour;
+ var pm = false;
+
+ // convert to 12-hour time
+ if (hour >= 12) {
+ pm = true;
+ if (hour > 12) hour -= 12;
+ } else if (hour == 0) {
+ // change 0 hour to 12am
+ hour = 12;
+ }
+ this.showCellLeftTooltip(
+ hour + ' ' + (pm ? 'pm' : 'am'),
+ leftTooltipCell
+ );
+ }
+
+ // RIGHT TOOL TIP
+ var rightTooltipCell = null;
+ if (this.dragAnchor) {
+ if (this.dragAnchor.hour == cell.hour) this.hideCellRightTooltip();
+ else if (
+ this.dragAnchor.hour > cell.hour &&
+ this.isCellRightTooltipHidden()
+ )
+ rightTooltipCell = this.dragAnchor;
+ // cell.hour > this.dragAnchor.hour
+ else rightTooltipCell = cell;
+ }
+
+ if (rightTooltipCell) {
+ var hour = rightTooltipCell.hour;
+ var pm = false;
+
+ // convert to 12-hour time
+ if (hour >= 12) {
+ pm = true;
+ if (hour > 12) hour -= 12;
+ } else if (hour == 0) {
+ // change 0 hour to 12am
+ hour = 12;
+ }
+ this.showCellRightTooltip(
+ hour + ' ' + (pm ? 'pm' : 'am'),
+ rightTooltipCell
+ );
+ }
+
+ // preview colour change and
+ // revert state for all those on the outer side of the drag if dragging
+ if (this.dragAnchor) {
+ if (cell.day != this.dragAnchor.day) {
+ // dragged into another day. Abort! Abort!
+ Ext.each(
+ this.daysOfWeek,
+ function(day) {
+ this.revertCells(day, 0, 23);
+ },
+ this
+ );
+ this.dragAnchor = null;
+ this.hideCellLeftTooltip();
+ this.hideCellRightTooltip();
+ } else if (cell.hour > this.dragAnchor.hour) {
+ // dragging right
+ this.revertCells(cell.day, cell.hour + 1, 23);
+ this.previewCells(cell.day, this.dragAnchor.hour, cell.hour);
+ } else if (cell.hour < this.dragAnchor.hour) {
+ // dragging left
+ this.revertCells(cell.day, 0, cell.hour - 1);
+ this.previewCells(cell.day, cell.hour, this.dragAnchor.hour);
+ } else {
+ // back to anchor cell
+ // don't know if it is from right or left, so revert all except this
+ this.revertCells(cell.day, cell.hour + 1, 23);
+ this.revertCells(cell.day, 0, cell.hour - 1);
+ }
+ } else {
+ // not dragging, just preview this cell
+ this.previewCells(cell.day, cell.hour, cell.hour);
+ }
+ },
+
+ onCellMouseOut: function(event, cell) {
+ if (!this.dragAnchor) this.hideCellLeftTooltip();
+
+ // revert state. If new state has been set, old and new will be equal.
+ // if dragging, this will be handled by the next mouse over
+ if (this.dragAnchor == null && cell.oldValue != cell.currentValue) {
+ this.revertCells(cell.day, cell.hour, cell.hour);
+ }
+ },
+
+ previewCells: function(day, fromHour, toHour) {
+ var cells = this.scheduleCells[day];
+ var curBrushValue = this.getCurrentBrushValue();
+
+ if (toHour > cells.length) toHour = cells.length;
+
+ for (var i = fromHour; i <= toHour; i++) {
+ if (cells[i].currentValue != curBrushValue) {
+ cells[i].oldValue = cells[i].currentValue;
+ cells[i].currentValue = curBrushValue;
+ this.updateCell(cells[i]);
+ }
+ }
+ },
+
+ revertCells: function(day, fromHour, toHour) {
+ var cells = this.scheduleCells[day];
+
+ if (toHour > cells.length) toHour = cells.length;
+
+ for (var i = fromHour; i <= toHour; i++) {
+ cells[i].currentValue = cells[i].oldValue;
+ this.updateCell(cells[i]);
+ }
+ },
+
+ confirmCells: function(day, fromHour, toHour) {
+ var cells = this.scheduleCells[day];
+
+ if (toHour > cells.length) toHour = cells.length;
+
+ for (var i = fromHour; i <= toHour; i++) {
+ if (cells[i].currentValue != cells[i].oldValue) {
+ cells[i].oldValue = cells[i].currentValue;
+ }
+ }
+ },
+
+ showCellLeftTooltip: function(text, cell) {
+ var tooltip = this.cellLeftTooltip;
+
+ if (!tooltip) {
+ // no cached left tooltip exists, create one
+ tooltip = document.createElement('div');
+ this.cellLeftTooltip = tooltip;
+ this.body.dom.appendChild(tooltip);
+ tooltip.style.position = 'absolute';
+ tooltip.style.backgroundColor = '#F2F2F2';
+ tooltip.style.border = '1px solid #333333';
+ tooltip.style.padding = '1px 3px';
+ tooltip.style.opacity = 0.8;
+ }
+
+ // remove all existing children
+ while (tooltip.childNodes.length > 0) {
+ tooltip.removeChild(tooltip.firstChild);
+ }
+ // add the requested text
+ tooltip.appendChild(document.createTextNode(text));
+
+ // place the tooltip
+ Ext.get(tooltip).alignTo(cell, 'br-tr');
+
+ // make it visible
+ tooltip.style.visibility = 'visible';
+ },
+
+ hideCellLeftTooltip: function() {
+ if (this.cellLeftTooltip) {
+ this.cellLeftTooltip.style.visibility = 'hidden';
+ }
+ },
+
+ isCellLeftTooltipHidden: function() {
+ if (this.cellLeftTooltip)
+ return this.cellLeftTooltip.style.visibility == 'hidden';
+ else return true;
+ },
+
+ showCellRightTooltip: function(text, cell) {
+ var tooltip = this.cellRightTooltip;
+
+ if (!tooltip) {
+ // no cached left tooltip exists, create one
+ tooltip = document.createElement('div');
+ this.cellRightTooltip = tooltip;
+ this.body.dom.appendChild(tooltip);
+ tooltip.style.position = 'absolute';
+ tooltip.style.backgroundColor = '#F2F2F2';
+ tooltip.style.border = '1px solid #333333';
+ tooltip.style.padding = '1px 3px';
+ tooltip.style.opacity = 0.8;
+ }
+
+ // remove all existing children
+ while (tooltip.childNodes.length > 0) {
+ tooltip.removeChild(tooltip.firstChild);
+ }
+ // add the requested text
+ tooltip.appendChild(document.createTextNode(text));
+
+ // place the tooltip
+ Ext.get(tooltip).alignTo(cell, 'bl-tl');
+
+ // make it visible
+ tooltip.style.visibility = 'visible';
+ },
+
+ hideCellRightTooltip: function() {
+ if (this.cellRightTooltip) {
+ this.cellRightTooltip.style.visibility = 'hidden';
+ }
+ },
+
+ isCellRightTooltipHidden: function() {
+ if (this.cellRightTooltip)
+ return this.cellRightTooltip.style.visibility == 'hidden';
+ else return true;
+ },
+
+ getConfig: function() {
+ var config = [];
+
+ for (var i = 0; i < 24; i++) {
+ var hourConfig = [0, 0, 0, 0, 0, 0, 0];
+
+ for (var j = 0; j < this.daysOfWeek.length; j++) {
+ hourConfig[j] = parseInt(
+ this.scheduleCells[this.daysOfWeek[j]][i].currentValue
+ );
+ }
+
+ config.push(hourConfig);
+ }
+
+ return config;
+ },
+
+ setConfig: function(config) {
+ for (var i = 0; i < 24; i++) {
+ var hourConfig = config[i];
+
+ for (var j = 0; j < this.daysOfWeek.length; j++) {
+ if (this.scheduleCells == undefined) {
+ var cell = hourConfig[j];
+ } else {
+ var cell = this.scheduleCells[this.daysOfWeek[j]][i];
+ }
+ cell.currentValue = cell.oldValue = hourConfig[j];
+ this.updateCell(cell);
+ }
+ }
+ },
+});
+
+Ext.ns('Deluge.ux.preferences');
+
+Deluge.ux.preferences.SchedulerPage = Ext.extend(Ext.Panel, {
+ border: false,
+ title: _('Scheduler'),
+ header: false,
+ layout: 'fit',
+
+ initComponent: function() {
+ Deluge.ux.preferences.SchedulerPage.superclass.initComponent.call(this);
+
+ this.form = this.add({
+ xtype: 'form',
+ layout: 'form',
+ border: false,
+ autoHeight: true,
+ });
+
+ this.schedule = this.form.add(new Deluge.ux.ScheduleSelector());
+
+ this.slowSettings = this.form.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Throttled Settings'),
+ autoHeight: true,
+ defaultType: 'spinnerfield',
+ defaults: {
+ minValue: -1,
+ maxValue: 99999,
+ },
+ style: 'margin-top: 5px; margin-bottom: 0px; padding-bottom: 0px;',
+ labelWidth: 200,
+ });
+
+ this.downloadLimit = this.slowSettings.add({
+ fieldLabel: _('Maximum Download Speed (KiB/s)'),
+ name: 'download_limit',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ });
+ this.uploadLimit = this.slowSettings.add({
+ fieldLabel: _('Maximum Upload Speed (KiB/s)'),
+ name: 'upload_limit',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ });
+ this.activeTorrents = this.slowSettings.add({
+ fieldLabel: _('Active Torrents'),
+ name: 'active_torrents',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ });
+ this.activeDownloading = this.slowSettings.add({
+ fieldLabel: _('Active Downloading'),
+ name: 'active_downloading',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ });
+ this.activeSeeding = this.slowSettings.add({
+ fieldLabel: _('Active Seeding'),
+ name: 'active_seeding',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ });
+
+ this.on('show', this.updateConfig, this);
+ },
+
+ onRender: function(ct, position) {
+ Deluge.ux.preferences.SchedulerPage.superclass.onRender.call(
+ this,
+ ct,
+ position
+ );
+ this.form.layout = new Ext.layout.FormLayout();
+ this.form.layout.setContainer(this);
+ this.form.doLayout();
+ },
+
+ onApply: function() {
+ // build settings object
+ var config = {};
+
+ config['button_state'] = this.schedule.getConfig();
+ config['low_down'] = this.downloadLimit.getValue();
+ config['low_up'] = this.uploadLimit.getValue();
+ config['low_active'] = this.activeTorrents.getValue();
+ config['low_active_down'] = this.activeDownloading.getValue();
+ config['low_active_up'] = this.activeSeeding.getValue();
+
+ deluge.client.scheduler.set_config(config);
+ },
+
+ onOk: function() {
+ this.onApply();
+ },
+
+ updateConfig: function() {
+ deluge.client.scheduler.get_config({
+ success: function(config) {
+ this.schedule.setConfig(config['button_state']);
+ this.downloadLimit.setValue(config['low_down']);
+ this.uploadLimit.setValue(config['low_up']);
+ this.activeTorrents.setValue(config['low_active']);
+ this.activeDownloading.setValue(config['low_active_down']);
+ this.activeSeeding.setValue(config['low_active_up']);
+ },
+ scope: this,
+ });
+ },
+});
+
+Deluge.plugins.SchedulerPlugin = Ext.extend(Deluge.Plugin, {
+ name: 'Scheduler',
+
+ onDisable: function() {
+ deluge.preferences.removePage(this.prefsPage);
+ },
+
+ onEnable: function() {
+ this.prefsPage = deluge.preferences.addPage(
+ new Deluge.ux.preferences.SchedulerPage()
+ );
+ },
+});
+Deluge.registerPlugin('Scheduler', Deluge.plugins.SchedulerPlugin);
diff --git a/deluge/plugins/Scheduler/deluge_scheduler/data/yellow.svg b/deluge/plugins/Scheduler/deluge_scheduler/data/yellow.svg
new file mode 100644
index 0000000..8881a8c
--- /dev/null
+++ b/deluge/plugins/Scheduler/deluge_scheduler/data/yellow.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 16 16" width="16" height="16"><defs><clipPath id="_clipPath_FTEVJ02JqQbaAkGq0zxCClZ8ovSf28LF"><rect width="16" height="16"/></clipPath></defs><g clip-path="url(#_clipPath_FTEVJ02JqQbaAkGq0zxCClZ8ovSf28LF)"><clipPath id="_clipPath_kMUc2qeZPnpfemB5VN1mID2bTbctQK6V"><rect x="0" y="0" width="16" height="16" transform="matrix(1,0,0,1,0,0)" fill="rgb(255,255,255)"/></clipPath><g clip-path="url(#_clipPath_kMUc2qeZPnpfemB5VN1mID2bTbctQK6V)"><g><clipPath id="_clipPath_O3gUc8WX8CfJdh8CMbdOfLtRtmBkIQPk"><rect x="0" y="0" width="16" height="16" transform="matrix(1,0,0,1,0,0)" fill="rgb(255,255,255)"/></clipPath><g clip-path="url(#_clipPath_O3gUc8WX8CfJdh8CMbdOfLtRtmBkIQPk)"><g><g><g><path d=" M 7.5 0.013 C 3.37 0.013 0.013 3.37 0.013 7.5 C 0.013 11.63 3.37 14.987 7.5 14.987 C 11.63 14.987 14.987 11.63 14.987 7.5 C 14.987 3.37 11.63 0.013 7.5 0.013 Z M 7.5 1.987 C 10.549 1.987 13.013 4.451 13.013 7.5 C 13.013 10.549 10.549 13.013 7.5 13.013 C 4.451 13.013 1.987 10.549 1.987 7.5 C 1.987 4.451 4.451 1.987 7.5 1.987 Z " fill="rgb(180,180,0)"/><g style="opacity:0.99;"><g style="opacity:0.99;"><g opacity="0.99"><circle vector-effect="non-scaling-stroke" cx="7.5" cy="7.5" r="6" fill="rgb(220,220,0)"/></g></g></g><path d=" M 10.406 4 C 10.309 4.026 10.222 4.08 10.156 4.156 L 7.5 6.813 L 5.844 5.156 C 5.736 4.98 5.53 4.888 5.326 4.925 C 5.123 4.963 4.963 5.123 4.925 5.326 C 4.888 5.53 4.98 5.736 5.156 5.844 L 7.156 7.844 C 7.349 8.026 7.651 8.026 7.844 7.844 L 10.844 4.844 C 10.995 4.689 11.03 4.455 10.931 4.263 C 10.831 4.071 10.62 3.965 10.406 4 Z " fill="rgb(43,46,57)"/></g></g></g></g></g></g></g></svg>
diff --git a/deluge/plugins/Scheduler/deluge_scheduler/gtkui.py b/deluge/plugins/Scheduler/deluge_scheduler/gtkui.py
new file mode 100644
index 0000000..12f5fb6
--- /dev/null
+++ b/deluge/plugins/Scheduler/deluge_scheduler/gtkui.py
@@ -0,0 +1,359 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import logging
+
+from gi.repository import Gdk, Gtk
+
+import deluge.component as component
+from deluge.plugins.pluginbase import Gtk3PluginBase
+from deluge.ui.client import client
+
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+DAYS = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+
+
+class SchedulerSelectWidget(Gtk.DrawingArea):
+ def __init__(self, hover):
+ super(SchedulerSelectWidget, self).__init__()
+ self.set_events(
+ Gdk.EventMask.BUTTON_PRESS_MASK
+ | Gdk.EventMask.BUTTON_RELEASE_MASK
+ | Gdk.EventMask.POINTER_MOTION_MASK
+ | Gdk.EventMask.LEAVE_NOTIFY_MASK
+ )
+
+ self.connect('draw', self.draw)
+ self.connect('button_press_event', self.mouse_down)
+ self.connect('button_release_event', self.mouse_up)
+ self.connect('motion_notify_event', self.mouse_hover)
+ self.connect('leave_notify_event', self.mouse_leave)
+
+ self.colors = [
+ [115 / 255, 210 / 255, 22 / 255],
+ [237 / 255, 212 / 255, 0 / 255],
+ [204 / 255, 0 / 255, 0 / 255],
+ ]
+ self.button_state = [[0] * 7 for dummy in range(24)]
+
+ self.start_point = [0, 0]
+ self.hover_point = [-1, -1]
+ self.hover_label = hover
+ self.hover_days = DAYS
+ self.mouse_press = False
+ self.set_size_request(350, 150)
+
+ def set_button_state(self, state):
+ self.button_state = []
+ for s in state:
+ self.button_state.append(list(s))
+ log.debug(self.button_state)
+
+ # redraw the whole thing
+ def draw(self, widget, context):
+ width = widget.get_allocated_width()
+ height = widget.get_allocated_height()
+ context.rectangle(0, 0, width, height)
+ context.clip()
+
+ for y in range(7):
+ for x in range(24):
+ context.set_source_rgba(
+ self.colors[self.button_state[x][y]][0],
+ self.colors[self.button_state[x][y]][1],
+ self.colors[self.button_state[x][y]][2],
+ 0.5,
+ )
+ context.rectangle(
+ width * (6 * x / 145 + 1 / 145),
+ height * (6 * y / 43 + 1 / 43),
+ 6 * width / 145,
+ 5 * height / 43,
+ )
+ context.fill_preserve()
+ context.set_source_rgba(0, 0, 0, 0.7)
+ context.set_line_width(1)
+ context.stroke()
+
+ # coordinates --> which box
+ def get_point(self, event):
+ width = self.get_allocated_width()
+ height = self.get_allocated_height()
+ x = int((event.x - width * 0.5 / 145) / (6 * width / 145))
+ y = int((event.y - height * 0.5 / 43) / (6 * height / 43))
+
+ if x > 23:
+ x = 23
+ elif x < 0:
+ x = 0
+ if y > 6:
+ y = 6
+ elif y < 0:
+ y = 0
+
+ return [x, y]
+
+ # mouse down
+ def mouse_down(self, widget, event):
+ self.mouse_press = True
+ self.start_point = self.get_point(event)
+
+ # if the same box -> change it
+ def mouse_up(self, widget, event):
+ self.mouse_press = False
+ end_point = self.get_point(event)
+
+ # change color on mouseclick depending on the button
+ if end_point[0] is self.start_point[0] and end_point[1] is self.start_point[1]:
+ if event.button == 1:
+ self.button_state[end_point[0]][end_point[1]] += 1
+ if self.button_state[end_point[0]][end_point[1]] > 2:
+ self.button_state[end_point[0]][end_point[1]] = 0
+ elif event.button == 3:
+ self.button_state[end_point[0]][end_point[1]] -= 1
+ if self.button_state[end_point[0]][end_point[1]] < 0:
+ self.button_state[end_point[0]][end_point[1]] = 2
+ self.queue_draw()
+
+ # if box changed and mouse is pressed draw all boxes from start point to end point
+ # set hover text etc..
+ def mouse_hover(self, widget, event):
+ if self.get_point(event) != self.hover_point:
+ self.hover_point = self.get_point(event)
+
+ self.hover_label.set_text(
+ self.hover_days[self.hover_point[1]]
+ + ' '
+ + str(self.hover_point[0])
+ + ':00 - '
+ + str(self.hover_point[0])
+ + ':59'
+ )
+
+ if self.mouse_press:
+ points = [
+ [self.hover_point[0], self.start_point[0]],
+ [self.hover_point[1], self.start_point[1]],
+ ]
+
+ for x in range(min(points[0]), max(points[0]) + 1):
+ for y in range(min(points[1]), max(points[1]) + 1):
+ self.button_state[x][y] = self.button_state[
+ self.start_point[0]
+ ][self.start_point[1]]
+
+ self.queue_draw()
+
+ # clear hover text on mouse leave
+ def mouse_leave(self, widget, event):
+ self.hover_label.set_text('')
+ self.hover_point = [-1, -1]
+
+
+class GtkUI(Gtk3PluginBase):
+ def enable(self):
+ self.create_prefs_page()
+
+ component.get('PluginManager').register_hook(
+ 'on_apply_prefs', self.on_apply_prefs
+ )
+ component.get('PluginManager').register_hook(
+ 'on_show_prefs', self.on_show_prefs
+ )
+ self.statusbar = component.get('StatusBar')
+ self.status_item = self.statusbar.add_item(
+ image=get_resource('green.svg'),
+ text='',
+ callback=self.on_status_item_clicked,
+ tooltip='Scheduler',
+ )
+
+ def on_state_deferred(state):
+ self.state = state
+ self.on_scheduler_event(state)
+
+ self.on_show_prefs()
+
+ client.scheduler.get_state().addCallback(on_state_deferred)
+ client.register_event_handler('SchedulerEvent', self.on_scheduler_event)
+
+ def disable(self):
+ component.get('Preferences').remove_page(_('Scheduler'))
+ # Reset statusbar dict.
+ self.statusbar.config_value_changed_dict[
+ 'max_download_speed'
+ ] = self.statusbar._on_max_download_speed
+ self.statusbar.config_value_changed_dict[
+ 'max_upload_speed'
+ ] = self.statusbar._on_max_upload_speed
+ # Remove statusbar item.
+ self.statusbar.remove_item(self.status_item)
+ del self.status_item
+
+ component.get('PluginManager').deregister_hook(
+ 'on_apply_prefs', self.on_apply_prefs
+ )
+ component.get('PluginManager').deregister_hook(
+ 'on_show_prefs', self.on_show_prefs
+ )
+
+ def on_apply_prefs(self):
+ log.debug('applying prefs for Scheduler')
+ config = {}
+ config['low_down'] = self.spin_download.get_value()
+ config['low_up'] = self.spin_upload.get_value()
+ config['low_active'] = self.spin_active.get_value_as_int()
+ config['low_active_down'] = self.spin_active_down.get_value_as_int()
+ config['low_active_up'] = self.spin_active_up.get_value_as_int()
+ config['button_state'] = self.scheduler_select.button_state
+ client.scheduler.set_config(config)
+
+ def on_show_prefs(self):
+ def on_get_config(config):
+ log.debug('config: %s', config)
+ self.scheduler_select.set_button_state(config['button_state'])
+ self.spin_download.set_value(config['low_down'])
+ self.spin_upload.set_value(config['low_up'])
+ self.spin_active.set_value(config['low_active'])
+ self.spin_active_down.set_value(config['low_active_down'])
+ self.spin_active_up.set_value(config['low_active_up'])
+
+ client.scheduler.get_config().addCallback(on_get_config)
+
+ def on_scheduler_event(self, state):
+ self.state = state
+ self.status_item.set_image_from_file(get_resource(self.state.lower() + '.svg'))
+ if self.state == 'Yellow':
+ # Prevent func calls in Statusbar if the config changes.
+ self.statusbar.config_value_changed_dict.pop('max_download_speed', None)
+ self.statusbar.config_value_changed_dict.pop('max_upload_speed', None)
+ try:
+ self.statusbar._on_max_download_speed(self.spin_download.get_value())
+ self.statusbar._on_max_upload_speed(self.spin_upload.get_value())
+ except AttributeError:
+ # Skip error due to Plugin being enabled before statusbar items created on startup.
+ pass
+ else:
+ self.statusbar.config_value_changed_dict[
+ 'max_download_speed'
+ ] = self.statusbar._on_max_download_speed
+ self.statusbar.config_value_changed_dict[
+ 'max_upload_speed'
+ ] = self.statusbar._on_max_upload_speed
+
+ def update_config_values(config):
+ try:
+ self.statusbar._on_max_download_speed(config['max_download_speed'])
+ self.statusbar._on_max_upload_speed(config['max_upload_speed'])
+ except AttributeError:
+ # Skip error due to Plugin being enabled before statusbar items created on startup.
+ pass
+
+ client.core.get_config_values(
+ ['max_download_speed', 'max_upload_speed']
+ ).addCallback(update_config_values)
+
+ def on_status_item_clicked(self, widget, event):
+ component.get('Preferences').show('Scheduler')
+
+ # Configuration dialog
+ def create_prefs_page(self):
+ # Select Widget
+ hover = Gtk.Label()
+ self.scheduler_select = SchedulerSelectWidget(hover)
+
+ vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, spacing=5)
+ hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, spacing=5)
+ vbox_days = Gtk.Box.new(Gtk.Orientation.VERTICAL, spacing=0)
+ for day in DAYS:
+ vbox_days.pack_start(Gtk.Label(day, xalign=0), True, False, 0)
+ hbox.pack_start(vbox_days, False, False, 15)
+ hbox.pack_start(self.scheduler_select, True, True, 0)
+ frame = Gtk.Frame()
+ label = Gtk.Label()
+ label.set_markup(_('<b>Schedule</b>'))
+ frame.set_label_widget(label)
+ frame.set_shadow_type(Gtk.ShadowType.NONE)
+ frame.set_margin_left(15)
+ frame.add(hbox)
+
+ vbox.pack_start(frame, False, False, 0)
+ vbox.pack_start(hover, False, False, 0)
+
+ table = Gtk.Table(5, 2)
+ table.set_margin_left(15)
+
+ label = Gtk.Label(_('Download Limit:'))
+ label.set_alignment(0.0, 0.6)
+ table.attach_defaults(label, 0, 1, 0, 1)
+ self.spin_download = Gtk.SpinButton()
+ self.spin_download.set_numeric(True)
+ self.spin_download.set_range(-1.0, 99999.0)
+ self.spin_download.set_increments(1, 10)
+ table.attach_defaults(self.spin_download, 1, 2, 0, 1)
+
+ label = Gtk.Label(_('Upload Limit:'))
+ label.set_alignment(0.0, 0.6)
+ table.attach_defaults(label, 0, 1, 1, 2)
+ self.spin_upload = Gtk.SpinButton()
+ self.spin_upload.set_numeric(True)
+ self.spin_upload.set_range(-1.0, 99999.0)
+ self.spin_upload.set_increments(1, 10)
+ table.attach_defaults(self.spin_upload, 1, 2, 1, 2)
+
+ label = Gtk.Label(_('Active Torrents:'))
+ label.set_alignment(0.0, 0.6)
+ table.attach_defaults(label, 0, 1, 2, 3)
+ self.spin_active = Gtk.SpinButton()
+ self.spin_active.set_numeric(True)
+ self.spin_active.set_range(-1, 9999)
+ self.spin_active.set_increments(1, 10)
+ table.attach_defaults(self.spin_active, 1, 2, 2, 3)
+
+ label = Gtk.Label(_('Active Downloading:'))
+ label.set_alignment(0.0, 0.6)
+ table.attach_defaults(label, 0, 1, 3, 4)
+ self.spin_active_down = Gtk.SpinButton()
+ self.spin_active_down.set_numeric(True)
+ self.spin_active_down.set_range(-1, 9999)
+ self.spin_active_down.set_increments(1, 10)
+ table.attach_defaults(self.spin_active_down, 1, 2, 3, 4)
+
+ label = Gtk.Label(_('Active Seeding:'))
+ label.set_alignment(0.0, 0.6)
+ table.attach_defaults(label, 0, 1, 4, 5)
+ self.spin_active_up = Gtk.SpinButton()
+ self.spin_active_up.set_numeric(True)
+ self.spin_active_up.set_range(-1, 9999)
+ self.spin_active_up.set_increments(1, 10)
+ table.attach_defaults(self.spin_active_up, 1, 2, 4, 5)
+
+ eventbox = Gtk.EventBox()
+ eventbox.add(table)
+ frame = Gtk.Frame()
+ label = Gtk.Label()
+ label.set_markup(_('<b>Slow Settings</b>'))
+ label.modify_bg(Gtk.StateFlags.NORMAL, Gdk.color_parse('#EDD400'))
+ frame.set_label_widget(label)
+ frame.set_margin_left(15)
+ frame.set_border_width(2)
+ frame.add(eventbox)
+ vbox.pack_start(frame, False, False, 0)
+
+ vbox.show_all()
+ component.get('Preferences').add_page(_('Scheduler'), vbox)
diff --git a/deluge/plugins/Scheduler/deluge_scheduler/webui.py b/deluge/plugins/Scheduler/deluge_scheduler/webui.py
new file mode 100644
index 0000000..518eaa6
--- /dev/null
+++ b/deluge/plugins/Scheduler/deluge_scheduler/webui.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.plugins.pluginbase import WebPluginBase
+
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+
+class WebUI(WebPluginBase):
+
+ scripts = [get_resource('scheduler.js')]
+ debug_scripts = scripts
diff --git a/deluge/plugins/Scheduler/setup.py b/deluge/plugins/Scheduler/setup.py
new file mode 100644
index 0000000..71b69e9
--- /dev/null
+++ b/deluge/plugins/Scheduler/setup.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from setuptools import find_packages, setup
+
+__plugin_name__ = 'Scheduler'
+__author__ = 'Andrew Resch'
+__author_email__ = 'andrewresch@gmail.com'
+__version__ = '0.3'
+__url__ = 'http://deluge-torrent.org'
+__license__ = 'GPLv3'
+__description__ = 'Schedule limits on a per-hour per-day basis.'
+__long_description__ = """"""
+__pkg_data__ = {'deluge_' + __plugin_name__.lower(): ['data/*']}
+
+setup(
+ name=__plugin_name__,
+ version=__version__,
+ description=__description__,
+ author=__author__,
+ author_email=__author_email__,
+ url=__url__,
+ license=__license__,
+ long_description=__long_description__ if __long_description__ else __description__,
+ packages=find_packages(),
+ package_data=__pkg_data__,
+ entry_points="""
+ [deluge.plugin.core]
+ %s = deluge_%s:CorePlugin
+ [deluge.plugin.gtk3ui]
+ %s = deluge_%s:GtkUIPlugin
+ [deluge.plugin.web]
+ %s = deluge_%s:WebUIPlugin
+ """
+ % ((__plugin_name__, __plugin_name__.lower()) * 3),
+)
diff --git a/deluge/plugins/Stats/deluge_stats/__init__.py b/deluge/plugins/Stats/deluge_stats/__init__.py
new file mode 100644
index 0000000..a40379b
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/__init__.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.plugins.init import PluginInitBase
+
+
+class CorePlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .core import Core as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(CorePlugin, self).__init__(plugin_name)
+
+
+class GtkUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .gtkui import GtkUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(GtkUIPlugin, self).__init__(plugin_name)
+
+
+class WebUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .webui import WebUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(WebUIPlugin, self).__init__(plugin_name)
diff --git a/deluge/plugins/Stats/deluge_stats/common.py b/deluge/plugins/Stats/deluge_stats/common.py
new file mode 100644
index 0000000..4c9db09
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/common.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# 2009 Damien Churchill <damoxc@gmail.com>
+# 2010 Pedro Algarvio <pedro@algarvio.me>
+# 2017 Calum Lind <calumlind+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os.path
+
+from pkg_resources import resource_filename
+
+
+def get_resource(filename):
+ return resource_filename(__package__, os.path.join('data', filename))
diff --git a/deluge/plugins/Stats/deluge_stats/core.py b/deluge/plugins/Stats/deluge_stats/core.py
new file mode 100644
index 0000000..635c54d
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/core.py
@@ -0,0 +1,223 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Ian Martin <ianmartin@cantab.net>
+# Copyright (C) 2008 Damien Churchill <damoxc@gmail.com>
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007 Marcos Mobley <markybob@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import logging
+import time
+
+from twisted.internet.task import LoopingCall
+
+from deluge import component, configmanager
+from deluge.core.rpcserver import export
+from deluge.plugins.pluginbase import CorePluginBase
+
+DEFAULT_PREFS = {
+ 'test': 'NiNiNi',
+ 'update_interval': 1, # 2 seconds.
+ 'length': 150, # 2 seconds * 150 --> 5 minutes.
+}
+
+DEFAULT_TOTALS = {
+ 'total_upload': 0,
+ 'total_download': 0,
+ 'total_payload_upload': 0,
+ 'total_payload_download': 0,
+ 'stats': {},
+}
+
+log = logging.getLogger(__name__)
+
+
+def get_key(config, key):
+ try:
+ return config[key]
+ except KeyError:
+ return None
+
+
+def mean(items):
+ try:
+ return sum(items) // len(items)
+ except Exception:
+ return 0
+
+
+class Core(CorePluginBase):
+ totals = {} # class var to catch only updating this once per session in enable.
+
+ def enable(self):
+ log.debug('Stats plugin enabled')
+ self.core = component.get('Core')
+ self.stats = {}
+ self.count = {}
+ self.intervals = [1, 5, 30, 300]
+
+ self.last_update = {}
+ t = time.time()
+ for i in self.intervals:
+ self.stats[i] = {}
+ self.last_update[i] = t
+ self.count[i] = 0
+
+ self.config = configmanager.ConfigManager('stats.conf', DEFAULT_PREFS)
+ self.saved_stats = configmanager.ConfigManager('stats.totals', DEFAULT_TOTALS)
+ if self.totals == {}:
+ self.totals.update(self.saved_stats.config)
+
+ self.length = self.config['length']
+
+ # self.stats = get_key(self.saved_stats, 'stats') or {}
+ self.stats_keys = ['peer.num_peers_half_open', 'dht.dht_node_cache']
+ self.add_stats(
+ 'upload_rate',
+ 'download_rate',
+ 'dht_nodes',
+ 'dht_cache_nodes',
+ 'dht_torrents',
+ 'num_peers',
+ 'num_connections',
+ )
+
+ self.update_stats()
+
+ self.update_timer = LoopingCall(self.update_stats)
+ self.update_timer.start(self.config['update_interval'])
+
+ self.save_timer = LoopingCall(self.save_stats)
+ self.save_timer.start(60)
+
+ def disable(self):
+ self.update_timer.stop() if self.update_timer.running else None
+ self.save_timer.stop() if self.save_timer.running else None
+ self.save_stats()
+
+ def add_stats(self, *stats):
+ for stat in stats:
+ if stat not in self.stats_keys:
+ self.stats_keys.append(stat)
+ for i in self.intervals:
+ if stat not in self.stats[i]:
+ self.stats[i][stat] = []
+
+ def update_stats(self):
+ # Get all possible stats!
+ stats = {}
+ for key in self.stats_keys:
+ # try all keys we have, very inefficient but saves having to
+ # work out where a key comes from...
+ try:
+ stats.update(self.core.get_session_status([key]))
+ except AttributeError:
+ pass
+ stats['num_connections'] = (
+ stats['num_peers'] + stats['peer.num_peers_half_open']
+ )
+ stats['dht_cache_nodes'] = stats['dht.dht_node_cache']
+ stats.update(
+ self.core.get_config_values(
+ ['max_download', 'max_upload', 'max_num_connections']
+ )
+ )
+ # status = self.core.session.status()
+ # for stat in dir(status):
+ # if not stat.startswith('_') and stat not in stats:
+ # stats[stat] = getattr(status, stat, None)
+
+ update_time = time.time()
+ self.last_update[1] = update_time
+
+ # extract the ones we are interested in
+ # adding them to the 1s array
+ for stat, stat_list in self.stats[1].items():
+ if stat in stats:
+ stat_list.insert(0, int(stats[stat]))
+ else:
+ stat_list.insert(0, 0)
+ if len(stat_list) > self.length:
+ stat_list.pop()
+
+ def update_interval(interval, base, multiplier):
+ self.count[interval] = self.count[interval] + 1
+ if self.count[interval] >= interval:
+ self.last_update[interval] = update_time
+ self.count[interval] = 0
+ current_stats = self.stats[interval]
+ for stat, stat_list in self.stats[base].items():
+ try:
+ avg = mean(stat_list[0:multiplier])
+ except ValueError:
+ avg = 0
+ current_stats[stat].insert(0, avg)
+ if len(current_stats[stat]) > self.length:
+ current_stats[stat].pop()
+
+ update_interval(5, 1, 5)
+ update_interval(30, 5, 6)
+ update_interval(300, 30, 10)
+
+ def save_stats(self):
+ self.saved_stats['stats'] = self.stats
+ self.saved_stats.config.update(self.get_totals())
+ self.saved_stats.save()
+
+ # export:
+ @export
+ def get_stats(self, keys, interval):
+ if interval not in self.intervals:
+ return None
+
+ stats_dict = {}
+ for key in keys:
+ if key in self.stats[interval]:
+ stats_dict[key] = self.stats[interval][key]
+
+ stats_dict['_last_update'] = self.last_update[interval]
+ stats_dict['_length'] = self.config['length']
+ stats_dict['_update_interval'] = interval
+ return stats_dict
+
+ @export
+ def get_totals(self):
+ result = {}
+ session_totals = self.get_session_totals()
+ for key in session_totals:
+ result[key] = self.totals[key] + session_totals[key]
+ return result
+
+ @export
+ def get_session_totals(self):
+ return self.core.get_session_status(
+ [
+ 'total_upload',
+ 'total_download',
+ 'total_payload_upload',
+ 'total_payload_download',
+ ]
+ )
+
+ @export
+ def set_config(self, config):
+ """Sets the config dictionary."""
+ for key in config:
+ self.config[key] = config[key]
+ self.config.save()
+
+ @export
+ def get_config(self):
+ """Returns the config dictionary."""
+ return self.config.config
+
+ @export
+ def get_intervals(self):
+ """Returns the available resolutions."""
+ return self.intervals
diff --git a/deluge/plugins/Stats/deluge_stats/data/config.ui b/deluge/plugins/Stats/deluge_stats/data/config.ui
new file mode 100644
index 0000000..326598b
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/data/config.ui
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkWindow" id="window1">
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="prefs_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">15</property>
+ <child>
+ <object class="GtkTable" id="table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">10</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">15</property>
+ <child>
+ <object class="GtkColorButton" id="bandwidth_graph_download_rate_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Download color:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Upload color:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="bandwidth_graph_upload_rate_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Connections Graph&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Bandwidth Graph&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="connections_graph_dht_nodes_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">DHT nodes:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="connections_graph_dht_cache_nodes_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Cached DHT nodes:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">DHT torrents:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Connections:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="connections_graph_dht_torrents_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="connections_graph_num_connections_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Seeds / Peers&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">8</property>
+ <property name="bottom_attach">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="seeds_graph_num_peers_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">9</property>
+ <property name="bottom_attach">10</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Peers:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="top_attach">9</property>
+ <property name="bottom_attach">10</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Graph Colors&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/Stats/deluge_stats/data/config.ui~ b/deluge/plugins/Stats/deluge_stats/data/config.ui~
new file mode 100644
index 0000000..25fc029
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/data/config.ui~
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkWindow" id="window1">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkVBox" id="prefs_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">15</property>
+ <child>
+ <object class="GtkTable" id="table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">10</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">15</property>
+ <child>
+ <object class="GtkColorButton" id="bandwidth_graph_download_rate_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Download color:</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Upload color:</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="bandwidth_graph_upload_rate_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;b&gt;Connections Graph&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;b&gt;Bandwidth Graph&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="connections_graph_dht_nodes_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">DHT nodes:</property>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="connections_graph_dht_cache_nodes_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Cached DHT nodes:</property>
+ </object>
+ <packing>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">DHT torrents:</property>
+ </object>
+ <packing>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Connections:</property>
+ </object>
+ <packing>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="connections_graph_dht_torrents_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="connections_graph_num_connections_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;b&gt;Seeds / Peers&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">8</property>
+ <property name="bottom_attach">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="seeds_graph_num_peers_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">9</property>
+ <property name="bottom_attach">10</property>
+ <property name="x_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Peers:</property>
+ </object>
+ <packing>
+ <property name="top_attach">9</property>
+ <property name="bottom_attach">10</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Graph Colors&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/Stats/deluge_stats/data/stats.js b/deluge/plugins/Stats/deluge_stats/data/stats.js
new file mode 100644
index 0000000..8f9e3f8
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/data/stats.js
@@ -0,0 +1,27 @@
+/**
+ * Script: stats.js
+ * The javascript client-side code for the Stats plugin.
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+StatsPlugin = Ext.extend(Deluge.Plugin, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ name: 'Stats',
+ },
+ config
+ );
+ StatsPlugin.superclass.constructor.call(this, config);
+ },
+
+ onDisable: function() {},
+
+ onEnable: function() {},
+});
+new StatsPlugin();
diff --git a/deluge/plugins/Stats/deluge_stats/data/tabs.ui b/deluge/plugins/Stats/deluge_stats/data/tabs.ui
new file mode 100644
index 0000000..4b35765
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/data/tabs.ui
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkWindow" id="window1">
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="graph_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="graph_label_text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Stats</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="graph_tab">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Resolution</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="combo_intervals">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="graph_notebook">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tab_pos">left</property>
+ <child>
+ <object class="GtkDrawingArea" id="bandwidth_graph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="bandwidth_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Bandwidth</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkDrawingArea" id="connections_graph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="connections_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Connections</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkDrawingArea" id="seeds_graph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="seeds_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Seeds/Peers</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/Stats/deluge_stats/graph.py b/deluge/plugins/Stats/deluge_stats/graph.py
new file mode 100644
index 0000000..847c253
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/graph.py
@@ -0,0 +1,338 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Ian Martin <ianmartin@cantab.net>
+# Copyright (C) 2008 Damien Churchill <damoxc@gmail.com>
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007 Marcos Mobley <markybob@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""
+port of old plugin by markybob.
+"""
+
+from __future__ import division, unicode_literals
+
+import logging
+import math
+import time
+
+from gi.repository import cairo
+
+log = logging.getLogger(__name__)
+
+black = (0, 0, 0)
+gray = (0.75, 0.75, 0.75)
+white = (1.0, 1.0, 1.0)
+darkred = (0.65, 0, 0)
+red = (1.0, 0, 0)
+green = (0, 1.0, 0)
+blue = (0, 0, 1.0)
+orange = (1.0, 0.74, 0)
+
+
+def default_formatter(value):
+ return str(value)
+
+
+def size_formatter_scale(value):
+ scale = 1.0
+ for i in range(0, 3):
+ scale = scale * 1024.0
+ if value // scale < 1024:
+ return scale
+
+
+def change_opacity(color, opactiy):
+ """A method to assist in changing the opactiy of a color inorder to draw the
+ fills.
+ """
+ color = list(color)
+ if len(color) == 4:
+ color[3] = opactiy
+ else:
+ color.append(opactiy)
+ return tuple(color)
+
+
+class Graph(object):
+ def __init__(self):
+ self.width = 100
+ self.height = 100
+ self.length = 150
+ self.stat_info = {}
+ self.line_size = 2
+ self.dash_length = [10]
+ self.mean_selected = True
+ self.legend_selected = True
+ self.max_selected = True
+ self.black = (0, 0, 0)
+ self.interval = 2 # 2 secs
+ self.text_bg = (255, 255, 255, 128) # prototyping
+ self.set_left_axis()
+
+ def set_left_axis(self, **kargs):
+ self.left_axis = kargs
+
+ def add_stat(self, stat, label='', axis='left', line=True, fill=True, color=None):
+ self.stat_info[stat] = {
+ 'axis': axis,
+ 'label': label,
+ 'line': line,
+ 'fill': fill,
+ 'color': color,
+ }
+
+ def set_stats(self, stats):
+ self.last_update = stats['_last_update']
+ del stats['_last_update']
+ self.length = stats['_length']
+ del stats['_length']
+ self.interval = stats['_update_interval']
+ del stats['_update_interval']
+ self.stats = stats
+ return
+
+ # def set_config(self, config):
+ # self.length = config["length"]
+ # self.interval = config["update_interval"]
+
+ def set_interval(self, interval):
+ self.interval = interval
+
+ def draw_to_context(self, context, width, height):
+ self.ctx = context
+ self.width, self.height = width, height
+ self.draw_rect(white, 0, 0, self.width, self.height)
+ self.draw_graph()
+ return self.ctx
+
+ def draw(self, width, height):
+ surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
+ ctx = cairo.Context(surface)
+ self.draw_to_context(ctx, width, height)
+ return surface
+
+ def draw_x_axis(self, bounds):
+ (left, top, right, bottom) = bounds
+ duration = self.length * self.interval
+ start = self.last_update - duration
+ ratio = (right - left) / duration
+
+ if duration < 1800 * 10:
+ # try rounding to nearest 1min, 5mins, 10mins, 30mins
+ for step in [60, 300, 600, 1800]:
+ if duration // step < 10:
+ x_step = step
+ break
+ else:
+ # If there wasnt anything useful find a nice fitting hourly divisor
+ x_step = ((duration // 5) // 3600) * 3600
+
+ # this doesnt allow for dst and timezones...
+ seconds_to_step = math.ceil(start / x_step) * x_step - start
+
+ for i in range(0, duration // x_step + 1):
+ text = time.strftime(
+ '%H:%M', time.localtime(start + seconds_to_step + i * x_step)
+ )
+ # + 0.5 to allign x to nearest pixel
+ x = int(ratio * (seconds_to_step + i * x_step) + left) + 0.5
+ self.draw_x_text(text, x, bottom)
+ self.draw_dotted_line(gray, x, top - 0.5, x, bottom + 0.5)
+
+ self.draw_line(gray, left, bottom + 0.5, right, bottom + 0.5)
+
+ def draw_graph(self):
+ font_extents = self.ctx.font_extents()
+ x_axis_space = font_extents[2] + 2 + self.line_size / 2
+ plot_height = self.height - x_axis_space
+ # lets say we need 2n-1*font height pixels to plot the y ticks
+ tick_limit = plot_height / font_extents[3]
+
+ max_value = 0
+ for stat in self.stat_info:
+ if self.stat_info[stat]['axis'] == 'left':
+ try:
+ l_max = max(self.stats[stat])
+ except ValueError:
+ l_max = 0
+ if l_max > max_value:
+ max_value = l_max
+ if max_value < self.left_axis['min']:
+ max_value = self.left_axis['min']
+
+ y_ticks = self.intervalise(max_value, tick_limit)
+ max_value = y_ticks[-1]
+ # find the width of the y_ticks
+ y_tick_text = [self.left_axis['formatter'](tick) for tick in y_ticks]
+
+ def space_required(text):
+ te = self.ctx.text_extents(text)
+ return math.ceil(te[4] - te[0])
+
+ y_tick_width = max((space_required(text) for text in y_tick_text))
+
+ top = font_extents[2] / 2
+ # bounds(left, top, right, bottom)
+ bounds = (y_tick_width + 4, top + 2, self.width, self.height - x_axis_space)
+
+ self.draw_x_axis(bounds)
+ self.draw_left_axis(bounds, y_ticks, y_tick_text)
+
+ def intervalise(self, x, limit=None):
+ """Given a value x create an array of tick points to got with the graph
+ The number of ticks returned can be constrained by limit, minimum of 3
+ """
+ # Limit is the number of ticks which is 1 + the number of steps as we
+ # count the 0 tick in limit
+ if limit is not None:
+ if limit < 3:
+ limit = 2
+ else:
+ limit = limit - 1
+ scale = 1
+ if 'formatter_scale' in self.left_axis:
+ scale = self.left_axis['formatter_scale'](x)
+ x = x / scale
+
+ # Find the largest power of 10 less than x
+ comm_log = math.log10(x)
+ intbit = math.floor(comm_log)
+
+ interval = math.pow(10, intbit)
+ steps = int(math.ceil(x / interval))
+
+ if steps <= 1 and (limit is None or limit >= 10 * steps):
+ interval = interval * 0.1
+ steps = steps * 10
+ elif steps <= 2 and (limit is None or limit >= 5 * steps):
+ interval = interval * 0.2
+ steps = steps * 5
+ elif steps <= 5 and (limit is None or limit >= 2 * steps):
+ interval = interval * 0.5
+ steps = steps * 2
+
+ if limit is not None and steps > limit:
+ multi = steps / limit
+ if multi > 2:
+ interval = interval * 5
+ else:
+ interval = interval * 2
+
+ intervals = [
+ i * interval * scale for i in range(1 + int(math.ceil(x / interval)))
+ ]
+ return intervals
+
+ def draw_left_axis(self, bounds, y_ticks, y_tick_text):
+ (left, top, right, bottom) = bounds
+ stats = {}
+ for stat in self.stat_info:
+ if self.stat_info[stat]['axis'] == 'left':
+ stats[stat] = self.stat_info[stat]
+ stats[stat]['values'] = self.stats[stat]
+ stats[stat]['fill_color'] = change_opacity(stats[stat]['color'], 0.5)
+ stats[stat]['color'] = change_opacity(stats[stat]['color'], 0.8)
+
+ height = bottom - top
+ max_value = y_ticks[-1]
+ ratio = height / max_value
+
+ for i, y_val in enumerate(y_ticks):
+ y = int(bottom - y_val * ratio) - 0.5
+ if i != 0:
+ self.draw_dotted_line(gray, left, y, right, y)
+ self.draw_y_text(y_tick_text[i], left, y)
+ self.draw_line(gray, left, top, left, bottom)
+
+ for stat, info in stats.items():
+ if len(info['values']) > 0:
+ self.draw_value_poly(info['values'], info['color'], max_value, bounds)
+ self.draw_value_poly(
+ info['values'], info['fill_color'], max_value, bounds, info['fill']
+ )
+
+ def draw_legend(self):
+ pass
+
+ def trace_path(self, values, max_value, bounds):
+ (left, top, right, bottom) = bounds
+ ratio = (bottom - top) / max_value
+ line_width = self.line_size
+
+ self.ctx.set_line_width(line_width)
+ self.ctx.move_to(right, bottom)
+
+ self.ctx.line_to(right, int(bottom - values[0] * ratio))
+
+ x = right
+ step = (right - left) / (self.length - 1)
+ for i, value in enumerate(values):
+ if i == self.length - 1:
+ x = left
+
+ self.ctx.line_to(x, int(bottom - value * ratio))
+ x -= step
+
+ self.ctx.line_to(int(right - (len(values) - 1) * step), bottom)
+ self.ctx.close_path()
+
+ def draw_value_poly(self, values, color, max_value, bounds, fill=False):
+ self.trace_path(values, max_value, bounds)
+ self.ctx.set_source_rgba(*color)
+
+ if fill:
+ self.ctx.fill()
+ else:
+ self.ctx.stroke()
+
+ def draw_x_text(self, text, x, y):
+ """Draws text below and horizontally centered about x,y"""
+ fe = self.ctx.font_extents()
+ te = self.ctx.text_extents(text)
+ height = fe[2]
+ x_bearing = te[0]
+ width = te[2]
+ self.ctx.move_to(int(x - width / 2 + x_bearing), int(y + height))
+ self.ctx.set_source_rgba(*self.black)
+ self.ctx.show_text(text)
+
+ def draw_y_text(self, text, x, y):
+ """Draws text left of and vertically centered about x,y"""
+ fe = self.ctx.font_extents()
+ te = self.ctx.text_extents(text)
+ descent = fe[1]
+ ascent = fe[0]
+ x_bearing = te[0]
+ width = te[4]
+ self.ctx.move_to(
+ int(x - width - x_bearing - 2), int(y + (ascent - descent) / 2)
+ )
+ self.ctx.set_source_rgba(*self.black)
+ self.ctx.show_text(text)
+
+ def draw_rect(self, color, x, y, height, width):
+ self.ctx.set_source_rgba(*color)
+ self.ctx.rectangle(x, y, height, width)
+ self.ctx.fill()
+
+ def draw_line(self, color, x1, y1, x2, y2):
+ self.ctx.set_source_rgba(*color)
+ self.ctx.set_line_width(1)
+ self.ctx.move_to(x1, y1)
+ self.ctx.line_to(x2, y2)
+ self.ctx.stroke()
+
+ def draw_dotted_line(self, color, x1, y1, x2, y2):
+ self.ctx.set_source_rgba(*color)
+ self.ctx.set_line_width(1)
+ dash, offset = self.ctx.get_dash()
+ self.ctx.set_dash(self.dash_length, 0)
+ self.ctx.move_to(x1, y1)
+ self.ctx.line_to(x2, y2)
+ self.ctx.stroke()
+ self.ctx.set_dash(dash, offset)
diff --git a/deluge/plugins/Stats/deluge_stats/gtkui.py b/deluge/plugins/Stats/deluge_stats/gtkui.py
new file mode 100644
index 0000000..75e3015
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/gtkui.py
@@ -0,0 +1,296 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Ian Martin <ianmartin@cantab.net>
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import logging
+
+from gi.repository import Gtk
+from gi.repository.Gdk import RGBA
+
+import deluge
+from deluge import component
+from deluge.common import fspeed
+from deluge.plugins.pluginbase import Gtk3PluginBase
+from deluge.ui.client import client
+from deluge.ui.gtk3.torrentdetails import Tab
+
+from .common import get_resource
+from .graph import Graph, size_formatter_scale
+
+log = logging.getLogger(__name__)
+
+# Gdk.RGBA textual spec
+RED = 'rgb(255,0,0)'
+GREEN = 'rgb(0,128,0)'
+BLUE = 'rgb(0,0,255)'
+DARKRED = 'rgb(139,0,0)'
+ORANGE = 'rgb(255,165,0)'
+
+DEFAULT_CONF = {
+ 'version': 2,
+ 'colors': {
+ 'bandwidth_graph': {'upload_rate': BLUE, 'download_rate': GREEN},
+ 'connections_graph': {
+ 'dht_nodes': ORANGE,
+ 'dht_cache_nodes': BLUE,
+ 'dht_torrents': GREEN,
+ 'num_connections': DARKRED,
+ },
+ 'seeds_graph': {'num_peers': BLUE},
+ },
+}
+
+
+def neat_time(column, cell, model, data):
+ """Render seconds as seconds or minutes with label"""
+ seconds = model.get_value(data, 0)
+ if seconds > 60:
+ text = '%d %s' % (seconds // 60, _('minutes'))
+ elif seconds == 60:
+ text = _('1 minute')
+ elif seconds == 1:
+ text = _('1 second')
+ else:
+ text = '%d %s' % (seconds, _('seconds'))
+ cell.set_property('text', text)
+ return
+
+
+def int_str(number):
+ return str(int(number))
+
+
+def fspeed_shortform(value):
+ return fspeed(value, shortform=True)
+
+
+def text_to_rgba(color):
+ """Turns a Color into a tuple with range 0-1 as used by the graph"""
+ color_rgba = RGBA()
+ color_rgba.parse(color)
+ return color_rgba
+
+
+class GraphsTab(Tab):
+ def __init__(self, colors):
+ super(GraphsTab, self).__init__()
+
+ builder = Gtk.Builder()
+ builder.add_from_file(get_resource('tabs.ui'))
+ self.window = builder.get_object('graph_tab')
+ self.notebook = builder.get_object('graph_notebook')
+ self.label = builder.get_object('graph_label')
+
+ self._name = 'Stats'
+ self._child_widget = self.window
+ self._tab_label = self.label
+
+ self.colors = colors
+
+ self.bandwidth_graph = builder.get_object('bandwidth_graph')
+ self.bandwidth_graph.connect('draw', self.on_graph_draw)
+
+ self.connections_graph = builder.get_object('connections_graph')
+ self.connections_graph.connect('draw', self.on_graph_draw)
+
+ self.seeds_graph = builder.get_object('seeds_graph')
+ self.seeds_graph.connect('draw', self.on_graph_draw)
+
+ self.notebook.connect('switch-page', self._on_notebook_switch_page)
+
+ self.selected_interval = 1 # Should come from config or similar
+ self.select_bandwidth_graph()
+
+ self.window.unparent()
+ self.label.unparent()
+
+ self.intervals = None
+ self.intervals_combo = builder.get_object('combo_intervals')
+ cell = Gtk.CellRendererText()
+ self.intervals_combo.pack_start(cell, True)
+ self.intervals_combo.set_cell_data_func(cell, neat_time)
+ self.intervals_combo.connect('changed', self._on_selected_interval_changed)
+ self.update_intervals()
+
+ def on_graph_draw(self, widget, context):
+ self.graph.draw_to_context(
+ context,
+ self.graph_widget.get_allocated_width(),
+ self.graph_widget.get_allocated_height(),
+ )
+ # Do not propagate the event
+ return True
+
+ def update(self):
+ d1 = client.stats.get_stats(list(self.graph.stat_info), self.selected_interval)
+ d1.addCallback(self.graph.set_stats)
+
+ def _update_complete(result):
+ self.graph_widget.queue_draw()
+ return result
+
+ d1.addCallback(_update_complete)
+ return d1
+
+ def clear(self):
+ pass
+
+ def update_intervals(self):
+ client.stats.get_intervals().addCallback(self._on_intervals_changed)
+
+ def select_bandwidth_graph(self):
+ log.debug('Selecting bandwidth graph')
+ self.graph_widget = self.bandwidth_graph
+ self.graph = Graph()
+ colors = self.colors['bandwidth_graph']
+ self.graph.add_stat(
+ 'download_rate',
+ label='Download Rate',
+ color=text_to_rgba(colors['download_rate']),
+ )
+ self.graph.add_stat(
+ 'upload_rate',
+ label='Upload Rate',
+ color=text_to_rgba(colors['upload_rate']),
+ )
+ self.graph.set_left_axis(
+ formatter=fspeed_shortform, min=10240, formatter_scale=size_formatter_scale
+ )
+
+ def select_connections_graph(self):
+ log.debug('Selecting connections graph')
+ self.graph_widget = self.connections_graph
+ g = Graph()
+ self.graph = g
+ colors = self.colors['connections_graph']
+ g.add_stat('dht_nodes', color=text_to_rgba(colors['dht_nodes']))
+ g.add_stat('dht_cache_nodes', color=text_to_rgba(colors['dht_cache_nodes']))
+ g.add_stat('dht_torrents', color=text_to_rgba(colors['dht_torrents']))
+ g.add_stat('num_connections', color=text_to_rgba(colors['num_connections']))
+ g.set_left_axis(formatter=int_str, min=10)
+
+ def select_seeds_graph(self):
+ log.debug('Selecting connections graph')
+ self.graph_widget = self.seeds_graph
+ self.graph = Graph()
+ colors = self.colors['seeds_graph']
+ self.graph.add_stat('num_peers', color=text_to_rgba(colors['num_peers']))
+ self.graph.set_left_axis(formatter=int_str, min=10)
+
+ def set_colors(self, colors):
+ self.colors = colors
+ # Fake switch page to update the graph colors (HACKY)
+ self._on_notebook_switch_page(
+ self.notebook, None, self.notebook.get_current_page() # This is unused
+ )
+
+ def _on_intervals_changed(self, intervals):
+ liststore = Gtk.ListStore(int)
+ for inter in intervals:
+ liststore.append([inter])
+ self.intervals_combo.set_model(liststore)
+ try:
+ current = intervals.index(self.selected_interval)
+ except Exception:
+ current = 0
+ # should select the value saved in config
+ self.intervals_combo.set_active(current)
+
+ def _on_selected_interval_changed(self, combobox):
+ model = combobox.get_model()
+ tree_iter = combobox.get_active_iter()
+ self.selected_interval = model.get_value(tree_iter, 0)
+ self.update()
+ return True
+
+ def _on_notebook_switch_page(self, notebook, page, page_num):
+ p = notebook.get_nth_page(page_num)
+ if p is self.bandwidth_graph:
+ self.select_bandwidth_graph()
+ self.update()
+ elif p is self.connections_graph:
+ self.select_connections_graph()
+ self.update()
+ elif p is self.seeds_graph:
+ self.select_seeds_graph()
+ self.update()
+ return True
+
+
+class GtkUI(Gtk3PluginBase):
+ def enable(self):
+ log.debug('Stats plugin enable called')
+ self.config = deluge.configmanager.ConfigManager(
+ 'stats.gtk3ui.conf', DEFAULT_CONF
+ )
+
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(get_resource('config.ui'))
+
+ component.get('Preferences').add_page(
+ 'Stats', self.builder.get_object('prefs_box')
+ )
+ component.get('PluginManager').register_hook(
+ 'on_apply_prefs', self.on_apply_prefs
+ )
+ component.get('PluginManager').register_hook(
+ 'on_show_prefs', self.on_show_prefs
+ )
+ self.on_show_prefs()
+
+ self.graphs_tab = GraphsTab(self.config['colors'])
+ self.torrent_details = component.get('TorrentDetails')
+ self.torrent_details.add_tab(self.graphs_tab)
+
+ def disable(self):
+ component.get('Preferences').remove_page('Stats')
+ component.get('PluginManager').deregister_hook(
+ 'on_apply_prefs', self.on_apply_prefs
+ )
+ component.get('PluginManager').deregister_hook(
+ 'on_show_prefs', self.on_show_prefs
+ )
+ self.torrent_details.remove_tab(self.graphs_tab.get_name())
+
+ def on_apply_prefs(self):
+ log.debug('applying prefs for Stats')
+ gtkconf = {}
+ for graph, colors in self.config['colors'].items():
+ gtkconf[graph] = {}
+ for value, color in colors.items():
+ color_btn = self.builder.get_object('%s_%s_color' % (graph, value))
+ try:
+ gtkconf[graph][value] = color_btn.get_color().to_string()
+ except Exception:
+ gtkconf[graph][value] = DEFAULT_CONF['colors'][graph][value]
+ self.config['colors'] = gtkconf
+ self.graphs_tab.set_colors(self.config['colors'])
+
+ config = {}
+ client.stats.set_config(config)
+
+ def on_show_prefs(self):
+ for graph, colors in self.config['colors'].items():
+ for value, color in colors.items():
+ try:
+ color_btn = self.builder.get_object('%s_%s_color' % (graph, value))
+ color_btn.set_rgba(text_to_rgba(color))
+ except Exception as ex:
+ log.debug('Unable to set %s %s %s: %s', graph, value, color, ex)
+ client.stats.get_config().addCallback(self.cb_get_config)
+
+ def cb_get_config(self, config):
+ """Callback for on show_prefs."""
+ pass
diff --git a/deluge/plugins/Stats/deluge_stats/template/graph.html b/deluge/plugins/Stats/deluge_stats/template/graph.html
new file mode 100644
index 0000000..2ff803b
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/template/graph.html
@@ -0,0 +1,12 @@
+$:render.header(_("Network Graph"), 'graph')
+$:render.admin_toolbar('graph')
+
+<div style="padding-left:20px">
+
+<img src="$base/graph/network.png?height=300&width=1000"><br \>
+<img src="$base/graph/connections.png?height=300&width=1000"><br \>
+</div>
+
+
+
+$:render.footer()
diff --git a/deluge/plugins/Stats/deluge_stats/tests/__init__.py b/deluge/plugins/Stats/deluge_stats/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/tests/__init__.py
diff --git a/deluge/plugins/Stats/deluge_stats/tests/test.html b/deluge/plugins/Stats/deluge_stats/tests/test.html
new file mode 100644
index 0000000..7af5f15
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/tests/test.html
@@ -0,0 +1,9 @@
+<html>
+ <head>
+ <meta http-equiv="refresh" content="2" />
+ </head>
+ <body>
+ <img src="output_async.png" /> <br />
+ <img src="output_dht.png" />
+ </body>
+</html>
diff --git a/deluge/plugins/Stats/deluge_stats/tests/test_stats.py b/deluge/plugins/Stats/deluge_stats/tests/test_stats.py
new file mode 100644
index 0000000..3b581be
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/tests/test_stats.py
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+from __future__ import print_function, unicode_literals
+
+import pytest
+from twisted.internet import defer
+from twisted.trial import unittest
+
+import deluge.component as component
+from deluge.common import fsize, fspeed
+from deluge.tests import common as tests_common
+from deluge.tests.basetest import BaseTestCase
+from deluge.ui.client import client
+
+
+def print_totals(totals):
+ for name, value in totals.items():
+ print(name, fsize(value))
+
+ print('overhead:')
+ print('up:', fsize(totals['total_upload'] - totals['total_payload_upload']))
+ print('down:', fsize(totals['total_download'] - totals['total_payload_download']))
+
+
+class StatsTestCase(BaseTestCase):
+ def set_up(self):
+ defer.setDebugging(True)
+ tests_common.set_tmp_config_dir()
+ client.start_standalone()
+ client.core.enable_plugin('Stats')
+ return component.start()
+
+ def tear_down(self):
+ client.stop_standalone()
+ return component.shutdown()
+
+ @defer.inlineCallbacks
+ def test_client_totals(self):
+ plugins = yield client.core.get_available_plugins()
+ if 'Stats' not in plugins:
+ raise unittest.SkipTest('WebUi plugin not available for testing')
+
+ totals = yield client.stats.get_totals()
+ self.assertEqual(totals['total_upload'], 0)
+ self.assertEqual(totals['total_payload_upload'], 0)
+ self.assertEqual(totals['total_payload_download'], 0)
+ self.assertEqual(totals['total_download'], 0)
+ # print_totals(totals)
+
+ @defer.inlineCallbacks
+ def test_session_totals(self):
+ plugins = yield client.core.get_available_plugins()
+ if 'Stats' not in plugins:
+ raise unittest.SkipTest('WebUi plugin not available for testing')
+
+ totals = yield client.stats.get_session_totals()
+ self.assertEqual(totals['total_upload'], 0)
+ self.assertEqual(totals['total_payload_upload'], 0)
+ self.assertEqual(totals['total_payload_download'], 0)
+ self.assertEqual(totals['total_download'], 0)
+ # print_totals(totals)
+
+ @pytest.mark.gtkui
+ @defer.inlineCallbacks
+ def test_write(self):
+ """
+ writing to a file-like object; need this for webui.
+
+ Not strictly a unit test, but tests if calls do not fail...
+ """
+ from deluge.ui.gtkui.gtkui import DEFAULT_PREFS
+ from deluge.ui.gtkui.preferences import Preferences
+ from deluge.ui.gtkui.mainwindow import MainWindow
+ from deluge.configmanager import ConfigManager
+ from deluge.ui.gtkui.pluginmanager import PluginManager
+ from deluge.ui.gtkui.torrentdetails import TorrentDetails
+ from deluge.ui.gtkui.torrentview import TorrentView
+ from deluge_stats import graph, gtkui
+
+ ConfigManager('gtkui.conf', defaults=DEFAULT_PREFS)
+
+ self.plugins = PluginManager()
+ MainWindow()
+ TorrentView()
+ TorrentDetails()
+ Preferences()
+
+ class FakeFile(object):
+ def __init__(self):
+ self.data = []
+
+ def write(self, data):
+ self.data.append(data)
+
+ stats_gtkui = gtkui.GtkUI('test_stats')
+ stats_gtkui.enable()
+ yield stats_gtkui.graphs_tab.update()
+
+ g = stats_gtkui.graphs_tab.graph
+ g.add_stat('download_rate', color=graph.green)
+ g.add_stat('upload_rate', color=graph.blue)
+ g.set_left_axis(formatter=fspeed, min=10240)
+
+ surface = g.draw(900, 150)
+ file_like = FakeFile()
+ surface.write_to_png(file_like)
+ data = b''.join(file_like.data)
+ with open('file_like.png', 'wb') as _file:
+ _file.write(data)
diff --git a/deluge/plugins/Stats/deluge_stats/webui.py b/deluge/plugins/Stats/deluge_stats/webui.py
new file mode 100644
index 0000000..4c11260
--- /dev/null
+++ b/deluge/plugins/Stats/deluge_stats/webui.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.plugins.pluginbase import WebPluginBase
+
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+
+class WebUI(WebPluginBase):
+
+ scripts = [get_resource('stats.js')]
+
+ # The enable and disable methods are not scrictly required on the WebUI
+ # plugins. They are only here if you need to register images/stylesheets
+ # with the webserver.
+ def enable(self):
+ log.debug('Stats Web plugin enabled!')
+
+ def disable(self):
+ log.debug('Stats Web plugin disabled!')
diff --git a/deluge/plugins/Stats/setup.py b/deluge/plugins/Stats/setup.py
new file mode 100644
index 0000000..174c652
--- /dev/null
+++ b/deluge/plugins/Stats/setup.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Ian Martin <ianmartin@cantab.net>
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from setuptools import find_packages, setup
+
+__plugin_name__ = 'Stats'
+__author__ = 'Ian Martin'
+__author_email__ = 'ianmartin@cantab.net'
+__version__ = '0.4'
+__url__ = 'http://deluge-torrent.org'
+__license__ = 'GPLv3'
+__description__ = 'Display stats graphs'
+__long_description__ = """
+Records lots of extra stats
+and produces time series
+graphs"""
+__pkg_data__ = {'deluge_' + __plugin_name__.lower(): ['template/*', 'data/*']}
+
+setup(
+ name=__plugin_name__,
+ version=__version__,
+ description=__description__,
+ author=__author__,
+ author_email=__author_email__,
+ url=__url__,
+ license=__license__,
+ long_description=__long_description__,
+ packages=find_packages(),
+ package_data=__pkg_data__,
+ entry_points="""
+ [deluge.plugin.core]
+ %s = deluge_%s:CorePlugin
+ [deluge.plugin.gtk3ui]
+ %s = deluge_%s:GtkUIPlugin
+ [deluge.plugin.web]
+ %s = deluge_%s:WebUIPlugin
+ """
+ % ((__plugin_name__, __plugin_name__.lower()) * 3),
+)
diff --git a/deluge/plugins/Toggle/deluge_toggle/__init__.py b/deluge/plugins/Toggle/deluge_toggle/__init__.py
new file mode 100644
index 0000000..e63e4aa
--- /dev/null
+++ b/deluge/plugins/Toggle/deluge_toggle/__init__.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2010 John Garland <johnnybg+deluge@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.plugins.init import PluginInitBase
+
+
+class CorePlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .core import Core as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(CorePlugin, self).__init__(plugin_name)
+
+
+class GtkUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .gtkui import GtkUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(GtkUIPlugin, self).__init__(plugin_name)
+
+
+class WebUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .webui import WebUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(WebUIPlugin, self).__init__(plugin_name)
diff --git a/deluge/plugins/Toggle/deluge_toggle/common.py b/deluge/plugins/Toggle/deluge_toggle/common.py
new file mode 100644
index 0000000..4c9db09
--- /dev/null
+++ b/deluge/plugins/Toggle/deluge_toggle/common.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# 2009 Damien Churchill <damoxc@gmail.com>
+# 2010 Pedro Algarvio <pedro@algarvio.me>
+# 2017 Calum Lind <calumlind+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os.path
+
+from pkg_resources import resource_filename
+
+
+def get_resource(filename):
+ return resource_filename(__package__, os.path.join('data', filename))
diff --git a/deluge/plugins/Toggle/deluge_toggle/core.py b/deluge/plugins/Toggle/deluge_toggle/core.py
new file mode 100644
index 0000000..dad52ce
--- /dev/null
+++ b/deluge/plugins/Toggle/deluge_toggle/core.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2010 John Garland <johnnybg+deluge@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+from deluge.core.rpcserver import export
+from deluge.plugins.pluginbase import CorePluginBase
+
+log = logging.getLogger(__name__)
+
+DEFAULT_PREFS = {}
+
+
+class Core(CorePluginBase):
+ def enable(self):
+ self.core = component.get('Core')
+
+ def disable(self):
+ pass
+
+ def update(self):
+ pass
+
+ @export
+ def get_status(self):
+ return self.core.session.is_paused()
+
+ @export
+ def toggle(self):
+ if self.core.session.is_paused():
+ self.core.resume_session()
+ paused = False
+ else:
+ self.core.pause_session()
+ paused = True
+ return paused
diff --git a/deluge/plugins/Toggle/deluge_toggle/data/toggle.js b/deluge/plugins/Toggle/deluge_toggle/data/toggle.js
new file mode 100644
index 0000000..8e9a045
--- /dev/null
+++ b/deluge/plugins/Toggle/deluge_toggle/data/toggle.js
@@ -0,0 +1,27 @@
+/**
+ * Script: toggle.js
+ * The client-side javascript code for the Toggle plugin.
+ *
+ * Copyright (C) John Garland 2010 <johnnybg+deluge@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+TogglePlugin = Ext.extend(Deluge.Plugin, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ name: 'Toggle',
+ },
+ config
+ );
+ TogglePlugin.superclass.constructor.call(this, config);
+ },
+
+ onDisable: function() {},
+
+ onEnable: function() {},
+});
+new TogglePlugin();
diff --git a/deluge/plugins/Toggle/deluge_toggle/gtkui.py b/deluge/plugins/Toggle/deluge_toggle/gtkui.py
new file mode 100644
index 0000000..c54bca4
--- /dev/null
+++ b/deluge/plugins/Toggle/deluge_toggle/gtkui.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2010 John Garland <johnnybg+deluge@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+from deluge.plugins.pluginbase import Gtk3PluginBase
+from deluge.ui.client import client
+
+log = logging.getLogger(__name__)
+
+
+class GtkUI(Gtk3PluginBase):
+ def enable(self):
+ self.core = client.toggle
+ self.plugin = component.get('PluginManager')
+ self.separator = self.plugin.add_toolbar_separator()
+ self.button = self.plugin.add_toolbar_button(
+ self._on_button_clicked,
+ label='Pause Session',
+ stock='gtk-media-pause',
+ tooltip='Pause the session',
+ )
+
+ def disable(self):
+ component.get('PluginManager').remove_toolbar_button(self.button)
+ component.get('PluginManager').remove_toolbar_button(self.separator)
+
+ def update(self):
+ def _on_get_status(paused):
+ if paused:
+ self.button.set_label('Resume Session')
+ self.button.set_tooltip_text('Resume the session')
+ self.button.set_stock_id('gtk-media-play')
+ else:
+ self.button.set_label('Pause Session')
+ self.button.set_tooltip_text('Pause the session')
+ self.button.set_stock_id('gtk-media-pause')
+
+ self.core.get_status().addCallback(_on_get_status)
+
+ def _on_button_clicked(self, widget):
+ self.core.toggle()
diff --git a/deluge/plugins/Toggle/deluge_toggle/webui.py b/deluge/plugins/Toggle/deluge_toggle/webui.py
new file mode 100644
index 0000000..8f0fc8c
--- /dev/null
+++ b/deluge/plugins/Toggle/deluge_toggle/webui.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2010 John Garland <johnnybg+deluge@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.plugins.pluginbase import WebPluginBase
+
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+
+class WebUI(WebPluginBase):
+
+ scripts = [get_resource('toggle.js')]
+
+ def enable(self):
+ pass
+
+ def disable(self):
+ pass
diff --git a/deluge/plugins/Toggle/setup.py b/deluge/plugins/Toggle/setup.py
new file mode 100644
index 0000000..acc6e6c
--- /dev/null
+++ b/deluge/plugins/Toggle/setup.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2010 John Garland <johnnybg+deluge@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from setuptools import find_packages, setup
+
+__plugin_name__ = 'Toggle'
+__author__ = 'John Garland'
+__author_email__ = 'johnnybg+deluge@gmail.com'
+__version__ = '0.4'
+__url__ = 'http://deluge-torrent.org'
+__license__ = 'GPLv3'
+__description__ = 'Toggles the session'
+__long_description__ = """"""
+__pkg_data__ = {'deluge_' + __plugin_name__.lower(): ['data/*']}
+
+setup(
+ name=__plugin_name__,
+ version=__version__,
+ description=__description__,
+ author=__author__,
+ author_email=__author_email__,
+ url=__url__,
+ license=__license__,
+ long_description=__long_description__ if __long_description__ else __description__,
+ packages=find_packages(),
+ package_data=__pkg_data__,
+ entry_points="""
+ [deluge.plugin.core]
+ %s = deluge_%s:CorePlugin
+ [deluge.plugin.gtk3ui]
+ %s = deluge_%s:GtkUIPlugin
+ [deluge.plugin.web]
+ %s = deluge_%s:WebUIPlugin
+ """
+ % ((__plugin_name__, __plugin_name__.lower()) * 3),
+)
diff --git a/deluge/plugins/WebUi/deluge_webui/__init__.py b/deluge/plugins/WebUi/deluge_webui/__init__.py
new file mode 100644
index 0000000..a3d2980
--- /dev/null
+++ b/deluge/plugins/WebUi/deluge_webui/__init__.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.plugins.init import PluginInitBase
+
+
+class CorePlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .core import Core as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(CorePlugin, self).__init__(plugin_name)
+
+
+class GtkUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from .gtkui import GtkUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(GtkUIPlugin, self).__init__(plugin_name)
+
+
+class WebUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from webui import WebUI as _pluginCls
+
+ self._plugin_cls = _pluginCls
+ super(WebUIPlugin, self).__init__(plugin_name)
diff --git a/deluge/plugins/WebUi/deluge_webui/common.py b/deluge/plugins/WebUi/deluge_webui/common.py
new file mode 100644
index 0000000..4c9db09
--- /dev/null
+++ b/deluge/plugins/WebUi/deluge_webui/common.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# 2007-2009 Andrew Resch <andrewresch@gmail.com>
+# 2009 Damien Churchill <damoxc@gmail.com>
+# 2010 Pedro Algarvio <pedro@algarvio.me>
+# 2017 Calum Lind <calumlind+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os.path
+
+from pkg_resources import resource_filename
+
+
+def get_resource(filename):
+ return resource_filename(__package__, os.path.join('data', filename))
diff --git a/deluge/plugins/WebUi/deluge_webui/core.py b/deluge/plugins/WebUi/deluge_webui/core.py
new file mode 100644
index 0000000..cc3330f
--- /dev/null
+++ b/deluge/plugins/WebUi/deluge_webui/core.py
@@ -0,0 +1,120 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from twisted.internet import defer
+from twisted.internet.error import CannotListenError
+
+import deluge.component as component
+from deluge import configmanager
+from deluge.core.rpcserver import export
+from deluge.plugins.pluginbase import CorePluginBase
+
+try:
+ from deluge.ui.web import server
+except ImportError:
+ server = False
+
+log = logging.getLogger(__name__)
+
+DEFAULT_PREFS = {'enabled': False, 'ssl': False, 'port': 8112}
+
+
+class Core(CorePluginBase):
+ server = None
+
+ def enable(self):
+ self.config = configmanager.ConfigManager('web_plugin.conf', DEFAULT_PREFS)
+ if self.config['enabled']:
+ self.start_server()
+
+ def disable(self):
+ self.stop_server()
+
+ def update(self):
+ pass
+
+ def _on_stop(self, *args):
+ return self.start_server()
+
+ @export
+ def got_deluge_web(self):
+ """Status of deluge-web module installation.
+
+ Check if deluge.ui.web.server modulge is installed and has been successfully imported.
+
+ Returns:
+ bool: True is deluge-web is installed and available, otherwise False.
+
+ """
+
+ return bool(server)
+
+ def start_server(self):
+ if not self.server:
+ if not self.got_deluge_web():
+ return False
+
+ try:
+ self.server = component.get('DelugeWeb')
+ except KeyError:
+ self.server = server.DelugeWeb(daemon=False)
+
+ self.server.port = self.config['port']
+ self.server.https = self.config['ssl']
+ try:
+ self.server.start()
+ except CannotListenError as ex:
+ log.warning('Failed to start WebUI server: %s', ex)
+ raise
+ return True
+
+ def stop_server(self):
+ if self.server:
+ return self.server.stop()
+ return defer.succeed(True)
+
+ def restart_server(self):
+ return self.stop_server().addCallback(self._on_stop)
+
+ @export
+ def set_config(self, config):
+ """Sets the config dictionary."""
+
+ action = None
+ if 'enabled' in config:
+ if config['enabled'] != self.config['enabled']:
+ action = config['enabled'] and 'start' or 'stop'
+
+ if 'ssl' in config:
+ if not action:
+ action = 'restart'
+
+ for key in config:
+ self.config[key] = config[key]
+ self.config.save()
+
+ if action == 'start':
+ return self.start_server()
+ elif action == 'stop':
+ return self.stop_server()
+ elif action == 'restart':
+ return self.restart_server()
+
+ @export
+ def get_config(self):
+ """Returns the config dictionary."""
+ return self.config.config
diff --git a/deluge/plugins/WebUi/deluge_webui/data/config.ui b/deluge/plugins/WebUi/deluge_webui/data/config.ui
new file mode 100644
index 0000000..18647a4
--- /dev/null
+++ b/deluge/plugins/WebUi/deluge_webui/data/config.ui
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">99999</property>
+ <property name="value">8112</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkWindow" id="window1">
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="prefs_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="settings_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="settings_alignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">10</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="settings_vbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="enabled_checkbutton">
+ <property name="label" translatable="yes">Enable web interface</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="ssl_checkbutton">
+ <property name="label" translatable="yes">Enable SSL</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="port_hbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="port_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Listening port:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="port_spinbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="settings_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Settings&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/WebUi/deluge_webui/data/config.ui~ b/deluge/plugins/WebUi/deluge_webui/data/config.ui~
new file mode 100644
index 0000000..101f60d
--- /dev/null
+++ b/deluge/plugins/WebUi/deluge_webui/data/config.ui~
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">99999</property>
+ <property name="value">8112</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkWindow" id="window1">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkVBox" id="prefs_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkFrame" id="settings_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="settings_alignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">10</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="settings_vbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkCheckButton" id="enabled_checkbutton">
+ <property name="label" translatable="yes">Enable web interface</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="ssl_checkbutton">
+ <property name="label" translatable="yes">Enable SSL</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="port_hbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="port_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Listening port:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="port_spinbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="settings_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Settings&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/plugins/WebUi/deluge_webui/gtkui.py b/deluge/plugins/WebUi/deluge_webui/gtkui.py
new file mode 100644
index 0000000..ca3a16e
--- /dev/null
+++ b/deluge/plugins/WebUi/deluge_webui/gtkui.py
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from gi.repository import Gtk
+
+import deluge.component as component
+from deluge.plugins.pluginbase import Gtk3PluginBase
+from deluge.ui.client import client
+
+from .common import get_resource
+
+log = logging.getLogger(__name__)
+
+
+class GtkUI(Gtk3PluginBase):
+ def enable(self):
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(get_resource('config.ui'))
+
+ component.get('Preferences').add_page(
+ _('WebUi'), self.builder.get_object('prefs_box')
+ )
+ component.get('PluginManager').register_hook(
+ 'on_apply_prefs', self.on_apply_prefs
+ )
+ component.get('PluginManager').register_hook(
+ 'on_show_prefs', self.on_show_prefs
+ )
+ client.webui.get_config().addCallback(self.cb_get_config)
+ client.webui.got_deluge_web().addCallback(self.cb_chk_deluge_web)
+
+ def disable(self):
+ component.get('Preferences').remove_page(_('WebUi'))
+ component.get('PluginManager').deregister_hook(
+ 'on_apply_prefs', self.on_apply_prefs
+ )
+ component.get('PluginManager').deregister_hook(
+ 'on_show_prefs', self.on_show_prefs
+ )
+
+ def on_apply_prefs(self):
+ if not self.have_web:
+ return
+ log.debug('applying prefs for WebUi')
+ config = {
+ 'enabled': self.builder.get_object('enabled_checkbutton').get_active(),
+ 'ssl': self.builder.get_object('ssl_checkbutton').get_active(),
+ 'port': self.builder.get_object('port_spinbutton').get_value_as_int(),
+ }
+ client.webui.set_config(config)
+
+ def on_show_prefs(self):
+ client.webui.get_config().addCallback(self.cb_get_config)
+
+ def cb_get_config(self, config):
+ """Callback for on show_prefs."""
+ self.builder.get_object('enabled_checkbutton').set_active(config['enabled'])
+ self.builder.get_object('ssl_checkbutton').set_active(config['ssl'])
+ self.builder.get_object('port_spinbutton').set_value(config['port'])
+
+ def cb_chk_deluge_web(self, have_web):
+ self.have_web = have_web
+ if have_web:
+ return
+ self.builder.get_object('settings_vbox').set_sensitive(False)
+
+ vbox = self.builder.get_object('prefs_box')
+
+ hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, spacing=0)
+ icon = Gtk.Image.new_from_icon_name('dialog-error', Gtk.IconSize.BUTTON)
+ icon.set_padding(5, 5)
+ hbox.pack_start(icon, False, False, 0)
+
+ label = Gtk.Label(
+ _(
+ 'The Deluge web interface is not installed, '
+ 'please install the\ninterface and try again'
+ )
+ )
+ label.set_alignment(0, 0.5)
+ label.set_padding(5, 5)
+ hbox.pack_start(label, False, False, 0)
+
+ vbox.pack_start(hbox, False, False, 10)
+ vbox.reorder_child(hbox, 0)
+ vbox.show_all()
diff --git a/deluge/plugins/WebUi/deluge_webui/tests/__init__.py b/deluge/plugins/WebUi/deluge_webui/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deluge/plugins/WebUi/deluge_webui/tests/__init__.py
diff --git a/deluge/plugins/WebUi/deluge_webui/tests/test_plugin_webui.py b/deluge/plugins/WebUi/deluge_webui/tests/test_plugin_webui.py
new file mode 100644
index 0000000..56e1cc0
--- /dev/null
+++ b/deluge/plugins/WebUi/deluge_webui/tests/test_plugin_webui.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from twisted.trial import unittest
+
+import deluge.component as component
+from deluge.core.core import Core
+from deluge.core.rpcserver import RPCServer
+from deluge.tests import common
+from deluge.tests.basetest import BaseTestCase
+
+common.disable_new_release_check()
+
+
+class WebUIPluginTestCase(BaseTestCase):
+ def set_up(self):
+ common.set_tmp_config_dir()
+ self.rpcserver = RPCServer(listen=False)
+ self.core = Core()
+ return component.start()
+
+ def tear_down(self):
+ def on_shutdown(result):
+ del self.rpcserver
+ del self.core
+
+ return component.shutdown().addCallback(on_shutdown)
+
+ def test_enable_webui(self):
+ if 'WebUi' not in self.core.get_available_plugins():
+ raise unittest.SkipTest('WebUi plugin not available for testing')
+
+ d = self.core.enable_plugin('WebUi')
+
+ def result_cb(result):
+ if 'WebUi' not in self.core.get_enabled_plugins():
+ self.fail('Failed to enable WebUi plugin')
+ self.assertTrue(result)
+
+ d.addBoth(result_cb)
+ return d
diff --git a/deluge/plugins/WebUi/setup.py b/deluge/plugins/WebUi/setup.py
new file mode 100644
index 0000000..861a05a
--- /dev/null
+++ b/deluge/plugins/WebUi/setup.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from setuptools import find_packages, setup
+
+__plugin_name__ = 'WebUi'
+__author__ = 'Damien Churchill'
+__author_email__ = 'damoxc@gmail.com'
+__version__ = '0.2'
+__url__ = 'http://deluge-torrent.org'
+__license__ = 'GPLv3'
+__description__ = 'Allows starting the web interface within the daemon.'
+__long_description__ = """"""
+__pkg_data__ = {'deluge_' + __plugin_name__.lower(): ['data/*']}
+
+setup(
+ name=__plugin_name__,
+ version=__version__,
+ description=__description__,
+ author=__author__,
+ author_email=__author_email__,
+ url=__url__,
+ license=__license__,
+ long_description=__long_description__ if __long_description__ else __description__,
+ packages=find_packages(),
+ package_data=__pkg_data__,
+ entry_points="""
+ [deluge.plugin.core]
+ %s = deluge_%s:CorePlugin
+ [deluge.plugin.gtk3ui]
+ %s = deluge_%s:GtkUIPlugin
+ """
+ % ((__plugin_name__, __plugin_name__.lower()) * 2),
+)
diff --git a/deluge/plugins/__init__.py b/deluge/plugins/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deluge/plugins/__init__.py
diff --git a/deluge/plugins/init.py b/deluge/plugins/init.py
new file mode 100644
index 0000000..addeae9
--- /dev/null
+++ b/deluge/plugins/init.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""
+This base class is used in plugin's __init__ for the plugin entry points.
+"""
+from __future__ import unicode_literals
+
+import logging
+
+log = logging.getLogger(__name__)
+
+
+class PluginInitBase(object):
+ _plugin_cls = None
+
+ def __init__(self, plugin_name):
+ self.plugin = self._plugin_cls(plugin_name) # pylint: disable=not-callable
+
+ def enable(self):
+ return self.plugin.enable()
+
+ def disable(self):
+ return self.plugin.disable()
diff --git a/deluge/plugins/pluginbase.py b/deluge/plugins/pluginbase.py
new file mode 100644
index 0000000..e80199d
--- /dev/null
+++ b/deluge/plugins/pluginbase.py
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2010 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+
+log = logging.getLogger(__name__)
+
+
+class PluginBase(component.Component):
+
+ update_interval = 1
+
+ def __init__(self, name):
+ super(PluginBase, self).__init__(name, self.update_interval)
+
+ def enable(self):
+ raise NotImplementedError('Need to define an enable method!')
+
+ def disable(self):
+ raise NotImplementedError('Need to define a disable method!')
+
+
+class CorePluginBase(PluginBase):
+ def __init__(self, plugin_name):
+ super(CorePluginBase, self).__init__('CorePlugin.' + plugin_name)
+ # Register RPC methods
+ component.get('RPCServer').register_object(self, plugin_name.lower())
+ log.debug('CorePlugin initialized..')
+
+ def __del__(self):
+ component.get('RPCServer').deregister_object(self)
+
+ def enable(self):
+ super(CorePluginBase, self).enable()
+
+ def disable(self):
+ super(CorePluginBase, self).disable()
+
+
+class Gtk3PluginBase(PluginBase):
+ def __init__(self, plugin_name):
+ super(Gtk3PluginBase, self).__init__('Gtk3Plugin.' + plugin_name)
+ log.debug('Gtk3Plugin initialized..')
+
+ def enable(self):
+ super(Gtk3PluginBase, self).enable()
+
+ def disable(self):
+ super(Gtk3PluginBase, self).disable()
+
+
+class WebPluginBase(PluginBase):
+
+ scripts = []
+ debug_scripts = []
+
+ stylesheets = []
+ debug_stylesheets = []
+
+ def __init__(self, plugin_name):
+ super(WebPluginBase, self).__init__('WebPlugin.' + plugin_name)
+
+ # Register JSON rpc methods
+ component.get('JSON').register_object(self, plugin_name.lower())
+ log.debug('WebPlugin initialized..')
+
+ def __del__(self):
+ component.get('JSON').deregister_object(self)
+
+ def enable(self):
+ pass
+
+ def disable(self):
+ pass
diff --git a/deluge/tests/__init__.py b/deluge/tests/__init__.py
new file mode 100644
index 0000000..d3bf10d
--- /dev/null
+++ b/deluge/tests/__init__.py
@@ -0,0 +1,19 @@
+# Increase open file descriptor limit to allow tests to run
+# without getting error: what(): epoll: Too many open files
+from __future__ import print_function, unicode_literals
+
+from deluge.i18n import setup_translation
+
+try:
+ import resource
+except ImportError: # Does not exist on Windows
+ pass
+else:
+ try:
+ resource.setrlimit(resource.RLIMIT_NOFILE, (65536, 65536))
+ except (ValueError, resource.error) as ex:
+ error = 'Failed to raise file descriptor limit: %s' % ex
+ # print(error)
+
+# Initialize gettext
+setup_translation()
diff --git a/deluge/tests/basetest.py b/deluge/tests/basetest.py
new file mode 100644
index 0000000..11ca18e
--- /dev/null
+++ b/deluge/tests/basetest.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import warnings
+
+from twisted.internet.defer import maybeDeferred
+from twisted.trial import unittest
+
+import deluge.component as component
+
+
+class BaseTestCase(unittest.TestCase):
+ """This is the base class that should be used for all test classes
+ that create classes that inherit from deluge.component.Component. It
+ ensures that the component registry has been cleaned up when tests
+ have finished.
+
+ """
+
+ def setUp(self): # NOQA: N803
+
+ if len(component._ComponentRegistry.components) != 0:
+ warnings.warn(
+ 'The component._ComponentRegistry.components is not empty on test setup.\n'
+ 'This is probably caused by another test that did not clean up after finishing!: %s'
+ % component._ComponentRegistry.components
+ )
+ d = maybeDeferred(self.set_up)
+
+ def on_setup_error(error):
+ warnings.warn('Error caught in test setup!\n%s' % error.getTraceback())
+ self.fail()
+
+ return d.addErrback(on_setup_error)
+
+ def tearDown(self): # NOQA: N803
+ d = maybeDeferred(self.tear_down)
+
+ def on_teardown_failed(error):
+ warnings.warn('Error caught in test teardown!\n%s' % error.getTraceback())
+ self.fail()
+
+ def on_teardown_complete(result):
+ component._ComponentRegistry.components.clear()
+ component._ComponentRegistry.dependents.clear()
+
+ return d.addCallbacks(on_teardown_complete, on_teardown_failed)
+
+ def set_up(self):
+ pass
+
+ def tear_down(self):
+ pass
diff --git a/deluge/tests/common.py b/deluge/tests/common.py
new file mode 100644
index 0000000..e92cc0f
--- /dev/null
+++ b/deluge/tests/common.py
@@ -0,0 +1,341 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+import os
+import sys
+import tempfile
+import traceback
+
+from twisted.internet import defer, protocol, reactor
+from twisted.internet.defer import Deferred
+from twisted.internet.error import CannotListenError
+from twisted.trial import unittest
+
+import deluge.configmanager
+import deluge.core.preferencesmanager
+import deluge.log
+from deluge.error import DelugeError
+
+# This sets log level to critical, so use log.critical() to debug while running unit tests
+deluge.log.setup_logger('none')
+
+
+def disable_new_release_check():
+ deluge.core.preferencesmanager.DEFAULT_PREFS['new_release_check'] = False
+
+
+def set_tmp_config_dir():
+ config_directory = tempfile.mkdtemp()
+ deluge.configmanager.set_config_dir(config_directory)
+ return config_directory
+
+
+def setup_test_logger(level='info', prefix='deluge'):
+ deluge.log.setup_logger(level, filename='%s.log' % prefix, twisted_observer=False)
+
+
+def get_test_data_file(filename):
+ return os.path.join(os.path.join(os.path.dirname(__file__), 'data'), filename)
+
+
+def todo_test(caller):
+ # If we are using the delugereporter we can set todo mark on the test
+ # Without the delugereporter the todo would print a stack trace, so in
+ # that case we rely only on skipTest
+ if os.environ.get('DELUGE_REPORTER', None):
+ getattr(caller, caller._testMethodName).__func__.todo = 'To be fixed'
+
+ filename = os.path.basename(traceback.extract_stack(None, 2)[0][0])
+ funcname = traceback.extract_stack(None, 2)[0][2]
+ raise unittest.SkipTest('TODO: %s:%s' % (filename, funcname))
+
+
+def add_watchdog(deferred, timeout=0.05, message=None):
+ def callback(value):
+ if not watchdog.called and not watchdog.cancelled:
+ watchdog.cancel()
+ if not deferred.called:
+ if message:
+ print(message)
+ deferred.cancel()
+ return value
+
+ deferred.addBoth(callback)
+ watchdog = reactor.callLater(timeout, defer.timeout, deferred)
+ return watchdog
+
+
+class ReactorOverride(object):
+ """Class used to patch reactor while running unit tests
+ to avoid starting and stopping the twisted reactor
+ """
+
+ def __getattr__(self, attr):
+ if attr == 'run':
+ return self._run
+ if attr == 'stop':
+ return self._stop
+ return getattr(reactor, attr)
+
+ def _run(self):
+ pass
+
+ def _stop(self):
+ pass
+
+ def addReader(self, arg): # NOQA: N802
+ pass
+
+
+class ProcessOutputHandler(protocol.ProcessProtocol):
+ def __init__(
+ self, script, callbacks, logfile=None, print_stdout=True, print_stderr=True
+ ):
+ """Executes a script and handle the process' output to stdout and stderr.
+
+ Args:
+ script (str): The script to execute.
+ callbacks (list): Callbacks to trigger if the expected output if found.
+ logfile (str, optional): Filename to wrote the process' output.
+ print_stderr (bool): Print the process' stderr output to stdout.
+ print_stdout (bool): Print the process' stdout output to stdout.
+
+ """
+ self.callbacks = callbacks
+ self.script = script
+ self.log_output = ''
+ self.stderr_out = ''
+ self.logfile = logfile
+ self.print_stdout = print_stdout
+ self.print_stderr = print_stderr
+ self.quit_d = None
+ self.killed = False
+ self.watchdogs = []
+
+ def connectionMade(self): # NOQA: N802
+ self.transport.write(self.script)
+ self.transport.closeStdin()
+
+ def outConnectionLost(self): # NOQA: N802
+ if not self.logfile:
+ return
+ with open(self.logfile, 'w') as f:
+ f.write(self.log_output)
+
+ def kill(self):
+ """Kill the running process.
+
+ Returns:
+ Deferred: A deferred that is triggered when the process has quit.
+
+ """
+ if self.killed:
+ return
+ self.killed = True
+ self._kill_watchdogs()
+ self.quit_d = Deferred()
+ self.transport.signalProcess('INT')
+ return self.quit_d
+
+ def _kill_watchdogs(self):
+ """"Cancel all watchdogs"""
+ for w in self.watchdogs:
+ if not w.called and not w.cancelled:
+ w.cancel()
+
+ def processEnded(self, status): # NOQA: N802
+ self.transport.loseConnection()
+ if self.quit_d is None:
+ return
+ if status.value.exitCode == 0:
+ self.quit_d.callback(True)
+ else:
+ self.quit_d.errback(status)
+
+ def check_callbacks(self, data, cb_type='stdout'):
+ ret = False
+ for c in self.callbacks:
+ if cb_type not in c['types'] or c['deferred'].called:
+ continue
+ for trigger in c['triggers']:
+ if trigger['expr'] in data:
+ ret = True
+ if 'cb' in trigger:
+ trigger['cb'](self, c['deferred'], data, self.log_output)
+ elif 'value' not in trigger:
+ raise Exception('Trigger must specify either "cb" or "value"')
+ else:
+ val = trigger['value'](self, data, self.log_output)
+ if trigger.get('type', 'callback') == 'errback':
+ c['deferred'].errback(val)
+ else:
+ c['deferred'].callback(val)
+ return ret
+
+ def outReceived(self, data): # NOQA: N802
+ """Process output from stdout"""
+ data = data.decode('utf8')
+ self.log_output += data
+ if self.check_callbacks(data):
+ pass
+ elif '[ERROR' in data:
+ if not self.print_stdout:
+ return
+ print(data, end=' ')
+
+ def errReceived(self, data): # NOQA: N802
+ """Process output from stderr"""
+ data = data.decode('utf8')
+ self.log_output += data
+ self.stderr_out += data
+ self.check_callbacks(data, cb_type='stderr')
+ if not self.print_stderr:
+ return
+ data = '\n%s' % data.strip()
+ prefixed = data.replace('\n', '\nSTDERR: ')
+ print('\n%s' % prefixed)
+
+
+def start_core(
+ listen_port=58846,
+ logfile=None,
+ timeout=10,
+ timeout_msg=None,
+ custom_script='',
+ print_stdout=True,
+ print_stderr=True,
+ extra_callbacks=None,
+):
+ """Start the deluge core as a daemon.
+
+ Args:
+ listen_port (int, optional): The port the daemon listens for client connections.
+ logfile (str, optional): Logfile name to write the output from the process.
+ timeout (int): If none of the callbacks have been triggered before the imeout, the process is killed.
+ timeout_msg (str): The message to print when the timeout expires.
+ custom_script (str): Extra python code to insert into the daemon process script.
+ print_stderr (bool): If the output from the process' stderr should be printed to stdout.
+ print_stdout (bool): If the output from the process' stdout should be printed to stdout.
+ extra_callbacks (list): A list of dictionaries specifying extra callbacks.
+
+ Returns:
+ tuple(Deferred, ProcessOutputHandler):
+
+ The Deferred is fired when the core callback is triggered either after the default
+ output triggers are matched (daemon successfully started, or failed to start),
+ or upon timeout expiry. The ProcessOutputHandler is the handler for the deluged process.
+
+ """
+ config_directory = set_tmp_config_dir()
+ daemon_script = """
+import sys
+import deluge.core.daemon_entry
+
+from deluge.common import windows_check
+
+if windows_check():
+ sys.argv.extend(['-c', '%(dir)s', '-L', 'info', '-p', '%(port)d'])
+else:
+ sys.argv.extend(['-d', '-c', '%(dir)s', '-L', 'info', '-p', '%(port)d'])
+
+try:
+ daemon = deluge.core.daemon_entry.start_daemon(skip_start=True)
+ %(script)s
+ daemon.start()
+except Exception:
+ import traceback
+ sys.stderr.write('Exception raised:\\n %%s' %% traceback.format_exc())
+""" % {
+ 'dir': config_directory,
+ 'port': listen_port,
+ 'script': custom_script,
+ }
+
+ callbacks = []
+ default_core_cb = {'deferred': Deferred(), 'types': 'stdout'}
+ if timeout:
+ default_core_cb['timeout'] = timeout
+
+ # Specify the triggers for daemon log output
+ default_core_cb['triggers'] = [
+ {'expr': 'Finished loading ', 'value': lambda reader, data, data_all: reader},
+ {
+ 'expr': 'Could not listen on localhost:%d' % (listen_port),
+ 'type': 'errback', # Error from libtorrent
+ 'value': lambda reader, data, data_all: CannotListenError(
+ 'localhost',
+ listen_port,
+ 'Could not start deluge test client!\n%s' % data,
+ ),
+ },
+ {
+ 'expr': 'Traceback',
+ 'type': 'errback',
+ 'value': lambda reader, data, data_all: DelugeError(
+ 'Traceback found when starting daemon:\n%s' % data
+ ),
+ },
+ ]
+
+ callbacks.append(default_core_cb)
+ if extra_callbacks:
+ callbacks.extend(extra_callbacks)
+
+ process_protocol = start_process(
+ daemon_script, callbacks, logfile, print_stdout, print_stderr
+ )
+ return default_core_cb['deferred'], process_protocol
+
+
+def start_process(
+ script, callbacks, logfile=None, print_stdout=True, print_stderr=True
+):
+ """
+ Starts an external python process which executes the given script.
+
+ Args:
+ script (str): The content of the script to execute.
+ callbacks (list): list of dictionaries specifying callbacks.
+ logfile (str, optional): Logfile name to write the output from the process.
+ print_stderr (bool): If the output from the process' stderr should be printed to stdout.
+ print_stdout (bool): If the output from the process' stdout should be printed to stdout.
+
+ Returns:
+ ProcessOutputHandler: The handler for the process's output.
+
+ Each entry in the callbacks list is a dictionary with the following keys:
+ * "deferred": The deferred to be called when matched.
+ * "types": The output this callback should be matched against.
+ Possible values: ["stdout", "stderr"]
+ * "timeout" (optional): A timeout in seconds for the deferred.
+ * "triggers": A list of dictionaries, each specifying specifying a trigger:
+ * "expr": A string to match against the log output.
+ * "value": A function to produce the result to be passed to the callback.
+ * "type" (optional): A string that specifies wether to trigger a regular callback or errback.
+
+ """
+ cwd = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
+ process_protocol = ProcessOutputHandler(
+ script.encode('utf8'), callbacks, logfile, print_stdout, print_stderr
+ )
+
+ # Add timeouts to deferreds
+ for c in callbacks:
+ if 'timeout' in c:
+ w = add_watchdog(
+ c['deferred'], timeout=c['timeout'], message=c.get('timeout_msg', None)
+ )
+ process_protocol.watchdogs.append(w)
+
+ reactor.spawnProcess(
+ process_protocol, sys.executable, args=[sys.executable], path=cwd
+ )
+ return process_protocol
diff --git a/deluge/tests/common_web.py b/deluge/tests/common_web.py
new file mode 100644
index 0000000..706eb8d
--- /dev/null
+++ b/deluge/tests/common_web.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.common
+import deluge.component as component
+import deluge.ui.web.auth
+import deluge.ui.web.server
+from deluge import configmanager
+from deluge.ui.web.server import DelugeWeb
+
+from .basetest import BaseTestCase
+from .common import ReactorOverride
+from .daemon_base import DaemonBase
+
+
+class WebServerTestBase(BaseTestCase, DaemonBase):
+ """
+ Base class for tests that need a running webapi
+
+ """
+
+ def set_up(self):
+ self.host_id = None
+ deluge.ui.web.server.reactor = ReactorOverride()
+ d = self.common_set_up()
+ d.addCallback(self.start_core)
+ d.addCallback(self.start_webapi)
+ return d
+
+ def start_webapi(self, arg):
+ self.webserver_listen_port = 8999
+
+ config_defaults = deluge.ui.web.server.CONFIG_DEFAULTS.copy()
+ config_defaults['port'] = self.webserver_listen_port
+ self.config = configmanager.ConfigManager('web.conf', config_defaults)
+
+ self.deluge_web = DelugeWeb(daemon=False)
+
+ host = list(self.deluge_web.web_api.hostlist.config['hosts'][0])
+ host[2] = self.listen_port
+ self.deluge_web.web_api.hostlist.config['hosts'][0] = tuple(host)
+ self.host_id = host[0]
+ self.deluge_web.start()
+
+ def tear_down(self):
+ d = component.shutdown()
+ d.addCallback(self.terminate_core)
+ return d
+
+
+class WebServerMockBase(object):
+ """
+ Class with utility functions for mocking with tests using the webserver
+
+ """
+
+ def mock_authentication_ignore(self, auth):
+ def check_request(request, method=None, level=None):
+ pass
+
+ self.patch(auth, 'check_request', check_request)
diff --git a/deluge/tests/daemon_base.py b/deluge/tests/daemon_base.py
new file mode 100644
index 0000000..eda2193
--- /dev/null
+++ b/deluge/tests/daemon_base.py
@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+import os.path
+
+import pytest
+from twisted.internet import defer
+from twisted.internet.error import CannotListenError
+
+import deluge.component as component
+from deluge.common import windows_check
+
+from . import common
+
+
+class DaemonBase(object):
+
+ if windows_check():
+ skip = 'windows cant start_core not enough arguments for format string'
+
+ def common_set_up(self):
+ common.set_tmp_config_dir()
+ self.listen_port = 58900
+ self.core = None
+ return component.start()
+
+ def terminate_core(self, *args):
+ if args[0] is not None:
+ if hasattr(args[0], 'getTraceback'):
+ print('terminate_core: Errback Exception: %s' % args[0].getTraceback())
+
+ if not self.core.killed:
+ d = self.core.kill()
+ return d
+
+ @defer.inlineCallbacks
+ def start_core(
+ self,
+ arg,
+ custom_script='',
+ logfile='',
+ print_stdout=True,
+ print_stderr=True,
+ timeout=5,
+ port_range=10,
+ extra_callbacks=None,
+ ):
+ if logfile == '':
+ logfile = 'daemon_%s.log' % self.id()
+
+ # We are running py.test
+ if hasattr(pytest, 'config'):
+ # Put log file in the py.test --basetemp argument
+ basetemp = pytest.config.option.basetemp
+ if basetemp:
+ if not os.path.exists(basetemp):
+ os.makedirs(basetemp)
+ logfile = os.path.join(basetemp, logfile)
+
+ for dummy in range(port_range):
+ try:
+ d, self.core = common.start_core(
+ listen_port=self.listen_port,
+ logfile=logfile,
+ timeout=timeout,
+ timeout_msg='Timeout!',
+ custom_script=custom_script,
+ print_stdout=print_stdout,
+ print_stderr=print_stderr,
+ extra_callbacks=extra_callbacks,
+ )
+ yield d
+ except CannotListenError as ex:
+ exception_error = ex
+ self.listen_port += 1
+ except (KeyboardInterrupt, SystemExit):
+ raise
+ else:
+ return
+ raise exception_error
diff --git a/deluge/tests/data/deluge.png b/deluge/tests/data/deluge.png
new file mode 100644
index 0000000..e39cd0c
--- /dev/null
+++ b/deluge/tests/data/deluge.png
Binary files differ
diff --git a/deluge/tests/data/dir_with_6_files.torrent b/deluge/tests/data/dir_with_6_files.torrent
new file mode 100644
index 0000000..2c6b5fb
--- /dev/null
+++ b/deluge/tests/data/dir_with_6_files.torrent
Binary files differ
diff --git a/deluge/tests/data/filehash_field.torrent b/deluge/tests/data/filehash_field.torrent
new file mode 100644
index 0000000..99e41f0
--- /dev/null
+++ b/deluge/tests/data/filehash_field.torrent
@@ -0,0 +1,2 @@
+d13:creation datei1476342472e4:infod5:filesld4:ed2k16:2MŽ2Õ³&šïXE †18:filehash20:f»4^S96PâöÕRãÑ“6:lengthi54e4:pathl8:tull.txteed4:ed2k16:à_Gà‚ ÂLŸ@”8:filehash20:ºvê¤æXä™dÓ/§n1Þ¸36:lengthi54e4:pathl56:還在一個人無èŠå—Ž~é‚„ä¸è¶•ç·Šä¸Šä¾†èŠå¤©ç¾Ž.txteee4:name16:torrent_filehash12:piece lengthi32768e6:pieces20:G@g\˜&\ fB© Ž
+µØee \ No newline at end of file
diff --git a/deluge/tests/data/google.ico b/deluge/tests/data/google.ico
new file mode 100644
index 0000000..82339b3
--- /dev/null
+++ b/deluge/tests/data/google.ico
Binary files differ
diff --git a/deluge/tests/data/seo.ico b/deluge/tests/data/seo.ico
new file mode 100644
index 0000000..841e528
--- /dev/null
+++ b/deluge/tests/data/seo.ico
Binary files differ
diff --git a/deluge/tests/data/test.torrent b/deluge/tests/data/test.torrent
new file mode 100644
index 0000000..847ec58
--- /dev/null
+++ b/deluge/tests/data/test.torrent
@@ -0,0 +1,2 @@
+d8:announce40:http://tracker.aelitis.com:6969/announce13:announce-listll40:http://tracker.aelitis.com:6969/announceel41:http://tracker.aelitis.com:16969/announceee18:azureus_propertiesd17:dht_backup_enablei0ee7:comment34:provided by http://getazureus.com/13:comment.utf-834:provided by http://getazureus.com/10:created by19:Azureus/2.5.0.3_CVS13:creation datei1169429806e4:infod4:ed2k16:>pïlú]•K^Â\;;e·6:lengthi307949e4:name22:azcvsupdater_2.6.2.jar10:name.utf-822:azcvsupdater_2.6.2.jar12:piece lengthi32768e6:pieces200:ÛBÃ'Úb¸su97©uÊ<w\fÔ›©}ÀŸ:ý—qvƒ¢"ï7 y! låv·{÷/"PéDž8½ãû-ª¼Mº’üFð†x+ÈÐS©`¡ä‚èü÷ãåö…%ç%
+íÀ¡;šêÏ /F>ßÚgAÄ2|Ú‚õ¦b¡¸#€wIØfø½¬W«Ãsà»wòK¾î¨rGáWè·ÂióدÜÐ#ôÁuÍ E?:èœu«b(oj ^ÕÕAƒˆš¡J?¡ÖŒƒž&7:privatei0e4:sha120:2ζ¨"×ðÔ¿Ü^KºhÅ·¬Ýee \ No newline at end of file
diff --git a/deluge/tests/data/test_torrent.file.torrent b/deluge/tests/data/test_torrent.file.torrent
new file mode 100644
index 0000000..fca14ca
--- /dev/null
+++ b/deluge/tests/data/test_torrent.file.torrent
@@ -0,0 +1,2 @@
+d7:comment17:Test torrent file10:created by11:Deluge Team13:creation datei1411826665e8:encoding5:UTF-84:infod6:lengthi512000e4:name17:test_torrent.file12:piece lengthi32768e6:pieces320:²î$2ÜøTj šðäèû>hžU.±ð´“ÿ--~œÂ–Þ”BzuŒ¼žEBÞë1Ù¬ˆƒ@óªÍ¥ƒ/Kž²Î"z÷FÃ0‰Ö£Ñ[asV1²B^Wp-éSÓÂ׶æ©æF`¸M9Ð)}©ö,ƒ˜4nîiW ¡“‘j°˜QåI•ØçËÌ—(ï,œtØ‹cã¡hŸi†Þ*MÐë}^çWSÕñô7´ú ›h:-­bï‚ãeÍTXa3åÒm|ϪáJÀ"¨‡˜]Û0$°}¬ÒÑëŸöøêÞl¾ç@Lä žõVöÝ,ƒ4ÉË«½ÅëzML›Ä£JÝ*š
+\´APõ&I 9Œ¹}ö20ØÖŽHë¯Ó:Ù_±ƒœ8Õ<V¹2JYb2©'Ý2hÊÂ0\¦ú*_ûj–7:privatei0eee \ No newline at end of file
diff --git a/deluge/tests/data/ubuntu-9.04-desktop-i386.iso.torrent b/deluge/tests/data/ubuntu-9.04-desktop-i386.iso.torrent
new file mode 100644
index 0000000..b55c9ae
--- /dev/null
+++ b/deluge/tests/data/ubuntu-9.04-desktop-i386.iso.torrent
Binary files differ
diff --git a/deluge/tests/data/unicode_file.torrent b/deluge/tests/data/unicode_file.torrent
new file mode 100644
index 0000000..41db239
--- /dev/null
+++ b/deluge/tests/data/unicode_file.torrent
@@ -0,0 +1 @@
+d13:creation datei1540200743e8:encoding5:UTF-84:infod6:lengthi0e4:name35:সà§à¦•à§à¦®à¦¾à¦° রায়.mkv12:piece lengthi32768e6:pieces0:7:privatei0eee
diff --git a/deluge/tests/data/unicode_filenames.torrent b/deluge/tests/data/unicode_filenames.torrent
new file mode 100644
index 0000000..e34f055
--- /dev/null
+++ b/deluge/tests/data/unicode_filenames.torrent
Binary files differ
diff --git a/deluge/tests/test_alertmanager.py b/deluge/tests/test_alertmanager.py
new file mode 100644
index 0000000..f197882
--- /dev/null
+++ b/deluge/tests/test_alertmanager.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.component as component
+from deluge.core.core import Core
+
+from .basetest import BaseTestCase
+
+
+class AlertManagerTestCase(BaseTestCase):
+ def set_up(self):
+ self.core = Core()
+ self.core.config.config['lsd'] = False
+ self.am = component.get('AlertManager')
+ return component.start(['AlertManager'])
+
+ def tear_down(self):
+ return component.shutdown()
+
+ def test_register_handler(self):
+ def handler(alert):
+ return
+
+ self.am.register_handler('dummy_alert', handler)
+ self.assertEqual(self.am.handlers['dummy_alert'], [handler])
+
+ def test_deregister_handler(self):
+ def handler(alert):
+ return
+
+ self.am.register_handler('dummy_alert', handler)
+ self.am.deregister_handler(handler)
+ self.assertEqual(self.am.handlers['dummy_alert'], [])
diff --git a/deluge/tests/test_authmanager.py b/deluge/tests/test_authmanager.py
new file mode 100644
index 0000000..91e122f
--- /dev/null
+++ b/deluge/tests/test_authmanager.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.component as component
+from deluge.common import get_localhost_auth
+from deluge.core.authmanager import AUTH_LEVEL_ADMIN, AuthManager
+
+from .basetest import BaseTestCase
+
+
+class AuthManagerTestCase(BaseTestCase):
+ def set_up(self):
+ self.auth = AuthManager()
+ self.auth.start()
+
+ def tear_down(self):
+ # We must ensure that the components in component registry are removed
+ return component.shutdown()
+
+ def test_authorize(self):
+ self.assertEqual(self.auth.authorize(*get_localhost_auth()), AUTH_LEVEL_ADMIN)
diff --git a/deluge/tests/test_bencode.py b/deluge/tests/test_bencode.py
new file mode 100644
index 0000000..b49c21f
--- /dev/null
+++ b/deluge/tests/test_bencode.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+from __future__ import unicode_literals
+
+from twisted.trial import unittest
+
+from deluge import bencode
+
+from . import common
+
+
+class BencodeTestCase(unittest.TestCase):
+ def test_bencode_unicode_metainfo(self):
+ filename = common.get_test_data_file('test.torrent')
+ with open(filename, 'rb') as _file:
+ metainfo = bencode.bdecode(_file.read())[b'info']
+ bencode.bencode({b'info': metainfo})
+
+ def test_bencode_unicode_value(self):
+ self.assertEqual(bencode.bencode(b'abc'), b'3:abc')
+ self.assertEqual(bencode.bencode('abc'), b'3:abc')
+
+ def test_bdecode(self):
+ self.assertEqual(bencode.bdecode(b'3:dEf'), b'dEf')
+ with self.assertRaises(bencode.BTFailure):
+ bencode.bdecode('dEf')
+ with self.assertRaises(bencode.BTFailure):
+ bencode.bdecode(b'dEf')
+ with self.assertRaises(bencode.BTFailure):
+ bencode.bdecode({'dEf': 123})
diff --git a/deluge/tests/test_client.py b/deluge/tests/test_client.py
new file mode 100644
index 0000000..c89ad53
--- /dev/null
+++ b/deluge/tests/test_client.py
@@ -0,0 +1,204 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from twisted.internet import defer
+
+import deluge.component as component
+from deluge import error
+from deluge.common import AUTH_LEVEL_NORMAL, get_localhost_auth, windows_check
+from deluge.core.authmanager import AUTH_LEVEL_ADMIN
+from deluge.ui.client import Client, DaemonSSLProxy, client
+
+from .basetest import BaseTestCase
+from .daemon_base import DaemonBase
+
+
+class NoVersionSendingDaemonSSLProxy(DaemonSSLProxy):
+ def authenticate(self, username, password):
+ self.login_deferred = defer.Deferred()
+ d = self.call('daemon.login', username, password)
+ d.addCallback(self.__on_login, username)
+ d.addErrback(self.__on_login_fail)
+ return self.login_deferred
+
+ def __on_login(self, result, username):
+ self.login_deferred.callback(result)
+
+ def __on_login_fail(self, result):
+ self.login_deferred.errback(result)
+
+
+class NoVersionSendingClient(Client):
+ def connect(
+ self,
+ host='127.0.0.1',
+ port=58846,
+ username='',
+ password='',
+ skip_authentication=False,
+ ):
+ self._daemon_proxy = NoVersionSendingDaemonSSLProxy()
+ self._daemon_proxy.set_disconnect_callback(self.__on_disconnect)
+
+ d = self._daemon_proxy.connect(host, port)
+
+ def on_connect_fail(reason):
+ self.disconnect()
+ return reason
+
+ def on_authenticate(result, daemon_info):
+ return result
+
+ def on_authenticate_fail(reason):
+ return reason
+
+ def on_connected(daemon_version):
+ return daemon_version
+
+ def authenticate(daemon_version, username, password):
+ d = self._daemon_proxy.authenticate(username, password)
+ d.addCallback(on_authenticate, daemon_version)
+ d.addErrback(on_authenticate_fail)
+ return d
+
+ d.addCallback(on_connected)
+ d.addErrback(on_connect_fail)
+ if not skip_authentication:
+ d.addCallback(authenticate, username, password)
+ return d
+
+ def __on_disconnect(self):
+ if self.disconnect_callback:
+ self.disconnect_callback()
+
+
+class ClientTestCase(BaseTestCase, DaemonBase):
+
+ if windows_check():
+ skip = 'windows cant start_core not enough arguments for format string'
+
+ def set_up(self):
+ d = self.common_set_up()
+ d.addCallback(self.start_core)
+ d.addErrback(self.terminate_core)
+ return d
+
+ def tear_down(self):
+ d = component.shutdown()
+ d.addCallback(self.terminate_core)
+ return d
+
+ def test_connect_no_credentials(self):
+ d = client.connect('localhost', self.listen_port, username='', password='')
+
+ def on_connect(result):
+ self.assertEqual(client.get_auth_level(), AUTH_LEVEL_ADMIN)
+ self.addCleanup(client.disconnect)
+ return result
+
+ d.addCallbacks(on_connect, self.fail)
+ return d
+
+ def test_connect_localclient(self):
+ username, password = get_localhost_auth()
+ d = client.connect(
+ 'localhost', self.listen_port, username=username, password=password
+ )
+
+ def on_connect(result):
+ self.assertEqual(client.get_auth_level(), AUTH_LEVEL_ADMIN)
+ self.addCleanup(client.disconnect)
+ return result
+
+ d.addCallbacks(on_connect, self.fail)
+ return d
+
+ def test_connect_bad_password(self):
+ username, password = get_localhost_auth()
+ d = client.connect(
+ 'localhost', self.listen_port, username=username, password=password + '1'
+ )
+
+ def on_failure(failure):
+ self.assertEqual(failure.trap(error.BadLoginError), error.BadLoginError)
+ self.assertEqual(failure.value.message, 'Password does not match')
+ self.addCleanup(client.disconnect)
+
+ d.addCallbacks(self.fail, on_failure)
+ return d
+
+ def test_connect_invalid_user(self):
+ username, password = get_localhost_auth()
+ d = client.connect('localhost', self.listen_port, username='invalid-user')
+
+ def on_failure(failure):
+ self.assertEqual(failure.trap(error.BadLoginError), error.BadLoginError)
+ self.assertEqual(failure.value.message, 'Username does not exist')
+ self.addCleanup(client.disconnect)
+
+ d.addCallbacks(self.fail, on_failure)
+ return d
+
+ def test_connect_without_password(self):
+ username, password = get_localhost_auth()
+ d = client.connect('localhost', self.listen_port, username=username)
+
+ def on_failure(failure):
+ self.assertEqual(
+ failure.trap(error.AuthenticationRequired), error.AuthenticationRequired
+ )
+ self.assertEqual(failure.value.username, username)
+ self.addCleanup(client.disconnect)
+
+ d.addCallbacks(self.fail, on_failure)
+ return d
+
+ @defer.inlineCallbacks
+ def test_connect_with_password(self):
+ username, password = get_localhost_auth()
+ yield client.connect(
+ 'localhost', self.listen_port, username=username, password=password
+ )
+ yield client.core.create_account('testuser', 'testpw', 'DEFAULT')
+ yield client.disconnect()
+ ret = yield client.connect(
+ 'localhost', self.listen_port, username='testuser', password='testpw'
+ )
+ self.assertEqual(ret, AUTH_LEVEL_NORMAL)
+ yield
+
+ @defer.inlineCallbacks
+ def test_invalid_rpc_method_call(self):
+ yield client.connect('localhost', self.listen_port, username='', password='')
+ d = client.core.invalid_method()
+
+ def on_failure(failure):
+ self.assertEqual(
+ failure.trap(error.WrappedException), error.WrappedException
+ )
+ self.addCleanup(client.disconnect)
+
+ d.addCallbacks(self.fail, on_failure)
+ yield d
+
+ def test_connect_without_sending_client_version_fails(self):
+ username, password = get_localhost_auth()
+ no_version_sending_client = NoVersionSendingClient()
+ d = no_version_sending_client.connect(
+ 'localhost', self.listen_port, username=username, password=password
+ )
+
+ def on_failure(failure):
+ self.assertEqual(
+ failure.trap(error.IncompatibleClient), error.IncompatibleClient
+ )
+ self.addCleanup(no_version_sending_client.disconnect)
+
+ d.addCallbacks(self.fail, on_failure)
+ return d
diff --git a/deluge/tests/test_common.py b/deluge/tests/test_common.py
new file mode 100644
index 0000000..3cecb64
--- /dev/null
+++ b/deluge/tests/test_common.py
@@ -0,0 +1,202 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os
+import tarfile
+
+from twisted.trial import unittest
+
+from deluge.common import (
+ VersionSplit,
+ archive_files,
+ fdate,
+ fpcnt,
+ fpeer,
+ fsize,
+ fspeed,
+ ftime,
+ get_path_size,
+ is_infohash,
+ is_ip,
+ is_ipv4,
+ is_ipv6,
+ is_magnet,
+ is_url,
+ windows_check,
+)
+from deluge.i18n import setup_translation
+
+from .common import get_test_data_file, set_tmp_config_dir
+
+
+class CommonTestCase(unittest.TestCase):
+ def setUp(self): # NOQA
+ self.config_dir = set_tmp_config_dir()
+ setup_translation()
+
+ def tearDown(self): # NOQA
+ pass
+
+ def test_fsize(self):
+ self.assertEqual(fsize(0), '0 B')
+ self.assertEqual(fsize(100), '100 B')
+ self.assertEqual(fsize(1023), '1023 B')
+ self.assertEqual(fsize(1024), '1.0 KiB')
+ self.assertEqual(fsize(1048575), '1024.0 KiB')
+ self.assertEqual(fsize(1048576), '1.0 MiB')
+ self.assertEqual(fsize(1073741823), '1024.0 MiB')
+ self.assertEqual(fsize(1073741824), '1.0 GiB')
+ self.assertEqual(fsize(112245), '109.6 KiB')
+ self.assertEqual(fsize(110723441824), '103.1 GiB')
+ self.assertEqual(fsize(1099511627775), '1024.0 GiB')
+ self.assertEqual(fsize(1099511627777), '1.0 TiB')
+ self.assertEqual(fsize(766148267453245), '696.8 TiB')
+
+ def test_fpcnt(self):
+ self.assertTrue(fpcnt(0.9311) == '93.11%')
+
+ def test_fspeed(self):
+ self.assertTrue(fspeed(43134) == '42.1 KiB/s')
+
+ def test_fpeer(self):
+ self.assertTrue(fpeer(10, 20) == '10 (20)')
+ self.assertTrue(fpeer(10, -1) == '10')
+
+ def test_ftime(self):
+ self.assertEqual(ftime(0), '')
+ self.assertEqual(ftime(5), '5s')
+ self.assertEqual(ftime(100), '1m 40s')
+ self.assertEqual(ftime(3789), '1h 3m')
+ self.assertEqual(ftime(23011), '6h 23m')
+ self.assertEqual(ftime(391187), '4d 12h')
+ self.assertEqual(ftime(604800), '1w 0d')
+ self.assertEqual(ftime(13893086), '22w 6d')
+ self.assertEqual(ftime(59740269), '1y 46w')
+ self.assertEqual(ftime(61.25), '1m 1s')
+ self.assertEqual(ftime(119.9), '1m 59s')
+
+ def test_fdate(self):
+ self.assertTrue(fdate(-1) == '')
+
+ def test_is_url(self):
+ self.assertTrue(is_url('http://deluge-torrent.org'))
+ self.assertFalse(is_url('file://test.torrent'))
+
+ def test_is_magnet(self):
+ self.assertTrue(
+ is_magnet('magnet:?xt=urn:btih:SU5225URMTUEQLDXQWRB2EQWN6KLTYKN')
+ )
+ self.assertFalse(is_magnet(None))
+
+ def test_is_infohash(self):
+ self.assertTrue(is_infohash('2dc5d0e71a66fe69649a640d39cb00a259704973'))
+
+ def test_get_path_size(self):
+ if windows_check():
+ raise unittest.SkipTest('os devnull is different on windows')
+ self.assertTrue(get_path_size(os.devnull) == 0)
+ self.assertTrue(get_path_size('non-existant.file') == -1)
+
+ def test_is_ip(self):
+ self.assertTrue(is_ip('192.0.2.0'))
+ self.assertFalse(is_ip('192..0.0'))
+ self.assertTrue(is_ip('2001:db8::'))
+ self.assertFalse(is_ip('2001:db8:'))
+
+ def test_is_ipv4(self):
+ self.assertTrue(is_ipv4('192.0.2.0'))
+ self.assertFalse(is_ipv4('192..0.0'))
+
+ def test_is_ipv6(self):
+ self.assertTrue(is_ipv6('2001:db8::'))
+ self.assertFalse(is_ipv6('2001:db8:'))
+
+ def test_version_split(self):
+ self.assertTrue(VersionSplit('1.2.2') == VersionSplit('1.2.2'))
+ self.assertTrue(VersionSplit('1.2.1') < VersionSplit('1.2.2'))
+ self.assertTrue(VersionSplit('1.1.9') < VersionSplit('1.2.2'))
+ self.assertTrue(VersionSplit('1.2.2') > VersionSplit('1.2.1'))
+ self.assertTrue(VersionSplit('1.2.2') > VersionSplit('1.2.2-dev0'))
+ self.assertTrue(VersionSplit('1.2.2-dev') < VersionSplit('1.3.0-rc2'))
+ self.assertTrue(VersionSplit('1.2.2') > VersionSplit('1.2.2-rc2'))
+ self.assertTrue(VersionSplit('1.2.2-rc2-dev') < VersionSplit('1.2.2-rc2'))
+ self.assertTrue(VersionSplit('1.2.2-rc3') > VersionSplit('1.2.2-rc2'))
+ self.assertTrue(VersionSplit('0.14.9') == VersionSplit('0.14.9'))
+ self.assertTrue(VersionSplit('0.14.9') > VersionSplit('0.14.5'))
+ self.assertTrue(VersionSplit('0.14.10') >= VersionSplit('0.14.9'))
+ self.assertTrue(VersionSplit('1.4.0') > VersionSplit('1.3.900.dev123'))
+ self.assertTrue(VersionSplit('1.3.2rc2.dev1') < VersionSplit('1.3.2-rc2'))
+ self.assertTrue(VersionSplit('1.3.900.dev888') > VersionSplit('1.3.900.dev123'))
+ self.assertTrue(VersionSplit('1.4.0') > VersionSplit('1.4.0.dev123'))
+ self.assertTrue(VersionSplit('1.4.0.dev1') < VersionSplit('1.4.0'))
+ self.assertTrue(VersionSplit('1.4.0a1') < VersionSplit('1.4.0'))
+
+ def test_parse_human_size(self):
+ from deluge.common import parse_human_size
+
+ sizes = [
+ ('1', 1),
+ ('10 bytes', 10),
+ ('2048 bytes', 2048),
+ ('1MiB', 2 ** (10 * 2)),
+ ('1 MiB', 2 ** (10 * 2)),
+ ('1 GiB', 2 ** (10 * 3)),
+ ('1 GiB', 2 ** (10 * 3)),
+ ('1M', 10 ** 6),
+ ('1MB', 10 ** 6),
+ ('1 GB', 10 ** 9),
+ ('1 TB', 10 ** 12),
+ ]
+
+ for human_size, byte_size in sizes:
+ parsed = parse_human_size(human_size)
+ self.assertEqual(
+ parsed, byte_size, 'Mismatch when converting: %s' % human_size
+ )
+
+ def test_archive_files(self):
+ arc_filelist = [
+ get_test_data_file('test.torrent'),
+ get_test_data_file('deluge.png'),
+ ]
+ arc_filepath = archive_files('test-arc', arc_filelist)
+
+ with tarfile.open(arc_filepath, 'r') as tar:
+ for tar_info in tar:
+ self.assertTrue(tar_info.isfile())
+ self.assertTrue(
+ tar_info.name in [os.path.basename(arcf) for arcf in arc_filelist]
+ )
+
+ def test_archive_files_missing(self):
+ """Archive exists even with file not found."""
+ filelist = ['test.torrent', 'deluge.png', 'missing.file']
+ arc_filepath = archive_files(
+ 'test-arc', [get_test_data_file(f) for f in filelist]
+ )
+ filelist.remove('missing.file')
+
+ with tarfile.open(arc_filepath, 'r') as tar:
+ self.assertEqual(tar.getnames(), filelist)
+ self.assertTrue(all(tarinfo.isfile() for tarinfo in tar))
+
+ def test_archive_files_message(self):
+ filelist = ['test.torrent', 'deluge.png']
+ arc_filepath = archive_files(
+ 'test-arc', [get_test_data_file(f) for f in filelist], message='test'
+ )
+
+ result_files = filelist + ['archive_message.txt']
+ with tarfile.open(arc_filepath, 'r') as tar:
+ self.assertEqual(tar.getnames(), result_files)
+ for tar_info in tar:
+ self.assertTrue(tar_info.isfile())
+ if tar_info.name == 'archive_message.txt':
+ result = tar.extractfile(tar_info).read().decode()
+ self.assertEqual(result, 'test')
diff --git a/deluge/tests/test_component.py b/deluge/tests/test_component.py
new file mode 100644
index 0000000..26f24ad
--- /dev/null
+++ b/deluge/tests/test_component.py
@@ -0,0 +1,267 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from twisted.internet import defer, threads
+from twisted.trial.unittest import SkipTest
+
+import deluge.component as component
+
+from .basetest import BaseTestCase
+
+
+class ComponentTester(component.Component):
+ def __init__(self, name, depend=None):
+ component.Component.__init__(self, name, depend=depend)
+ self.start_count = 0
+ self.stop_count = 0
+
+ def start(self):
+ self.start_count += 1
+
+ def stop(self):
+ self.stop_count += 1
+
+
+class ComponentTesterDelayStart(ComponentTester):
+ def start(self):
+ def do_sleep():
+ import time
+
+ time.sleep(1)
+
+ d = threads.deferToThread(do_sleep)
+
+ def on_done(result):
+ self.start_count += 1
+
+ return d.addCallback(on_done)
+
+
+class ComponentTesterUpdate(component.Component):
+ def __init__(self, name):
+ component.Component.__init__(self, name)
+ self.counter = 0
+ self.start_count = 0
+ self.stop_count = 0
+
+ def update(self):
+ self.counter += 1
+
+ def stop(self):
+ self.stop_count += 1
+
+
+class ComponentTesterShutdown(component.Component):
+ def __init__(self, name):
+ component.Component.__init__(self, name)
+ self.shutdowned = False
+ self.stop_count = 0
+
+ def shutdown(self):
+ self.shutdowned = True
+
+ def stop(self):
+ self.stop_count += 1
+
+
+class ComponentTestClass(BaseTestCase):
+ def tear_down(self):
+ return component.shutdown()
+
+ def test_start_component(self):
+ def on_start(result, c):
+ self.assertEqual(c._component_state, 'Started')
+ self.assertEqual(c.start_count, 1)
+
+ c = ComponentTester('test_start_c1')
+ d = component.start(['test_start_c1'])
+ d.addCallback(on_start, c)
+ return d
+
+ def test_start_stop_depends(self):
+ def on_stop(result, c1, c2):
+ self.assertEqual(c1._component_state, 'Stopped')
+ self.assertEqual(c2._component_state, 'Stopped')
+ self.assertEqual(c1.stop_count, 1)
+ self.assertEqual(c2.stop_count, 1)
+
+ def on_start(result, c1, c2):
+ self.assertEqual(c1._component_state, 'Started')
+ self.assertEqual(c2._component_state, 'Started')
+ self.assertEqual(c1.start_count, 1)
+ self.assertEqual(c2.start_count, 1)
+ return component.stop(['test_start_depends_c1']).addCallback(
+ on_stop, c1, c2
+ )
+
+ c1 = ComponentTester('test_start_depends_c1')
+ c2 = ComponentTester('test_start_depends_c2', depend=['test_start_depends_c1'])
+
+ d = component.start(['test_start_depends_c2'])
+ d.addCallback(on_start, c1, c2)
+ return d
+
+ def start_with_depends(self):
+ c1 = ComponentTesterDelayStart('test_start_all_c1')
+ c2 = ComponentTester('test_start_all_c2', depend=['test_start_all_c4'])
+ c3 = ComponentTesterDelayStart(
+ 'test_start_all_c3', depend=['test_start_all_c5', 'test_start_all_c1']
+ )
+ c4 = ComponentTester('test_start_all_c4', depend=['test_start_all_c3'])
+ c5 = ComponentTester('test_start_all_c5')
+
+ d = component.start()
+ return (d, c1, c2, c3, c4, c5)
+
+ def finish_start_with_depends(self, *args):
+ for c in args[1:]:
+ component.deregister(c)
+
+ def test_start_all(self):
+ def on_start(*args):
+ for c in args[1:]:
+ self.assertEqual(c._component_state, 'Started')
+ self.assertEqual(c.start_count, 1)
+
+ ret = self.start_with_depends()
+ ret[0].addCallback(on_start, *ret[1:])
+ ret[0].addCallback(self.finish_start_with_depends, *ret[1:])
+ return ret[0]
+
+ def test_register_exception(self):
+ ComponentTester('test_register_exception_c1')
+ self.assertRaises(
+ component.ComponentAlreadyRegistered,
+ ComponentTester,
+ 'test_register_exception_c1',
+ )
+
+ def test_stop_component(self):
+ def on_stop(result, c):
+ self.assertEqual(c._component_state, 'Stopped')
+ self.assertFalse(c._component_timer.running)
+ self.assertEqual(c.stop_count, 1)
+
+ def on_start(result, c):
+ self.assertEqual(c._component_state, 'Started')
+ return component.stop(['test_stop_component_c1']).addCallback(on_stop, c)
+
+ c = ComponentTesterUpdate('test_stop_component_c1')
+ d = component.start(['test_stop_component_c1'])
+ d.addCallback(on_start, c)
+ return d
+
+ def test_stop_all(self):
+ def on_stop(result, *args):
+ for c in args:
+ self.assertEqual(c._component_state, 'Stopped')
+ self.assertEqual(c.stop_count, 1)
+
+ def on_start(result, *args):
+ for c in args:
+ self.assertEqual(c._component_state, 'Started')
+ return component.stop().addCallback(on_stop, *args)
+
+ ret = self.start_with_depends()
+ ret[0].addCallback(on_start, *ret[1:])
+ ret[0].addCallback(self.finish_start_with_depends, *ret[1:])
+ return ret[0]
+
+ def test_update(self):
+ def on_start(result, c1, counter):
+ self.assertTrue(c1._component_timer)
+ self.assertTrue(c1._component_timer.running)
+ self.assertNotEqual(c1.counter, counter)
+ return component.stop()
+
+ c1 = ComponentTesterUpdate('test_update_c1')
+ cnt = int(c1.counter)
+ d = component.start(['test_update_c1'])
+
+ d.addCallback(on_start, c1, cnt)
+ return d
+
+ def test_pause(self):
+ def on_pause(result, c1, counter):
+ self.assertEqual(c1._component_state, 'Paused')
+ self.assertNotEqual(c1.counter, counter)
+ self.assertFalse(c1._component_timer.running)
+
+ def on_start(result, c1, counter):
+ self.assertTrue(c1._component_timer)
+ self.assertNotEqual(c1.counter, counter)
+ d = component.pause(['test_pause_c1'])
+ d.addCallback(on_pause, c1, counter)
+ return d
+
+ c1 = ComponentTesterUpdate('test_pause_c1')
+ cnt = int(c1.counter)
+ d = component.start(['test_pause_c1'])
+
+ d.addCallback(on_start, c1, cnt)
+ return d
+
+ @defer.inlineCallbacks
+ def test_component_start_error(self):
+ ComponentTesterUpdate('test_pause_c1')
+ yield component.start(['test_pause_c1'])
+ yield component.pause(['test_pause_c1'])
+ test_comp = component.get('test_pause_c1')
+ try:
+ result = self.failureResultOf(test_comp._component_start())
+ except AttributeError:
+ raise SkipTest(
+ 'This test requires trial failureResultOf() in Twisted version >= 13'
+ )
+ self.assertEqual(
+ result.check(component.ComponentException), component.ComponentException
+ )
+
+ @defer.inlineCallbacks
+ def test_start_paused_error(self):
+ ComponentTesterUpdate('test_pause_c1')
+ yield component.start(['test_pause_c1'])
+ yield component.pause(['test_pause_c1'])
+
+ # Deferreds that fail in component have to error handler which results in
+ # twisted doing a log.err call which causes the test to fail.
+ # Prevent failure by ignoring the exception
+ self._observer._ignoreErrors(component.ComponentException)
+
+ result = yield component.start()
+ self.assertEqual(
+ [(result[0][0], result[0][1].value)],
+ [
+ (
+ defer.FAILURE,
+ component.ComponentException(
+ 'Trying to start component "%s" but it is '
+ 'not in a stopped state. Current state: %s'
+ % ('test_pause_c1', 'Paused'),
+ '',
+ ),
+ )
+ ],
+ )
+
+ def test_shutdown(self):
+ def on_shutdown(result, c1):
+ self.assertTrue(c1.shutdowned)
+ self.assertEqual(c1._component_state, 'Stopped')
+ self.assertEqual(c1.stop_count, 1)
+
+ def on_start(result, c1):
+ d = component.shutdown()
+ d.addCallback(on_shutdown, c1)
+ return d
+
+ c1 = ComponentTesterShutdown('test_shutdown_c1')
+ d = component.start(['test_shutdown_c1'])
+ d.addCallback(on_start, c1)
+ return d
diff --git a/deluge/tests/test_config.py b/deluge/tests/test_config.py
new file mode 100644
index 0000000..270cc5a
--- /dev/null
+++ b/deluge/tests/test_config.py
@@ -0,0 +1,194 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os
+from codecs import getwriter
+
+from twisted.internet import task
+from twisted.trial import unittest
+
+import deluge.config
+from deluge.common import JSON_FORMAT
+from deluge.config import Config
+
+from .common import set_tmp_config_dir
+
+DEFAULTS = {
+ 'string': 'foobar',
+ 'int': 1,
+ 'float': 0.435,
+ 'bool': True,
+ 'unicode': 'foobar',
+}
+
+
+class ConfigTestCase(unittest.TestCase):
+ def setUp(self): # NOQA: N803
+ self.config_dir = set_tmp_config_dir()
+
+ def test_init(self):
+ config = Config('test.conf', defaults=DEFAULTS, config_dir=self.config_dir)
+ self.assertEqual(DEFAULTS, config.config)
+
+ config = Config('test.conf', config_dir=self.config_dir)
+ self.assertEqual({}, config.config)
+
+ def test_set_get_item(self):
+ config = Config('test.conf', config_dir=self.config_dir)
+ config['foo'] = 1
+ self.assertEqual(config['foo'], 1)
+ self.assertRaises(ValueError, config.set_item, 'foo', 'bar')
+
+ config['foo'] = 2
+ self.assertEqual(config.get_item('foo'), 2)
+
+ config['foo'] = '3'
+ self.assertEqual(config.get_item('foo'), 3)
+
+ config['unicode'] = 'ВИДЕОФИЛЬМЫ'
+ self.assertEqual(config['unicode'], 'ВИДЕОФИЛЬМЫ')
+
+ config['unicode'] = b'foostring'
+ self.assertFalse(isinstance(config.get_item('unicode'), bytes))
+
+ config._save_timer.cancel()
+
+ def test_set_get_item_none(self):
+ config = Config('test.conf', config_dir=self.config_dir)
+
+ config['foo'] = None
+ self.assertIsNone(config['foo'])
+ self.assertIsInstance(config['foo'], type(None))
+
+ config['foo'] = 1
+ self.assertEqual(config.get('foo'), 1)
+
+ config['foo'] = None
+ self.assertIsNone(config['foo'])
+
+ config['bar'] = None
+ self.assertIsNone(config['bar'])
+
+ config['bar'] = None
+ self.assertIsNone(config['bar'])
+
+ config._save_timer.cancel()
+
+ def test_get(self):
+ config = Config('test.conf', config_dir=self.config_dir)
+ config['foo'] = 1
+ self.assertEqual(config.get('foo'), 1)
+ self.assertEqual(config.get('foobar'), None)
+ self.assertEqual(config.get('foobar', 2), 2)
+ config['foobar'] = 5
+ self.assertEqual(config.get('foobar', 2), 5)
+
+ def test_load(self):
+ def check_config():
+ config = Config('test.conf', config_dir=self.config_dir)
+
+ self.assertEqual(config['string'], 'foobar')
+ self.assertEqual(config['float'], 0.435)
+
+ # Test opening a previous 1.2 config file of just a json object
+ import json
+
+ with open(os.path.join(self.config_dir, 'test.conf'), 'wb') as _file:
+ json.dump(DEFAULTS, getwriter('utf8')(_file), **JSON_FORMAT)
+
+ check_config()
+
+ # Test opening a previous 1.2 config file of having the format versions
+ # as ints
+ with open(os.path.join(self.config_dir, 'test.conf'), 'wb') as _file:
+ _file.write(bytes(1) + b'\n')
+ _file.write(bytes(1) + b'\n')
+ json.dump(DEFAULTS, getwriter('utf8')(_file), **JSON_FORMAT)
+
+ check_config()
+
+ # Test the 1.2 config format
+ version = {'format': 1, 'file': 1}
+ with open(os.path.join(self.config_dir, 'test.conf'), 'wb') as _file:
+ json.dump(version, getwriter('utf8')(_file), **JSON_FORMAT)
+ json.dump(DEFAULTS, getwriter('utf8')(_file), **JSON_FORMAT)
+
+ check_config()
+
+ def test_save(self):
+ config = Config('test.conf', defaults=DEFAULTS, config_dir=self.config_dir)
+ # We do this twice because the first time we need to save the file to disk
+ # and the second time we do a compare and we should not write
+ ret = config.save()
+ self.assertTrue(ret)
+ ret = config.save()
+ self.assertTrue(ret)
+
+ config['string'] = 'baz'
+ config['int'] = 2
+ ret = config.save()
+ self.assertTrue(ret)
+ del config
+
+ config = Config('test.conf', defaults=DEFAULTS, config_dir=self.config_dir)
+ self.assertEqual(config['string'], 'baz')
+ self.assertEqual(config['int'], 2)
+
+ def test_save_timer(self):
+ self.clock = task.Clock()
+ deluge.config.callLater = self.clock.callLater
+
+ config = Config('test.conf', defaults=DEFAULTS, config_dir=self.config_dir)
+ config['string'] = 'baz'
+ config['int'] = 2
+ self.assertTrue(config._save_timer.active())
+
+ # Timeout set for 5 seconds in config, so lets move clock by 5 seconds
+ self.clock.advance(5)
+
+ def check_config(config):
+ self.assertTrue(not config._save_timer.active())
+ del config
+ config = Config('test.conf', defaults=DEFAULTS, config_dir=self.config_dir)
+ self.assertEqual(config['string'], 'baz')
+ self.assertEqual(config['int'], 2)
+
+ check_config(config)
+
+ def test_find_json_objects(self):
+ s = """{
+ "file": 1,
+ "format": 1
+}{
+ "ssl": true,
+ "enabled": false,
+ "port": 8115
+}\n"""
+
+ from deluge.config import find_json_objects
+
+ objects = find_json_objects(s)
+ self.assertEqual(len(objects), 2)
+
+ def test_find_json_objects_curly_brace(self):
+ """Test with string containing curly brace"""
+ s = """{
+ "file": 1,
+ "format": 1
+}{
+ "ssl": true,
+ "enabled": false,
+ "port": 8115
+ "password": "abc{def"
+}\n"""
+
+ from deluge.config import find_json_objects
+
+ objects = find_json_objects(s)
+ self.assertEqual(len(objects), 2)
diff --git a/deluge/tests/test_core.py b/deluge/tests/test_core.py
new file mode 100644
index 0000000..15fbc1b
--- /dev/null
+++ b/deluge/tests/test_core.py
@@ -0,0 +1,498 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from base64 import b64encode
+from hashlib import sha1 as sha
+
+import pytest
+from six import integer_types
+from twisted.internet import defer, reactor, task
+from twisted.internet.error import CannotListenError
+from twisted.python.failure import Failure
+from twisted.web.http import FORBIDDEN
+from twisted.web.resource import EncodingResourceWrapper, Resource
+from twisted.web.server import GzipEncoderFactory, Site
+from twisted.web.static import File
+
+import deluge.common
+import deluge.component as component
+import deluge.core.torrent
+from deluge._libtorrent import lt
+from deluge.core.core import Core
+from deluge.core.rpcserver import RPCServer
+from deluge.error import AddTorrentError, InvalidTorrentError
+
+from . import common
+from .basetest import BaseTestCase
+
+common.disable_new_release_check()
+
+
+class CookieResource(Resource):
+ def render(self, request):
+ if request.getCookie(b'password') != b'deluge':
+ request.setResponseCode(FORBIDDEN)
+ return
+
+ request.setHeader(b'Content-Type', b'application/x-bittorrent')
+ with open(
+ common.get_test_data_file('ubuntu-9.04-desktop-i386.iso.torrent'), 'rb'
+ ) as _file:
+ data = _file.read()
+ return data
+
+
+class PartialDownload(Resource):
+ def getChild(self, path, request): # NOQA: N802
+ return EncodingResourceWrapper(self, [GzipEncoderFactory()])
+
+ def render(self, request):
+ with open(
+ common.get_test_data_file('ubuntu-9.04-desktop-i386.iso.torrent'), 'rb'
+ ) as _file:
+ data = _file.read()
+ request.setHeader(b'Content-Length', str(len(data)))
+ request.setHeader(b'Content-Type', b'application/x-bittorrent')
+ return data
+
+
+class RedirectResource(Resource):
+ def render(self, request):
+ request.redirect(b'/ubuntu-9.04-desktop-i386.iso.torrent')
+ return b''
+
+
+class TopLevelResource(Resource):
+ def __init__(self):
+ Resource.__init__(self)
+ self.putChild(b'cookie', CookieResource())
+ self.putChild(b'partial', PartialDownload())
+ self.putChild(b'redirect', RedirectResource())
+ self.putChild(
+ b'ubuntu-9.04-desktop-i386.iso.torrent',
+ File(common.get_test_data_file('ubuntu-9.04-desktop-i386.iso.torrent')),
+ )
+
+
+class CoreTestCase(BaseTestCase):
+ def set_up(self):
+ common.set_tmp_config_dir()
+ self.rpcserver = RPCServer(listen=False)
+ self.core = Core()
+ self.core.config.config['lsd'] = False
+ self.clock = task.Clock()
+ self.core.torrentmanager.callLater = self.clock.callLater
+ self.listen_port = 51242
+ return component.start().addCallback(self.start_web_server)
+
+ def start_web_server(self, result):
+ website = Site(TopLevelResource())
+ for dummy in range(10):
+ try:
+ self.webserver = reactor.listenTCP(self.listen_port, website)
+ except CannotListenError as ex:
+ error = ex
+ self.listen_port += 1
+ else:
+ break
+ else:
+ raise error
+
+ return result
+
+ def tear_down(self):
+ def on_shutdown(result):
+ del self.rpcserver
+ del self.core
+ return self.webserver.stopListening()
+
+ return component.shutdown().addCallback(on_shutdown)
+
+ def add_torrent(self, filename, paused=False):
+ if not paused:
+ # Patch libtorrent flags starting torrents paused
+ self.patch(
+ deluge.core.torrentmanager,
+ 'LT_DEFAULT_ADD_TORRENT_FLAGS',
+ lt.add_torrent_params_flags_t.flag_auto_managed
+ | lt.add_torrent_params_flags_t.flag_update_subscribe
+ | lt.add_torrent_params_flags_t.flag_apply_ip_filter,
+ )
+ options = {'add_paused': paused, 'auto_managed': False}
+ filepath = common.get_test_data_file(filename)
+ with open(filepath, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ torrent_id = self.core.add_torrent_file(filename, filedump, options)
+ return torrent_id
+
+ @defer.inlineCallbacks
+ def test_add_torrent_files(self):
+ options = {}
+ filenames = ['test.torrent', 'test_torrent.file.torrent']
+ files_to_add = []
+ for f in filenames:
+ filename = common.get_test_data_file(f)
+ with open(filename, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ files_to_add.append((filename, filedump, options))
+ errors = yield self.core.add_torrent_files(files_to_add)
+ self.assertEqual(len(errors), 0)
+
+ @defer.inlineCallbacks
+ def test_add_torrent_files_error_duplicate(self):
+ options = {}
+ filenames = ['test.torrent', 'test.torrent']
+ files_to_add = []
+ for f in filenames:
+ filename = common.get_test_data_file(f)
+ with open(filename, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ files_to_add.append((filename, filedump, options))
+ errors = yield self.core.add_torrent_files(files_to_add)
+ self.assertEqual(len(errors), 1)
+ self.assertTrue(str(errors[0]).startswith('Torrent already in session'))
+
+ @defer.inlineCallbacks
+ def test_add_torrent_file(self):
+ options = {}
+ filename = common.get_test_data_file('test.torrent')
+ with open(filename, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ torrent_id = yield self.core.add_torrent_file_async(filename, filedump, options)
+
+ # Get the info hash from the test.torrent
+ from deluge.bencode import bdecode, bencode
+
+ with open(filename, 'rb') as _file:
+ info_hash = sha(bencode(bdecode(_file.read())[b'info'])).hexdigest()
+ self.assertEqual(torrent_id, info_hash)
+
+ def test_add_torrent_file_invalid_filedump(self):
+ options = {}
+ filename = common.get_test_data_file('test.torrent')
+ self.assertRaises(
+ AddTorrentError, self.core.add_torrent_file, filename, False, options
+ )
+
+ @defer.inlineCallbacks
+ def test_add_torrent_url(self):
+ url = (
+ 'http://localhost:%d/ubuntu-9.04-desktop-i386.iso.torrent'
+ % self.listen_port
+ )
+ options = {}
+ info_hash = '60d5d82328b4547511fdeac9bf4d0112daa0ce00'
+
+ torrent_id = yield self.core.add_torrent_url(url, options)
+ self.assertEqual(torrent_id, info_hash)
+
+ def test_add_torrent_url_with_cookie(self):
+ url = 'http://localhost:%d/cookie' % self.listen_port
+ options = {}
+ headers = {'Cookie': 'password=deluge'}
+ info_hash = '60d5d82328b4547511fdeac9bf4d0112daa0ce00'
+
+ d = self.core.add_torrent_url(url, options)
+ d.addCallbacks(self.fail, self.assertIsInstance, errbackArgs=(Failure,))
+
+ d = self.core.add_torrent_url(url, options, headers)
+ d.addCallbacks(self.assertEqual, self.fail, callbackArgs=(info_hash,))
+
+ return d
+
+ def test_add_torrent_url_with_redirect(self):
+ url = 'http://localhost:%d/redirect' % self.listen_port
+ options = {}
+ info_hash = '60d5d82328b4547511fdeac9bf4d0112daa0ce00'
+
+ d = self.core.add_torrent_url(url, options)
+ d.addCallback(self.assertEqual, info_hash)
+ return d
+
+ def test_add_torrent_url_with_partial_download(self):
+ url = 'http://localhost:%d/partial' % self.listen_port
+ options = {}
+ info_hash = '60d5d82328b4547511fdeac9bf4d0112daa0ce00'
+
+ d = self.core.add_torrent_url(url, options)
+ d.addCallback(self.assertEqual, info_hash)
+ return d
+
+ @defer.inlineCallbacks
+ def test_add_torrent_magnet(self):
+ info_hash = '60d5d82328b4547511fdeac9bf4d0112daa0ce00'
+ uri = deluge.common.create_magnet_uri(info_hash)
+ options = {}
+ torrent_id = yield self.core.add_torrent_magnet(uri, options)
+ self.assertEqual(torrent_id, info_hash)
+
+ def test_resume_torrent(self):
+ tid1 = self.add_torrent('test.torrent', paused=True)
+ tid2 = self.add_torrent('test_torrent.file.torrent', paused=True)
+ # Assert paused
+ r1 = self.core.get_torrent_status(tid1, ['paused'])
+ self.assertTrue(r1['paused'])
+ r2 = self.core.get_torrent_status(tid2, ['paused'])
+ self.assertTrue(r2['paused'])
+
+ self.core.resume_torrent(tid2)
+ r1 = self.core.get_torrent_status(tid1, ['paused'])
+ self.assertTrue(r1['paused'])
+ r2 = self.core.get_torrent_status(tid2, ['paused'])
+ self.assertFalse(r2['paused'])
+
+ def test_resume_torrent_list(self):
+ """Backward compatibility for list of torrent_ids."""
+ torrent_id = self.add_torrent('test.torrent', paused=True)
+ self.core.resume_torrent([torrent_id])
+ result = self.core.get_torrent_status(torrent_id, ['paused'])
+ self.assertFalse(result['paused'])
+
+ def test_resume_torrents(self):
+ tid1 = self.add_torrent('test.torrent', paused=True)
+ tid2 = self.add_torrent('test_torrent.file.torrent', paused=True)
+ self.core.resume_torrents([tid1, tid2])
+ r1 = self.core.get_torrent_status(tid1, ['paused'])
+ self.assertFalse(r1['paused'])
+ r2 = self.core.get_torrent_status(tid2, ['paused'])
+ self.assertFalse(r2['paused'])
+
+ def test_resume_torrents_all(self):
+ """With no torrent_ids param, resume all torrents"""
+ tid1 = self.add_torrent('test.torrent', paused=True)
+ tid2 = self.add_torrent('test_torrent.file.torrent', paused=True)
+ self.core.resume_torrents()
+ r1 = self.core.get_torrent_status(tid1, ['paused'])
+ self.assertFalse(r1['paused'])
+ r2 = self.core.get_torrent_status(tid2, ['paused'])
+ self.assertFalse(r2['paused'])
+
+ def test_pause_torrent(self):
+ tid1 = self.add_torrent('test.torrent')
+ tid2 = self.add_torrent('test_torrent.file.torrent')
+ # Assert not paused
+ r1 = self.core.get_torrent_status(tid1, ['paused'])
+ self.assertFalse(r1['paused'])
+ r2 = self.core.get_torrent_status(tid2, ['paused'])
+ self.assertFalse(r2['paused'])
+
+ self.core.pause_torrent(tid2)
+ r1 = self.core.get_torrent_status(tid1, ['paused'])
+ self.assertFalse(r1['paused'])
+ r2 = self.core.get_torrent_status(tid2, ['paused'])
+ self.assertTrue(r2['paused'])
+
+ def test_pause_torrent_list(self):
+ """Backward compatibility for list of torrent_ids."""
+ torrent_id = self.add_torrent('test.torrent')
+ result = self.core.get_torrent_status(torrent_id, ['paused'])
+ self.assertFalse(result['paused'])
+ self.core.pause_torrent([torrent_id])
+ result = self.core.get_torrent_status(torrent_id, ['paused'])
+ self.assertTrue(result['paused'])
+
+ def test_pause_torrents(self):
+ tid1 = self.add_torrent('test.torrent')
+ tid2 = self.add_torrent('test_torrent.file.torrent')
+
+ self.core.pause_torrents([tid1, tid2])
+ r1 = self.core.get_torrent_status(tid1, ['paused'])
+ self.assertTrue(r1['paused'])
+ r2 = self.core.get_torrent_status(tid2, ['paused'])
+ self.assertTrue(r2['paused'])
+
+ def test_pause_torrents_all(self):
+ """With no torrent_ids param, pause all torrents"""
+ tid1 = self.add_torrent('test.torrent')
+ tid2 = self.add_torrent('test_torrent.file.torrent')
+
+ self.core.pause_torrents()
+ r1 = self.core.get_torrent_status(tid1, ['paused'])
+ self.assertTrue(r1['paused'])
+ r2 = self.core.get_torrent_status(tid2, ['paused'])
+ self.assertTrue(r2['paused'])
+
+ def test_prefetch_metadata_existing(self):
+ """Check another call with same magnet returns existing deferred."""
+ magnet = 'magnet:?xt=urn:btih:ab570cdd5a17ea1b61e970bb72047de141bce173'
+ expected = ('ab570cdd5a17ea1b61e970bb72047de141bce173', None)
+
+ def on_result(result):
+ self.assertEqual(result, expected)
+
+ d = self.core.prefetch_magnet_metadata(magnet)
+ d.addCallback(on_result)
+ d2 = self.core.prefetch_magnet_metadata(magnet)
+ d2.addCallback(on_result)
+ self.clock.advance(30)
+ return defer.DeferredList([d, d2])
+
+ @defer.inlineCallbacks
+ def test_remove_torrent(self):
+ options = {}
+ filename = common.get_test_data_file('test.torrent')
+ with open(filename, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ torrent_id = yield self.core.add_torrent_file_async(filename, filedump, options)
+ removed = self.core.remove_torrent(torrent_id, True)
+ self.assertTrue(removed)
+ self.assertEqual(len(self.core.get_session_state()), 0)
+
+ def test_remove_torrent_invalid(self):
+ self.assertRaises(
+ InvalidTorrentError,
+ self.core.remove_torrent,
+ 'torrentidthatdoesntexist',
+ True,
+ )
+
+ @defer.inlineCallbacks
+ def test_remove_torrents(self):
+ options = {}
+ filename = common.get_test_data_file('test.torrent')
+ with open(filename, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ torrent_id = yield self.core.add_torrent_file_async(filename, filedump, options)
+
+ filename2 = common.get_test_data_file('unicode_filenames.torrent')
+ with open(filename2, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ torrent_id2 = yield self.core.add_torrent_file_async(
+ filename2, filedump, options
+ )
+ d = self.core.remove_torrents([torrent_id, torrent_id2], True)
+
+ def test_ret(val):
+ self.assertTrue(val == [])
+
+ d.addCallback(test_ret)
+
+ def test_session_state(val):
+ self.assertEqual(len(self.core.get_session_state()), 0)
+
+ d.addCallback(test_session_state)
+ yield d
+
+ @defer.inlineCallbacks
+ def test_remove_torrents_invalid(self):
+ options = {}
+ filename = common.get_test_data_file('test.torrent')
+ with open(filename, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ torrent_id = yield self.core.add_torrent_file_async(
+ filename, filedump, options
+ )
+ val = yield self.core.remove_torrents(
+ ['invalidid1', 'invalidid2', torrent_id], False
+ )
+ self.assertEqual(len(val), 2)
+ self.assertEqual(
+ val[0], ('invalidid1', 'torrent_id invalidid1 not in session.')
+ )
+ self.assertEqual(
+ val[1], ('invalidid2', 'torrent_id invalidid2 not in session.')
+ )
+
+ def test_get_session_status(self):
+ status = self.core.get_session_status(
+ ['net.recv_tracker_bytes', 'net.sent_tracker_bytes']
+ )
+ self.assertIsInstance(status, dict)
+ self.assertEqual(status['net.recv_tracker_bytes'], 0)
+ self.assertEqual(status['net.sent_tracker_bytes'], 0)
+
+ def test_get_session_status_all(self):
+ status = self.core.get_session_status([])
+ self.assertIsInstance(status, dict)
+ self.assertIn('upload_rate', status)
+ self.assertIn('net.recv_bytes', status)
+
+ def test_get_session_status_depr(self):
+ status = self.core.get_session_status(['num_peers', 'num_unchoked'])
+ self.assertIsInstance(status, dict)
+ self.assertEqual(status['num_peers'], 0)
+ self.assertEqual(status['num_unchoked'], 0)
+
+ def test_get_session_status_rates(self):
+ status = self.core.get_session_status(['upload_rate', 'download_rate'])
+ self.assertIsInstance(status, dict)
+ self.assertEqual(status['upload_rate'], 0)
+
+ def test_get_session_status_ratio(self):
+ status = self.core.get_session_status(['write_hit_ratio', 'read_hit_ratio'])
+ self.assertIsInstance(status, dict)
+ self.assertEqual(status['write_hit_ratio'], 0.0)
+ self.assertEqual(status['read_hit_ratio'], 0.0)
+
+ def test_get_free_space(self):
+ space = self.core.get_free_space('.')
+ # get_free_space returns long on Python 2 (32-bit).
+ self.assertTrue(isinstance(space, integer_types))
+ self.assertTrue(space >= 0)
+ self.assertEqual(self.core.get_free_space('/someinvalidpath'), -1)
+
+ @pytest.mark.slow
+ def test_test_listen_port(self):
+ d = self.core.test_listen_port()
+
+ def result(r):
+ self.assertTrue(r in (True, False))
+
+ d.addCallback(result)
+ return d
+
+ def test_sanitize_filepath(self):
+ pathlist = {
+ '\\backslash\\path\\': 'backslash/path',
+ ' single_file ': 'single_file',
+ '..': '',
+ '/../..../': '',
+ ' Def ////ad./ / . . /b d /file': 'Def/ad./. ./b d/file',
+ '/ test /\\.. /.file/': 'test/.file',
+ 'mytorrent/subfold/file1': 'mytorrent/subfold/file1',
+ 'Torrent/folder/': 'Torrent/folder',
+ }
+
+ for key in pathlist:
+ self.assertEqual(
+ deluge.core.torrent.sanitize_filepath(key, folder=False), pathlist[key]
+ )
+ self.assertEqual(
+ deluge.core.torrent.sanitize_filepath(key, folder=True),
+ pathlist[key] + '/',
+ )
+
+ def test_get_set_config_values(self):
+ self.assertEqual(
+ self.core.get_config_values(['abc', 'foo']), {'foo': None, 'abc': None}
+ )
+ self.assertEqual(self.core.get_config_value('foobar'), None)
+ self.core.set_config({'abc': 'def', 'foo': 10, 'foobar': 'barfoo'})
+ self.assertEqual(
+ self.core.get_config_values(['foo', 'abc']), {'foo': 10, 'abc': 'def'}
+ )
+ self.assertEqual(self.core.get_config_value('foobar'), 'barfoo')
+
+ def test_read_only_config_keys(self):
+ key = 'max_upload_speed'
+ self.core.read_only_config_keys = [key]
+
+ old_value = self.core.get_config_value(key)
+ self.core.set_config({key: old_value + 10})
+ new_value = self.core.get_config_value(key)
+ self.assertEqual(old_value, new_value)
+
+ self.core.read_only_config_keys = None
+
+ def test__create_peer_id(self):
+ self.assertEqual(self.core._create_peer_id('2.0.0'), '-DE200s-')
+ self.assertEqual(self.core._create_peer_id('2.0.0.dev15'), '-DE200D-')
+ self.assertEqual(self.core._create_peer_id('2.0.1rc1'), '-DE201r-')
+ self.assertEqual(self.core._create_peer_id('2.11.0b2'), '-DE2B0b-')
+ self.assertEqual(self.core._create_peer_id('2.4.12b2.dev3'), '-DE24CD-')
diff --git a/deluge/tests/test_decorators.py b/deluge/tests/test_decorators.py
new file mode 100644
index 0000000..7d4bd98
--- /dev/null
+++ b/deluge/tests/test_decorators.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from twisted.trial import unittest
+
+from deluge.decorators import proxy
+
+
+class DecoratorsTestCase(unittest.TestCase):
+ def test_proxy_with_simple_functions(self):
+ def negate(func, *args, **kwargs):
+ return not func(*args, **kwargs)
+
+ @proxy(negate)
+ def something(_bool):
+ return _bool
+
+ @proxy(negate)
+ @proxy(negate)
+ def double_nothing(_bool):
+ return _bool
+
+ self.assertTrue(something(False))
+ self.assertFalse(something(True))
+ self.assertTrue(double_nothing(True))
+ self.assertFalse(double_nothing(False))
+
+ def test_proxy_with_class_method(self):
+ def negate(func, *args, **kwargs):
+ return -func(*args, **kwargs)
+
+ class Test(object):
+ def __init__(self, number):
+ self.number = number
+
+ @proxy(negate)
+ def diff(self, number):
+ return self.number - number
+
+ @proxy(negate)
+ def no_diff(self, number):
+ return self.diff(number)
+
+ t = Test(5)
+ self.assertEqual(t.diff(1), -4)
+ self.assertEqual(t.no_diff(1), 4)
diff --git a/deluge/tests/test_error.py b/deluge/tests/test_error.py
new file mode 100644
index 0000000..c552e94
--- /dev/null
+++ b/deluge/tests/test_error.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from twisted.trial import unittest
+
+import deluge.error
+
+
+class ErrorTestCase(unittest.TestCase):
+ def setUp(self): # NOQA: N803
+ pass
+
+ def tearDown(self): # NOQA: N803
+ pass
+
+ def test_deluge_error(self):
+ msg = 'Some message'
+ e = deluge.error.DelugeError(msg)
+ self.assertEqual(str(e), msg)
+ from twisted.internet.defer import DebugInfo
+
+ del DebugInfo.__del__ # Hides all errors
+ self.assertEqual(e._args, (msg,))
+ self.assertEqual(e._kwargs, {})
+
+ def test_incompatible_client(self):
+ version = '1.3.6'
+ e = deluge.error.IncompatibleClient(version)
+ self.assertEqual(
+ str(e),
+ 'Your deluge client is not compatible with the daemon. \
+Please upgrade your client to %s'
+ % version,
+ )
+
+ def test_not_authorized_error(self):
+ current_level = 5
+ required_level = 10
+ e = deluge.error.NotAuthorizedError(current_level, required_level)
+ self.assertEqual(
+ str(e), 'Auth level too low: %d < %d' % (current_level, required_level)
+ )
+
+ def test_bad_login_error(self):
+ message = 'Login failed'
+ username = 'deluge'
+ e = deluge.error.BadLoginError(message, username)
+ self.assertEqual(str(e), message)
diff --git a/deluge/tests/test_files_tab.py b/deluge/tests/test_files_tab.py
new file mode 100644
index 0000000..23865d7
--- /dev/null
+++ b/deluge/tests/test_files_tab.py
@@ -0,0 +1,176 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+import pytest
+from twisted.trial import unittest
+
+import deluge.component as component
+from deluge.common import windows_check
+from deluge.configmanager import ConfigManager
+from deluge.i18n import setup_translation
+
+from . import common
+from .basetest import BaseTestCase
+
+libs_available = True
+# Allow running other tests without GTKUI dependencies available
+try:
+ from deluge.ui.gtk3.files_tab import FilesTab
+ from deluge.ui.gtk3.gtkui import DEFAULT_PREFS
+ from deluge.ui.gtk3.mainwindow import MainWindow
+except ImportError:
+ libs_available = False
+
+setup_translation()
+
+
+@pytest.mark.gtkui
+class FilesTabTestCase(BaseTestCase):
+ def set_up(self):
+ if libs_available is False:
+ raise unittest.SkipTest('GTKUI dependencies not available')
+
+ common.set_tmp_config_dir()
+ ConfigManager('gtk3ui.conf', defaults=DEFAULT_PREFS)
+ self.mainwindow = MainWindow()
+ self.filestab = FilesTab()
+ self.t_id = '1'
+ self.filestab.torrent_id = self.t_id
+ self.index = 1
+
+ def tear_down(self):
+ return component.shutdown()
+
+ def print_treestore(self, title, treestore):
+ root = treestore.get_iter_first()
+ level = 1
+
+ def p_level(s, l):
+ print('%s%s' % (' ' * l, s))
+
+ def _print_treestore_children(i, lvl):
+ while i:
+ p_level(treestore[i][0], lvl)
+ if treestore.iter_children(i):
+ _print_treestore_children(treestore.iter_children(i), lvl + 2)
+ i = treestore.iter_next(i)
+
+ print('\n%s' % title)
+ _print_treestore_children(root, level)
+ print('')
+
+ def verify_treestore(self, treestore, tree):
+ def _verify_treestore(itr, tree_values):
+ i = 0
+ while itr:
+ values = tree_values[i]
+ if treestore[itr][0] != values[0]:
+ return False
+ if treestore.iter_children(itr):
+ if not _verify_treestore(treestore.iter_children(itr), values[1]):
+ return False
+ itr = treestore.iter_next(itr)
+ i += 1
+ return True
+
+ return _verify_treestore(treestore.get_iter_first(), tree)
+
+ def test_files_tab(self):
+ self.filestab.files_list[self.t_id] = (
+ {'index': 0, 'path': '1/test_10.txt', 'offset': 0, 'size': 13},
+ {'index': 1, 'path': 'test_100.txt', 'offset': 13, 'size': 14},
+ )
+ self.filestab.update_files()
+ self.filestab._on_torrentfilerenamed_event(
+ self.t_id, self.index, '2/test_100.txt'
+ )
+
+ ret = self.verify_treestore(
+ self.filestab.treestore,
+ [['1/', [['test_10.txt']]], ['2/', [['test_100.txt']]]],
+ )
+ if not ret:
+ self.print_treestore('Treestore not expected:', self.filestab.treestore)
+ self.assertTrue(ret)
+
+ def test_files_tab2(self):
+ if windows_check():
+ raise unittest.SkipTest('on windows \\ != / for path names')
+ self.filestab.files_list[self.t_id] = (
+ {'index': 0, 'path': '1/1/test_10.txt', 'offset': 0, 'size': 13},
+ {'index': 1, 'path': 'test_100.txt', 'offset': 13, 'size': 14},
+ )
+ self.filestab.update_files()
+ self.filestab._on_torrentfilerenamed_event(
+ self.t_id, self.index, '1/1/test_100.txt'
+ )
+
+ ret = self.verify_treestore(
+ self.filestab.treestore,
+ [['1/', [['1/', [['test_100.txt'], ['test_10.txt']]]]]],
+ )
+ if not ret:
+ self.print_treestore('Treestore not expected:', self.filestab.treestore)
+ self.assertTrue(ret)
+
+ def test_files_tab3(self):
+ if windows_check():
+ raise unittest.SkipTest('on windows \\ != / for path names')
+ self.filestab.files_list[self.t_id] = (
+ {'index': 0, 'path': '1/test_10.txt', 'offset': 0, 'size': 13},
+ {'index': 1, 'path': 'test_100.txt', 'offset': 13, 'size': 14},
+ )
+ self.filestab.update_files()
+ self.filestab._on_torrentfilerenamed_event(
+ self.t_id, self.index, '1/test_100.txt'
+ )
+
+ ret = self.verify_treestore(
+ self.filestab.treestore, [['1/', [['test_100.txt'], ['test_10.txt']]]]
+ )
+ if not ret:
+ self.print_treestore('Treestore not expected:', self.filestab.treestore)
+ self.assertTrue(ret)
+
+ def test_files_tab4(self):
+ self.filestab.files_list[self.t_id] = (
+ {'index': 0, 'path': '1/test_10.txt', 'offset': 0, 'size': 13},
+ {'index': 1, 'path': '1/test_100.txt', 'offset': 13, 'size': 14},
+ )
+ self.filestab.update_files()
+ self.filestab._on_torrentfilerenamed_event(
+ self.t_id, self.index, '1/2/test_100.txt'
+ )
+
+ ret = self.verify_treestore(
+ self.filestab.treestore,
+ [['1/', [['2/', [['test_100.txt']]], ['test_10.txt']]]],
+ )
+ if not ret:
+ self.print_treestore('Treestore not expected:', self.filestab.treestore)
+ self.assertTrue(ret)
+
+ def test_files_tab5(self):
+ if windows_check():
+ raise unittest.SkipTest('on windows \\ != / for path names')
+ self.filestab.files_list[self.t_id] = (
+ {'index': 0, 'path': '1/test_10.txt', 'offset': 0, 'size': 13},
+ {'index': 1, 'path': '2/test_100.txt', 'offset': 13, 'size': 14},
+ )
+ self.filestab.update_files()
+ self.filestab._on_torrentfilerenamed_event(
+ self.t_id, self.index, '1/test_100.txt'
+ )
+
+ ret = self.verify_treestore(
+ self.filestab.treestore, [['1/', [['test_100.txt'], ['test_10.txt']]]]
+ )
+ if not ret:
+ self.print_treestore('Treestore not expected:', self.filestab.treestore)
+ self.assertTrue(ret)
diff --git a/deluge/tests/test_httpdownloader.py b/deluge/tests/test_httpdownloader.py
new file mode 100644
index 0000000..a503e46
--- /dev/null
+++ b/deluge/tests/test_httpdownloader.py
@@ -0,0 +1,266 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import tempfile
+from email.utils import formatdate
+
+from twisted.internet import reactor
+from twisted.internet.error import CannotListenError
+from twisted.python.failure import Failure
+from twisted.trial import unittest
+from twisted.web.error import PageRedirect
+from twisted.web.http import NOT_MODIFIED
+from twisted.web.resource import EncodingResourceWrapper, Resource
+from twisted.web.server import GzipEncoderFactory, Site
+from twisted.web.util import redirectTo
+
+from deluge.common import windows_check
+from deluge.httpdownloader import download_file
+from deluge.log import setup_logger
+
+temp_dir = tempfile.mkdtemp()
+
+
+def fname(name):
+ return '%s/%s' % (temp_dir, name)
+
+
+class RedirectResource(Resource):
+ def render(self, request):
+ url = self.get_url().encode('utf8')
+ return redirectTo(url, request)
+
+
+class RenameResource(Resource):
+ def render(self, request):
+ filename = request.args.get(b'filename', [b'renamed_file'])[0]
+ request.setHeader(b'Content-Type', b'text/plain')
+ request.setHeader(b'Content-Disposition', b'attachment; filename=' + filename)
+ return b'This file should be called ' + filename
+
+
+class AttachmentResource(Resource):
+ def render(self, request):
+ request.setHeader(b'Content-Type', b'text/plain')
+ request.setHeader(b'Content-Disposition', b'attachment')
+ return b'Attachement with no filename set'
+
+
+class CookieResource(Resource):
+ def render(self, request):
+ request.setHeader(b'Content-Type', b'text/plain')
+ if request.getCookie(b'password') is None:
+ return b'Password cookie not set!'
+
+ if request.getCookie(b'password') == b'deluge':
+ return b'COOKIE MONSTER!'
+
+ return request.getCookie('password')
+
+
+class GzipResource(Resource):
+ def getChild(self, path, request): # NOQA: N802
+ return EncodingResourceWrapper(self, [GzipEncoderFactory()])
+
+ def render(self, request):
+ message = request.args.get(b'msg', [b'EFFICIENCY!'])[0]
+ request.setHeader(b'Content-Type', b'text/plain')
+ return message
+
+
+class PartialDownloadResource(Resource):
+ def __init__(self, *args, **kwargs):
+ Resource.__init__(self)
+ self.render_count = 0
+
+ def render(self, request):
+ # encoding = request.requestHeaders._rawHeaders.get('accept-encoding', None)
+ if self.render_count == 0:
+ request.setHeader(b'content-length', b'5')
+ else:
+ request.setHeader(b'content-length', b'3')
+
+ # if encoding == "deflate, gzip, x-gzip":
+ request.write('abc')
+ self.render_count += 1
+ return ''
+
+
+class TopLevelResource(Resource):
+ def __init__(self):
+ Resource.__init__(self)
+ self.putChild(b'cookie', CookieResource())
+ self.putChild(b'gzip', GzipResource())
+ self.redirect_rsrc = RedirectResource()
+ self.putChild(b'redirect', self.redirect_rsrc)
+ self.putChild(b'rename', RenameResource())
+ self.putChild(b'attachment', AttachmentResource())
+ self.putChild(b'partial', PartialDownloadResource())
+
+ def getChild(self, path, request): # NOQA: N802
+ if not path:
+ return self
+ else:
+ return Resource.getChild(self, path, request)
+
+ def render(self, request):
+ if request.getHeader('If-Modified-Since'):
+ request.setResponseCode(NOT_MODIFIED)
+ return b'<h1>Deluge HTTP Downloader tests webserver here</h1>'
+
+
+class DownloadFileTestCase(unittest.TestCase):
+ def get_url(self, path=''):
+ return 'http://localhost:%d/%s' % (self.listen_port, path)
+
+ def setUp(self): # NOQA
+ setup_logger('warning', fname('log_file'))
+ self.website = Site(TopLevelResource())
+ self.listen_port = 51242
+ self.website.resource.redirect_rsrc.get_url = self.get_url
+ for dummy in range(10):
+ try:
+ self.webserver = reactor.listenTCP(self.listen_port, self.website)
+ except CannotListenError as ex:
+ error = ex
+ self.listen_port += 1
+ else:
+ break
+ else:
+ raise error
+
+ def tearDown(self): # NOQA
+ return self.webserver.stopListening()
+
+ def assertContains(self, filename, contents): # NOQA
+ with open(filename) as _file:
+ try:
+ self.assertEqual(_file.read(), contents)
+ except Exception as ex:
+ self.fail(ex)
+ return filename
+
+ def assertNotContains(self, filename, contents, file_mode=''): # NOQA
+ with open(filename, file_mode) as _file:
+ try:
+ self.assertNotEqual(_file.read(), contents)
+ except Exception as ex:
+ self.fail(ex)
+ return filename
+
+ def test_download(self):
+ d = download_file(self.get_url(), fname('index.html'))
+ d.addCallback(self.assertEqual, fname('index.html'))
+ return d
+
+ def test_download_without_required_cookies(self):
+ url = self.get_url('cookie')
+ d = download_file(url, fname('none'))
+ d.addCallback(self.fail)
+ d.addErrback(self.assertIsInstance, Failure)
+ return d
+
+ def test_download_with_required_cookies(self):
+ url = self.get_url('cookie')
+ cookie = {'cookie': 'password=deluge'}
+ d = download_file(url, fname('monster'), headers=cookie)
+ d.addCallback(self.assertEqual, fname('monster'))
+ d.addCallback(self.assertContains, 'COOKIE MONSTER!')
+ return d
+
+ def test_download_with_rename(self):
+
+ if windows_check():
+ raise unittest.SkipTest('on windows \\ != / for path names')
+
+ url = self.get_url('rename?filename=renamed')
+ d = download_file(url, fname('original'))
+ d.addCallback(self.assertEqual, fname('renamed'))
+ d.addCallback(self.assertContains, 'This file should be called renamed')
+ return d
+
+ def test_download_with_rename_exists(self):
+
+ if windows_check():
+ raise unittest.SkipTest('on windows \\ != / for path names')
+
+ open(fname('renamed'), 'w').close()
+ url = self.get_url('rename?filename=renamed')
+ d = download_file(url, fname('original'))
+ d.addCallback(self.assertEqual, fname('renamed-1'))
+ d.addCallback(self.assertContains, 'This file should be called renamed')
+ return d
+
+ def test_download_with_rename_sanitised(self):
+
+ if windows_check():
+ raise unittest.SkipTest('on windows \\ != / for path names')
+
+ url = self.get_url('rename?filename=/etc/passwd')
+ d = download_file(url, fname('original'))
+ d.addCallback(self.assertEqual, fname('passwd'))
+ d.addCallback(self.assertContains, 'This file should be called /etc/passwd')
+ return d
+
+ def test_download_with_attachment_no_filename(self):
+ url = self.get_url('attachment')
+ d = download_file(url, fname('original'))
+ d.addCallback(self.assertEqual, fname('original'))
+ d.addCallback(self.assertContains, 'Attachement with no filename set')
+ return d
+
+ def test_download_with_rename_prevented(self):
+ url = self.get_url('rename?filename=spam')
+ d = download_file(url, fname('forced'), force_filename=True)
+ d.addCallback(self.assertEqual, fname('forced'))
+ d.addCallback(self.assertContains, 'This file should be called spam')
+ return d
+
+ def test_download_with_gzip_encoding(self):
+ url = self.get_url('gzip?msg=success')
+ d = download_file(url, fname('gzip_encoded'))
+ d.addCallback(self.assertContains, 'success')
+ return d
+
+ def test_download_with_gzip_encoding_disabled(self):
+ url = self.get_url('gzip?msg=unzip')
+ d = download_file(url, fname('gzip_encoded'), allow_compression=False)
+ d.addCallback(self.assertContains, 'unzip')
+ return d
+
+ def test_page_redirect_unhandled(self):
+ url = self.get_url('redirect')
+ d = download_file(url, fname('none'))
+ d.addCallback(self.fail)
+
+ def on_redirect(failure):
+ self.assertTrue(type(failure), PageRedirect)
+
+ d.addErrback(on_redirect)
+ return d
+
+ def test_page_redirect(self):
+ url = self.get_url('redirect')
+ d = download_file(url, fname('none'), handle_redirects=True)
+ d.addCallback(self.assertEqual, fname('none'))
+ d.addErrback(self.fail)
+ return d
+
+ def test_page_not_found(self):
+ d = download_file(self.get_url('page/not/found'), fname('none'))
+ d.addCallback(self.fail)
+ d.addErrback(self.assertIsInstance, Failure)
+ return d
+
+ def test_page_not_modified(self):
+ headers = {'If-Modified-Since': formatdate(usegmt=True)}
+ d = download_file(self.get_url(), fname('index.html'), headers=headers)
+ d.addCallback(self.fail)
+ d.addErrback(self.assertIsInstance, Failure)
+ return d
diff --git a/deluge/tests/test_json_api.py b/deluge/tests/test_json_api.py
new file mode 100644
index 0000000..1da64bf
--- /dev/null
+++ b/deluge/tests/test_json_api.py
@@ -0,0 +1,291 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import json as json_lib
+
+from mock import MagicMock
+from twisted.internet import defer
+from twisted.web import server
+from twisted.web.http import Request
+
+import deluge.common
+import deluge.component as component
+import deluge.ui.web.auth
+import deluge.ui.web.json_api
+from deluge.error import DelugeError
+from deluge.ui.client import client
+from deluge.ui.web.auth import Auth
+from deluge.ui.web.json_api import JSON, JSONException
+
+from . import common
+from .basetest import BaseTestCase
+from .common_web import WebServerMockBase
+from .daemon_base import DaemonBase
+
+common.disable_new_release_check()
+
+
+class JSONBase(BaseTestCase, DaemonBase):
+ def connect_client(self, *args, **kwargs):
+ return client.connect(
+ 'localhost',
+ self.listen_port,
+ username=kwargs.get('user', ''),
+ password=kwargs.get('password', ''),
+ )
+
+ def disconnect_client(self, *args):
+ return client.disconnect()
+
+ def tear_down(self):
+ d = component.shutdown()
+ d.addCallback(self.disconnect_client)
+ d.addCallback(self.terminate_core)
+ return d
+
+
+class JSONTestCase(JSONBase):
+ def set_up(self):
+ d = self.common_set_up()
+ d.addCallback(self.start_core)
+ d.addCallbacks(self.connect_client, self.terminate_core)
+ return d
+
+ @defer.inlineCallbacks
+ def test_get_remote_methods(self):
+ json = JSON()
+ methods = yield json.get_remote_methods()
+ self.assertEqual(type(methods), tuple)
+ self.assertTrue(len(methods) > 0)
+
+ def test_render_fail_disconnected(self):
+ json = JSON()
+ request = MagicMock()
+ request.method = b'POST'
+ request._disconnected = True
+ # When disconnected, returns empty string
+ self.assertEqual(json.render(request), '')
+
+ def test_render_fail(self):
+ json = JSON()
+ request = MagicMock()
+ request.method = b'POST'
+
+ def write(response_str):
+ request.write_was_called = True
+ response = json_lib.loads(response_str.decode())
+ self.assertEqual(response['result'], None)
+ self.assertEqual(response['id'], None)
+ self.assertEqual(
+ response['error']['message'], 'JSONException: JSON not decodable'
+ )
+ self.assertEqual(response['error']['code'], 5)
+
+ request.write = write
+ request.write_was_called = False
+ request._disconnected = False
+ request.getHeader.return_value = b'application/json'
+ self.assertEqual(json.render(request), server.NOT_DONE_YET)
+ self.assertTrue(request.write_was_called)
+
+ def test_handle_request_invalid_method(self):
+ json = JSON()
+ request = MagicMock()
+ json_data = {'method': 'no-existing-module.test', 'id': 0, 'params': []}
+ request.json = json_lib.dumps(json_data).encode()
+ request_id, result, error = json._handle_request(request)
+ self.assertEqual(error, {'message': 'Unknown method', 'code': 2})
+
+ def test_handle_request_invalid_json_request(self):
+ json = JSON()
+ request = MagicMock()
+ json_data = {'id': 0, 'params': []}
+ request.json = json_lib.dumps(json_data).encode()
+ self.assertRaises(JSONException, json._handle_request, request)
+ json_data = {'method': 'some.method', 'params': []}
+ request.json = json_lib.dumps(json_data).encode()
+ self.assertRaises(JSONException, json._handle_request, request)
+ json_data = {'method': 'some.method', 'id': 0}
+ request.json = json_lib.dumps(json_data).encode()
+ self.assertRaises(JSONException, json._handle_request, request)
+
+ def test_on_json_request_invalid_content_type(self):
+ """Test for exception with content type not application/json"""
+ json = JSON()
+ request = MagicMock()
+ request.getHeader.return_value = b'text/plain'
+ json_data = {'method': 'some.method', 'id': 0, 'params': []}
+ request.json = json_lib.dumps(json_data).encode()
+ self.assertRaises(JSONException, json._on_json_request, request)
+
+
+class JSONCustomUserTestCase(JSONBase):
+ def set_up(self):
+ d = self.common_set_up()
+ d.addCallback(self.start_core)
+ return d
+
+ @defer.inlineCallbacks
+ def test_handle_request_auth_error(self):
+ yield self.connect_client()
+ json = JSON()
+ auth_conf = {'session_timeout': 10, 'sessions': {}}
+ Auth(auth_conf) # Must create the component
+
+ # Must be called to update remote methods in json object
+ yield json.get_remote_methods()
+
+ request = MagicMock()
+ request.getCookie = MagicMock(return_value=b'bad_value')
+ json_data = {'method': 'core.get_libtorrent_version', 'id': 0, 'params': []}
+ request.json = json_lib.dumps(json_data).encode()
+ request_id, result, error = json._handle_request(request)
+ self.assertEqual(error, {'message': 'Not authenticated', 'code': 1})
+
+
+class RPCRaiseDelugeErrorJSONTestCase(JSONBase):
+ def set_up(self):
+ d = self.common_set_up()
+ custom_script = """
+ from deluge.error import DelugeError
+ from deluge.core.rpcserver import export
+ class TestClass(object):
+ @export()
+ def test(self):
+ raise DelugeError('DelugeERROR')
+
+ test = TestClass()
+ daemon.rpcserver.register_object(test)
+"""
+ d.addCallback(self.start_core, custom_script=custom_script)
+ d.addCallbacks(self.connect_client, self.terminate_core)
+ return d
+
+ @defer.inlineCallbacks
+ def test_handle_request_method_raise_delugeerror(self):
+ json = JSON()
+
+ def get_session_id(s_id):
+ return s_id
+
+ self.patch(deluge.ui.web.auth, 'get_session_id', get_session_id)
+ auth_conf = {'session_timeout': 10, 'sessions': {}}
+ auth = Auth(auth_conf)
+ request = Request(MagicMock(), False)
+ request.base = b''
+ auth._create_session(request)
+ methods = yield json.get_remote_methods()
+ # Verify the function has been registered
+ self.assertTrue('testclass.test' in methods)
+
+ request = MagicMock()
+ session_id = list(auth.config['sessions'])[0]
+ request.getCookie = MagicMock(return_value=session_id.encode())
+ json_data = {'method': 'testclass.test', 'id': 0, 'params': []}
+ request.json = json_lib.dumps(json_data).encode()
+ request_id, result, error = json._handle_request(request)
+ result.addCallback(self.fail)
+
+ def on_error(error):
+ self.assertEqual(error.type, DelugeError)
+
+ result.addErrback(on_error)
+ yield result
+
+
+class JSONRequestFailedTestCase(JSONBase, WebServerMockBase):
+ def set_up(self):
+ d = self.common_set_up()
+ custom_script = """
+ from deluge.error import DelugeError
+ from deluge.core.rpcserver import export
+ from twisted.internet import reactor, task
+ class TestClass(object):
+ @export()
+ def test(self):
+ def test_raise_error():
+ raise DelugeError('DelugeERROR')
+
+ return task.deferLater(reactor, 1, test_raise_error)
+
+ test = TestClass()
+ daemon.rpcserver.register_object(test)
+"""
+ from twisted.internet.defer import Deferred
+
+ extra_callback = {
+ 'deferred': Deferred(),
+ 'types': ['stderr'],
+ 'timeout': 10,
+ 'triggers': [
+ {
+ 'expr': 'in test_raise_error',
+ 'value': lambda reader, data, data_all: 'Test',
+ }
+ ],
+ }
+
+ def on_test_raise(*args):
+ self.assertTrue('Unhandled error in Deferred:' in self.core.stderr_out)
+ self.assertTrue('in test_raise_error' in self.core.stderr_out)
+
+ extra_callback['deferred'].addCallback(on_test_raise)
+ d.addCallback(
+ self.start_core,
+ custom_script=custom_script,
+ print_stdout=False,
+ print_stderr=False,
+ timeout=5,
+ extra_callbacks=[extra_callback],
+ )
+ d.addCallbacks(self.connect_client, self.terminate_core)
+ return d
+
+ @defer.inlineCallbacks
+ def test_render_on_rpc_request_failed(self):
+ json = JSON()
+
+ methods = yield json.get_remote_methods()
+ # Verify the function has been registered
+ self.assertTrue('testclass.test' in methods)
+
+ request = MagicMock()
+
+ # Circumvent authentication
+ auth = Auth({})
+ self.mock_authentication_ignore(auth)
+
+ def write(response_str):
+ request.write_was_called = True
+ response = json_lib.loads(response_str.decode())
+ self.assertEqual(response['result'], None, 'BAD RESULT')
+ self.assertEqual(response['id'], 0)
+ self.assertEqual(
+ response['error']['message'],
+ 'Failure: [Failure instance: Traceback (failure with no frames):'
+ " <class 'deluge.error.DelugeError'>: DelugeERROR\n]",
+ )
+ self.assertEqual(response['error']['code'], 4)
+
+ request.write = write
+ request.write_was_called = False
+ request._disconnected = False
+ request.getHeader.return_value = b'application/json'
+ json_data = {'method': 'testclass.test', 'id': 0, 'params': []}
+ request.json = json_lib.dumps(json_data).encode()
+ d = json._on_json_request(request)
+
+ def on_success(arg):
+ self.assertEqual(arg, server.NOT_DONE_YET)
+ return True
+
+ d.addCallbacks(on_success, self.fail)
+ yield d
diff --git a/deluge/tests/test_log.py b/deluge/tests/test_log.py
new file mode 100644
index 0000000..572693b
--- /dev/null
+++ b/deluge/tests/test_log.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2015 Calum Lind <calumlind@gmail.com>
+# Copyright (C) 2010 Pedro Algarvio <ufs@ufsoft.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import warnings
+
+from deluge.log import setup_logger
+
+from .basetest import BaseTestCase
+
+
+class LogTestCase(BaseTestCase):
+ def set_up(self):
+ setup_logger(logging.DEBUG)
+
+ def tear_down(self):
+ setup_logger('none')
+
+ def test_old_log_deprecation_warning(self):
+ from deluge.log import LOG
+
+ with warnings.catch_warnings(record=True) as w:
+ # Cause all warnings to always be triggered.
+ warnings.simplefilter('always')
+ LOG.debug('foo')
+ self.assertEqual(w[-1].category, DeprecationWarning)
+
+ # def test_twisted_error_log(self):
+ # from twisted.internet import defer
+ # import deluge.component as component
+ # from deluge.core.eventmanager import EventManager
+ # EventManager()
+ #
+ # d = component.start()
+ #
+ # @defer.inlineCallbacks
+ # def call(*args):
+ # yield component.pause(["EventManager"])
+ # yield component.start(["EventManager"])
+ #
+ # d.addCallback(call)
+ # return d
diff --git a/deluge/tests/test_maketorrent.py b/deluge/tests/test_maketorrent.py
new file mode 100644
index 0000000..4e00996
--- /dev/null
+++ b/deluge/tests/test_maketorrent.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os
+import tempfile
+
+from twisted.trial import unittest
+
+from deluge import maketorrent
+from deluge.common import windows_check
+
+
+def check_torrent(filename):
+ # Test loading with libtorrent to make sure it's valid
+ from deluge._libtorrent import lt
+
+ lt.torrent_info(filename)
+
+ # Test loading with our internal TorrentInfo class
+ from deluge.ui.common import TorrentInfo
+
+ TorrentInfo(filename)
+
+
+class MakeTorrentTestCase(unittest.TestCase):
+ def test_save_multifile(self):
+ # Create a temporary folder for torrent creation
+ tmp_path = tempfile.mkdtemp()
+ with open(os.path.join(tmp_path, 'file_A'), 'wb') as _file:
+ _file.write(b'a' * (312 * 1024))
+ with open(os.path.join(tmp_path, 'file_B'), 'wb') as _file:
+ _file.write(b'b' * (2354 * 1024))
+ with open(os.path.join(tmp_path, 'file_C'), 'wb') as _file:
+ _file.write(b'c' * (11 * 1024))
+
+ t = maketorrent.TorrentMetadata()
+ t.data_path = tmp_path
+ tmp_fd, tmp_file = tempfile.mkstemp('.torrent')
+ t.save(tmp_file)
+
+ check_torrent(tmp_file)
+
+ os.remove(os.path.join(tmp_path, 'file_A'))
+ os.remove(os.path.join(tmp_path, 'file_B'))
+ os.remove(os.path.join(tmp_path, 'file_C'))
+ os.rmdir(tmp_path)
+ os.close(tmp_fd)
+ os.remove(tmp_file)
+
+ def test_save_singlefile(self):
+ if windows_check():
+ raise unittest.SkipTest('on windows file not released')
+ tmp_data = tempfile.mkstemp('testdata')[1]
+ with open(tmp_data, 'wb') as _file:
+ _file.write(b'a' * (2314 * 1024))
+ t = maketorrent.TorrentMetadata()
+ t.data_path = tmp_data
+ tmp_fd, tmp_file = tempfile.mkstemp('.torrent')
+ t.save(tmp_file)
+
+ check_torrent(tmp_file)
+
+ os.remove(tmp_data)
+ os.close(tmp_fd)
+ os.remove(tmp_file)
+
+ def test_save_multifile_padded(self):
+ # Create a temporary folder for torrent creation
+ tmp_path = tempfile.mkdtemp()
+ with open(os.path.join(tmp_path, 'file_A'), 'wb') as _file:
+ _file.write(b'a' * (312 * 1024))
+ with open(os.path.join(tmp_path, 'file_B'), 'wb') as _file:
+ _file.write(b'b' * (2354 * 1024))
+ with open(os.path.join(tmp_path, 'file_C'), 'wb') as _file:
+ _file.write(b'c' * (11 * 1024))
+
+ t = maketorrent.TorrentMetadata()
+ t.data_path = tmp_path
+ t.pad_files = True
+ tmp_fd, tmp_file = tempfile.mkstemp('.torrent')
+ t.save(tmp_file)
+
+ check_torrent(tmp_file)
+
+ os.remove(os.path.join(tmp_path, 'file_A'))
+ os.remove(os.path.join(tmp_path, 'file_B'))
+ os.remove(os.path.join(tmp_path, 'file_C'))
+ os.rmdir(tmp_path)
+ os.close(tmp_fd)
+ os.remove(tmp_file)
diff --git a/deluge/tests/test_metafile.py b/deluge/tests/test_metafile.py
new file mode 100644
index 0000000..fc6507c
--- /dev/null
+++ b/deluge/tests/test_metafile.py
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os
+import tempfile
+
+from twisted.trial import unittest
+
+from deluge import metafile
+from deluge.common import windows_check
+
+
+def check_torrent(filename):
+ # Test loading with libtorrent to make sure it's valid
+ from deluge._libtorrent import lt
+
+ lt.torrent_info(filename)
+
+ # Test loading with our internal TorrentInfo class
+ from deluge.ui.common import TorrentInfo
+
+ TorrentInfo(filename)
+
+
+class MetafileTestCase(unittest.TestCase):
+ def test_save_multifile(self):
+ # Create a temporary folder for torrent creation
+ tmp_path = tempfile.mkdtemp()
+ with open(os.path.join(tmp_path, 'file_A'), 'wb') as tmp_file:
+ tmp_file.write(b'a' * (312 * 1024))
+ with open(os.path.join(tmp_path, 'file_B'), 'wb') as tmp_file:
+ tmp_file.write(b'b' * (2354 * 1024))
+ with open(os.path.join(tmp_path, 'file_C'), 'wb') as tmp_file:
+ tmp_file.write(b'c' * (11 * 1024))
+
+ tmp_fd, tmp_file = tempfile.mkstemp('.torrent')
+ metafile.make_meta_file(tmp_path, '', 32768, target=tmp_file)
+
+ check_torrent(tmp_file)
+
+ os.remove(os.path.join(tmp_path, 'file_A'))
+ os.remove(os.path.join(tmp_path, 'file_B'))
+ os.remove(os.path.join(tmp_path, 'file_C'))
+ os.rmdir(tmp_path)
+ os.close(tmp_fd)
+ os.remove(tmp_file)
+
+ def test_save_singlefile(self):
+ if windows_check():
+ raise unittest.SkipTest('on windows \\ != / for path names')
+ tmp_path = tempfile.mkstemp('testdata')[1]
+ with open(tmp_path, 'wb') as tmp_file:
+ tmp_file.write(b'a' * (2314 * 1024))
+
+ tmp_fd, tmp_file = tempfile.mkstemp('.torrent')
+ metafile.make_meta_file(tmp_path, '', 32768, target=tmp_file)
+
+ check_torrent(tmp_file)
+
+ os.remove(tmp_path)
+ os.close(tmp_fd)
+ os.remove(tmp_file)
diff --git a/deluge/tests/test_plugin_metadata.py b/deluge/tests/test_plugin_metadata.py
new file mode 100644
index 0000000..436fc2c
--- /dev/null
+++ b/deluge/tests/test_plugin_metadata.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2015 Calum Lind <calumlind@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.pluginmanagerbase import PluginManagerBase
+
+from . import common
+from .basetest import BaseTestCase
+
+
+class PluginManagerBaseTestCase(BaseTestCase):
+ def set_up(self):
+ common.set_tmp_config_dir()
+
+ def test_get_plugin_info(self):
+ pm = PluginManagerBase('core.conf', 'deluge.plugin.core')
+ for p in pm.get_available_plugins():
+ for key, value in pm.get_plugin_info(p).items():
+ self.assertTrue(isinstance('%s: %s' % (key, value), ''.__class__))
+
+ def test_get_plugin_info_invalid_name(self):
+ pm = PluginManagerBase('core.conf', 'deluge.plugin.core')
+ for key, value in pm.get_plugin_info('random').items():
+ self.assertEqual(value, 'not available')
diff --git a/deluge/tests/test_rpcserver.py b/deluge/tests/test_rpcserver.py
new file mode 100644
index 0000000..02f9af0
--- /dev/null
+++ b/deluge/tests/test_rpcserver.py
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013 Bro <bro.development@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.component as component
+import deluge.error
+from deluge.common import get_localhost_auth
+from deluge.core import rpcserver
+from deluge.core.authmanager import AuthManager
+from deluge.core.rpcserver import DelugeRPCProtocol, RPCServer
+from deluge.log import setup_logger
+
+from .basetest import BaseTestCase
+
+setup_logger('none')
+
+
+class DelugeRPCProtocolTester(DelugeRPCProtocol):
+
+ messages = []
+
+ def transfer_message(self, data):
+ self.messages.append(data)
+
+
+class RPCServerTestCase(BaseTestCase):
+ def set_up(self):
+ self.rpcserver = RPCServer(listen=False)
+ self.rpcserver.factory.protocol = DelugeRPCProtocolTester
+ self.factory = self.rpcserver.factory
+ self.session_id = '0'
+ self.request_id = 11
+ self.protocol = self.rpcserver.factory.protocol()
+ self.protocol.factory = self.factory
+ self.protocol.transport = self.protocol
+ self.factory.session_protocols[self.session_id] = self.protocol
+ self.factory.authorized_sessions[self.session_id] = None
+ self.factory.interested_events[self.session_id] = ['TorrentFolderRenamedEvent']
+ self.protocol.sessionno = self.session_id
+ return component.start()
+
+ def tear_down(self):
+ def on_shutdown(result):
+ del self.rpcserver
+
+ return component.shutdown().addCallback(on_shutdown)
+
+ def test_emit_event_for_session_id(self):
+ torrent_id = '12'
+ from deluge.event import TorrentFolderRenamedEvent
+
+ data = [torrent_id, 'new name', 'old name']
+ e = TorrentFolderRenamedEvent(*data)
+ self.rpcserver.emit_event_for_session_id(self.session_id, e)
+ msg = self.protocol.messages.pop()
+ self.assertEqual(msg[0], rpcserver.RPC_EVENT, str(msg))
+ self.assertEqual(msg[1], 'TorrentFolderRenamedEvent', str(msg))
+ self.assertEqual(msg[2], data, str(msg))
+
+ def test_invalid_client_login(self):
+ self.protocol.dispatch(self.request_id, 'daemon.login', [1], {})
+ msg = self.protocol.messages.pop()
+ self.assertEqual(msg[0], rpcserver.RPC_ERROR)
+ self.assertEqual(msg[1], self.request_id)
+
+ def test_valid_client_login(self):
+ self.authmanager = AuthManager()
+ auth = get_localhost_auth()
+ self.protocol.dispatch(
+ self.request_id, 'daemon.login', auth, {'client_version': 'Test'}
+ )
+ msg = self.protocol.messages.pop()
+ self.assertEqual(msg[0], rpcserver.RPC_RESPONSE, str(msg))
+ self.assertEqual(msg[1], self.request_id, str(msg))
+ self.assertEqual(msg[2], rpcserver.AUTH_LEVEL_ADMIN, str(msg))
+
+ def test_client_login_error(self):
+ # This test causes error log prints while running the test...
+ self.protocol.transport = None # This should cause AttributeError
+ self.authmanager = AuthManager()
+ auth = get_localhost_auth()
+ self.protocol.dispatch(
+ self.request_id, 'daemon.login', auth, {'client_version': 'Test'}
+ )
+ msg = self.protocol.messages.pop()
+ self.assertEqual(msg[0], rpcserver.RPC_ERROR)
+ self.assertEqual(msg[1], self.request_id)
+ self.assertEqual(msg[2], 'WrappedException')
+ self.assertEqual(msg[3][1], 'AttributeError')
+
+ def test_client_invalid_method_call(self):
+ self.authmanager = AuthManager()
+ auth = get_localhost_auth()
+ self.protocol.dispatch(self.request_id, 'invalid_function', auth, {})
+ msg = self.protocol.messages.pop()
+ self.assertEqual(msg[0], rpcserver.RPC_ERROR)
+ self.assertEqual(msg[1], self.request_id)
+ self.assertEqual(msg[2], 'WrappedException')
+ self.assertEqual(msg[3][1], 'AttributeError')
+
+ def test_daemon_info(self):
+ self.protocol.dispatch(self.request_id, 'daemon.info', [], {})
+ msg = self.protocol.messages.pop()
+ self.assertEqual(msg[0], rpcserver.RPC_RESPONSE, str(msg))
+ self.assertEqual(msg[1], self.request_id, str(msg))
+ self.assertEqual(msg[2], deluge.common.get_version(), str(msg))
diff --git a/deluge/tests/test_security.py b/deluge/tests/test_security.py
new file mode 100644
index 0000000..3794049
--- /dev/null
+++ b/deluge/tests/test_security.py
@@ -0,0 +1,184 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+import os
+
+import pytest
+from twisted.internet.utils import getProcessOutputAndValue
+
+import deluge.component as component
+import deluge.ui.web.server
+from deluge import configmanager
+from deluge.common import windows_check
+from deluge.ui.web.server import DelugeWeb
+
+from .basetest import BaseTestCase
+from .common import get_test_data_file
+from .common_web import WebServerTestBase
+from .daemon_base import DaemonBase
+
+SECURITY_TESTS = bool(os.getenv('SECURITY_TESTS', False))
+
+
+class SecurityBaseTestCase(object):
+ if windows_check():
+ skip = 'windows can`t run .sh files'
+ elif not SECURITY_TESTS:
+ skip = 'Skipping security tests'
+
+ http_err = 'can\'t run http tests on daemon'
+
+ def __init__(self):
+ self.home_dir = os.path.expanduser('~')
+ self.port = 8112
+
+ def _run_test(self, test):
+ d = getProcessOutputAndValue(
+ 'bash',
+ [
+ get_test_data_file('testssl.sh'),
+ '--quiet',
+ '--nodns',
+ '--color',
+ '0',
+ test,
+ '127.0.0.1:%d' % self.port,
+ ],
+ )
+
+ def on_result(results):
+
+ if test == '-e':
+ results = results[0].split('\n')[7:-6]
+ self.assertTrue(len(results) > 3)
+ else:
+ self.assertIn('OK', results[0])
+ self.assertNotIn('NOT ok', results[0])
+
+ d.addCallback(on_result)
+ return d
+
+ def test_secured_webserver_protocol(self):
+ return self._run_test('-p')
+
+ def test_secured_webserver_standard_ciphers(self):
+ return self._run_test('-s')
+
+ def test_secured_webserver_heartbleed_vulnerability(self):
+ return self._run_test('-H')
+
+ def test_secured_webserver_css_injection_vulnerability(self):
+ return self._run_test('-I')
+
+ def test_secured_webserver_ticketbleed_vulnerability(self):
+ return self._run_test('-T')
+
+ def test_secured_webserver_renegotiation_vulnerabilities(self):
+ return self._run_test('-R')
+
+ def test_secured_webserver_crime_vulnerability(self):
+ return self._run_test('-C')
+
+ def test_secured_webserver_breach_vulnerability(self):
+ return self._run_test('-B')
+
+ def test_secured_webserver_poodle_vulnerability(self):
+ return self._run_test('-O')
+
+ def test_secured_webserver_tls_fallback_scsv_mitigation_vulnerability(self):
+ return self._run_test('-Z')
+
+ def test_secured_webserver_sweet32_vulnerability(self):
+ return self._run_test('-W')
+
+ def test_secured_webserver_beast_vulnerability(self):
+ return self._run_test('-A')
+
+ def test_secured_webserver_lucky13_vulnerability(self):
+ return self._run_test('-L')
+
+ def test_secured_webserver_freak_vulnerability(self):
+ return self._run_test('-F')
+
+ def test_secured_webserver_logjam_vulnerability(self):
+ return self._run_test('-J')
+
+ def test_secured_webserver_drown_vulnerability(self):
+ return self._run_test('-D')
+
+ def test_secured_webserver_forward_secrecy_settings(self):
+ return self._run_test('-f')
+
+ def test_secured_webserver_rc4_ciphers(self):
+ return self._run_test('-4')
+
+ def test_secured_webserver_preference(self):
+ return self._run_test('-P')
+
+ def test_secured_webserver_headers(self):
+ return self._run_test('-h')
+
+ def test_secured_webserver_ciphers(self):
+ return self._run_test('-e')
+
+
+@pytest.mark.security
+class DaemonSecurityTestCase(BaseTestCase, DaemonBase, SecurityBaseTestCase):
+
+ if windows_check():
+ skip = 'windows can\'t start_core not enough arguments for format string'
+
+ def __init__(self, testname):
+ super(DaemonSecurityTestCase, self).__init__(testname)
+ DaemonBase.__init__(self)
+ SecurityBaseTestCase.__init__(self)
+
+ def setUp(self):
+ skip = False
+ for not_http_test in ('breach', 'headers', 'ticketbleed'):
+ if not_http_test in self.id().split('.')[-1]:
+ self.skipTest(SecurityBaseTestCase.http_err)
+ skip = True
+ if not skip:
+ super(DaemonSecurityTestCase, self).setUp()
+
+ def set_up(self):
+ d = self.common_set_up()
+ self.port = self.listen_port
+ d.addCallback(self.start_core)
+ d.addErrback(self.terminate_core)
+ return d
+
+ def tear_down(self):
+ d = component.shutdown()
+ d.addCallback(self.terminate_core)
+ return d
+
+
+@pytest.mark.security
+class WebUISecurityTestBase(WebServerTestBase, SecurityBaseTestCase):
+ def __init__(self, testname):
+ super(WebUISecurityTestBase, self).__init__(testname)
+ SecurityBaseTestCase.__init__(self)
+
+ def start_webapi(self, arg):
+ self.port = self.webserver_listen_port = 8999
+
+ config_defaults = deluge.ui.web.server.CONFIG_DEFAULTS.copy()
+ config_defaults['port'] = self.webserver_listen_port
+ config_defaults['https'] = True
+ self.config = configmanager.ConfigManager('web.conf', config_defaults)
+
+ self.deluge_web = DelugeWeb(daemon=False)
+
+ host = list(self.deluge_web.web_api.hostlist.config['hosts'][0])
+ host[2] = self.listen_port
+ self.deluge_web.web_api.hostlist.config['hosts'][0] = tuple(host)
+ self.host_id = host[0]
+ self.deluge_web.start()
diff --git a/deluge/tests/test_sessionproxy.py b/deluge/tests/test_sessionproxy.py
new file mode 100644
index 0000000..03f3cc2
--- /dev/null
+++ b/deluge/tests/test_sessionproxy.py
@@ -0,0 +1,164 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from twisted.internet.defer import maybeDeferred, succeed
+from twisted.internet.task import Clock
+
+import deluge.component as component
+import deluge.ui.sessionproxy
+
+from .basetest import BaseTestCase
+
+
+class Core(object):
+ def __init__(self):
+ self.reset()
+
+ def reset(self):
+ self.torrents = {}
+ self.torrents['a'] = {'key1': 1, 'key2': 2, 'key3': 3}
+ self.torrents['b'] = {'key1': 1, 'key2': 2, 'key3': 3}
+ self.torrents['c'] = {'key1': 1, 'key2': 2, 'key3': 3}
+ self.prev_status = {}
+
+ def get_session_state(self):
+ return maybeDeferred(self.torrents.keys)
+
+ def get_torrent_status(self, torrent_id, keys, diff=False):
+ if not keys:
+ keys = list(self.torrents[torrent_id])
+
+ if not diff:
+ ret = {}
+ for key in keys:
+ ret[key] = self.torrents[torrent_id][key]
+
+ return succeed(ret)
+
+ else:
+ ret = {}
+ if torrent_id in self.prev_status:
+ for key in keys:
+ if (
+ self.prev_status[torrent_id][key]
+ != self.torrents[torrent_id][key]
+ ):
+ ret[key] = self.torrents[torrent_id][key]
+ else:
+ ret = self.torrents[torrent_id]
+ self.prev_status[torrent_id] = dict(self.torrents[torrent_id])
+ return succeed(ret)
+
+ def get_torrents_status(self, filter_dict, keys, diff=False):
+ if not filter_dict:
+ filter_dict['id'] = list(self.torrents)
+ if not keys:
+ keys = list(self.torrents['a'])
+ if not diff:
+ if 'id' in filter_dict:
+ torrents = filter_dict['id']
+ ret = {}
+ for torrent in torrents:
+ ret[torrent] = {}
+ for key in keys:
+ ret[torrent][key] = self.torrents[torrent][key]
+ return succeed(ret)
+ else:
+ if 'id' in filter_dict:
+ torrents = filter_dict['id']
+ ret = {}
+ for torrent in torrents:
+ ret[torrent] = {}
+ if torrent in self.prev_status:
+ for key in self.prev_status[torrent]:
+ if (
+ self.prev_status[torrent][key]
+ != self.torrents[torrent][key]
+ ):
+ ret[torrent][key] = self.torrents[torrent][key]
+ else:
+ ret[torrent] = dict(self.torrents[torrent])
+
+ self.prev_status[torrent] = dict(self.torrents[torrent])
+ return succeed(ret)
+
+
+class Client(object):
+ def __init__(self):
+ self.core = Core()
+
+ def __noop__(self, *args, **kwargs):
+ return None
+
+ def __getattr__(self, *args, **kwargs):
+ return self.__noop__
+
+
+client = Client()
+
+
+class SessionProxyTestCase(BaseTestCase):
+ def set_up(self):
+ self.clock = Clock()
+ self.patch(deluge.ui.sessionproxy, 'time', self.clock.seconds)
+ self.patch(deluge.ui.sessionproxy, 'client', client)
+ self.sp = deluge.ui.sessionproxy.SessionProxy()
+ client.core.reset()
+ d = self.sp.start()
+
+ def do_get_torrents_status(torrent_ids):
+ inital_keys = ['key1']
+ # Advance clock to expire the cache times
+ self.clock.advance(2)
+ return self.sp.get_torrents_status({'id': torrent_ids}, inital_keys)
+
+ d.addCallback(do_get_torrents_status)
+ return d
+
+ def tear_down(self):
+ return component.deregister(self.sp)
+
+ def test_startup(self):
+ self.assertEqual(client.core.torrents['a'], self.sp.torrents['a'][1])
+
+ def test_get_torrent_status_no_change(self):
+ d = self.sp.get_torrent_status('a', [])
+ d.addCallback(self.assertEqual, client.core.torrents['a'])
+ return d
+
+ def test_get_torrent_status_change_with_cache(self):
+ client.core.torrents['a']['key1'] = 2
+ d = self.sp.get_torrent_status('a', ['key1'])
+ d.addCallback(self.assertEqual, {'key1': 1})
+ return d
+
+ def test_get_torrent_status_change_without_cache(self):
+ client.core.torrents['a']['key1'] = 2
+ self.clock.advance(self.sp.cache_time + 0.1)
+ d = self.sp.get_torrent_status('a', [])
+ d.addCallback(self.assertEqual, client.core.torrents['a'])
+ return d
+
+ def test_get_torrent_status_key_not_updated(self):
+ self.clock.advance(self.sp.cache_time + 0.1)
+ self.sp.get_torrent_status('a', ['key1'])
+ client.core.torrents['a']['key2'] = 99
+ d = self.sp.get_torrent_status('a', ['key2'])
+ d.addCallback(self.assertEqual, {'key2': 99})
+ return d
+
+ def test_get_torrents_status_key_not_updated(self):
+ self.clock.advance(self.sp.cache_time + 0.1)
+ self.sp.get_torrents_status({'id': ['a']}, ['key1'])
+ client.core.torrents['a']['key2'] = 99
+ d = self.sp.get_torrents_status({'id': ['a']}, ['key2'])
+ d.addCallback(self.assertEqual, {'a': {'key2': 99}})
+ return d
diff --git a/deluge/tests/test_torrent.py b/deluge/tests/test_torrent.py
new file mode 100644
index 0000000..70fec47
--- /dev/null
+++ b/deluge/tests/test_torrent.py
@@ -0,0 +1,347 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+import os
+import time
+from base64 import b64encode
+
+import mock
+from twisted.internet import reactor
+from twisted.internet.task import defer, deferLater
+from twisted.trial import unittest
+
+import deluge.component as component
+import deluge.core.torrent
+import deluge.tests.common as common
+from deluge._libtorrent import lt
+from deluge.common import utf8_encode_structure, windows_check
+from deluge.core.core import Core
+from deluge.core.rpcserver import RPCServer
+from deluge.core.torrent import Torrent
+from deluge.core.torrentmanager import TorrentManager, TorrentState
+
+from .basetest import BaseTestCase
+
+
+class TorrentTestCase(BaseTestCase):
+ def setup_config(self):
+ config_dir = common.set_tmp_config_dir()
+ core_config = deluge.config.Config(
+ 'core.conf',
+ defaults=deluge.core.preferencesmanager.DEFAULT_PREFS,
+ config_dir=config_dir,
+ )
+ core_config.save()
+
+ def set_up(self):
+ self.setup_config()
+ self.rpcserver = RPCServer(listen=False)
+ self.core = Core()
+ self.core.config.config['lsd'] = False
+ self.core.config.config['new_release_check'] = False
+ self.session = self.core.session
+ self.torrent = None
+ return component.start()
+
+ def tear_down(self):
+ def on_shutdown(result):
+ del self.rpcserver
+ del self.core
+
+ return component.shutdown().addCallback(on_shutdown)
+
+ def print_priority_list(self, priorities):
+ tmp = ''
+ for i, p in enumerate(priorities):
+ if i % 100 == 0:
+ print(tmp)
+ tmp = ''
+ tmp += '%s' % p
+ print(tmp)
+
+ def assert_state(self, torrent, state):
+ torrent.update_state()
+ self.assertEqual(torrent.state, state)
+
+ def get_torrent_atp(self, filename):
+ filename = common.get_test_data_file(filename)
+ with open(filename, 'rb') as _file:
+ info = lt.torrent_info(lt.bdecode(_file.read()))
+ atp = {
+ 'ti': info,
+ 'save_path': os.getcwd(),
+ 'storage_mode': lt.storage_mode_t.storage_mode_sparse,
+ 'flags': (
+ lt.add_torrent_params_flags_t.flag_auto_managed
+ | lt.add_torrent_params_flags_t.flag_duplicate_is_error
+ & ~lt.add_torrent_params_flags_t.flag_paused
+ ),
+ }
+ return atp
+
+ def test_set_file_priorities(self):
+ atp = self.get_torrent_atp('dir_with_6_files.torrent')
+ handle = self.session.add_torrent(atp)
+ torrent = Torrent(handle, {})
+
+ result = torrent.get_file_priorities()
+ self.assertTrue(all(x == 4 for x in result))
+
+ new_priorities = [3, 1, 2, 0, 5, 6, 7]
+ torrent.set_file_priorities(new_priorities)
+ self.assertEqual(torrent.get_file_priorities(), new_priorities)
+
+ # Test with handle.piece_priorities as handle.file_priorities async
+ # updates and will return old value. Also need to remove a priority
+ # value as one file is much smaller than piece size so doesn't show.
+ piece_prio = handle.piece_priorities()
+ result = all(p in piece_prio for p in [3, 2, 0, 5, 6, 7])
+ self.assertTrue(result)
+
+ def test_set_prioritize_first_last_pieces(self):
+ piece_indexes = [
+ 0,
+ 1,
+ 50,
+ 51,
+ 52,
+ 110,
+ 111,
+ 112,
+ 113,
+ 200,
+ 201,
+ 202,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 457,
+ 458,
+ 459,
+ 460,
+ 461,
+ 462,
+ ]
+ self.run_test_set_prioritize_first_last_pieces(
+ 'dir_with_6_files.torrent', piece_indexes
+ )
+
+ def run_test_set_prioritize_first_last_pieces(
+ self, torrent_file, prioritized_piece_indexes
+ ):
+ atp = self.get_torrent_atp(torrent_file)
+ handle = self.session.add_torrent(atp)
+
+ self.torrent = Torrent(handle, {})
+ priorities_original = handle.piece_priorities()
+ self.torrent.set_prioritize_first_last_pieces(True)
+ priorities = handle.piece_priorities()
+
+ # The length of the list of new priorites is the same as the original
+ self.assertEqual(len(priorities_original), len(priorities))
+
+ # Test the priority of all the pieces against the calculated indexes.
+ for idx, priority in enumerate(priorities):
+ if idx in prioritized_piece_indexes:
+ self.assertEqual(priorities[idx], 7)
+ else:
+ self.assertEqual(priorities[idx], 4)
+
+ # self.print_priority_list(priorities)
+
+ def test_set_prioritize_first_last_pieces_false(self):
+ atp = self.get_torrent_atp('dir_with_6_files.torrent')
+ handle = self.session.add_torrent(atp)
+ self.torrent = Torrent(handle, {})
+ # First set some pieces prioritized
+ self.torrent.set_prioritize_first_last_pieces(True)
+ # Reset pirorities
+ self.torrent.set_prioritize_first_last_pieces(False)
+ priorities = handle.piece_priorities()
+
+ # Test the priority of the prioritized pieces
+ for i in priorities:
+ self.assertEqual(priorities[i], 4)
+
+ # self.print_priority_list(priorities)
+
+ def test_torrent_error_data_missing(self):
+ if windows_check():
+ raise unittest.SkipTest('unexpected end of file in bencoded string')
+ options = {'seed_mode': True}
+ filename = common.get_test_data_file('test_torrent.file.torrent')
+ with open(filename, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ torrent_id = self.core.add_torrent_file(filename, filedump, options)
+ torrent = self.core.torrentmanager.torrents[torrent_id]
+
+ time.sleep(0.5) # Delay to wait for lt to finish check on Travis.
+ self.assert_state(torrent, 'Seeding')
+
+ # Force an error by reading (non-existant) piece from disk
+ torrent.handle.read_piece(0)
+ time.sleep(0.2) # Delay to wait for alert from lt
+ self.assert_state(torrent, 'Error')
+
+ def test_torrent_error_resume_original_state(self):
+ if windows_check():
+ raise unittest.SkipTest('unexpected end of file in bencoded string')
+ options = {'seed_mode': True, 'add_paused': True}
+ filename = common.get_test_data_file('test_torrent.file.torrent')
+ with open(filename, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ torrent_id = self.core.add_torrent_file(filename, filedump, options)
+ torrent = self.core.torrentmanager.torrents[torrent_id]
+
+ orig_state = 'Paused'
+ self.assert_state(torrent, orig_state)
+
+ # Force an error by reading (non-existant) piece from disk
+ torrent.handle.read_piece(0)
+ time.sleep(0.2) # Delay to wait for alert from lt
+ self.assert_state(torrent, 'Error')
+
+ # Clear error and verify returned to original state
+ torrent.force_recheck()
+
+ def test_torrent_error_resume_data_unaltered(self):
+ if windows_check():
+ raise unittest.SkipTest('unexpected end of file in bencoded string')
+ if lt.__version__.split('.')[1] == '2':
+ raise unittest.SkipTest('Test not working as expected on lt 1.2')
+
+ resume_data = {
+ 'active_time': 13399,
+ 'num_incomplete': 16777215,
+ 'announce_to_lsd': 1,
+ 'seed_mode': 0,
+ 'pieces': '\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01',
+ 'paused': 0,
+ 'seeding_time': 13399,
+ 'last_scrape': 13399,
+ 'info-hash': '-\xc5\xd0\xe7\x1af\xfeid\x9ad\r9\xcb\x00\xa2YpIs',
+ 'max_uploads': 16777215,
+ 'max_connections': 16777215,
+ 'num_downloaders': 16777215,
+ 'total_downloaded': 0,
+ 'file-format': 'libtorrent resume file',
+ 'peers6': '',
+ 'added_time': 1411826665,
+ 'banned_peers6': '',
+ 'file_priority': [1],
+ 'last_seen_complete': 0,
+ 'total_uploaded': 0,
+ 'piece_priority': '\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01',
+ 'file-version': 1,
+ 'announce_to_dht': 1,
+ 'auto_managed': 1,
+ 'upload_rate_limit': 0,
+ 'completed_time': 1411826665,
+ 'allocation': 'sparse',
+ 'blocks per piece': 2,
+ 'download_rate_limit': 0,
+ 'libtorrent-version': '0.16.17.0',
+ 'banned_peers': '',
+ 'num_seeds': 16777215,
+ 'sequential_download': 0,
+ 'announce_to_trackers': 1,
+ 'peers': '\n\x00\x02\x0f=\xc6SC\x17]\xd8}\x7f\x00\x00\x01=\xc6',
+ 'finished_time': 13399,
+ 'last_upload': 13399,
+ 'trackers': [[]],
+ 'super_seeding': 0,
+ 'file sizes': [[512000, 1411826586]],
+ 'last_download': 13399,
+ }
+ torrent_state = TorrentState(
+ torrent_id='2dc5d0e71a66fe69649a640d39cb00a259704973',
+ filename='test_torrent.file.torrent',
+ name='',
+ save_path='/home/ubuntu/Downloads',
+ file_priorities=[1],
+ is_finished=True,
+ )
+
+ filename = common.get_test_data_file('test_torrent.file.torrent')
+ with open(filename, 'rb') as _file:
+ filedump = _file.read()
+ resume_data = utf8_encode_structure(resume_data)
+ torrent_id = self.core.torrentmanager.add(
+ state=torrent_state, filedump=filedump, resume_data=lt.bencode(resume_data)
+ )
+ torrent = self.core.torrentmanager.torrents[torrent_id]
+
+ def assert_resume_data():
+ self.assert_state(torrent, 'Error')
+ tm_resume_data = lt.bdecode(
+ self.core.torrentmanager.resume_data[torrent.torrent_id]
+ )
+ self.assertEqual(tm_resume_data, resume_data)
+
+ return deferLater(reactor, 0.5, assert_resume_data)
+
+ def test_get_eta_seeding(self):
+ atp = self.get_torrent_atp('test_torrent.file.torrent')
+ handle = self.session.add_torrent(atp)
+ self.torrent = Torrent(handle, {})
+ self.assertEqual(self.torrent.get_eta(), 0)
+ self.torrent.status = mock.MagicMock()
+
+ self.torrent.status.upload_payload_rate = 5000
+ self.torrent.status.download_payload_rate = 0
+ self.torrent.status.all_time_download = 10000
+ self.torrent.status.all_time_upload = 500
+ self.torrent.is_finished = True
+ self.torrent.options = {'stop_at_ratio': False}
+ # Test finished and uploading but no stop_at_ratio set.
+ self.assertEqual(self.torrent.get_eta(), 0)
+
+ self.torrent.options = {'stop_at_ratio': True, 'stop_ratio': 1.5}
+ result = self.torrent.get_eta()
+ self.assertEqual(result, 2)
+ self.assertIsInstance(result, int)
+
+ def test_get_eta_downloading(self):
+ atp = self.get_torrent_atp('test_torrent.file.torrent')
+ handle = self.session.add_torrent(atp)
+ self.torrent = Torrent(handle, {})
+ self.assertEqual(self.torrent.get_eta(), 0)
+
+ self.torrent.status = mock.MagicMock()
+ self.torrent.status.download_payload_rate = 50
+ self.torrent.status.total_wanted = 10000
+ self.torrent.status.total_wanted_done = 5000
+
+ result = self.torrent.get_eta()
+ self.assertEqual(result, 100)
+ self.assertIsInstance(result, int)
+
+ def test_get_name_unicode(self):
+ """Test retrieving a unicode torrent name from libtorrent."""
+ atp = self.get_torrent_atp('unicode_file.torrent')
+ handle = self.session.add_torrent(atp)
+ self.torrent = Torrent(handle, {})
+ self.assertEqual(self.torrent.get_name(), 'সà§à¦•à§à¦®à¦¾à¦° রায়.mkv')
+
+ def test_rename_unicode(self):
+ """Test renaming file/folders with unicode filenames."""
+ atp = self.get_torrent_atp('unicode_filenames.torrent')
+ handle = self.session.add_torrent(atp)
+ self.torrent = Torrent(handle, {})
+ # Ignore TorrentManager method call
+ TorrentManager.save_resume_data = mock.MagicMock
+
+ result = self.torrent.rename_folder('unicode_filenames', 'Горбачёв')
+ self.assertIsInstance(result, defer.DeferredList)
+
+ result = self.torrent.rename_files([[0, 'new_рбачёв']])
+ self.assertIsNone(result)
diff --git a/deluge/tests/test_torrentmanager.py b/deluge/tests/test_torrentmanager.py
new file mode 100644
index 0000000..bf84f45
--- /dev/null
+++ b/deluge/tests/test_torrentmanager.py
@@ -0,0 +1,120 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import warnings
+from base64 import b64encode
+
+import mock
+import pytest
+from twisted.internet import defer, task
+
+from deluge import component
+from deluge.core.core import Core
+from deluge.core.rpcserver import RPCServer
+from deluge.error import InvalidTorrentError
+
+from . import common
+from .basetest import BaseTestCase
+
+warnings.filterwarnings('ignore', category=RuntimeWarning)
+warnings.resetwarnings()
+
+
+class TorrentmanagerTestCase(BaseTestCase):
+ def set_up(self):
+ common.set_tmp_config_dir()
+ self.rpcserver = RPCServer(listen=False)
+ self.core = Core()
+ self.core.config.config['lsd'] = False
+ self.clock = task.Clock()
+ self.tm = self.core.torrentmanager
+ self.tm.callLater = self.clock.callLater
+ return component.start()
+
+ def tear_down(self):
+ def on_shutdown(result):
+ del self.rpcserver
+ del self.core
+
+ return component.shutdown().addCallback(on_shutdown)
+
+ @defer.inlineCallbacks
+ def test_remove_torrent(self):
+ filename = common.get_test_data_file('test.torrent')
+ with open(filename, 'rb') as _file:
+ filedump = _file.read()
+ torrent_id = yield self.core.add_torrent_file_async(
+ filename, b64encode(filedump), {}
+ )
+ self.assertTrue(self.tm.remove(torrent_id, False))
+
+ def test_prefetch_metadata(self):
+ from deluge._libtorrent import lt
+
+ with open(common.get_test_data_file('test.torrent'), 'rb') as _file:
+ t_info = lt.torrent_info(lt.bdecode(_file.read()))
+ mock_alert = mock.MagicMock()
+ mock_alert.handle.info_hash = mock.MagicMock(
+ return_value='ab570cdd5a17ea1b61e970bb72047de141bce173'
+ )
+ mock_alert.handle.get_torrent_info = mock.MagicMock(return_value=t_info)
+
+ magnet = 'magnet:?xt=urn:btih:ab570cdd5a17ea1b61e970bb72047de141bce173'
+ d = self.tm.prefetch_metadata(magnet, 30)
+ self.tm.on_alert_metadata_received(mock_alert)
+
+ expected = (
+ 'ab570cdd5a17ea1b61e970bb72047de141bce173',
+ {
+ b'piece length': 32768,
+ b'sha1': (
+ b'2\xce\xb6\xa8"\xd7\xf0\xd4\xbf\xdc^K\xba\x1bh'
+ b'\x9d\xc5\xb7\xac\xdd'
+ ),
+ b'name': b'azcvsupdater_2.6.2.jar',
+ b'private': 0,
+ b'pieces': (
+ b'\xdb\x04B\x05\xc3\'\xdab\xb8su97\xa9u'
+ b'\xca<w\\\x1ef\xd4\x9b\x16\xa9}\xc0\x9f:\xfd'
+ b'\x97qv\x83\xa2"\xef\x9d7\x0by!\rl\xe5v\xb7'
+ b'\x18{\xf7/"P\xe9\x8d\x01D\x9e8\xbd\x16\xe3'
+ b'\xfb-\x9d\xaa\xbcM\x11\xba\x92\xfc\x13F\xf0'
+ b'\x1c\x86x+\xc8\xd0S\xa9\x90`\xa1\xe4\x82\xe8'
+ b'\xfc\x08\xf7\xe3\xe5\xf6\x85\x1c%\xe7%\n\xed'
+ b'\xc0\x1f\xa1;\x9a\xea\xcf\x90\x0c/F>\xdf\xdagA'
+ b'\xc42|\xda\x82\xf5\xa6b\xa1\xb8#\x80wI\xd8f'
+ b'\xf8\xbd\xacW\xab\xc3s\xe0\xbbw\xf2K\xbe\xee'
+ b'\xa8rG\xe1W\xe8\xb7\xc2i\xf3\xd8\xaf\x9d\xdc'
+ b'\xd0#\xf4\xc1\x12u\xcd\x0bE?:\xe8\x9c\x1cu'
+ b'\xabb(oj\r^\xd5\xd5A\x83\x88\x9a\xa1J\x1c?'
+ b'\xa1\xd6\x8c\x83\x9e&'
+ ),
+ b'length': 307949,
+ b'name.utf-8': b'azcvsupdater_2.6.2.jar',
+ b'ed2k': b'>p\xefl\xfa]\x95K\x1b^\xc2\\;;e\xb7',
+ },
+ )
+ self.assertEqual(expected, self.successResultOf(d))
+
+ def test_prefetch_metadata_timeout(self):
+ magnet = 'magnet:?xt=urn:btih:ab570cdd5a17ea1b61e970bb72047de141bce173'
+ d = self.tm.prefetch_metadata(magnet, 30)
+ self.clock.advance(30)
+ expected = ('ab570cdd5a17ea1b61e970bb72047de141bce173', None)
+ return d.addCallback(self.assertEqual, expected)
+
+ @pytest.mark.todo
+ def test_remove_torrent_false(self):
+ """Test when remove_torrent returns False"""
+ common.todo_test(self)
+
+ def test_remove_invalid_torrent(self):
+ self.assertRaises(
+ InvalidTorrentError, self.tm.remove, 'torrentidthatdoesntexist'
+ )
diff --git a/deluge/tests/test_torrentview.py b/deluge/tests/test_torrentview.py
new file mode 100644
index 0000000..590760d
--- /dev/null
+++ b/deluge/tests/test_torrentview.py
@@ -0,0 +1,285 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2014 Bro <bro.development@gmail.com>
+# Copyright (C) 2014 Calum Lind <calumlind@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import pytest
+from twisted.trial import unittest
+
+import deluge.component as component
+from deluge.configmanager import ConfigManager
+from deluge.i18n import setup_translation
+
+from . import common
+from .basetest import BaseTestCase
+
+# Allow running other tests without GTKUI dependencies available
+try:
+ # pylint: disable=ungrouped-imports
+ from gi.repository.GObject import TYPE_UINT64
+
+ from deluge.ui.gtk3.gtkui import DEFAULT_PREFS
+ from deluge.ui.gtk3.mainwindow import MainWindow
+ from deluge.ui.gtk3.menubar import MenuBar
+ from deluge.ui.gtk3.torrentdetails import TorrentDetails
+ from deluge.ui.gtk3.torrentview import TorrentView
+except (ImportError, ValueError):
+ libs_available = False
+ TYPE_UINT64 = 'Whatever'
+else:
+ libs_available = True
+
+setup_translation()
+
+
+@pytest.mark.gtkui
+class TorrentviewTestCase(BaseTestCase):
+
+ default_column_index = [
+ 'filter',
+ 'torrent_id',
+ 'dirty',
+ '#',
+ 'Name',
+ 'Size',
+ 'Downloaded',
+ 'Uploaded',
+ 'Remaining',
+ 'Progress',
+ 'Seeds',
+ 'Peers',
+ 'Seeds:Peers',
+ 'Down Speed',
+ 'Up Speed',
+ 'Down Limit',
+ 'Up Limit',
+ 'ETA',
+ 'Ratio',
+ 'Avail',
+ 'Added',
+ 'Completed',
+ 'Complete Seen',
+ 'Tracker',
+ 'Download Folder',
+ 'Owner',
+ 'Shared',
+ ]
+ default_liststore_columns = [
+ bool,
+ str,
+ bool,
+ int,
+ str,
+ str, # Name
+ TYPE_UINT64,
+ TYPE_UINT64,
+ TYPE_UINT64,
+ TYPE_UINT64,
+ float,
+ str, # Progress
+ int,
+ int,
+ int,
+ int,
+ float, # Seeds, Peers
+ int,
+ int,
+ float,
+ float,
+ int,
+ float,
+ float, # ETA, Ratio, Avail
+ int,
+ int,
+ int,
+ str,
+ str, # Tracker
+ str,
+ str,
+ bool,
+ ] # shared
+
+ def set_up(self):
+ if libs_available is False:
+ raise unittest.SkipTest('GTKUI dependencies not available')
+
+ common.set_tmp_config_dir()
+ # MainWindow loads this config file, so lets make sure it contains the defaults
+ ConfigManager('gtk3ui.conf', defaults=DEFAULT_PREFS)
+ self.mainwindow = MainWindow()
+ self.torrentview = TorrentView()
+ self.torrentdetails = TorrentDetails()
+ self.menubar = MenuBar()
+
+ def tear_down(self):
+ return component.shutdown()
+
+ def test_torrentview_columns(self):
+
+ self.assertEqual(
+ self.torrentview.column_index, TorrentviewTestCase.default_column_index
+ )
+ self.assertEqual(
+ self.torrentview.liststore_columns,
+ TorrentviewTestCase.default_liststore_columns,
+ )
+ self.assertEqual(
+ self.torrentview.columns['Download Folder'].column_indices, [29]
+ )
+
+ def test_add_column(self):
+
+ # Add a text column
+ test_col = 'Test column'
+ self.torrentview.add_text_column(test_col, status_field=['label'])
+ self.assertEqual(
+ len(self.torrentview.liststore_columns),
+ len(TorrentviewTestCase.default_liststore_columns) + 1,
+ )
+ self.assertEqual(
+ len(self.torrentview.column_index),
+ len(TorrentviewTestCase.default_column_index) + 1,
+ )
+ self.assertEqual(self.torrentview.column_index[-1], test_col)
+ self.assertEqual(self.torrentview.columns[test_col].column_indices, [32])
+
+ def test_add_columns(self):
+
+ # Add a text column
+ test_col = 'Test column'
+ self.torrentview.add_text_column(test_col, status_field=['label'])
+
+ # Add a second text column
+ test_col2 = 'Test column2'
+ self.torrentview.add_text_column(test_col2, status_field=['label2'])
+
+ self.assertEqual(
+ len(self.torrentview.liststore_columns),
+ len(TorrentviewTestCase.default_liststore_columns) + 2,
+ )
+ self.assertEqual(
+ len(self.torrentview.column_index),
+ len(TorrentviewTestCase.default_column_index) + 2,
+ )
+ # test_col
+ self.assertEqual(self.torrentview.column_index[-2], test_col)
+ self.assertEqual(self.torrentview.columns[test_col].column_indices, [32])
+
+ # test_col2
+ self.assertEqual(self.torrentview.column_index[-1], test_col2)
+ self.assertEqual(self.torrentview.columns[test_col2].column_indices, [33])
+
+ def test_remove_column(self):
+
+ # Add and remove text column
+ test_col = 'Test column'
+ self.torrentview.add_text_column(test_col, status_field=['label'])
+ self.torrentview.remove_column(test_col)
+
+ self.assertEqual(
+ len(self.torrentview.liststore_columns),
+ len(TorrentviewTestCase.default_liststore_columns),
+ )
+ self.assertEqual(
+ len(self.torrentview.column_index),
+ len(TorrentviewTestCase.default_column_index),
+ )
+ self.assertEqual(
+ self.torrentview.column_index[-1],
+ TorrentviewTestCase.default_column_index[-1],
+ )
+ self.assertEqual(
+ self.torrentview.columns[
+ TorrentviewTestCase.default_column_index[-1]
+ ].column_indices,
+ [31],
+ )
+
+ def test_remove_columns(self):
+
+ # Add two columns
+ test_col = 'Test column'
+ self.torrentview.add_text_column(test_col, status_field=['label'])
+ test_col2 = 'Test column2'
+ self.torrentview.add_text_column(test_col2, status_field=['label2'])
+
+ # Remove test_col
+ self.torrentview.remove_column(test_col)
+ self.assertEqual(
+ len(self.torrentview.liststore_columns),
+ len(TorrentviewTestCase.default_liststore_columns) + 1,
+ )
+ self.assertEqual(
+ len(self.torrentview.column_index),
+ len(TorrentviewTestCase.default_column_index) + 1,
+ )
+ self.assertEqual(self.torrentview.column_index[-1], test_col2)
+ self.assertEqual(self.torrentview.columns[test_col2].column_indices, [32])
+
+ # Remove test_col2
+ self.torrentview.remove_column(test_col2)
+ self.assertEqual(
+ len(self.torrentview.liststore_columns),
+ len(TorrentviewTestCase.default_liststore_columns),
+ )
+ self.assertEqual(
+ len(self.torrentview.column_index),
+ len(TorrentviewTestCase.default_column_index),
+ )
+ self.assertEqual(
+ self.torrentview.column_index[-1],
+ TorrentviewTestCase.default_column_index[-1],
+ )
+ self.assertEqual(
+ self.torrentview.columns[
+ TorrentviewTestCase.default_column_index[-1]
+ ].column_indices,
+ [31],
+ )
+
+ def test_add_remove_column_multiple_types(self):
+
+ # Add a column with multiple column types
+ test_col3 = 'Test column3'
+ self.torrentview.add_progress_column(
+ test_col3, status_field=['progress', 'label3'], col_types=[float, str]
+ )
+ self.assertEqual(
+ len(self.torrentview.liststore_columns),
+ len(TorrentviewTestCase.default_liststore_columns) + 2,
+ )
+ self.assertEqual(
+ len(self.torrentview.column_index),
+ len(TorrentviewTestCase.default_column_index) + 1,
+ )
+ self.assertEqual(self.torrentview.column_index[-1], test_col3)
+ self.assertEqual(self.torrentview.columns[test_col3].column_indices, [32, 33])
+
+ # Remove multiple column-types column
+ self.torrentview.remove_column(test_col3)
+
+ self.assertEqual(
+ len(self.torrentview.liststore_columns),
+ len(TorrentviewTestCase.default_liststore_columns),
+ )
+ self.assertEqual(
+ len(self.torrentview.column_index),
+ len(TorrentviewTestCase.default_column_index),
+ )
+ self.assertEqual(
+ self.torrentview.column_index[-1],
+ TorrentviewTestCase.default_column_index[-1],
+ )
+ self.assertEqual(
+ self.torrentview.columns[
+ TorrentviewTestCase.default_column_index[-1]
+ ].column_indices,
+ [31],
+ )
diff --git a/deluge/tests/test_tracker_icons.py b/deluge/tests/test_tracker_icons.py
new file mode 100644
index 0000000..e18d339
--- /dev/null
+++ b/deluge/tests/test_tracker_icons.py
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import pytest
+from twisted.trial.unittest import SkipTest
+
+import deluge.component as component
+import deluge.ui.tracker_icons
+from deluge.common import windows_check
+from deluge.ui.tracker_icons import TrackerIcon, TrackerIcons
+
+from . import common
+from .basetest import BaseTestCase
+
+common.set_tmp_config_dir()
+deluge.ui.tracker_icons.PIL_INSTALLED = False
+common.disable_new_release_check()
+
+
+@pytest.mark.internet
+class TrackerIconsTestCase(BaseTestCase):
+
+ if windows_check():
+ skip = 'cannot use os.path.samefile to compair on windows(unix only)'
+
+ def set_up(self):
+ # Disable resizing with Pillow for consistency.
+ self.patch(deluge.ui.tracker_icons, 'Image', None)
+ self.icons = TrackerIcons()
+
+ def tear_down(self):
+ return component.shutdown()
+
+ def test_get_deluge_png(self):
+ # Deluge has a png favicon link
+ icon = TrackerIcon(common.get_test_data_file('deluge.png'))
+ d = self.icons.fetch('deluge-torrent.org')
+ d.addCallback(self.assertNotIdentical, None)
+ d.addCallback(self.assertEqual, icon)
+ return d
+
+ def test_get_google_ico(self):
+ # Google doesn't have any icon links
+ # So instead we'll grab its favicon.ico
+ icon = TrackerIcon(common.get_test_data_file('google.ico'))
+ d = self.icons.fetch('www.google.com')
+ d.addCallback(self.assertNotIdentical, None)
+ d.addCallback(self.assertEqual, icon)
+ return d
+
+ def test_get_google_ico_with_redirect(self):
+ # google.com redirects to www.google.com
+ icon = TrackerIcon(common.get_test_data_file('google.ico'))
+ d = self.icons.fetch('google.com')
+ d.addCallback(self.assertNotIdentical, None)
+ d.addCallback(self.assertEqual, icon)
+ return d
+
+ def test_get_seo_ico_with_sni(self):
+ # seo using certificates with SNI support only
+ raise SkipTest('Site certificate expired')
+ icon = TrackerIcon(common.get_test_data_file('seo.ico'))
+ d = self.icons.fetch('www.seo.com')
+ d.addCallback(self.assertNotIdentical, None)
+ d.addCallback(self.assertEqual, icon)
+ return d
+
+ def test_get_empty_string_tracker(self):
+ d = self.icons.fetch('')
+ d.addCallback(self.assertIdentical, None)
+ return d
diff --git a/deluge/tests/test_transfer.py b/deluge/tests/test_transfer.py
new file mode 100644
index 0000000..a048303
--- /dev/null
+++ b/deluge/tests/test_transfer.py
@@ -0,0 +1,403 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 Bro <bro.development@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+import base64
+
+import rencode
+from twisted.trial import unittest
+
+import deluge.log
+from deluge.transfer import DelugeTransferProtocol
+
+deluge.log.setup_logger('none')
+
+
+class TransferTestClass(DelugeTransferProtocol):
+ def __init__(self):
+ DelugeTransferProtocol.__init__(self)
+ self.transport = self
+ self.messages_out = []
+ self.messages_in = []
+ self.packet_count = 0
+
+ def write(self, message):
+ """
+ Called by DelugeTransferProtocol class
+ This simulates the write method of the self.transport in DelugeTransferProtocol.
+ """
+ self.messages_out.append(message)
+
+ def message_received(self, message):
+ """
+ This method overrides message_received is DelugeTransferProtocol and is
+ called with the complete message as it was sent by DelugeRPCProtocol
+ """
+ self.messages_in.append(message)
+
+ def get_messages_out_joined(self):
+ return b''.join(self.messages_out)
+
+ def get_messages_in(self):
+ return self.messages_in
+
+ def data_received_old_protocol(self, data):
+ """
+ This is the original method logic (as close as possible) for handling data receival on the client
+
+ :param data: a zlib compressed string encoded with rencode.
+
+ """
+ import zlib
+
+ print('\n=== New Data Received ===\nBytes received:', len(data))
+
+ if self._buffer:
+ # We have some data from the last dataReceived() so lets prepend it
+ print('Current buffer:', len(self._buffer) if self._buffer else '0')
+ data = self._buffer + data
+ self._buffer = None
+
+ self.packet_count += 1
+ self._bytes_received += len(data)
+
+ while data:
+ print('\n-- Handle packet data --')
+
+ print('Bytes received:', self._bytes_received)
+ print('Current data:', len(data))
+
+ if self._message_length == 0:
+ # handle_new_message uses _buffer so set data to _buffer.
+ self._buffer = data
+ self._handle_new_message()
+ data = self._buffer
+ self._buffer = None
+ self.packet_count = 1
+ print('New message of length:', self._message_length)
+
+ dobj = zlib.decompressobj()
+ try:
+ request = rencode.loads(dobj.decompress(data))
+ print('Successfully loaded message', end=' ')
+ print(
+ ' - Buffer length: %d, data length: %d, unused length: %d'
+ % (
+ len(data),
+ len(data) - len(dobj.unused_data),
+ len(dobj.unused_data),
+ )
+ )
+ print('Packet count:', self.packet_count)
+ except Exception as ex:
+ # log.debug('Received possible invalid message (%r): %s', data, e)
+ # This could be cut-off data, so we'll save this in the buffer
+ # and try to prepend it on the next dataReceived()
+ self._buffer = data
+ print(
+ 'Failed to load buffer (size %d): %s' % (len(self._buffer), str(ex))
+ )
+ return
+ else:
+ data = dobj.unused_data
+ self._message_length = 0
+
+ self.message_received(request)
+
+
+class DelugeTransferProtocolTestCase(unittest.TestCase):
+ def setUp(self): # NOQA: N803
+ """
+ The expected messages corresponds to the test messages (msg1, msg2) after they've been processed
+ by DelugeTransferProtocol.send, which means that they've first been encoded with rencode,
+ and then compressed with zlib.
+ The expected messages are encoded in base64 to easily including it here in the source.
+ So before comparing the results with the expected messages, the expected messages must be decoded,
+ or the result message be encoded in base64.
+
+ """
+ self.transfer = TransferTestClass()
+ self.msg1 = (
+ 0,
+ 1,
+ {'key_int': 1242429423},
+ {'key_str': b'some string'},
+ {'key_bool': True},
+ )
+ self.msg2 = (
+ 2,
+ 3,
+ {'key_float': 12424.29423},
+ {'key_unicode': 'some string'},
+ {'key_dict_with_tuple': {'key_tuple': (1, 2, 3)}},
+ {'keylist': [4, '5', 6.7]},
+ )
+
+ self.msg1_expected_compressed_base64 = (
+ b'AQAAADF4nDvKwJjenp1aGZ+ZV+Lgxfv9PYRXXFLU'
+ b'XZyfm6oAZGTmpad3gAST8vNznAEAJhSQ'
+ )
+ self.msg2_expected_compressed_base64 = (
+ b'AQAAAF14nDvGxJzemZ1aGZ+Wk59Y4uTmpKib3g3il+ZlJuenpH'
+ b'YX5+emKhSXFGXmpadPBkmkZCaXxJdnlmTEl5QW5KRCdIOZhxmB'
+ b'hrUDuTmZxSWHWRpNnRyupaUBAHYlJxI='
+ )
+
+ def test_send_one_message(self):
+ """
+ Send one message and test that it has been sent correctoly to the
+ method 'write' in self.transport.
+
+ """
+ self.transfer.transfer_message(self.msg1)
+ # Get the data as sent by DelugeTransferProtocol
+ messages = self.transfer.get_messages_out_joined()
+ base64_encoded = base64.b64encode(messages)
+ self.assertEqual(base64_encoded, self.msg1_expected_compressed_base64)
+
+ def test_receive_one_message(self):
+ """
+ Receive one message and test that it has been sent to the
+ method 'message_received'.
+
+ """
+ self.transfer.dataReceived(
+ base64.b64decode(self.msg1_expected_compressed_base64)
+ )
+ # Get the data as sent by DelugeTransferProtocol
+ messages = self.transfer.get_messages_in().pop(0)
+ self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(messages))
+
+ def test_receive_old_message(self):
+ """
+ Receive an old message (with no header) and verify that the data is discarded.
+
+ """
+ self.transfer.dataReceived(rencode.dumps(self.msg1))
+ self.assertEqual(len(self.transfer.get_messages_in()), 0)
+ self.assertEqual(self.transfer._message_length, 0)
+ self.assertEqual(len(self.transfer._buffer), 0)
+
+ def test_receive_two_concatenated_messages(self):
+ """
+ This test simply concatenates two messsages (as they're sent over the network),
+ and lets DelugeTransferProtocol receive the data as one string.
+
+ """
+ two_concatenated = base64.b64decode(
+ self.msg1_expected_compressed_base64
+ ) + base64.b64decode(self.msg2_expected_compressed_base64)
+ self.transfer.dataReceived(two_concatenated)
+
+ # Get the data as sent by DelugeTransferProtocol
+ message1 = self.transfer.get_messages_in().pop(0)
+ self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message1))
+ message2 = self.transfer.get_messages_in().pop(0)
+ self.assertEqual(rencode.dumps(self.msg2), rencode.dumps(message2))
+
+ def test_receive_three_messages_in_parts(self):
+ """
+ This test concatenates three messsages (as they're sent over the network),
+ and lets DelugeTransferProtocol receive the data in multiple parts.
+
+ """
+ msg_bytes = (
+ base64.b64decode(self.msg1_expected_compressed_base64)
+ + base64.b64decode(self.msg2_expected_compressed_base64)
+ + base64.b64decode(self.msg1_expected_compressed_base64)
+ )
+ packet_size = 40
+
+ one_message_byte_count = len(
+ base64.b64decode(self.msg1_expected_compressed_base64)
+ )
+ two_messages_byte_count = one_message_byte_count + len(
+ base64.b64decode(self.msg2_expected_compressed_base64)
+ )
+ three_messages_byte_count = two_messages_byte_count + len(
+ base64.b64decode(self.msg1_expected_compressed_base64)
+ )
+
+ for d in self.receive_parts_helper(msg_bytes, packet_size):
+ bytes_received = self.transfer.get_bytes_recv()
+
+ if bytes_received >= three_messages_byte_count:
+ expected_msgs_received_count = 3
+ elif bytes_received >= two_messages_byte_count:
+ expected_msgs_received_count = 2
+ elif bytes_received >= one_message_byte_count:
+ expected_msgs_received_count = 1
+ else:
+ expected_msgs_received_count = 0
+ # Verify that the expected number of complete messages has arrived
+ self.assertEqual(
+ expected_msgs_received_count, len(self.transfer.get_messages_in())
+ )
+
+ # Get the data as received by DelugeTransferProtocol
+ message1 = self.transfer.get_messages_in().pop(0)
+ self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message1))
+ message2 = self.transfer.get_messages_in().pop(0)
+ self.assertEqual(rencode.dumps(self.msg2), rencode.dumps(message2))
+ message3 = self.transfer.get_messages_in().pop(0)
+ self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message3))
+
+ # Remove underscore to enable test, or run the test directly:
+ # tests $ trial test_transfer.DelugeTransferProtocolTestCase._test_rencode_fail_protocol
+ def _test_rencode_fail_protocol(self):
+ """
+ This test tries to test the protocol that relies on errors from rencode.
+
+ """
+ msg_bytes = (
+ base64.b64decode(self.msg1_expected_compressed_base64)
+ + base64.b64decode(self.msg2_expected_compressed_base64)
+ + base64.b64decode(self.msg1_expected_compressed_base64)
+ )
+ packet_size = 149
+
+ one_message_byte_count = len(
+ base64.b64decode(self.msg1_expected_compressed_base64)
+ )
+ two_messages_byte_count = one_message_byte_count + len(
+ base64.b64decode(self.msg2_expected_compressed_base64)
+ )
+ three_messages_byte_count = two_messages_byte_count + len(
+ base64.b64decode(self.msg1_expected_compressed_base64)
+ )
+
+ print()
+
+ print(
+ 'Msg1 size:',
+ len(base64.b64decode(self.msg1_expected_compressed_base64)) - 4,
+ )
+ print(
+ 'Msg2 size:',
+ len(base64.b64decode(self.msg2_expected_compressed_base64)) - 4,
+ )
+ print(
+ 'Msg3 size:',
+ len(base64.b64decode(self.msg1_expected_compressed_base64)) - 4,
+ )
+
+ print('one_message_byte_count:', one_message_byte_count)
+ print('two_messages_byte_count:', two_messages_byte_count)
+ print('three_messages_byte_count:', three_messages_byte_count)
+
+ for d in self.receive_parts_helper(
+ msg_bytes, packet_size, self.transfer.data_received_old_protocol
+ ):
+ bytes_received = self.transfer.get_bytes_recv()
+
+ if bytes_received >= three_messages_byte_count:
+ expected_msgs_received_count = 3
+ elif bytes_received >= two_messages_byte_count:
+ expected_msgs_received_count = 2
+ elif bytes_received >= one_message_byte_count:
+ expected_msgs_received_count = 1
+ else:
+ expected_msgs_received_count = 0
+ # Verify that the expected number of complete messages has arrived
+ if expected_msgs_received_count != len(self.transfer.get_messages_in()):
+ print(
+ 'Expected number of messages received is %d, but %d have been received.'
+ % (
+ expected_msgs_received_count,
+ len(self.transfer.get_messages_in()),
+ )
+ )
+
+ # Get the data as received by DelugeTransferProtocol
+ message1 = self.transfer.get_messages_in().pop(0)
+ self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message1))
+ message2 = self.transfer.get_messages_in().pop(0)
+ self.assertEqual(rencode.dumps(self.msg2), rencode.dumps(message2))
+ message3 = self.transfer.get_messages_in().pop(0)
+ self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message3))
+
+ def test_receive_middle_of_header(self):
+ """
+ This test concatenates two messsages (as they're sent over the network),
+ and lets DelugeTransferProtocol receive the data in two parts.
+ The first part contains the first message, plus two bytes of the next message.
+ The next part contains the rest of the message.
+
+ This is a special case, as DelugeTransferProtocol can't start parsing
+ a message until it has at least 5 bytes (the size of the header) to be able
+ to read and parse the size of the payload.
+
+ """
+ two_concatenated = base64.b64decode(
+ self.msg1_expected_compressed_base64
+ ) + base64.b64decode(self.msg2_expected_compressed_base64)
+ first_len = len(base64.b64decode(self.msg1_expected_compressed_base64))
+
+ # Now found the entire first message, and half the header of the next message (2 bytes into the header)
+ self.transfer.dataReceived(two_concatenated[: first_len + 2])
+
+ # Should be 1 message in the list
+ self.assertEqual(1, len(self.transfer.get_messages_in()))
+
+ # Send the rest
+ self.transfer.dataReceived(two_concatenated[first_len + 2 :])
+
+ # Should be 2 messages in the list
+ self.assertEqual(2, len(self.transfer.get_messages_in()))
+
+ # Get the data as sent by DelugeTransferProtocol
+ message1 = self.transfer.get_messages_in().pop(0)
+ self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message1))
+ message2 = self.transfer.get_messages_in().pop(0)
+ self.assertEqual(rencode.dumps(self.msg2), rencode.dumps(message2))
+
+ # Needs file containing big data structure e.g. like thetorrent list as it is transfered by the daemon
+ # def test_simulate_big_transfer(self):
+ # filename = '../deluge.torrentlist'
+ #
+ # f = open(filename, 'r')
+ # data = f.read()
+ # message_to_send = eval(data)
+ # self.transfer.transfer_message(message_to_send)
+ #
+ # Get the data as sent to the network by DelugeTransferProtocol
+ # compressed_data = self.transfer.get_messages_out_joined()
+ # packet_size = 16000 # Or something smaller...
+ #
+ # for d in self.receive_parts_helper(compressed_data, packet_size):
+ # bytes_recv = self.transfer.get_bytes_recv()
+ # if bytes_recv < len(compressed_data):
+ # self.assertEqual(len(self.transfer.get_messages_in()), 0)
+ # else:
+ # self.assertEqual(len(self.transfer.get_messages_in()), 1)
+ # Get the data as received by DelugeTransferProtocol
+ # transfered_message = self.transfer.get_messages_in().pop(0)
+ # Test that the data structures are equal
+ # self.assertEqual(transfered_message, message_to_send)
+ # self.assertTrue(transfered_message == message_to_send)
+ #
+ # f.close()
+ # f = open('rencode.torrentlist', 'w')
+ # f.write(str(transfered_message))
+ # f.close()
+
+ def receive_parts_helper(self, data, packet_size, receive_func=None):
+ byte_count = len(data)
+ sent_bytes = 0
+ while byte_count > 0:
+ to_receive = packet_size if byte_count > packet_size else byte_count
+ sent_bytes += to_receive
+ byte_count -= to_receive
+ if receive_func:
+ receive_func(data[:to_receive])
+ else:
+ self.transfer.dataReceived(data[:to_receive])
+ data = data[to_receive:]
+ yield
diff --git a/deluge/tests/test_ui_common.py b/deluge/tests/test_ui_common.py
new file mode 100644
index 0000000..dffd884
--- /dev/null
+++ b/deluge/tests/test_ui_common.py
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+from __future__ import unicode_literals
+
+from six import assertCountEqual
+from twisted.trial import unittest
+
+from deluge.common import windows_check
+from deluge.ui.common import TorrentInfo
+
+from . import common
+
+
+class UICommonTestCase(unittest.TestCase):
+ def setUp(self): # NOQA: N803
+ pass
+
+ def tearDown(self): # NOQA: N803
+ pass
+
+ def test_utf8_encoded_paths(self):
+ filename = common.get_test_data_file('test.torrent')
+ ti = TorrentInfo(filename)
+ self.assertTrue('azcvsupdater_2.6.2.jar' in ti.files_tree)
+
+ def test_utf8_encoded_paths2(self):
+ if windows_check():
+ raise unittest.SkipTest('on windows KeyError: unicode_filenames')
+ filename = common.get_test_data_file('unicode_filenames.torrent')
+ filepath1 = '\u30c6\u30af\u30b9\u30fb\u30c6\u30af\u30b5\u30f3.mkv'
+ filepath2 = (
+ '\u041c\u0438\u0445\u0430\u0438\u043b \u0413\u043e'
+ '\u0440\u0431\u0430\u0447\u0451\u0432.mkv'
+ )
+ filepath3 = "Alisher ibn G'iyosiddin Navoiy.mkv"
+ filepath4 = 'Ascii title.mkv'
+ filepath5 = '\u09b8\u09c1\u0995\u09c1\u09ae\u09be\u09b0 \u09b0\u09be\u09df.mkv'
+
+ ti = TorrentInfo(filename)
+ files_tree = ti.files_tree['unicode_filenames']
+ self.assertIn(filepath1, files_tree)
+ self.assertIn(filepath2, files_tree)
+ self.assertIn(filepath3, files_tree)
+ self.assertIn(filepath4, files_tree)
+ self.assertIn(filepath5, files_tree)
+
+ result_files = [
+ {
+ 'download': True,
+ 'path': 'unicode_filenames/' + filepath3,
+ 'size': 126158658,
+ },
+ {
+ 'download': True,
+ 'path': 'unicode_filenames/' + filepath4,
+ 'size': 189321363,
+ },
+ {
+ 'download': True,
+ 'path': 'unicode_filenames/' + filepath2,
+ 'size': 106649699,
+ },
+ {
+ 'download': True,
+ 'path': 'unicode_filenames/' + filepath5,
+ 'size': 21590269,
+ },
+ {'download': True, 'path': 'unicode_filenames/' + filepath1, 'size': 1771},
+ ]
+
+ assertCountEqual(self, ti.files, result_files)
diff --git a/deluge/tests/test_ui_console.py b/deluge/tests/test_ui_console.py
new file mode 100644
index 0000000..8c67322
--- /dev/null
+++ b/deluge/tests/test_ui_console.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import argparse
+
+from deluge.common import windows_check
+from deluge.ui.console.cmdline.commands.add import Command
+from deluge.ui.console.widgets.fields import TextInput
+
+from .basetest import BaseTestCase
+
+
+class MockParent(object):
+ def __init__(self):
+ self.border_off_x = 1
+ self.pane_width = 20
+ self.encoding = 'utf8'
+
+
+class UIConsoleFieldTestCase(BaseTestCase):
+ def setUp(self): # NOQA: N803
+ self.parent = MockParent()
+
+ def tearDown(self): # NOQA: N803
+ pass
+
+ def test_text_input(self):
+ def move_func(self, r, c):
+ self._cursor_row = r
+ self._cursor_col = c
+
+ t = TextInput(
+ self.parent,
+ 'name',
+ 'message',
+ move_func,
+ 20,
+ '/text/field/file/path',
+ complete=False,
+ )
+ self.assertTrue(t)
+ if not windows_check():
+ self.assertTrue(t.handle_read(33))
+
+
+class UIConsoleCommandsTestCase(BaseTestCase):
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_add_move_completed(self):
+ completed_path = 'completed_path'
+ parser = argparse.ArgumentParser()
+ cmd = Command()
+ cmd.add_arguments(parser)
+ args = parser.parse_args(['torrent', '-m', completed_path])
+ self.assertEqual(args.move_completed_path, completed_path)
+ args = parser.parse_args(['torrent', '--move-path', completed_path])
+ self.assertEqual(args.move_completed_path, completed_path)
diff --git a/deluge/tests/test_ui_entry.py b/deluge/tests/test_ui_entry.py
new file mode 100644
index 0000000..1d405a1
--- /dev/null
+++ b/deluge/tests/test_ui_entry.py
@@ -0,0 +1,513 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+import argparse
+import sys
+from io import StringIO
+
+import mock
+import pytest
+from twisted.internet import defer
+
+import deluge
+import deluge.component as component
+import deluge.ui.web.server
+from deluge.common import PY2, get_localhost_auth, windows_check
+from deluge.ui import ui_entry
+from deluge.ui.web.server import DelugeWeb
+
+from . import common
+from .basetest import BaseTestCase
+from .daemon_base import DaemonBase
+
+if not windows_check():
+ import deluge.ui.console
+ import deluge.ui.console.cmdline.commands.quit
+ import deluge.ui.console.main
+
+DEBUG_COMMAND = False
+
+sys_stdout = sys.stdout
+# To catch output to stdout/stderr while running unit tests, we patch
+# the file descriptors in sys and argparse._sys with StringFileDescriptor.
+# Regular print statements from such tests will therefore write to the
+# StringFileDescriptor object instead of the terminal.
+# To print to terminal from the tests, use: print('Message...', file=sys_stdout)
+
+
+class StringFileDescriptor(object):
+ """File descriptor that writes to string buffer"""
+
+ def __init__(self, fd):
+ self.out = StringIO()
+ self.fd = fd
+ for a in ['encoding']:
+ setattr(self, a, getattr(sys_stdout, a))
+
+ def write(self, *data, **kwargs):
+ # io.StringIO requires unicode strings.
+ data_string = str(*data)
+ if PY2:
+ data_string = data_string.decode()
+ print(data_string, file=self.out, end='')
+
+ def flush(self):
+ self.out.flush()
+
+
+class UIBaseTestCase(object):
+ def __init__(self):
+ self.var = {}
+
+ def set_up(self):
+ common.set_tmp_config_dir()
+ common.setup_test_logger(level='info', prefix=self.id())
+ return component.start()
+
+ def tear_down(self):
+ return component.shutdown()
+
+ def exec_command(self):
+ if DEBUG_COMMAND:
+ print('Executing: %s\n' % sys.argv, file=sys_stdout)
+ return self.var['start_cmd']()
+
+
+class UIWithDaemonBaseTestCase(UIBaseTestCase, DaemonBase):
+ """Subclass for test that require a deluged daemon"""
+
+ def __init__(self):
+ UIBaseTestCase.__init__(self)
+
+ def set_up(self):
+ d = self.common_set_up()
+ common.setup_test_logger(level='info', prefix=self.id())
+ d.addCallback(self.start_core)
+ return d
+
+ def tear_down(self):
+ d = UIBaseTestCase.tear_down(self)
+ d.addCallback(self.terminate_core)
+ return d
+
+
+class DelugeEntryTestCase(BaseTestCase):
+
+ if windows_check():
+ skip = 'cannot test console ui on windows'
+
+ def set_up(self):
+ common.set_tmp_config_dir()
+ return component.start()
+
+ def tear_down(self):
+ return component.shutdown()
+
+ def test_deluge_help(self):
+ self.patch(sys, 'argv', ['./deluge', '-h'])
+ config = deluge.configmanager.ConfigManager('ui.conf', ui_entry.DEFAULT_PREFS)
+ config.config['default_ui'] = 'console'
+ config.save()
+
+ fd = StringFileDescriptor(sys.stdout)
+ self.patch(argparse._sys, 'stdout', fd)
+
+ with mock.patch('deluge.ui.console.main.ConsoleUI'):
+ self.assertRaises(SystemExit, ui_entry.start_ui)
+ self.assertTrue('usage: deluge' in fd.out.getvalue())
+ self.assertTrue('UI Options:' in fd.out.getvalue())
+ self.assertTrue('* console' in fd.out.getvalue())
+
+ def test_start_default(self):
+ self.patch(sys, 'argv', ['./deluge'])
+ config = deluge.configmanager.ConfigManager('ui.conf', ui_entry.DEFAULT_PREFS)
+ config.config['default_ui'] = 'console'
+ config.save()
+
+ with mock.patch('deluge.ui.console.main.ConsoleUI'):
+ # Just test that no exception is raised
+ ui_entry.start_ui()
+
+ def test_start_with_log_level(self):
+ _level = []
+
+ def setup_logger(
+ level='error',
+ filename=None,
+ filemode='w',
+ logrotate=None,
+ output_stream=sys.stdout,
+ ):
+ _level.append(level)
+
+ self.patch(deluge.log, 'setup_logger', setup_logger)
+ self.patch(sys, 'argv', ['./deluge', '-L', 'info'])
+
+ config = deluge.configmanager.ConfigManager('ui.conf', ui_entry.DEFAULT_PREFS)
+ config.config['default_ui'] = 'console'
+ config.save()
+
+ with mock.patch('deluge.ui.console.main.ConsoleUI'):
+ # Just test that no exception is raised
+ ui_entry.start_ui()
+
+ self.assertEqual(_level[0], 'info')
+
+
+class GtkUIBaseTestCase(UIBaseTestCase):
+ """Implement all GtkUI tests here"""
+
+ def test_start_gtk3ui(self):
+ self.patch(sys, 'argv', self.var['sys_arg_cmd'])
+
+ from deluge.ui.gtk3 import gtkui
+
+ with mock.patch.object(gtkui.GtkUI, 'start', autospec=True):
+ self.exec_command()
+
+
+@pytest.mark.gtkui
+class GtkUIDelugeScriptEntryTestCase(BaseTestCase, GtkUIBaseTestCase):
+ def __init__(self, testname):
+ super(GtkUIDelugeScriptEntryTestCase, self).__init__(testname)
+ GtkUIBaseTestCase.__init__(self)
+
+ self.var['cmd_name'] = 'deluge gtk'
+ self.var['start_cmd'] = ui_entry.start_ui
+ self.var['sys_arg_cmd'] = ['./deluge', 'gtk']
+
+ def set_up(self):
+ return GtkUIBaseTestCase.set_up(self)
+
+ def tear_down(self):
+ return GtkUIBaseTestCase.tear_down(self)
+
+
+@pytest.mark.gtkui
+class GtkUIScriptEntryTestCase(BaseTestCase, GtkUIBaseTestCase):
+ def __init__(self, testname):
+ super(GtkUIScriptEntryTestCase, self).__init__(testname)
+ GtkUIBaseTestCase.__init__(self)
+ from deluge.ui import gtk3
+
+ self.var['cmd_name'] = 'deluge-gtk'
+ self.var['start_cmd'] = gtk3.start
+ self.var['sys_arg_cmd'] = ['./deluge-gtk']
+
+ def set_up(self):
+ return GtkUIBaseTestCase.set_up(self)
+
+ def tear_down(self):
+ return GtkUIBaseTestCase.tear_down(self)
+
+
+class DelugeWebMock(DelugeWeb):
+ def __init__(self, *args, **kwargs):
+ kwargs['daemon'] = False
+ DelugeWeb.__init__(self, *args, **kwargs)
+
+
+class WebUIBaseTestCase(UIBaseTestCase):
+ """Implement all WebUI tests here"""
+
+ def test_start_webserver(self):
+ self.patch(sys, 'argv', self.var['sys_arg_cmd'])
+ self.patch(deluge.ui.web.server, 'DelugeWeb', DelugeWebMock)
+ self.exec_command()
+
+ def test_start_web_with_log_level(self):
+ _level = []
+
+ def setup_logger(
+ level='error',
+ filename=None,
+ filemode='w',
+ logrotate=None,
+ output_stream=sys.stdout,
+ ):
+ _level.append(level)
+
+ self.patch(deluge.log, 'setup_logger', setup_logger)
+ self.patch(sys, 'argv', self.var['sys_arg_cmd'] + ['-L', 'info'])
+
+ config = deluge.configmanager.ConfigManager('ui.conf', ui_entry.DEFAULT_PREFS)
+ config.config['default_ui'] = 'web'
+ config.save()
+
+ self.patch(deluge.ui.web.server, 'DelugeWeb', DelugeWebMock)
+ self.exec_command()
+ self.assertEqual(_level[0], 'info')
+
+
+class WebUIScriptEntryTestCase(BaseTestCase, WebUIBaseTestCase):
+
+ if windows_check():
+ skip = 'cannot test console ui on windows'
+
+ def __init__(self, testname):
+ super(WebUIScriptEntryTestCase, self).__init__(testname)
+ WebUIBaseTestCase.__init__(self)
+ self.var['cmd_name'] = 'deluge-web'
+ self.var['start_cmd'] = deluge.ui.web.start
+ self.var['sys_arg_cmd'] = ['./deluge-web', '--do-not-daemonize']
+
+ def set_up(self):
+ return WebUIBaseTestCase.set_up(self)
+
+ def tear_down(self):
+ return WebUIBaseTestCase.tear_down(self)
+
+
+class WebUIDelugeScriptEntryTestCase(BaseTestCase, WebUIBaseTestCase):
+
+ if windows_check():
+ skip = 'cannot test console ui on windows'
+
+ def __init__(self, testname):
+ super(WebUIDelugeScriptEntryTestCase, self).__init__(testname)
+ WebUIBaseTestCase.__init__(self)
+ self.var['cmd_name'] = 'deluge web'
+ self.var['start_cmd'] = ui_entry.start_ui
+ self.var['sys_arg_cmd'] = ['./deluge', 'web', '--do-not-daemonize']
+
+ def set_up(self):
+ return WebUIBaseTestCase.set_up(self)
+
+ def tear_down(self):
+ return WebUIBaseTestCase.tear_down(self)
+
+
+class ConsoleUIBaseTestCase(UIBaseTestCase):
+ """Implement Console tests that do not require a running daemon"""
+
+ def test_start_console(self):
+ self.patch(sys, 'argv', self.var['sys_arg_cmd'])
+ with mock.patch('deluge.ui.console.main.ConsoleUI'):
+ self.exec_command()
+
+ def test_start_console_with_log_level(self):
+ _level = []
+
+ def setup_logger(
+ level='error',
+ filename=None,
+ filemode='w',
+ logrotate=None,
+ output_stream=sys.stdout,
+ ):
+ _level.append(level)
+
+ self.patch(deluge.log, 'setup_logger', setup_logger)
+ self.patch(sys, 'argv', self.var['sys_arg_cmd'] + ['-L', 'info'])
+
+ config = deluge.configmanager.ConfigManager('ui.conf', ui_entry.DEFAULT_PREFS)
+ config.config['default_ui'] = 'console'
+ config.save()
+
+ with mock.patch('deluge.ui.console.main.ConsoleUI'):
+ # Just test that no exception is raised
+ self.exec_command()
+
+ self.assertEqual(_level[0], 'info')
+
+ def test_console_help(self):
+ self.patch(sys, 'argv', self.var['sys_arg_cmd'] + ['-h'])
+ fd = StringFileDescriptor(sys.stdout)
+ self.patch(argparse._sys, 'stdout', fd)
+
+ with mock.patch('deluge.ui.console.main.ConsoleUI'):
+ self.assertRaises(SystemExit, self.exec_command)
+ std_output = fd.out.getvalue()
+ self.assertTrue(
+ ('usage: %s' % self.var['cmd_name']) in std_output
+ ) # Check command name
+ self.assertTrue('Common Options:' in std_output)
+ self.assertTrue('Console Options:' in std_output)
+ self.assertTrue(
+ 'Console Commands:\n The following console commands are available:'
+ in std_output
+ )
+ self.assertTrue(
+ 'The following console commands are available:' in std_output
+ )
+
+ def test_console_command_info(self):
+ self.patch(sys, 'argv', self.var['sys_arg_cmd'] + ['info'])
+ fd = StringFileDescriptor(sys.stdout)
+ self.patch(argparse._sys, 'stdout', fd)
+
+ with mock.patch('deluge.ui.console.main.ConsoleUI'):
+ self.exec_command()
+
+ def test_console_command_info_help(self):
+ self.patch(sys, 'argv', self.var['sys_arg_cmd'] + ['info', '-h'])
+ fd = StringFileDescriptor(sys.stdout)
+ self.patch(argparse._sys, 'stdout', fd)
+
+ with mock.patch('deluge.ui.console.main.ConsoleUI'):
+ self.assertRaises(SystemExit, self.exec_command)
+ std_output = fd.out.getvalue()
+ self.assertTrue('usage: info' in std_output)
+ self.assertTrue('Show information about the torrents' in std_output)
+
+ def test_console_unrecognized_arguments(self):
+ self.patch(
+ sys, 'argv', ['./deluge', '--ui', 'console']
+ ) # --ui is not longer supported
+ fd = StringFileDescriptor(sys.stdout)
+ self.patch(argparse._sys, 'stderr', fd)
+ with mock.patch('deluge.ui.console.main.ConsoleUI'):
+ self.assertRaises(SystemExit, self.exec_command)
+ self.assertTrue('unrecognized arguments: --ui' in fd.out.getvalue())
+
+
+class ConsoleUIWithDaemonBaseTestCase(UIWithDaemonBaseTestCase):
+ """Implement Console tests that require a running daemon"""
+
+ def set_up(self):
+ # Avoid calling reactor.shutdown after commands are executed by main.exec_args()
+ deluge.ui.console.main.reactor = common.ReactorOverride()
+ return UIWithDaemonBaseTestCase.set_up(self)
+
+ def patch_arg_command(self, command):
+ if type(command) == str:
+ command = [command]
+ username, password = get_localhost_auth()
+ self.patch(
+ sys,
+ 'argv',
+ self.var['sys_arg_cmd']
+ + ['--port']
+ + ['58900']
+ + ['--username']
+ + [username]
+ + ['--password']
+ + [password]
+ + command,
+ )
+
+ @defer.inlineCallbacks
+ def test_console_command_add(self):
+ filename = common.get_test_data_file('test.torrent')
+ self.patch_arg_command(['add ' + filename])
+ fd = StringFileDescriptor(sys.stdout)
+ self.patch(sys, 'stdout', fd)
+
+ yield self.exec_command()
+
+ std_output = fd.out.getvalue()
+ self.assertTrue(
+ std_output
+ == 'Attempting to add torrent: ' + filename + '\nTorrent added!\n'
+ )
+
+ @defer.inlineCallbacks
+ def test_console_command_add_move_completed(self):
+ filename = common.get_test_data_file('test.torrent')
+ self.patch_arg_command(
+ [
+ 'add --move-path /tmp ' + filename + ' ; status'
+ ' ; manage'
+ ' ab570cdd5a17ea1b61e970bb72047de141bce173'
+ ' move_completed'
+ ' move_completed_path'
+ ]
+ )
+ fd = StringFileDescriptor(sys.stdout)
+ self.patch(sys, 'stdout', fd)
+
+ yield self.exec_command()
+
+ std_output = fd.out.getvalue()
+ self.assertTrue(
+ std_output.endswith('move_completed: True\nmove_completed_path: /tmp\n')
+ or std_output.endswith('move_completed_path: /tmp\nmove_completed: True\n')
+ )
+
+ @defer.inlineCallbacks
+ def test_console_command_status(self):
+ fd = StringFileDescriptor(sys.stdout)
+ self.patch_arg_command(['status'])
+ self.patch(sys, 'stdout', fd)
+
+ yield self.exec_command()
+
+ std_output = fd.out.getvalue()
+ self.assertTrue(
+ std_output.startswith('Total upload: ')
+ and std_output.endswith(' Moving: 0\n')
+ )
+
+
+class ConsoleScriptEntryWithDaemonTestCase(
+ BaseTestCase, ConsoleUIWithDaemonBaseTestCase
+):
+
+ if windows_check():
+ skip = 'cannot test console ui on windows'
+
+ def __init__(self, testname):
+ super(ConsoleScriptEntryWithDaemonTestCase, self).__init__(testname)
+ ConsoleUIWithDaemonBaseTestCase.__init__(self)
+ self.var['cmd_name'] = 'deluge-console'
+ self.var['sys_arg_cmd'] = ['./deluge-console']
+
+ def set_up(self):
+ from deluge.ui.console.console import Console
+
+ def start_console():
+ return Console().start()
+
+ self.patch(deluge.ui.console, 'start', start_console)
+ self.var['start_cmd'] = deluge.ui.console.start
+
+ return ConsoleUIWithDaemonBaseTestCase.set_up(self)
+
+ def tear_down(self):
+ return ConsoleUIWithDaemonBaseTestCase.tear_down(self)
+
+
+class ConsoleScriptEntryTestCase(BaseTestCase, ConsoleUIBaseTestCase):
+
+ if windows_check():
+ skip = 'cannot test console ui on windows'
+
+ def __init__(self, testname):
+ super(ConsoleScriptEntryTestCase, self).__init__(testname)
+ ConsoleUIBaseTestCase.__init__(self)
+ self.var['cmd_name'] = 'deluge-console'
+ self.var['start_cmd'] = deluge.ui.console.start
+ self.var['sys_arg_cmd'] = ['./deluge-console']
+
+ def set_up(self):
+ return ConsoleUIBaseTestCase.set_up(self)
+
+ def tear_down(self):
+ return ConsoleUIBaseTestCase.tear_down(self)
+
+
+class ConsoleDelugeScriptEntryTestCase(BaseTestCase, ConsoleUIBaseTestCase):
+
+ if windows_check():
+ skip = 'cannot test console ui on windows'
+
+ def __init__(self, testname):
+ super(ConsoleDelugeScriptEntryTestCase, self).__init__(testname)
+ ConsoleUIBaseTestCase.__init__(self)
+ self.var['cmd_name'] = 'deluge console'
+ self.var['start_cmd'] = ui_entry.start_ui
+ self.var['sys_arg_cmd'] = ['./deluge', 'console']
+
+ def set_up(self):
+ return ConsoleUIBaseTestCase.set_up(self)
+
+ def tear_down(self):
+ return ConsoleUIBaseTestCase.tear_down(self)
diff --git a/deluge/tests/test_web_api.py b/deluge/tests/test_web_api.py
new file mode 100644
index 0000000..982a93b
--- /dev/null
+++ b/deluge/tests/test_web_api.py
@@ -0,0 +1,199 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from io import BytesIO
+
+from twisted.internet import defer, reactor
+from twisted.python.failure import Failure
+from twisted.web.client import Agent, FileBodyProducer
+from twisted.web.http_headers import Headers
+from twisted.web.static import File
+
+import deluge.component as component
+from deluge.ui.client import client
+
+from . import common
+from .common_web import WebServerTestBase
+
+common.disable_new_release_check()
+
+
+class WebAPITestCase(WebServerTestBase):
+ def test_connect_invalid_host(self):
+ d = self.deluge_web.web_api.connect('id')
+ d.addCallback(self.fail)
+ d.addErrback(self.assertIsInstance, Failure)
+ return d
+
+ def test_connect(self):
+ d = self.deluge_web.web_api.connect(self.host_id)
+
+ def on_connect(result):
+ self.assertEqual(type(result), tuple)
+ self.assertTrue(len(result) > 0)
+ self.addCleanup(client.disconnect)
+ return result
+
+ d.addCallback(on_connect)
+ d.addErrback(self.fail)
+ return d
+
+ def test_disconnect(self):
+ d = self.deluge_web.web_api.connect(self.host_id)
+
+ @defer.inlineCallbacks
+ def on_connect(result):
+ self.assertTrue(self.deluge_web.web_api.connected())
+ yield self.deluge_web.web_api.disconnect()
+ self.assertFalse(self.deluge_web.web_api.connected())
+
+ d.addCallback(on_connect)
+ d.addErrback(self.fail)
+ return d
+
+ def test_get_config(self):
+ config = self.deluge_web.web_api.get_config()
+ self.assertEqual(self.webserver_listen_port, config['port'])
+
+ def test_set_config(self):
+ config = self.deluge_web.web_api.get_config()
+ config['pwd_salt'] = 'new_salt'
+ config['pwd_sha1'] = 'new_sha'
+ config['sessions'] = {
+ '233f23632af0a74748bc5dd1d8717564748877baa16420e6898e17e8aa365e6e': {
+ 'login': 'skrot',
+ 'expires': 1460030877.0,
+ 'level': 10,
+ }
+ }
+ self.deluge_web.web_api.set_config(config)
+ web_config = component.get('DelugeWeb').config.config
+ self.assertNotEquals(config['pwd_salt'], web_config['pwd_salt'])
+ self.assertNotEquals(config['pwd_sha1'], web_config['pwd_sha1'])
+ self.assertNotEquals(config['sessions'], web_config['sessions'])
+
+ @defer.inlineCallbacks
+ def get_host_status(self):
+ host = list(self.deluge_web.web_api._get_host(self.host_id))
+ host[3] = 'Online'
+ host[4] = '2.0.0.dev562'
+ status = yield self.deluge_web.web_api.get_host_status(self.host_id)
+ self.assertEqual(status, tuple(status))
+
+ def test_get_host(self):
+ self.assertFalse(self.deluge_web.web_api._get_host('invalid_id'))
+ conn = list(self.deluge_web.web_api.hostlist.get_hosts_info()[0])
+ self.assertEqual(self.deluge_web.web_api._get_host(conn[0]), conn[0:4])
+
+ def test_add_host(self):
+ conn = ['abcdef', '10.0.0.1', 0, 'user123', 'pass123']
+ self.assertFalse(self.deluge_web.web_api._get_host(conn[0]))
+ # Add valid host
+ result, host_id = self.deluge_web.web_api.add_host(
+ conn[1], conn[2], conn[3], conn[4]
+ )
+ self.assertEqual(result, True)
+ conn[0] = host_id
+ self.assertEqual(self.deluge_web.web_api._get_host(conn[0]), conn[0:4])
+
+ # Add already existing host
+ ret = self.deluge_web.web_api.add_host(conn[1], conn[2], conn[3], conn[4])
+ self.assertEqual(ret, (False, 'Host details already in hostlist'))
+
+ # Add invalid port
+ conn[2] = 'bad port'
+ ret = self.deluge_web.web_api.add_host(conn[1], conn[2], conn[3], conn[4])
+ self.assertEqual(ret, (False, 'Invalid port. Must be an integer'))
+
+ def test_remove_host(self):
+ conn = ['connection_id', '', 0, '', '']
+ self.deluge_web.web_api.hostlist.config['hosts'].append(conn)
+ self.assertEqual(self.deluge_web.web_api._get_host(conn[0]), conn[0:4])
+ # Remove valid host
+ self.assertTrue(self.deluge_web.web_api.remove_host(conn[0]))
+ self.assertFalse(self.deluge_web.web_api._get_host(conn[0]))
+ # Remove non-existing host
+ self.assertFalse(self.deluge_web.web_api.remove_host(conn[0]))
+
+ def test_get_torrent_info(self):
+ filename = common.get_test_data_file('test.torrent')
+ ret = self.deluge_web.web_api.get_torrent_info(filename)
+ self.assertEqual(ret['name'], 'azcvsupdater_2.6.2.jar')
+ self.assertEqual(ret['info_hash'], 'ab570cdd5a17ea1b61e970bb72047de141bce173')
+ self.assertTrue('files_tree' in ret)
+
+ def test_get_magnet_info(self):
+ ret = self.deluge_web.web_api.get_magnet_info(
+ 'magnet:?xt=urn:btih:SU5225URMTUEQLDXQWRB2EQWN6KLTYKN'
+ )
+ self.assertEqual(ret['name'], '953bad769164e8482c7785a21d12166f94b9e14d')
+ self.assertEqual(ret['info_hash'], '953bad769164e8482c7785a21d12166f94b9e14d')
+ self.assertTrue('files_tree' in ret)
+
+ @defer.inlineCallbacks
+ def test_get_torrent_files(self):
+ yield self.deluge_web.web_api.connect(self.host_id)
+ filename = common.get_test_data_file('test.torrent')
+ torrents = [
+ {'path': filename, 'options': {'download_location': '/home/deluge/'}}
+ ]
+ yield self.deluge_web.web_api.add_torrents(torrents)
+ ret = yield self.deluge_web.web_api.get_torrent_files(
+ 'ab570cdd5a17ea1b61e970bb72047de141bce173'
+ )
+ self.assertEqual(ret['type'], 'dir')
+ self.assertEqual(
+ ret['contents'],
+ {
+ 'azcvsupdater_2.6.2.jar': {
+ 'priority': 4,
+ 'index': 0,
+ 'offset': 0,
+ 'progress': 0.0,
+ 'path': 'azcvsupdater_2.6.2.jar',
+ 'type': 'file',
+ 'size': 307949,
+ }
+ },
+ )
+
+ @defer.inlineCallbacks
+ def test_download_torrent_from_url(self):
+ filename = 'ubuntu-9.04-desktop-i386.iso.torrent'
+ self.deluge_web.top_level.putChild(
+ filename.encode(), File(common.get_test_data_file(filename))
+ )
+ url = 'http://localhost:%d/%s' % (self.webserver_listen_port, filename)
+ res = yield self.deluge_web.web_api.download_torrent_from_url(url)
+ self.assertTrue(res.endswith(filename))
+
+ @defer.inlineCallbacks
+ def test_invalid_json(self):
+ """
+ If json_api._send_response does not return server.NOT_DONE_YET
+ this error is thrown when json is invalid:
+ exceptions.RuntimeError: Request.write called on a request after Request.finish was called.
+
+ """
+ agent = Agent(reactor)
+ bad_body = b'{ method": "auth.login" }'
+ d = yield agent.request(
+ b'POST',
+ b'http://127.0.0.1:%i/json' % self.webserver_listen_port,
+ Headers(
+ {
+ b'User-Agent': [b'Twisted Web Client Example'],
+ b'Content-Type': [b'application/json'],
+ }
+ ),
+ FileBodyProducer(BytesIO(bad_body)),
+ )
+ yield d
diff --git a/deluge/tests/test_web_auth.py b/deluge/tests/test_web_auth.py
new file mode 100644
index 0000000..a518573
--- /dev/null
+++ b/deluge/tests/test_web_auth.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+from __future__ import unicode_literals
+
+from mock import patch
+from twisted.trial import unittest
+
+from deluge.ui.web import auth
+
+
+class MockConfig(object):
+ def __init__(self, config):
+ self.config = config
+
+ def __getitem__(self, key):
+ return self.config[key]
+
+ def __setitem__(self, key, value):
+ self.config[key] = value
+
+
+class WebAuthTestCase(unittest.TestCase):
+ @patch('deluge.ui.web.auth.JSONComponent.__init__', return_value=None)
+ def test_change_password(self, mock_json):
+ config = MockConfig(
+ {
+ 'pwd_sha1': '8d8ff487626141d2b91025901d3ab57211180b48',
+ 'pwd_salt': '7555d757710158655bd1646e207dee21a89e9226',
+ }
+ )
+ webauth = auth.Auth(config)
+ self.assertTrue(webauth.change_password('deluge', 'deluge_new'))
diff --git a/deluge/tests/test_webserver.py b/deluge/tests/test_webserver.py
new file mode 100644
index 0000000..d9684ba
--- /dev/null
+++ b/deluge/tests/test_webserver.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import json as json_lib
+from io import BytesIO
+
+import twisted.web.client
+from twisted.internet import defer, reactor
+from twisted.web.client import Agent, FileBodyProducer
+from twisted.web.http_headers import Headers
+
+from . import common
+from .common import get_test_data_file
+from .common_web import WebServerMockBase, WebServerTestBase
+
+common.disable_new_release_check()
+
+
+class WebServerTestCase(WebServerTestBase, WebServerMockBase):
+ @defer.inlineCallbacks
+ def test_get_torrent_info(self):
+
+ agent = Agent(reactor)
+
+ self.mock_authentication_ignore(self.deluge_web.auth)
+
+ # This torrent file contains an uncommon field 'filehash' which must be hex
+ # encoded to allow dumping the torrent info to json. Otherwise it will fail with:
+ # UnicodeDecodeError: 'utf8' codec can't decode byte 0xe5 in position 0: invalid continuation byte
+ filename = get_test_data_file('filehash_field.torrent')
+ input_file = (
+ '{"params": ["%s"], "method": "web.get_torrent_info", "id": 22}' % filename
+ )
+ headers = {
+ b'User-Agent': ['Twisted Web Client Example'],
+ b'Content-Type': ['application/json'],
+ }
+ url = 'http://127.0.0.1:%s/json' % self.webserver_listen_port
+
+ d = yield agent.request(
+ b'POST',
+ url.encode('utf-8'),
+ Headers(headers),
+ FileBodyProducer(BytesIO(input_file.encode('utf-8'))),
+ )
+
+ body = yield twisted.web.client.readBody(d)
+
+ json = json_lib.loads(body.decode())
+ self.assertEqual(None, json['error'])
+ self.assertEqual('torrent_filehash', json['result']['name'])
diff --git a/deluge/tests/twisted/plugins/delugereporter.py b/deluge/tests/twisted/plugins/delugereporter.py
new file mode 100644
index 0000000..c2a7b52
--- /dev/null
+++ b/deluge/tests/twisted/plugins/delugereporter.py
@@ -0,0 +1,50 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os
+
+from twisted.plugin import IPlugin
+from twisted.trial.itrial import IReporter
+from twisted.trial.reporter import TreeReporter
+from zope.interface import implements
+
+
+class _Reporter(object):
+ implements(IPlugin, IReporter)
+
+ def __init__(
+ self, name, module, description, longOpt, shortOpt, klass # noqa: N803
+ ):
+ self.name = name
+ self.module = module
+ self.description = description
+ self.longOpt = longOpt
+ self.shortOpt = shortOpt
+ self.klass = klass
+
+
+deluge = _Reporter(
+ 'Deluge reporter that suppresses Stacktrace from TODO tests',
+ 'twisted.plugins.delugereporter',
+ description='Deluge Reporter',
+ longOpt='deluge-reporter',
+ shortOpt=None,
+ klass='DelugeReporter',
+)
+
+
+class DelugeReporter(TreeReporter):
+ def __init__(self, *args, **kwargs):
+ os.environ['DELUGE_REPORTER'] = 'true'
+ TreeReporter.__init__(self, *args, **kwargs)
+
+ def addExpectedFailure(self, *args): # NOQA: N802
+ # super(TreeReporter, self).addExpectedFailure(*args)
+ self.endLine('[TODO]', self.TODO)
diff --git a/deluge/transfer.py b/deluge/transfer.py
new file mode 100644
index 0000000..6b26549
--- /dev/null
+++ b/deluge/transfer.py
@@ -0,0 +1,161 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 Bro <bro.development@gmail.com>
+# Copyright (C) 2018 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import struct
+import zlib
+
+import rencode
+from twisted.internet.protocol import Protocol
+
+log = logging.getLogger(__name__)
+
+PROTOCOL_VERSION = 1
+MESSAGE_HEADER_FORMAT = '!BI'
+MESSAGE_HEADER_SIZE = struct.calcsize(MESSAGE_HEADER_FORMAT)
+
+
+class DelugeTransferProtocol(Protocol, object):
+ """
+ Deluge RPC wire protocol.
+
+ Data messages are transfered with a header containing a protocol version
+ and the length of the data to be transfered (payload).
+
+ The format is::
+
+ ubyte uint4 bytestring
+ |.version.|..size..|.....body.....|
+
+ The version is an unsigned byte that indicates the protocol version.
+ The size is a unsigned 32-bit integer that is equal to the length of the body bytestring.
+ The body is the compressed rencoded byte string of the data object.
+ """
+
+ def __init__(self):
+ self._buffer = b'' # TODO: Look into using bytearray instead of byte string.
+ self._message_length = 0
+ self._bytes_received = 0
+ self._bytes_sent = 0
+
+ def transfer_message(self, data):
+ """
+ Transfer the data.
+
+ :param data: data to be transfered in a data structure serializable by rencode.
+ """
+ body = zlib.compress(rencode.dumps(data))
+ body_len = len(body)
+ message = struct.pack(
+ '{}{}s'.format(MESSAGE_HEADER_FORMAT, body_len),
+ PROTOCOL_VERSION,
+ body_len,
+ body,
+ )
+ self._bytes_sent += len(message)
+ self.transport.write(message)
+
+ def dataReceived(self, data): # NOQA: N802
+ """
+ This method is called whenever data is received.
+
+ :param data: a message as transfered by transfer_message, or a part of such
+ a messsage.
+
+ Global variables:
+ _buffer - contains the data received
+ _message_length - the length of the payload of the current message.
+
+ """
+ self._buffer += data
+ self._bytes_received += len(data)
+
+ while len(self._buffer) >= MESSAGE_HEADER_SIZE:
+ if self._message_length == 0:
+ self._handle_new_message()
+ # We have a complete packet
+ if len(self._buffer) >= self._message_length:
+ self._handle_complete_message(self._buffer[: self._message_length])
+ # Remove message data from buffer
+ self._buffer = self._buffer[self._message_length :]
+ self._message_length = 0
+ else:
+ break
+
+ def _handle_new_message(self):
+ """
+ Handle the start of a new message. This method is called only when the
+ beginning of the buffer contains data from a new message (i.e. the header).
+
+ """
+ try:
+ # Read the first bytes of the message (MESSAGE_HEADER_SIZE bytes)
+ header = self._buffer[:MESSAGE_HEADER_SIZE]
+ # Extract the length stored as an unsigned 32-bit integer
+ version, self._message_length = struct.unpack(MESSAGE_HEADER_FORMAT, header)
+ if version != PROTOCOL_VERSION:
+ raise Exception(
+ 'Received invalid protocol version: {}. PROTOCOL_VERSION is {}.'.format(
+ version, PROTOCOL_VERSION
+ )
+ )
+ # Remove the header from the buffer
+ self._buffer = self._buffer[MESSAGE_HEADER_SIZE:]
+ except Exception as ex:
+ log.warning('Error occurred when parsing message header: %s.', ex)
+ log.warning(
+ 'This version of Deluge cannot communicate with the sender of this data.'
+ )
+ self._message_length = 0
+ self._buffer = b''
+
+ def _handle_complete_message(self, data):
+ """
+ Handles a complete message as it is transfered on the network.
+
+ :param data: a zlib compressed string encoded with rencode.
+
+ """
+ try:
+ self.message_received(
+ rencode.loads(zlib.decompress(data), decode_utf8=True)
+ )
+ except Exception as ex:
+ log.warning(
+ 'Failed to decompress (%d bytes) and load serialized data with rencode: %s',
+ len(data),
+ ex,
+ )
+
+ def get_bytes_recv(self):
+ """
+ Returns the number of bytes received.
+
+ :returns: the number of bytes received
+ :rtype: int
+
+ """
+ return self._bytes_received
+
+ def get_bytes_sent(self):
+ """
+ Returns the number of bytes sent.
+
+ :returns: the number of bytes sent
+ :rtype: int
+
+ """
+ return self._bytes_sent
+
+ def message_received(self, message):
+ """Override this method to receive the complete message"""
+ pass
diff --git a/deluge/ui/__init__.py b/deluge/ui/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deluge/ui/__init__.py
diff --git a/deluge/ui/client.py b/deluge/ui/client.py
new file mode 100644
index 0000000..686f962
--- /dev/null
+++ b/deluge/ui/client.py
@@ -0,0 +1,838 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2011 Pedro Algarvio <pedro@algarvio.me>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import subprocess
+import sys
+
+from twisted.internet import defer, reactor, ssl
+from twisted.internet.protocol import ClientFactory
+
+from deluge import error
+from deluge.common import get_localhost_auth, get_version
+from deluge.decorators import deprecated
+from deluge.transfer import DelugeTransferProtocol
+
+RPC_RESPONSE = 1
+RPC_ERROR = 2
+RPC_EVENT = 3
+
+log = logging.getLogger(__name__)
+
+
+def format_kwargs(kwargs):
+ return ', '.join([key + '=' + str(value) for key, value in kwargs.items()])
+
+
+class DelugeRPCRequest(object):
+ """
+ This object is created whenever there is a RPCRequest to be sent to the
+ daemon. It is generally only used by the DaemonProxy's call method.
+ """
+
+ request_id = None
+ method = None
+ args = None
+ kwargs = None
+
+ def __repr__(self):
+ """
+ Returns a string of the RPCRequest in the following form:
+ method(arg, kwarg=foo, ...)
+ """
+ s = self.method + '('
+ if self.args:
+ s += ', '.join([str(x) for x in self.args])
+ if self.kwargs:
+ if self.args:
+ s += ', '
+ s += format_kwargs(self.kwargs)
+ s += ')'
+
+ return s
+
+ def format_message(self):
+ """
+ Returns a properly formatted RPCRequest based on the properties. Will
+ raise a TypeError if the properties haven't been set yet.
+
+ :returns: a properly formated RPCRequest
+ """
+ if (
+ self.request_id is None
+ or self.method is None
+ or self.args is None
+ or self.kwargs is None
+ ):
+ raise TypeError(
+ 'You must set the properties of this object before calling format_message!'
+ )
+
+ return (self.request_id, self.method, self.args, self.kwargs)
+
+
+class DelugeRPCProtocol(DelugeTransferProtocol):
+ def connectionMade(self): # NOQA: N802
+ self.__rpc_requests = {}
+ # Set the protocol in the daemon so it can send data
+ self.factory.daemon.protocol = self
+ # Get the address of the daemon that we've connected to
+ peer = self.transport.getPeer()
+ self.factory.daemon.host = peer.host
+ self.factory.daemon.port = peer.port
+ self.factory.daemon.connected = True
+ log.debug('Connected to daemon at %s:%s..', peer.host, peer.port)
+ self.factory.daemon.connect_deferred.callback((peer.host, peer.port))
+
+ def message_received(self, request):
+ """
+ This method is called whenever we receive a message from the daemon.
+
+ :param request: a tuple that should be either a RPCResponse, RCPError or RPCSignal
+
+ """
+ if not isinstance(request, tuple):
+ log.debug('Received invalid message: type is not tuple')
+ return
+ if len(request) < 3:
+ log.debug(
+ 'Received invalid message: number of items in ' 'response is %s',
+ len(request),
+ )
+ return
+
+ message_type = request[0]
+
+ if message_type == RPC_EVENT:
+ event = request[1]
+ # log.debug('Received RPCEvent: %s', event)
+ # A RPCEvent was received from the daemon so run any handlers
+ # associated with it.
+ if event in self.factory.event_handlers:
+ for handler in self.factory.event_handlers[event]:
+ reactor.callLater(0, handler, *request[2])
+ return
+
+ request_id = request[1]
+
+ # We get the Deferred object for this request_id to either run the
+ # callbacks or the errbacks dependent on the response from the daemon.
+ d = self.factory.daemon.pop_deferred(request_id)
+
+ if message_type == RPC_RESPONSE:
+ # Run the callbacks registered with this Deferred object
+ d.callback(request[2])
+ elif message_type == RPC_ERROR:
+ # Recreate exception and errback'it
+ try:
+ # The exception class is located in deluge.error
+ try:
+ exception_cls = getattr(error, request[2])
+ exception = exception_cls(*request[3], **request[4])
+ except TypeError:
+ log.warning(
+ 'Received invalid RPC_ERROR (Old daemon?): %s', request[2]
+ )
+ return
+
+ # Ideally we would chain the deferreds instead of instance
+ # checking just to log them. But, that would mean that any
+ # errback on the fist deferred should returns it's failure
+ # so it could pass back to the 2nd deferred on the chain. But,
+ # that does not always happen.
+ # So, just do some instance checking and just log rpc error at
+ # diferent levels.
+ r = self.__rpc_requests[request_id]
+ msg = 'RPCError Message Received!'
+ msg += '\n' + '-' * 80
+ msg += '\n' + 'RPCRequest: ' + r.__repr__()
+ msg += '\n' + '-' * 80
+ if isinstance(exception, error.WrappedException):
+ msg += '\n' + exception.type + '\n' + exception.message + ': '
+ msg += exception.traceback
+ else:
+ msg += '\n' + request[5] + '\n' + request[2] + ': '
+ msg += str(exception)
+ msg += '\n' + '-' * 80
+
+ if not isinstance(exception, error._ClientSideRecreateError):
+ # Let's log these as errors
+ log.error(msg)
+ else:
+ # The rest just get's logged in debug level, just to log
+ # what's happening
+ log.debug(msg)
+ except Exception:
+ import traceback
+
+ log.error(
+ 'Failed to handle RPC_ERROR (Old daemon?): %s\nLocal error: %s',
+ request[2],
+ traceback.format_exc(),
+ )
+ d.errback(exception)
+ del self.__rpc_requests[request_id]
+
+ def send_request(self, request):
+ """
+ Sends a RPCRequest to the server.
+
+ :param request: RPCRequest
+
+ """
+ try:
+ # Store the DelugeRPCRequest object just in case a RPCError is sent in
+ # response to this request. We use the extra information when printing
+ # out the error for debugging purposes.
+ self.__rpc_requests[request.request_id] = request
+ # log.debug('Sending RPCRequest %s: %s', request.request_id, request)
+ # Send the request in a tuple because multiple requests can be sent at once
+ self.transfer_message((request.format_message(),))
+ except Exception as ex:
+ log.warning('Error occurred when sending message: %s', ex)
+
+
+class DelugeRPCClientFactory(ClientFactory):
+ protocol = DelugeRPCProtocol
+
+ def __init__(self, daemon, event_handlers):
+ self.daemon = daemon
+ self.event_handlers = event_handlers
+
+ def startedConnecting(self, connector): # NOQA: N802
+ log.debug('Connecting to daemon at "%s:%s"...', connector.host, connector.port)
+
+ def clientConnectionFailed(self, connector, reason): # NOQA: N802
+ log.debug(
+ 'Connection to daemon at "%s:%s" failed: %s',
+ connector.host,
+ connector.port,
+ reason.value,
+ )
+ self.daemon.connect_deferred.errback(reason)
+
+ def clientConnectionLost(self, connector, reason): # NOQA: N802
+ log.debug(
+ 'Connection lost to daemon at "%s:%s" reason: %s',
+ connector.host,
+ connector.port,
+ reason.value,
+ )
+ self.daemon.host = None
+ self.daemon.port = None
+ self.daemon.username = None
+ self.daemon.connected = False
+
+ if (
+ self.daemon.disconnect_deferred
+ and not self.daemon.disconnect_deferred.called
+ ):
+ self.daemon.disconnect_deferred.callback(reason.value)
+ self.daemon.disconnect_deferred = None
+
+ if self.daemon.disconnect_callback:
+ self.daemon.disconnect_callback()
+
+
+class DaemonProxy(object):
+ pass
+
+
+class DaemonSSLProxy(DaemonProxy):
+ def __init__(self, event_handlers=None):
+ if event_handlers is None:
+ event_handlers = {}
+ self.__factory = DelugeRPCClientFactory(self, event_handlers)
+ self.__factory.noisy = False
+ self.__request_counter = 0
+ self.__deferred = {}
+
+ # This is set when a connection is made to the daemon
+ self.protocol = None
+
+ # This is set when a connection is made
+ self.host = None
+ self.port = None
+ self.username = None
+ self.authentication_level = 0
+
+ self.connected = False
+
+ self.disconnect_deferred = None
+ self.disconnect_callback = None
+
+ self.auth_levels_mapping = None
+ self.auth_levels_mapping_reverse = None
+
+ def connect(self, host, port):
+ """
+ Connects to a daemon at host:port
+
+ :param host: str, the host to connect to
+ :param port: int, the listening port on the daemon
+
+ :returns: twisted.Deferred
+
+ """
+ log.debug('sslproxy.connect()')
+ self.host = host
+ self.port = port
+ self.__connector = reactor.connectSSL(
+ self.host, self.port, self.__factory, ssl.ClientContextFactory()
+ )
+ self.connect_deferred = defer.Deferred()
+ self.daemon_info_deferred = defer.Deferred()
+
+ # Upon connect we do a 'daemon.login' RPC
+ self.connect_deferred.addCallback(self.__on_connect)
+ self.connect_deferred.addErrback(self.__on_connect_fail)
+
+ return self.daemon_info_deferred
+
+ def disconnect(self):
+ log.debug('sslproxy.disconnect()')
+ self.disconnect_deferred = defer.Deferred()
+ self.__connector.disconnect()
+ return self.disconnect_deferred
+
+ def call(self, method, *args, **kwargs):
+ """
+ Makes a RPCRequest to the daemon. All methods should be in the form of
+ 'component.method'.
+
+ :params method: str, the method to call in the form of 'component.method'
+ :params args: the arguments to call the remote method with
+ :params kwargs: the keyword arguments to call the remote method with
+
+ :return: a twisted.Deferred object that will be activated when a RPCResponse
+ or RPCError is received from the daemon
+
+ """
+ # Create the DelugeRPCRequest to pass to protocol.send_request()
+ request = DelugeRPCRequest()
+ request.request_id = self.__request_counter
+ request.method = method
+ request.args = args
+ request.kwargs = kwargs
+ # Send the request to the server
+ self.protocol.send_request(request)
+ # Create a Deferred object to return and add a default errback to print
+ # the error.
+ d = defer.Deferred()
+
+ # Store the Deferred until we receive a response from the daemon
+ self.__deferred[self.__request_counter] = d
+
+ # Increment the request counter since we don't want to use the same one
+ # before a response is received.
+ self.__request_counter += 1
+
+ return d
+
+ def pop_deferred(self, request_id):
+ """
+ Pops a Deferred object. This is generally called once we receive the
+ reply we were waiting on from the server.
+
+ :param request_id: the request_id of the Deferred to pop
+ :type request_id: int
+
+ """
+ return self.__deferred.pop(request_id)
+
+ def register_event_handler(self, event, handler):
+ """
+ Registers a handler function to be called when `:param:event` is received
+ from the daemon.
+
+ :param event: the name of the event to handle
+ :type event: str
+ :param handler: the function to be called when `:param:event`
+ is emitted from the daemon
+ :type handler: function
+
+ """
+ if event not in self.__factory.event_handlers:
+ # This is a new event to handle, so we need to tell the daemon
+ # that we're interested in receiving this type of event
+ self.__factory.event_handlers[event] = []
+ if self.connected:
+ self.call('daemon.set_event_interest', [event])
+
+ # Only add the handler if it's not already registered
+ if handler not in self.__factory.event_handlers[event]:
+ self.__factory.event_handlers[event].append(handler)
+
+ def deregister_event_handler(self, event, handler):
+ """
+ Deregisters a event handler.
+
+ :param event: the name of the event
+ :type event: str
+ :param handler: the function registered
+ :type handler: function
+
+ """
+ if (
+ event in self.__factory.event_handlers
+ and handler in self.__factory.event_handlers[event]
+ ):
+ self.__factory.event_handlers[event].remove(handler)
+
+ def __on_connect(self, result):
+ log.debug('__on_connect called')
+
+ def on_info(daemon_info):
+ self.daemon_info = daemon_info
+ log.debug('Got info from daemon: %s', daemon_info)
+ self.daemon_info_deferred.callback(daemon_info)
+
+ def on_info_fail(reason):
+ log.debug('Failed to get info from daemon')
+ log.exception(reason)
+ self.daemon_info_deferred.errback(reason)
+
+ self.call('daemon.info').addCallback(on_info).addErrback(on_info_fail)
+ return self.daemon_info_deferred
+
+ def __on_connect_fail(self, reason):
+ self.daemon_info_deferred.errback(reason)
+
+ def authenticate(self, username, password):
+ log.debug('%s.authenticate: %s', self.__class__.__name__, username)
+ login_deferred = defer.Deferred()
+ d = self.call('daemon.login', username, password, client_version=get_version())
+ d.addCallbacks(
+ self.__on_login,
+ self.__on_login_fail,
+ callbackArgs=[username, login_deferred],
+ errbackArgs=[login_deferred],
+ )
+ return login_deferred
+
+ def __on_login(self, result, username, login_deferred):
+ log.debug('__on_login called: %s %s', username, result)
+ self.username = username
+ self.authentication_level = result
+ # We need to tell the daemon what events we're interested in receiving
+ if self.__factory.event_handlers:
+ self.call('daemon.set_event_interest', list(self.__factory.event_handlers))
+ self.call('core.get_auth_levels_mappings').addCallback(
+ self.__on_auth_levels_mappings
+ )
+
+ login_deferred.callback(result)
+
+ def __on_login_fail(self, result, login_deferred):
+ login_deferred.errback(result)
+
+ def __on_auth_levels_mappings(self, result):
+ auth_levels_mapping, auth_levels_mapping_reverse = result
+ self.auth_levels_mapping = auth_levels_mapping
+ self.auth_levels_mapping_reverse = auth_levels_mapping_reverse
+
+ def set_disconnect_callback(self, cb):
+ """
+ Set a function to be called when the connection to the daemon is lost
+ for any reason.
+ """
+ self.disconnect_callback = cb
+
+ def get_bytes_recv(self):
+ return self.protocol.get_bytes_recv()
+
+ def get_bytes_sent(self):
+ return self.protocol.get_bytes_sent()
+
+
+class DaemonStandaloneProxy(DaemonProxy):
+ def __init__(self, event_handlers=None):
+ if event_handlers is None:
+ event_handlers = {}
+ from deluge.core import daemon
+
+ self.__daemon = daemon.Daemon(standalone=True)
+ self.__daemon.start()
+ log.debug('daemon created!')
+ self.connected = True
+ self.host = 'localhost'
+ self.port = 58846
+ # Running in standalone mode, it's safe to import auth level
+ from deluge.core.authmanager import (
+ AUTH_LEVEL_ADMIN,
+ AUTH_LEVELS_MAPPING,
+ AUTH_LEVELS_MAPPING_REVERSE,
+ )
+
+ self.username = 'localclient'
+ self.authentication_level = AUTH_LEVEL_ADMIN
+ self.auth_levels_mapping = AUTH_LEVELS_MAPPING
+ self.auth_levels_mapping_reverse = AUTH_LEVELS_MAPPING_REVERSE
+ # Register the event handlers
+ for event in event_handlers:
+ for handler in event_handlers[event]:
+ self.__daemon.core.eventmanager.register_event_handler(event, handler)
+
+ def disconnect(self):
+ self.connected = False
+ self.__daemon = None
+
+ def call(self, method, *args, **kwargs):
+ # log.debug('call: %s %s %s', method, args, kwargs)
+
+ import copy
+
+ try:
+ m = self.__daemon.rpcserver.get_object_method(method)
+ except Exception as ex:
+ log.exception(ex)
+ return defer.fail(ex)
+ else:
+ return defer.maybeDeferred(m, *copy.deepcopy(args), **copy.deepcopy(kwargs))
+
+ def register_event_handler(self, event, handler):
+ """
+ Registers a handler function to be called when `:param:event` is
+ received from the daemon.
+
+ :param event: the name of the event to handle
+ :type event: str
+ :param handler: the function to be called when `:param:event`
+ is emitted from the daemon
+ :type handler: function
+
+ """
+ self.__daemon.core.eventmanager.register_event_handler(event, handler)
+
+ def deregister_event_handler(self, event, handler):
+ """
+ Deregisters a event handler.
+
+ :param event: the name of the event
+ :type event: str
+ :param handler: the function registered
+ :type handler: function
+
+ """
+ self.__daemon.core.eventmanager.deregister_event_handler(event, handler)
+
+
+class DottedObject(object):
+ """
+ This is used for dotted name calls to client
+ """
+
+ def __init__(self, daemon, method):
+ self.daemon = daemon
+ self.base = method
+
+ def __call__(self, *args, **kwargs):
+ raise Exception('You must make calls in the form of "component.method"')
+
+ def __getattr__(self, name):
+ return RemoteMethod(self.daemon, self.base + '.' + name)
+
+
+class RemoteMethod(DottedObject):
+ """
+ This is used when something like 'client.core.get_something()' is attempted.
+ """
+
+ def __call__(self, *args, **kwargs):
+ return self.daemon.call(self.base, *args, **kwargs)
+
+
+class Client(object):
+ """
+ This class is used to connect to a daemon process and issue RPC requests.
+ """
+
+ __event_handlers = {}
+
+ def __init__(self):
+ self._daemon_proxy = None
+ self.disconnect_callback = None
+ self.__started_standalone = False
+
+ def connect(
+ self,
+ host='127.0.0.1',
+ port=58846,
+ username='',
+ password='',
+ skip_authentication=False,
+ ):
+ """
+ Connects to a daemon process.
+
+ :param host: str, the hostname of the daemon
+ :param port: int, the port of the daemon
+ :param username: str, the username to login with
+ :param password: str, the password to login with
+
+ :returns: a Deferred object that will be called once the connection
+ has been established or fails
+ """
+
+ self._daemon_proxy = DaemonSSLProxy(dict(self.__event_handlers))
+ self._daemon_proxy.set_disconnect_callback(self.__on_disconnect)
+
+ d = self._daemon_proxy.connect(host, port)
+
+ def on_connected(daemon_version):
+ log.debug('on_connected. Daemon version: %s', daemon_version)
+ return daemon_version
+
+ def on_connect_fail(reason):
+ log.debug('on_connect_fail: %s', reason)
+ self.disconnect()
+ return reason
+
+ def on_authenticate(result, daemon_info):
+ log.debug('Authentication successful: %s', result)
+ return result
+
+ def on_authenticate_fail(reason):
+ log.debug('Failed to authenticate: %s', reason.value)
+ return reason
+
+ def authenticate(daemon_version, username, password):
+ if not username and host in ('127.0.0.1', 'localhost'):
+ # No username provided and it's localhost, so attempt to get credentials from auth file.
+ username, password = get_localhost_auth()
+
+ d = self._daemon_proxy.authenticate(username, password)
+ d.addCallback(on_authenticate, daemon_version)
+ d.addErrback(on_authenticate_fail)
+ return d
+
+ d.addCallback(on_connected)
+ d.addErrback(on_connect_fail)
+ if not skip_authentication:
+ d.addCallback(authenticate, username, password)
+ return d
+
+ def disconnect(self):
+ """
+ Disconnects from the daemon.
+ """
+ if self.is_standalone():
+ self._daemon_proxy.disconnect()
+ self.stop_standalone()
+ return defer.succeed(True)
+
+ if self._daemon_proxy:
+ return self._daemon_proxy.disconnect()
+
+ def start_standalone(self):
+ """
+ Starts a daemon in the same process as the client.
+ """
+ self._daemon_proxy = DaemonStandaloneProxy(self.__event_handlers)
+ self.__started_standalone = True
+
+ def stop_standalone(self):
+ """
+ Stops the daemon process in the client.
+ """
+ self._daemon_proxy = None
+ self.__started_standalone = False
+
+ @deprecated
+ def start_classic_mode(self):
+ """Deprecated: Use start_standalone"""
+ self.start_standalone()
+
+ @deprecated
+ def stop_classic_mode(self):
+ """Deprecated: Use stop_standalone"""
+ self.stop_standalone()
+
+ def start_daemon(self, port, config):
+ """Starts a daemon process.
+
+ Args:
+ port (int): Port for the daemon to listen on.
+ config (str): Config path to pass to daemon.
+
+ Returns:
+ bool: True is successfully started the daemon, False otherwise.
+
+ """
+ # subprocess.popen does not work with unicode args (with non-ascii characters) on windows
+ config = config.encode(sys.getfilesystemencoding())
+ try:
+ subprocess.Popen(['deluged', '--port=%s' % port, b'--config=%s' % config])
+ except OSError as ex:
+ from errno import ENOENT
+
+ if ex.errno == ENOENT:
+ log.error(
+ _(
+ 'Deluge cannot find the `deluged` executable, check that '
+ 'the deluged package is installed, or added to your PATH.'
+ )
+ )
+ else:
+ log.exception(ex)
+ except Exception as ex:
+ log.error('Unable to start daemon!')
+ log.exception(ex)
+ else:
+ return True
+ return False
+
+ def is_localhost(self):
+ """
+ Checks if the current connected host is a localhost or not.
+
+ :returns: bool, True if connected to a localhost
+
+ """
+ if (
+ self._daemon_proxy
+ and self._daemon_proxy.host in ('127.0.0.1', 'localhost')
+ or isinstance(self._daemon_proxy, DaemonStandaloneProxy)
+ ):
+ return True
+ return False
+
+ def is_standalone(self):
+ """
+ Checks to see if the client has been started in standalone mode.
+
+ :returns: bool, True if in standalone mode
+
+ """
+ return self.__started_standalone
+
+ @deprecated
+ def is_classicmode(self):
+ """Deprecated: Use is_standalone"""
+ self.is_standalone()
+
+ def connected(self):
+ """
+ Check to see if connected to a daemon.
+
+ :returns: bool, True if connected
+
+ """
+ return self._daemon_proxy.connected if self._daemon_proxy else False
+
+ def connection_info(self):
+ """
+ Get some info about the connection or return None if not connected.
+
+ :returns: a tuple of (host, port, username) or None if not connected
+ """
+ if self.connected():
+ return (
+ self._daemon_proxy.host,
+ self._daemon_proxy.port,
+ self._daemon_proxy.username,
+ )
+
+ return None
+
+ def register_event_handler(self, event, handler):
+ """
+ Registers a handler that will be called when an event is received from the daemon.
+
+ :params event: str, the event to handle
+ :params handler: func, the handler function, f(args)
+ """
+ if event not in self.__event_handlers:
+ self.__event_handlers[event] = []
+ self.__event_handlers[event].append(handler)
+ # We need to replicate this in the daemon proxy
+ if self._daemon_proxy:
+ self._daemon_proxy.register_event_handler(event, handler)
+
+ def deregister_event_handler(self, event, handler):
+ """
+ Deregisters a event handler.
+
+ :param event: str, the name of the event
+ :param handler: function, the function registered
+
+ """
+ if event in self.__event_handlers and handler in self.__event_handlers[event]:
+ self.__event_handlers[event].remove(handler)
+ if self._daemon_proxy:
+ self._daemon_proxy.deregister_event_handler(event, handler)
+
+ def force_call(self, block=False):
+ # no-op for now.. we'll see if we need this in the future
+ pass
+
+ def __getattr__(self, method):
+ return DottedObject(self._daemon_proxy, method)
+
+ def set_disconnect_callback(self, cb):
+ """
+ Set a function to be called whenever the client is disconnected from
+ the daemon for any reason.
+ """
+ self.disconnect_callback = cb
+
+ def __on_disconnect(self):
+ if self.disconnect_callback:
+ self.disconnect_callback()
+
+ def get_bytes_recv(self):
+ """
+ Returns the number of bytes received from the daemon.
+
+ :returns: the number of bytes received
+ :rtype: int
+ """
+ return self._daemon_proxy.get_bytes_recv()
+
+ def get_bytes_sent(self):
+ """
+ Returns the number of bytes sent to the daemon.
+
+ :returns: the number of bytes sent
+ :rtype: int
+ """
+ return self._daemon_proxy.get_bytes_sent()
+
+ def get_auth_user(self):
+ """
+ Returns the current authenticated username.
+
+ :returns: the authenticated username
+ :rtype: str
+ """
+ return self._daemon_proxy.username
+
+ def get_auth_level(self):
+ """
+ Returns the authentication level the daemon returned upon authentication.
+
+ :returns: the authentication level
+ :rtype: int
+ """
+ return self._daemon_proxy.authentication_level
+
+ @property
+ def auth_levels_mapping(self):
+ return self._daemon_proxy.auth_levels_mapping
+
+ @property
+ def auth_levels_mapping_reverse(self):
+ return self._daemon_proxy.auth_levels_mapping_reverse
+
+
+# This is the object clients will use
+client = Client()
diff --git a/deluge/ui/common.py b/deluge/ui/common.py
new file mode 100644
index 0000000..21bcafd
--- /dev/null
+++ b/deluge/ui/common.py
@@ -0,0 +1,564 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) Damien Churchill 2008-2009 <damoxc@gmail.com>
+# Copyright (C) Andrew Resch 2009 <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""
+The ui common module contains methods and classes that are deemed useful for all the interfaces.
+"""
+from __future__ import unicode_literals
+
+import logging
+import os
+from binascii import hexlify
+from hashlib import sha1 as sha
+
+from deluge import bencode
+from deluge.common import decode_bytes
+
+log = logging.getLogger(__name__)
+
+
+# Dummy translation dicts so the text is available for Translators.
+#
+# All entries in deluge.common.TORRENT_STATE should be added here.
+#
+# No need to import these, just simply use the `_()` function around a status variable.
+def _(message):
+ return message
+
+
+STATE_TRANSLATION = {
+ 'All': _('All'),
+ 'Active': _('Active'),
+ 'Allocating': _('Allocating'),
+ 'Checking': _('Checking'),
+ 'Downloading': _('Downloading'),
+ 'Seeding': _('Seeding'),
+ 'Paused': _('Paused'),
+ 'Queued': _('Queued'),
+ 'Error': _('Error'),
+}
+
+TORRENT_DATA_FIELD = {
+ 'queue': {'name': '#', 'status': ['queue']},
+ 'name': {'name': _('Name'), 'status': ['state', 'name']},
+ 'progress_state': {'name': _('Progress'), 'status': ['progress', 'state']},
+ 'state': {'name': _('State'), 'status': ['state']},
+ 'progress': {'name': _('Progress'), 'status': ['progress']},
+ 'size': {'name': _('Size'), 'status': ['total_wanted']},
+ 'downloaded': {'name': _('Downloaded'), 'status': ['all_time_download']},
+ 'uploaded': {'name': _('Uploaded'), 'status': ['total_uploaded']},
+ 'remaining': {'name': _('Remaining'), 'status': ['total_remaining']},
+ 'ratio': {'name': _('Ratio'), 'status': ['ratio']},
+ 'download_speed': {'name': _('Down Speed'), 'status': ['download_payload_rate']},
+ 'upload_speed': {'name': _('Up Speed'), 'status': ['upload_payload_rate']},
+ 'max_download_speed': {'name': _('Down Limit'), 'status': ['max_download_speed']},
+ 'max_upload_speed': {'name': _('Up Limit'), 'status': ['max_upload_speed']},
+ 'max_connections': {'name': _('Max Connections'), 'status': ['max_connections']},
+ 'max_upload_slots': {'name': _('Max Upload Slots'), 'status': ['max_upload_slots']},
+ 'peers': {'name': _('Peers'), 'status': ['num_peers', 'total_peers']},
+ 'seeds': {'name': _('Seeds'), 'status': ['num_seeds', 'total_seeds']},
+ 'avail': {'name': _('Avail'), 'status': ['distributed_copies']},
+ 'seeds_peers_ratio': {'name': _('Seeds:Peers'), 'status': ['seeds_peers_ratio']},
+ 'time_added': {'name': _('Added'), 'status': ['time_added']},
+ 'tracker': {'name': _('Tracker'), 'status': ['tracker_host']},
+ 'download_location': {
+ 'name': _('Download Folder'),
+ 'status': ['download_location'],
+ },
+ 'seeding_time': {'name': _('Seeding Time'), 'status': ['seeding_time']},
+ 'active_time': {'name': _('Active Time'), 'status': ['active_time']},
+ 'time_since_transfer': {
+ 'name': _('Last Activity'),
+ 'status': ['time_since_transfer'],
+ },
+ 'finished_time': {'name': _('Finished Time'), 'status': ['finished_time']},
+ 'last_seen_complete': {
+ 'name': _('Complete Seen'),
+ 'status': ['last_seen_complete'],
+ },
+ 'completed_time': {'name': _('Completed'), 'status': ['completed_time']},
+ 'eta': {'name': _('ETA'), 'status': ['eta']},
+ 'shared': {'name': _('Shared'), 'status': ['shared']},
+ 'prioritize_first_last': {
+ 'name': _('Prioritize First/Last'),
+ 'status': ['prioritize_first_last'],
+ },
+ 'sequential_download': {
+ 'name': _('Sequential Download'),
+ 'status': ['sequential_download'],
+ },
+ 'is_auto_managed': {'name': _('Auto Managed'), 'status': ['is_auto_managed']},
+ 'auto_managed': {'name': _('Auto Managed'), 'status': ['auto_managed']},
+ 'stop_at_ratio': {'name': _('Stop At Ratio'), 'status': ['stop_at_ratio']},
+ 'stop_ratio': {'name': _('Stop Ratio'), 'status': ['stop_ratio']},
+ 'remove_at_ratio': {'name': _('Remove At Ratio'), 'status': ['remove_at_ratio']},
+ 'move_completed': {'name': _('Move On Completed'), 'status': ['move_completed']},
+ 'move_completed_path': {
+ 'name': _('Move Completed Path'),
+ 'status': ['move_completed_path'],
+ },
+ 'move_on_completed': {
+ 'name': _('Move On Completed'),
+ 'status': ['move_on_completed'],
+ },
+ 'move_on_completed_path': {
+ 'name': _('Move On Completed Path'),
+ 'status': ['move_on_completed_path'],
+ },
+ 'owner': {'name': _('Owner'), 'status': ['owner']},
+ 'pieces': {'name': _('Pieces'), 'status': ['num_pieces', 'piece_length']},
+ 'seed_rank': {'name': _('Seed Rank'), 'status': ['seed_rank']},
+ 'super_seeding': {'name': _('Super Seeding'), 'status': ['super_seeding']},
+}
+
+TRACKER_STATUS_TRANSLATION = [
+ _('Error'),
+ _('Warning'),
+ _('Announce OK'),
+ _('Announce Sent'),
+]
+
+PREFS_CATOG_TRANS = {
+ 'interface': _('Interface'),
+ 'downloads': _('Downloads'),
+ 'bandwidth': _('Bandwidth'),
+ 'queue': _('Queue'),
+ 'network': _('Network'),
+ 'proxy': _('Proxy'),
+ 'cache': _('Cache'),
+ 'other': _('Other'),
+ 'daemon': _('Daemon'),
+ 'plugins': _('Plugins'),
+}
+
+FILE_PRIORITY = {
+ 0: 'Skip',
+ 1: 'Low',
+ 2: 'Low',
+ 3: 'Low',
+ 4: 'Normal',
+ 5: 'High',
+ 6: 'High',
+ 7: 'High',
+ _('Skip'): 0,
+ _('Low'): 1,
+ _('Normal'): 4,
+ _('High'): 7,
+}
+
+del _
+
+# The keys from session statistics for cache status.
+DISK_CACHE_KEYS = [
+ 'disk.num_blocks_read',
+ 'disk.num_blocks_written',
+ 'disk.num_read_ops',
+ 'disk.num_write_ops',
+ 'disk.num_blocks_cache_hits',
+ 'read_hit_ratio',
+ 'write_hit_ratio',
+ 'disk.disk_blocks_in_use',
+ 'disk.read_cache_blocks',
+]
+
+
+class TorrentInfo(object):
+ """Collects information about a torrent file.
+
+ Args:
+ filename (str, optional): The path to the .torrent file.
+ filetree (int, optional): The version of filetree to create (defaults to 1).
+ torrent_file (dict, optional): A bdecoded .torrent file contents.
+
+ """
+
+ def __init__(self, filename='', filetree=1, torrent_file=None):
+ self._filedata = None
+ if torrent_file:
+ self._metainfo = torrent_file
+ elif filename:
+ log.debug('Attempting to open %s.', filename)
+ try:
+ with open(filename, 'rb') as _file:
+ self._filedata = _file.read()
+ except IOError as ex:
+ log.warning('Unable to open %s: %s', filename, ex)
+ return
+
+ try:
+ self._metainfo = bencode.bdecode(self._filedata)
+ except bencode.BTFailure as ex:
+ log.warning('Failed to decode %s: %s', filename, ex)
+ return
+ else:
+ log.warning('Requires valid arguments.')
+ return
+
+ # info_dict with keys decoded to unicode.
+ info_dict = {k.decode(): v for k, v in self._metainfo[b'info'].items()}
+ self._info_hash = sha(bencode.bencode(info_dict)).hexdigest()
+
+ # Get encoding from torrent file if available
+ encoding = info_dict.get('encoding', None)
+ codepage = info_dict.get('codepage', None)
+ if not encoding:
+ encoding = codepage if codepage else b'UTF-8'
+ if encoding:
+ encoding = encoding.decode()
+
+ # Decode 'name' with encoding unless 'name.utf-8' found.
+ if 'name.utf-8' in info_dict:
+ self._name = decode_bytes(info_dict['name.utf-8'])
+ else:
+ self._name = decode_bytes(info_dict['name'], encoding)
+
+ # Get list of files from torrent info
+ self._files = []
+ if 'files' in info_dict:
+ paths = {}
+ dirs = {}
+ prefix = self._name if len(info_dict['files']) > 1 else ''
+
+ for index, f in enumerate(info_dict['files']):
+ f = {k.decode(): v for k, v in f.items()}
+
+ if 'path.utf-8' in f:
+ path = decode_bytes(os.path.join(*f['path.utf-8']))
+ del f['path.utf-8']
+ else:
+ path = decode_bytes(os.path.join(*f['path']), encoding)
+
+ if prefix:
+ path = os.path.join(prefix, path)
+
+ self._files.append(
+ {'path': path, 'size': f['length'], 'download': True}
+ )
+
+ f['path'] = path
+ f['index'] = index
+ if 'sha1' in f and len(f['sha1']) == 20:
+ f['sha1'] = hexlify(f['sha1']).decode()
+ if 'ed2k' in f and len(f['ed2k']) == 16:
+ f['ed2k'] = hexlify(f['ed2k']).decode()
+ if 'filehash' in f and len(f['filehash']) == 20:
+ f['filehash'] = hexlify(f['filehash']).decode()
+
+ paths[path] = f
+ dirname = os.path.dirname(path)
+ while dirname:
+ dirinfo = dirs.setdefault(dirname, {})
+ dirinfo['length'] = dirinfo.get('length', 0) + f['length']
+ dirname = os.path.dirname(dirname)
+
+ if filetree == 2:
+
+ def walk(path, item):
+ if item['type'] == 'dir':
+ item.update(dirs[path])
+ else:
+ item.update(paths[path])
+ item['download'] = True
+
+ file_tree = FileTree2(list(paths))
+ file_tree.walk(walk)
+ else:
+
+ def walk(path, item):
+ if isinstance(item, dict):
+ return item
+ return [paths[path]['index'], paths[path]['length'], True]
+
+ file_tree = FileTree(paths)
+ file_tree.walk(walk)
+ self._files_tree = file_tree.get_tree()
+ else:
+ self._files.append(
+ {'path': self._name, 'size': info_dict['length'], 'download': True}
+ )
+ if filetree == 2:
+ self._files_tree = {
+ 'contents': {
+ self._name: {
+ 'type': 'file',
+ 'index': 0,
+ 'length': info_dict['length'],
+ 'download': True,
+ }
+ }
+ }
+ else:
+ self._files_tree = {self._name: (0, info_dict['length'], True)}
+
+ @classmethod
+ def from_metadata(cls, metadata, trackers=None):
+ """Create a TorrentInfo from metadata and trackers
+
+ Args:
+ metadata (dict): A bdecoded info section of torrent file.
+ trackers (list of lists, optional): The trackers to include.
+
+ """
+ if not isinstance(metadata, dict):
+ return
+
+ metainfo = {b'info': metadata}
+ if trackers:
+ metainfo[b'announce'] = trackers[0][0].encode('utf-8')
+ trackers_utf8 = [[t.encode('utf-8') for t in tier] for tier in trackers]
+ metainfo[b'announce-list'] = trackers_utf8
+ return cls(torrent_file=metainfo)
+
+ def as_dict(self, *keys):
+ """The torrent info as a dictionary, filtered by keys.
+
+ Args:
+ keys (str): A space-separated string of keys.
+
+ Returns:
+ dict: The torrent info dict with specified keys.
+ """
+ return {key: getattr(self, key) for key in keys}
+
+ @property
+ def name(self):
+ """The name of the torrent.
+
+ Returns:
+ str: The torrent name.
+
+ """
+ return self._name
+
+ @property
+ def info_hash(self):
+ """The calculated torrent info_hash.
+
+ Returns:
+ str: The torrent info_hash.
+ """
+ return self._info_hash
+
+ @property
+ def files(self):
+ """The files that the torrent contains.
+
+ Returns:
+ list: The list of torrent files.
+
+ """
+ return self._files
+
+ @property
+ def files_tree(self):
+ """A tree of the files the torrent contains.
+
+ ::
+
+ {
+ "some_directory": {
+ "some_file": (index, size, download)
+ }
+ }
+
+ Returns:
+ dict: The tree of files.
+
+ """
+ return self._files_tree
+
+ @property
+ def metainfo(self):
+ """Returns the torrent metainfo dictionary.
+
+ This is the bdecoded torrent file contents.
+
+ Returns:
+ dict: The metainfo dictionary.
+
+ """
+ return self._metainfo
+
+ @property
+ def filedata(self):
+ """The contents of the .torrent file.
+
+ Returns:
+ bytes: The bencoded metainfo.
+
+ """
+ if not self._filedata:
+ self._filedata = bencode.bencode(self._metainfo)
+ return self._filedata
+
+
+class FileTree2(object):
+ """
+ Converts a list of paths in to a file tree.
+
+ :param paths: The paths to be converted
+ :type paths: list
+ """
+
+ def __init__(self, paths):
+ self.tree = {'contents': {}, 'type': 'dir'}
+
+ def get_parent(path):
+ parent = self.tree
+ while '/' in path:
+ directory, path = path.split('/', 1)
+ child = parent['contents'].get(directory)
+ if child is None:
+ parent['contents'][directory] = {'type': 'dir', 'contents': {}}
+ parent = parent['contents'][directory]
+ return parent, path
+
+ for path in paths:
+ if path[-1] == '/':
+ path = path[:-1]
+ parent, path = get_parent(path)
+ parent['contents'][path] = {'type': 'dir', 'contents': {}}
+ else:
+ parent, path = get_parent(path)
+ parent['contents'][path] = {'type': 'file'}
+
+ def get_tree(self):
+ """
+ Return the tree.
+
+ :returns: the file tree.
+ :rtype: dictionary
+ """
+ return self.tree
+
+ def walk(self, callback):
+ """
+ Walk through the file tree calling the callback function on each item
+ contained.
+
+ :param callback: The function to be used as a callback, it should have
+ the signature func(item, path) where item is a `tuple` for a file
+ and `dict` for a directory.
+ :type callback: function
+ """
+
+ def walk(directory, parent_path):
+ for path in list(directory['contents']):
+ full_path = os.path.join(parent_path, path).replace('\\', '/')
+ if directory['contents'][path]['type'] == 'dir':
+ directory['contents'][path] = (
+ callback(full_path, directory['contents'][path])
+ or directory['contents'][path]
+ )
+ walk(directory['contents'][path], full_path)
+ else:
+ directory['contents'][path] = (
+ callback(full_path, directory['contents'][path])
+ or directory['contents'][path]
+ )
+
+ walk(self.tree, '')
+
+ def __str__(self):
+ lines = []
+
+ def write(path, item):
+ depth = path.count('/')
+ path = os.path.basename(path)
+ path = path + '/' if item['type'] == 'dir' else path
+ lines.append(' ' * depth + path)
+
+ self.walk(write)
+ return '\n'.join(lines)
+
+
+class FileTree(object):
+ """
+ Convert a list of paths in a file tree.
+
+ :param paths: The paths to be converted.
+ :type paths: list
+ """
+
+ def __init__(self, paths):
+ self.tree = {}
+
+ def get_parent(path):
+ parent = self.tree
+ while '/' in path:
+ directory, path = path.split('/', 1)
+ child = parent.get(directory)
+ if child is None:
+ parent[directory] = {}
+ parent = parent[directory]
+ return parent, path
+
+ for path in paths:
+ if path[-1] == '/':
+ path = path[:-1]
+ parent, path = get_parent(path)
+ parent[path] = {}
+ else:
+ parent, path = get_parent(path)
+ parent[path] = []
+
+ def get_tree(self):
+ """
+ Return the tree, after first converting all file lists to a tuple.
+
+ :returns: the file tree.
+ :rtype: dictionary
+ """
+
+ def to_tuple(path, item):
+ if isinstance(item, dict):
+ return item
+ return tuple(item)
+
+ self.walk(to_tuple)
+ return self.tree
+
+ def walk(self, callback):
+ """
+ Walk through the file tree calling the callback function on each item
+ contained.
+
+ :param callback: The function to be used as a callback, it should have
+ the signature func(item, path) where item is a `tuple` for a file
+ and `dict` for a directory.
+ :type callback: function
+ """
+
+ def walk(directory, parent_path):
+ for path in list(directory):
+ full_path = os.path.join(parent_path, path)
+ if isinstance(directory[path], dict):
+ directory[path] = (
+ callback(full_path, directory[path]) or directory[path]
+ )
+ walk(directory[path], full_path)
+ else:
+ directory[path] = (
+ callback(full_path, directory[path]) or directory[path]
+ )
+
+ walk(self.tree, '')
+
+ def __str__(self):
+ lines = []
+
+ def write(path, item):
+ depth = path.count('/')
+ path = os.path.basename(path)
+ path = isinstance(item, dict) and path + '/' or path
+ lines.append(' ' * depth + path)
+
+ self.walk(write)
+ return '\n'.join(lines)
diff --git a/deluge/ui/console/__init__.py b/deluge/ui/console/__init__.py
new file mode 100644
index 0000000..56e8d62
--- /dev/null
+++ b/deluge/ui/console/__init__.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.ui.console.console import Console
+
+UI_PATH = __path__[0]
+
+
+def start():
+
+ Console().start()
diff --git a/deluge/ui/console/cmdline/__init__.py b/deluge/ui/console/cmdline/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deluge/ui/console/cmdline/__init__.py
diff --git a/deluge/ui/console/cmdline/command.py b/deluge/ui/console/cmdline/command.py
new file mode 100644
index 0000000..2ff32df
--- /dev/null
+++ b/deluge/ui/console/cmdline/command.py
@@ -0,0 +1,215 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+import logging
+import shlex
+
+from twisted.internet import defer
+
+from deluge.ui.client import client
+from deluge.ui.console.parser import OptionParser, OptionParserError
+from deluge.ui.console.utils.colors import strip_colors
+
+log = logging.getLogger(__name__)
+
+
+class Commander(object):
+ def __init__(self, cmds, interactive=False):
+ self._commands = cmds
+ self.interactive = interactive
+
+ def write(self, line):
+ print(strip_colors(line))
+
+ def do_command(self, cmd_line):
+ """Run a console command.
+
+ Args:
+ cmd_line (str): Console command.
+
+ Returns:
+ Deferred: A deferred that fires when the command has been executed.
+
+ """
+ options = self.parse_command(cmd_line)
+ if options:
+ return self.exec_command(options)
+ return defer.succeed(None)
+
+ def exit(self, status=0, msg=None):
+ self._exit = True
+ if msg:
+ print(msg)
+
+ def parse_command(self, cmd_line):
+ """Parse a console command and process with argparse.
+
+ Args:
+ cmd_line (str): Console command.
+
+ Returns:
+ argparse.Namespace: The parsed command.
+
+ """
+ if not cmd_line:
+ return
+ cmd, _, line = cmd_line.partition(' ')
+ try:
+ parser = self._commands[cmd].create_parser()
+ except KeyError:
+ self.write('{!error!}Unknown command: %s' % cmd)
+ return
+
+ try:
+ args = [cmd] + self._commands[cmd].split(line)
+ except ValueError as ex:
+ self.write('{!error!}Error parsing command: %s' % ex)
+ return
+
+ # Do a little hack here to print 'command --help' properly
+ parser._print_help = parser.print_help
+
+ def print_help(f=None):
+ if self.interactive:
+ self.write(parser.format_help())
+ else:
+ parser._print_help(f)
+
+ parser.print_help = print_help
+
+ # Only these commands can be run when not connected to a daemon
+ not_connected_cmds = ['help', 'connect', 'quit']
+ aliases = []
+ for c in not_connected_cmds:
+ aliases.extend(self._commands[c].aliases)
+ not_connected_cmds.extend(aliases)
+
+ if not client.connected() and cmd not in not_connected_cmds:
+ self.write(
+ '{!error!}Not connected to a daemon, please use the connect command first.'
+ )
+ return
+
+ try:
+ options = parser.parse_args(args=args)
+ options.command = cmd
+ except TypeError as ex:
+ self.write('{!error!}Error parsing options: %s' % ex)
+ import traceback
+
+ self.write('%s' % traceback.format_exc())
+ return
+ except OptionParserError as ex:
+ import traceback
+
+ log.warning('Error parsing command "%s": %s', args, ex)
+ self.write('{!error!} %s' % ex)
+ parser.print_help()
+ return
+
+ if getattr(parser, '_exit', False):
+ return
+ return options
+
+ def exec_command(self, options, *args):
+ """Execute a console command.
+
+ Args:
+ options (argparse.Namespace): The command to execute.
+
+ Returns:
+ Deferred: A deferred that fires when command has been executed.
+
+ """
+ try:
+ ret = self._commands[options.command].handle(options)
+ except Exception as ex: # pylint: disable=broad-except
+ self.write('{!error!} %s' % ex)
+ log.exception(ex)
+ import traceback
+
+ self.write('%s' % traceback.format_exc())
+ return defer.succeed(True)
+ else:
+ return ret
+
+
+class BaseCommand(object):
+
+ usage = None
+ interactive_only = False
+ aliases = []
+ _name = 'base'
+ epilog = ''
+
+ def complete(self, text, *args):
+ return []
+
+ def handle(self, options):
+ pass
+
+ @property
+ def name(self):
+ return self._name
+
+ @property
+ def name_with_alias(self):
+ return '/'.join([self._name] + self.aliases)
+
+ @property
+ def description(self):
+ return self.__doc__
+
+ def split(self, text):
+ text = text.replace('\\', '\\\\')
+ result = shlex.split(text)
+ for i, s in enumerate(result):
+ result[i] = s.replace(r'\ ', ' ')
+ result = [s for s in result if s != '']
+ return result
+
+ def create_parser(self):
+ opts = {
+ 'prog': self.name_with_alias,
+ 'description': self.__doc__,
+ 'epilog': self.epilog,
+ }
+ if self.usage:
+ opts['usage'] = self.usage
+ parser = OptionParser(**opts)
+ parser.add_argument(self.name, metavar='')
+ parser.base_parser = parser
+ self.add_arguments(parser)
+ return parser
+
+ def add_subparser(self, subparsers):
+ opts = {
+ 'prog': self.name_with_alias,
+ 'help': self.__doc__,
+ 'description': self.__doc__,
+ }
+ if self.usage:
+ opts['usage'] = self.usage
+
+ # A workaround for aliases showing as duplicate command names in help output.
+ for cmd_name in sorted([self.name] + self.aliases):
+ if cmd_name not in subparsers._name_parser_map:
+ if cmd_name in self.aliases:
+ opts['help'] = _('`%s` alias' % self.name)
+ parser = subparsers.add_parser(cmd_name, **opts)
+ break
+
+ self.add_arguments(parser)
+
+ def add_arguments(self, parser):
+ pass
diff --git a/deluge/ui/console/cmdline/commands/__init__.py b/deluge/ui/console/cmdline/commands/__init__.py
new file mode 100644
index 0000000..628fae5
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/__init__.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from deluge.ui.console.cmdline.command import BaseCommand
+
+__all__ = ['BaseCommand']
diff --git a/deluge/ui/console/cmdline/commands/add.py b/deluge/ui/console/cmdline/commands/add.py
new file mode 100644
index 0000000..34881d8
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/add.py
@@ -0,0 +1,126 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import os
+from base64 import b64encode
+
+from twisted.internet import defer
+
+import deluge.common
+import deluge.component as component
+from deluge.ui.client import client
+
+from . import BaseCommand
+
+try:
+ from urllib.parse import urlparse
+ from urllib.request import url2pathname
+except ImportError:
+ # PY2 fallback
+ from urlparse import urlparse # pylint: disable=ungrouped-imports
+ from urllib import url2pathname # pylint: disable=ungrouped-imports
+
+
+class Command(BaseCommand):
+ """Add torrents"""
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ '-p', '--path', dest='path', help=_('Download folder for torrent')
+ )
+ parser.add_argument(
+ '-m',
+ '--move-path',
+ dest='move_completed_path',
+ help=_('Move the completed torrent to this folder'),
+ )
+ parser.add_argument(
+ 'torrents',
+ metavar='<torrent>',
+ nargs='+',
+ help=_('One or more torrent files, URLs or magnet URIs'),
+ )
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+
+ t_options = {}
+ if options.path:
+ t_options['download_location'] = os.path.abspath(
+ os.path.expanduser(options.path)
+ )
+
+ if options.move_completed_path:
+ t_options['move_completed'] = True
+ t_options['move_completed_path'] = os.path.abspath(
+ os.path.expanduser(options.move_completed_path)
+ )
+
+ def on_success(result):
+ if not result:
+ self.console.write('{!error!}Torrent was not added: Already in session')
+ else:
+ self.console.write('{!success!}Torrent added!')
+
+ def on_fail(result):
+ self.console.write('{!error!}Torrent was not added: %s' % result)
+
+ # Keep a list of deferreds to make a DeferredList
+ deferreds = []
+ for torrent in options.torrents:
+ if not torrent.strip():
+ continue
+ if deluge.common.is_url(torrent):
+ self.console.write(
+ '{!info!}Attempting to add torrent from url: %s' % torrent
+ )
+ deferreds.append(
+ client.core.add_torrent_url(torrent, t_options)
+ .addCallback(on_success)
+ .addErrback(on_fail)
+ )
+ elif deluge.common.is_magnet(torrent):
+ self.console.write(
+ '{!info!}Attempting to add torrent from magnet uri: %s' % torrent
+ )
+ deferreds.append(
+ client.core.add_torrent_magnet(torrent, t_options)
+ .addCallback(on_success)
+ .addErrback(on_fail)
+ )
+ else:
+ # Just a file
+ if urlparse(torrent).scheme == 'file':
+ torrent = url2pathname(urlparse(torrent).path)
+ path = os.path.abspath(os.path.expanduser(torrent))
+ if not os.path.exists(path):
+ self.console.write('{!error!}%s does not exist!' % path)
+ continue
+ if not os.path.isfile(path):
+ self.console.write('{!error!}This is a directory!')
+ continue
+ self.console.write('{!info!}Attempting to add torrent: %s' % path)
+ filename = os.path.split(path)[-1]
+ with open(path, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ deferreds.append(
+ client.core.add_torrent_file_async(filename, filedump, t_options)
+ .addCallback(on_success)
+ .addErrback(on_fail)
+ )
+
+ return defer.DeferredList(deferreds)
+
+ def complete(self, line):
+ return component.get('ConsoleUI').tab_complete_path(
+ line, ext='.torrent', sort='date'
+ )
diff --git a/deluge/ui/console/cmdline/commands/cache.py b/deluge/ui/console/cmdline/commands/cache.py
new file mode 100644
index 0000000..e427f08
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/cache.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.component as component
+from deluge.ui.client import client
+from deluge.ui.common import DISK_CACHE_KEYS
+
+from . import BaseCommand
+
+
+class Command(BaseCommand):
+ """Show information about the disk cache"""
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+
+ def on_cache_status(status):
+ for key, value in sorted(status.items()):
+ self.console.write('{!info!}%s: {!input!}%s' % (key, value))
+
+ return client.core.get_session_status(DISK_CACHE_KEYS).addCallback(
+ on_cache_status
+ )
diff --git a/deluge/ui/console/cmdline/commands/config.py b/deluge/ui/console/cmdline/commands/config.py
new file mode 100644
index 0000000..bd0a1e1
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/config.py
@@ -0,0 +1,168 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import tokenize
+from io import StringIO
+
+import deluge.component as component
+import deluge.ui.console.utils.colors as colors
+from deluge.ui.client import client
+
+from . import BaseCommand
+
+log = logging.getLogger(__name__)
+
+
+def atom(src, token):
+ """taken with slight modifications from http://effbot.org/zone/simple-iterator-parser.htm"""
+ if token[1] == '(':
+ out = []
+ token = next(src)
+ while token[1] != ')':
+ out.append(atom(src, token))
+ token = next(src)
+ if token[1] == ',':
+ token = next(src)
+ return tuple(out)
+ elif token[0] is tokenize.NUMBER or token[1] == '-':
+ try:
+ if token[1] == '-':
+ return int(token[-1], 0)
+ else:
+ if token[1].startswith('0x'):
+ # Hex number so return unconverted as string.
+ return token[1].decode('string-escape')
+ else:
+ return int(token[1], 0)
+ except ValueError:
+ try:
+ return float(token[-1])
+ except ValueError:
+ return str(token[-1])
+ elif token[1].lower() == 'true':
+ return True
+ elif token[1].lower() == 'false':
+ return False
+ elif token[0] is tokenize.STRING or token[1] == '/':
+ return token[-1].decode('string-escape')
+ elif token[1].isalpha():
+ # Parse Windows paths e.g. 'C:\\xyz' or 'C:/xyz'.
+ if next()[1] == ':' and next()[1] in '\\/':
+ return token[-1].decode('string-escape')
+
+ raise SyntaxError('malformed expression (%s)' % token[1])
+
+
+def simple_eval(source):
+ """ evaluates the 'source' string into a combination of primitive python objects
+ taken from http://effbot.org/zone/simple-iterator-parser.htm"""
+ src = StringIO(source).readline
+ src = tokenize.generate_tokens(src)
+ src = (token for token in src if token[0] is not tokenize.NL)
+ res = atom(src, next(src))
+ return res
+
+
+class Command(BaseCommand):
+ """Show and set configuration values"""
+
+ usage = _('Usage: config [--set <key> <value>] [<key> [<key>...] ]')
+
+ def add_arguments(self, parser):
+ set_group = parser.add_argument_group('setting a value')
+ set_group.add_argument(
+ '-s',
+ '--set',
+ action='store',
+ metavar='<key>',
+ help=_('set value for this key'),
+ )
+ set_group.add_argument(
+ 'values', metavar='<value>', nargs='+', help=_('Value to set')
+ )
+ get_group = parser.add_argument_group('getting values')
+ get_group.add_argument(
+ 'keys',
+ metavar='<keys>',
+ nargs='*',
+ help=_('one or more keys separated by space'),
+ )
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+ if options.set:
+ return self._set_config(options)
+ else:
+ return self._get_config(options)
+
+ def _get_config(self, options):
+ def _on_get_config(config):
+ string = ''
+ for key in sorted(config):
+ if key not in options.values:
+ continue
+
+ color = '{!white,black,bold!}'
+ value = config[key]
+ try:
+ color = colors.type_color[type(value)]
+ except KeyError:
+ pass
+
+ # We need to format dicts for printing
+ if isinstance(value, dict):
+ import pprint
+
+ value = pprint.pformat(value, 2, 80)
+ new_value = []
+ for line in value.splitlines():
+ new_value.append('%s%s' % (color, line))
+ value = '\n'.join(new_value)
+
+ string += '%s: %s%s\n' % (key, color, value)
+ self.console.write(string.strip())
+
+ return client.core.get_config().addCallback(_on_get_config)
+
+ def _set_config(self, options):
+ config = component.get('CoreConfig')
+ key = options.set
+ val = ' '.join(options.values)
+
+ try:
+ val = simple_eval(val)
+ except SyntaxError as ex:
+ self.console.write('{!error!}%s' % ex)
+ return
+
+ if key not in config:
+ self.console.write('{!error!}Invalid key: %s' % key)
+ return
+
+ if not isinstance(config[key], type(val)):
+ try:
+ val = type(config[key])(val)
+ except TypeError:
+ self.config.write(
+ '{!error!}Configuration value provided has incorrect type.'
+ )
+ return
+
+ def on_set_config(result):
+ self.console.write('{!success!}Configuration value successfully updated.')
+
+ self.console.write('Setting "%s" to: %s' % (key, val))
+ return client.core.set_config({key: val}).addCallback(on_set_config)
+
+ def complete(self, text):
+ return [k for k in component.get('CoreConfig') if k.startswith(text)]
diff --git a/deluge/ui/console/cmdline/commands/connect.py b/deluge/ui/console/cmdline/commands/connect.py
new file mode 100644
index 0000000..6588f7a
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/connect.py
@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+from deluge.ui.client import client
+
+from . import BaseCommand
+
+log = logging.getLogger(__name__)
+
+
+class Command(BaseCommand):
+ """Connect to a new deluge server"""
+
+ usage = _('Usage: connect <host[:port]> [<username>] [<password>]')
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ 'host', help=_('Daemon host and port'), metavar='<host[:port]>'
+ )
+ parser.add_argument(
+ 'username', help=_('Username'), metavar='<username>', nargs='?', default=''
+ )
+ parser.add_argument(
+ 'password', help=_('Password'), metavar='<password>', nargs='?', default=''
+ )
+
+ def add_parser(self, subparsers):
+ parser = subparsers.add_parser(
+ self.name, help=self.__doc__, description=self.__doc__, prog='connect'
+ )
+ self.add_arguments(parser)
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+
+ host = options.host
+ try:
+ host, port = host.split(':')
+ port = int(port)
+ except ValueError:
+ port = 58846
+
+ def do_connect():
+ d = client.connect(host, port, options.username, options.password)
+
+ def on_connect(result):
+ if self.console.interactive:
+ self.console.write('{!success!}Connected to %s:%s!' % (host, port))
+ return component.start()
+
+ def on_connect_fail(result):
+ try:
+ msg = result.value.exception_msg
+ except AttributeError:
+ msg = result.value.message
+ self.console.write(
+ '{!error!}Failed to connect to %s:%s with reason: %s'
+ % (host, port, msg)
+ )
+ return result
+
+ d.addCallbacks(on_connect, on_connect_fail)
+ return d
+
+ if client.connected():
+
+ def on_disconnect(result):
+ if self.console.statusbars:
+ self.console.statusbars.update_statusbars()
+ return do_connect()
+
+ return client.disconnect().addCallback(on_disconnect)
+ else:
+ return do_connect()
diff --git a/deluge/ui/console/cmdline/commands/debug.py b/deluge/ui/console/cmdline/commands/debug.py
new file mode 100644
index 0000000..3ca06ed
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/debug.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from twisted.internet import defer
+
+import deluge.component as component
+import deluge.log
+
+from . import BaseCommand
+
+
+class Command(BaseCommand):
+ """Enable and disable debugging"""
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ 'state', metavar='<on|off>', choices=['on', 'off'], help=_('The new state')
+ )
+
+ def handle(self, options):
+ if options.state == 'on':
+ deluge.log.set_logger_level('debug')
+ elif options.state == 'off':
+ deluge.log.set_logger_level('error')
+ else:
+ component.get('ConsoleUI').write('{!error!}%s' % self.usage)
+
+ return defer.succeed(True)
+
+ def complete(self, text):
+ return [x for x in ['on', 'off'] if x.startswith(text)]
diff --git a/deluge/ui/console/cmdline/commands/gui.py b/deluge/ui/console/cmdline/commands/gui.py
new file mode 100644
index 0000000..10e4c49
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/gui.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+
+from . import BaseCommand
+
+log = logging.getLogger(__name__)
+
+
+class Command(BaseCommand):
+ """Enable interactive mode"""
+
+ interactive_only = True
+
+ def handle(self, options):
+ console = component.get('ConsoleUI')
+ at = console.set_mode('TorrentList')
+ at.go_top = True
+ at.resume()
diff --git a/deluge/ui/console/cmdline/commands/halt.py b/deluge/ui/console/cmdline/commands/halt.py
new file mode 100644
index 0000000..6355958
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/halt.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.component as component
+from deluge.ui.client import client
+
+from . import BaseCommand
+
+
+class Command(BaseCommand):
+ """Shutdown the deluge server."""
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+
+ def on_shutdown(result):
+ self.console.write('{!success!}Daemon was shutdown')
+
+ def on_shutdown_fail(reason):
+ self.console.write('{!error!}Unable to shutdown daemon: %s' % reason)
+
+ return (
+ client.daemon.shutdown()
+ .addCallback(on_shutdown)
+ .addErrback(on_shutdown_fail)
+ )
diff --git a/deluge/ui/console/cmdline/commands/help.py b/deluge/ui/console/cmdline/commands/help.py
new file mode 100644
index 0000000..2711eea
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/help.py
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from twisted.internet import defer
+
+import deluge.component as component
+
+from . import BaseCommand
+
+log = logging.getLogger(__name__)
+
+
+class Command(BaseCommand):
+ """Displays help on other commands"""
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ 'commands', metavar='<command>', nargs='*', help=_('One or more commands')
+ )
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+ self._commands = self.console._commands
+ deferred = defer.succeed(True)
+ if options.commands:
+ for arg in options.commands:
+ try:
+ cmd = self._commands[arg]
+ except KeyError:
+ self.console.write('{!error!}Unknown command %s' % arg)
+ continue
+ try:
+ parser = cmd.create_parser()
+ self.console.write(parser.format_help())
+ except AttributeError:
+ self.console.write(cmd.__doc__ or 'No help for this command')
+ self.console.write(' ')
+ else:
+ self.console.set_batch_write(True)
+ cmds_doc = ''
+ for cmd in sorted(self._commands):
+ if cmd in self._commands[cmd].aliases:
+ continue
+ parser = self._commands[cmd].create_parser()
+ cmd_doc = (
+ '{!info!}'
+ + '%-9s' % self._commands[cmd].name_with_alias
+ + '{!input!} - '
+ + self._commands[cmd].__doc__
+ + '\n '
+ + parser.format_usage()
+ or ''
+ )
+ cmds_doc += parser.formatter.format_colors(cmd_doc)
+ self.console.write(cmds_doc)
+ self.console.write(' ')
+ self.console.write('For help on a specific command, use `<command> --help`')
+ self.console.set_batch_write(False)
+
+ return deferred
+
+ def complete(self, line):
+ return [x for x in component.get('ConsoleUI')._commands if x.startswith(line)]
diff --git a/deluge/ui/console/cmdline/commands/info.py b/deluge/ui/console/cmdline/commands/info.py
new file mode 100644
index 0000000..0d22f76
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/info.py
@@ -0,0 +1,484 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+from os.path import sep as dirsep
+
+import deluge.component as component
+import deluge.ui.console.utils.colors as colors
+from deluge.common import TORRENT_STATE, fsize, fspeed
+from deluge.ui.client import client
+from deluge.ui.common import FILE_PRIORITY
+from deluge.ui.console.utils.format_utils import (
+ f_progressbar,
+ f_seedrank_dash,
+ format_date_never,
+ format_progress,
+ format_time,
+ ftotal_sized,
+ pad_string,
+ remove_formatting,
+ shorten_hash,
+ strwidth,
+ trim_string,
+)
+
+from . import BaseCommand
+
+STATUS_KEYS = [
+ 'state',
+ 'download_location',
+ 'tracker_host',
+ 'tracker_status',
+ 'next_announce',
+ 'name',
+ 'total_size',
+ 'progress',
+ 'num_seeds',
+ 'total_seeds',
+ 'num_peers',
+ 'total_peers',
+ 'eta',
+ 'download_payload_rate',
+ 'upload_payload_rate',
+ 'ratio',
+ 'distributed_copies',
+ 'num_pieces',
+ 'piece_length',
+ 'total_done',
+ 'files',
+ 'file_priorities',
+ 'file_progress',
+ 'peers',
+ 'is_seed',
+ 'is_finished',
+ 'active_time',
+ 'seeding_time',
+ 'time_since_transfer',
+ 'last_seen_complete',
+ 'seed_rank',
+ 'all_time_download',
+ 'total_uploaded',
+ 'total_payload_download',
+ 'total_payload_upload',
+ 'time_added',
+]
+
+# Add filter specific state to torrent states
+STATES = ['Active'] + TORRENT_STATE
+
+
+class Command(BaseCommand):
+ """Show information about the torrents"""
+
+ sort_help = 'sort items. Possible keys: ' + ', '.join(STATUS_KEYS)
+
+ epilog = """
+ You can give the first few characters of a torrent-id to identify the torrent.
+
+ Tab Completion in interactive mode (info *pattern*<tab>):\n
+ | First press of <tab> will output up to 15 matches;
+ | hitting <tab> a second time, will print 15 more matches;
+ | and a third press will print all remaining matches.
+ | (To modify behaviour of third <tab>, set `third_tab_lists_all` to False)
+"""
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ '-v',
+ '--verbose',
+ action='store_true',
+ default=False,
+ dest='verbose',
+ help=_('Show more information per torrent.'),
+ )
+ parser.add_argument(
+ '-d',
+ '--detailed',
+ action='store_true',
+ default=False,
+ dest='detailed',
+ help=_('Show more detailed information including files and peers.'),
+ )
+ parser.add_argument(
+ '-s',
+ '--state',
+ action='store',
+ dest='state',
+ help=_('Show torrents with state STATE: %s.' % (', '.join(STATES))),
+ )
+ parser.add_argument(
+ '--sort',
+ action='store',
+ type=str,
+ default='',
+ dest='sort',
+ help=self.sort_help,
+ )
+ parser.add_argument(
+ '--sort-reverse',
+ action='store',
+ type=str,
+ default='',
+ dest='sort_rev',
+ help=_('Same as --sort but items are in reverse order.'),
+ )
+ parser.add_argument(
+ 'torrent_ids',
+ metavar='<torrent-id>',
+ nargs='*',
+ help=_('One or more torrent ids. If none is given, list all'),
+ )
+
+ def add_subparser(self, subparsers):
+ parser = subparsers.add_parser(
+ self.name,
+ prog=self.name,
+ help=self.__doc__,
+ description=self.__doc__,
+ epilog=self.epilog,
+ )
+ self.add_arguments(parser)
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+ # Compile a list of torrent_ids to request the status of
+ torrent_ids = []
+
+ if options.torrent_ids:
+ for t_id in options.torrent_ids:
+ torrent_ids.extend(self.console.match_torrent(t_id))
+ else:
+ torrent_ids.extend(self.console.match_torrent(''))
+
+ def on_torrents_status(status):
+ # Print out the information for each torrent
+ sort_key = options.sort
+ sort_reverse = False
+ if not sort_key:
+ sort_key = options.sort_rev
+ sort_reverse = True
+ if not sort_key:
+ sort_key = 'name'
+ sort_reverse = False
+ if sort_key not in STATUS_KEYS:
+ self.console.write('')
+ self.console.write(
+ '{!error!}Unknown sort key: ' + sort_key + ', will sort on name'
+ )
+ sort_key = 'name'
+ sort_reverse = False
+ for key, value in sorted(
+ list(status.items()),
+ key=lambda x: x[1].get(sort_key),
+ reverse=sort_reverse,
+ ):
+ self.show_info(key, status[key], options.verbose, options.detailed)
+
+ def on_torrents_status_fail(reason):
+ self.console.write('{!error!}Error getting torrent info: %s' % reason)
+
+ status_dict = {'id': torrent_ids}
+
+ if options.state:
+ options.state = options.state.capitalize()
+ if options.state in STATES:
+ status_dict.state = options.state
+ else:
+ self.console.write('Invalid state: %s' % options.state)
+ self.console.write('Possible values are: %s.' % (', '.join(STATES)))
+ return
+
+ d = client.core.get_torrents_status(status_dict, STATUS_KEYS)
+ d.addCallback(on_torrents_status)
+ d.addErrback(on_torrents_status_fail)
+ return d
+
+ def show_file_info(self, torrent_id, status):
+ spaces_per_level = 2
+
+ if hasattr(self.console, 'screen'):
+ cols = self.console.screen.cols
+ else:
+ cols = 80
+
+ prevpath = []
+ for index, torrent_file in enumerate(status['files']):
+ filename = torrent_file['path'].split(dirsep)[-1]
+ filepath = torrent_file['path'].split(dirsep)[:-1]
+
+ for depth, subdir in enumerate(filepath):
+ indent = ' ' * depth * spaces_per_level
+ if depth >= len(prevpath):
+ self.console.write('%s{!cyan!}%s' % (indent, subdir))
+ elif subdir != prevpath[depth]:
+ self.console.write('%s{!cyan!}%s' % (indent, subdir))
+
+ depth = len(filepath)
+
+ indent = ' ' * depth * spaces_per_level
+
+ col_filename = indent + filename
+ col_size = ' ({!cyan!}%s{!input!})' % fsize(torrent_file['size'])
+ col_progress = ' {!input!}%.2f%%' % (status['file_progress'][index] * 100)
+
+ col_priority = ' {!info!}Priority: '
+
+ file_priority = FILE_PRIORITY[status['file_priorities'][index]]
+
+ if status['file_progress'][index] != 1.0:
+ if file_priority == 'Skip':
+ col_priority += '{!error!}'
+ else:
+ col_priority += '{!success!}'
+ else:
+ col_priority += '{!input!}'
+ col_priority += file_priority
+
+ def tlen(string):
+ return strwidth(remove_formatting(string))
+
+ col_all_info = col_size + col_progress + col_priority
+ # Check how much space we've got left after writing all the info
+ space_left = cols - tlen(col_all_info)
+ # And how much we will potentially have with the longest possible column
+ maxlen_space_left = cols - tlen(' (1000.0 MiB) 100.00% Priority: Normal')
+ if maxlen_space_left > tlen(col_filename) + 1:
+ # If there is enough space, pad it all nicely
+ col_all_info = ''
+ col_all_info += ' ('
+ spaces_to_add = tlen(' (1000.0 MiB)') - tlen(col_size)
+ col_all_info += ' ' * spaces_to_add
+ col_all_info += col_size[2:]
+ spaces_to_add = tlen(' 100.00%') - tlen(col_progress)
+ col_all_info += ' ' * spaces_to_add
+ col_all_info += col_progress
+ spaces_to_add = tlen(' Priority: Normal') - tlen(col_priority)
+ col_all_info += col_priority
+ col_all_info += ' ' * spaces_to_add
+ # And remember to put it to the left!
+ col_filename = pad_string(
+ col_filename, maxlen_space_left - 2, side='right'
+ )
+ elif space_left > tlen(col_filename) + 1:
+ # If there is enough space, put the info to the right
+ col_filename = pad_string(col_filename, space_left - 2, side='right')
+ else:
+ # And if there is not, shorten the name
+ col_filename = trim_string(col_filename, space_left, True)
+ self.console.write(col_filename + col_all_info)
+
+ prevpath = filepath
+
+ def show_peer_info(self, torrent_id, status):
+ if len(status['peers']) == 0:
+ self.console.write(' None')
+ else:
+ s = ''
+ for peer in status['peers']:
+ if peer['seed']:
+ s += '%sSeed\t{!input!}' % colors.state_color['Seeding']
+ else:
+ s += '%sPeer\t{!input!}' % colors.state_color['Downloading']
+
+ s += peer['country'] + '\t'
+
+ if peer['ip'].count(':') == 1:
+ # IPv4
+ s += peer['ip']
+ else:
+ # IPv6
+ s += '[%s]:%s' % (
+ ':'.join(peer['ip'].split(':')[:-1]),
+ peer['ip'].split(':')[-1],
+ )
+
+ c = peer['client']
+ s += '\t' + c
+
+ if len(c) < 16:
+ s += '\t\t'
+ else:
+ s += '\t'
+ s += '%s%s\t%s%s' % (
+ colors.state_color['Seeding'],
+ fspeed(peer['up_speed']),
+ colors.state_color['Downloading'],
+ fspeed(peer['down_speed']),
+ )
+ s += '\n'
+
+ self.console.write(s[:-1])
+
+ def show_info(self, torrent_id, status, verbose=False, detailed=False):
+ """
+ Writes out the torrents information to the screen.
+
+ Format depends on switches given.
+ """
+ self.console.set_batch_write(True)
+
+ if hasattr(self.console, 'screen'):
+ cols = self.console.screen.cols
+ else:
+ cols = 80
+
+ sep = ' '
+
+ if verbose or detailed:
+ self.console.write('{!info!}Name: {!input!}%s' % (status['name']))
+ self.console.write('{!info!}ID: {!input!}%s' % (torrent_id))
+ s = '{!info!}State: %s%s' % (
+ colors.state_color[status['state']],
+ status['state'],
+ )
+ # Only show speed if active
+ if status['state'] in ('Seeding', 'Downloading'):
+ if status['state'] != 'Seeding':
+ s += sep
+ s += '{!info!}Down Speed: {!input!}%s' % fspeed(
+ status['download_payload_rate'], shortform=True
+ )
+ s += sep
+ s += '{!info!}Up Speed: {!input!}%s' % fspeed(
+ status['upload_payload_rate'], shortform=True
+ )
+ self.console.write(s)
+
+ if status['state'] in ('Seeding', 'Downloading', 'Queued'):
+ s = '{!info!}Seeds: {!input!}%s (%s)' % (
+ status['num_seeds'],
+ status['total_seeds'],
+ )
+ s += sep
+ s += '{!info!}Peers: {!input!}%s (%s)' % (
+ status['num_peers'],
+ status['total_peers'],
+ )
+ s += sep
+ s += (
+ '{!info!}Availability: {!input!}%.2f' % status['distributed_copies']
+ )
+ s += sep
+ s += '{!info!}Seed Rank: {!input!}%s' % f_seedrank_dash(
+ status['seed_rank'], status['seeding_time']
+ )
+ self.console.write(s)
+
+ total_done = fsize(status['total_done'], shortform=True)
+ total_size = fsize(status['total_size'], shortform=True)
+ if total_done == total_size:
+ s = '{!info!}Size: {!input!}%s' % (total_size)
+ else:
+ s = '{!info!}Size: {!input!}%s/%s' % (total_done, total_size)
+ s += sep
+ s += '{!info!}Downloaded: {!input!}%s' % fsize(
+ status['all_time_download'], shortform=True
+ )
+ s += sep
+ s += '{!info!}Uploaded: {!input!}%s' % fsize(
+ status['total_uploaded'], shortform=True
+ )
+ s += sep
+ s += '{!info!}Share Ratio: {!input!}%.2f' % status['ratio']
+ self.console.write(s)
+
+ s = '{!info!}ETA: {!input!}%s' % format_time(status['eta'])
+ s += sep
+ s += '{!info!}Seeding: {!input!}%s' % format_time(status['seeding_time'])
+ s += sep
+ s += '{!info!}Active: {!input!}%s' % format_time(status['active_time'])
+ self.console.write(s)
+
+ s = '{!info!}Last Transfer: {!input!}%s' % format_time(
+ status['time_since_transfer']
+ )
+ s += sep
+ s += '{!info!}Complete Seen: {!input!}%s' % format_date_never(
+ status['last_seen_complete']
+ )
+ self.console.write(s)
+
+ s = '{!info!}Tracker: {!input!}%s' % status['tracker_host']
+ self.console.write(s)
+
+ self.console.write(
+ '{!info!}Tracker status: {!input!}%s' % status['tracker_status']
+ )
+
+ if not status['is_finished']:
+ pbar = f_progressbar(
+ status['progress'], cols - (13 + len('%.2f%%' % status['progress']))
+ )
+ s = '{!info!}Progress: {!input!}%.2f%% %s' % (status['progress'], pbar)
+ self.console.write(s)
+
+ s = '{!info!}Download Folder: {!input!}%s' % status['download_location']
+ self.console.write(s + '\n')
+
+ if detailed:
+ self.console.write('{!info!}Files in torrent')
+ self.show_file_info(torrent_id, status)
+ self.console.write('{!info!}Connected peers')
+ self.show_peer_info(torrent_id, status)
+ else:
+ up_color = colors.state_color['Seeding']
+ down_color = colors.state_color['Downloading']
+
+ s = '%s%s' % (
+ colors.state_color[status['state']],
+ '[' + status['state'][0] + ']',
+ )
+
+ s += ' {!info!}' + format_progress(status['progress']).rjust(6, ' ')
+ s += ' {!input!}%s' % (status['name'])
+
+ # Shorten the ID if it's necessary. Pretty hacky
+ # XXX: should make a nice function for it that can partition and shorten stuff
+ space_left = cols - strwidth('[S] 99.99% ' + status['name'])
+
+ if self.console.interactive and space_left >= len(sep + torrent_id):
+ # Not enough line space so shorten the hash (for interactive mode).
+ torrent_id = shorten_hash(torrent_id, space_left)
+ s += sep
+ s += '{!cyan!}%s' % torrent_id
+ self.console.write(s)
+
+ dl_info = '{!info!}DL: {!input!}'
+ dl_info += '%s' % ftotal_sized(
+ status['all_time_download'], status['total_payload_download']
+ )
+
+ if status['download_payload_rate'] > 0:
+ dl_info += ' @ %s%s' % (
+ down_color,
+ fspeed(status['download_payload_rate'], shortform=True),
+ )
+
+ ul_info = ' {!info!}UL: {!input!}'
+ ul_info += '%s' % ftotal_sized(
+ status['total_uploaded'], status['total_payload_upload']
+ )
+ if status['upload_payload_rate'] > 0:
+ ul_info += ' @ %s%s' % (
+ up_color,
+ fspeed(status['upload_payload_rate'], shortform=True),
+ )
+
+ eta = ' {!info!}ETA: {!magenta!}%s' % format_time(status['eta'])
+
+ self.console.write(' ' + dl_info + ul_info + eta + '\n')
+
+ self.console.set_batch_write(False)
+
+ def complete(self, line):
+ # We use the ConsoleUI torrent tab complete method
+ return component.get('ConsoleUI').tab_complete_torrent(line)
diff --git a/deluge/ui/console/cmdline/commands/manage.py b/deluge/ui/console/cmdline/commands/manage.py
new file mode 100644
index 0000000..6375a74
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/manage.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from twisted.internet import defer
+
+import deluge.component as component
+from deluge.ui.client import client
+from deluge.ui.console.utils.common import TORRENT_OPTIONS
+
+from . import BaseCommand
+
+log = logging.getLogger(__name__)
+
+
+class Command(BaseCommand):
+ """Show and manage per-torrent options"""
+
+ usage = _('Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]')
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ 'torrent',
+ metavar='<torrent>',
+ help=_('an expression matched against torrent ids and torrent names'),
+ )
+ set_group = parser.add_argument_group('setting a value')
+ set_group.add_argument(
+ '-s',
+ '--set',
+ action='store',
+ metavar='<key>',
+ help=_('set value for this key'),
+ )
+ set_group.add_argument(
+ 'values', metavar='<value>', nargs='+', help=_('Value to set')
+ )
+ get_group = parser.add_argument_group('getting values')
+ get_group.add_argument(
+ 'keys',
+ metavar='<keys>',
+ nargs='*',
+ help=_('one or more keys separated by space'),
+ )
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+ if options.set:
+ return self._set_option(options)
+ else:
+ return self._get_option(options)
+
+ def _get_option(self, options):
+ def on_torrents_status(status):
+ for torrentid, data in status.items():
+ self.console.write('')
+ if 'name' in data:
+ self.console.write('{!info!}Name: {!input!}%s' % data.get('name'))
+ self.console.write('{!info!}ID: {!input!}%s' % torrentid)
+ for k, v in data.items():
+ if k != 'name':
+ self.console.write('{!info!}%s: {!input!}%s' % (k, v))
+
+ def on_torrents_status_fail(reason):
+ self.console.write('{!error!}Failed to get torrent data.')
+
+ torrent_ids = self.console.match_torrent(options.torrent)
+
+ request_options = []
+ for opt in options.values:
+ if opt not in TORRENT_OPTIONS:
+ self.console.write('{!error!}Unknown torrent option: %s' % opt)
+ return
+ request_options.append(opt)
+ if not request_options:
+ request_options = list(TORRENT_OPTIONS)
+ request_options.append('name')
+
+ d = client.core.get_torrents_status({'id': torrent_ids}, request_options)
+ d.addCallbacks(on_torrents_status, on_torrents_status_fail)
+ return d
+
+ def _set_option(self, options):
+ deferred = defer.Deferred()
+ key = options.set
+ val = ' '.join(options.values)
+ torrent_ids = self.console.match_torrent(options.torrent)
+
+ if key not in TORRENT_OPTIONS:
+ self.console.write('{!error!}Invalid key: %s' % key)
+ return
+
+ val = TORRENT_OPTIONS[key](val)
+
+ def on_set_config(result):
+ self.console.write('{!success!}Torrent option successfully updated.')
+ deferred.callback(True)
+
+ self.console.write(
+ 'Setting %s to %s for torrents %s..' % (key, val, torrent_ids)
+ )
+ client.core.set_torrent_options(torrent_ids, {key: val}).addCallback(
+ on_set_config
+ )
+ return deferred
+
+ def complete(self, line):
+ # We use the ConsoleUI torrent tab complete method
+ return component.get('ConsoleUI').tab_complete_torrent(line)
diff --git a/deluge/ui/console/cmdline/commands/move.py b/deluge/ui/console/cmdline/commands/move.py
new file mode 100644
index 0000000..13e475e
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/move.py
@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os.path
+
+import deluge.component as component
+from deluge.ui.client import client
+
+from . import BaseCommand
+
+log = logging.getLogger(__name__)
+
+
+class Command(BaseCommand):
+ """Move torrents' storage location"""
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ 'torrent_ids',
+ metavar='<torrent-id>',
+ nargs='+',
+ help=_('One or more torrent ids'),
+ )
+ parser.add_argument(
+ 'path', metavar='<path>', help=_('The path to move the torrents to')
+ )
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+
+ if os.path.exists(options.path) and not os.path.isdir(options.path):
+ self.console.write(
+ '{!error!}Cannot Move Download Folder: %s exists and is not a directory'
+ % options.path
+ )
+ return
+
+ ids = []
+ names = []
+ for t_id in options.torrent_ids:
+ tid = self.console.match_torrent(t_id)
+ ids.extend(tid)
+ names.append(self.console.get_torrent_name(tid))
+
+ def on_move(res):
+ msg = 'Moved "%s" to %s' % (', '.join(names), options.path)
+ self.console.write(msg)
+ log.info(msg)
+
+ d = client.core.move_storage(ids, options.path)
+ d.addCallback(on_move)
+ return d
+
+ def complete(self, line):
+ line = os.path.abspath(os.path.expanduser(line))
+ ret = []
+ if os.path.exists(line):
+ # This is a correct path, check to see if it's a directory
+ if os.path.isdir(line):
+ # Directory, so we need to show contents of directory
+ # ret.extend(os.listdir(line))
+ for f in os.listdir(line):
+ # Skip hidden
+ if f.startswith('.'):
+ continue
+ f = os.path.join(line, f)
+ if os.path.isdir(f):
+ f += '/'
+ ret.append(f)
+ else:
+ # This is a file, but we could be looking for another file that
+ # shares a common prefix.
+ for f in os.listdir(os.path.dirname(line)):
+ if f.startswith(os.path.split(line)[1]):
+ ret.append(os.path.join(os.path.dirname(line), f))
+ else:
+ # This path does not exist, so lets do a listdir on it's parent
+ # and find any matches.
+ ret = []
+ if os.path.isdir(os.path.dirname(line)):
+ for f in os.listdir(os.path.dirname(line)):
+ if f.startswith(os.path.split(line)[1]):
+ p = os.path.join(os.path.dirname(line), f)
+
+ if os.path.isdir(p):
+ p += '/'
+ ret.append(p)
+ return ret
diff --git a/deluge/ui/console/cmdline/commands/pause.py b/deluge/ui/console/cmdline/commands/pause.py
new file mode 100644
index 0000000..1f7ef31
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/pause.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.component as component
+from deluge.ui.client import client
+
+from . import BaseCommand
+
+
+class Command(BaseCommand):
+ """Pause torrents"""
+
+ usage = 'pause [ * | <torrent-id> [<torrent-id> ...] ]'
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ 'torrent_ids',
+ metavar='<torrent-id>',
+ nargs='+',
+ help=_('One or more torrent ids. Use "*" to pause all torrents'),
+ )
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+
+ if options.torrent_ids[0] == '*':
+ client.core.pause_session()
+ return
+
+ torrent_ids = []
+ for arg in options.torrent_ids:
+ torrent_ids.extend(self.console.match_torrent(arg))
+
+ if torrent_ids:
+ return client.core.pause_torrent(torrent_ids)
+
+ def complete(self, line):
+ # We use the ConsoleUI torrent tab complete method
+ return component.get('ConsoleUI').tab_complete_torrent(line)
diff --git a/deluge/ui/console/cmdline/commands/plugin.py b/deluge/ui/console/cmdline/commands/plugin.py
new file mode 100644
index 0000000..fafc77a
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/plugin.py
@@ -0,0 +1,143 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.component as component
+import deluge.configmanager
+from deluge.ui.client import client
+
+from . import BaseCommand
+
+
+class Command(BaseCommand):
+ """Manage plugins"""
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ '-l',
+ '--list',
+ action='store_true',
+ default=False,
+ dest='list',
+ help=_('Lists available plugins'),
+ )
+ parser.add_argument(
+ '-s',
+ '--show',
+ action='store_true',
+ default=False,
+ dest='show',
+ help=_('Shows enabled plugins'),
+ )
+ parser.add_argument(
+ '-e', '--enable', dest='enable', nargs='+', help=_('Enables a plugin')
+ )
+ parser.add_argument(
+ '-d', '--disable', dest='disable', nargs='+', help=_('Disables a plugin')
+ )
+ parser.add_argument(
+ '-r',
+ '--reload',
+ action='store_true',
+ default=False,
+ dest='reload',
+ help=_('Reload list of available plugins'),
+ )
+ parser.add_argument(
+ '-i', '--install', help=_('Install a plugin from an .egg file')
+ )
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+
+ if options.reload:
+ client.core.pluginmanager.rescan_plugins()
+ self.console.write('{!green!}Plugin list successfully reloaded')
+ return
+
+ elif options.list:
+
+ def on_available_plugins(result):
+ self.console.write('{!info!}Available Plugins:')
+ for p in result:
+ self.console.write('{!input!} ' + p)
+
+ return client.core.get_available_plugins().addCallback(on_available_plugins)
+
+ elif options.show:
+
+ def on_enabled_plugins(result):
+ self.console.write('{!info!}Enabled Plugins:')
+ for p in result:
+ self.console.write('{!input!} ' + p)
+
+ return client.core.get_enabled_plugins().addCallback(on_enabled_plugins)
+
+ elif options.enable:
+
+ def on_available_plugins(result):
+ plugins = {}
+ for p in result:
+ plugins[p.lower()] = p
+ for arg in options.enable:
+ if arg.lower() in plugins:
+ client.core.enable_plugin(plugins[arg.lower()])
+
+ return client.core.get_available_plugins().addCallback(on_available_plugins)
+
+ elif options.disable:
+
+ def on_enabled_plugins(result):
+ plugins = {}
+ for p in result:
+ plugins[p.lower()] = p
+ for arg in options.disable:
+ if arg.lower() in plugins:
+ client.core.disable_plugin(plugins[arg.lower()])
+
+ return client.core.get_enabled_plugins().addCallback(on_enabled_plugins)
+
+ elif options.install:
+ import os.path
+ from base64 import b64encode
+ import shutil
+
+ filepath = options.install
+
+ if not os.path.exists(filepath):
+ self.console.write('{!error!}Invalid path: %s' % filepath)
+ return
+
+ config_dir = deluge.configmanager.get_config_dir()
+ filename = os.path.split(filepath)[1]
+ shutil.copyfile(filepath, os.path.join(config_dir, 'plugins', filename))
+
+ client.core.rescan_plugins()
+
+ if not client.is_localhost():
+ # We need to send this plugin to the daemon
+ with open(filepath, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ try:
+ client.core.upload_plugin(filename, filedump)
+ client.core.rescan_plugins()
+ except Exception:
+ self.console.write(
+ '{!error!}An error occurred, plugin was not installed'
+ )
+
+ self.console.write(
+ '{!green!}Plugin was successfully installed: %s' % filename
+ )
+
+ def complete(self, line):
+ return component.get('ConsoleUI').tab_complete_path(
+ line, ext='.egg', sort='name', dirs_first=-1
+ )
diff --git a/deluge/ui/console/cmdline/commands/quit.py b/deluge/ui/console/cmdline/commands/quit.py
new file mode 100644
index 0000000..261a01a
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/quit.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.component as component
+
+from . import BaseCommand
+
+
+class Command(BaseCommand):
+ """Exit the client"""
+
+ aliases = ['exit']
+ interactive_only = True
+
+ def handle(self, options):
+ component.get('ConsoleUI').quit()
diff --git a/deluge/ui/console/cmdline/commands/recheck.py b/deluge/ui/console/cmdline/commands/recheck.py
new file mode 100644
index 0000000..c9b6360
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/recheck.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.component as component
+from deluge.ui.client import client
+
+from . import BaseCommand
+
+
+class Command(BaseCommand):
+ """Forces a recheck of the torrent data"""
+
+ usage = 'recheck [ * | <torrent-id> [<torrent-id> ...] ]'
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ 'torrent_ids',
+ metavar='<torrent-id>',
+ nargs='+',
+ help=_('One or more torrent ids'),
+ )
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+
+ if options.torrent_ids[0] == '*':
+ client.core.force_recheck(self.console.match_torrent(''))
+ return
+
+ torrent_ids = []
+ for arg in options.torrent_ids:
+ torrent_ids.extend(self.console.match_torrent(arg))
+
+ if torrent_ids:
+ return client.core.force_recheck(torrent_ids)
+
+ def complete(self, line):
+ # We use the ConsoleUI torrent tab complete method
+ return component.get('ConsoleUI').tab_complete_torrent(line)
diff --git a/deluge/ui/console/cmdline/commands/resume.py b/deluge/ui/console/cmdline/commands/resume.py
new file mode 100644
index 0000000..1f62c5f
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/resume.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.component as component
+from deluge.ui.client import client
+
+from . import BaseCommand
+
+
+class Command(BaseCommand):
+ """Resume torrents"""
+
+ usage = _('Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]')
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ 'torrent_ids',
+ metavar='<torrent-id>',
+ nargs='+',
+ help=_('One or more torrent ids. Use "*" to resume all torrents'),
+ )
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+
+ if options.torrent_ids[0] == '*':
+ client.core.resume_session()
+ return
+
+ torrent_ids = []
+ for t_id in options.torrent_ids:
+ torrent_ids.extend(self.console.match_torrent(t_id))
+
+ if torrent_ids:
+ return client.core.resume_torrent(torrent_ids)
+
+ def complete(self, line):
+ # We use the ConsoleUI torrent tab complete method
+ return component.get('ConsoleUI').tab_complete_torrent(line)
diff --git a/deluge/ui/console/cmdline/commands/rm.py b/deluge/ui/console/cmdline/commands/rm.py
new file mode 100644
index 0000000..ff3125d
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/rm.py
@@ -0,0 +1,83 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+from deluge.ui.client import client
+
+from . import BaseCommand
+
+log = logging.getLogger(__name__)
+
+
+class Command(BaseCommand):
+ """Remove a torrent"""
+
+ aliases = ['del']
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ '--remove_data',
+ action='store_true',
+ default=False,
+ help=_('Also removes the torrent data'),
+ )
+ parser.add_argument(
+ '-c',
+ '--confirm',
+ action='store_true',
+ default=False,
+ help=_('List the matching torrents without removing.'),
+ )
+ parser.add_argument(
+ 'torrent_ids',
+ metavar='<torrent-id>',
+ nargs='+',
+ help=_('One or more torrent ids'),
+ )
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+ torrent_ids = self.console.match_torrents(options.torrent_ids)
+
+ if not options.confirm:
+ self.console.write(
+ '{!info!}%d %s %s{!info!}'
+ % (
+ len(torrent_ids),
+ _n('torrent', 'torrents', len(torrent_ids)),
+ _n('match', 'matches', len(torrent_ids)),
+ )
+ )
+ for t_id in torrent_ids:
+ name = self.console.get_torrent_name(t_id)
+ self.console.write('* %-50s (%s)' % (name, t_id))
+ self.console.write(
+ _('Confirm with -c to remove the listed torrents (Count: %d)')
+ % len(torrent_ids)
+ )
+ return
+
+ def on_removed_finished(errors):
+ if errors:
+ self.console.write('Error(s) occured when trying to delete torrent(s).')
+ for t_id, e_msg in errors:
+ self.console.write('Error removing torrent %s : %s' % (t_id, e_msg))
+
+ log.info('Removing %d torrents', len(torrent_ids))
+ d = client.core.remove_torrents(torrent_ids, options.remove_data)
+ d.addCallback(on_removed_finished)
+
+ def complete(self, line):
+ # We use the ConsoleUI torrent tab complete method
+ return component.get('ConsoleUI').tab_complete_torrent(line)
diff --git a/deluge/ui/console/cmdline/commands/status.py b/deluge/ui/console/cmdline/commands/status.py
new file mode 100644
index 0000000..948ad6b
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/status.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from twisted.internet import defer
+
+import deluge.component as component
+from deluge.common import TORRENT_STATE, fspeed
+from deluge.ui.client import client
+
+from . import BaseCommand
+
+log = logging.getLogger(__name__)
+
+
+class Command(BaseCommand):
+ """Shows various status information from the daemon"""
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ '-r',
+ '--raw',
+ action='store_true',
+ default=False,
+ dest='raw',
+ help=_(
+ 'Raw values for upload/download rates (without KiB/s suffix)'
+ '(useful for scripts that want to do their own parsing)'
+ ),
+ )
+ parser.add_argument(
+ '-n',
+ '--no-torrents',
+ action='store_false',
+ default=True,
+ dest='show_torrents',
+ help=_('Do not show torrent status (Improves command speed)'),
+ )
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+ self.status = None
+ self.torrents = 1 if options.show_torrents else 0
+ self.raw = options.raw
+
+ def on_session_status(status):
+ self.status = status
+
+ def on_torrents_status(status):
+ self.torrents = status
+
+ def on_torrents_status_fail(reason):
+ log.warning('Failed to retrieve session status: %s', reason)
+ self.torrents = -2
+
+ deferreds = []
+
+ ds = client.core.get_session_status(
+ ['num_peers', 'payload_upload_rate', 'payload_download_rate', 'dht_nodes']
+ )
+ ds.addCallback(on_session_status)
+ deferreds.append(ds)
+
+ if options.show_torrents:
+ dt = client.core.get_torrents_status({}, ['state'])
+ dt.addCallback(on_torrents_status)
+ dt.addErrback(on_torrents_status_fail)
+ deferreds.append(dt)
+
+ return defer.DeferredList(deferreds).addCallback(self.print_status)
+
+ def print_status(self, *args):
+ self.console.set_batch_write(True)
+ if self.raw:
+ self.console.write(
+ '{!info!}Total upload: %f' % self.status['payload_upload_rate']
+ )
+ self.console.write(
+ '{!info!}Total download: %f' % self.status['payload_download_rate']
+ )
+ else:
+ self.console.write(
+ '{!info!}Total upload: %s' % fspeed(self.status['payload_upload_rate'])
+ )
+ self.console.write(
+ '{!info!}Total download: %s'
+ % fspeed(self.status['payload_download_rate'])
+ )
+ self.console.write('{!info!}DHT Nodes: %i' % self.status['dht_nodes'])
+
+ if isinstance(self.torrents, int):
+ if self.torrents == -2:
+ self.console.write('{!error!}Error getting torrent info')
+ else:
+ self.console.write('{!info!}Total torrents: %i' % len(self.torrents))
+ state_counts = {}
+ for state in TORRENT_STATE:
+ state_counts[state] = 0
+ for t in self.torrents:
+ s = self.torrents[t]
+ state_counts[s['state']] += 1
+ for state in TORRENT_STATE:
+ self.console.write('{!info!} %s: %i' % (state, state_counts[state]))
+
+ self.console.set_batch_write(False)
diff --git a/deluge/ui/console/cmdline/commands/update_tracker.py b/deluge/ui/console/cmdline/commands/update_tracker.py
new file mode 100644
index 0000000..591b951
--- /dev/null
+++ b/deluge/ui/console/cmdline/commands/update_tracker.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.component as component
+from deluge.ui.client import client
+
+from . import BaseCommand
+
+
+class Command(BaseCommand):
+ """Update tracker for torrent(s)"""
+
+ usage = 'update_tracker [ * | <torrent-id> [<torrent-id> ...] ]'
+ aliases = ['reannounce']
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ 'torrent_ids',
+ metavar='<torrent-id>',
+ nargs='+',
+ help='One or more torrent ids. "*" updates all torrents',
+ )
+
+ def handle(self, options):
+ self.console = component.get('ConsoleUI')
+ args = options.torrent_ids
+ if options.torrent_ids[0] == '*':
+ args = ['']
+
+ torrent_ids = []
+ for arg in args:
+ torrent_ids.extend(self.console.match_torrent(arg))
+
+ client.core.force_reannounce(torrent_ids)
+
+ def complete(self, line):
+ # We use the ConsoleUI torrent tab complete method
+ return component.get('ConsoleUI').tab_complete_torrent(line)
diff --git a/deluge/ui/console/console.py b/deluge/ui/console/console.py
new file mode 100644
index 0000000..58d31d5
--- /dev/null
+++ b/deluge/ui/console/console.py
@@ -0,0 +1,169 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+from __future__ import print_function, unicode_literals
+
+import fnmatch
+import logging
+import os
+import sys
+
+import deluge.common
+from deluge.argparserbase import ArgParserBase, DelugeTextHelpFormatter
+from deluge.ui.ui import UI
+
+log = logging.getLogger(__name__)
+
+#
+# Note: Cannot import from console.main here because it imports the twisted reactor.
+# Console is imported from console/__init__.py loaded by the script entry points
+# defined in setup.py
+#
+
+
+def load_commands(command_dir):
+ def get_command(name):
+ command = getattr(
+ __import__(
+ 'deluge.ui.console.cmdline.commands.%s' % name, {}, {}, ['Command']
+ ),
+ 'Command',
+ )()
+ command._name = name
+ return command
+
+ try:
+ dir_list = fnmatch.filter(os.listdir(command_dir), '*.py')
+ except OSError:
+ return {}
+
+ commands = []
+ for filename in dir_list:
+ if filename.startswith('_'):
+ continue
+ cmd = get_command(os.path.splitext(filename)[0])
+ for cmd_name in [cmd._name] + cmd.aliases:
+ commands.append((cmd_name, cmd))
+ return dict(commands)
+
+
+class LogStream(object):
+ out = sys.stdout
+
+ def write(self, data):
+ self.out.write(data)
+
+ def flush(self):
+ self.out.flush()
+
+
+class Console(UI):
+
+ cmd_description = """Console or command-line user interface"""
+
+ def __init__(self, *args, **kwargs):
+ super(Console, self).__init__(
+ 'console', *args, log_stream=LogStream(), **kwargs
+ )
+
+ group = self.parser.add_argument_group(
+ _('Console Options'),
+ _(
+ 'These daemon connect options will be '
+ 'used for commands, or if console ui autoconnect is enabled.'
+ ),
+ )
+ group.add_argument(
+ '-d',
+ '--daemon',
+ metavar='<ip_addr>',
+ dest='daemon_addr',
+ help=_('Deluge daemon IP address to connect to (default 127.0.0.1)'),
+ default='127.0.0.1',
+ )
+ group.add_argument(
+ '-p',
+ '--port',
+ metavar='<port>',
+ dest='daemon_port',
+ type=int,
+ help=_('Deluge daemon port to connect to (default 58846)'),
+ default='58846',
+ )
+ group.add_argument(
+ '-U',
+ '--username',
+ metavar='<user>',
+ dest='daemon_user',
+ help=_('Deluge daemon username to use when connecting'),
+ )
+ group.add_argument(
+ '-P',
+ '--password',
+ metavar='<pass>',
+ dest='daemon_pass',
+ help=_('Deluge daemon password to use when connecting'),
+ )
+ # To properly print help message for the console commands ( e.g. deluge-console info -h),
+ # we add a subparser for each command which will trigger the help/usage when given
+ from deluge.ui.console.parser import (
+ ConsoleCommandParser,
+ ) # import here because (see top)
+
+ self.console_parser = ConsoleCommandParser(
+ parents=[self.parser],
+ add_help=False,
+ prog=self.parser.prog,
+ description='Starts the Deluge console interface',
+ formatter_class=lambda prog: DelugeTextHelpFormatter(
+ prog, max_help_position=33, width=90
+ ),
+ )
+ self.parser.subparser = self.console_parser
+ self.console_parser.base_parser = self.parser
+ subparsers = self.console_parser.add_subparsers(
+ title=_('Console Commands'),
+ help=_('Description'),
+ description=_('The following console commands are available:'),
+ metavar=_('Command'),
+ dest='command',
+ )
+ from deluge.ui.console import UI_PATH # Must import here
+
+ self.console_cmds = load_commands(os.path.join(UI_PATH, 'cmdline', 'commands'))
+ for cmd in sorted(self.console_cmds):
+ self.console_cmds[cmd].add_subparser(subparsers)
+
+ def start(self):
+ if self.ui_args is None:
+ # Started directly by deluge-console script so must find the UI args manually
+ options, remaining = ArgParserBase(common_help=False).parse_known_args()
+ self.ui_args = remaining
+
+ i = self.console_parser.find_subcommand(args=self.ui_args)
+ self.console_parser.subcommand = False
+ self.parser.subcommand = False if i == -1 else True
+
+ super(Console, self).start(self.console_parser)
+ from deluge.ui.console.main import ConsoleUI # import here because (see top)
+
+ def run(options):
+ try:
+ c = ConsoleUI(self.options, self.console_cmds, self.parser.log_stream)
+ return c.start_ui()
+ except Exception as ex:
+ log.exception(ex)
+ raise
+
+ return deluge.common.run_profiled(
+ run,
+ self.options,
+ output_file=self.options.profile,
+ do_profile=self.options.profile,
+ )
diff --git a/deluge/ui/console/main.py b/deluge/ui/console/main.py
new file mode 100644
index 0000000..23965bb
--- /dev/null
+++ b/deluge/ui/console/main.py
@@ -0,0 +1,765 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+import locale
+import logging
+import os
+import sys
+import time
+
+from twisted.internet import defer, error, reactor
+
+import deluge.common
+import deluge.component as component
+from deluge.configmanager import ConfigManager
+from deluge.decorators import overrides
+from deluge.error import DelugeError
+from deluge.ui.client import client
+from deluge.ui.console.modes.addtorrents import AddTorrents
+from deluge.ui.console.modes.basemode import TermResizeHandler
+from deluge.ui.console.modes.cmdline import CmdLine
+from deluge.ui.console.modes.eventview import EventView
+from deluge.ui.console.modes.preferences import Preferences
+from deluge.ui.console.modes.torrentdetail import TorrentDetail
+from deluge.ui.console.modes.torrentlist.torrentlist import TorrentList
+from deluge.ui.console.utils import colors
+from deluge.ui.console.widgets import StatusBars
+from deluge.ui.coreconfig import CoreConfig
+from deluge.ui.sessionproxy import SessionProxy
+
+log = logging.getLogger(__name__)
+
+DEFAULT_CONSOLE_PREFS = {
+ 'ring_bell': False,
+ 'first_run': True,
+ 'language': '',
+ 'torrentview': {
+ 'sort_primary': 'queue',
+ 'sort_secondary': 'name',
+ 'show_sidebar': True,
+ 'sidebar_width': 25,
+ 'separate_complete': True,
+ 'move_selection': True,
+ 'columns': {},
+ },
+ 'addtorrents': {
+ 'show_misc_files': False, # TODO: Showing/hiding this
+ 'show_hidden_folders': False, # TODO: Showing/hiding this
+ 'sort_column': 'date',
+ 'reverse_sort': True,
+ 'last_path': '~',
+ },
+ 'cmdline': {
+ 'ignore_duplicate_lines': False,
+ 'third_tab_lists_all': False,
+ 'torrents_per_tab_press': 15,
+ 'save_command_history': True,
+ },
+}
+
+
+class ConsoleUI(component.Component, TermResizeHandler):
+ def __init__(self, options, cmds, log_stream):
+ component.Component.__init__(self, 'ConsoleUI')
+ TermResizeHandler.__init__(self)
+ self.options = options
+ self.log_stream = log_stream
+
+ # keep track of events for the log view
+ self.events = []
+ self.torrents = []
+ self.statusbars = None
+ self.modes = {}
+ self.active_mode = None
+ self.initialized = False
+
+ try:
+ locale.setlocale(locale.LC_ALL, '')
+ self.encoding = locale.getpreferredencoding()
+ except locale.Error:
+ self.encoding = sys.getdefaultencoding()
+
+ log.debug('Using encoding: %s', self.encoding)
+
+ # start up the session proxy
+ self.sessionproxy = SessionProxy()
+
+ client.set_disconnect_callback(self.on_client_disconnect)
+
+ # Set the interactive flag to indicate where we should print the output
+ self.interactive = True
+ self._commands = cmds
+ self.coreconfig = CoreConfig()
+
+ def start_ui(self):
+ """Start the console UI.
+
+ Note: When running console UI reactor.run() will be called which
+ effectively blocks this function making the return value
+ insignificant. However, when running unit tests, the reacor is
+ replaced by a mock object, leaving the return deferred object
+ necessary for the tests to run properly.
+
+ Returns:
+ Deferred: If valid commands are provided, a deferred that fires when
+ all commands are executed. Else None is returned.
+ """
+ if self.options.parsed_cmds:
+ self.interactive = False
+ if not self._commands:
+ print('No valid console commands found')
+ return
+
+ deferred = self.exec_args(self.options)
+ reactor.run()
+ return deferred
+ else:
+ # Interactive
+ if deluge.common.windows_check():
+ print(
+ """\nDeluge-console does not run in interactive mode on Windows. \n
+Please use commands from the command line, e.g.:\n
+ deluge-console.exe help
+ deluge-console.exe info
+ deluge-console.exe "add --help"
+ deluge-console.exe "add -p c:\\mytorrents c:\\new.torrent"
+"""
+ )
+ else:
+
+ class ConsoleLog(object):
+ def write(self, data):
+ pass
+
+ def flush(self):
+ pass
+
+ # We don't ever want log output to terminal when running in
+ # interactive mode, so insert a dummy here
+ self.log_stream.out = ConsoleLog()
+
+ # Set Esc key delay to 0 to avoid a very annoying delay
+ # due to curses waiting in case of other key are pressed
+ # after ESC is pressed
+ os.environ.setdefault('ESCDELAY', '0')
+
+ # We use the curses.wrapper function to prevent the console from getting
+ # messed up if an uncaught exception is experienced.
+ from curses import wrapper
+
+ wrapper(self.run)
+
+ def quit(self):
+ if client.connected():
+
+ def on_disconnect(result):
+ reactor.stop()
+
+ return client.disconnect().addCallback(on_disconnect)
+ else:
+ try:
+ reactor.stop()
+ except error.ReactorNotRunning:
+ pass
+
+ def exec_args(self, options):
+ """Execute console commands from command line."""
+ from deluge.ui.console.cmdline.command import Commander
+
+ commander = Commander(self._commands)
+
+ def on_connect(result):
+ def on_components_started(result):
+ def on_started(result):
+ def do_command(result, cmd):
+ return commander.do_command(cmd)
+
+ def exec_command(result, cmd):
+ return commander.exec_command(cmd)
+
+ d = defer.succeed(None)
+ for command in options.parsed_cmds:
+ if command.command in ('quit', 'exit'):
+ break
+ d.addCallback(exec_command, command)
+ d.addCallback(do_command, 'quit')
+ return d
+
+ # We need to wait for the rpcs in start() to finish before processing
+ # any of the commands.
+ self.started_deferred.addCallback(on_started)
+ return self.started_deferred
+
+ d = self.start_console()
+ d.addCallback(on_components_started)
+ return d
+
+ def on_connect_fail(reason):
+ if reason.check(DelugeError):
+ rm = reason.getErrorMessage()
+ else:
+ rm = reason.value.message
+ print(
+ 'Could not connect to daemon: %s:%s\n %s'
+ % (options.daemon_addr, options.daemon_port, rm)
+ )
+ commander.do_command('quit')
+
+ d = None
+ if not self.interactive and options.parsed_cmds[0].command == 'connect':
+ d = commander.exec_command(options.parsed_cmds.pop(0))
+ else:
+ log.info(
+ 'connect: host=%s, port=%s, username=%s, password=%s',
+ options.daemon_addr,
+ options.daemon_port,
+ options.daemon_user,
+ options.daemon_pass,
+ )
+ d = client.connect(
+ options.daemon_addr,
+ options.daemon_port,
+ options.daemon_user,
+ options.daemon_pass,
+ )
+ d.addCallback(on_connect)
+ d.addErrback(on_connect_fail)
+ return d
+
+ def run(self, stdscr):
+ """This method is called by the curses.wrapper to start the mainloop and screen.
+
+ Args:
+ stdscr (_curses.curses window): curses screen passed in from curses.wrapper.
+
+ """
+ # We want to do an interactive session, so start up the curses screen and
+ # pass it the function that handles commands
+ colors.init_colors()
+ self.stdscr = stdscr
+ self.config = ConfigManager(
+ 'console.conf', defaults=DEFAULT_CONSOLE_PREFS, file_version=2
+ )
+ self.config.run_converter((0, 1), 2, self._migrate_config_1_to_2)
+
+ self.statusbars = StatusBars()
+ from deluge.ui.console.modes.connectionmanager import ConnectionManager
+
+ self.register_mode(ConnectionManager(stdscr, self.encoding), set_mode=True)
+
+ torrentlist = self.register_mode(TorrentList(self.stdscr, self.encoding))
+ self.register_mode(CmdLine(self.stdscr, self.encoding))
+ self.register_mode(EventView(torrentlist, self.stdscr, self.encoding))
+ self.register_mode(
+ TorrentDetail(torrentlist, self.stdscr, self.config, self.encoding)
+ )
+ self.register_mode(
+ Preferences(torrentlist, self.stdscr, self.config, self.encoding)
+ )
+ self.register_mode(
+ AddTorrents(torrentlist, self.stdscr, self.config, self.encoding)
+ )
+
+ self.eventlog = EventLog()
+
+ self.active_mode.topbar = (
+ '{!status!}Deluge ' + deluge.common.get_version() + ' Console'
+ )
+ self.active_mode.bottombar = '{!status!}'
+ self.active_mode.refresh()
+ # Start the twisted mainloop
+ reactor.run()
+
+ @overrides(TermResizeHandler)
+ def on_terminal_size(self, *args):
+ rows, cols = super(ConsoleUI, self).on_terminal_size(args)
+ for mode in self.modes:
+ self.modes[mode].on_resize(rows, cols)
+
+ def register_mode(self, mode, set_mode=False):
+ self.modes[mode.mode_name] = mode
+ if set_mode:
+ self.set_mode(mode.mode_name)
+ return mode
+
+ def set_mode(self, mode_name, refresh=False):
+ log.debug('Setting console mode: %s', mode_name)
+ mode = self.modes.get(mode_name, None)
+ if mode is None:
+ log.error('Non-existent mode requested: %s', mode_name)
+ return
+ self.stdscr.erase()
+
+ if self.active_mode:
+ self.active_mode.pause()
+ d = component.pause([self.active_mode.mode_name])
+
+ def on_mode_paused(result, mode, *args):
+ from deluge.ui.console.widgets.popup import PopupsHandler
+
+ if isinstance(mode, PopupsHandler):
+ if mode.popup is not None:
+ # If popups are not removed, they are still referenced in the memory
+ # which can cause issues as the popup's screen will not be destroyed.
+ # This can lead to the popup border being visible for short periods
+ # while the current modes' screen is repainted.
+ log.error(
+ 'Mode "%s" still has popups available after being paused.'
+ ' Ensure all popups are removed on pause!',
+ mode.popup.title,
+ )
+
+ d.addCallback(on_mode_paused, self.active_mode)
+ reactor.removeReader(self.active_mode)
+
+ self.active_mode = mode
+ self.statusbars.screen = self.active_mode
+
+ # The Screen object is designed to run as a twisted reader so that it
+ # can use twisted's select poll for non-blocking user input.
+ reactor.addReader(self.active_mode)
+ self.stdscr.clear()
+
+ if self.active_mode._component_state == 'Stopped':
+ component.start([self.active_mode.mode_name])
+ else:
+ component.resume([self.active_mode.mode_name])
+
+ mode.resume()
+ if refresh:
+ mode.refresh()
+ return mode
+
+ def switch_mode(self, func, error_smg):
+ def on_stop(arg):
+ if arg and True in arg[0]:
+ func()
+ else:
+ self.messages.append(('Error', error_smg))
+
+ component.stop(['TorrentList']).addCallback(on_stop)
+
+ def is_active_mode(self, mode):
+ return mode == self.active_mode
+
+ def start_components(self):
+ def on_started(result):
+ component.pause(
+ [
+ 'TorrentList',
+ 'EventView',
+ 'AddTorrents',
+ 'TorrentDetail',
+ 'Preferences',
+ ]
+ )
+
+ if self.interactive:
+ d = component.start().addCallback(on_started)
+ else:
+ d = component.start(['SessionProxy', 'ConsoleUI', 'CoreConfig'])
+ return d
+
+ def start_console(self):
+ # Maintain a list of (torrent_id, name) for use in tab completion
+ self.started_deferred = defer.Deferred()
+
+ if not self.initialized:
+ self.initialized = True
+ d = self.start_components()
+ else:
+
+ def on_stopped(result):
+ return component.start(['SessionProxy'])
+
+ d = component.stop(['SessionProxy']).addCallback(on_stopped)
+ return d
+
+ def start(self):
+ def on_session_state(result):
+ self.torrents = []
+ self.events = []
+
+ def on_torrents_status(torrents):
+ for torrent_id, status in torrents.items():
+ self.torrents.append((torrent_id, status['name']))
+ self.started_deferred.callback(True)
+
+ client.core.get_torrents_status({'id': result}, ['name']).addCallback(
+ on_torrents_status
+ )
+
+ d = client.core.get_session_state().addCallback(on_session_state)
+
+ # Register event handlers to keep the torrent list up-to-date
+ client.register_event_handler('TorrentAddedEvent', self.on_torrent_added_event)
+ client.register_event_handler(
+ 'TorrentRemovedEvent', self.on_torrent_removed_event
+ )
+ return d
+
+ def on_torrent_added_event(self, event, from_state=False):
+ def on_torrent_status(status):
+ self.torrents.append((event, status['name']))
+
+ client.core.get_torrent_status(event, ['name']).addCallback(on_torrent_status)
+
+ def on_torrent_removed_event(self, event):
+ for index, (tid, name) in enumerate(self.torrents):
+ if event == tid:
+ del self.torrents[index]
+
+ def match_torrents(self, strings):
+ torrent_ids = []
+ for s in strings:
+ torrent_ids.extend(self.match_torrent(s))
+ return list(set(torrent_ids))
+
+ def match_torrent(self, string):
+ """
+ Returns a list of torrent_id matches for the string. It will search both
+ torrent_ids and torrent names, but will only return torrent_ids.
+
+ :param string: str, the string to match on
+
+ :returns: list of matching torrent_ids. Will return an empty list if
+ no matches are found.
+
+ """
+ deluge.common.decode_bytes(string, self.encoding)
+
+ if string == '*' or string == '':
+ return [tid for tid, name in self.torrents]
+
+ match_func = '__eq__'
+ if string.startswith('*'):
+ string = string[1:]
+ match_func = 'endswith'
+ if string.endswith('*'):
+ match_func = '__contains__' if match_func == 'endswith' else 'startswith'
+ string = string[:-1]
+
+ matches = []
+ for tid, name in self.torrents:
+ deluge.common.decode_bytes(name, self.encoding)
+ if getattr(tid, match_func, None)(string) or getattr(
+ name, match_func, None
+ )(string):
+ matches.append(tid)
+ return matches
+
+ def get_torrent_name(self, torrent_id):
+ for tid, name in self.torrents:
+ if torrent_id == tid:
+ return name
+ return None
+
+ def set_batch_write(self, batch):
+ if self.interactive and isinstance(
+ self.active_mode, deluge.ui.console.modes.cmdline.CmdLine
+ ):
+ return self.active_mode.set_batch_write(batch)
+
+ def tab_complete_torrent(self, line):
+ if self.interactive and isinstance(
+ self.active_mode, deluge.ui.console.modes.cmdline.CmdLine
+ ):
+ return self.active_mode.tab_complete_torrent(line)
+
+ def tab_complete_path(
+ self, line, path_type='file', ext='', sort='name', dirs_first=True
+ ):
+ if self.interactive and isinstance(
+ self.active_mode, deluge.ui.console.modes.cmdline.CmdLine
+ ):
+ return self.active_mode.tab_complete_path(
+ line, path_type=path_type, ext=ext, sort=sort, dirs_first=dirs_first
+ )
+
+ def on_client_disconnect(self):
+ component.stop()
+
+ def write(self, s):
+ if self.interactive:
+ if isinstance(self.active_mode, deluge.ui.console.modes.cmdline.CmdLine):
+ self.active_mode.write(s)
+ else:
+ component.get('CmdLine').add_line(s, False)
+ self.events.append(s)
+ else:
+ print(colors.strip_colors(s))
+
+ def write_event(self, s):
+ if self.interactive:
+ if isinstance(self.active_mode, deluge.ui.console.modes.cmdline.CmdLine):
+ self.events.append(s)
+ self.active_mode.write(s)
+ else:
+ component.get('CmdLine').add_line(s, False)
+ self.events.append(s)
+ else:
+ print(colors.strip_colors(s))
+
+ def _migrate_config_1_to_2(self, config):
+ """Create better structure by moving most settings out of dict root
+ and into sub categories. Some keys are also renamed to be consistent
+ with other UIs.
+ """
+
+ def move_key(source, dest, source_key, dest_key=None):
+ if dest_key is None:
+ dest_key = source_key
+ dest[dest_key] = source[source_key]
+ del source[source_key]
+
+ # These are moved to 'torrentview' sub dict
+ for k in [
+ 'sort_primary',
+ 'sort_secondary',
+ 'move_selection',
+ 'separate_complete',
+ ]:
+ move_key(config, config['torrentview'], k)
+
+ # These are moved to 'addtorrents' sub dict
+ for k in [
+ 'show_misc_files',
+ 'show_hidden_folders',
+ 'sort_column',
+ 'reverse_sort',
+ 'last_path',
+ ]:
+ move_key(config, config['addtorrents'], 'addtorrents_%s' % k, dest_key=k)
+
+ # These are moved to 'cmdline' sub dict
+ for k in [
+ 'ignore_duplicate_lines',
+ 'torrents_per_tab_press',
+ 'third_tab_lists_all',
+ ]:
+ move_key(config, config['cmdline'], k)
+
+ move_key(
+ config,
+ config['cmdline'],
+ 'save_legacy_history',
+ dest_key='save_command_history',
+ )
+
+ # Add key for localization
+ config['language'] = DEFAULT_CONSOLE_PREFS['language']
+
+ # Migrate column settings
+ columns = [
+ 'queue',
+ 'size',
+ 'state',
+ 'progress',
+ 'seeds',
+ 'peers',
+ 'downspeed',
+ 'upspeed',
+ 'eta',
+ 'ratio',
+ 'avail',
+ 'added',
+ 'tracker',
+ 'savepath',
+ 'downloaded',
+ 'uploaded',
+ 'remaining',
+ 'owner',
+ 'downloading_time',
+ 'seeding_time',
+ 'completed',
+ 'seeds_peers_ratio',
+ 'complete_seen',
+ 'down_limit',
+ 'up_limit',
+ 'shared',
+ 'name',
+ ]
+ column_name_mapping = {
+ 'downspeed': 'download_speed',
+ 'upspeed': 'upload_speed',
+ 'added': 'time_added',
+ 'savepath': 'download_location',
+ 'completed': 'completed_time',
+ 'complete_seen': 'last_seen_complete',
+ 'down_limit': 'max_download_speed',
+ 'up_limit': 'max_upload_speed',
+ 'downloading_time': 'active_time',
+ }
+
+ from deluge.ui.console.modes.torrentlist.torrentview import default_columns
+
+ # These are moved to 'torrentview.columns' sub dict
+ for k in columns:
+ column_name = column_name_mapping.get(k, k)
+ config['torrentview']['columns'][column_name] = {}
+ if k == 'name':
+ config['torrentview']['columns'][column_name]['visible'] = True
+ else:
+ move_key(
+ config,
+ config['torrentview']['columns'][column_name],
+ 'show_%s' % k,
+ dest_key='visible',
+ )
+ move_key(
+ config,
+ config['torrentview']['columns'][column_name],
+ '%s_width' % k,
+ dest_key='width',
+ )
+ config['torrentview']['columns'][column_name]['order'] = default_columns[
+ column_name
+ ]['order']
+
+ return config
+
+
+class EventLog(component.Component):
+ """
+ Prints out certain events as they are received from the core.
+ """
+
+ def __init__(self):
+ component.Component.__init__(self, 'EventLog')
+ self.console = component.get('ConsoleUI')
+ self.prefix = '{!event!}* [%H:%M:%S] '
+ self.date_change_format = 'On {!yellow!}%a, %d %b %Y{!input!} %Z:'
+
+ client.register_event_handler('TorrentAddedEvent', self.on_torrent_added_event)
+ client.register_event_handler(
+ 'PreTorrentRemovedEvent', self.on_torrent_removed_event
+ )
+ client.register_event_handler(
+ 'TorrentStateChangedEvent', self.on_torrent_state_changed_event
+ )
+ client.register_event_handler(
+ 'TorrentFinishedEvent', self.on_torrent_finished_event
+ )
+ client.register_event_handler(
+ 'NewVersionAvailableEvent', self.on_new_version_available_event
+ )
+ client.register_event_handler(
+ 'SessionPausedEvent', self.on_session_paused_event
+ )
+ client.register_event_handler(
+ 'SessionResumedEvent', self.on_session_resumed_event
+ )
+ client.register_event_handler(
+ 'ConfigValueChangedEvent', self.on_config_value_changed_event
+ )
+ client.register_event_handler(
+ 'PluginEnabledEvent', self.on_plugin_enabled_event
+ )
+ client.register_event_handler(
+ 'PluginDisabledEvent', self.on_plugin_disabled_event
+ )
+
+ self.previous_time = time.localtime(0)
+
+ def on_torrent_added_event(self, torrent_id, from_state):
+ if from_state:
+ return
+
+ def on_torrent_status(status):
+ self.write(
+ '{!green!}Torrent Added: {!info!}%s ({!cyan!}%s{!info!})'
+ % (status['name'], torrent_id)
+ )
+ # Write out what state the added torrent took
+ self.on_torrent_state_changed_event(torrent_id, status['state'])
+
+ client.core.get_torrent_status(torrent_id, ['name', 'state']).addCallback(
+ on_torrent_status
+ )
+
+ def on_torrent_removed_event(self, torrent_id):
+ self.write(
+ '{!red!}Torrent Removed: {!info!}%s ({!cyan!}%s{!info!})'
+ % (self.console.get_torrent_name(torrent_id), torrent_id)
+ )
+
+ def on_torrent_state_changed_event(self, torrent_id, state):
+ # It's probably a new torrent, ignore it
+ if not state:
+ return
+ # Modify the state string color
+ if state in colors.state_color:
+ state = colors.state_color[state] + state
+
+ t_name = self.console.get_torrent_name(torrent_id)
+
+ # Again, it's most likely a new torrent
+ if not t_name:
+ return
+
+ self.write('%s: {!info!}%s ({!cyan!}%s{!info!})' % (state, t_name, torrent_id))
+
+ def on_torrent_finished_event(self, torrent_id):
+ if component.get('TorrentList').config['ring_bell']:
+ import curses.beep
+
+ curses.beep()
+ self.write(
+ '{!info!}Torrent Finished: %s ({!cyan!}%s{!info!})'
+ % (self.console.get_torrent_name(torrent_id), torrent_id)
+ )
+
+ def on_new_version_available_event(self, version):
+ self.write('{!input!}New Deluge version available: {!info!}%s' % (version))
+
+ def on_session_paused_event(self):
+ self.write('{!input!}Session Paused')
+
+ def on_session_resumed_event(self):
+ self.write('{!green!}Session Resumed')
+
+ def on_config_value_changed_event(self, key, value):
+ color = '{!white,black,bold!}'
+ try:
+ color = colors.type_color[type(value)]
+ except KeyError:
+ pass
+
+ self.write('ConfigValueChanged: {!input!}%s: %s%s' % (key, color, value))
+
+ def write(self, s):
+ current_time = time.localtime()
+
+ date_different = False
+ for field in ['tm_mday', 'tm_mon', 'tm_year']:
+ c = getattr(current_time, field)
+ p = getattr(self.previous_time, field)
+ if c != p:
+ date_different = True
+
+ if date_different:
+ string = time.strftime(self.date_change_format)
+ if deluge.common.PY2:
+ string = string.decode()
+ self.console.write_event(' ')
+ self.console.write_event(string)
+
+ p = time.strftime(self.prefix)
+
+ self.console.write_event(p + s)
+ self.previous_time = current_time
+
+ def on_plugin_enabled_event(self, name):
+ self.write('PluginEnabled: {!info!}%s' % name)
+
+ def on_plugin_disabled_event(self, name):
+ self.write('PluginDisabled: {!info!}%s' % name)
diff --git a/deluge/ui/console/modes/__init__.py b/deluge/ui/console/modes/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deluge/ui/console/modes/__init__.py
diff --git a/deluge/ui/console/modes/add_util.py b/deluge/ui/console/modes/add_util.py
new file mode 100644
index 0000000..88a24d0
--- /dev/null
+++ b/deluge/ui/console/modes/add_util.py
@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import glob
+import logging
+import os
+from base64 import b64encode
+
+from six import unichr as chr
+
+import deluge.common
+from deluge.ui.client import client
+from deluge.ui.common import TorrentInfo
+
+log = logging.getLogger(__name__)
+
+
+def _bracket_fixup(path):
+ if path.find('[') == -1 and path.find(']') == -1:
+ return path
+ sentinal = 256
+ while path.find(chr(sentinal)) != -1:
+ sentinal += 1
+ if sentinal > 65535:
+ log.error(
+ 'Cannot fix brackets in path, path contains all possible sentinal characters'
+ )
+ return path
+ newpath = path.replace(']', chr(sentinal))
+ newpath = newpath.replace('[', '[[]')
+ newpath = newpath.replace(chr(sentinal), '[]]')
+ return newpath
+
+
+def add_torrent(t_file, options, success_cb, fail_cb, ress):
+ t_options = {}
+ if options['path']:
+ t_options['download_location'] = os.path.expanduser(options['path'])
+ t_options['add_paused'] = options['add_paused']
+
+ is_url = (options['path_type'] != 1) and (
+ deluge.common.is_url(t_file) or options['path_type'] == 2
+ )
+ is_magnet = (
+ not (is_url) and (options['path_type'] != 1) and deluge.common.is_magnet(t_file)
+ )
+
+ if is_url or is_magnet:
+ files = [t_file]
+ else:
+ files = glob.glob(_bracket_fixup(t_file))
+ num_files = len(files)
+ ress['total'] = num_files
+
+ if num_files <= 0:
+ fail_cb('Does not exist', t_file, ress)
+
+ for f in files:
+ if is_url:
+ client.core.add_torrent_url(f, t_options).addCallback(
+ success_cb, f, ress
+ ).addErrback(fail_cb, f, ress)
+ elif is_magnet:
+ client.core.add_torrent_magnet(f, t_options).addCallback(
+ success_cb, f, ress
+ ).addErrback(fail_cb, f, ress)
+ else:
+ if not os.path.exists(f):
+ fail_cb('Does not exist', f, ress)
+ continue
+ if not os.path.isfile(f):
+ fail_cb('Is a directory', f, ress)
+ continue
+
+ try:
+ TorrentInfo(f)
+ except Exception as ex:
+ fail_cb(ex.message, f, ress)
+ continue
+
+ filename = os.path.split(f)[-1]
+ with open(f, 'rb') as _file:
+ filedump = b64encode(_file.read())
+
+ client.core.add_torrent_file_async(
+ filename, filedump, t_options
+ ).addCallback(success_cb, f, ress).addErrback(fail_cb, f, ress)
diff --git a/deluge/ui/console/modes/addtorrents.py b/deluge/ui/console/modes/addtorrents.py
new file mode 100644
index 0000000..6b2c105
--- /dev/null
+++ b/deluge/ui/console/modes/addtorrents.py
@@ -0,0 +1,545 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 Arek Stefański <asmageddon@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+from base64 import b64encode
+
+import deluge.common
+import deluge.component as component
+from deluge.decorators import overrides
+from deluge.ui.client import client
+from deluge.ui.console.modes.basemode import BaseMode
+from deluge.ui.console.modes.torrentlist.add_torrents_popup import report_add_status
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.utils import format_utils
+from deluge.ui.console.widgets.popup import InputPopup, MessagePopup
+
+try:
+ from future_builtins import zip
+except ImportError:
+ # Ignore on Py3.
+ pass
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+
+# Big help string that gets displayed when the user hits 'h'
+HELP_STR = """\
+This screen allows you to browse and add torrent files located on your \
+hard disk. Currently selected file is highlighted with a white background.
+You can change the selected file using the up/down arrows or the \
+PgUp/PgDown keys. Home and End keys go to the first and last file \
+in current directory respectively.
+
+Select files with the 'm' key. Use 'M' for multi-selection. Press \
+enter key to add them to session.
+
+{!info!}'h'{!normal!} - Show this help
+
+{!info!}'<'{!normal!} and {!info!}'>'{!normal!} - Change sort column and/or order
+
+{!info!}'m'{!normal!} - Mark or unmark currently highlighted file
+{!info!}'M'{!normal!} - Mark all files between current file and last selection.
+{!info!}'c'{!normal!} - Clear selection.
+
+{!info!}Left Arrow{!normal!} - Go up in directory hierarchy.
+{!info!}Right Arrow{!normal!} - Enter currently highlighted folder.
+
+{!info!}Enter{!normal!} - Enter currently highlighted folder or add torrents \
+if a file is highlighted
+
+{!info!}'q'{!normal!} - Go back to torrent overview
+"""
+
+
+class AddTorrents(BaseMode):
+ def __init__(self, parent_mode, stdscr, console_config, encoding=None):
+ self.console_config = console_config
+ self.parent_mode = parent_mode
+ self.popup = None
+ self.view_offset = 0
+ self.cursel = 0
+ self.marked = set()
+ self.last_mark = -1
+
+ path = os.path.expanduser(self.console_config['addtorrents']['last_path'])
+
+ self.path_stack = ['/'] + path.strip('/').split('/')
+ self.path_stack_pos = len(self.path_stack)
+ self.listing_files = []
+ self.listing_dirs = []
+
+ self.raw_rows = []
+ self.raw_rows_files = []
+ self.raw_rows_dirs = []
+ self.formatted_rows = []
+
+ self.sort_column = self.console_config['addtorrents']['sort_column']
+ self.reverse_sort = self.console_config['addtorrents']['reverse_sort']
+
+ BaseMode.__init__(self, stdscr, encoding)
+
+ self._listing_space = self.rows - 5
+ self.__refresh_listing()
+
+ util.safe_curs_set(util.Curser.INVISIBLE)
+ self.stdscr.notimeout(0)
+
+ @overrides(component.Component)
+ def start(self):
+ pass
+
+ @overrides(component.Component)
+ def update(self):
+ pass
+
+ def __refresh_listing(self):
+ path = os.path.join(*self.path_stack[: self.path_stack_pos])
+
+ listing = os.listdir(path)
+
+ self.listing_files = []
+ self.listing_dirs = []
+
+ self.raw_rows = []
+ self.raw_rows_files = []
+ self.raw_rows_dirs = []
+ self.formatted_rows = []
+
+ for f in listing:
+ if os.path.isdir(os.path.join(path, f)):
+ if self.console_config['addtorrents']['show_hidden_folders']:
+ self.listing_dirs.append(f)
+ elif f[0] != '.':
+ self.listing_dirs.append(f)
+ elif os.path.isfile(os.path.join(path, f)):
+ if self.console_config['addtorrents']['show_misc_files']:
+ self.listing_files.append(f)
+ elif f.endswith('.torrent'):
+ self.listing_files.append(f)
+
+ for dirname in self.listing_dirs:
+ row = []
+ full_path = os.path.join(path, dirname)
+ try:
+ size = len(os.listdir(full_path))
+ except OSError:
+ size = -1
+ time = os.stat(full_path).st_mtime
+
+ row = [dirname, size, time, full_path, 1]
+
+ self.raw_rows.append(row)
+ self.raw_rows_dirs.append(row)
+
+ # Highlight the directory we came from
+ if self.path_stack_pos < len(self.path_stack):
+ selected = self.path_stack[self.path_stack_pos]
+ ld = sorted(self.listing_dirs, key=lambda n: n.lower())
+ c = ld.index(selected)
+ self.cursel = c
+
+ if (self.view_offset + self._listing_space) <= self.cursel:
+ self.view_offset = self.cursel - self._listing_space
+
+ for filename in self.listing_files:
+ row = []
+ full_path = os.path.join(path, filename)
+ size = os.stat(full_path).st_size
+ time = os.stat(full_path).st_mtime
+
+ row = [filename, size, time, full_path, 0]
+
+ self.raw_rows.append(row)
+ self.raw_rows_files.append(row)
+
+ self.__sort_rows()
+
+ def __sort_rows(self):
+ self.console_config['addtorrents']['sort_column'] = self.sort_column
+ self.console_config['addtorrents']['reverse_sort'] = self.reverse_sort
+ self.console_config.save()
+
+ self.raw_rows_dirs.sort(key=lambda r: r[0].lower())
+
+ if self.sort_column == 'name':
+ self.raw_rows_files.sort(
+ key=lambda r: r[0].lower(), reverse=self.reverse_sort
+ )
+ elif self.sort_column == 'date':
+ self.raw_rows_files.sort(key=lambda r: r[2], reverse=self.reverse_sort)
+ self.raw_rows = self.raw_rows_dirs + self.raw_rows_files
+ self.__refresh_rows()
+
+ def __refresh_rows(self):
+ self.formatted_rows = []
+
+ for row in self.raw_rows:
+ filename = deluge.common.decode_bytes(row[0])
+ size = row[1]
+ time = row[2]
+
+ if row[4]:
+ if size != -1:
+ size_str = '%i items' % size
+ else:
+ size_str = ' unknown'
+
+ cols = [filename, size_str, deluge.common.fdate(time)]
+ widths = [self.cols - 35, 12, 23]
+ self.formatted_rows.append(format_utils.format_row(cols, widths))
+ else:
+ # Size of .torrent file itself couldn't matter less so we'll leave it out
+ cols = [filename, deluge.common.fdate(time)]
+ widths = [self.cols - 23, 23]
+ self.formatted_rows.append(format_utils.format_row(cols, widths))
+
+ def scroll_list_up(self, distance):
+ self.cursel -= distance
+ if self.cursel < 0:
+ self.cursel = 0
+
+ if self.cursel < self.view_offset + 1:
+ self.view_offset = max(self.cursel - 1, 0)
+
+ def scroll_list_down(self, distance):
+ self.cursel += distance
+ if self.cursel >= len(self.formatted_rows):
+ self.cursel = len(self.formatted_rows) - 1
+
+ if (self.view_offset + self._listing_space) <= self.cursel + 1:
+ self.view_offset = self.cursel - self._listing_space + 1
+
+ def set_popup(self, pu):
+ self.popup = pu
+ self.refresh()
+
+ @overrides(BaseMode)
+ def on_resize(self, rows, cols):
+ BaseMode.on_resize(self, rows, cols)
+ if self.popup:
+ self.popup.handle_resize()
+ self._listing_space = self.rows - 5
+ self.refresh()
+
+ def refresh(self, lines=None):
+ if self.mode_paused():
+ return
+
+ # Update the status bars
+ self.stdscr.erase()
+ self.draw_statusbars()
+
+ off = 1
+
+ # Render breadcrumbs
+ s = 'Location: '
+ for i, e in enumerate(self.path_stack):
+ if e == '/':
+ if i == self.path_stack_pos - 1:
+ s += '{!black,red,bold!}root'
+ else:
+ s += '{!red,black,bold!}root'
+ else:
+ if i == self.path_stack_pos - 1:
+ s += '{!black,white,bold!}%s' % e
+ else:
+ s += '{!white,black,bold!}%s' % e
+
+ if e != len(self.path_stack) - 1:
+ s += '{!white,black!}/'
+
+ self.add_string(off, s)
+ off += 1
+
+ # Render header
+ cols = ['Name', 'Contents', 'Modification time']
+ widths = [self.cols - 35, 12, 23]
+ s = ''
+ for i, (c, w) in enumerate(zip(cols, widths)):
+ cn = ''
+ if i == 0:
+ cn = 'name'
+ elif i == 2:
+ cn = 'date'
+
+ if cn == self.sort_column:
+ s += '{!black,green,bold!}' + c.ljust(w - 2)
+ if self.reverse_sort:
+ s += '^ '
+ else:
+ s += 'v '
+ else:
+ s += '{!green,black,bold!}' + c.ljust(w)
+ self.add_string(off, s)
+ off += 1
+
+ # Render files and folders
+ for i, row in enumerate(self.formatted_rows[self.view_offset :]):
+ i += self.view_offset
+ # It's a folder
+ color_string = ''
+ if self.raw_rows[i][4]:
+ if self.raw_rows[i][1] == -1:
+ if i == self.cursel:
+ color_string = '{!black,red,bold!}'
+ else:
+ color_string = '{!red,black!}'
+ else:
+ if i == self.cursel:
+ color_string = '{!black,cyan,bold!}'
+ else:
+ color_string = '{!cyan,black!}'
+
+ elif i == self.cursel:
+ if self.raw_rows[i][0] in self.marked:
+ color_string = '{!blue,white,bold!}'
+ else:
+ color_string = '{!black,white,bold!}'
+ elif self.raw_rows[i][0] in self.marked:
+ color_string = '{!white,blue,bold!}'
+
+ self.add_string(off, color_string + row)
+ off += 1
+
+ if off > self.rows - 2:
+ break
+
+ if not component.get('ConsoleUI').is_active_mode(self):
+ return
+
+ self.stdscr.noutrefresh()
+
+ if self.popup:
+ self.popup.refresh()
+
+ curses.doupdate()
+
+ def back_to_overview(self):
+ self.parent_mode.go_top = False
+ component.get('ConsoleUI').set_mode(self.parent_mode.mode_name)
+
+ def _perform_action(self):
+ if self.cursel < len(self.listing_dirs):
+ self._enter_dir()
+ else:
+ s = self.raw_rows[self.cursel][0]
+ if s not in self.marked:
+ self.last_mark = self.cursel
+ self.marked.add(s)
+ self._show_add_dialog()
+
+ def _enter_dir(self):
+ # Enter currently selected directory
+ dirname = self.raw_rows[self.cursel][0]
+ new_dir = self.path_stack_pos >= len(self.path_stack)
+ new_dir = new_dir or (dirname != self.path_stack[self.path_stack_pos])
+ if new_dir:
+ self.path_stack = self.path_stack[: self.path_stack_pos]
+ self.path_stack.append(dirname)
+
+ path = os.path.join(*self.path_stack[: self.path_stack_pos + 1])
+
+ if not os.access(path, os.R_OK):
+ self.path_stack = self.path_stack[: self.path_stack_pos]
+ self.popup = MessagePopup(
+ self, 'Error', '{!error!}Access denied: %s' % path
+ )
+ self.__refresh_listing()
+ return
+
+ self.path_stack_pos += 1
+
+ self.view_offset = 0
+ self.cursel = 0
+ self.last_mark = -1
+ self.marked = set()
+
+ self.__refresh_listing()
+
+ def _show_add_dialog(self):
+ def _do_add(result, **kwargs):
+ ress = {'succ': 0, 'fail': 0, 'total': len(self.marked), 'fmsg': []}
+
+ def fail_cb(msg, t_file, ress):
+ log.debug('failed to add torrent: %s: %s', t_file, msg)
+ ress['fail'] += 1
+ ress['fmsg'].append('{!input!} * %s: {!error!}%s' % (t_file, msg))
+ if (ress['succ'] + ress['fail']) >= ress['total']:
+ report_add_status(
+ component.get('TorrentList'),
+ ress['succ'],
+ ress['fail'],
+ ress['fmsg'],
+ )
+
+ def success_cb(tid, t_file, ress):
+ if tid:
+ log.debug('added torrent: %s (%s)', t_file, tid)
+ ress['succ'] += 1
+ if (ress['succ'] + ress['fail']) >= ress['total']:
+ report_add_status(
+ component.get('TorrentList'),
+ ress['succ'],
+ ress['fail'],
+ ress['fmsg'],
+ )
+ else:
+ fail_cb('Already in session (probably)', t_file, ress)
+
+ for m in self.marked:
+ filename = m
+ directory = os.path.join(*self.path_stack[: self.path_stack_pos])
+ path = os.path.join(directory, filename)
+ with open(path, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ t_options = {}
+ if result['location']['value']:
+ t_options['download_location'] = result['location']['value']
+ t_options['add_paused'] = result['add_paused']['value']
+
+ d = client.core.add_torrent_file_async(filename, filedump, t_options)
+ d.addCallback(success_cb, filename, ress)
+ d.addErrback(fail_cb, filename, ress)
+
+ self.console_config['addtorrents']['last_path'] = os.path.join(
+ *self.path_stack[: self.path_stack_pos]
+ )
+ self.console_config.save()
+
+ self.back_to_overview()
+
+ config = component.get('ConsoleUI').coreconfig
+ if config['add_paused']:
+ ap = 0
+ else:
+ ap = 1
+ self.popup = InputPopup(
+ self, 'Add Torrents (Esc to cancel)', close_cb=_do_add, height_req=17
+ )
+
+ msg = 'Adding torrent files:'
+ for i, m in enumerate(self.marked):
+ name = m
+ msg += '\n * {!input!}%s' % name
+ if i == 5:
+ if i < len(self.marked):
+ msg += '\n {!red!}And %i more' % (len(self.marked) - 5)
+ break
+ self.popup.add_text(msg)
+ self.popup.add_spaces(1)
+
+ self.popup.add_text_input(
+ 'location', 'Download Folder:', config['download_location'], complete=True
+ )
+ self.popup.add_select_input(
+ 'add_paused', 'Add Paused:', ['Yes', 'No'], [True, False], ap
+ )
+
+ def _go_up(self):
+ # Go up in directory hierarchy
+ if self.path_stack_pos > 1:
+ self.path_stack_pos -= 1
+
+ self.view_offset = 0
+ self.cursel = 0
+ self.last_mark = -1
+ self.marked = set()
+
+ self.__refresh_listing()
+
+ def read_input(self):
+ c = self.stdscr.getch()
+
+ if self.popup:
+ if self.popup.handle_read(c):
+ self.popup = None
+ self.refresh()
+ return
+
+ if util.is_printable_chr(c):
+ if chr(c) == 'Q':
+ component.get('ConsoleUI').quit()
+ elif chr(c) == 'q':
+ self.back_to_overview()
+ return
+
+ # Navigate the torrent list
+ if c == curses.KEY_UP:
+ self.scroll_list_up(1)
+ elif c == curses.KEY_PPAGE:
+ self.scroll_list_up(self.rows // 2)
+ elif c == curses.KEY_HOME:
+ self.scroll_list_up(len(self.formatted_rows))
+ elif c == curses.KEY_DOWN:
+ self.scroll_list_down(1)
+ elif c == curses.KEY_NPAGE:
+ self.scroll_list_down(self.rows // 2)
+ elif c == curses.KEY_END:
+ self.scroll_list_down(len(self.formatted_rows))
+ elif c == curses.KEY_RIGHT:
+ if self.cursel < len(self.listing_dirs):
+ self._enter_dir()
+ elif c == curses.KEY_LEFT:
+ self._go_up()
+ elif c in [curses.KEY_ENTER, util.KEY_ENTER2]:
+ self._perform_action()
+ elif c == util.KEY_ESC:
+ self.back_to_overview()
+ else:
+ if util.is_printable_chr(c):
+ if chr(c) == 'h':
+ self.popup = MessagePopup(self, 'Help', HELP_STR, width_req=0.75)
+ elif chr(c) == '>':
+ if self.sort_column == 'date':
+ self.reverse_sort = not self.reverse_sort
+ else:
+ self.sort_column = 'date'
+ self.reverse_sort = True
+ self.__sort_rows()
+ elif chr(c) == '<':
+ if self.sort_column == 'name':
+ self.reverse_sort = not self.reverse_sort
+ else:
+ self.sort_column = 'name'
+ self.reverse_sort = False
+ self.__sort_rows()
+ elif chr(c) == 'm':
+ s = self.raw_rows[self.cursel][0]
+ if s in self.marked:
+ self.marked.remove(s)
+ else:
+ self.marked.add(s)
+
+ self.last_mark = self.cursel
+ elif chr(c) == 'j':
+ self.scroll_list_up(1)
+ elif chr(c) == 'k':
+ self.scroll_list_down(1)
+ elif chr(c) == 'M':
+ if self.last_mark != -1:
+ if self.last_mark > self.cursel:
+ m = list(range(self.cursel, self.last_mark))
+ else:
+ m = list(range(self.last_mark, self.cursel + 1))
+
+ for i in m:
+ s = self.raw_rows[i][0]
+ self.marked.add(s)
+ elif chr(c) == 'c':
+ self.marked.clear()
+
+ self.refresh()
diff --git a/deluge/ui/console/modes/basemode.py b/deluge/ui/console/modes/basemode.py
new file mode 100644
index 0000000..dd3681f
--- /dev/null
+++ b/deluge/ui/console/modes/basemode.py
@@ -0,0 +1,357 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import sys
+
+import deluge.component as component
+import deluge.ui.console.utils.colors as colors
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.utils.format_utils import remove_formatting
+
+try:
+ import curses
+ import curses.panel
+except ImportError:
+ pass
+
+try:
+ import signal
+ from fcntl import ioctl
+ import termios
+ import struct
+except ImportError:
+ pass
+
+
+log = logging.getLogger(__name__)
+
+
+class InputKeyHandler(object):
+ def __init__(self):
+ self._input_result = None
+
+ def set_input_result(self, result):
+ self._input_result = result
+
+ def get_input_result(self):
+ result = self._input_result
+ self._input_result = None
+ return result
+
+ def handle_read(self, c):
+ """Handle a character read from curses screen
+
+ Returns:
+ int: One of the constants defined in util.curses_util.ReadState.
+ ReadState.IGNORED: The key was not handled. Further processing should continue.
+ ReadState.READ: The key was read and processed. Do no further processing
+ ReadState.CHANGED: The key was read and processed. Internal state was changed
+ leaving data to be read by the caller.
+
+ """
+ return util.ReadState.IGNORED
+
+
+class TermResizeHandler(object):
+ def __init__(self):
+ try:
+ signal.signal(signal.SIGWINCH, self.on_terminal_size)
+ except ValueError as ex:
+ log.debug('Unable to catch SIGWINCH signal: %s', ex)
+
+ def on_terminal_size(self, *args):
+ # Get the new rows and cols value
+ rows, cols = struct.unpack('hhhh', ioctl(0, termios.TIOCGWINSZ, b'\000' * 8))[
+ 0:2
+ ]
+ curses.resizeterm(rows, cols)
+ return rows, cols
+
+
+class CursesStdIO(object):
+ """
+ fake fd to be registered as a reader with the twisted reactor.
+ Curses classes needing input should extend this
+ """
+
+ def fileno(self):
+ """ We want to select on FD 0 """
+ return 0
+
+ def doRead(self): # NOQA: N802
+ """called when input is ready"""
+ pass
+
+ def logPrefix(self): # NOQA: N802
+ return 'CursesClient'
+
+
+class BaseMode(CursesStdIO, component.Component):
+ def __init__(
+ self, stdscr, encoding=None, do_refresh=True, mode_name=None, depend=None
+ ):
+ """
+ A mode that provides a curses screen designed to run as a reader in a twisted reactor.
+ This mode doesn't do much, just shows status bars and "Base Mode" on the screen
+
+ Modes should subclass this and provide overrides for:
+
+ do_read(self) - Handle user input
+ refresh(self) - draw the mode to the screen
+ add_string(self, row, string) - add a string of text to be displayed.
+ see method for detailed info
+
+ The init method of a subclass *must* call BaseMode.__init__
+
+ Useful fields after calling BaseMode.__init__:
+ self.stdscr - the curses screen
+ self.rows - # of rows on the curses screen
+ self.cols - # of cols on the curses screen
+ self.topbar - top statusbar
+ self.bottombar - bottom statusbar
+ """
+ self.mode_name = mode_name if mode_name else self.__class__.__name__
+ component.Component.__init__(self, self.mode_name, 1, depend=depend)
+ self.stdscr = stdscr
+ # Make the input calls non-blocking
+ self.stdscr.nodelay(1)
+
+ self.paused = False
+ # Strings for the 2 status bars
+ self.statusbars = component.get('StatusBars')
+ self.help_hstr = '{!status!} Press {!magenta,blue,bold!}[h]{!status!} for help'
+
+ # Keep track of the screen size
+ self.rows, self.cols = self.stdscr.getmaxyx()
+
+ if not encoding:
+ self.encoding = sys.getdefaultencoding()
+ else:
+ self.encoding = encoding
+
+ # Do a refresh right away to draw the screen
+ if do_refresh:
+ self.refresh()
+
+ def on_resize(self, rows, cols):
+ self.rows, self.cols = rows, cols
+
+ def connectionLost(self, reason): # NOQA: N802
+ self.close()
+
+ def add_string(self, row, string, scr=None, **kwargs):
+ if scr:
+ screen = scr
+ else:
+ screen = self.stdscr
+
+ return add_string(row, string, screen, self.encoding, **kwargs)
+
+ def draw_statusbars(
+ self,
+ top_row=0,
+ bottom_row=-1,
+ topbar=None,
+ bottombar=None,
+ bottombar_help=True,
+ scr=None,
+ ):
+ self.add_string(top_row, topbar if topbar else self.statusbars.topbar, scr=scr)
+ bottombar = bottombar if bottombar else self.statusbars.bottombar
+ if bottombar_help:
+ if bottombar_help is True:
+ bottombar_help = self.help_hstr
+ bottombar += (
+ ' '
+ * (
+ self.cols
+ - len(remove_formatting(bottombar))
+ - len(remove_formatting(bottombar_help))
+ )
+ + bottombar_help
+ )
+ self.add_string(self.rows + bottom_row, bottombar, scr=scr)
+
+ # This mode doesn't do anything with popups
+ def set_popup(self, popup):
+ pass
+
+ def pause(self):
+ self.paused = True
+
+ def mode_paused(self):
+ return self.paused
+
+ def resume(self):
+ self.paused = False
+ self.refresh()
+
+ def refresh(self):
+ """
+ Refreshes the screen.
+ Updates the lines based on the`:attr:lines` based on the `:attr:display_lines_offset`
+ attribute and the status bars.
+ """
+ self.stdscr.erase()
+ self.draw_statusbars()
+ # Update the status bars
+
+ self.add_string(1, '{!info!}Base Mode (or subclass has not overridden refresh)')
+
+ self.stdscr.redrawwin()
+ self.stdscr.refresh()
+
+ def doRead(self): # NOQA: N802
+ """
+ Called when there is data to be read, ie, input from the keyboard.
+ """
+ # We wrap this function to catch exceptions and shutdown the mainloop
+ try:
+ self.read_input()
+ except Exception as ex: # pylint: disable=broad-except
+ log.exception(ex)
+
+ def read_input(self):
+ # Read the character
+ self.stdscr.getch()
+ self.stdscr.refresh()
+
+ def close(self):
+ """
+ Clean up the curses stuff on exit.
+ """
+ curses.nocbreak()
+ self.stdscr.keypad(0)
+ curses.echo()
+ curses.endwin()
+
+
+def add_string(
+ row, fstring, screen, encoding, col=0, pad=True, pad_char=' ', trim='..', leaveok=0
+):
+ """
+ Adds a string to the desired `:param:row`.
+
+ Args:
+ row(int): the row number to write the string
+ row(int): the row number to write the string
+ fstring(str): the (formatted) string of text to add
+ scr(curses.window): optional window to add string to instead of self.stdscr
+ col(int): optional starting column offset
+ pad(bool): optional bool if the string should be padded out to the width of the screen
+ trim(bool): optional bool if the string should be trimmed if it is too wide for the screen
+
+ The text can be formatted with color using the following format:
+
+ "{!fg, bg, attributes, ...!}"
+
+ See: http://docs.python.org/library/curses.html#constants for attributes.
+
+ Alternatively, it can use some built-in scheme for coloring.
+ See colors.py for built-in schemes.
+
+ "{!scheme!}"
+
+ Examples:
+
+ "{!blue, black, bold!}My Text is {!white, black!}cool"
+ "{!info!}I am some info text!"
+ "{!error!}Uh oh!"
+
+ Returns:
+ int: the next row
+
+ """
+ try:
+ parsed = colors.parse_color_string(fstring)
+ except colors.BadColorString as ex:
+ log.error('Cannot add bad color string %s: %s', fstring, ex)
+ return
+
+ if leaveok:
+ screen.leaveok(leaveok)
+
+ max_y, max_x = screen.getmaxyx()
+ for index, (color, string) in enumerate(parsed):
+ # Skip printing chars beyond max_x
+ if col >= max_x:
+ break
+
+ if index + 1 == len(parsed) and pad:
+ # This is the last string so lets append some padding to it
+ string += pad_char * (max_x - (col + len(string)))
+
+ if col + len(string) > max_x:
+ remaining_chrs = max(0, max_x - col)
+ if trim:
+ string = string[0 : max(0, remaining_chrs - len(trim))] + trim
+ else:
+ string = string[0:remaining_chrs]
+
+ try:
+ screen.addstr(row, col, string.encode(encoding), color)
+ except curses.error:
+ # Ignore exception for writing offscreen.
+ pass
+
+ col += len(string)
+
+ if leaveok:
+ screen.leaveok(0)
+
+ return row + 1
+
+
+def mkpanel(color, rows, cols, tly, tlx):
+ win = curses.newwin(rows, cols, tly, tlx)
+ pan = curses.panel.new_panel(win)
+ if curses.has_colors():
+ win.bkgdset(ord(' '), curses.color_pair(color))
+ else:
+ win.bkgdset(ord(' '), curses.A_BOLD)
+ return pan
+
+
+def mkwin(color, rows, cols, tly, tlx):
+ win = curses.newwin(rows, cols, tly, tlx)
+ if curses.has_colors():
+ win.bkgdset(ord(' '), curses.color_pair(color))
+ else:
+ win.bkgdset(ord(' '), curses.A_BOLD)
+ return win
+
+
+def mkpad(color, rows, cols):
+ win = curses.newpad(rows, cols)
+ if curses.has_colors():
+ win.bkgdset(ord(' '), curses.color_pair(color))
+ else:
+ win.bkgdset(ord(' '), curses.A_BOLD)
+ return win
+
+
+def move_cursor(screen, row, col):
+ try:
+ screen.move(row, col)
+ except curses.error as ex:
+ import traceback
+
+ log.warning(
+ 'Error on screen.move(%s, %s): (curses.LINES: %s, curses.COLS: %s) Error: %s\nStack: %s',
+ row,
+ col,
+ curses.LINES,
+ curses.COLS,
+ ex,
+ ''.join(traceback.format_stack()),
+ )
diff --git a/deluge/ui/console/modes/cmdline.py b/deluge/ui/console/modes/cmdline.py
new file mode 100644
index 0000000..2735168
--- /dev/null
+++ b/deluge/ui/console/modes/cmdline.py
@@ -0,0 +1,850 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+import re
+from io import open
+
+import deluge.component as component
+import deluge.configmanager
+from deluge.common import PY2
+from deluge.decorators import overrides
+from deluge.ui.console.cmdline.command import Commander
+from deluge.ui.console.modes.basemode import BaseMode, move_cursor
+from deluge.ui.console.utils import colors
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.utils.format_utils import (
+ delete_alt_backspace,
+ remove_formatting,
+ strwidth,
+)
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+LINES_BUFFER_SIZE = 5000
+INPUT_HISTORY_SIZE = 500
+MAX_HISTFILE_SIZE = 2000
+
+
+def complete_line(line, possible_matches):
+ """Find the common prefix of possible matches.
+
+ Proritizing matching-case elements.
+ """
+
+ if not possible_matches:
+ return line
+
+ line = line.replace(r'\ ', ' ')
+
+ matches1 = []
+ matches2 = []
+
+ for match in possible_matches:
+ match = remove_formatting(match)
+ match = match.replace(r'\ ', ' ')
+ m1, m2 = '', ''
+ for i, c in enumerate(line):
+ if m1 and m2:
+ break
+ if not m1 and c != line[i]:
+ m1 = line[:i]
+ if not m2 and c.lower() != line[i].lower():
+ m2 = line[:i]
+ if not m1:
+ matches1.append(match)
+ elif not m2:
+ matches2.append(match)
+
+ possible_matches = matches1 + matches2
+
+ maxlen = 9001
+
+ for match in possible_matches[1:]:
+ for i, c in enumerate(match):
+ try:
+ if c.lower() != possible_matches[0][i].lower():
+ maxlen = min(maxlen, i)
+ break
+ except IndexError:
+ maxlen = min(maxlen, i)
+ break
+
+ return possible_matches[0][:maxlen].replace(' ', r'\ ')
+
+
+def commonprefix(m):
+ """Returns the longest common leading component from list of pathnames."""
+ if not m:
+ return ''
+ s1 = min(m)
+ s2 = max(m)
+ for i, c in enumerate(s1):
+ if c != s2[i]:
+ return s1[:i]
+ return s2
+
+
+class CmdLine(BaseMode, Commander):
+ def __init__(self, stdscr, encoding=None):
+ # Get a handle to the main console
+ self.console = component.get('ConsoleUI')
+ Commander.__init__(self, self.console._commands, interactive=True)
+
+ self.batch_write = False
+
+ # A list of strings to be displayed based on the offset (scroll)
+ self.lines = []
+ # The offset to display lines
+ self.display_lines_offset = 0
+
+ # Holds the user input and is cleared on 'enter'
+ self.input = ''
+ self.input_incomplete = ''
+
+ # Keep track of where the cursor is
+ self.input_cursor = 0
+ # Keep a history of inputs
+ self.input_history = []
+ self.input_history_index = 0
+
+ # Keep track of double- and multi-tabs
+ self.tab_count = 0
+
+ self.console_config = component.get('TorrentList').config
+
+ # To avoid having to truncate the file every time we're writing
+ # or doing it on exit(and therefore relying on an error-less
+ # or in other words clean exit, we're going to have two files
+ # that we swap around based on length
+ config_dir = deluge.configmanager.get_config_dir()
+ self.history_file = [
+ os.path.join(config_dir, 'cmd_line.hist1'),
+ os.path.join(config_dir, 'cmd_line.hist2'),
+ ]
+ self._hf_lines = [0, 0]
+ if self.console_config['cmdline']['save_command_history']:
+ try:
+ with open(self.history_file[0], 'r', encoding='utf8') as _file:
+ lines1 = _file.read().splitlines()
+ self._hf_lines[0] = len(lines1)
+ except IOError:
+ lines1 = []
+ self._hf_lines[0] = 0
+
+ try:
+ with open(self.history_file[1], 'r', encoding='utf8') as _file:
+ lines2 = _file.read().splitlines()
+ self._hf_lines[1] = len(lines2)
+ except IOError:
+ lines2 = []
+ self._hf_lines[1] = 0
+
+ # The non-full file is the active one
+ if self._hf_lines[0] > self._hf_lines[1]:
+ self.lines = lines1 + lines2
+ else:
+ self.lines = lines2 + lines1
+
+ if len(self.lines) > MAX_HISTFILE_SIZE:
+ self.lines = self.lines[-MAX_HISTFILE_SIZE:]
+
+ # Instead of having additional input history file, we can
+ # simply scan for lines beginning with ">>> "
+ for i, line in enumerate(self.lines):
+ line = remove_formatting(line)
+ if line.startswith('>>> '):
+ console_input = line[4:]
+ if self.console_config['cmdline']['ignore_duplicate_lines']:
+ if len(self.input_history) > 0:
+ if self.input_history[-1] != console_input:
+ self.input_history.append(console_input)
+ else:
+ self.input_history.append(console_input)
+
+ self.input_history_index = len(self.input_history)
+
+ # show the cursor
+ util.safe_curs_set(util.Curser.VERY_VISIBLE)
+ BaseMode.__init__(self, stdscr, encoding, depend=['SessionProxy'])
+
+ @overrides(component.Component)
+ def update(self):
+ if not component.get('ConsoleUI').is_active_mode(self):
+ return
+ # Update just the status bars
+ self.draw_statusbars(bottom_row=-2, bottombar_help=False)
+ move_cursor(self.stdscr, self.rows - 1, min(self.input_cursor, curses.COLS - 1))
+ self.stdscr.refresh()
+
+ @overrides(BaseMode)
+ def pause(self):
+ self.stdscr.leaveok(0)
+
+ @overrides(BaseMode)
+ def resume(self):
+ util.safe_curs_set(util.Curser.VERY_VISIBLE)
+
+ @overrides(BaseMode)
+ def read_input(self):
+ # Read the character
+ c = self.stdscr.getch()
+
+ # Either ESC or ALT+<some key>
+ if c == util.KEY_ESC:
+ n = self.stdscr.getch()
+ if n == -1:
+ # Escape key
+ return
+ c = [c, n]
+
+ # We remove the tab count if the key wasn't a tab
+ if c != util.KEY_TAB:
+ self.tab_count = 0
+
+ # We clear the input string and send it to the command parser on ENTER
+ if c in [curses.KEY_ENTER, util.KEY_ENTER2]:
+ if self.input:
+ if self.input.endswith('\\'):
+ self.input = self.input[:-1]
+ self.input_cursor -= 1
+ self.add_line('{!yellow,black,bold!}>>>{!input!} %s' % self.input)
+ self.do_command(self.input)
+ if len(self.input_history) == INPUT_HISTORY_SIZE:
+ # Remove the oldest input history if the max history size
+ # is reached.
+ del self.input_history[0]
+ if self.console_config['cmdline']['ignore_duplicate_lines']:
+ if len(self.input_history) > 0:
+ if self.input_history[-1] != self.input:
+ self.input_history.append(self.input)
+ else:
+ self.input_history.append(self.input)
+ else:
+ self.input_history.append(self.input)
+ self.input_history_index = len(self.input_history)
+ self.input = ''
+ self.input_incomplete = ''
+ self.input_cursor = 0
+ self.stdscr.refresh()
+
+ # Run the tab completer function
+ elif c == util.KEY_TAB:
+ # Keep track of tab hit count to know when it's double-hit
+ self.tab_count += 1
+
+ if self.tab_completer:
+ # We only call the tab completer function if we're at the end of
+ # the input string on the cursor is on a space
+ if (
+ self.input_cursor == len(self.input)
+ or self.input[self.input_cursor] == ' '
+ ):
+ self.input, self.input_cursor = self.tab_completer(
+ self.input, self.input_cursor, self.tab_count
+ )
+
+ # We use the UP and DOWN keys to cycle through input history
+ elif c == curses.KEY_UP:
+ if self.input_history_index - 1 >= 0:
+ if self.input_history_index == len(self.input_history):
+ # We're moving from non-complete input so save it just incase
+ # we move back down to it.
+ self.input_incomplete = self.input
+ # Going back in the history
+ self.input_history_index -= 1
+ self.input = self.input_history[self.input_history_index]
+ self.input_cursor = len(self.input)
+ elif c == curses.KEY_DOWN:
+ if self.input_history_index + 1 < len(self.input_history):
+ # Going forward in the history
+ self.input_history_index += 1
+ self.input = self.input_history[self.input_history_index]
+ self.input_cursor = len(self.input)
+ elif self.input_history_index + 1 == len(self.input_history):
+ # We're moving back down to an incomplete input
+ self.input_history_index += 1
+ self.input = self.input_incomplete
+ self.input_cursor = len(self.input)
+
+ # Cursor movement
+ elif c == curses.KEY_LEFT:
+ if self.input_cursor:
+ self.input_cursor -= 1
+ elif c == curses.KEY_RIGHT:
+ if self.input_cursor < len(self.input):
+ self.input_cursor += 1
+ elif c == curses.KEY_HOME:
+ self.input_cursor = 0
+ elif c == curses.KEY_END:
+ self.input_cursor = len(self.input)
+
+ # Scrolling through buffer
+ elif c == curses.KEY_PPAGE:
+ self.display_lines_offset += self.rows - 3
+ # We substract 3 for the unavailable lines and 1 extra due to len(self.lines)
+ if self.display_lines_offset > (len(self.lines) - 4 - self.rows):
+ self.display_lines_offset = len(self.lines) - 4 - self.rows
+
+ self.refresh()
+ elif c == curses.KEY_NPAGE:
+ self.display_lines_offset -= self.rows - 3
+ if self.display_lines_offset < 0:
+ self.display_lines_offset = 0
+ self.refresh()
+
+ # Delete a character in the input string based on cursor position
+ elif c in [curses.KEY_BACKSPACE, util.KEY_BACKSPACE2]:
+ if self.input and self.input_cursor > 0:
+ self.input = (
+ self.input[: self.input_cursor - 1]
+ + self.input[self.input_cursor :]
+ )
+ self.input_cursor -= 1
+ # Delete a word when alt+backspace is pressed
+ elif c == [util.KEY_ESC, util.KEY_BACKSPACE2] or c == [
+ util.KEY_ESC,
+ curses.KEY_BACKSPACE,
+ ]:
+ self.input, self.input_cursor = delete_alt_backspace(
+ self.input, self.input_cursor
+ )
+ elif c == curses.KEY_DC:
+ if self.input and self.input_cursor < len(self.input):
+ self.input = (
+ self.input[: self.input_cursor]
+ + self.input[self.input_cursor + 1 :]
+ )
+
+ # A key to add to the input string
+ else:
+ if c > 31 and c < 256:
+ # Emulate getwch
+ stroke = chr(c)
+ uchar = '' if PY2 else stroke
+ while not uchar:
+ try:
+ uchar = stroke.decode(self.encoding)
+ except UnicodeDecodeError:
+ c = self.stdscr.getch()
+ stroke += chr(c)
+
+ if uchar:
+ if self.input_cursor == len(self.input):
+ self.input += uchar
+ else:
+ # Insert into string
+ self.input = (
+ self.input[: self.input_cursor]
+ + uchar
+ + self.input[self.input_cursor :]
+ )
+
+ # Move the cursor forward
+ self.input_cursor += 1
+
+ self.refresh()
+
+ @overrides(BaseMode)
+ def on_resize(self, rows, cols):
+ BaseMode.on_resize(self, rows, cols)
+ self.stdscr.erase()
+ self.refresh()
+
+ @overrides(BaseMode)
+ def refresh(self):
+ """
+ Refreshes the screen.
+ Updates the lines based on the`:attr:lines` based on the `:attr:display_lines_offset`
+ attribute and the status bars.
+ """
+ if not component.get('ConsoleUI').is_active_mode(self):
+ return
+ self.stdscr.erase()
+
+ # Update the status bars
+ self.add_string(0, self.statusbars.topbar)
+ self.add_string(self.rows - 2, self.statusbars.bottombar)
+
+ # The number of rows minus the status bars and the input line
+ available_lines = self.rows - 3
+ # If the amount of lines exceeds the number of rows, we need to figure out
+ # which ones to display based on the offset
+ if len(self.lines) > available_lines:
+ # Get the lines to display based on the offset
+ offset = len(self.lines) - self.display_lines_offset
+ lines = self.lines[-(available_lines - offset) : offset]
+ elif len(self.lines) == available_lines:
+ lines = self.lines
+ else:
+ lines = [''] * (available_lines - len(self.lines))
+ lines.extend(self.lines)
+
+ # Add the lines to the screen
+ for index, line in enumerate(lines):
+ self.add_string(index + 1, line)
+
+ # Add the input string
+ self.add_string(self.rows - 1, self.input, pad=False, trim=False)
+
+ move_cursor(self.stdscr, self.rows - 1, min(self.input_cursor, curses.COLS - 1))
+ self.stdscr.redrawwin()
+ self.stdscr.refresh()
+
+ def add_line(self, text, refresh=True):
+ """
+ Add a line to the screen. This will be showed between the two bars.
+ The text can be formatted with color using the following format:
+
+ "{!fg, bg, attributes, ...!}"
+
+ See: http://docs.python.org/library/curses.html#constants for attributes.
+
+ Alternatively, it can use some built-in scheme for coloring.
+ See colors.py for built-in schemes.
+
+ "{!scheme!}"
+
+ Examples:
+
+ "{!blue, black, bold!}My Text is {!white, black!}cool"
+ "{!info!}I am some info text!"
+ "{!error!}Uh oh!"
+
+ :param text: the text to show
+ :type text: string
+ :param refresh: if True, the screen will refresh after the line is added
+ :type refresh: bool
+
+ """
+
+ if self.console_config['cmdline']['save_command_history']:
+ # Determine which file is the active one
+ # If both are under maximum, it's first, otherwise it's the one not full
+ if (
+ self._hf_lines[0] < MAX_HISTFILE_SIZE
+ and self._hf_lines[1] < MAX_HISTFILE_SIZE
+ ):
+ active_file = 0
+ elif self._hf_lines[0] == MAX_HISTFILE_SIZE:
+ active_file = 1
+ else:
+ active_file = 0
+
+ # Write the line
+ with open(self.history_file[active_file], 'a', encoding='utf8') as _file:
+ _file.write(text + '\n')
+
+ # And increment line counter
+ self._hf_lines[active_file] += 1
+
+ # If the active file reaches max size, we truncate it
+ # therefore swapping the currently active file
+ if self._hf_lines[active_file] == MAX_HISTFILE_SIZE:
+ self._hf_lines[1 - active_file] = 0
+ with open(
+ self.history_file[1 - active_file], 'w', encoding='utf8'
+ ) as _file:
+ _file.truncate(0)
+
+ def get_line_chunks(line):
+ """
+ Returns a list of 2-tuples (color string, text)
+
+ """
+ if not line or line.count('{!') != line.count('!}'):
+ return []
+
+ chunks = []
+ if not line.startswith('{!'):
+ begin = line.find('{!')
+ if begin == -1:
+ begin = len(line)
+ chunks.append(('', line[:begin]))
+ line = line[begin:]
+
+ while line:
+ # We know the line starts with "{!" here
+ end_color = line.find('!}')
+ next_color = line.find('{!', end_color)
+ if next_color == -1:
+ next_color = len(line)
+ chunks.append((line[: end_color + 2], line[end_color + 2 : next_color]))
+ line = line[next_color:]
+ return chunks
+
+ for line in text.splitlines():
+ # We need to check for line lengths here and split as necessary
+ try:
+ line_length = colors.get_line_width(line)
+ except colors.BadColorString:
+ log.error('Passed a bad colored line: %s', line)
+ continue
+
+ if line_length >= (self.cols - 1):
+ s = ''
+ # The length of the text without the color tags
+ s_len = 0
+ # We need to split this over multiple lines
+ for chunk in get_line_chunks(line):
+ if (strwidth(chunk[1]) + s_len) < (self.cols - 1):
+ # This chunk plus the current string in 's' isn't over
+ # the maximum width, so just append the color tag and text
+ s += chunk[0] + chunk[1]
+ s_len += strwidth(chunk[1])
+ else:
+ # The chunk plus the current string in 's' is too long.
+ # We need to take as much of the chunk and put it into 's'
+ # with the color tag.
+ remain = (self.cols - 1) - s_len
+ s += chunk[0] + chunk[1][:remain]
+ # We append the line since it's full
+ self.lines.append(s)
+ # Start a new 's' with the remainder chunk
+ s = chunk[0] + chunk[1][remain:]
+ s_len = strwidth(chunk[1][remain:])
+ # Append the final string which may or may not be the full width
+ if s:
+ self.lines.append(s)
+ else:
+ self.lines.append(line)
+
+ while len(self.lines) > LINES_BUFFER_SIZE:
+ # Remove the oldest line if the max buffer size has been reached
+ del self.lines[0]
+
+ if refresh:
+ self.refresh()
+
+ def _add_string(self, row, string):
+ """
+ Adds a string to the desired `:param:row`.
+
+ :param row: int, the row number to write the string
+
+ """
+ col = 0
+ try:
+ parsed = colors.parse_color_string(string)
+ except colors.BadColorString as ex:
+ log.error('Cannot add bad color string %s: %s', string, ex)
+ return
+
+ for index, (color, p_str) in enumerate(parsed):
+ if index + 1 == len(parsed):
+ # This is the last string so lets append some " " to it
+ p_str += ' ' * (self.cols - (col + strwidth(p_str)) - 1)
+ try:
+ self.stdscr.addstr(row, col, p_str.encode(self.encoding), color)
+ except curses.error:
+ pass
+
+ col += strwidth(p_str)
+
+ def set_batch_write(self, batch):
+ """
+ When this is set the screen is not refreshed after a `:meth:write` until
+ this is set to False.
+
+ :param batch: set True to prevent screen refreshes after a `:meth:write`
+ :type batch: bool
+
+ """
+ self.batch_write = batch
+ if not batch:
+ self.refresh()
+
+ def write(self, line):
+ """
+ Writes a line out
+
+ :param line: str, the line to print
+
+ """
+
+ self.add_line(line, not self.batch_write)
+
+ def tab_completer(self, line, cursor, hits):
+ """
+ Called when the user hits 'tab' and will autocomplete or show options.
+ If a command is already supplied in the line, this function will call the
+ complete method of the command.
+
+ :param line: str, the current input string
+ :param cursor: int, the cursor position in the line
+ :param second_hit: bool, if this is the second time in a row the tab key
+ has been pressed
+
+ :returns: 2-tuple (string, cursor position)
+
+ """
+ # First check to see if there is no space, this will mean that it's a
+ # command that needs to be completed.
+
+ # We don't want to split by escaped spaces
+ def split(string):
+ return re.split(r'(?<!\\) ', string)
+
+ if ' ' not in line:
+ possible_matches = []
+ # Iterate through the commands looking for ones that startwith the
+ # line.
+ for cmd in self.console._commands:
+ if cmd.startswith(line):
+ possible_matches.append(cmd)
+
+ line_prefix = ''
+ else:
+ cmd = split(line)[0]
+ if cmd in self.console._commands:
+ # Call the command's complete method to get 'er done
+ possible_matches = self.console._commands[cmd].complete(split(line)[-1])
+ line_prefix = ' '.join(split(line)[:-1]) + ' '
+ else:
+ # This is a bogus command
+ return (line, cursor)
+
+ # No matches, so just return what we got passed
+ if len(possible_matches) == 0:
+ return (line, cursor)
+ # If we only have 1 possible match, then just modify the line and
+ # return it, else we need to print out the matches without modifying
+ # the line.
+ elif len(possible_matches) == 1:
+ # Do not append space after directory names
+ new_line = line_prefix + possible_matches[0]
+ if not new_line.endswith('/') and not new_line.endswith(r'\\'):
+ new_line += ' '
+ # We only want to print eventual colors or other control characters, not return them
+ new_line = remove_formatting(new_line)
+ return (new_line, len(new_line))
+ else:
+ if hits == 1:
+ p = ' '.join(split(line)[:-1])
+
+ try:
+ l_arg = split(line)[-1]
+ except IndexError:
+ l_arg = ''
+
+ new_line = ' '.join(
+ [p, complete_line(l_arg, possible_matches)]
+ ).lstrip()
+
+ if len(remove_formatting(new_line)) > len(line):
+ line = new_line
+ cursor = len(line)
+ elif hits >= 2:
+ max_list = self.console_config['cmdline']['torrents_per_tab_press']
+ match_count = len(possible_matches)
+ listed = (hits - 2) * max_list
+ pages = (match_count - 1) // max_list + 1
+ left = match_count - listed
+ if hits == 2:
+ self.write(' ')
+
+ if match_count >= 4:
+ self.write('{!green!}Autocompletion matches:')
+ # Only list some of the matching torrents as there can be hundreds of them
+ if self.console_config['cmdline']['third_tab_lists_all']:
+ if hits == 2 and left > max_list:
+ for i in range(listed, listed + max_list):
+ match = possible_matches[i]
+ self.write(match.replace(r'\ ', ' '))
+ self.write(
+ '{!error!}And %i more. Press <tab> to list them'
+ % (left - max_list)
+ )
+ else:
+ self.tab_count = 0
+ for match in possible_matches[listed:]:
+ self.write(match.replace(r'\ ', ' '))
+ else:
+ if left > max_list:
+ for i in range(listed, listed + max_list):
+ match = possible_matches[i]
+ self.write(match.replace(r'\ ', ' '))
+ self.write(
+ '{!error!}And %i more (%i/%i). Press <tab> to view more'
+ % (left - max_list, hits - 1, pages)
+ )
+ else:
+ self.tab_count = 0
+ for match in possible_matches[listed:]:
+ self.write(match.replace(r'\ ', ' '))
+ if hits > 2:
+ self.write(
+ '{!green!}Finished listing %i torrents (%i/%i)'
+ % (match_count, hits - 1, pages)
+ )
+
+ # We only want to print eventual colors or other control characters, not return them
+ line = remove_formatting(line)
+ cursor = len(line)
+ return (line, cursor)
+
+ def tab_complete_path(
+ self, line, path_type='file', ext='', sort='name', dirs_first=1
+ ):
+ self.console = component.get('ConsoleUI')
+
+ line = line.replace('\\ ', ' ')
+ line = os.path.abspath(os.path.expanduser(line))
+ ret = []
+ if os.path.exists(line):
+ # This is a correct path, check to see if it's a directory
+ if os.path.isdir(line):
+ # Directory, so we need to show contents of directory
+ # ret.extend(os.listdir(line))
+ try:
+ for f in os.listdir(line):
+ # Skip hidden
+ if f.startswith('.'):
+ continue
+ f = os.path.join(line, f)
+ if os.path.isdir(f):
+ if os.sep == '\\': # Windows path support
+ f += '\\'
+ else: # Unix
+ f += '/'
+ elif not f.endswith(ext):
+ continue
+ ret.append(f)
+ except OSError:
+ self.console.write('{!error!}Permission denied: {!info!}%s' % line)
+ else:
+ try:
+ # This is a file, but we could be looking for another file that
+ # shares a common prefix.
+ for f in os.listdir(os.path.dirname(line)):
+ if f.startswith(os.path.split(line)[1]):
+ ret.append(os.path.join(os.path.dirname(line), f))
+ except OSError:
+ self.console.write('{!error!}Permission denied: {!info!}%s' % line)
+ else:
+ # This path does not exist, so lets do a listdir on it's parent
+ # and find any matches.
+ try:
+ ret = []
+ if os.path.isdir(os.path.dirname(line)):
+ for f in os.listdir(os.path.dirname(line)):
+ if f.startswith(os.path.split(line)[1]):
+ p = os.path.join(os.path.dirname(line), f)
+
+ if os.path.isdir(p):
+ if os.sep == '\\': # Windows path support
+ p += '\\'
+ else: # Unix
+ p += '/'
+ ret.append(p)
+ except OSError:
+ self.console.write('{!error!}Permission denied: {!info!}%s' % line)
+
+ if sort == 'date':
+ ret = sorted(ret, key=os.path.getmtime, reverse=True)
+
+ if dirs_first == 1:
+ ret = sorted(ret, key=os.path.isdir, reverse=True)
+ elif dirs_first == -1:
+ ret = sorted(ret, key=os.path.isdir, reverse=False)
+
+ # Highlight directory names
+ for i, filename in enumerate(ret):
+ if os.path.isdir(filename):
+ ret[i] = '{!cyan!}%s' % filename
+
+ for i in range(0, len(ret)):
+ ret[i] = ret[i].replace(' ', r'\ ')
+ return ret
+
+ def tab_complete_torrent(self, line):
+ """
+ Completes torrent_ids or names.
+
+ :param line: str, the string to complete
+
+ :returns: list of matches
+
+ """
+
+ empty = len(line) == 0
+
+ # Remove dangling backslashes to avoid breaking shlex
+ if line.endswith('\\'):
+ line = line[:-1]
+
+ raw_line = line
+ line = line.replace('\\ ', ' ')
+
+ possible_matches = []
+ possible_matches2 = []
+
+ match_count = 0
+ match_count2 = 0
+ for torrent_id, torrent_name in self.console.torrents:
+ if torrent_id.startswith(line):
+ match_count += 1
+ if torrent_name.startswith(line):
+ match_count += 1
+ elif torrent_name.lower().startswith(line.lower()):
+ match_count2 += 1
+
+ # Find all possible matches
+ for torrent_id, torrent_name in self.console.torrents:
+ # Escape spaces to avoid, for example, expanding "Doc" into "Doctor Who" and removing
+ # everything containing one of these words
+ escaped_name = torrent_name.replace(' ', '\\ ')
+ # If we only matched one torrent, don't add the full name or it'll also get autocompleted
+ if match_count == 1:
+ if torrent_id.startswith(line):
+ possible_matches.append(torrent_id)
+ break
+ if torrent_name.startswith(line):
+ possible_matches.append(escaped_name)
+ break
+ elif match_count == 0 and match_count2 == 1:
+ if torrent_name.lower().startswith(line.lower()):
+ possible_matches.append(escaped_name)
+ break
+ else:
+ line_len = len(raw_line)
+
+ # Let's avoid listing all torrents twice if there's no pattern
+ if not empty and torrent_id.startswith(line):
+ # Highlight the matching part
+ text = '{!info!}%s{!input!}%s - "%s"' % (
+ torrent_id[:line_len],
+ torrent_id[line_len:],
+ torrent_name,
+ )
+ possible_matches.append(text)
+ if torrent_name.startswith(line):
+ text = '{!info!}%s{!input!}%s ({!cyan!}%s{!input!})' % (
+ escaped_name[:line_len],
+ escaped_name[line_len:],
+ torrent_id,
+ )
+ possible_matches.append(text)
+ elif torrent_name.lower().startswith(line.lower()):
+ text = '{!info!}%s{!input!}%s ({!cyan!}%s{!input!})' % (
+ escaped_name[:line_len],
+ escaped_name[line_len:],
+ torrent_id,
+ )
+ possible_matches2.append(text)
+
+ return possible_matches + possible_matches2
diff --git a/deluge/ui/console/modes/connectionmanager.py b/deluge/ui/console/modes/connectionmanager.py
new file mode 100644
index 0000000..84a3fbc
--- /dev/null
+++ b/deluge/ui/console/modes/connectionmanager.py
@@ -0,0 +1,206 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+from deluge.decorators import overrides
+from deluge.ui.console.modes.basemode import BaseMode
+from deluge.ui.console.utils.curses_util import is_printable_chr
+from deluge.ui.console.widgets.popup import InputPopup, PopupsHandler, SelectablePopup
+from deluge.ui.hostlist import HostList
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+
+
+class ConnectionManager(BaseMode, PopupsHandler):
+ def __init__(self, stdscr, encoding=None):
+ PopupsHandler.__init__(self)
+ self.statuses = {}
+ self.all_torrents = None
+ self.hostlist = HostList()
+ self.update_hosts_status()
+ BaseMode.__init__(self, stdscr, encoding=encoding)
+ self.update_select_host_popup()
+
+ def update_select_host_popup(self):
+ selected_index = self.popup.current_selection() if self.popup else None
+
+ popup = SelectablePopup(
+ self,
+ _('Select Host'),
+ self._host_selected,
+ border_off_west=1,
+ active_wrap=True,
+ )
+ popup.add_header(
+ "{!white,black,bold!}'Q'=%s, 'a'=%s, 'D'=%s"
+ % (_('Quit'), _('Add Host'), _('Delete Host')),
+ space_below=True,
+ )
+ self.push_popup(popup, clear=True)
+
+ for host_entry in self.hostlist.get_hosts_info():
+ host_id, hostname, port, user = host_entry
+ args = {'data': host_id, 'foreground': 'red'}
+ state = 'Offline'
+ if host_id in self.statuses:
+ state = 'Online'
+ args.update({'data': self.statuses[host_id], 'foreground': 'green'})
+ host_str = '%s:%d [%s]' % (hostname, port, state)
+ self.popup.add_line(
+ host_id, host_str, selectable=True, use_underline=True, **args
+ )
+
+ if selected_index:
+ self.popup.set_selection(selected_index)
+ self.inlist = True
+ self.refresh()
+
+ def update_hosts_status(self):
+ for host_entry in self.hostlist.get_hosts_info():
+
+ def on_host_status(status_info):
+ self.statuses[status_info[0]] = status_info
+ self.update_select_host_popup()
+
+ self.hostlist.get_host_status(host_entry[0]).addCallback(on_host_status)
+
+ def _on_connected(self, result):
+ def on_console_start(result):
+ component.get('ConsoleUI').set_mode('TorrentList')
+
+ d = component.get('ConsoleUI').start_console()
+ d.addCallback(on_console_start)
+
+ def _on_connect_fail(self, result):
+ self.report_message('Failed to connect!', result)
+ self.refresh()
+ if hasattr(result, 'getTraceback'):
+ log.exception(result)
+
+ def _host_selected(self, selected_host, *args, **kwargs):
+ if selected_host in self.statuses:
+ d = self.hostlist.connect_host(selected_host)
+ d.addCallback(self._on_connected)
+ d.addErrback(self._on_connect_fail)
+
+ def _do_add(self, result, **kwargs):
+ if not result or kwargs.get('close', False):
+ self.pop_popup()
+ else:
+ self.add_host(
+ result['hostname']['value'],
+ result['port']['value'],
+ result['username']['value'],
+ result['password']['value'],
+ )
+
+ def add_popup(self):
+ self.inlist = False
+ popup = InputPopup(
+ self,
+ _('Add Host (Up & Down arrows to navigate, Esc to cancel)'),
+ border_off_north=1,
+ border_off_east=1,
+ close_cb=self._do_add,
+ )
+ popup.add_text_input('hostname', _('Hostname:'))
+ popup.add_text_input('port', _('Port:'))
+ popup.add_text_input('username', _('Username:'))
+ popup.add_text_input('password', _('Password:'))
+ self.push_popup(popup, clear=True)
+ self.refresh()
+
+ def add_host(self, hostname, port, username, password):
+ log.info('Adding host: %s', hostname)
+ try:
+ self.hostlist.add_host(hostname, port, username, password)
+ except ValueError as ex:
+ self.report_message(_('Error adding host'), '%s: %s' % (hostname, ex))
+ else:
+ self.update_select_host_popup()
+
+ def delete_host(self, host_id):
+ log.info('Deleting host: %s', host_id)
+ self.hostlist.remove_host(host_id)
+ self.update_select_host_popup()
+
+ @overrides(component.Component)
+ def start(self):
+ self.refresh()
+
+ @overrides(component.Component)
+ def update(self):
+ self.update_hosts_status()
+
+ @overrides(BaseMode)
+ def pause(self):
+ self.pop_popup()
+ BaseMode.pause(self)
+
+ @overrides(BaseMode)
+ def resume(self):
+ BaseMode.resume(self)
+ self.refresh()
+
+ @overrides(BaseMode)
+ def refresh(self):
+ if self.mode_paused():
+ return
+
+ self.stdscr.erase()
+ self.draw_statusbars()
+ self.stdscr.noutrefresh()
+
+ if not self.popup:
+ self.update_select_host_popup()
+
+ self.popup.refresh()
+ curses.doupdate()
+
+ @overrides(BaseMode)
+ def on_resize(self, rows, cols):
+ BaseMode.on_resize(self, rows, cols)
+
+ if self.popup:
+ self.popup.handle_resize()
+
+ self.stdscr.erase()
+ self.refresh()
+
+ @overrides(BaseMode)
+ def read_input(self):
+ c = self.stdscr.getch()
+
+ if is_printable_chr(c):
+ if chr(c) == 'Q':
+ component.get('ConsoleUI').quit()
+ elif self.inlist:
+ if chr(c) == 'q':
+ return
+ elif chr(c) == 'D':
+ host_id = self.popup.current_selection()[1]
+ self.delete_host(host_id)
+ return
+ elif chr(c) == 'a':
+ self.add_popup()
+ return
+
+ if self.popup:
+ if self.popup.handle_read(c) and self.popup.closed():
+ self.pop_popup()
+ self.refresh()
diff --git a/deluge/ui/console/modes/eventview.py b/deluge/ui/console/modes/eventview.py
new file mode 100644
index 0000000..cd3308c
--- /dev/null
+++ b/deluge/ui/console/modes/eventview.py
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+from deluge.decorators import overrides
+from deluge.ui.console.modes.basemode import BaseMode
+from deluge.ui.console.utils import curses_util as util
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+
+
+class EventView(BaseMode):
+ def __init__(self, parent_mode, stdscr, encoding=None):
+ BaseMode.__init__(self, stdscr, encoding)
+ self.parent_mode = parent_mode
+ self.offset = 0
+
+ def back_to_overview(self):
+ component.get('ConsoleUI').set_mode(self.parent_mode.mode_name)
+
+ @overrides(component.Component)
+ def update(self):
+ self.refresh()
+
+ @overrides(BaseMode)
+ def refresh(self):
+ """
+ This method just shows each line of the event log
+ """
+ events = component.get('ConsoleUI').events
+
+ self.stdscr.erase()
+ self.draw_statusbars()
+
+ if events:
+ for i, event in enumerate(events):
+ if i - self.offset >= self.rows - 2:
+ more = len(events) - self.offset - self.rows + 2
+ if more > 0:
+ self.add_string(i - self.offset, ' (And %i more)' % more)
+ break
+
+ elif i - self.offset < 0:
+ continue
+ try:
+ self.add_string(i + 1 - self.offset, event)
+ except curses.error:
+ pass # This'll just cut the line. Note: This seriously should be fixed in a better way
+ else:
+ self.add_string(1, '{!white,black,bold!}No events to show yet')
+
+ if not component.get('ConsoleUI').is_active_mode(self):
+ return
+
+ self.stdscr.noutrefresh()
+ curses.doupdate()
+
+ @overrides(BaseMode)
+ def on_resize(self, rows, cols):
+ BaseMode.on_resize(self, rows, cols)
+ self.refresh()
+
+ @overrides(BaseMode)
+ def read_input(self):
+ c = self.stdscr.getch()
+
+ if c in [ord('q'), util.KEY_ESC]:
+ self.back_to_overview()
+ return
+
+ # TODO: Scroll event list
+ jumplen = self.rows - 3
+ num_events = len(component.get('ConsoleUI').events)
+
+ if c == curses.KEY_UP:
+ self.offset -= 1
+ elif c == curses.KEY_PPAGE:
+ self.offset -= jumplen
+ elif c == curses.KEY_HOME:
+ self.offset = 0
+ elif c == curses.KEY_DOWN:
+ self.offset += 1
+ elif c == curses.KEY_NPAGE:
+ self.offset += jumplen
+ elif c == curses.KEY_END:
+ self.offset += num_events
+ elif c == ord('j'):
+ self.offset -= 1
+ elif c == ord('k'):
+ self.offset += 1
+
+ if self.offset <= 0:
+ self.offset = 0
+ elif num_events > self.rows - 3:
+ if self.offset > num_events - self.rows + 3:
+ self.offset = num_events - self.rows + 3
+ else:
+ self.offset = 0
+
+ self.refresh()
diff --git a/deluge/ui/console/modes/preferences/__init__.py b/deluge/ui/console/modes/preferences/__init__.py
new file mode 100644
index 0000000..15d77c4
--- /dev/null
+++ b/deluge/ui/console/modes/preferences/__init__.py
@@ -0,0 +1,5 @@
+from __future__ import unicode_literals
+
+from deluge.ui.console.modes.preferences.preferences import Preferences
+
+__all__ = ['Preferences']
diff --git a/deluge/ui/console/modes/preferences/preference_panes.py b/deluge/ui/console/modes/preferences/preference_panes.py
new file mode 100644
index 0000000..62029a6
--- /dev/null
+++ b/deluge/ui/console/modes/preferences/preference_panes.py
@@ -0,0 +1,764 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.common import is_ip
+from deluge.decorators import overrides
+from deluge.i18n import get_languages
+from deluge.ui.client import client
+from deluge.ui.common import DISK_CACHE_KEYS
+from deluge.ui.console.widgets import BaseInputPane, BaseWindow
+from deluge.ui.console.widgets.fields import FloatSpinInput, TextInput
+from deluge.ui.console.widgets.popup import PopupsHandler
+
+log = logging.getLogger(__name__)
+
+
+class BasePreferencePane(BaseInputPane, BaseWindow, PopupsHandler):
+ def __init__(self, name, preferences):
+ PopupsHandler.__init__(self)
+ self.preferences = preferences
+ BaseWindow.__init__(
+ self,
+ '%s' % name,
+ self.pane_width,
+ preferences.height,
+ posy=1,
+ posx=self.pane_x_pos,
+ )
+ BaseInputPane.__init__(self, preferences, border_off_east=1)
+ self.name = name
+
+ # have we scrolled down in the list
+ self.input_offset = 0
+
+ @overrides(BaseInputPane)
+ def handle_read(self, c):
+ if self.popup:
+ ret = self.popup.handle_read(c)
+ if self.popup and self.popup.closed():
+ self.pop_popup()
+ self.refresh()
+ return ret
+ return BaseInputPane.handle_read(self, c)
+
+ @property
+ def visible_content_pane_height(self):
+ y, x = self.visible_content_pane_size
+ return y
+
+ @property
+ def pane_x_pos(self):
+ return self.preferences.sidebar_width
+
+ @property
+ def pane_width(self):
+ return self.preferences.width
+
+ @property
+ def cols(self):
+ return self.pane_width
+
+ @property
+ def rows(self):
+ return self.preferences.height
+
+ def is_active_pane(self):
+ return self.preferences.is_active_pane(self)
+
+ def create_pane(self, core_conf, console_config):
+ pass
+
+ def add_config_values(self, conf_dict):
+ for ipt in self.inputs:
+ if ipt.has_input():
+ # Need special cases for in/out ports or proxy since they are tuples or dicts.
+ if ipt.name == 'listen_ports_to' or ipt.name == 'listen_ports_from':
+ conf_dict['listen_ports'] = (
+ self.infrom.get_value(),
+ self.into.get_value(),
+ )
+ elif ipt.name == 'out_ports_to' or ipt.name == 'out_ports_from':
+ conf_dict['outgoing_ports'] = (
+ self.outfrom.get_value(),
+ self.outto.get_value(),
+ )
+ elif ipt.name == 'listen_interface':
+ listen_interface = ipt.get_value().strip()
+ if is_ip(listen_interface) or not listen_interface:
+ conf_dict['listen_interface'] = listen_interface
+ elif ipt.name == 'outgoing_interface':
+ outgoing_interface = ipt.get_value().strip()
+ conf_dict['outgoing_interface'] = outgoing_interface
+ elif ipt.name.startswith('proxy_'):
+ if ipt.name == 'proxy_type':
+ conf_dict.setdefault('proxy', {})['type'] = ipt.get_value()
+ elif ipt.name == 'proxy_username':
+ conf_dict.setdefault('proxy', {})['username'] = ipt.get_value()
+ elif ipt.name == 'proxy_password':
+ conf_dict.setdefault('proxy', {})['password'] = ipt.get_value()
+ elif ipt.name == 'proxy_hostname':
+ conf_dict.setdefault('proxy', {})['hostname'] = ipt.get_value()
+ elif ipt.name == 'proxy_port':
+ conf_dict.setdefault('proxy', {})['port'] = ipt.get_value()
+ elif ipt.name == 'proxy_hostnames':
+ conf_dict.setdefault('proxy', {})[
+ 'proxy_hostnames'
+ ] = ipt.get_value()
+ elif ipt.name == 'proxy_peer_connections':
+ conf_dict.setdefault('proxy', {})[
+ 'proxy_peer_connections'
+ ] = ipt.get_value()
+ elif ipt.name == 'proxy_tracker_connections':
+ conf_dict.setdefault('proxy', {})[
+ 'proxy_tracker_connections'
+ ] = ipt.get_value()
+ elif ipt.name == 'force_proxy':
+ conf_dict.setdefault('proxy', {})['force_proxy'] = ipt.get_value()
+ elif ipt.name == 'anonymous_mode':
+ conf_dict.setdefault('proxy', {})[
+ 'anonymous_mode'
+ ] = ipt.get_value()
+ else:
+ conf_dict[ipt.name] = ipt.get_value()
+
+ if hasattr(ipt, 'get_child'):
+ c = ipt.get_child()
+ conf_dict[c.name] = c.get_value()
+
+ def update_values(self, conf_dict):
+ for ipt in self.inputs:
+ if ipt.has_input():
+ try:
+ ipt.set_value(conf_dict[ipt.name])
+ except KeyError: # just ignore if it's not in dict
+ pass
+ if hasattr(ipt, 'get_child'):
+ try:
+ c = ipt.get_child()
+ c.set_value(conf_dict[c.name])
+ except KeyError: # just ignore if it's not in dict
+ pass
+
+ def render(self, mode, screen, width, focused):
+ height = self.get_content_height()
+ self.ensure_content_pane_height(height)
+ self.screen.erase()
+
+ if focused and self.active_input == -1:
+ self.move_active_down(1)
+
+ self.render_inputs(focused=focused)
+
+ @overrides(BaseWindow)
+ def refresh(self):
+ BaseWindow.refresh(self)
+ if self.popup:
+ self.popup.refresh()
+
+ def update(self, active):
+ pass
+
+
+class InterfacePane(BasePreferencePane):
+ def __init__(self, preferences):
+ BasePreferencePane.__init__(self, ' %s ' % _('Interface'), preferences)
+
+ @overrides(BasePreferencePane)
+ def create_pane(self, core_conf, console_config):
+ self.add_header(_('General options'))
+
+ self.add_checked_input(
+ 'ring_bell',
+ _('Ring system bell when a download finishes'),
+ console_config['ring_bell'],
+ )
+ self.add_header('Console UI', space_above=True)
+ self.add_checked_input(
+ 'separate_complete',
+ _('List complete torrents after incomplete regardless of sorting order'),
+ console_config['torrentview']['separate_complete'],
+ )
+ self.add_checked_input(
+ 'move_selection',
+ _('Move selection when moving torrents in the queue'),
+ console_config['torrentview']['move_selection'],
+ )
+
+ langs = get_languages()
+ langs.insert(0, ('', 'System Default'))
+ self.add_combo_input(
+ 'language', _('Language'), langs, default=console_config['language']
+ )
+ self.add_header(_('Command Line Mode'), space_above=True)
+ self.add_checked_input(
+ 'ignore_duplicate_lines',
+ _('Do not store duplicate input in history'),
+ console_config['cmdline']['ignore_duplicate_lines'],
+ )
+ self.add_checked_input(
+ 'save_command_history',
+ _('Store and load command line history in command line mode'),
+ console_config['cmdline']['save_command_history'],
+ )
+ self.add_header('')
+ self.add_checked_input(
+ 'third_tab_lists_all',
+ _('Third tab lists all remaining torrents in command line mode'),
+ console_config['cmdline']['third_tab_lists_all'],
+ )
+ self.add_int_spin_input(
+ 'torrents_per_tab_press',
+ _('Torrents per tab press'),
+ console_config['cmdline']['torrents_per_tab_press'],
+ min_val=5,
+ max_val=10000,
+ )
+
+
+class DownloadsPane(BasePreferencePane):
+ def __init__(self, preferences):
+ BasePreferencePane.__init__(self, ' %s ' % _('Downloads'), preferences)
+
+ @overrides(BasePreferencePane)
+ def create_pane(self, core_conf, console_config):
+ self.add_header(_('Folders'))
+ self.add_text_input(
+ 'download_location',
+ '%s:' % _('Download To'),
+ core_conf['download_location'],
+ complete=True,
+ activate_input=True,
+ col='+1',
+ )
+ cmptxt = TextInput(
+ self.preferences,
+ 'move_completed_path',
+ None,
+ self.move,
+ self.pane_width,
+ core_conf['move_completed_path'],
+ False,
+ )
+ self.add_checkedplus_input(
+ 'move_completed',
+ '%s:' % _('Move completed to'),
+ cmptxt,
+ core_conf['move_completed'],
+ )
+ copytxt = TextInput(
+ self.preferences,
+ 'torrentfiles_location',
+ None,
+ self.move,
+ self.pane_width,
+ core_conf['torrentfiles_location'],
+ False,
+ )
+ self.add_checkedplus_input(
+ 'copy_torrent_file',
+ '%s:' % _('Copy of .torrent files to'),
+ copytxt,
+ core_conf['copy_torrent_file'],
+ )
+ self.add_checked_input(
+ 'del_copy_torrent_file',
+ _('Delete copy of torrent file on remove'),
+ core_conf['del_copy_torrent_file'],
+ )
+
+ self.add_header(_('Options'), space_above=True)
+ self.add_checked_input(
+ 'prioritize_first_last_pieces',
+ ('Prioritize first and last pieces of torrent'),
+ core_conf['prioritize_first_last_pieces'],
+ )
+ self.add_checked_input(
+ 'sequential_download',
+ _('Sequential download'),
+ core_conf['sequential_download'],
+ )
+ self.add_checked_input('add_paused', _('Add Paused'), core_conf['add_paused'])
+ self.add_checked_input(
+ 'pre_allocate_storage',
+ _('Pre-Allocate disk space'),
+ core_conf['pre_allocate_storage'],
+ )
+
+
+class NetworkPane(BasePreferencePane):
+ def __init__(self, preferences):
+ BasePreferencePane.__init__(self, ' %s ' % _('Network'), preferences)
+
+ @overrides(BasePreferencePane)
+ def create_pane(self, core_conf, console_config):
+ self.add_header(_('Incomming Ports'))
+ inrand = self.add_checked_input(
+ 'random_port',
+ 'Use Random Ports Active Port: %d' % self.preferences.active_port,
+ core_conf['random_port'],
+ )
+ listen_ports = core_conf['listen_ports']
+ self.infrom = self.add_int_spin_input(
+ 'listen_ports_from',
+ ' %s:' % _('From'),
+ value=listen_ports[0],
+ min_val=0,
+ max_val=65535,
+ )
+ self.infrom.set_depend(inrand, inverse=True)
+ self.into = self.add_int_spin_input(
+ 'listen_ports_to',
+ ' %s:' % _('To'),
+ value=listen_ports[1],
+ min_val=0,
+ max_val=65535,
+ )
+ self.into.set_depend(inrand, inverse=True)
+
+ self.add_header(_('Outgoing Ports'), space_above=True)
+ outrand = self.add_checked_input(
+ 'random_outgoing_ports',
+ _('Use Random Ports'),
+ core_conf['random_outgoing_ports'],
+ )
+ out_ports = core_conf['outgoing_ports']
+ self.outfrom = self.add_int_spin_input(
+ 'out_ports_from',
+ ' %s:' % _('From'),
+ value=out_ports[0],
+ min_val=0,
+ max_val=65535,
+ )
+ self.outfrom.set_depend(outrand, inverse=True)
+ self.outto = self.add_int_spin_input(
+ 'out_ports_to',
+ ' %s:' % _('To'),
+ value=out_ports[1],
+ min_val=0,
+ max_val=65535,
+ )
+ self.outto.set_depend(outrand, inverse=True)
+
+ self.add_header(_('Incoming Interface'), space_above=True)
+ self.add_text_input(
+ 'listen_interface',
+ _('IP address of the interface to listen on (leave empty for default):'),
+ core_conf['listen_interface'],
+ )
+
+ self.add_header(_('Outgoing Interface'), space_above=True)
+ self.add_text_input(
+ 'outgoing_interface',
+ _(
+ 'The network interface name or IP address for outgoing '
+ 'BitTorrent connections. (Leave empty for default.):'
+ ),
+ core_conf['outgoing_interface'],
+ )
+
+ self.add_header('TOS', space_above=True)
+ self.add_text_input('peer_tos', 'Peer TOS Byte:', core_conf['peer_tos'])
+
+ self.add_header(_('Network Extras'), space_above=True)
+ self.add_checked_input('upnp', 'UPnP', core_conf['upnp'])
+ self.add_checked_input('natpmp', 'NAT-PMP', core_conf['natpmp'])
+ self.add_checked_input('utpex', 'Peer Exchange', core_conf['utpex'])
+ self.add_checked_input('lsd', 'LSD', core_conf['lsd'])
+ self.add_checked_input('dht', 'DHT', core_conf['dht'])
+
+ self.add_header(_('Encryption'), space_above=True)
+ self.add_select_input(
+ 'enc_in_policy',
+ '%s:' % _('Inbound'),
+ [_('Forced'), _('Enabled'), _('Disabled')],
+ [0, 1, 2],
+ core_conf['enc_in_policy'],
+ active_default=True,
+ col='+1',
+ )
+ self.add_select_input(
+ 'enc_out_policy',
+ '%s:' % _('Outbound'),
+ [_('Forced'), _('Enabled'), _('Disabled')],
+ [0, 1, 2],
+ core_conf['enc_out_policy'],
+ active_default=True,
+ )
+ self.add_select_input(
+ 'enc_level',
+ '%s:' % _('Level'),
+ [_('Handshake'), _('Full Stream'), _('Either')],
+ [0, 1, 2],
+ core_conf['enc_level'],
+ active_default=True,
+ )
+
+
+class BandwidthPane(BasePreferencePane):
+ def __init__(self, preferences):
+ BasePreferencePane.__init__(self, ' %s ' % _('Bandwidth'), preferences)
+
+ @overrides(BasePreferencePane)
+ def create_pane(self, core_conf, console_config):
+ self.add_header(_('Global Bandwidth Usage'))
+ self.add_int_spin_input(
+ 'max_connections_global',
+ '%s:' % _('Maximum Connections'),
+ core_conf['max_connections_global'],
+ min_val=-1,
+ max_val=9000,
+ )
+ self.add_int_spin_input(
+ 'max_upload_slots_global',
+ '%s:' % _('Maximum Upload Slots'),
+ core_conf['max_upload_slots_global'],
+ min_val=-1,
+ max_val=9000,
+ )
+ self.add_float_spin_input(
+ 'max_download_speed',
+ '%s:' % _('Maximum Download Speed (KiB/s)'),
+ core_conf['max_download_speed'],
+ min_val=-1.0,
+ max_val=60000.0,
+ )
+ self.add_float_spin_input(
+ 'max_upload_speed',
+ '%s:' % _('Maximum Upload Speed (KiB/s)'),
+ core_conf['max_upload_speed'],
+ min_val=-1.0,
+ max_val=60000.0,
+ )
+ self.add_int_spin_input(
+ 'max_half_open_connections',
+ '%s:' % _('Maximum Half-Open Connections'),
+ core_conf['max_half_open_connections'],
+ min_val=-1,
+ max_val=9999,
+ )
+ self.add_int_spin_input(
+ 'max_connections_per_second',
+ '%s:' % _('Maximum Connection Attempts per Second'),
+ core_conf['max_connections_per_second'],
+ min_val=-1,
+ max_val=9999,
+ )
+ self.add_checked_input(
+ 'ignore_limits_on_local_network',
+ _('Ignore limits on local network'),
+ core_conf['ignore_limits_on_local_network'],
+ )
+ self.add_checked_input(
+ 'rate_limit_ip_overhead',
+ _('Rate Limit IP Overhead'),
+ core_conf['rate_limit_ip_overhead'],
+ )
+ self.add_header(_('Per Torrent Bandwidth Usage'), space_above=True)
+ self.add_int_spin_input(
+ 'max_connections_per_torrent',
+ '%s:' % _('Maximum Connections'),
+ core_conf['max_connections_per_torrent'],
+ min_val=-1,
+ max_val=9000,
+ )
+ self.add_int_spin_input(
+ 'max_upload_slots_per_torrent',
+ '%s:' % _('Maximum Upload Slots'),
+ core_conf['max_upload_slots_per_torrent'],
+ min_val=-1,
+ max_val=9000,
+ )
+ self.add_float_spin_input(
+ 'max_download_speed_per_torrent',
+ '%s:' % _('Maximum Download Speed (KiB/s)'),
+ core_conf['max_download_speed_per_torrent'],
+ min_val=-1.0,
+ max_val=60000.0,
+ )
+ self.add_float_spin_input(
+ 'max_upload_speed_per_torrent',
+ '%s:' % _('Maximum Upload Speed (KiB/s)'),
+ core_conf['max_upload_speed_per_torrent'],
+ min_val=-1.0,
+ max_val=60000.0,
+ )
+
+
+class OtherPane(BasePreferencePane):
+ def __init__(self, preferences):
+ BasePreferencePane.__init__(self, ' %s ' % _('Other'), preferences)
+
+ @overrides(BasePreferencePane)
+ def create_pane(self, core_conf, console_config):
+ self.add_header(_('System Information'))
+ self.add_info_field('info1', ' Help us improve Deluge by sending us your', '')
+ self.add_info_field(
+ 'info2', ' Python version, PyGTK version, OS and processor', ''
+ )
+ self.add_info_field(
+ 'info3', ' types. Absolutely no other information is sent.', ''
+ )
+ self.add_checked_input(
+ 'send_info',
+ _('Yes, please send anonymous statistics.'),
+ core_conf['send_info'],
+ )
+ self.add_header(_('GeoIP Database'), space_above=True)
+ self.add_text_input(
+ 'geoip_db_location', 'Location:', core_conf['geoip_db_location']
+ )
+
+
+class DaemonPane(BasePreferencePane):
+ def __init__(self, preferences):
+ BasePreferencePane.__init__(self, ' %s ' % _('Daemon'), preferences)
+
+ @overrides(BasePreferencePane)
+ def create_pane(self, core_conf, console_config):
+ self.add_header('Port')
+ self.add_int_spin_input(
+ 'daemon_port',
+ '%s:' % _('Daemon Port'),
+ core_conf['daemon_port'],
+ min_val=0,
+ max_val=65535,
+ )
+ self.add_header('Connections', space_above=True)
+ self.add_checked_input(
+ 'allow_remote', _('Allow remote connections'), core_conf['allow_remote']
+ )
+ self.add_header('Other', space_above=True)
+ self.add_checked_input(
+ 'new_release_check',
+ _('Periodically check the website for new releases'),
+ core_conf['new_release_check'],
+ )
+
+
+class QueuePane(BasePreferencePane):
+ def __init__(self, preferences):
+ BasePreferencePane.__init__(self, ' %s ' % _('Queue'), preferences)
+
+ @overrides(BasePreferencePane)
+ def create_pane(self, core_conf, console_config):
+ self.add_header(_('New Torrents'))
+ self.add_checked_input(
+ 'queue_new_to_top', _('Queue to top'), core_conf['queue_new_to_top']
+ )
+ self.add_header(_('Active Torrents'), True)
+ self.add_int_spin_input(
+ 'max_active_limit',
+ '%s:' % _('Total'),
+ core_conf['max_active_limit'],
+ min_val=-1,
+ max_val=9999,
+ )
+ self.add_int_spin_input(
+ 'max_active_downloading',
+ '%s:' % _('Downloading'),
+ core_conf['max_active_downloading'],
+ min_val=-1,
+ max_val=9999,
+ )
+ self.add_int_spin_input(
+ 'max_active_seeding',
+ '%s:' % _('Seeding'),
+ core_conf['max_active_seeding'],
+ min_val=-1,
+ max_val=9999,
+ )
+ self.add_checked_input(
+ 'dont_count_slow_torrents',
+ 'Ignore slow torrents',
+ core_conf['dont_count_slow_torrents'],
+ )
+ self.add_checked_input(
+ 'auto_manage_prefer_seeds',
+ 'Prefer seeding torrents',
+ core_conf['auto_manage_prefer_seeds'],
+ )
+ self.add_header(_('Seeding Rotation'), space_above=True)
+ self.add_float_spin_input(
+ 'share_ratio_limit',
+ '%s:' % _('Share Ratio'),
+ core_conf['share_ratio_limit'],
+ precision=2,
+ min_val=-1.0,
+ max_val=100.0,
+ )
+ self.add_float_spin_input(
+ 'seed_time_ratio_limit',
+ '%s:' % _('Time Ratio'),
+ core_conf['seed_time_ratio_limit'],
+ precision=2,
+ min_val=-1.0,
+ max_val=100.0,
+ )
+ self.add_int_spin_input(
+ 'seed_time_limit',
+ '%s:' % _('Time (m)'),
+ core_conf['seed_time_limit'],
+ min_val=1,
+ max_val=10000,
+ )
+ seedratio = FloatSpinInput(
+ self.mode,
+ 'stop_seed_ratio',
+ '',
+ self.move,
+ core_conf['stop_seed_ratio'],
+ precision=2,
+ inc_amt=0.1,
+ min_val=0.5,
+ max_val=100.0,
+ )
+ self.add_checkedplus_input(
+ 'stop_seed_at_ratio',
+ '%s:' % _('Share Ratio Reached'),
+ seedratio,
+ core_conf['stop_seed_at_ratio'],
+ )
+ self.add_checked_input(
+ 'remove_seed_at_ratio',
+ _('Remove torrent (Unchecked pauses torrent)'),
+ core_conf['remove_seed_at_ratio'],
+ )
+
+
+class ProxyPane(BasePreferencePane):
+ def __init__(self, preferences):
+ BasePreferencePane.__init__(self, ' %s ' % _('Proxy'), preferences)
+
+ @overrides(BasePreferencePane)
+ def create_pane(self, core_conf, console_config):
+ proxy = core_conf['proxy']
+
+ self.add_header(_('Proxy Settings'))
+ self.add_header(_('Proxy'), space_above=True)
+ self.add_int_spin_input(
+ 'proxy_type', '%s:' % _('Type'), proxy['type'], min_val=0, max_val=5
+ )
+ self.add_text_input('proxy_username', '%s:' % _('Username'), proxy['username'])
+ self.add_text_input('proxy_password', '%s:' % _('Password'), proxy['password'])
+ self.add_text_input('proxy_hostname', '%s:' % _('Hostname'), proxy['hostname'])
+ self.add_int_spin_input(
+ 'proxy_port', '%s:' % _('Port'), proxy['port'], min_val=0, max_val=65535
+ )
+ self.add_checked_input(
+ 'proxy_hostnames', _('Proxy Hostnames'), proxy['proxy_hostnames']
+ )
+ self.add_checked_input(
+ 'proxy_peer_connections', _('Proxy Peers'), proxy['proxy_peer_connections']
+ )
+ self.add_checked_input(
+ 'proxy_tracker_connections',
+ _('Proxy Trackers'),
+ proxy['proxy_tracker_connections'],
+ )
+ self.add_header('%s' % _('Force Proxy'), space_above=True)
+ self.add_checked_input('force_proxy', _('Force Proxy'), proxy['force_proxy'])
+ self.add_checked_input(
+ 'anonymous_mode', _('Hide Client Identity'), proxy['anonymous_mode']
+ )
+ self.add_header('%s' % _('Proxy Type Help'), space_above=True)
+ self.add_text_area(
+ 'proxy_text_area',
+ ' 0: None 1: Socks4\n'
+ ' 2: Socks5 3: Socks5 Auth\n'
+ ' 4: HTTP 5: HTTP Auth\n'
+ ' 6: I2P',
+ )
+
+
+class CachePane(BasePreferencePane):
+ def __init__(self, preferences):
+ BasePreferencePane.__init__(self, ' %s ' % _('Cache'), preferences)
+ self.created = False
+
+ @overrides(BasePreferencePane)
+ def create_pane(self, core_conf, console_config):
+ self.core_conf = core_conf
+
+ def build_pane(self, core_conf, status):
+ self.created = True
+ self.add_header(_('Settings'), space_below=True)
+ self.add_int_spin_input(
+ 'cache_size',
+ '%s:' % _('Cache Size (16 KiB blocks)'),
+ core_conf['cache_size'],
+ min_val=0,
+ max_val=99999,
+ )
+ self.add_int_spin_input(
+ 'cache_expiry',
+ '%s:' % _('Cache Expiry (seconds)'),
+ core_conf['cache_expiry'],
+ min_val=1,
+ max_val=32000,
+ )
+ self.add_header(' %s' % _('Write'), space_above=True)
+ self.add_info_field(
+ 'blocks_written',
+ ' %s:' % _('Blocks Written'),
+ status['disk.num_blocks_written'],
+ )
+ self.add_info_field(
+ 'writes', ' %s:' % _('Writes'), status['disk.num_write_ops']
+ )
+ self.add_info_field(
+ 'write_hit_ratio',
+ ' %s:' % _('Write Cache Hit Ratio'),
+ '%.2f' % status['write_hit_ratio'],
+ )
+ self.add_header(' %s' % _('Read'))
+ self.add_info_field(
+ 'blocks_read', ' %s:' % _('Blocks Read'), status['disk.num_blocks_read']
+ )
+ self.add_info_field(
+ 'blocks_read_hit',
+ ' %s:' % _('Blocks Read hit'),
+ status['disk.num_blocks_cache_hits'],
+ )
+ self.add_info_field('reads', ' %s:' % _('Reads'), status['disk.num_read_ops'])
+ self.add_info_field(
+ 'read_hit_ratio',
+ ' %s:' % _('Read Cache Hit Ratio'),
+ '%.2f' % status['read_hit_ratio'],
+ )
+ self.add_header(' %s' % _('Size'))
+ self.add_info_field(
+ 'cache_size_info',
+ ' %s:' % _('Cache Size'),
+ status['disk.disk_blocks_in_use'],
+ )
+ self.add_info_field(
+ 'read_cache_size',
+ ' %s:' % _('Read Cache Size'),
+ status['disk.read_cache_blocks'],
+ )
+
+ @overrides(BasePreferencePane)
+ def update(self, active):
+ if active:
+ client.core.get_session_status(DISK_CACHE_KEYS).addCallback(
+ self.update_cache_status_fields
+ )
+
+ def update_cache_status_fields(self, status):
+ if not self.created:
+ self.build_pane(self.core_conf, status)
+ else:
+ for ipt in self.inputs:
+ if not ipt.has_input() and ipt.name in status:
+ ipt.set_value(status[ipt.name])
+ self.preferences.refresh()
diff --git a/deluge/ui/console/modes/preferences/preferences.py b/deluge/ui/console/modes/preferences/preferences.py
new file mode 100644
index 0000000..45a39a6
--- /dev/null
+++ b/deluge/ui/console/modes/preferences/preferences.py
@@ -0,0 +1,379 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+from collections import deque
+
+import deluge.component as component
+from deluge.decorators import overrides
+from deluge.ui.client import client
+from deluge.ui.console.modes.basemode import BaseMode
+from deluge.ui.console.modes.preferences.preference_panes import (
+ BandwidthPane,
+ CachePane,
+ DaemonPane,
+ DownloadsPane,
+ InterfacePane,
+ NetworkPane,
+ OtherPane,
+ ProxyPane,
+ QueuePane,
+)
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.widgets.fields import SelectInput
+from deluge.ui.console.widgets.popup import MessagePopup, PopupsHandler
+from deluge.ui.console.widgets.sidebar import Sidebar
+
+try:
+ import curses
+except ImportError:
+ pass
+
+
+log = logging.getLogger(__name__)
+
+
+# Big help string that gets displayed when the user hits 'h'
+HELP_STR = """This screen lets you view and configure various options in deluge.
+
+There are three main sections to this screen. Only one section is active at a time. \
+You can switch the active section by hitting TAB (or Shift-TAB to go back one)
+
+The section on the left displays the various categories that the settings fall in. \
+You can navigate the list using the up/down arrows
+
+The section on the right shows the settings for the selected category. When this \
+section is active you can navigate the various settings with the up/down arrows. \
+Special keys for each input type are described below.
+
+The final section is at the bottom right, the: [Cancel] [Apply] [OK] buttons.
+When this section is active, simply select the option you want using the arrow
+keys and press Enter to confim.
+
+
+Special keys for various input types are as follows:
+- For text inputs you can simply type in the value.
+
+{|indent: |}- For numeric inputs (indicated by the value being in []s), you can type a value, \
+or use PageUp and PageDown to increment/decrement the value.
+
+- For checkbox inputs use the spacebar to toggle
+
+{|indent: |}- For checkbox plus something else inputs (the something else being only visible \
+when you check the box) you can toggle the check with space, use the right \
+arrow to edit the other value, and escape to get back to the check box.
+
+"""
+
+
+class ZONE(object):
+ length = 3
+ CATEGORIES, PREFRENCES, ACTIONS = list(range(length))
+
+
+class PreferenceSidebar(Sidebar):
+ def __init__(self, torrentview, width):
+ height = curses.LINES - 2
+ Sidebar.__init__(
+ self, torrentview, width, height, title=None, border_off_north=1
+ )
+ self.categories = [
+ _('Interface'),
+ _('Downloads'),
+ _('Network'),
+ _('Bandwidth'),
+ _('Other'),
+ _('Daemon'),
+ _('Queue'),
+ _('Proxy'),
+ _('Cache'),
+ ]
+ for name in self.categories:
+ self.add_text_field(
+ name,
+ name,
+ selectable=True,
+ font_unfocused_active='bold',
+ color_unfocused_active='white,black',
+ )
+
+ def on_resize(self):
+ self.resize_window(curses.LINES - 2, self.width)
+
+
+class Preferences(BaseMode, PopupsHandler):
+ def __init__(self, parent_mode, stdscr, console_config, encoding=None):
+ BaseMode.__init__(self, stdscr, encoding=encoding, do_refresh=False)
+ PopupsHandler.__init__(self)
+ self.parent_mode = parent_mode
+ self.cur_cat = 0
+ self.messages = deque()
+ self.action_input = None
+ self.config_loaded = False
+ self.console_config = console_config
+ self.active_port = -1
+ self.active_zone = ZONE.CATEGORIES
+ self.sidebar_width = 15 # Width of the categories pane
+
+ self.sidebar = PreferenceSidebar(parent_mode, self.sidebar_width)
+ self.sidebar.set_focused(True)
+ self.sidebar.active_input = 0
+
+ self._calc_sizes(resize=False)
+
+ self.panes = [
+ InterfacePane(self),
+ DownloadsPane(self),
+ NetworkPane(self),
+ BandwidthPane(self),
+ OtherPane(self),
+ DaemonPane(self),
+ QueuePane(self),
+ ProxyPane(self),
+ CachePane(self),
+ ]
+
+ self.action_input = SelectInput(
+ self, None, None, [_('Cancel'), _('Apply'), _('OK')], [0, 1, 2], 0
+ )
+
+ def load_config(self):
+ if self.config_loaded:
+ return
+
+ def on_get_config(core_config):
+ self.core_config = core_config
+ self.config_loaded = True
+ for p in self.panes:
+ p.create_pane(core_config, self.console_config)
+ self.refresh()
+
+ client.core.get_config().addCallback(on_get_config)
+
+ def on_get_listen_port(port):
+ self.active_port = port
+
+ client.core.get_listen_port().addCallback(on_get_listen_port)
+
+ @property
+ def height(self):
+ # top/bottom bars: 2, Action buttons (Cancel/Apply/OK): 1
+ return self.rows - 3
+
+ @property
+ def width(self):
+ return self.prefs_width
+
+ def _calc_sizes(self, resize=True):
+ self.prefs_width = self.cols - self.sidebar_width
+
+ if not resize:
+ return
+
+ for p in self.panes:
+ p.resize_window(self.height, p.pane_width)
+
+ def _draw_preferences(self):
+ self.cur_cat = self.sidebar.active_input
+ self.panes[self.cur_cat].render(
+ self, self.stdscr, self.prefs_width, self.active_zone == ZONE.PREFRENCES
+ )
+ self.panes[self.cur_cat].refresh()
+
+ def _draw_actions(self):
+ selected = self.active_zone == ZONE.ACTIONS
+ self.stdscr.hline(self.rows - 3, self.sidebar_width, b'_', self.cols)
+ self.action_input.render(
+ self.stdscr,
+ self.rows - 2,
+ width=self.cols,
+ active=selected,
+ focus=True,
+ col=self.cols - 22,
+ )
+
+ @overrides(BaseMode)
+ def on_resize(self, rows, cols):
+ BaseMode.on_resize(self, rows, cols)
+ self._calc_sizes()
+
+ if self.popup:
+ self.popup.handle_resize()
+
+ self.sidebar.on_resize()
+ self.refresh()
+
+ @overrides(component.Component)
+ def update(self):
+ for i, p in enumerate(self.panes):
+ self.panes[i].update(i == self.cur_cat)
+
+ @overrides(BaseMode)
+ def resume(self):
+ BaseMode.resume(self)
+ self.sidebar.show()
+
+ @overrides(BaseMode)
+ def refresh(self):
+ if (
+ not component.get('ConsoleUI').is_active_mode(self)
+ or not self.config_loaded
+ ):
+ return
+
+ if self.popup is None and self.messages:
+ title, msg = self.messages.popleft()
+ self.push_popup(MessagePopup(self, title, msg))
+
+ self.stdscr.erase()
+ self.draw_statusbars()
+ self._draw_actions()
+ # Necessary to force updating the stdscr
+ self.stdscr.noutrefresh()
+
+ self.sidebar.refresh()
+
+ # do this last since it moves the cursor
+ self._draw_preferences()
+
+ if self.popup:
+ self.popup.refresh()
+
+ curses.doupdate()
+
+ def _apply_prefs(self):
+ if self.core_config is None:
+ return
+
+ def update_conf_value(key, source_dict, dest_dict, updated):
+ if dest_dict[key] != source_dict[key]:
+ dest_dict[key] = source_dict[key]
+ updated = True
+ return updated
+
+ new_core_config = {}
+ for pane in self.panes:
+ if not isinstance(pane, InterfacePane):
+ pane.add_config_values(new_core_config)
+ # Apply Core Prefs
+ if client.connected():
+ # Only do this if we're connected to a daemon
+ config_to_set = {}
+ for key in new_core_config:
+ # The values do not match so this needs to be updated
+ if self.core_config[key] != new_core_config[key]:
+ config_to_set[key] = new_core_config[key]
+
+ if config_to_set:
+ # Set each changed config value in the core
+ client.core.set_config(config_to_set)
+ client.force_call(True)
+ # Update the configuration
+ self.core_config.update(config_to_set)
+
+ # Update Interface Prefs
+ new_console_config = {}
+ didupdate = False
+ for pane in self.panes:
+ # could just access panes by index, but that would break if panes
+ # are ever reordered, so do it the slightly slower but safer way
+ if isinstance(pane, InterfacePane):
+ pane.add_config_values(new_console_config)
+ for k in ['ring_bell', 'language']:
+ didupdate = update_conf_value(
+ k, new_console_config, self.console_config, didupdate
+ )
+ for k in ['separate_complete', 'move_selection']:
+ didupdate = update_conf_value(
+ k,
+ new_console_config,
+ self.console_config['torrentview'],
+ didupdate,
+ )
+ for k in [
+ 'ignore_duplicate_lines',
+ 'save_command_history',
+ 'third_tab_lists_all',
+ 'torrents_per_tab_press',
+ ]:
+ didupdate = update_conf_value(
+ k, new_console_config, self.console_config['cmdline'], didupdate
+ )
+
+ if didupdate:
+ self.parent_mode.on_config_changed()
+
+ def _update_preferences(self, core_config):
+ self.core_config = core_config
+ for pane in self.panes:
+ pane.update_values(core_config)
+
+ def _actions_read(self, c):
+ self.action_input.handle_read(c)
+ if c in [curses.KEY_ENTER, util.KEY_ENTER2]:
+ # take action
+ if self.action_input.selected_index == 0: # Cancel
+ self.back_to_parent()
+ elif self.action_input.selected_index == 1: # Apply
+ self._apply_prefs()
+ client.core.get_config().addCallback(self._update_preferences)
+ elif self.action_input.selected_index == 2: # OK
+ self._apply_prefs()
+ self.back_to_parent()
+
+ def back_to_parent(self):
+ component.get('ConsoleUI').set_mode(self.parent_mode.mode_name)
+
+ @overrides(BaseMode)
+ def read_input(self):
+ c = self.stdscr.getch()
+
+ if self.popup:
+ if self.popup.handle_read(c):
+ self.pop_popup()
+ self.refresh()
+ return
+
+ if util.is_printable_chr(c):
+ char = chr(c)
+ if char == 'Q':
+ component.get('ConsoleUI').quit()
+ elif char == 'h':
+ self.push_popup(MessagePopup(self, 'Preferences Help', HELP_STR))
+
+ if self.sidebar.has_focus() and c == util.KEY_ESC:
+ self.back_to_parent()
+ return
+
+ def update_active_zone(val):
+ self.active_zone += val
+ if self.active_zone == -1:
+ self.active_zone = ZONE.length - 1
+ else:
+ self.active_zone %= ZONE.length
+ self.sidebar.set_focused(self.active_zone == ZONE.CATEGORIES)
+
+ if c == util.KEY_TAB:
+ update_active_zone(1)
+ elif c == curses.KEY_BTAB:
+ update_active_zone(-1)
+ else:
+ if self.active_zone == ZONE.CATEGORIES:
+ self.sidebar.handle_read(c)
+ elif self.active_zone == ZONE.PREFRENCES:
+ self.panes[self.cur_cat].handle_read(c)
+ elif self.active_zone == ZONE.ACTIONS:
+ self._actions_read(c)
+
+ self.refresh()
+
+ def is_active_pane(self, pane):
+ return pane == self.panes[self.cur_cat]
diff --git a/deluge/ui/console/modes/torrentdetail.py b/deluge/ui/console/modes/torrentdetail.py
new file mode 100644
index 0000000..d02a0d3
--- /dev/null
+++ b/deluge/ui/console/modes/torrentdetail.py
@@ -0,0 +1,1026 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import logging
+
+import deluge.component as component
+from deluge.common import fsize
+from deluge.decorators import overrides
+from deluge.ui.client import client
+from deluge.ui.common import FILE_PRIORITY
+from deluge.ui.console.modes.basemode import BaseMode
+from deluge.ui.console.modes.torrentlist.torrentactions import (
+ ACTION,
+ torrent_actions_popup,
+)
+from deluge.ui.console.utils import colors
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.utils.column import get_column_value, torrent_data_fields
+from deluge.ui.console.utils.format_utils import (
+ format_priority,
+ format_progress,
+ format_row,
+)
+from deluge.ui.console.widgets.popup import (
+ InputPopup,
+ MessagePopup,
+ PopupsHandler,
+ SelectablePopup,
+)
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+
+# Big help string that gets displayed when the user hits 'h'
+HELP_STR = """\
+This screen shows detailed information about a torrent, and also the \
+information about the individual files in the torrent.
+
+You can navigate the file list with the Up/Down arrows and use space to \
+collapse/expand the file tree.
+
+All popup windows can be closed/canceled by hitting the Esc key \
+(you might need to wait a second for an Esc to register)
+
+The actions you can perform and the keys to perform them are as follows:
+
+{!info!}'h'{!normal!} - Show this help
+
+{!info!}'a'{!normal!} - Show torrent actions popup. Here you can do things like \
+pause/resume, recheck, set torrent options and so on.
+
+{!info!}'r'{!normal!} - Rename currently highlighted folder or a file. You can't \
+rename multiple files at once so you need to first clear your selection \
+with {!info!}'c'{!normal!}
+
+{!info!}'m'{!normal!} - Mark or unmark a file or a folder
+{!info!}'c'{!normal!} - Un-mark all files
+
+{!info!}Space{!normal!} - Expand/Collapse currently selected folder
+
+{!info!}Enter{!normal!} - Show priority popup in which you can set the \
+download priority of selected files and folders.
+
+{!info!}Left Arrow{!normal!} - Go back to torrent overview.
+"""
+
+
+class TorrentDetail(BaseMode, PopupsHandler):
+ def __init__(self, parent_mode, stdscr, console_config, encoding=None):
+ PopupsHandler.__init__(self)
+ self.console_config = console_config
+ self.parent_mode = parent_mode
+ self.torrentid = None
+ self.torrent_state = None
+ self._status_keys = [
+ 'files',
+ 'name',
+ 'state',
+ 'download_payload_rate',
+ 'upload_payload_rate',
+ 'progress',
+ 'eta',
+ 'all_time_download',
+ 'total_uploaded',
+ 'ratio',
+ 'num_seeds',
+ 'total_seeds',
+ 'num_peers',
+ 'total_peers',
+ 'active_time',
+ 'seeding_time',
+ 'time_added',
+ 'distributed_copies',
+ 'num_pieces',
+ 'piece_length',
+ 'download_location',
+ 'file_progress',
+ 'file_priorities',
+ 'message',
+ 'total_wanted',
+ 'tracker_host',
+ 'owner',
+ 'seed_rank',
+ 'last_seen_complete',
+ 'completed_time',
+ 'time_since_transfer',
+ 'super_seeding',
+ ]
+ self.file_list = None
+ self.current_file = None
+ self.current_file_idx = 0
+ self.file_off = 0
+ self.more_to_draw = False
+ self.full_names = None
+ self.column_string = ''
+ self.files_sep = None
+ self.marked = {}
+
+ BaseMode.__init__(self, stdscr, encoding)
+ self.column_names = ['Filename', 'Size', 'Progress', 'Priority']
+ self.__update_columns()
+
+ self._listing_start = self.rows // 2
+ self._listing_space = self._listing_start - self._listing_start
+
+ client.register_event_handler(
+ 'TorrentFileRenamedEvent', self._on_torrentfilerenamed_event
+ )
+ client.register_event_handler(
+ 'TorrentFolderRenamedEvent', self._on_torrentfolderrenamed_event
+ )
+ client.register_event_handler(
+ 'TorrentRemovedEvent', self._on_torrentremoved_event
+ )
+
+ util.safe_curs_set(util.Curser.INVISIBLE)
+ self.stdscr.notimeout(0)
+
+ def set_torrent_id(self, torrentid):
+ self.torrentid = torrentid
+ self.file_list = None
+
+ def back_to_overview(self):
+ component.get('ConsoleUI').set_mode(self.parent_mode.mode_name)
+
+ @overrides(component.Component)
+ def start(self):
+ self.update()
+
+ @overrides(component.Component)
+ def update(self, torrentid=None):
+ if torrentid:
+ self.set_torrent_id(torrentid)
+
+ if self.torrentid:
+ component.get('SessionProxy').get_torrent_status(
+ self.torrentid, self._status_keys
+ ).addCallback(self.set_state)
+
+ @overrides(BaseMode)
+ def pause(self):
+ self.set_torrent_id(None)
+
+ @overrides(BaseMode)
+ def on_resize(self, rows, cols):
+ BaseMode.on_resize(self, rows, cols)
+ self.__update_columns()
+ if self.popup:
+ self.popup.handle_resize()
+
+ self._listing_start = self.rows // 2
+ self.refresh()
+
+ def set_state(self, state):
+
+ if state.get('files'):
+ self.full_names = {x['index']: x['path'] for x in state['files']}
+
+ need_prio_update = False
+ if not self.file_list:
+ # don't keep getting the files once we've got them once
+ if state.get('files'):
+ self.files_sep = '{!green,black,bold,underline!}%s' % (
+ ('Files (torrent has %d files)' % len(state['files'])).center(
+ self.cols
+ )
+ )
+ self.file_list, self.file_dict = self.build_file_list(
+ state['files'], state['file_progress'], state['file_priorities']
+ )
+ else:
+ self.files_sep = '{!green,black,bold,underline!}%s' % (
+ ('Files (File list unknown)').center(self.cols)
+ )
+ need_prio_update = True
+
+ self.__fill_progress(self.file_list, state['file_progress'])
+
+ for i, prio in enumerate(state['file_priorities']):
+ if self.file_dict[i][6] != prio:
+ need_prio_update = True
+ self.file_dict[i][6] = prio
+ if need_prio_update and self.file_list:
+ self.__fill_prio(self.file_list)
+ del state['file_progress']
+ del state['file_priorities']
+ self.torrent_state = state
+ self.refresh()
+
+ def build_file_list(self, torrent_files, progress, priority):
+ """ Split file list from torrent state into a directory tree.
+
+ Returns:
+
+ Tuple:
+ A list of lists in the form:
+ [file/dir_name, index, size, children, expanded, progress, priority]
+
+ Dictionary:
+ Map of file index for fast updating of progress and priorities.
+ """
+
+ file_list = []
+ file_dict = {}
+ # directory index starts from total file count.
+ dir_idx = len(torrent_files)
+ for torrent_file in torrent_files:
+ cur = file_list
+ paths = torrent_file['path'].split('/')
+ for path in paths:
+ if not cur or path != cur[-1][0]:
+ child_list = []
+ if path == paths[-1]:
+ file_progress = format_progress(
+ progress[torrent_file['index']] * 100
+ )
+ entry = [
+ path,
+ torrent_file['index'],
+ torrent_file['size'],
+ child_list,
+ False,
+ file_progress,
+ priority[torrent_file['index']],
+ ]
+ file_dict[torrent_file['index']] = entry
+ else:
+ entry = [path, dir_idx, -1, child_list, False, 0, -1]
+ file_dict[dir_idx] = entry
+ dir_idx += 1
+ cur.append(entry)
+ cur = child_list
+ else:
+ cur = cur[-1][3]
+ self.__build_sizes(file_list)
+ self.__fill_progress(file_list, progress)
+
+ return file_list, file_dict
+
+ # fill in the sizes of the directory entries based on their children
+ def __build_sizes(self, fs):
+ ret = 0
+ for f in fs:
+ if f[2] == -1:
+ val = self.__build_sizes(f[3])
+ ret += val
+ f[2] = val
+ else:
+ ret += f[2]
+ return ret
+
+ # fills in progress fields in all entries based on progs
+ # returns the # of bytes complete in all the children of fs
+ def __fill_progress(self, fs, progs):
+ if not progs:
+ return 0
+ tb = 0
+ for f in fs:
+ if f[3]: # dir, has some children
+ bd = self.__fill_progress(f[3], progs)
+ f[5] = format_progress(bd // f[2] * 100)
+ else: # file, update own prog and add to total
+ bd = f[2] * progs[f[1]]
+ f[5] = format_progress(progs[f[1]] * 100)
+ tb += bd
+ return tb
+
+ def __fill_prio(self, fs):
+ for f in fs:
+ if f[3]: # dir, so fill in children and compute our prio
+ self.__fill_prio(f[3])
+ child_prios = [e[6] for e in f[3]]
+ if len(child_prios) > 1:
+ f[6] = -2 # mixed
+ else:
+ f[6] = child_prios.pop(0)
+
+ def __update_columns(self):
+ self.column_widths = [-1, 15, 15, 20]
+ req = sum(col_width for col_width in self.column_widths if col_width >= 0)
+ if req > self.cols: # can't satisfy requests, just spread out evenly
+ cw = self.cols // len(self.column_names)
+ for i in range(0, len(self.column_widths)):
+ self.column_widths[i] = cw
+ else:
+ rem = self.cols - req
+ var_cols = len(
+ [col_width for col_width in self.column_widths if col_width < 0]
+ )
+ vw = rem // var_cols
+ for i in range(0, len(self.column_widths)):
+ if self.column_widths[i] < 0:
+ self.column_widths[i] = vw
+
+ self.column_string = '{!green,black,bold!}%s' % (
+ ''.join(
+ [
+ '%s%s'
+ % (
+ self.column_names[i],
+ ' ' * (self.column_widths[i] - len(self.column_names[i])),
+ )
+ for i in range(0, len(self.column_names))
+ ]
+ )
+ )
+
+ def _on_torrentremoved_event(self, torrent_id):
+ if torrent_id == self.torrentid:
+ self.back_to_overview()
+
+ def _on_torrentfilerenamed_event(self, torrent_id, index, new_name):
+ if torrent_id == self.torrentid:
+ self.file_dict[index][0] = new_name.split('/')[-1]
+ component.get('SessionProxy').get_torrent_status(
+ self.torrentid, self._status_keys
+ ).addCallback(self.set_state)
+
+ def _on_torrentfolderrenamed_event(self, torrent_id, old_folder, new_folder):
+ if torrent_id == self.torrentid:
+ fe = None
+ fl = None
+ for i in old_folder.strip('/').split('/'):
+ if not fl:
+ fe = fl = self.file_list
+ s = [files for files in fl if files[0].strip('/') == i][0]
+ fe = s
+ fl = s[3]
+ fe[0] = new_folder.strip('/').rpartition('/')[-1]
+
+ # self.__get_file_by_name(old_folder, self.file_list)[0] = new_folder.strip('/')
+ component.get('SessionProxy').get_torrent_status(
+ self.torrentid, self._status_keys
+ ).addCallback(self.set_state)
+
+ def draw_files(self, files, depth, off, idx):
+
+ color_selected = 'blue'
+ color_partially_selected = 'magenta'
+ color_highlighted = 'white'
+ for fl in files:
+ # from sys import stderr
+ # print >> stderr, fl[6]
+ # kick out if we're going to draw too low on the screen
+ if off >= self.rows - 1:
+ self.more_to_draw = True
+ return -1, -1
+
+ # default color values
+ fg = 'white'
+ bg = 'black'
+ attr = ''
+
+ priority_fg_color = {
+ -2: 'white', # Mixed
+ 0: 'red', # Skip
+ 1: 'yellow', # Low
+ 2: 'yellow',
+ 3: 'yellow',
+ 4: 'white', # Normal
+ 5: 'green',
+ 6: 'green',
+ 7: 'green', # High
+ }
+
+ fg = priority_fg_color[fl[6]]
+
+ if idx >= self.file_off:
+ # set fg/bg colors based on whether the file is selected/marked or not
+
+ if fl[1] in self.marked:
+ bg = color_selected
+ if fl[3]:
+ if self.marked[fl[1]] < self.__get_contained_files_count(
+ file_list=fl[3]
+ ):
+ bg = color_partially_selected
+ attr = 'bold'
+
+ if idx == self.current_file_idx:
+ self.current_file = fl
+ bg = color_highlighted
+ if fl[1] in self.marked:
+ fg = color_selected
+ if fl[3]:
+ if self.marked[fl[1]] < self.__get_contained_files_count(
+ file_list=fl[3]
+ ):
+ fg = color_partially_selected
+ else:
+ if fg == 'white':
+ fg = 'black'
+ attr = 'bold'
+
+ if attr:
+ color_string = '{!%s,%s,%s!}' % (fg, bg, attr)
+ else:
+ color_string = '{!%s,%s!}' % (fg, bg)
+
+ # actually draw the dir/file string
+ if fl[3] and fl[4]: # this is an expanded directory
+ xchar = 'v'
+ elif fl[3]: # collapsed directory
+ xchar = '>'
+ else: # file
+ xchar = '-'
+
+ r = format_row(
+ [
+ '%s%s %s' % (' ' * depth, xchar, fl[0]),
+ fsize(fl[2]),
+ fl[5],
+ format_priority(fl[6]),
+ ],
+ self.column_widths,
+ )
+
+ self.add_string(off, '%s%s' % (color_string, r), trim=False)
+ off += 1
+
+ if fl[3] and fl[4]:
+ # recurse if we have children and are expanded
+ off, idx = self.draw_files(fl[3], depth + 1, off, idx + 1)
+ if off < 0:
+ return (off, idx)
+ else:
+ idx += 1
+
+ return (off, idx)
+
+ def __get_file_list_length(self, file_list=None):
+ """
+ Counts length of the displayed file list.
+ """
+ if file_list is None:
+ file_list = self.file_list
+ length = 0
+ if file_list:
+ for element in file_list:
+ length += 1
+ if element[3] and element[4]:
+ length += self.__get_file_list_length(element[3])
+ return length
+
+ def __get_contained_files_count(self, file_list=None, idx=None):
+ length = 0
+ if file_list is None:
+ file_list = self.file_list
+ if idx is not None:
+ for element in file_list:
+ if element[1] == idx:
+ return self.__get_contained_files_count(file_list=element[3])
+ elif element[3]:
+ c = self.__get_contained_files_count(file_list=element[3], idx=idx)
+ if c > 0:
+ return c
+ else:
+ for element in file_list:
+ length += 1
+ if element[3]:
+ length -= 1
+ length += self.__get_contained_files_count(element[3])
+ return length
+
+ def render_header(self, row):
+ status = self.torrent_state
+
+ download_color = '{!info!}'
+ if status['download_payload_rate'] > 0:
+ download_color = colors.state_color['Downloading']
+
+ def add_field(name, row, pre_color='{!info!}', post_color='{!input!}'):
+ s = '%s%s: %s%s' % (
+ pre_color,
+ torrent_data_fields[name]['name'],
+ post_color,
+ get_column_value(name, status),
+ )
+ if row:
+ row = self.add_string(row, s)
+ return row
+ return s
+
+ # Name
+ row = add_field('name', row)
+ # State
+ row = add_field('state', row)
+
+ # Print DL info and ETA
+ s = add_field('downloaded', 0, download_color)
+ if status['progress'] != 100.0:
+ s += '/%s' % fsize(status['total_wanted'])
+ if status['download_payload_rate'] > 0:
+ s += ' {!yellow!}@ %s%s' % (
+ download_color,
+ fsize(status['download_payload_rate']),
+ )
+ s += add_field('eta', 0)
+ if s:
+ row = self.add_string(row, s)
+
+ # Print UL info and ratio
+ s = add_field('uploaded', 0, download_color)
+ if status['upload_payload_rate'] > 0:
+ s += ' {!yellow!}@ %s%s' % (
+ colors.state_color['Seeding'],
+ fsize(status['upload_payload_rate']),
+ )
+ s += ' ' + add_field('ratio', 0)
+ row = self.add_string(row, s)
+
+ # Seed/peer info
+ s = '{!info!}%s:{!green!} %s {!input!}(%s)' % (
+ torrent_data_fields['seeds']['name'],
+ status['num_seeds'],
+ status['total_seeds'],
+ )
+ row = self.add_string(row, s)
+ s = '{!info!}%s:{!red!} %s {!input!}(%s)' % (
+ torrent_data_fields['peers']['name'],
+ status['num_peers'],
+ status['total_peers'],
+ )
+ row = self.add_string(row, s)
+
+ # Tracker
+ tracker_color = '{!green!}' if status['message'] == 'OK' else '{!red!}'
+ s = '{!info!}%s: {!magenta!}%s{!input!} says "%s%s{!input!}"' % (
+ torrent_data_fields['tracker']['name'],
+ status['tracker_host'],
+ tracker_color,
+ status['message'],
+ )
+ row = self.add_string(row, s)
+
+ # Pieces and availability
+ s = '{!info!}%s: {!yellow!}%s {!input!}x {!yellow!}%s' % (
+ torrent_data_fields['pieces']['name'],
+ status['num_pieces'],
+ fsize(status['piece_length']),
+ )
+ if status['distributed_copies']:
+ s += '{!info!}%s: {!input!}%s' % (
+ torrent_data_fields['seed_rank']['name'],
+ status['seed_rank'],
+ )
+ row = self.add_string(row, s)
+
+ # Time added
+ row = add_field('time_added', row)
+ # Time active
+ row = add_field('active_time', row)
+ if status['seeding_time']:
+ row = add_field('seeding_time', row)
+ # Download Folder
+ row = add_field('download_location', row)
+ # Seed Rank
+ row = add_field('seed_rank', row)
+ # Super Seeding
+ row = add_field('super_seeding', row)
+ # Last seen complete
+ row = add_field('last_seen_complete', row)
+ # Last activity
+ row = add_field('time_since_transfer', row)
+ # Owner
+ if status['owner']:
+ row = add_field('owner', row)
+ return row
+ # Last act
+
+ @overrides(BaseMode)
+ def refresh(self, lines=None):
+ # Update the status bars
+ self.stdscr.erase()
+ self.draw_statusbars()
+
+ row = 1
+ if self.torrent_state:
+ row = self.render_header(row)
+ else:
+ self.add_string(1, 'Waiting for torrent state')
+
+ row += 1
+
+ if self.files_sep:
+ self.add_string(row, self.files_sep)
+ row += 1
+
+ self._listing_start = row
+ self._listing_space = self.rows - self._listing_start
+
+ self.add_string(row, self.column_string)
+ if self.file_list:
+ row += 1
+ self.more_to_draw = False
+ self.draw_files(self.file_list, 0, row, 0)
+
+ if not component.get('ConsoleUI').is_active_mode(self):
+ return
+
+ self.stdscr.noutrefresh()
+
+ if self.popup:
+ self.popup.refresh()
+
+ curses.doupdate()
+
+ def expcol_cur_file(self):
+ """
+ Expand or collapse current file
+ """
+ self.current_file[4] = not self.current_file[4]
+ self.refresh()
+
+ def file_list_down(self, rows=1):
+ maxlen = self.__get_file_list_length() - 1
+
+ self.current_file_idx += rows
+
+ if self.current_file_idx > maxlen:
+ self.current_file_idx = maxlen
+
+ if self.current_file_idx > self.file_off + (self._listing_space - 3):
+ self.file_off = self.current_file_idx - (self._listing_space - 3)
+
+ self.refresh()
+
+ def file_list_up(self, rows=1):
+ self.current_file_idx = max(0, self.current_file_idx - rows)
+ self.file_off = min(self.file_off, self.current_file_idx)
+ self.refresh()
+
+ # build list of priorities for all files in the torrent
+ # based on what is currently selected and a selected priority.
+ def build_prio_list(self, files, ret_list, parent_prio, selected_prio):
+ # has a priority been set on my parent (if so, I inherit it)
+ for f in files:
+ # Do not set priorities for the whole dir, just selected contents
+ if f[3]:
+ self.build_prio_list(f[3], ret_list, parent_prio, selected_prio)
+ else: # file, need to add to list
+ if f[1] in self.marked or parent_prio >= 0:
+ # selected (or parent selected), use requested priority
+ ret_list.append((f[1], selected_prio))
+ else:
+ # not selected, just keep old priority
+ ret_list.append((f[1], f[6]))
+
+ def do_priority(self, priority, was_empty):
+ plist = []
+ self.build_prio_list(self.file_list, plist, -1, priority)
+ plist.sort()
+ priorities = [p[1] for p in plist]
+ client.core.set_torrent_options(
+ [self.torrentid], {'file_priorities': priorities}
+ )
+
+ if was_empty:
+ self.marked = {}
+ return True
+
+ # show popup for priority selections
+ def show_priority_popup(self, was_empty):
+ def popup_func(name, data, was_empty, **kwargs):
+ if not name:
+ return
+ return self.do_priority(data[name], was_empty)
+
+ if self.marked:
+ popup = SelectablePopup(
+ self,
+ 'Set File Priority',
+ popup_func,
+ border_off_north=1,
+ cb_args={'was_empty': was_empty},
+ )
+ popup.add_line(
+ 'skip_priority',
+ '_Skip',
+ foreground='red',
+ cb_arg=FILE_PRIORITY['Low'],
+ was_empty=was_empty,
+ )
+ popup.add_line(
+ 'low_priority', '_Low', cb_arg=FILE_PRIORITY['Low'], foreground='yellow'
+ )
+ popup.add_line('normal_priority', '_Normal', cb_arg=FILE_PRIORITY['Normal'])
+ popup.add_line(
+ 'high_priority',
+ '_High',
+ cb_arg=FILE_PRIORITY['High'],
+ foreground='green',
+ )
+ popup._selected = 1
+ self.push_popup(popup)
+
+ def __mark_unmark(self, idx):
+ """
+ Selects or unselects file or a catalog(along with contained files)
+ """
+ fc = self.__get_contained_files_count(idx=idx)
+ if idx not in self.marked:
+ # Not selected, select it
+ self.__mark_tree(self.file_list, idx)
+ elif self.marked[idx] < fc:
+ # Partially selected, unselect all contents
+ self.__unmark_tree(self.file_list, idx)
+ else:
+ # Selected, unselect it
+ self.__unmark_tree(self.file_list, idx)
+
+ def __mark_tree(self, file_list, idx, mark_all=False):
+ """
+ Given file_list of TorrentDetail and index of file or folder,
+ recursively selects all files contained
+ as well as marks folders higher in hierarchy as partially selected
+ """
+ total_marked = 0
+ for element in file_list:
+ marked = 0
+ # Select the file if it's the one we want or
+ # if it's inside a directory that got selected
+ if (element[1] == idx) or mark_all:
+ # If it's a folder then select everything inside
+ if element[3]:
+ marked = self.__mark_tree(element[3], idx, True)
+ self.marked[element[1]] = marked
+ else:
+ marked = 1
+ self.marked[element[1]] = 1
+ else:
+ # Does not match but the item to be selected might be inside, recurse
+ if element[3]:
+ marked = self.__mark_tree(element[3], idx, False)
+ # Partially select the folder if it contains files that were selected
+ if marked > 0:
+ self.marked[element[1]] = marked
+ else:
+ if element[1] in self.marked:
+ # It's not the element we want but it's marked so count it
+ marked = 1
+ # Count and then return total amount of files selected in all subdirectories
+ total_marked += marked
+
+ return total_marked
+
+ def __get_file_by_num(self, num, file_list, idx=0):
+ for element in file_list:
+ if idx == num:
+ return element
+ if element[3] and element[4]:
+ i = self.__get_file_by_num(num, element[3], idx + 1)
+ if not isinstance(i, int):
+ return i
+ idx = i
+ else:
+ idx += 1
+ return idx
+
+ def __get_file_by_name(self, name, file_list, idx=0):
+ for element in file_list:
+ if element[0].strip('/') == name.strip('/'):
+ return element
+ if element[3] and element[4]:
+ i = self.__get_file_by_name(name, element[3], idx + 1)
+ if not isinstance(i, int):
+ return i
+ else:
+ idx = i
+ else:
+ idx += 1
+ return idx
+
+ def __unmark_tree(self, file_list, idx, unmark_all=False):
+ """
+ Given file_list of TorrentDetail and index of file or folder,
+ recursively deselects all files contained
+ as well as marks folders higher in hierarchy as unselected or partially selected
+ """
+ total_marked = 0
+ for element in file_list:
+ marked = 0
+ # It's either the item we want to select or
+ # a contained item, deselect it
+ if (element[1] == idx) or unmark_all:
+ if element[1] in self.marked:
+ del self.marked[element[1]]
+ # Deselect all contents if it's a catalog
+ if element[3]:
+ self.__unmark_tree(element[3], idx, True)
+ else:
+ # Not file we wanted but it might be inside this folder, recurse inside
+ if element[3]:
+ marked = self.__unmark_tree(element[3], idx, False)
+ # If none of the contents remain selected, unselect this folder as well
+ if marked == 0:
+ if element[1] in self.marked:
+ del self.marked[element[1]]
+ # Otherwise update selection count
+ else:
+ self.marked[element[1]] = marked
+ else:
+ if element[1] in self.marked:
+ marked = 1
+
+ # Count and then return selection count so we can update
+ # directories higher up in the hierarchy
+ total_marked += marked
+ return total_marked
+
+ def _selection_to_file_idx(self, file_list=None, idx=0, true_idx=0, closed=False):
+ if not file_list:
+ file_list = self.file_list
+
+ for element in file_list:
+ if idx == self.current_file_idx:
+ return true_idx
+
+ # It's a folder
+ if element[3]:
+ i = self._selection_to_file_idx(
+ element[3], idx + 1, true_idx, closed or not element[4]
+ )
+ if isinstance(i, tuple):
+ idx, true_idx = i
+ if element[4]:
+ idx, true_idx = i
+ else:
+ idx += 1
+ tmp, true_idx = i
+ else:
+ return i
+ else:
+ if not closed:
+ idx += 1
+ true_idx += 1
+
+ return (idx, true_idx)
+
+ def _get_full_folder_path(self, num, file_list=None, path='', idx=0):
+ if not file_list:
+ file_list = self.file_list
+
+ for element in file_list:
+ if not element[3]:
+ idx += 1
+ continue
+ if num == idx:
+ return '%s%s/' % (path, element[0])
+ if element[4]:
+ i = self._get_full_folder_path(
+ num, element[3], path + element[0] + '/', idx + 1
+ )
+ if not isinstance(i, int):
+ return i
+ idx = i
+ else:
+ idx += 1
+ return idx
+
+ def _do_rename_folder(self, torrent_id, folder, new_folder):
+ client.core.rename_folder(torrent_id, folder, new_folder)
+
+ def _do_rename_file(self, torrent_id, file_idx, new_filename):
+ if not new_filename:
+ return
+ client.core.rename_files(torrent_id, [(file_idx, new_filename)])
+
+ def _show_rename_popup(self):
+ # Perhaps in the future: Renaming multiple files
+ if self.marked:
+ self.report_message(
+ 'Error (Enter to close)',
+ 'Sorry, you cannot rename multiple files, please clear '
+ 'selection with {!info!}"c"{!normal!} key',
+ )
+ else:
+ _file = self.__get_file_by_num(self.current_file_idx, self.file_list)
+ old_filename = _file[0]
+ idx = self._selection_to_file_idx()
+ tid = self.torrentid
+
+ if _file[3]:
+
+ def do_rename(result, **kwargs):
+ if (
+ not result
+ or not result['new_foldername']['value']
+ or kwargs.get('close', False)
+ ):
+ self.popup.close(None, call_cb=False)
+ return
+ old_fname = self._get_full_folder_path(self.current_file_idx)
+ new_fname = '%s/%s/' % (
+ old_fname.strip('/').rpartition('/')[0],
+ result['new_foldername']['value'],
+ )
+ self._do_rename_folder(tid, old_fname, new_fname)
+
+ popup = InputPopup(
+ self, 'Rename folder (Esc to cancel)', close_cb=do_rename
+ )
+ popup.add_text_input(
+ 'new_foldername',
+ 'Enter new folder name:',
+ old_filename.strip('/'),
+ complete=True,
+ )
+ self.push_popup(popup)
+ else:
+
+ def do_rename(result, **kwargs):
+ if (
+ not result
+ or not result['new_filename']['value']
+ or kwargs.get('close', False)
+ ):
+ self.popup.close(None, call_cb=False)
+ return
+ fname = '%s/%s' % (
+ self.full_names[idx].rpartition('/')[0],
+ result['new_filename']['value'],
+ )
+ self._do_rename_file(tid, idx, fname)
+
+ popup = InputPopup(self, ' Rename file ', close_cb=do_rename)
+ popup.add_text_input(
+ 'new_filename', 'Enter new filename:', old_filename, complete=True
+ )
+ self.push_popup(popup)
+
+ @overrides(BaseMode)
+ def read_input(self):
+ c = self.stdscr.getch()
+
+ if self.popup:
+ ret = self.popup.handle_read(c)
+ if ret != util.ReadState.IGNORED and self.popup.closed():
+ self.pop_popup()
+ self.refresh()
+ return
+
+ if c in [util.KEY_ESC, curses.KEY_LEFT, ord('q')]:
+ self.back_to_overview()
+ return util.ReadState.READ
+
+ if not self.torrent_state:
+ # actions below only make sense if there is a torrent state
+ return
+
+ # Navigate the torrent list
+ if c == curses.KEY_UP:
+ self.file_list_up()
+ elif c == curses.KEY_PPAGE:
+ self.file_list_up(self._listing_space - 2)
+ elif c == curses.KEY_HOME:
+ self.file_off = 0
+ self.current_file_idx = 0
+ elif c == curses.KEY_DOWN:
+ self.file_list_down()
+ elif c == curses.KEY_NPAGE:
+ self.file_list_down(self._listing_space - 2)
+ elif c == curses.KEY_END:
+ self.current_file_idx = self.__get_file_list_length() - 1
+ self.file_off = self.current_file_idx - (self._listing_space - 3)
+ elif c == curses.KEY_DC:
+ torrent_actions_popup(self, [self.torrentid], action=ACTION.REMOVE)
+ elif c in [curses.KEY_ENTER, util.KEY_ENTER2]:
+ was_empty = self.marked == {}
+ self.__mark_tree(self.file_list, self.current_file[1])
+ self.show_priority_popup(was_empty)
+ elif c == util.KEY_SPACE:
+ self.expcol_cur_file()
+ elif c == ord('m'):
+ if self.current_file:
+ self.__mark_unmark(self.current_file[1])
+ elif c == ord('r'):
+ self._show_rename_popup()
+ elif c == ord('c'):
+ self.marked = {}
+ elif c == ord('a'):
+ torrent_actions_popup(self, [self.torrentid], details=False)
+ return
+ elif c == ord('o'):
+ torrent_actions_popup(self, [self.torrentid], action=ACTION.TORRENT_OPTIONS)
+ return
+ elif c == ord('h'):
+ self.push_popup(MessagePopup(self, 'Help', HELP_STR, width_req=0.75))
+ elif c == ord('j'):
+ self.file_list_up()
+ elif c == ord('k'):
+ self.file_list_down()
+
+ self.refresh()
diff --git a/deluge/ui/console/modes/torrentlist/__init__.py b/deluge/ui/console/modes/torrentlist/__init__.py
new file mode 100644
index 0000000..18c4db3
--- /dev/null
+++ b/deluge/ui/console/modes/torrentlist/__init__.py
@@ -0,0 +1,20 @@
+from __future__ import unicode_literals
+
+
+class ACTION(object):
+ PAUSE = 'pause'
+ RESUME = 'resume'
+ REANNOUNCE = 'update_tracker'
+ EDIT_TRACKERS = 3
+ RECHECK = 'force_recheck'
+ REMOVE = 'remove_torrent'
+ REMOVE_DATA = 6
+ REMOVE_NODATA = 7
+ DETAILS = 'torrent_details'
+ MOVE_STORAGE = 'move_download_folder'
+ QUEUE = 'queue'
+ QUEUE_TOP = 'queue_top'
+ QUEUE_UP = 'queue_up'
+ QUEUE_DOWN = 'queue_down'
+ QUEUE_BOTTOM = 'queue_bottom'
+ TORRENT_OPTIONS = 'torrent_options'
diff --git a/deluge/ui/console/modes/torrentlist/add_torrents_popup.py b/deluge/ui/console/modes/torrentlist/add_torrents_popup.py
new file mode 100644
index 0000000..b0ac483
--- /dev/null
+++ b/deluge/ui/console/modes/torrentlist/add_torrents_popup.py
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.common
+from deluge.ui.client import client
+from deluge.ui.console.widgets.popup import InputPopup, SelectablePopup
+
+log = logging.getLogger(__name__)
+
+
+def report_add_status(torrentlist, succ_cnt, fail_cnt, fail_msgs):
+ if fail_cnt == 0:
+ torrentlist.report_message(
+ 'Torrents Added', '{!success!}Successfully added %d torrent(s)' % succ_cnt
+ )
+ else:
+ msg = (
+ '{!error!}Failed to add the following %d torrent(s):\n {!input!}' % fail_cnt
+ ) + '\n '.join(fail_msgs)
+ if succ_cnt != 0:
+ msg += '\n \n{!success!}Successfully added %d torrent(s)' % succ_cnt
+ torrentlist.report_message('Torrent Add Report', msg)
+
+
+def show_torrent_add_popup(torrentlist):
+ def do_add_from_url(data=None, **kwargs):
+ torrentlist.pop_popup()
+ if not data or kwargs.get('close', False):
+ return
+
+ def fail_cb(msg, url):
+ log.debug('failed to add torrent: %s: %s', url, msg)
+ error_msg = '{!input!} * %s: {!error!}%s' % (url, msg)
+ report_add_status(torrentlist, 0, 1, [error_msg])
+
+ def success_cb(tid, url):
+ if tid:
+ log.debug('added torrent: %s (%s)', url, tid)
+ report_add_status(torrentlist, 1, 0, [])
+ else:
+ fail_cb('Already in session (probably)', url)
+
+ url = data['url']['value']
+ if not url:
+ return
+
+ t_options = {
+ 'download_location': data['path']['value'],
+ 'add_paused': data['add_paused']['value'],
+ }
+
+ if deluge.common.is_magnet(url):
+ client.core.add_torrent_magnet(url, t_options).addCallback(
+ success_cb, url
+ ).addErrback(fail_cb, url)
+ elif deluge.common.is_url(url):
+ client.core.add_torrent_url(url, t_options).addCallback(
+ success_cb, url
+ ).addErrback(fail_cb, url)
+ else:
+ torrentlist.report_message(
+ 'Error', '{!error!}Invalid URL or magnet link: %s' % url
+ )
+ return
+
+ log.debug(
+ 'Adding Torrent(s): %s (dl path: %s) (paused: %d)',
+ url,
+ data['path']['value'],
+ data['add_paused']['value'],
+ )
+
+ def show_add_url_popup():
+ add_paused = 1 if 'add_paused' in torrentlist.coreconfig else 0
+ popup = InputPopup(
+ torrentlist, 'Add Torrent (Esc to cancel)', close_cb=do_add_from_url
+ )
+ popup.add_text_input('url', 'Enter torrent URL or Magnet link:')
+ popup.add_text_input(
+ 'path',
+ 'Enter save path:',
+ torrentlist.coreconfig.get('download_location', ''),
+ complete=True,
+ )
+ popup.add_select_input(
+ 'add_paused', 'Add Paused:', ['Yes', 'No'], [True, False], add_paused
+ )
+ torrentlist.push_popup(popup)
+
+ def option_chosen(selected, *args, **kwargs):
+ if not selected or selected == 'cancel':
+ torrentlist.pop_popup()
+ return
+ if selected == 'file':
+ torrentlist.consoleui.set_mode('AddTorrents')
+ elif selected == 'url':
+ show_add_url_popup()
+
+ popup = SelectablePopup(torrentlist, 'Add torrent', option_chosen)
+ popup.add_line('file', '- From _File(s)', use_underline=True)
+ popup.add_line('url', '- From _URL or Magnet', use_underline=True)
+ popup.add_line('cancel', '- _Cancel', use_underline=True)
+ torrentlist.push_popup(popup, clear=True)
diff --git a/deluge/ui/console/modes/torrentlist/filtersidebar.py b/deluge/ui/console/modes/torrentlist/filtersidebar.py
new file mode 100644
index 0000000..0f39b5c
--- /dev/null
+++ b/deluge/ui/console/modes/torrentlist/filtersidebar.py
@@ -0,0 +1,134 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import curses
+import logging
+
+from deluge.component import Component
+from deluge.decorators import overrides
+from deluge.ui.client import client
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.widgets import BaseInputPane
+from deluge.ui.console.widgets.sidebar import Sidebar
+
+log = logging.getLogger(__name__)
+
+
+class FilterSidebar(Sidebar, Component):
+ """The sidebar in the main torrentview
+
+ Shows the different states of the torrents and allows to filter the
+ torrents based on state.
+
+ """
+
+ def __init__(self, torrentlist, config):
+ self.config = config
+ height = curses.LINES - 2
+ width = self.config['torrentview']['sidebar_width']
+ Sidebar.__init__(
+ self,
+ torrentlist,
+ width,
+ height,
+ title=' Filter ',
+ border_off_north=1,
+ allow_resize=True,
+ )
+ Component.__init__(self, 'FilterSidebar')
+ self.checked_index = 0
+ kwargs = {
+ 'checked_char': '*',
+ 'unchecked_char': '-',
+ 'checkbox_format': ' %s ',
+ 'col': 0,
+ }
+ self.add_checked_input('All', 'All', checked=True, **kwargs)
+ self.add_checked_input('Active', 'Active', **kwargs)
+ self.add_checked_input(
+ 'Downloading', 'Downloading', color='green,black', **kwargs
+ )
+ self.add_checked_input('Seeding', 'Seeding', color='cyan,black', **kwargs)
+ self.add_checked_input('Paused', 'Paused', **kwargs)
+ self.add_checked_input('Error', 'Error', color='red,black', **kwargs)
+ self.add_checked_input('Checking', 'Checking', color='blue,black', **kwargs)
+ self.add_checked_input('Queued', 'Queued', **kwargs)
+ self.add_checked_input(
+ 'Allocating', 'Allocating', color='yellow,black', **kwargs
+ )
+ self.add_checked_input('Moving', 'Moving', color='green,black', **kwargs)
+
+ @overrides(Component)
+ def update(self):
+ if not self.hidden() and client.connected():
+ d = client.core.get_filter_tree(True, []).addCallback(
+ self._cb_update_filter_tree
+ )
+
+ def on_filter_tree_updated(changed):
+ if changed:
+ self.refresh()
+
+ d.addCallback(on_filter_tree_updated)
+
+ def _cb_update_filter_tree(self, filter_items):
+ """Callback function on client.core.get_filter_tree"""
+ states = filter_items['state']
+ largest_count = 0
+ largest_state_width = 0
+ for state in states:
+ largest_state_width = max(len(state[0]), largest_state_width)
+ largest_count = max(int(state[1]), largest_count)
+
+ border_and_spacing = 6 # Account for border + whitespace
+ filter_state_width = largest_state_width
+ filter_count_width = self.width - filter_state_width - border_and_spacing
+
+ changed = False
+ for state in states:
+ field = self.get_input(state[0])
+ if field:
+ txt = (
+ '%%-%ds%%%ds'
+ % (filter_state_width, filter_count_width)
+ % (state[0], state[1])
+ )
+ if field.set_message(txt):
+ changed = True
+ return changed
+
+ @overrides(BaseInputPane)
+ def immediate_action_cb(self, state_changed=True):
+ if state_changed:
+ self.parent.torrentview.set_torrent_filter(
+ self.inputs[self.active_input].name
+ )
+
+ @overrides(Sidebar)
+ def handle_read(self, c):
+ if c == util.KEY_SPACE:
+ if self.checked_index != self.active_input:
+ self.inputs[self.checked_index].set_value(False)
+ Sidebar.handle_read(self, c)
+ self.checked_index = self.active_input
+ return util.ReadState.READ
+ else:
+ return Sidebar.handle_read(self, c)
+
+ @overrides(Sidebar)
+ def on_resize(self, width):
+ sidebar_width = self.config['torrentview']['sidebar_width']
+ if sidebar_width != width:
+ self.config['torrentview']['sidebar_width'] = width
+ self.config.save()
+ self.resize_window(self.height, width)
+ self.parent.toggle_sidebar()
+ self.refresh()
diff --git a/deluge/ui/console/modes/torrentlist/queue_mode.py b/deluge/ui/console/modes/torrentlist/queue_mode.py
new file mode 100644
index 0000000..0c44aaf
--- /dev/null
+++ b/deluge/ui/console/modes/torrentlist/queue_mode.py
@@ -0,0 +1,157 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.ui.client import client
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.widgets.popup import MessagePopup, SelectablePopup
+
+from . import ACTION
+
+try:
+ import curses
+except ImportError:
+ pass
+
+key_to_action = {
+ curses.KEY_HOME: ACTION.QUEUE_TOP,
+ curses.KEY_UP: ACTION.QUEUE_UP,
+ curses.KEY_DOWN: ACTION.QUEUE_DOWN,
+ curses.KEY_END: ACTION.QUEUE_BOTTOM,
+}
+QUEUE_MODE_HELP_STR = """
+Change queue position of selected torrents
+
+{!info!}'+'{!normal!} - {|indent_pos:|}Move up
+{!info!}'-'{!normal!} - {|indent_pos:|}Move down
+
+{!info!}'Home'{!normal!} - {|indent_pos:|}Move to top
+{!info!}'End'{!normal!} - {|indent_pos:|}Move to bottom
+
+"""
+
+
+class QueueMode(object):
+ def __init__(self, torrentslist, torrent_ids):
+ self.torrentslist = torrentslist
+ self.torrentview = torrentslist.torrentview
+ self.torrent_ids = torrent_ids
+
+ def set_statusbar_args(self, statusbar_args):
+ statusbar_args[
+ 'bottombar'
+ ] = '{!black,white!}Queue mode: change queue position of selected torrents.'
+ statusbar_args['bottombar_help'] = ' Press [h] for help'
+
+ def update_cursor(self):
+ pass
+
+ def update_colors(self, tidx, colors):
+ pass
+
+ def handle_read(self, c):
+ if c in [util.KEY_ESC, util.KEY_BELL]: # If Escape key or CTRL-g, we abort
+ self.torrentslist.set_minor_mode(None)
+ elif c == ord('h'):
+ popup = MessagePopup(
+ self.torrentslist,
+ 'Help',
+ QUEUE_MODE_HELP_STR,
+ width_req=0.65,
+ border_off_west=1,
+ )
+ self.torrentslist.push_popup(popup, clear=True)
+ elif c in [
+ curses.KEY_UP,
+ curses.KEY_DOWN,
+ curses.KEY_HOME,
+ curses.KEY_END,
+ curses.KEY_NPAGE,
+ curses.KEY_PPAGE,
+ ]:
+ action = key_to_action[c]
+ self.do_queue(action)
+
+ def move_selection(self, cb_arg, qact):
+ if self.torrentslist.config['torrentview']['move_selection'] is False:
+ return
+ queue_length = 0
+ selected_num = 0
+ for tid in self.torrentview.curstate:
+ tq = self.torrentview.curstate[tid]['queue']
+ if tq != -1:
+ queue_length += 1
+ if tq in self.torrentview.marked:
+ selected_num += 1
+ if qact == ACTION.QUEUE_TOP:
+ if self.torrentview.marked:
+ self.torrentview.cursel = 1 + sorted(self.torrentview.marked).index(
+ self.torrentview.cursel
+ )
+ else:
+ self.torrentview.cursel = 1
+ self.torrentview.marked = list(range(1, selected_num + 1))
+ elif qact == ACTION.QUEUE_UP:
+ self.torrentview.cursel = max(1, self.torrentview.cursel - 1)
+ self.torrentview.marked = [marked - 1 for marked in self.torrentview.marked]
+ self.torrentview.marked = [
+ marked for marked in self.torrentview.marked if marked > 0
+ ]
+ elif qact == ACTION.QUEUE_DOWN:
+ self.torrentview.cursel = min(queue_length, self.torrentview.cursel + 1)
+ self.torrentview.marked = [marked + 1 for marked in self.torrentview.marked]
+ self.torrentview.marked = [
+ marked for marked in self.torrentview.marked if marked <= queue_length
+ ]
+ elif qact == ACTION.QUEUE_BOTTOM:
+ if self.torrentview.marked:
+ self.torrentview.cursel = (
+ queue_length
+ - selected_num
+ + 1
+ + sorted(self.torrentview.marked).index(self.torrentview.cursel)
+ )
+ else:
+ self.torrentview.cursel = queue_length
+ self.torrentview.marked = list(
+ range(queue_length - selected_num + 1, queue_length + 1)
+ )
+
+ def do_queue(self, qact, *args, **kwargs):
+ if qact == ACTION.QUEUE_TOP:
+ client.core.queue_top(self.torrent_ids).addCallback(
+ self.move_selection, qact
+ )
+ elif qact == ACTION.QUEUE_BOTTOM:
+ client.core.queue_bottom(self.torrent_ids).addCallback(
+ self.move_selection, qact
+ )
+ elif qact == ACTION.QUEUE_UP:
+ client.core.queue_up(self.torrent_ids).addCallback(
+ self.move_selection, qact
+ )
+ elif qact == ACTION.QUEUE_DOWN:
+ client.core.queue_down(self.torrent_ids).addCallback(
+ self.move_selection, qact
+ )
+
+ def popup(self, **kwargs):
+ popup = SelectablePopup(
+ self.torrentslist,
+ 'Queue Action',
+ self.do_queue,
+ cb_args=kwargs,
+ border_off_west=1,
+ )
+ popup.add_line(ACTION.QUEUE_TOP, '_Top')
+ popup.add_line(ACTION.QUEUE_UP, '_Up')
+ popup.add_line(ACTION.QUEUE_DOWN, '_Down')
+ popup.add_line(ACTION.QUEUE_BOTTOM, '_Bottom')
+ self.torrentslist.push_popup(popup)
diff --git a/deluge/ui/console/modes/torrentlist/search_mode.py b/deluge/ui/console/modes/torrentlist/search_mode.py
new file mode 100644
index 0000000..57a8e5f
--- /dev/null
+++ b/deluge/ui/console/modes/torrentlist/search_mode.py
@@ -0,0 +1,210 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.common import PY2
+from deluge.decorators import overrides
+from deluge.ui.console.modes.basemode import InputKeyHandler, move_cursor
+from deluge.ui.console.modes.torrentlist.torrentactions import torrent_actions_popup
+from deluge.ui.console.utils import curses_util as util
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+QUEUE_MODE_HELP_STR = """
+Change queue position of selected torrents
+
+{!info!}'+'{!normal!} - {|indent_pos:|}Move up
+{!info!}'-'{!normal!} - {|indent_pos:|}Move down
+
+{!info!}'Home'{!normal!} - {|indent_pos:|}Move to top
+{!info!}'End'{!normal!} - {|indent_pos:|}Move to bottom
+
+"""
+SEARCH_EMPTY = 0
+SEARCH_FAILING = 1
+SEARCH_SUCCESS = 2
+SEARCH_START_REACHED = 3
+SEARCH_END_REACHED = 4
+SEARCH_FORMAT = {
+ SEARCH_EMPTY: '{!black,white!}Search torrents: %s{!black,white!}',
+ SEARCH_SUCCESS: '{!black,white!}Search torrents: {!black,green!}%s{!black,white!}',
+ SEARCH_FAILING: '{!black,white!}Search torrents: {!black,red!}%s{!black,white!}',
+ SEARCH_START_REACHED: '{!black,white!}Search torrents: {!black,yellow!}%s{!black,white!} (start reached)',
+ SEARCH_END_REACHED: '{!black,white!}Search torrents: {!black,yellow!}%s{!black,white!} (end reached)',
+}
+
+
+class SearchMode(InputKeyHandler):
+ def __init__(self, torrentlist):
+ super(SearchMode, self).__init__()
+ self.torrentlist = torrentlist
+ self.torrentview = torrentlist.torrentview
+ self.search_state = SEARCH_EMPTY
+ self.search_string = ''
+
+ def update_cursor(self):
+ util.safe_curs_set(util.Curser.VERY_VISIBLE)
+ move_cursor(
+ self.torrentlist.stdscr,
+ self.torrentlist.rows - 1,
+ len(self.search_string) + 17,
+ )
+
+ def set_statusbar_args(self, statusbar_args):
+ statusbar_args['bottombar'] = (
+ SEARCH_FORMAT[self.search_state] % self.search_string
+ )
+ statusbar_args['bottombar_help'] = False
+
+ def update_colors(self, tidx, colors):
+ if len(self.search_string) > 1:
+ lcase_name = self.torrentview.torrent_names[tidx].lower()
+ sstring_lower = self.search_string.lower()
+ if lcase_name.find(sstring_lower) != -1:
+ if tidx == self.torrentview.cursel:
+ pass
+ elif tidx in self.torrentview.marked:
+ colors['bg'] = 'magenta'
+ else:
+ colors['bg'] = 'green'
+ if colors['fg'] == 'green':
+ colors['fg'] = 'black'
+ colors['attr'] = 'bold'
+
+ def do_search(self, direction='first'):
+ """
+ Performs a search on visible torrent and sets cursor to the match
+
+ Args:
+ direction (str): The direction to search. Must be one of 'first', 'last', 'next' or 'previous'
+
+ """
+ search_space = list(enumerate(self.torrentview.torrent_names))
+
+ if direction == 'last':
+ search_space = reversed(search_space)
+ elif direction == 'next':
+ search_space = search_space[self.torrentview.cursel + 1 :]
+ elif direction == 'previous':
+ search_space = reversed(search_space[: self.torrentview.cursel])
+
+ search_string = self.search_string.lower()
+ for i, n in search_space:
+ n = n.lower()
+ if n.find(search_string) != -1:
+ self.torrentview.cursel = i
+ if (
+ self.torrentview.curoff
+ + self.torrentview.torrent_rows
+ - self.torrentview.torrentlist_offset
+ ) < self.torrentview.cursel:
+ self.torrentview.curoff = (
+ self.torrentview.cursel - self.torrentview.torrent_rows + 1
+ )
+ elif (self.torrentview.curoff + 1) > self.torrentview.cursel:
+ self.torrentview.curoff = max(0, self.torrentview.cursel)
+ self.search_state = SEARCH_SUCCESS
+ return
+ if direction in ['first', 'last']:
+ self.search_state = SEARCH_FAILING
+ elif direction == 'next':
+ self.search_state = SEARCH_END_REACHED
+ elif direction == 'previous':
+ self.search_state = SEARCH_START_REACHED
+
+ @overrides(InputKeyHandler)
+ def handle_read(self, c):
+ cname = self.torrentview.torrent_names[self.torrentview.cursel]
+ refresh = True
+
+ if c in [
+ util.KEY_ESC,
+ util.KEY_BELL,
+ ]: # If Escape key or CTRL-g, we abort search
+ self.torrentlist.set_minor_mode(None)
+ self.search_state = SEARCH_EMPTY
+ elif c in [curses.KEY_BACKSPACE, util.KEY_BACKSPACE2]:
+ if self.search_string:
+ self.search_string = self.search_string[:-1]
+ if cname.lower().find(self.search_string.lower()) != -1:
+ self.search_state = SEARCH_SUCCESS
+ else:
+ self.torrentlist.set_minor_mode(None)
+ self.search_state = SEARCH_EMPTY
+ elif c == curses.KEY_DC:
+ self.search_string = ''
+ self.search_state = SEARCH_SUCCESS
+ elif c == curses.KEY_UP:
+ self.do_search('previous')
+ elif c == curses.KEY_DOWN:
+ self.do_search('next')
+ elif c == curses.KEY_LEFT:
+ self.torrentlist.set_minor_mode(None)
+ self.search_state = SEARCH_EMPTY
+ elif c == ord('/'):
+ self.torrentlist.set_minor_mode(None)
+ self.search_state = SEARCH_EMPTY
+ elif c == curses.KEY_RIGHT:
+ tid = self.torrentview.current_torrent_id()
+ self.torrentlist.show_torrent_details(tid)
+ refresh = False
+ elif c == curses.KEY_HOME:
+ self.do_search('first')
+ elif c == curses.KEY_END:
+ self.do_search('last')
+ elif c in [10, curses.KEY_ENTER]:
+ self.last_mark = -1
+ tid = self.torrentview.current_torrent_id()
+ torrent_actions_popup(self.torrentlist, [tid], details=True)
+ refresh = False
+ elif c == util.KEY_ESC:
+ self.search_string = ''
+ self.search_state = SEARCH_EMPTY
+ elif c > 31 and c < 256:
+ old_search_string = self.search_string
+ stroke = chr(c)
+ uchar = '' if PY2 else stroke
+ while not uchar:
+ try:
+ uchar = stroke.decode(self.torrentlist.encoding)
+ except UnicodeDecodeError:
+ c = self.torrentlist.stdscr.getch()
+ stroke += chr(c)
+
+ if uchar:
+ self.search_string += uchar
+
+ still_matching = (
+ cname.lower().find(self.search_string.lower())
+ == cname.lower().find(old_search_string.lower())
+ and cname.lower().find(self.search_string.lower()) != -1
+ )
+
+ if self.search_string and not still_matching:
+ self.do_search()
+ elif self.search_string:
+ self.search_state = SEARCH_SUCCESS
+ else:
+ refresh = False
+
+ if not self.search_string:
+ self.search_state = SEARCH_EMPTY
+ refresh = True
+
+ if refresh:
+ self.torrentlist.refresh([])
+
+ return util.ReadState.READ
diff --git a/deluge/ui/console/modes/torrentlist/torrentactions.py b/deluge/ui/console/modes/torrentlist/torrentactions.py
new file mode 100644
index 0000000..f3cd395
--- /dev/null
+++ b/deluge/ui/console/modes/torrentlist/torrentactions.py
@@ -0,0 +1,276 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+
+from twisted.internet import defer
+
+import deluge.component as component
+from deluge.ui.client import client
+from deluge.ui.common import TORRENT_DATA_FIELD
+from deluge.ui.console.modes.torrentlist.queue_mode import QueueMode
+from deluge.ui.console.utils import colors
+from deluge.ui.console.utils.common import TORRENT_OPTIONS
+from deluge.ui.console.widgets.popup import InputPopup, MessagePopup, SelectablePopup
+
+from . import ACTION
+
+log = logging.getLogger(__name__)
+
+
+def action_error(error, mode):
+ mode.report_message('Error Occurred', error.getErrorMessage())
+ mode.refresh()
+
+
+def action_remove(mode=None, torrent_ids=None, **kwargs):
+ def do_remove(*args, **kwargs):
+ data = args[0] if args else None
+ if data is None or kwargs.get('close', False):
+ mode.pop_popup()
+ return True
+
+ mode.torrentview.clear_marked()
+ remove_data = data['remove_files']['value']
+
+ def on_removed_finished(errors):
+ if errors:
+ error_msgs = ''
+ for t_id, e_msg in errors:
+ error_msgs += 'Error removing torrent %s : %s\n' % (t_id, e_msg)
+ mode.report_message(
+ 'Error(s) occured when trying to delete torrent(s).', error_msgs
+ )
+ mode.refresh()
+
+ d = client.core.remove_torrents(torrent_ids, remove_data)
+ d.addCallback(on_removed_finished)
+ mode.pop_popup()
+
+ def got_status(status):
+ return (status['name'], status['state'])
+
+ callbacks = []
+ for tid in torrent_ids:
+ d = client.core.get_torrent_status(tid, ['name', 'state'])
+ callbacks.append(d.addCallback(got_status))
+
+ def remove_dialog(status):
+ status = [t_status[1] for t_status in status]
+
+ if len(torrent_ids) == 1:
+ rem_msg = '{!info!}Remove the following torrent?{!input!}'
+ else:
+ rem_msg = '{!info!}Remove the following %d torrents?{!input!}' % len(
+ torrent_ids
+ )
+
+ show_max = 6
+ for i, (name, state) in enumerate(status):
+ color = colors.state_color[state]
+ rem_msg += '\n %s* {!input!}%s' % (color, name)
+ if i == show_max - 1:
+ if i < len(status) - 1:
+ rem_msg += '\n {!red!}And %i more' % (len(status) - show_max)
+ break
+
+ popup = InputPopup(
+ mode,
+ '(Esc to cancel, Enter to remove)',
+ close_cb=do_remove,
+ border_off_west=1,
+ border_off_north=1,
+ )
+ popup.add_text(rem_msg)
+ popup.add_spaces(1)
+ popup.add_select_input(
+ 'remove_files',
+ '{!info!}Torrent files:',
+ ['Keep', 'Remove'],
+ [False, True],
+ False,
+ )
+ mode.push_popup(popup)
+
+ defer.DeferredList(callbacks).addCallback(remove_dialog)
+
+
+def action_torrent_info(mode=None, torrent_ids=None, **kwargs):
+ popup = MessagePopup(mode, 'Torrent options', 'Querying core, please wait...')
+ mode.push_popup(popup)
+ torrents = torrent_ids
+ options = {}
+
+ def _do_set_torrent_options(torrent_ids, result):
+ options = {}
+ for opt, val in result.items():
+ if val['value'] not in ['multiple', None]:
+ options[opt] = val['value']
+ client.core.set_torrent_options(torrent_ids, options)
+
+ def on_torrent_status(status):
+ for key in status:
+ if key not in options:
+ options[key] = status[key]
+ elif options[key] != status[key]:
+ options[key] = 'multiple'
+
+ def create_popup(status):
+ mode.pop_popup()
+
+ def cb(result, **kwargs):
+ if result is None:
+ return
+ _do_set_torrent_options(torrent_ids, result)
+ if kwargs.get('close', False):
+ mode.pop_popup()
+ return True
+
+ option_popup = InputPopup(
+ mode,
+ ' Set Torrent Options ',
+ close_cb=cb,
+ border_off_west=1,
+ border_off_north=1,
+ base_popup=kwargs.get('base_popup', None),
+ )
+ for field in TORRENT_OPTIONS:
+ caption = '{!info!}' + TORRENT_DATA_FIELD[field]['name']
+ value = options[field]
+ if isinstance(value, ''.__class__):
+ option_popup.add_text_input(field, caption, value)
+ elif isinstance(value, bool):
+ choices = (['Yes', 'No'], [True, False], [True, False].index(value))
+ option_popup.add_select_input(
+ field, caption, choices[0], choices[1], choices[2]
+ )
+ elif isinstance(value, float):
+ option_popup.add_float_spin_input(
+ field, caption, value=value, min_val=-1
+ )
+ elif isinstance(value, int):
+ option_popup.add_int_spin_input(field, caption, value=value, min_val=-1)
+
+ mode.push_popup(option_popup)
+
+ callbacks = []
+ for tid in torrents:
+ deferred = component.get('SessionProxy').get_torrent_status(
+ tid, list(TORRENT_OPTIONS)
+ )
+ callbacks.append(deferred.addCallback(on_torrent_status))
+
+ callbacks = defer.DeferredList(callbacks)
+ callbacks.addCallback(create_popup)
+
+
+def torrent_action(action, *args, **kwargs):
+ retval = False
+ torrent_ids = kwargs.get('torrent_ids', None)
+ mode = kwargs.get('mode', None)
+
+ if torrent_ids is None:
+ return
+
+ if action == ACTION.PAUSE:
+ log.debug('Pausing torrents: %s', torrent_ids)
+ client.core.pause_torrents(torrent_ids).addErrback(action_error, mode)
+ retval = True
+ elif action == ACTION.RESUME:
+ log.debug('Resuming torrents: %s', torrent_ids)
+ client.core.resume_torrents(torrent_ids).addErrback(action_error, mode)
+ retval = True
+ elif action == ACTION.QUEUE:
+ queue_mode = QueueMode(mode, torrent_ids)
+ queue_mode.popup(**kwargs)
+ elif action == ACTION.REMOVE:
+ action_remove(**kwargs)
+ retval = True
+ elif action == ACTION.MOVE_STORAGE:
+
+ def do_move(res, **kwargs):
+ if res is None or kwargs.get('close', False):
+ mode.pop_popup()
+ return True
+
+ if os.path.exists(res['path']['value']) and not os.path.isdir(
+ res['path']['value']
+ ):
+ mode.report_message(
+ 'Cannot Move Download Folder',
+ '{!error!}%s exists and is not a directory' % res['path']['value'],
+ )
+ else:
+ log.debug('Moving %s to: %s', torrent_ids, res['path']['value'])
+ client.core.move_storage(torrent_ids, res['path']['value']).addErrback(
+ action_error, mode
+ )
+
+ popup = InputPopup(
+ mode, 'Move Download Folder', close_cb=do_move, border_off_east=1
+ )
+ popup.add_text_input('path', 'Enter path to move to:', complete=True)
+ mode.push_popup(popup)
+ elif action == ACTION.RECHECK:
+ log.debug('Rechecking torrents: %s', torrent_ids)
+ client.core.force_recheck(torrent_ids).addErrback(action_error, mode)
+ retval = True
+ elif action == ACTION.REANNOUNCE:
+ log.debug('Reannouncing torrents: %s', torrent_ids)
+ client.core.force_reannounce(torrent_ids).addErrback(action_error, mode)
+ retval = True
+ elif action == ACTION.DETAILS:
+ log.debug('Torrent details')
+ tid = mode.torrentview.current_torrent_id()
+ if tid:
+ mode.show_torrent_details(tid)
+ else:
+ log.error('No current torrent in _torrentaction, this is a bug')
+ elif action == ACTION.TORRENT_OPTIONS:
+ action_torrent_info(**kwargs)
+
+ return retval
+
+
+# Creates the popup. mode is the calling mode, tids is a list of torrents to take action upon
+def torrent_actions_popup(mode, torrent_ids, details=False, action=None, close_cb=None):
+
+ if action is not None:
+ torrent_action(action, mode=mode, torrent_ids=torrent_ids)
+ return
+
+ popup = SelectablePopup(
+ mode,
+ 'Torrent Actions',
+ torrent_action,
+ cb_args={'mode': mode, 'torrent_ids': torrent_ids},
+ close_cb=close_cb,
+ border_off_north=1,
+ border_off_west=1,
+ border_off_east=1,
+ )
+ popup.add_line(ACTION.PAUSE, '_Pause')
+ popup.add_line(ACTION.RESUME, '_Resume')
+ if details:
+ popup.add_divider()
+ popup.add_line(ACTION.QUEUE, 'Queue')
+ popup.add_divider()
+ popup.add_line(ACTION.REANNOUNCE, '_Update Tracker')
+ popup.add_divider()
+ popup.add_line(ACTION.REMOVE, 'Remo_ve Torrent')
+ popup.add_line(ACTION.RECHECK, '_Force Recheck')
+ popup.add_line(ACTION.MOVE_STORAGE, '_Move Download Folder')
+ popup.add_divider()
+ if details:
+ popup.add_line(ACTION.DETAILS, 'Torrent _Details')
+ popup.add_line(ACTION.TORRENT_OPTIONS, 'Torrent _Options')
+ mode.push_popup(popup)
diff --git a/deluge/ui/console/modes/torrentlist/torrentlist.py b/deluge/ui/console/modes/torrentlist/torrentlist.py
new file mode 100644
index 0000000..a427d65
--- /dev/null
+++ b/deluge/ui/console/modes/torrentlist/torrentlist.py
@@ -0,0 +1,348 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+from collections import deque
+
+import deluge.component as component
+from deluge.component import Component
+from deluge.decorators import overrides
+from deluge.ui.client import client
+from deluge.ui.console.modes.basemode import BaseMode, mkwin
+from deluge.ui.console.modes.torrentlist import torrentview, torrentviewcolumns
+from deluge.ui.console.modes.torrentlist.add_torrents_popup import (
+ show_torrent_add_popup,
+)
+from deluge.ui.console.modes.torrentlist.filtersidebar import FilterSidebar
+from deluge.ui.console.modes.torrentlist.queue_mode import QueueMode
+from deluge.ui.console.modes.torrentlist.search_mode import SearchMode
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.widgets.popup import MessagePopup, PopupsHandler
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+
+
+# Big help string that gets displayed when the user hits 'h'
+HELP_STR = """
+This screen shows an overview of the current torrents Deluge is managing. \
+The currently selected torrent is indicated with a white background. \
+You can change the selected torrent using the up/down arrows or the \
+PgUp/PgDown keys. Home and End keys go to the first and last torrent \
+respectively.
+
+Operations can be performed on multiple torrents by marking them and \
+then hitting Enter. See below for the keys used to mark torrents.
+
+You can scroll a popup window that doesn't fit its content (like \
+this one) using the up/down arrows, PgUp/PgDown and Home/End keys.
+
+All popup windows can be closed/canceled by hitting the Esc key \
+or the 'q' key (does not work for dialogs like the add torrent dialog)
+
+The actions you can perform and the keys to perform them are as follows:
+
+{!info!}'h'{!normal!} - {|indent_pos:|}Show this help
+{!info!}'p'{!normal!} - {|indent_pos:|}Open preferences
+{!info!}'l'{!normal!} - {|indent_pos:|}Enter Command Line mode
+{!info!}'e'{!normal!} - {|indent_pos:|}Show the event log view ({!info!}'q'{!normal!} to go back to overview)
+
+{!info!}'a'{!normal!} - {|indent_pos:|}Add a torrent
+{!info!}Delete{!normal!} - {|indent_pos:|}Delete a torrent
+
+{!info!}'/'{!normal!} - {|indent_pos:|}Search torrent names. \
+Searching starts immediately - matching torrents are highlighted in \
+green, you can cycle through them with Up/Down arrows and Home/End keys \
+You can view torrent details with right arrow, open action popup with \
+Enter key and exit search mode with '/' key, left arrow or \
+backspace with empty search field
+
+{!info!}'f'{!normal!} - {|indent_pos:|}Show only torrents in a certain state
+ (Will open a popup where you can select the state you want to see)
+{!info!}'q'{!normal!} - {|indent_pos:|}Enter queue mode
+
+{!info!}'S'{!normal!} - {|indent_pos:|}Show or hide the sidebar
+
+{!info!}Enter{!normal!} - {|indent_pos:|}Show torrent actions popup. Here you can do things like \
+pause/resume, remove, recheck and so on. These actions \
+apply to all currently marked torrents. The currently \
+selected torrent is automatically marked when you press enter.
+
+{!info!}'o'{!normal!} - {|indent_pos:|}Show and set torrent options - this will either apply \
+to all selected torrents(but not the highlighted one) or currently \
+selected torrent if nothing is selected
+
+{!info!}'Q'{!normal!} - {|indent_pos:|}quit deluge-console
+{!info!}'C'{!normal!} - {|indent_pos:|}show connection manager
+
+{!info!}'m'{!normal!} - {|indent_pos:|}Mark a torrent
+{!info!}'M'{!normal!} - {|indent_pos:|}Mark all torrents between currently selected torrent and last marked torrent
+{!info!}'c'{!normal!} - {|indent_pos:|}Clear selection
+
+{!info!}'v'{!normal!} - {|indent_pos:|}Show a dialog which allows you to choose columns to display
+{!info!}'<' / '>'{!normal!} - {|indent_pos:|}Change column by which to sort torrents
+
+{!info!}Right Arrow{!normal!} - {|indent_pos:|}Torrent Detail Mode. This includes more detailed information \
+about the currently selected torrent, as well as a view of the \
+files in the torrent and the ability to set file priorities.
+
+{!info!}'q'/Esc{!normal!} - {|indent_pos:|}Close a popup (Note that 'q' does not work for dialogs \
+where you input something
+"""
+
+
+class TorrentList(BaseMode, PopupsHandler):
+ def __init__(self, stdscr, encoding=None):
+ BaseMode.__init__(
+ self, stdscr, encoding=encoding, do_refresh=False, depend=['SessionProxy']
+ )
+ PopupsHandler.__init__(self)
+ self.messages = deque()
+ self.last_mark = -1
+ self.go_top = False
+ self.minor_mode = None
+
+ self.consoleui = component.get('ConsoleUI')
+ self.coreconfig = self.consoleui.coreconfig
+ self.config = self.consoleui.config
+ self.sidebar = FilterSidebar(self, self.config)
+ self.torrentview_panel = mkwin(
+ curses.COLOR_GREEN,
+ curses.LINES - 1,
+ curses.COLS - self.sidebar.width,
+ 0,
+ self.sidebar.width,
+ )
+ self.torrentview = torrentview.TorrentView(self, self.config)
+
+ util.safe_curs_set(util.Curser.INVISIBLE)
+ self.stdscr.notimeout(0)
+
+ def torrentview_columns(self):
+ return self.torrentview_panel.getmaxyx()[1]
+
+ def on_config_changed(self):
+ self.config.save()
+ self.torrentview.on_config_changed()
+
+ def toggle_sidebar(self):
+ if self.config['torrentview']['show_sidebar']:
+ self.sidebar.show()
+ self.sidebar.resize_window(curses.LINES - 2, self.sidebar.width)
+ self.torrentview_panel.resize(
+ curses.LINES - 1, curses.COLS - self.sidebar.width
+ )
+ self.torrentview_panel.mvwin(0, self.sidebar.width)
+ else:
+ self.sidebar.hide()
+ self.torrentview_panel.resize(curses.LINES - 1, curses.COLS)
+ self.torrentview_panel.mvwin(0, 0)
+ self.torrentview.update_columns()
+ # After updating the columns widths, clear row cache to recreate them
+ self.torrentview.cached_rows.clear()
+ self.refresh()
+
+ @overrides(Component)
+ def start(self):
+ self.torrentview.on_config_changed()
+ self.toggle_sidebar()
+
+ if self.config['first_run']:
+ self.push_popup(
+ MessagePopup(self, 'Welcome to Deluge', HELP_STR, width_req=0.65)
+ )
+ self.config['first_run'] = False
+ self.config.save()
+
+ if client.connected():
+ self.torrentview.update(refresh=False)
+
+ @overrides(Component)
+ def update(self):
+ if self.mode_paused():
+ return
+
+ if client.connected():
+ self.torrentview.update(refresh=True)
+
+ @overrides(BaseMode)
+ def resume(self):
+ super(TorrentList, self).resume()
+
+ @overrides(BaseMode)
+ def on_resize(self, rows, cols):
+ BaseMode.on_resize(self, rows, cols)
+
+ if self.popup:
+ self.popup.handle_resize()
+
+ if not self.consoleui.is_active_mode(self):
+ return
+
+ self.toggle_sidebar()
+
+ def show_torrent_details(self, tid):
+ mode = self.consoleui.set_mode('TorrentDetail')
+ mode.update(tid)
+
+ def set_minor_mode(self, mode):
+ self.minor_mode = mode
+ self.refresh()
+
+ def _show_visible_columns_popup(self):
+ self.push_popup(torrentviewcolumns.TorrentViewColumns(self))
+
+ @overrides(BaseMode)
+ def refresh(self, lines=None):
+ # Something has requested we scroll to the top of the list
+ if self.go_top:
+ self.torrentview.cursel = 0
+ self.torrentview.curoff = 0
+ self.go_top = False
+
+ if not lines:
+ if not self.consoleui.is_active_mode(self):
+ return
+ self.stdscr.erase()
+
+ self.add_string(1, self.torrentview.column_string, scr=self.torrentview_panel)
+
+ # Update the status bars
+ statusbar_args = {'scr': self.stdscr, 'bottombar_help': True}
+ if self.torrentview.curr_filter is not None:
+ statusbar_args['topbar'] = '%s {!filterstatus!}Current filter: %s' % (
+ self.statusbars.topbar,
+ self.torrentview.curr_filter,
+ )
+
+ if self.minor_mode:
+ self.minor_mode.set_statusbar_args(statusbar_args)
+
+ self.draw_statusbars(**statusbar_args)
+
+ self.torrentview.update_torrents(lines)
+
+ if self.minor_mode:
+ self.minor_mode.update_cursor()
+ else:
+ util.safe_curs_set(util.Curser.INVISIBLE)
+
+ if not self.consoleui.is_active_mode(self):
+ return
+
+ self.stdscr.noutrefresh()
+ self.torrentview_panel.noutrefresh()
+
+ if not self.sidebar.hidden():
+ self.sidebar.refresh()
+
+ if self.popup:
+ self.popup.refresh()
+
+ curses.doupdate()
+
+ @overrides(BaseMode)
+ def read_input(self):
+ # Read the character
+ affected_lines = None
+ c = self.stdscr.getch()
+
+ # Either ESC or ALT+<some key>
+ if c == util.KEY_ESC:
+ n = self.stdscr.getch()
+ if n == -1: # Means it was the escape key
+ pass
+ else: # ALT+<some key>
+ c = [c, n]
+
+ if self.popup:
+ ret = self.popup.handle_read(c)
+ if self.popup and self.popup.closed():
+ self.pop_popup()
+ self.refresh()
+ return ret
+ if util.is_printable_chr(c):
+ if chr(c) == 'Q':
+ component.get('ConsoleUI').quit()
+ elif chr(c) == 'C':
+ self.consoleui.set_mode('ConnectionManager')
+ return
+ elif chr(c) == 'q':
+ self.torrentview.update_marked(self.torrentview.cursel)
+ self.set_minor_mode(
+ QueueMode(self, self.torrentview._selected_torrent_ids())
+ )
+ return
+ elif chr(c) == '/':
+ self.set_minor_mode(SearchMode(self))
+ return
+
+ if self.sidebar.has_focus() and c not in [curses.KEY_RIGHT]:
+ self.sidebar.handle_read(c)
+ self.refresh()
+ return
+
+ if self.torrentview.numtorrents < 0:
+ return
+ elif self.minor_mode:
+ self.minor_mode.handle_read(c)
+ return
+
+ affected_lines = None
+ # Hand off to torrentview
+ if self.torrentview.handle_read(c) == util.ReadState.CHANGED:
+ affected_lines = self.torrentview.get_input_result()
+
+ if c == curses.KEY_LEFT:
+ if not self.sidebar.has_focus():
+ self.sidebar.set_focused(True)
+ self.refresh()
+ return
+ elif c == curses.KEY_RIGHT:
+ if self.sidebar.has_focus():
+ self.sidebar.set_focused(False)
+ self.refresh()
+ return
+ # We enter a new mode for the selected torrent here
+ tid = self.torrentview.current_torrent_id()
+ if tid:
+ self.show_torrent_details(tid)
+ return
+
+ elif util.is_printable_chr(c):
+ if chr(c) == 'a':
+ show_torrent_add_popup(self)
+ elif chr(c) == 'v':
+ self._show_visible_columns_popup()
+ elif chr(c) == 'h':
+ self.push_popup(MessagePopup(self, 'Help', HELP_STR, width_req=0.65))
+ elif chr(c) == 'p':
+ mode = self.consoleui.set_mode('Preferences')
+ mode.load_config()
+ return
+ elif chr(c) == 'e':
+ self.consoleui.set_mode('EventView')
+ return
+ elif chr(c) == 'S':
+ self.config['torrentview']['show_sidebar'] = (
+ self.config['torrentview']['show_sidebar'] is False
+ )
+ self.config.save()
+ self.toggle_sidebar()
+ elif chr(c) == 'l':
+ self.consoleui.set_mode('CmdLine', refresh=True)
+ return
+
+ self.refresh(affected_lines)
diff --git a/deluge/ui/console/modes/torrentlist/torrentview.py b/deluge/ui/console/modes/torrentlist/torrentview.py
new file mode 100644
index 0000000..67de3e7
--- /dev/null
+++ b/deluge/ui/console/modes/torrentlist/torrentview.py
@@ -0,0 +1,517 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+from deluge.decorators import overrides
+from deluge.ui.console.modes.basemode import InputKeyHandler
+from deluge.ui.console.modes.torrentlist import torrentviewcolumns
+from deluge.ui.console.modes.torrentlist.torrentactions import torrent_actions_popup
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.utils import format_utils
+from deluge.ui.console.utils.column import (
+ get_column_value,
+ get_required_fields,
+ torrent_data_fields,
+)
+
+from . import ACTION
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+
+
+state_fg_colors = {
+ 'Downloading': 'green',
+ 'Seeding': 'cyan',
+ 'Error': 'red',
+ 'Queued': 'yellow',
+ 'Checking': 'blue',
+ 'Moving': 'green',
+}
+
+
+reverse_sort_fields = [
+ 'size',
+ 'download_speed',
+ 'upload_speed',
+ 'num_seeds',
+ 'num_peers',
+ 'distributed_copies',
+ 'time_added',
+ 'total_uploaded',
+ 'all_time_download',
+ 'total_remaining',
+ 'progress',
+ 'ratio',
+ 'seeding_time',
+ 'active_time',
+]
+
+
+default_column_values = {
+ 'queue': {'width': 4, 'visible': True},
+ 'name': {'width': -1, 'visible': True},
+ 'size': {'width': 8, 'visible': True},
+ 'progress': {'width': 7, 'visible': True},
+ 'download_speed': {'width': 7, 'visible': True},
+ 'upload_speed': {'width': 7, 'visible': True},
+ 'state': {'width': 13},
+ 'eta': {'width': 8, 'visible': True},
+ 'time_added': {'width': 15},
+ 'tracker': {'width': 15},
+ 'download_location': {'width': 15},
+ 'downloaded': {'width': 13},
+ 'uploaded': {'width': 7},
+ 'remaining': {'width': 13},
+ 'completed_time': {'width': 15},
+ 'last_seen_complete': {'width': 15},
+ 'max_upload_speed': {'width': 7},
+}
+
+
+default_columns = {}
+for col_i, col_name in enumerate(torrentviewcolumns.column_pref_names):
+ default_columns[col_name] = {'width': 10, 'order': col_i, 'visible': False}
+ if col_name in default_column_values:
+ default_columns[col_name].update(default_column_values[col_name])
+
+
+class TorrentView(InputKeyHandler):
+ def __init__(self, torrentlist, config):
+ super(TorrentView, self).__init__()
+ self.torrentlist = torrentlist
+ self.config = config
+ self.filter_dict = {}
+ self.curr_filter = None
+ self.cached_rows = {}
+ self.sorted_ids = None
+ self.torrent_names = None
+ self.numtorrents = -1
+ self.column_string = ''
+ self.curoff = 0
+ self.marked = []
+ self.cursel = 0
+
+ @property
+ def rows(self):
+ return self.torrentlist.rows
+
+ @property
+ def torrent_rows(self):
+ return self.torrentlist.rows - 3 # Account for header lines + columns line
+
+ @property
+ def torrentlist_offset(self):
+ return 2
+
+ def update_state(self, state, refresh=False):
+ self.curstate = state # cache in case we change sort order
+ self.cached_rows.clear()
+ self.numtorrents = len(state)
+ self.sorted_ids = self._sort_torrents(state)
+ self.torrent_names = []
+ for torrent_id in self.sorted_ids:
+ ts = self.curstate[torrent_id]
+ self.torrent_names.append(ts['name'])
+
+ if refresh:
+ self.torrentlist.refresh()
+
+ def set_torrent_filter(self, state):
+ self.curr_filter = state
+ filter_dict = {'state': [state]}
+ if state == 'All':
+ self.curr_filter = None
+ filter_dict = {}
+ self.filter_dict = filter_dict
+ self.torrentlist.go_top = True
+ self.torrentlist.update()
+ return True
+
+ def _scroll_up(self, by):
+ cursel = self.cursel
+ prevoff = self.curoff
+ self.cursel = max(self.cursel - by, 0)
+ if self.cursel < self.curoff:
+ self.curoff = self.cursel
+ affected = []
+ if prevoff == self.curoff:
+ affected.append(cursel)
+ if cursel != self.cursel:
+ affected.insert(0, self.cursel)
+ return affected
+
+ def _scroll_down(self, by):
+ cursel = self.cursel
+ prevoff = self.curoff
+ self.cursel = min(self.cursel + by, self.numtorrents - 1)
+ if (self.curoff + self.torrent_rows) <= self.cursel:
+ self.curoff = self.cursel - self.torrent_rows + 1
+ affected = []
+ if prevoff == self.curoff:
+ affected.append(cursel)
+ if cursel != self.cursel:
+ affected.append(self.cursel)
+ return affected
+
+ def current_torrent_id(self):
+ if not self.sorted_ids:
+ return None
+ return self.sorted_ids[self.cursel]
+
+ def _selected_torrent_ids(self):
+ if not self.sorted_ids:
+ return None
+ ret = []
+ for i in self.marked:
+ ret.append(self.sorted_ids[i])
+ return ret
+
+ def clear_marked(self):
+ self.marked = []
+ self.last_mark = -1
+
+ def mark_unmark(self, idx):
+ if idx in self.marked:
+ self.marked.remove(idx)
+ self.last_mark = -1
+ else:
+ self.marked.append(idx)
+ self.last_mark = idx
+
+ def add_marked(self, indices, last_marked):
+ for i in indices:
+ if i not in self.marked:
+ self.marked.append(i)
+ self.last_mark = last_marked
+
+ def update_marked(self, index, last_mark=True, clear=False):
+ if index not in self.marked:
+ if clear:
+ self.marked = []
+ self.marked.append(index)
+ if last_mark:
+ self.last_mark = index
+ return True
+ return False
+
+ def _sort_torrents(self, state):
+ """Sorts by primary and secondary sort fields."""
+
+ if not state:
+ return {}
+
+ s_primary = self.config['torrentview']['sort_primary']
+ s_secondary = self.config['torrentview']['sort_secondary']
+
+ result = state
+
+ # Sort first by secondary sort field and then primary sort field
+ # so it all works out
+
+ def sort_by_field(state, to_sort, field):
+ field = torrent_data_fields[field]['status'][0]
+ reverse = field in reverse_sort_fields
+
+ # Get first element so we can check if it has given field
+ # and if it's a string
+ first_element = state[list(state)[0]]
+ if field in first_element:
+
+ def sort_key(s):
+ try:
+ # Sort case-insensitively but preserve A>a order.
+ return state.get(s)[field].lower()
+ except AttributeError:
+ # Not a string.
+ return state.get(s)[field]
+
+ to_sort = sorted(to_sort, key=sort_key, reverse=reverse)
+
+ if field == 'eta':
+ to_sort = sorted(to_sort, key=lambda s: state.get(s)['eta'] == 0)
+
+ return to_sort
+
+ # Just in case primary and secondary fields are empty and/or
+ # both are too ambiguous, also sort by queue position first
+ if 'queue' not in [s_secondary, s_primary]:
+ result = sort_by_field(state, result, 'queue')
+ if s_secondary != s_primary:
+ result = sort_by_field(state, result, s_secondary)
+ result = sort_by_field(state, result, s_primary)
+
+ if self.config['torrentview']['separate_complete']:
+ result = sorted(
+ result, key=lambda s: state.get(s).get('progress', 0) == 100.0
+ )
+
+ return result
+
+ def _get_colors(self, row, tidx):
+ # default style
+ colors = {'fg': 'white', 'bg': 'black', 'attr': None}
+
+ if tidx in self.marked:
+ colors.update({'bg': 'blue', 'attr': 'bold'})
+
+ if tidx == self.cursel:
+ col_selected = {'bg': 'white', 'fg': 'black', 'attr': 'bold'}
+ if tidx in self.marked:
+ col_selected['fg'] = 'blue'
+ colors.update(col_selected)
+
+ colors['fg'] = state_fg_colors.get(row[1], colors['fg'])
+
+ if self.torrentlist.minor_mode:
+ self.torrentlist.minor_mode.update_colors(tidx, colors)
+ return colors
+
+ def update_torrents(self, lines):
+ # add all the torrents
+ if self.numtorrents == 0:
+ cols = self.torrentlist.torrentview_columns()
+ msg = 'No torrents match filter'.center(cols)
+ self.torrentlist.add_string(
+ 3, '{!info!}%s' % msg, scr=self.torrentlist.torrentview_panel
+ )
+ elif self.numtorrents == 0:
+ self.torrentlist.add_string(1, 'Waiting for torrents from core...')
+ return
+
+ def draw_row(index):
+ if index not in self.cached_rows:
+ ts = self.curstate[self.sorted_ids[index]]
+ self.cached_rows[index] = (
+ format_utils.format_row(
+ [get_column_value(name, ts) for name in self.cols_to_show],
+ self.column_widths,
+ ),
+ ts['state'],
+ )
+ return self.cached_rows[index]
+
+ tidx = self.curoff
+ currow = 0
+ todraw = []
+ # Affected lines are given when changing selected torrent
+ if lines:
+ for line in lines:
+ if line < tidx:
+ continue
+ if line >= (tidx + self.torrent_rows) or line >= self.numtorrents:
+ break
+ todraw.append((line, line - self.curoff, draw_row(line)))
+ else:
+ for i in range(tidx, tidx + self.torrent_rows):
+ if i >= self.numtorrents:
+ break
+ todraw.append((i, i - self.curoff, draw_row(i)))
+
+ for tidx, currow, row in todraw:
+ if (currow + self.torrentlist_offset - 1) > self.torrent_rows:
+ continue
+ colors = self._get_colors(row, tidx)
+ if colors['attr']:
+ colorstr = '{!%(fg)s,%(bg)s,%(attr)s!}' % colors
+ else:
+ colorstr = '{!%(fg)s,%(bg)s!}' % colors
+
+ self.torrentlist.add_string(
+ currow + self.torrentlist_offset,
+ '%s%s' % (colorstr, row[0]),
+ trim=False,
+ scr=self.torrentlist.torrentview_panel,
+ )
+
+ def update(self, refresh=False):
+ d = component.get('SessionProxy').get_torrents_status(
+ self.filter_dict, self.status_fields
+ )
+ d.addCallback(self.update_state, refresh=refresh)
+
+ def on_config_changed(self):
+ s_primary = self.config['torrentview']['sort_primary']
+ s_secondary = self.config['torrentview']['sort_secondary']
+ changed = None
+ for col in default_columns:
+ if col not in self.config['torrentview']['columns']:
+ changed = self.config['torrentview']['columns'][col] = default_columns[
+ col
+ ]
+ if changed:
+ self.config.save()
+
+ self.cols_to_show = [
+ col
+ for col in sorted(
+ self.config['torrentview']['columns'],
+ key=lambda k: self.config['torrentview']['columns'][k]['order'],
+ )
+ if self.config['torrentview']['columns'][col]['visible']
+ ]
+ self.status_fields = get_required_fields(self.cols_to_show)
+
+ # we always need these, even if we're not displaying them
+ for rf in ['state', 'name', 'queue', 'progress']:
+ if rf not in self.status_fields:
+ self.status_fields.append(rf)
+
+ # same with sort keys
+ if s_primary and s_primary not in self.status_fields:
+ self.status_fields.append(s_primary)
+ if s_secondary and s_secondary not in self.status_fields:
+ self.status_fields.append(s_secondary)
+
+ self.update_columns()
+
+ def update_columns(self):
+ self.column_widths = [
+ self.config['torrentview']['columns'][col]['width']
+ for col in self.cols_to_show
+ ]
+ requested_width = sum(width for width in self.column_widths if width >= 0)
+
+ cols = self.torrentlist.torrentview_columns()
+ if requested_width > cols: # can't satisfy requests, just spread out evenly
+ cw = int(cols / len(self.cols_to_show))
+ for i in range(0, len(self.column_widths)):
+ self.column_widths[i] = cw
+ else:
+ rem = cols - requested_width
+ var_cols = len([width for width in self.column_widths if width < 0])
+ if var_cols > 0:
+ vw = int(rem / var_cols)
+ for i in range(0, len(self.column_widths)):
+ if self.column_widths[i] < 0:
+ self.column_widths[i] = vw
+
+ self.column_string = '{!header!}'
+
+ primary_sort_col_name = self.config['torrentview']['sort_primary']
+
+ for i, column in enumerate(self.cols_to_show):
+ ccol = torrent_data_fields[column]['name']
+ width = self.column_widths[i]
+
+ # Trim the column if it's too long to fit
+ if len(ccol) > width:
+ ccol = ccol[: width - 1]
+
+ # Padding
+ ccol += ' ' * (width - len(ccol))
+
+ # Highlight the primary sort column
+ if column == primary_sort_col_name:
+ if i != len(self.cols_to_show) - 1:
+ ccol = '{!black,green,bold!}%s{!header!}' % ccol
+ else:
+ ccol = ('{!black,green,bold!}%s' % ccol)[:-1]
+
+ self.column_string += ccol
+
+ @overrides(InputKeyHandler)
+ def handle_read(self, c):
+ affected_lines = None
+ if c == curses.KEY_UP:
+ if self.cursel != 0:
+ affected_lines = self._scroll_up(1)
+ elif c == curses.KEY_PPAGE:
+ affected_lines = self._scroll_up(int(self.torrent_rows / 2))
+ elif c == curses.KEY_DOWN:
+ if self.cursel < self.numtorrents:
+ affected_lines = self._scroll_down(1)
+ elif c == curses.KEY_NPAGE:
+ affected_lines = self._scroll_down(int(self.torrent_rows / 2))
+ elif c == curses.KEY_HOME:
+ affected_lines = self._scroll_up(self.cursel)
+ elif c == curses.KEY_END:
+ affected_lines = self._scroll_down(self.numtorrents - self.cursel)
+ elif c == curses.KEY_DC: # DEL
+ added = self.update_marked(self.cursel)
+
+ def on_close(**kwargs):
+ if added:
+ self.marked.pop()
+
+ torrent_actions_popup(
+ self.torrentlist,
+ self._selected_torrent_ids(),
+ action=ACTION.REMOVE,
+ close_cb=on_close,
+ )
+ elif c in [curses.KEY_ENTER, util.KEY_ENTER2] and self.numtorrents:
+ added = self.update_marked(self.cursel)
+
+ def on_close(data, **kwargs):
+ if added:
+ self.marked.remove(self.cursel)
+
+ torrent_actions_popup(
+ self.torrentlist,
+ self._selected_torrent_ids(),
+ details=True,
+ close_cb=on_close,
+ )
+ self.torrentlist.refresh()
+ elif c == ord('j'):
+ affected_lines = self._scroll_up(1)
+ elif c == ord('k'):
+ affected_lines = self._scroll_down(1)
+ elif c == ord('m'):
+ self.mark_unmark(self.cursel)
+ affected_lines = [self.cursel]
+ elif c == ord('M'):
+ if self.last_mark >= 0:
+ if self.cursel > self.last_mark:
+ mrange = list(range(self.last_mark, self.cursel + 1))
+ else:
+ mrange = list(range(self.cursel, self.last_mark))
+ self.add_marked(mrange, self.cursel)
+ affected_lines = mrange
+ else:
+ self.mark_unmark(self.cursel)
+ affected_lines = [self.cursel]
+ elif c == ord('c'):
+ self.clear_marked()
+ elif c == ord('o'):
+ if not self.marked:
+ added = self.update_marked(self.cursel, clear=True)
+ else:
+ self.last_mark = -1
+ torrent_actions_popup(
+ self.torrentlist,
+ self._selected_torrent_ids(),
+ action=ACTION.TORRENT_OPTIONS,
+ )
+ elif c in [ord('>'), ord('<')]:
+ try:
+ i = self.cols_to_show.index(self.config['torrentview']['sort_primary'])
+ except ValueError:
+ i = 0 if chr(c) == '<' else len(self.cols_to_show)
+ else:
+ i += 1 if chr(c) == '>' else -1
+
+ i = max(0, min(len(self.cols_to_show) - 1, i))
+ self.config['torrentview']['sort_primary'] = self.cols_to_show[i]
+ self.config.save()
+ self.on_config_changed()
+ self.update_columns()
+ self.torrentlist.refresh([])
+ else:
+ return util.ReadState.IGNORED
+
+ self.set_input_result(affected_lines)
+ return util.ReadState.CHANGED if affected_lines else util.ReadState.READ
diff --git a/deluge/ui/console/modes/torrentlist/torrentviewcolumns.py b/deluge/ui/console/modes/torrentlist/torrentviewcolumns.py
new file mode 100644
index 0000000..9dff843
--- /dev/null
+++ b/deluge/ui/console/modes/torrentlist/torrentviewcolumns.py
@@ -0,0 +1,162 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.decorators import overrides
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.utils.column import torrent_data_fields
+from deluge.ui.console.widgets.fields import CheckedPlusInput, IntSpinInput
+from deluge.ui.console.widgets.popup import InputPopup, MessagePopup
+
+COLUMN_VIEW_HELP_STR = """
+Control column visibilty with the following actions:
+
+{!info!}'+'{!normal!} - {|indent_pos:|}Increase column width
+{!info!}'-'{!normal!} - {|indent_pos:|}Decrease column width
+
+{!info!}'CTRL+up'{!normal!} - {|indent_pos:|} Move column left
+{!info!}'CTRL+down'{!normal!} - {|indent_pos:|} Move column right
+"""
+
+column_pref_names = [
+ 'queue',
+ 'name',
+ 'size',
+ 'downloaded',
+ 'uploaded',
+ 'remaining',
+ 'state',
+ 'progress',
+ 'seeds',
+ 'peers',
+ 'seeds_peers_ratio',
+ 'download_speed',
+ 'upload_speed',
+ 'max_download_speed',
+ 'max_upload_speed',
+ 'eta',
+ 'ratio',
+ 'avail',
+ 'time_added',
+ 'completed_time',
+ 'last_seen_complete',
+ 'tracker',
+ 'download_location',
+ 'active_time',
+ 'seeding_time',
+ 'finished_time',
+ 'time_since_transfer',
+ 'shared',
+ 'owner',
+]
+
+
+class ColumnAndWidth(CheckedPlusInput):
+ def __init__(self, parent, name, message, child, on_width_func, **kwargs):
+ CheckedPlusInput.__init__(self, parent, name, message, child, **kwargs)
+ self.on_width_func = on_width_func
+
+ @overrides(CheckedPlusInput)
+ def handle_read(self, c):
+ if c in [ord('+'), ord('-')]:
+ val = self.child.get_value()
+ change = 1 if chr(c) == '+' else -1
+ self.child.set_value(val + change, validate=True)
+ self.on_width_func(self.name, self.child.get_value())
+ return util.ReadState.CHANGED
+ return CheckedPlusInput.handle_read(self, c)
+
+
+class TorrentViewColumns(InputPopup):
+ def __init__(self, torrentlist):
+ self.torrentlist = torrentlist
+ self.torrentview = torrentlist.torrentview
+
+ title = 'Visible columns (Esc to exit)'
+ InputPopup.__init__(
+ self,
+ torrentlist,
+ title,
+ close_cb=self._do_set_column_visibility,
+ immediate_action=True,
+ height_req=len(column_pref_names) - 5,
+ width_req=max(len(col) for col in column_pref_names + [title]) + 14,
+ border_off_west=1,
+ allow_rearrange=True,
+ )
+
+ msg_fmt = '%-25s'
+ self.add_header((msg_fmt % _('Columns')) + ' ' + _('Width'), space_below=True)
+
+ for colpref_name in column_pref_names:
+ col = self.torrentview.config['torrentview']['columns'][colpref_name]
+ width_spin = IntSpinInput(
+ self,
+ colpref_name + '_ width',
+ '',
+ self.move,
+ col['width'],
+ min_val=-1,
+ max_val=99,
+ fmt='%2d',
+ )
+
+ def on_width_func(name, width):
+ self.torrentview.config['torrentview']['columns'][name]['width'] = width
+
+ self._add_input(
+ ColumnAndWidth(
+ self,
+ colpref_name,
+ torrent_data_fields[colpref_name]['name'],
+ width_spin,
+ on_width_func,
+ checked=col['visible'],
+ checked_char='*',
+ msg_fmt=msg_fmt,
+ show_usage_hints=False,
+ child_always_visible=True,
+ )
+ )
+
+ def _do_set_column_visibility(
+ self, data=None, state_changed=True, close=True, **kwargs
+ ):
+ if close:
+ self.torrentlist.pop_popup()
+ return
+ elif not state_changed:
+ return
+
+ for key, value in data.items():
+ self.torrentview.config['torrentview']['columns'][key]['visible'] = value[
+ 'value'
+ ]
+ self.torrentview.config['torrentview']['columns'][key]['order'] = value[
+ 'order'
+ ]
+
+ self.torrentview.config.save()
+ self.torrentview.on_config_changed()
+ self.torrentlist.refresh([])
+
+ @overrides(InputPopup)
+ def handle_read(self, c):
+ if c == ord('h'):
+ popup = MessagePopup(
+ self.torrentlist,
+ 'Help',
+ COLUMN_VIEW_HELP_STR,
+ width_req=70,
+ border_off_west=1,
+ )
+ self.torrentlist.push_popup(popup)
+ return util.ReadState.READ
+ return InputPopup.handle_read(self, c)
diff --git a/deluge/ui/console/parser.py b/deluge/ui/console/parser.py
new file mode 100644
index 0000000..27f2485
--- /dev/null
+++ b/deluge/ui/console/parser.py
@@ -0,0 +1,143 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+import argparse
+import shlex
+
+import deluge.component as component
+from deluge.ui.console.utils.colors import ConsoleColorFormatter
+
+
+class OptionParserError(Exception):
+ pass
+
+
+class ConsoleBaseParser(argparse.ArgumentParser):
+ def format_help(self):
+ """Differs from ArgumentParser.format_help by adding the raw epilog
+ as formatted in the string. Default bahavior mangles the formatting.
+
+ """
+ # Handle epilog manually to keep the text formatting
+ epilog = self.epilog
+ self.epilog = ''
+ help_str = super(ConsoleBaseParser, self).format_help()
+ if epilog is not None:
+ help_str += epilog
+ self.epilog = epilog
+ return help_str
+
+
+class ConsoleCommandParser(ConsoleBaseParser):
+ def _split_args(self, args):
+ command_options = []
+ for a in args:
+ if not a:
+ continue
+ if ';' in a:
+ cmd_lines = [arg.strip() for arg in a.split(';')]
+ elif ' ' in a:
+ cmd_lines = [a]
+ else:
+ continue
+
+ for cmd_line in cmd_lines:
+ cmds = shlex.split(cmd_line)
+ cmd_options = super(ConsoleCommandParser, self).parse_args(args=cmds)
+ cmd_options.command = cmds[0]
+ command_options.append(cmd_options)
+
+ return command_options
+
+ def parse_args(self, args=None):
+ """Parse known UI args and handle common and process group options.
+
+ Notes:
+ If started by deluge entry script this has already been done.
+
+ Args:
+ args (list, optional): The arguments to parse.
+
+ Returns:
+ argparse.Namespace: The parsed arguments.
+ """
+ from deluge.ui.ui_entry import AMBIGUOUS_CMD_ARGS
+
+ self.base_parser.parse_known_ui_args(args, withhold=AMBIGUOUS_CMD_ARGS)
+
+ multi_command = self._split_args(args)
+ # If multiple commands were passed to console
+ if multi_command:
+ # With multiple commands, normal parsing will fail, so only parse
+ # known arguments using the base parser, and then set
+ # options.parsed_cmds to the already parsed commands
+ options, remaining = self.base_parser.parse_known_args(args=args)
+ options.parsed_cmds = multi_command
+ else:
+ subcommand = False
+ if hasattr(self.base_parser, 'subcommand'):
+ subcommand = getattr(self.base_parser, 'subcommand')
+ if not subcommand:
+ # We must use parse_known_args to handle case when no subcommand
+ # is provided, because argparse does not support parsing without
+ # a subcommand
+ options, remaining = self.base_parser.parse_known_args(args=args)
+ # If any options remain it means they do not exist. Reparse with
+ # parse_args to trigger help message
+ if remaining:
+ options = self.base_parser.parse_args(args=args)
+ options.parsed_cmds = []
+ else:
+ options = super(ConsoleCommandParser, self).parse_args(args=args)
+ options.parsed_cmds = [options]
+
+ if not hasattr(options, 'remaining'):
+ options.remaining = []
+
+ return options
+
+
+class OptionParser(ConsoleBaseParser):
+ def __init__(self, **kwargs):
+ super(OptionParser, self).__init__(**kwargs)
+ self.formatter = ConsoleColorFormatter()
+
+ def exit(self, status=0, msg=None):
+ self._exit = True
+ if msg:
+ print(msg)
+
+ def error(self, msg):
+ """error(msg : string)
+
+ Print a usage message incorporating 'msg' to stderr and exit.
+ If you override this in a subclass, it should not return -- it
+ should either exit or raise an exception.
+ """
+ raise OptionParserError(msg)
+
+ def print_usage(self, _file=None):
+ console = component.get('ConsoleUI')
+ if self.usage:
+ for line in self.format_usage().splitlines():
+ console.write(line)
+
+ def print_help(self, _file=None):
+ console = component.get('ConsoleUI')
+ console.set_batch_write(True)
+ for line in self.format_help().splitlines():
+ console.write(line)
+ console.set_batch_write(False)
+
+ def format_help(self):
+ """Return help formatted with colors."""
+ help_str = super(OptionParser, self).format_help()
+ return self.formatter.format_colors(help_str)
diff --git a/deluge/ui/console/utils/__init__.py b/deluge/ui/console/utils/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deluge/ui/console/utils/__init__.py
diff --git a/deluge/ui/console/utils/colors.py b/deluge/ui/console/utils/colors.py
new file mode 100644
index 0000000..587c1f3
--- /dev/null
+++ b/deluge/ui/console/utils/colors.py
@@ -0,0 +1,326 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import re
+
+from deluge.ui.console.utils import format_utils
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+
+colors = [
+ 'COLOR_BLACK',
+ 'COLOR_BLUE',
+ 'COLOR_CYAN',
+ 'COLOR_GREEN',
+ 'COLOR_MAGENTA',
+ 'COLOR_RED',
+ 'COLOR_WHITE',
+ 'COLOR_YELLOW',
+]
+
+# {(fg, bg): pair_number, ...}
+color_pairs = {('white', 'black'): 0} # Special case, can't be changed
+
+# Some default color schemes
+schemes = {
+ 'input': ('white', 'black'),
+ 'normal': ('white', 'black'),
+ 'status': ('yellow', 'blue', 'bold'),
+ 'info': ('white', 'black', 'bold'),
+ 'error': ('red', 'black', 'bold'),
+ 'success': ('green', 'black', 'bold'),
+ 'event': ('magenta', 'black', 'bold'),
+ 'selected': ('black', 'white', 'bold'),
+ 'marked': ('white', 'blue', 'bold'),
+ 'selectedmarked': ('blue', 'white', 'bold'),
+ 'header': ('green', 'black', 'bold'),
+ 'filterstatus': ('green', 'blue', 'bold'),
+}
+
+# Colors for various torrent states
+state_color = {
+ 'Seeding': '{!blue,black,bold!}',
+ 'Downloading': '{!green,black,bold!}',
+ 'Paused': '{!white,black!}',
+ 'Checking': '{!green,black!}',
+ 'Queued': '{!yellow,black!}',
+ 'Error': '{!red,black,bold!}',
+ 'Moving': '{!green,black,bold!}',
+}
+
+type_color = {
+ bool: '{!yellow,black,bold!}',
+ int: '{!green,black,bold!}',
+ float: '{!green,black,bold!}',
+ str: '{!cyan,black,bold!}',
+ list: '{!magenta,black,bold!}',
+ dict: '{!white,black,bold!}',
+}
+
+tab_char = '\t'
+color_tag_start = '{!'
+color_tag_end = '!}'
+
+
+def get_color_pair(fg, bg):
+ return color_pairs[(fg, bg)]
+
+
+def init_colors():
+ curses.start_color()
+
+ # We want to redefine white/black as it makes underlining work for some terminals
+ # but can also fail on others, so we try/except
+
+ def define_pair(counter, fg_name, bg_name, fg, bg):
+ try:
+ curses.init_pair(counter, fg, bg)
+ color_pairs[(fg_name, bg_name)] = counter
+ counter += 1
+ except curses.error as ex:
+ log.warning('Error: %s', ex)
+ return counter
+
+ # Create the color_pairs dict
+ counter = 1
+ for fg in colors:
+ for bg in colors:
+ counter = define_pair(
+ counter,
+ fg[6:].lower(),
+ bg[6:].lower(),
+ getattr(curses, fg),
+ getattr(curses, bg),
+ )
+
+ counter = define_pair(counter, 'white', 'grey', curses.COLOR_WHITE, 241)
+ counter = define_pair(counter, 'black', 'whitegrey', curses.COLOR_BLACK, 249)
+ counter = define_pair(counter, 'magentadark', 'white', 99, curses.COLOR_WHITE)
+
+
+class BadColorString(Exception):
+ pass
+
+
+def check_tag_count(string):
+ """Raise BadColorString if color tag open/close not equal."""
+ if string.count(color_tag_start) != string.count(color_tag_end):
+ raise BadColorString('Number of {! is not equal to number of !}')
+
+
+def replace_tabs(line):
+ """
+ Returns a string with tabs replaced with spaces.
+
+ """
+ for i in range(line.count(tab_char)):
+ tab_length = 8 - (len(line[: line.find(tab_char)]) % 8)
+ line = line.replace(tab_char, b' ' * tab_length, 1)
+ return line
+
+
+def strip_colors(line):
+ """
+ Returns a string with the color formatting removed.
+
+ """
+ check_tag_count(line)
+
+ # Remove all the color tags
+ while line.find(color_tag_start) != -1:
+ tag_start = line.find(color_tag_start)
+ tag_end = line.find(color_tag_end) + 2
+ line = line[:tag_start] + line[tag_end:]
+
+ return line
+
+
+def get_line_length(line):
+ """
+ Returns the string length without the color formatting.
+
+ """
+ # Remove all the color tags
+ line = strip_colors(line)
+
+ # Replace tabs with the appropriate amount of spaces
+ line = replace_tabs(line)
+ return len(line)
+
+
+def get_line_width(line):
+ """
+ Get width of string considering double width characters
+
+ """
+ # Remove all the color tags
+ line = strip_colors(line)
+
+ # Replace tabs with the appropriate amount of spaces
+ line = replace_tabs(line)
+ return format_utils.strwidth(line)
+
+
+def parse_color_string(string):
+ """Parses a string and returns a list of 2-tuples (color, string).
+
+ Args:
+ string (str): The string to parse.
+ """
+ check_tag_count(string)
+
+ ret = []
+ last_color_attr = None
+ # Keep track of where the strings
+ while string.find(color_tag_start) != -1:
+ begin = string.find(color_tag_start)
+ if begin > 0:
+ ret.append(
+ (
+ curses.color_pair(
+ color_pairs[(schemes['input'][0], schemes['input'][1])]
+ ),
+ string[:begin],
+ )
+ )
+
+ end = string.find(color_tag_end)
+ if end == -1:
+ raise BadColorString('Missing closing "!}"')
+
+ # Get a list of attributes in the bracketed section
+ attrs = string[begin + 2 : end].split(',')
+
+ if len(attrs) == 1 and not attrs[0].strip(' '):
+ raise BadColorString('No description in {! !}')
+
+ def apply_attrs(cp, attrs):
+ # This function applies any additional attributes as necessary
+ for attr in attrs:
+ if attr == 'ignore':
+ continue
+ mode = '+'
+ if attr[0] in ['+', '-']:
+ mode = attr[0]
+ attr = attr[1:]
+ if mode == '+':
+ cp |= getattr(curses, 'A_' + attr.upper())
+ else:
+ cp ^= getattr(curses, 'A_' + attr.upper())
+ return cp
+
+ # Check for a builtin type first
+ if attrs[0] in schemes:
+ pair = (schemes[attrs[0]][0], schemes[attrs[0]][1])
+ if pair not in color_pairs:
+ log.debug('Color pair does not exist: %s, attrs: %s', pair, attrs)
+ pair = ('white', 'black')
+ # Get the color pair number
+ color_pair = curses.color_pair(color_pairs[pair])
+ color_pair = apply_attrs(color_pair, schemes[attrs[0]][2:])
+ last_color_attr = color_pair
+ else:
+ attrlist = ['blink', 'bold', 'dim', 'reverse', 'standout', 'underline']
+
+ if attrs[0][0] in ['+', '-']:
+ # Color is not given, so use last color
+ if last_color_attr is None:
+ raise BadColorString(
+ 'No color value given when no previous color was used!: %s'
+ % (attrs[0])
+ )
+ color_pair = last_color_attr
+ for i, attr in enumerate(attrs):
+ if attr[1:] not in attrlist:
+ raise BadColorString('Bad attribute value!: %s' % (attr))
+ else:
+ # This is a custom color scheme
+ fg = attrs[0]
+ bg = 'black' # Default to 'black' if no bg is chosen
+ if len(attrs) > 1:
+ bg = attrs[1]
+ try:
+ pair = (fg, bg)
+ if pair not in color_pairs:
+ # Color pair missing, this could be because the
+ # terminal settings allows no colors. If background is white, we
+ # assume this means selection, and use "white", "black" + reverse
+ # To have white background and black foreground
+ log.debug('Color pair does not exist: %s', pair)
+ if pair[1] == 'white':
+ if attrs[2] == 'ignore':
+ attrs[2] = 'reverse'
+ else:
+ attrs.append('reverse')
+ pair = ('white', 'black')
+ color_pair = curses.color_pair(color_pairs[pair])
+ last_color_attr = color_pair
+ attrs = attrs[2:] # Remove colors
+ except KeyError:
+ raise BadColorString('Bad color value in tag: %s,%s' % (fg, bg))
+ # Check for additional attributes and OR them to the color_pair
+ color_pair = apply_attrs(color_pair, attrs)
+ last_color_attr = color_pair
+ # We need to find the text now, so lets try to find another {! and if
+ # there isn't one, then it's the rest of the string
+ next_begin = string.find(color_tag_start, end)
+
+ if next_begin == -1:
+ ret.append((color_pair, replace_tabs(string[end + 2 :])))
+ break
+ else:
+ ret.append((color_pair, replace_tabs(string[end + 2 : next_begin])))
+ string = string[next_begin:]
+
+ if not ret:
+ # There was no color scheme so we add it with a 0 for white on black
+ ret = [(0, string)]
+ return ret
+
+
+class ConsoleColorFormatter(object):
+ """
+ Format help in a way suited to deluge CmdLine mode - colors, format, indentation...
+ """
+
+ replace_dict = {
+ '<torrent-id>': '{!green!}%s{!input!}',
+ '<torrent>': '{!green!}%s{!input!}',
+ '<command>': '{!green!}%s{!input!}',
+ '<state>': '{!yellow!}%s{!input!}',
+ '\\.\\.\\.': '{!yellow!}%s{!input!}',
+ '\\s\\*\\s': '{!blue!}%s{!input!}',
+ '(?<![\\-a-z])(-[a-zA-Z0-9])': '{!red!}%s{!input!}',
+ # "(\-[a-zA-Z0-9])": "{!red!}%s{!input!}",
+ '--[_\\-a-zA-Z0-9]+': '{!green!}%s{!input!}',
+ '(\\[|\\])': '{!info!}%s{!input!}',
+ '<tab>': '{!white!}%s{!input!}',
+ '[_A-Z]{3,}': '{!cyan!}%s{!input!}',
+ '<key>': '{!cyan!}%s{!input!}',
+ '<value>': '{!cyan!}%s{!input!}',
+ 'usage:': '{!info!}%s{!input!}',
+ '<download-folder>': '{!yellow!}%s{!input!}',
+ '<torrent-file>': '{!green!}%s{!input!}',
+ }
+
+ def format_colors(self, string):
+ def r(repl):
+ return lambda s: repl % s.group()
+
+ for key, replacement in self.replace_dict.items():
+ string = re.sub(key, r(replacement), string)
+ return string
diff --git a/deluge/ui/console/utils/column.py b/deluge/ui/console/utils/column.py
new file mode 100644
index 0000000..d932159
--- /dev/null
+++ b/deluge/ui/console/utils/column.py
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import copy
+import logging
+
+import deluge.common
+from deluge.i18n import setup_translation
+from deluge.ui.common import TORRENT_DATA_FIELD
+from deluge.ui.console.utils import format_utils
+
+setup_translation()
+
+log = logging.getLogger(__name__)
+
+torrent_data_fields = copy.deepcopy(TORRENT_DATA_FIELD)
+
+formatters = {
+ 'queue': format_utils.format_queue,
+ 'name': lambda a, b: b,
+ 'state': None,
+ 'tracker': None,
+ 'download_location': None,
+ 'owner': None,
+ 'progress_state': format_utils.format_progress,
+ 'progress': format_utils.format_progress,
+ 'size': format_utils.format_size,
+ 'downloaded': format_utils.format_size,
+ 'uploaded': format_utils.format_size,
+ 'remaining': format_utils.format_size,
+ 'ratio': format_utils.format_float,
+ 'avail': format_utils.format_float,
+ 'seeds_peers_ratio': format_utils.format_float,
+ 'download_speed': format_utils.format_speed,
+ 'upload_speed': format_utils.format_speed,
+ 'max_download_speed': format_utils.format_speed,
+ 'max_upload_speed': format_utils.format_speed,
+ 'peers': format_utils.format_seeds_peers,
+ 'seeds': format_utils.format_seeds_peers,
+ 'time_added': deluge.common.fdate,
+ 'seeding_time': format_utils.format_time,
+ 'active_time': format_utils.format_time,
+ 'time_since_transfer': format_utils.format_date_dash,
+ 'finished_time': deluge.common.ftime,
+ 'last_seen_complete': format_utils.format_date_never,
+ 'completed_time': format_utils.format_date_dash,
+ 'eta': format_utils.format_time,
+ 'pieces': format_utils.format_pieces,
+}
+
+for data_field in torrent_data_fields:
+ torrent_data_fields[data_field]['formatter'] = formatters.get(data_field, str)
+
+
+def get_column_value(name, state):
+ col = torrent_data_fields[name]
+
+ if col['formatter']:
+ args = [state[key] for key in col['status']]
+ return col['formatter'](*args)
+ else:
+ return state[col['status'][0]]
+
+
+def get_required_fields(cols):
+ fields = []
+ for col in cols:
+ fields.extend(torrent_data_fields[col]['status'])
+ return fields
diff --git a/deluge/ui/console/utils/common.py b/deluge/ui/console/utils/common.py
new file mode 100644
index 0000000..df1c079
--- /dev/null
+++ b/deluge/ui/console/utils/common.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+TORRENT_OPTIONS = {
+ 'max_download_speed': float,
+ 'max_upload_speed': float,
+ 'max_connections': int,
+ 'max_upload_slots': int,
+ 'prioritize_first_last': bool,
+ 'is_auto_managed': bool,
+ 'stop_at_ratio': bool,
+ 'stop_ratio': float,
+ 'remove_at_ratio': bool,
+ 'move_completed': bool,
+ 'move_completed_path': str,
+ 'super_seeding': bool,
+}
diff --git a/deluge/ui/console/utils/curses_util.py b/deluge/ui/console/utils/curses_util.py
new file mode 100644
index 0000000..a0cd6dc
--- /dev/null
+++ b/deluge/ui/console/utils/curses_util.py
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+try:
+ import curses
+except ImportError:
+ pass
+
+KEY_BELL = 7 # CTRL-/ ^G (curses.keyname(KEY_BELL) == "^G")
+KEY_TAB = 9
+KEY_ENTER2 = 10
+KEY_ESC = 27
+KEY_SPACE = 32
+KEY_BACKSPACE2 = 127
+
+KEY_ALT_AND_ARROW_UP = 564
+KEY_ALT_AND_ARROW_DOWN = 523
+
+KEY_ALT_AND_KEY_PPAGE = 553
+KEY_ALT_AND_KEY_NPAGE = 548
+
+KEY_CTRL_AND_ARROW_UP = 566
+KEY_CTRL_AND_ARROW_DOWN = 525
+
+
+def is_printable_chr(c):
+ return c >= 32 and c <= 126
+
+
+def is_int_chr(c):
+ return c > 47 and c < 58
+
+
+class Curser(object):
+ INVISIBLE = 0
+ NORMAL = 1
+ VERY_VISIBLE = 2
+
+
+def safe_curs_set(visibility):
+ """
+ Args:
+ visibility(int): 0, 1, or 2, for invisible, normal, or very visible
+
+ curses.curs_set fails on monochrome terminals so use this
+ to ignore errors
+ """
+ try:
+ curses.curs_set(visibility)
+ except curses.error:
+ pass
+
+
+class ReadState(object):
+ IGNORED = 0
+ READ = 1
+ CHANGED = 2
diff --git a/deluge/ui/console/utils/format_utils.py b/deluge/ui/console/utils/format_utils.py
new file mode 100644
index 0000000..029fb20
--- /dev/null
+++ b/deluge/ui/console/utils/format_utils.py
@@ -0,0 +1,353 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import re
+from collections import deque
+from unicodedata import east_asian_width, normalize
+
+import deluge.common
+from deluge.ui.common import FILE_PRIORITY
+
+
+def format_size(size):
+ return deluge.common.fsize(size, shortform=True)
+
+
+def format_speed(speed):
+ if speed > 0:
+ return deluge.common.fspeed(speed, shortform=True)
+ else:
+ return '-'
+
+
+def format_time(time):
+ if time > 0:
+ return deluge.common.ftime(time)
+ elif time == 0:
+ return '-'
+ else:
+ return '∞'
+
+
+def format_date_dash(time):
+ if time > 0:
+ return deluge.common.fdate(time, date_only=True)
+ else:
+ return '-'
+
+
+def format_date_never(time):
+ if time > 0:
+ return deluge.common.fdate(time, date_only=True)
+ else:
+ return 'Never'
+
+
+def format_float(x):
+ if x < 0:
+ return '-'
+ else:
+ return '%.3f' % x
+
+
+def format_seeds_peers(num, total):
+ return '%d (%d)' % (num, total)
+
+
+def format_progress(value):
+ return ('%.2f' % value).rstrip('0').rstrip('.') + '%'
+
+
+def f_progressbar(progress, width):
+ """
+ Returns a string of a progress bar.
+
+ :param progress: float, a value between 0-100
+
+ :returns: str, a progress bar based on width
+
+ """
+
+ w = width - 2 # we use a [] for the beginning and end
+ s = '['
+ p = int(round((progress / 100) * w))
+ s += '#' * p
+ s += '-' * (w - p)
+ s += ']'
+ return s
+
+
+def f_seedrank_dash(seed_rank, seeding_time):
+ """Display value if seeding otherwise dash"""
+
+ if seeding_time > 0:
+ if seed_rank >= 1000:
+ return '%ik' % (seed_rank // 1000)
+ else:
+ return str(seed_rank)
+ else:
+ return '-'
+
+
+def ftotal_sized(first, second):
+ return '%s (%s)' % (
+ deluge.common.fsize(first, shortform=True),
+ deluge.common.fsize(second, shortform=True),
+ )
+
+
+def format_pieces(num, size):
+ return '%d (%s)' % (num, deluge.common.fsize(size, shortform=True))
+
+
+def format_priority(prio):
+ if prio == -2:
+ return '[Mixed]'
+ elif prio < 0:
+ return '-'
+ return FILE_PRIORITY[prio]
+
+
+def format_queue(qnum):
+ if qnum < 0:
+ return ''
+ return '%d' % (qnum + 1)
+
+
+def trim_string(string, w, have_dbls):
+ if w <= 0:
+ return ''
+ elif w == 1:
+ return ' '
+ elif have_dbls:
+ # have to do this the slow way
+ chrs = []
+ width = 4
+ idx = 0
+ while width < w:
+ chrs.append(string[idx])
+ if east_asian_width(string[idx]) in 'WF':
+ width += 2
+ else:
+ width += 1
+ idx += 1
+ if width != w:
+ chrs.pop()
+ chrs.append('.')
+ return '%s ' % (''.join(chrs))
+ else:
+ return '%s ' % (string[0 : w - 1])
+
+
+def format_column(col, lim):
+ try:
+ # might have some double width chars
+ col = normalize('NFC', col)
+ dbls = sum(east_asian_width(c) in 'WF' for c in col)
+ except TypeError:
+ dbls = 0
+
+ size = len(col) + dbls
+ if size >= lim - 1:
+ return trim_string(col, lim, dbls > 0)
+ else:
+ return '%s%s' % (col, ' ' * (lim - size))
+
+
+def format_row(row, column_widths):
+ return ''.join(
+ [format_column(row[i], column_widths[i]) for i in range(0, len(row))]
+ )
+
+
+_strip_re = re.compile(r'\{!.*?!\}')
+_format_code = re.compile(r'\{\|(.*)\|\}')
+
+
+def remove_formatting(string):
+ return re.sub(_strip_re, '', string)
+
+
+def shorten_hash(tid, space_left, min_width=13, placeholder='...'):
+ """Shorten the supplied torrent infohash by removing chars from the middle.
+
+ Use a placeholder to indicate shortened.
+ If unable to shorten will justify so entire tid is on the next line.
+
+ """
+ tid = tid.strip()
+ if space_left >= min_width:
+ mid = len(tid) // 2
+ trim, remain = divmod(len(tid) + len(placeholder) - space_left, 2)
+ return tid[0 : mid - trim] + placeholder + tid[mid + trim + remain :]
+ else:
+ # Justity the tid so it is completely on the next line.
+ return tid.rjust(len(tid) + space_left)
+
+
+def wrap_string(string, width, min_lines=0, strip_colors=True):
+ """
+ Wrap a string to fit in a particular width. Returns a list of output lines.
+
+ :param string: str, the string to wrap
+ :param width: int, the maximum width of a line of text
+ :param min_lines: int, extra lines will be added so the output tuple contains at least min_lines lines
+ :param strip_colors: boolean, if True, text in {!!} blocks will not be considered as adding to the
+ width of the line. They will still be present in the output.
+ """
+ ret = []
+ s1 = string.split('\n')
+ indent = ''
+
+ def insert_clr(s, offset, mtchs, clrs):
+ end_pos = offset + len(s)
+ while mtchs and (mtchs[0] <= end_pos) and (mtchs[0] >= offset):
+ mtc = mtchs.popleft() - offset
+ clr = clrs.popleft()
+ end_pos += len(clr)
+ s = '%s%s%s' % (s[:mtc], clr, s[mtc:])
+ return s
+
+ for s in s1:
+ offset = 0
+ indent = ''
+ m = _format_code.search(remove_formatting(s))
+ if m:
+ if m.group(1).startswith('indent:'):
+ indent = m.group(1)[len('indent:') :]
+ elif m.group(1).startswith('indent_pos:'):
+ begin = m.start(0)
+ indent = ' ' * begin
+ s = _format_code.sub('', s)
+
+ if strip_colors:
+ mtchs = deque()
+ clrs = deque()
+ for m in _strip_re.finditer(s):
+ mtchs.append(m.start())
+ clrs.append(m.group())
+ cstr = _strip_re.sub('', s)
+ else:
+ cstr = s
+
+ def append_indent(l, string, offset):
+ """Prepends indent to string if specified"""
+ if indent and offset != 0:
+ string = indent + string
+ l.append(string)
+
+ while cstr:
+ # max with for a line. If indent is specified, we account for this
+ max_width = width - (len(indent) if offset != 0 else 0)
+ if len(cstr) < max_width:
+ break
+ sidx = cstr.rfind(' ', 0, max_width - 1)
+ sidx += 1
+ if sidx > 0:
+ if strip_colors:
+ to_app = cstr[0:sidx]
+ to_app = insert_clr(to_app, offset, mtchs, clrs)
+ append_indent(ret, to_app, offset)
+ offset += len(to_app)
+ else:
+ append_indent(ret, cstr[0:sidx], offset)
+ cstr = cstr[sidx:]
+ if not cstr:
+ cstr = None
+ break
+ else:
+ # can't find a reasonable split, just split at width
+ if strip_colors:
+ to_app = cstr[0:width]
+ to_app = insert_clr(to_app, offset, mtchs, clrs)
+ append_indent(ret, to_app, offset)
+ offset += len(to_app)
+ else:
+ append_indent(ret, cstr[0:width], offset)
+ cstr = cstr[width:]
+ if not cstr:
+ cstr = None
+ break
+ if cstr is not None:
+ to_append = cstr
+ if strip_colors:
+ to_append = insert_clr(cstr, offset, mtchs, clrs)
+ append_indent(ret, to_append, offset)
+
+ if min_lines > 0:
+ for i in range(len(ret), min_lines):
+ ret.append(' ')
+
+ # Carry colors over to the next line
+ last_color_string = ''
+ for i, line in enumerate(ret):
+ if i != 0:
+ ret[i] = '%s%s' % (last_color_string, ret[i])
+
+ colors = re.findall('\\{![^!]+!\\}', line)
+ if colors:
+ last_color_string = colors[-1]
+
+ return ret
+
+
+def strwidth(string):
+ """
+ Measure width of a string considering asian double width characters
+ """
+ return sum(1 + (east_asian_width(char) in ['W', 'F']) for char in string)
+
+
+def pad_string(string, length, character=' ', side='right'):
+ """
+ Pad string with specified character to desired length, considering double width characters.
+ """
+ w = strwidth(string)
+ diff = length - w
+ if side == 'left':
+ return '%s%s' % (character * diff, string)
+ elif side == 'right':
+ return '%s%s' % (string, character * diff)
+
+
+def delete_alt_backspace(input_text, input_cursor, sep_chars=' *?!._~-#$^;\'"/'):
+ """
+ Remove text from input_text on ALT+backspace
+ Stop removing when countering any of the sep chars
+ """
+ deleted = 0
+ seg_start = input_text[:input_cursor]
+ seg_end = input_text[input_cursor:]
+ none_space_deleted = False # Track if any none-space characters have been deleted
+
+ while seg_start and input_cursor > 0:
+ if (not seg_start) or (input_cursor == 0):
+ break
+ if deleted and seg_start[-1] in sep_chars:
+ if seg_start[-1] == ' ':
+ if seg_start[-2] == ' ' or none_space_deleted is False:
+ # Continue as long as:
+ # * next char is also a space
+ # * no none-space characters have been deleted
+ pass
+ else:
+ break
+ else:
+ break
+
+ if not none_space_deleted:
+ none_space_deleted = seg_start[-1] != ' '
+ seg_start = seg_start[:-1]
+ deleted += 1
+ input_cursor -= 1
+
+ input_text = seg_start + seg_end
+ return input_text, input_cursor
diff --git a/deluge/ui/console/widgets/__init__.py b/deluge/ui/console/widgets/__init__.py
new file mode 100644
index 0000000..a11e3f2
--- /dev/null
+++ b/deluge/ui/console/widgets/__init__.py
@@ -0,0 +1,7 @@
+from __future__ import unicode_literals
+
+from deluge.ui.console.widgets.inputpane import BaseInputPane
+from deluge.ui.console.widgets.statusbars import StatusBars
+from deluge.ui.console.widgets.window import BaseWindow
+
+__all__ = ['BaseInputPane', 'StatusBars', 'BaseWindow']
diff --git a/deluge/ui/console/widgets/fields.py b/deluge/ui/console/widgets/fields.py
new file mode 100644
index 0000000..1966c66
--- /dev/null
+++ b/deluge/ui/console/widgets/fields.py
@@ -0,0 +1,1210 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+
+from deluge.common import PY2
+from deluge.decorators import overrides
+from deluge.ui.console.modes.basemode import InputKeyHandler
+from deluge.ui.console.utils import colors
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.utils.format_utils import (
+ delete_alt_backspace,
+ remove_formatting,
+ wrap_string,
+)
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+
+
+class BaseField(InputKeyHandler):
+ def __init__(self, parent=None, name=None, selectable=True, **kwargs):
+ super(BaseField, self).__init__()
+ self.name = name
+ self.parent = parent
+ self.fmt_keys = {}
+ self.set_fmt_key('font', 'ignore', kwargs)
+ self.set_fmt_key('color', 'white,black', kwargs)
+ self.set_fmt_key('color_end', 'white,black', kwargs)
+ self.set_fmt_key('color_active', 'black,white', kwargs)
+ self.set_fmt_key('color_unfocused', 'color', kwargs)
+ self.set_fmt_key('color_unfocused_active', 'black,whitegrey', kwargs)
+ self.set_fmt_key('font_active', 'font', kwargs)
+ self.set_fmt_key('font_unfocused', 'font', kwargs)
+ self.set_fmt_key('font_unfocused_active', 'font_active', kwargs)
+ self.default_col = kwargs.get('col', -1)
+ self._selectable = selectable
+ self.value = None
+
+ def selectable(self):
+ return self.has_input() and not self.depend_skip() and self._selectable
+
+ def set_fmt_key(self, key, default, kwargsdict=None):
+ value = self.fmt_keys.get(default, default)
+ if kwargsdict:
+ value = kwargsdict.get(key, value)
+ self.fmt_keys[key] = value
+
+ def get_fmt_keys(self, focused, active, **kwargs):
+ color_key = kwargs.get('color_key', 'color')
+ font_key = 'font'
+ if not focused:
+ color_key += '_unfocused'
+ font_key += '_unfocused'
+ if active:
+ color_key += '_active'
+ font_key += '_active'
+ return color_key, font_key
+
+ def build_fmt_string(self, focused, active, value_key='msg', **kwargs):
+ color_key, font_key = self.get_fmt_keys(focused, active, **kwargs)
+ return '{!%%(%s)s,%%(%s)s!}%%(%s)s{!%%(%s)s!}' % (
+ color_key,
+ font_key,
+ value_key,
+ 'color_end',
+ )
+
+ def depend_skip(self):
+ return False
+
+ def has_input(self):
+ return True
+
+ @overrides(InputKeyHandler)
+ def handle_read(self, c):
+ return util.ReadState.IGNORED
+
+ def render(self, screen, row, **kwargs):
+ return 0
+
+ @property
+ def height(self):
+ return 1
+
+ def set_value(self, value):
+ self.value = value
+
+ def get_value(self):
+ return self.value
+
+
+class NoInputField(BaseField):
+ @overrides(BaseField)
+ def has_input(self):
+ return False
+
+
+class InputField(BaseField):
+ def __init__(self, parent, name, message, format_default=None, **kwargs):
+ BaseField.__init__(self, parent=parent, name=name, **kwargs)
+ self.format_default = format_default
+ self.message = None
+ self.set_message(message)
+
+ depend = None
+
+ @overrides(BaseField)
+ def handle_read(self, c):
+ if c in [curses.KEY_ENTER, util.KEY_ENTER2, util.KEY_BACKSPACE2, 113]:
+ return util.ReadState.READ
+ return util.ReadState.IGNORED
+
+ def set_message(self, msg):
+ changed = self.message != msg
+ self.message = msg
+ return changed
+
+ def set_depend(self, i, inverse=False):
+ if not isinstance(i, CheckedInput):
+ raise Exception('Can only depend on CheckedInputs')
+ self.depend = i
+ self.inverse = inverse
+
+ def depend_skip(self):
+ if not self.depend:
+ return False
+ if self.inverse:
+ return self.depend.checked
+ else:
+ return not self.depend.checked
+
+
+class Header(NoInputField):
+ def __init__(self, parent, header, space_above, space_below, **kwargs):
+ if 'name' not in kwargs:
+ kwargs['name'] = header
+ NoInputField.__init__(self, parent=parent, **kwargs)
+ self.header = '{!white,black,bold!}%s' % header
+ self.space_above = space_above
+ self.space_below = space_below
+
+ @overrides(BaseField)
+ def render(self, screen, row, col=0, **kwargs):
+ rows = 1
+ if self.space_above:
+ row += 1
+ rows += 1
+ self.parent.add_string(row, self.header, scr=screen, col=col, pad=False)
+ if self.space_below:
+ rows += 1
+ return rows
+
+ @property
+ def height(self):
+ return 1 + int(self.space_above) + int(self.space_below)
+
+
+class InfoField(NoInputField):
+ def __init__(self, parent, name, label, value, **kwargs):
+ NoInputField.__init__(self, parent=parent, name=name, **kwargs)
+ self.label = label
+ self.value = value
+ self.txt = '%s %s' % (label, value)
+
+ @overrides(BaseField)
+ def render(self, screen, row, col=0, **kwargs):
+ self.parent.add_string(row, self.txt, scr=screen, col=col, pad=False)
+ return 1
+
+ @overrides(BaseField)
+ def set_value(self, v):
+ self.value = v
+ if isinstance(v, float):
+ self.txt = '%s %.2f' % (self.label, self.value)
+ else:
+ self.txt = '%s %s' % (self.label, self.value)
+
+
+class CheckedInput(InputField):
+ def __init__(
+ self,
+ parent,
+ name,
+ message,
+ checked=False,
+ checked_char='X',
+ unchecked_char=' ',
+ checkbox_format='[%s] ',
+ **kwargs
+ ):
+ InputField.__init__(self, parent, name, message, **kwargs)
+ self.set_value(checked)
+ self.fmt_keys.update(
+ {
+ 'msg': message,
+ 'checkbox_format': checkbox_format,
+ 'unchecked_char': unchecked_char,
+ 'checked_char': checked_char,
+ }
+ )
+ self.set_fmt_key('font_checked', 'font', kwargs)
+ self.set_fmt_key('font_unfocused_checked', 'font_checked', kwargs)
+ self.set_fmt_key('font_active_checked', 'font_active', kwargs)
+ self.set_fmt_key('font_unfocused_active_checked', 'font_active_checked', kwargs)
+ self.set_fmt_key('color_checked', 'color', kwargs)
+ self.set_fmt_key('color_active_checked', 'color_active', kwargs)
+ self.set_fmt_key('color_unfocused_checked', 'color_checked', kwargs)
+ self.set_fmt_key(
+ 'color_unfocused_active_checked', 'color_unfocused_active', kwargs
+ )
+
+ @property
+ def checked(self):
+ return self.value
+
+ @overrides(BaseField)
+ def get_fmt_keys(self, focused, active, **kwargs):
+ color_key, font_key = super(CheckedInput, self).get_fmt_keys(
+ focused, active, **kwargs
+ )
+ if self.checked:
+ color_key += '_checked'
+ font_key += '_checked'
+ return color_key, font_key
+
+ def build_msg_string(self, focused, active):
+ fmt_str = self.build_fmt_string(focused, active)
+ char = self.fmt_keys['checked_char' if self.checked else 'unchecked_char']
+ chk_box = ''
+ try:
+ chk_box = self.fmt_keys['checkbox_format'] % char
+ except KeyError:
+ pass
+ msg = fmt_str % self.fmt_keys
+ return chk_box + msg
+
+ @overrides(InputField)
+ def render(self, screen, row, col=0, **kwargs):
+ string = self.build_msg_string(kwargs.get('focused'), kwargs.get('active'))
+
+ self.parent.add_string(row, string, scr=screen, col=col, pad=False)
+ return 1
+
+ @overrides(InputField)
+ def handle_read(self, c):
+ if c == util.KEY_SPACE:
+ self.set_value(not self.checked)
+ return util.ReadState.CHANGED
+ return util.ReadState.IGNORED
+
+ @overrides(InputField)
+ def set_message(self, msg):
+ changed = InputField.set_message(self, msg)
+ if 'msg' in self.fmt_keys and self.fmt_keys['msg'] != msg:
+ changed = True
+ self.fmt_keys.update({'msg': msg})
+
+ return changed
+
+
+class CheckedPlusInput(CheckedInput):
+ def __init__(
+ self,
+ parent,
+ name,
+ message,
+ child,
+ child_always_visible=False,
+ show_usage_hints=True,
+ msg_fmt='%s ',
+ **kwargs
+ ):
+ CheckedInput.__init__(self, parent, name, message, **kwargs)
+ self.child = child
+ self.child_active = False
+ self.show_usage_hints = show_usage_hints
+ self.msg_fmt = msg_fmt
+ self.child_always_visible = child_always_visible
+
+ @property
+ def height(self):
+ return max(2 if self.show_usage_hints else 1, self.child.height)
+
+ @overrides(CheckedInput)
+ def render(
+ self, screen, row, width=None, active=False, focused=False, col=0, **kwargs
+ ):
+ isact = active and not self.child_active
+ CheckedInput.render(
+ self, screen, row, width=width, active=isact, focused=focused, col=col
+ )
+ rows = 1
+ if self.show_usage_hints and (
+ self.child_always_visible or (active and self.checked)
+ ):
+ msg = '(esc to leave)' if self.child_active else '(right arrow to edit)'
+ self.parent.add_string(row + 1, msg, scr=screen, col=col, pad=False)
+ rows += 1
+
+ msglen = len(
+ self.msg_fmt % colors.strip_colors(self.build_msg_string(focused, active))
+ )
+ # show child
+ if self.checked or self.child_always_visible:
+ crows = self.child.render(
+ screen,
+ row,
+ width=width - msglen,
+ active=self.child_active and active,
+ col=col + msglen,
+ cursor_offset=msglen,
+ )
+ rows = max(rows, crows)
+ else:
+ self.parent.add_string(
+ row,
+ '(enable to view/edit value)',
+ scr=screen,
+ col=col + msglen,
+ pad=False,
+ )
+ return rows
+
+ @overrides(CheckedInput)
+ def handle_read(self, c):
+ if self.child_active:
+ if c == util.KEY_ESC: # leave child on esc
+ self.child_active = False
+ return util.ReadState.READ
+ # pass keys through to child
+ return self.child.handle_read(c)
+ else:
+ if c == util.KEY_SPACE:
+ self.set_value(not self.checked)
+ return util.ReadState.CHANGED
+ if (self.checked or self.child_always_visible) and c == curses.KEY_RIGHT:
+ self.child_active = True
+ return util.ReadState.READ
+ return util.ReadState.IGNORED
+
+ def get_child(self):
+ return self.child
+
+
+class IntSpinInput(InputField):
+ def __init__(
+ self,
+ parent,
+ name,
+ message,
+ move_func,
+ value,
+ min_val=None,
+ max_val=None,
+ inc_amt=1,
+ incr_large=10,
+ strict_validation=False,
+ fmt='%d',
+ **kwargs
+ ):
+ InputField.__init__(self, parent, name, message, **kwargs)
+ self.convert_func = int
+ self.fmt = fmt
+ self.valstr = str(value)
+ self.default_str = self.valstr
+ self.set_value(value)
+ self.default_value = self.value
+ self.last_valid_value = self.value
+ self.last_active = False
+ self.cursor = len(self.valstr)
+ self.cursoff = (
+ colors.get_line_width(self.message) + 3
+ ) # + 4 for the " [ " in the rendered string
+ self.move_func = move_func
+ self.strict_validation = strict_validation
+ self.min_val = min_val
+ self.max_val = max_val
+ self.inc_amt = inc_amt
+ self.incr_large = incr_large
+
+ def validate_value(self, value, on_invalid=None):
+ if (self.min_val is not None) and value < self.min_val:
+ value = on_invalid if on_invalid else self.min_val
+ if (self.max_val is not None) and value > self.max_val:
+ value = on_invalid if on_invalid else self.max_val
+ return value
+
+ @overrides(InputField)
+ def render(
+ self, screen, row, active=False, focused=True, col=0, cursor_offset=0, **kwargs
+ ):
+ if active:
+ self.last_active = True
+ elif self.last_active:
+ self.set_value(
+ self.valstr, validate=True, value_on_fail=self.last_valid_value
+ )
+ self.last_active = False
+
+ fmt_str = self.build_fmt_string(focused, active, value_key='value')
+ value_format = '%(msg)s {!input!}'
+ if not self.valstr:
+ value_format += '[ ]'
+ elif self.format_default and self.valstr == self.default_str:
+ value_format += '[ {!magenta,black!}%(value)s{!input!} ]'
+ else:
+ value_format += '[ ' + fmt_str + ' ]'
+
+ self.parent.add_string(
+ row,
+ value_format
+ % dict({'msg': self.message, 'value': '%s' % self.valstr}, **self.fmt_keys),
+ scr=screen,
+ col=col,
+ pad=False,
+ )
+ if active:
+ if focused:
+ util.safe_curs_set(util.Curser.NORMAL)
+ self.move_func(row, self.cursor + self.cursoff + cursor_offset)
+ else:
+ util.safe_curs_set(util.Curser.INVISIBLE)
+ return 1
+
+ @overrides(InputField)
+ def handle_read(self, c):
+ if c == util.KEY_SPACE:
+ return util.ReadState.READ
+ elif c == curses.KEY_PPAGE:
+ self.set_value(self.value + self.inc_amt, validate=True)
+ elif c == curses.KEY_NPAGE:
+ self.set_value(self.value - self.inc_amt, validate=True)
+ elif c == util.KEY_ALT_AND_KEY_PPAGE:
+ self.set_value(self.value + self.incr_large, validate=True)
+ elif c == util.KEY_ALT_AND_KEY_NPAGE:
+ self.set_value(self.value - self.incr_large, validate=True)
+ elif c == curses.KEY_LEFT:
+ self.cursor = max(0, self.cursor - 1)
+ elif c == curses.KEY_RIGHT:
+ self.cursor = min(len(self.valstr), self.cursor + 1)
+ elif c == curses.KEY_HOME:
+ self.cursor = 0
+ elif c == curses.KEY_END:
+ self.cursor = len(self.valstr)
+ elif c == curses.KEY_BACKSPACE or c == util.KEY_BACKSPACE2:
+ if self.valstr and self.cursor > 0:
+ new_val = self.valstr[: self.cursor - 1] + self.valstr[self.cursor :]
+ self.set_value(
+ new_val,
+ validate=False,
+ cursor=self.cursor - 1,
+ cursor_on_fail=True,
+ value_on_fail=self.valstr if self.strict_validation else None,
+ )
+ elif c == curses.KEY_DC: # Del
+ if self.valstr and self.cursor <= len(self.valstr):
+ if self.cursor == 0:
+ new_val = self.valstr[1:]
+ else:
+ new_val = (
+ self.valstr[: self.cursor] + self.valstr[self.cursor + 1 :]
+ )
+ self.set_value(
+ new_val,
+ validate=False,
+ cursor=False,
+ value_on_fail=self.valstr if self.strict_validation else None,
+ cursor_on_fail=True,
+ )
+ elif c == ord('-'): # minus
+ self.set_value(
+ self.value - 1,
+ validate=True,
+ cursor=True,
+ cursor_on_fail=True,
+ value_on_fail=self.value,
+ on_invalid=self.value,
+ )
+ elif c == ord('+'): # plus
+ self.set_value(
+ self.value + 1,
+ validate=True,
+ cursor=True,
+ cursor_on_fail=True,
+ value_on_fail=self.value,
+ on_invalid=self.value,
+ )
+ elif util.is_int_chr(c):
+ if self.strict_validation:
+ new_val = (
+ self.valstr[: self.cursor - 1]
+ + chr(c)
+ + self.valstr[self.cursor - 1 :]
+ )
+ self.set_value(
+ new_val,
+ validate=True,
+ cursor=self.cursor + 1,
+ value_on_fail=self.valstr,
+ on_invalid=self.value,
+ )
+ else:
+ minus_place = self.valstr.find('-')
+ if self.cursor > minus_place:
+ new_val = (
+ self.valstr[: self.cursor] + chr(c) + self.valstr[self.cursor :]
+ )
+ self.set_value(
+ new_val,
+ validate=True,
+ cursor=self.cursor + 1,
+ on_invalid=self.value,
+ )
+ else:
+ return util.ReadState.IGNORED
+ return util.ReadState.READ
+
+ @overrides(BaseField)
+ def set_value(
+ self,
+ val,
+ cursor=True,
+ validate=False,
+ cursor_on_fail=False,
+ value_on_fail=None,
+ on_invalid=None,
+ ):
+ value = None
+ try:
+ value = self.convert_func(val)
+ if validate:
+ validated = self.validate_value(value, on_invalid)
+ if validated != value:
+ # Value was not valid, so use validated value instead.
+ # Also set cursor according to validated value
+ cursor = True
+ value = validated
+
+ new_valstr = self.fmt % value
+ if new_valstr == self.valstr:
+ # If string has not change, keep cursor
+ cursor = False
+ self.valstr = new_valstr
+ self.last_valid_value = self.value = value
+ except ValueError:
+ if value_on_fail is not None:
+ self.set_value(
+ value_on_fail,
+ cursor=cursor,
+ cursor_on_fail=cursor_on_fail,
+ validate=validate,
+ on_invalid=on_invalid,
+ )
+ return
+ self.value = None
+ self.valstr = val
+ if cursor_on_fail:
+ self.cursor = cursor
+ except TypeError:
+ import traceback
+
+ log.warning('TypeError: %s', ''.join(traceback.format_exc()))
+ else:
+ if cursor is True:
+ self.cursor = len(self.valstr)
+ elif cursor is not False:
+ self.cursor = cursor
+
+
+class FloatSpinInput(IntSpinInput):
+ def __init__(self, parent, message, name, move_func, value, precision=1, **kwargs):
+ self.precision = precision
+ IntSpinInput.__init__(self, parent, message, name, move_func, value, **kwargs)
+ self.fmt = '%%.%df' % precision
+ self.convert_func = lambda valstr: round(float(valstr), self.precision)
+ self.set_value(value)
+ self.cursor = len(self.valstr)
+
+ @overrides(IntSpinInput)
+ def handle_read(self, c):
+ if c == ord('.'):
+ minus_place = self.valstr.find('-')
+ if self.cursor <= minus_place:
+ return util.ReadState.READ
+ point_place = self.valstr.find('.')
+ if point_place >= 0:
+ return util.ReadState.READ
+ new_val = self.valstr[: self.cursor] + chr(c) + self.valstr[self.cursor :]
+ self.set_value(new_val, validate=True, cursor=self.cursor + 1)
+ else:
+ return IntSpinInput.handle_read(self, c)
+
+
+class SelectInput(InputField):
+ def __init__(
+ self,
+ parent,
+ name,
+ message,
+ opts,
+ vals,
+ active_index,
+ active_default=False,
+ require_select_action=True,
+ **kwargs
+ ):
+ InputField.__init__(self, parent, name, message, **kwargs)
+ self.opts = opts
+ self.vals = vals
+ self.active_index = active_index
+ self.selected_index = active_index
+ self.default_option = active_index if active_default else None
+ self.require_select_action = require_select_action
+ self.fmt_keys.update({'font_active': 'bold'})
+ font_selected = kwargs.get('font_selected', 'bold,underline')
+
+ self.set_fmt_key('font_selected', font_selected, kwargs)
+ self.set_fmt_key('font_active_selected', 'font_selected', kwargs)
+ self.set_fmt_key('font_unfocused_selected', 'font_selected', kwargs)
+ self.set_fmt_key(
+ 'font_unfocused_active_selected', 'font_active_selected', kwargs
+ )
+
+ self.set_fmt_key('color_selected', 'color', kwargs)
+ self.set_fmt_key('color_active_selected', 'color_active', kwargs)
+ self.set_fmt_key('color_unfocused_selected', 'color_selected', kwargs)
+ self.set_fmt_key(
+ 'color_unfocused_active_selected', 'color_unfocused_active', kwargs
+ )
+ self.set_fmt_key('color_default_value', 'magenta,black', kwargs)
+
+ self.set_fmt_key('color_default_value', 'magenta,black')
+ self.set_fmt_key('color_default_value_active', 'magentadark,white')
+ self.set_fmt_key('color_default_value_selected', 'color_default_value', kwargs)
+ self.set_fmt_key('color_default_value_unfocused', 'color_default_value', kwargs)
+ self.set_fmt_key(
+ 'color_default_value_unfocused_selected',
+ 'color_default_value_selected',
+ kwargs,
+ )
+ self.set_fmt_key('color_default_value_active_selected', 'magentadark,white')
+ self.set_fmt_key(
+ 'color_default_value_unfocused_active_selected',
+ 'color_unfocused_active',
+ kwargs,
+ )
+
+ @property
+ def height(self):
+ return 1 + bool(self.message)
+
+ @overrides(BaseField)
+ def get_fmt_keys(self, focused, active, selected=False, **kwargs):
+ color_key, font_key = super(SelectInput, self).get_fmt_keys(
+ focused, active, **kwargs
+ )
+ if selected:
+ color_key += '_selected'
+ font_key += '_selected'
+ return color_key, font_key
+
+ @overrides(InputField)
+ def render(self, screen, row, active=False, focused=True, col=0, **kwargs):
+ if self.message:
+ self.parent.add_string(row, self.message, scr=screen, col=col, pad=False)
+ row += 1
+
+ off = col + 1
+ for i, opt in enumerate(self.opts):
+ self.fmt_keys['msg'] = opt
+ fmt_args = {'selected': i == self.selected_index}
+ if i == self.default_option:
+ fmt_args['color_key'] = 'color_default_value'
+ fmt = self.build_fmt_string(
+ focused, (i == self.active_index) and active, **fmt_args
+ )
+ string = '[%s]' % (fmt % self.fmt_keys)
+ self.parent.add_string(row, string, scr=screen, col=off, pad=False)
+ off += len(opt) + 3
+ if self.message:
+ return 2
+ else:
+ return 1
+
+ @overrides(InputField)
+ def handle_read(self, c):
+ if c == curses.KEY_LEFT:
+ self.active_index = max(0, self.active_index - 1)
+ if not self.require_select_action:
+ self.selected_index = self.active_index
+ elif c == curses.KEY_RIGHT:
+ self.active_index = min(len(self.opts) - 1, self.active_index + 1)
+ if not self.require_select_action:
+ self.selected_index = self.active_index
+ elif c == ord(' '):
+ if self.require_select_action:
+ self.selected_index = self.active_index
+ else:
+ return util.ReadState.IGNORED
+ return util.ReadState.READ
+
+ @overrides(BaseField)
+ def get_value(self):
+ return self.vals[self.selected_index]
+
+ @overrides(BaseField)
+ def set_value(self, value):
+ for i, val in enumerate(self.vals):
+ if value == val:
+ self.selected_index = i
+ return
+ raise Exception('Invalid value for SelectInput')
+
+
+class TextInput(InputField):
+ def __init__(
+ self,
+ parent,
+ name,
+ message,
+ move_func,
+ width,
+ value,
+ complete=False,
+ activate_input=False,
+ **kwargs
+ ):
+ InputField.__init__(self, parent, name, message, **kwargs)
+ self.move_func = move_func
+ self._width = width
+ self.value = value if value else ''
+ self.default_value = value
+ self.complete = complete
+ self.tab_count = 0
+ self.cursor = len(self.value)
+ self.opts = None
+ self.opt_off = 0
+ self.value_offset = 0
+ self.activate_input = activate_input # Wether input must be activated
+ self.input_active = not self.activate_input
+
+ @property
+ def width(self):
+ return self._width
+
+ @property
+ def height(self):
+ return 1 + bool(self.message)
+
+ def calculate_textfield_value(self, width, cursor_offset):
+ cursor_width = width
+
+ if self.cursor > (cursor_width - 1):
+ c_pos_abs = self.cursor - cursor_width
+ if cursor_width <= (self.cursor - self.value_offset):
+ new_cur = c_pos_abs + 1
+ self.value_offset = new_cur
+ else:
+ if self.cursor >= len(self.value):
+ c_pos_abs = len(self.value) - cursor_width
+ new_cur = c_pos_abs + 1
+ self.value_offset = new_cur
+ vstr = self.value[self.value_offset :]
+
+ if len(vstr) > cursor_width:
+ vstr = vstr[:cursor_width]
+ vstr = vstr.ljust(cursor_width)
+ else:
+ if len(self.value) <= cursor_width:
+ self.value_offset = 0
+ vstr = self.value.ljust(cursor_width)
+ else:
+ self.value_offset = min(self.value_offset, self.cursor)
+ vstr = self.value[self.value_offset :]
+ if len(vstr) > cursor_width:
+ vstr = vstr[:cursor_width]
+ vstr = vstr.ljust(cursor_width)
+
+ return vstr
+
+ def calculate_cursor_pos(self, width, col):
+ cursor_width = width
+ x_pos = self.cursor + col
+
+ if (self.cursor + col - self.value_offset) > cursor_width:
+ x_pos += self.value_offset
+ else:
+ x_pos -= self.value_offset
+
+ return min(width - 1 + col, x_pos)
+
+ @overrides(InputField)
+ def render(
+ self,
+ screen,
+ row,
+ width=None,
+ active=False,
+ focused=True,
+ col=0,
+ cursor_offset=0,
+ **kwargs
+ ):
+ if not self.value and not active and len(self.default_value) != 0:
+ self.value = self.default_value
+ self.cursor = len(self.value)
+
+ if self.message:
+ self.parent.add_string(row, self.message, scr=screen, col=col, pad=False)
+ row += 1
+
+ vstr = self.calculate_textfield_value(width, cursor_offset)
+
+ if active:
+ if self.opts:
+ self.parent.add_string(
+ row + 1, self.opts[self.opt_off :], scr=screen, col=col, pad=False
+ )
+
+ if focused and self.input_active:
+ util.safe_curs_set(
+ util.Curser.NORMAL
+ ) # Make cursor visible when text field is focused
+ x_pos = self.calculate_cursor_pos(width, col)
+ self.move_func(row, x_pos)
+
+ fmt = '{!black,white,bold!}%s'
+ if (
+ self.format_default
+ and len(self.value) != 0
+ and self.value == self.default_value
+ ):
+ fmt = '{!magenta,white!}%s'
+ if not active or not focused or self.input_active:
+ fmt = '{!white,grey,bold!}%s'
+
+ self.parent.add_string(
+ row, fmt % vstr, scr=screen, col=col, pad=False, trim=False
+ )
+ return self.height
+
+ @overrides(BaseField)
+ def set_value(self, val):
+ self.value = val
+ self.cursor = len(self.value)
+
+ @overrides(InputField)
+ def handle_read(self, c):
+ """
+ Return False when key was swallowed, i.e. we recognised
+ the key and no further action by other components should
+ be performed.
+ """
+ if self.activate_input:
+ if not self.input_active:
+ if c in [
+ curses.KEY_LEFT,
+ curses.KEY_RIGHT,
+ curses.KEY_HOME,
+ curses.KEY_END,
+ curses.KEY_ENTER,
+ util.KEY_ENTER2,
+ ]:
+ self.input_active = True
+ return util.ReadState.READ
+ else:
+ return util.ReadState.IGNORED
+ elif c == util.KEY_ESC:
+ self.input_active = False
+ return util.ReadState.READ
+
+ if c == util.KEY_TAB and self.complete:
+ # Keep track of tab hit count to know when it's double-hit
+ self.tab_count += 1
+ if self.tab_count > 1:
+ second_hit = True
+ self.tab_count = 0
+ else:
+ second_hit = False
+
+ # We only call the tab completer function if we're at the end of
+ # the input string on the cursor is on a space
+ if self.cursor == len(self.value) or self.value[self.cursor] == ' ':
+ if self.opts:
+ prev = self.opt_off
+ self.opt_off += self.width - 3
+ # now find previous double space, best guess at a split point
+ # in future could keep opts unjoined to get this really right
+ self.opt_off = self.opts.rfind(' ', 0, self.opt_off) + 2
+ if (
+ second_hit and self.opt_off == prev
+ ): # double tap and we're at the end
+ self.opt_off = 0
+ else:
+ opts = self.do_complete(self.value)
+ if len(opts) == 1: # only one option, just complete it
+ self.value = opts[0]
+ self.cursor = len(opts[0])
+ self.tab_count = 0
+ elif len(opts) > 1:
+ prefix = os.path.commonprefix(opts)
+ if prefix:
+ self.value = prefix
+ self.cursor = len(prefix)
+
+ if (
+ len(opts) > 1 and second_hit
+ ): # display multiple options on second tab hit
+ sp = self.value.rfind(os.sep) + 1
+ self.opts = ' '.join([o[sp:] for o in opts])
+
+ # Cursor movement
+ elif c == curses.KEY_LEFT:
+ self.cursor = max(0, self.cursor - 1)
+ elif c == curses.KEY_RIGHT:
+ self.cursor = min(len(self.value), self.cursor + 1)
+ elif c == curses.KEY_HOME:
+ self.cursor = 0
+ elif c == curses.KEY_END:
+ self.cursor = len(self.value)
+
+ # Delete a character in the input string based on cursor position
+ elif c == curses.KEY_BACKSPACE or c == util.KEY_BACKSPACE2:
+ if self.value and self.cursor > 0:
+ self.value = self.value[: self.cursor - 1] + self.value[self.cursor :]
+ self.cursor -= 1
+ elif c == [util.KEY_ESC, util.KEY_BACKSPACE2] or c == [
+ util.KEY_ESC,
+ curses.KEY_BACKSPACE,
+ ]:
+ self.value, self.cursor = delete_alt_backspace(self.value, self.cursor)
+ elif c == curses.KEY_DC:
+ if self.value and self.cursor < len(self.value):
+ self.value = self.value[: self.cursor] + self.value[self.cursor + 1 :]
+ elif c > 31 and c < 256:
+ # Emulate getwch
+ stroke = chr(c)
+ uchar = '' if PY2 else stroke
+ while not uchar:
+ try:
+ uchar = stroke.decode(self.parent.encoding)
+ except UnicodeDecodeError:
+ c = self.parent.parent.stdscr.getch()
+ stroke += chr(c)
+ if uchar:
+ if self.cursor == len(self.value):
+ self.value += uchar
+ else:
+ # Insert into string
+ self.value = (
+ self.value[: self.cursor] + uchar + self.value[self.cursor :]
+ )
+ # Move the cursor forward
+ self.cursor += 1
+
+ else:
+ self.opts = None
+ self.opt_off = 0
+ self.tab_count = 0
+ return util.ReadState.IGNORED
+ return util.ReadState.READ
+
+ def do_complete(self, line):
+ line = os.path.abspath(os.path.expanduser(line))
+ ret = []
+ if os.path.exists(line):
+ # This is a correct path, check to see if it's a directory
+ if os.path.isdir(line):
+ # Directory, so we need to show contents of directory
+ for f in os.listdir(line):
+ # Skip hidden
+ if f.startswith('.'):
+ continue
+ f = os.path.join(line, f)
+ if os.path.isdir(f):
+ f += os.sep
+ ret.append(f)
+ else:
+ # This is a file, but we could be looking for another file that
+ # shares a common prefix.
+ for f in os.listdir(os.path.dirname(line)):
+ if f.startswith(os.path.split(line)[1]):
+ ret.append(os.path.join(os.path.dirname(line), f))
+ else:
+ # This path does not exist, so lets do a listdir on it's parent
+ # and find any matches.
+ ret = []
+ if os.path.isdir(os.path.dirname(line)):
+ for f in os.listdir(os.path.dirname(line)):
+ if f.startswith(os.path.split(line)[1]):
+ p = os.path.join(os.path.dirname(line), f)
+
+ if os.path.isdir(p):
+ p += os.sep
+ ret.append(p)
+ return ret
+
+
+class ComboInput(InputField):
+ def __init__(
+ self, parent, name, message, choices, default=None, searchable=True, **kwargs
+ ):
+ InputField.__init__(self, parent, name, message, **kwargs)
+ self.choices = choices
+ self.default = default
+ self.set_value(default)
+ max_width = 0
+ for c in choices:
+ max_width = max(max_width, len(c[1]))
+ self.choices_width = max_width
+ self.searchable = searchable
+
+ @overrides(BaseField)
+ def render(self, screen, row, col=0, **kwargs):
+ fmt_str = self.build_fmt_string(kwargs.get('focused'), kwargs.get('active'))
+ string = '%s: [%10s]' % (self.message, fmt_str % self.fmt_keys)
+ self.parent.add_string(row, string, scr=screen, col=col, pad=False)
+ return 1
+
+ def _lang_selected(self, selected, *args, **kwargs):
+ if selected is not None:
+ self.set_value(selected)
+ self.parent.pop_popup()
+
+ @overrides(InputField)
+ def handle_read(self, c):
+ if c in [util.KEY_SPACE, curses.KEY_ENTER, util.KEY_ENTER2]:
+
+ def search_handler(key):
+ """Handle keyboard input to seach the list"""
+ if not util.is_printable_chr(key):
+ return
+ selected = select_popup.current_selection()
+
+ def select_in_range(begin, end):
+ for i in range(begin, end):
+ val = select_popup.inputs[i].get_value()
+ if val.lower().startswith(chr(key)):
+ select_popup.set_selection(i)
+ return True
+ return False
+
+ # First search downwards
+ if not select_in_range(selected + 1, len(select_popup.inputs)):
+ # No match, so start at beginning
+ select_in_range(0, selected)
+
+ from deluge.ui.console.widgets.popup import (
+ SelectablePopup,
+ ) # Must import here
+
+ select_popup = SelectablePopup(
+ self.parent,
+ ' %s ' % _('Select Language'),
+ self._lang_selected,
+ input_cb=search_handler if self.searchable else None,
+ border_off_west=1,
+ active_wrap=False,
+ width_req=self.choices_width + 12,
+ )
+ for choice in self.choices:
+ args = {'data': choice[0]}
+ select_popup.add_line(
+ choice[0],
+ choice[1],
+ selectable=True,
+ selected=choice[0] == self.get_value(),
+ **args
+ )
+ self.parent.push_popup(select_popup)
+ return util.ReadState.CHANGED
+ return util.ReadState.IGNORED
+
+ @overrides(BaseField)
+ def set_value(self, val):
+ self.value = val
+ msg = None
+ for c in self.choices:
+ if c[0] == val:
+ msg = c[1]
+ break
+ if msg is None:
+ log.warning(
+ 'Setting value "%s" found nothing in choices: %s', val, self.choices
+ )
+ self.fmt_keys.update({'msg': msg})
+
+
+class TextField(BaseField):
+ def __init__(self, parent, name, value, selectable=True, value_fmt='%s', **kwargs):
+ BaseField.__init__(
+ self, parent=parent, name=name, selectable=selectable, **kwargs
+ )
+ self.value = value
+ self.value_fmt = value_fmt
+ self.set_value(value)
+
+ @overrides(BaseField)
+ def set_value(self, value):
+ self.value = value
+ self.txt = self.value_fmt % (value)
+
+ @overrides(BaseField)
+ def has_input(self):
+ return True
+
+ @overrides(BaseField)
+ def render(self, screen, row, active=False, focused=False, col=0, **kwargs):
+ util.safe_curs_set(
+ util.Curser.INVISIBLE
+ ) # Make cursor invisible when text field is active
+ fmt = self.build_fmt_string(focused, active)
+ self.fmt_keys['msg'] = self.txt
+ string = fmt % self.fmt_keys
+ self.parent.add_string(row, string, scr=screen, col=col, pad=False, trim=False)
+ return 1
+
+
+class TextArea(TextField):
+ def __init__(self, parent, name, value, value_fmt='%s', **kwargs):
+ TextField.__init__(
+ self, parent, name, value, selectable=False, value_fmt=value_fmt, **kwargs
+ )
+
+ @overrides(TextField)
+ def render(self, screen, row, col=0, **kwargs):
+ util.safe_curs_set(
+ util.Curser.INVISIBLE
+ ) # Make cursor invisible when text field is active
+ color = '{!white,black!}'
+ lines = wrap_string(self.txt, self.parent.width - 3, 3, True)
+
+ for i, line in enumerate(lines):
+ self.parent.add_string(
+ row + i,
+ '%s%s' % (color, line),
+ scr=screen,
+ col=col,
+ pad=False,
+ trim=False,
+ )
+ return len(lines)
+
+ @property
+ def height(self):
+ lines = wrap_string(self.txt, self.parent.width - 3, 3, True)
+ return len(lines)
+
+ @overrides(TextField)
+ def has_input(self):
+ return False
+
+
+class DividerField(NoInputField):
+ def __init__(
+ self,
+ parent,
+ name,
+ value,
+ selectable=False,
+ fill_width=True,
+ value_fmt='%s',
+ **kwargs
+ ):
+ NoInputField.__init__(
+ self, parent=parent, name=name, selectable=selectable, **kwargs
+ )
+ self.value = value
+ self.value_fmt = value_fmt
+ self.set_value(value)
+ self.fill_width = fill_width
+
+ @overrides(BaseField)
+ def set_value(self, value):
+ self.value = value
+ self.txt = self.value_fmt % (value)
+
+ @overrides(BaseField)
+ def render(
+ self, screen, row, active=False, focused=False, col=0, width=None, **kwargs
+ ):
+ util.safe_curs_set(
+ util.Curser.INVISIBLE
+ ) # Make cursor invisible when text field is active
+ fmt = self.build_fmt_string(focused, active)
+ self.fmt_keys['msg'] = self.txt
+ if self.fill_width:
+ self.fmt_keys['msg'] = ''
+ string_len = len(remove_formatting(fmt % self.fmt_keys))
+ fill_len = width - string_len - (len(self.txt) - 1)
+ self.fmt_keys['msg'] = self.txt * fill_len
+ string = fmt % self.fmt_keys
+ self.parent.add_string(row, string, scr=screen, col=col, pad=False, trim=False)
+ return 1
diff --git a/deluge/ui/console/widgets/inputpane.py b/deluge/ui/console/widgets/inputpane.py
new file mode 100644
index 0000000..097a6cb
--- /dev/null
+++ b/deluge/ui/console/widgets/inputpane.py
@@ -0,0 +1,397 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.decorators import overrides
+from deluge.ui.console.modes.basemode import InputKeyHandler, move_cursor
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.widgets.fields import (
+ CheckedInput,
+ CheckedPlusInput,
+ ComboInput,
+ DividerField,
+ FloatSpinInput,
+ Header,
+ InfoField,
+ IntSpinInput,
+ NoInputField,
+ SelectInput,
+ TextArea,
+ TextField,
+ TextInput,
+)
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+
+
+class BaseInputPane(InputKeyHandler):
+ def __init__(
+ self,
+ mode,
+ allow_rearrange=False,
+ immediate_action=False,
+ set_first_input_active=True,
+ border_off_west=0,
+ border_off_north=0,
+ border_off_east=0,
+ border_off_south=0,
+ active_wrap=False,
+ **kwargs
+ ):
+ InputKeyHandler.__init__(self)
+ self.inputs = []
+ self.mode = mode
+ self.active_input = 0
+ self.set_first_input_active = set_first_input_active
+ self.allow_rearrange = allow_rearrange
+ self.immediate_action = immediate_action
+ self.move_active_many = 4
+ self.active_wrap = active_wrap
+ self.lineoff = 0
+ self.border_off_west = border_off_west
+ self.border_off_north = border_off_north
+ self.border_off_east = border_off_east
+ self.border_off_south = border_off_south
+ self.last_lineoff_move = 0
+
+ if not hasattr(self, 'visible_content_pane_height'):
+ log.error(
+ 'The class "%s" does not have the attribute "%s" required by super class "%s"',
+ self.__class__.__name__,
+ 'visible_content_pane_height',
+ BaseInputPane.__name__,
+ )
+ raise AttributeError('visible_content_pane_height')
+
+ @property
+ def visible_content_pane_width(self):
+ return self.mode.width
+
+ def add_spaces(self, num):
+ string = ''
+ for i in range(num):
+ string += '\n'
+
+ self.add_text_area('space %d' % len(self.inputs), string)
+
+ def add_text(self, string):
+ self.add_text_area('', string)
+
+ def move(self, r, c):
+ self._cursor_row = r
+ self._cursor_col = c
+
+ def get_input(self, name):
+ for e in self.inputs:
+ if e.name == name:
+ return e
+
+ def _add_input(self, input_element):
+ for e in self.inputs:
+ if isinstance(e, NoInputField):
+ continue
+ if e.name == input_element.name:
+ import traceback
+
+ log.warning(
+ 'Input element with name "%s" already exists in input pane (%s):\n%s',
+ input_element.name,
+ e,
+ ''.join(traceback.format_stack(limit=5)),
+ )
+ return
+
+ self.inputs.append(input_element)
+ if self.set_first_input_active and input_element.selectable():
+ self.active_input = len(self.inputs) - 1
+ self.set_first_input_active = False
+ return input_element
+
+ def add_header(self, header, space_above=False, space_below=False, **kwargs):
+ return self._add_input(Header(self, header, space_above, space_below, **kwargs))
+
+ def add_info_field(self, name, label, value):
+ return self._add_input(InfoField(self, name, label, value))
+
+ def add_text_field(self, name, message, selectable=True, col='+1', **kwargs):
+ return self._add_input(
+ TextField(self, name, message, selectable=selectable, col=col, **kwargs)
+ )
+
+ def add_text_area(self, name, message, **kwargs):
+ return self._add_input(TextArea(self, name, message, **kwargs))
+
+ def add_divider_field(self, name, message, **kwargs):
+ return self._add_input(DividerField(self, name, message, **kwargs))
+
+ def add_text_input(self, name, message, value='', col='+1', **kwargs):
+ """
+ Add a text input field
+
+ :param message: string to display above the input field
+ :param name: name of the field, for the return callback
+ :param value: initial value of the field
+ :param complete: should completion be run when tab is hit and this field is active
+ """
+ return self._add_input(
+ TextInput(
+ self,
+ name,
+ message,
+ self.move,
+ self.visible_content_pane_width,
+ value,
+ col=col,
+ **kwargs
+ )
+ )
+
+ def add_select_input(self, name, message, opts, vals, default_index=0, **kwargs):
+ return self._add_input(
+ SelectInput(self, name, message, opts, vals, default_index, **kwargs)
+ )
+
+ def add_checked_input(self, name, message, checked=False, col='+1', **kwargs):
+ return self._add_input(
+ CheckedInput(self, name, message, checked=checked, col=col, **kwargs)
+ )
+
+ def add_checkedplus_input(
+ self, name, message, child, checked=False, col='+1', **kwargs
+ ):
+ return self._add_input(
+ CheckedPlusInput(
+ self, name, message, child, checked=checked, col=col, **kwargs
+ )
+ )
+
+ def add_float_spin_input(self, name, message, value=0.0, col='+1', **kwargs):
+ return self._add_input(
+ FloatSpinInput(self, name, message, self.move, value, col=col, **kwargs)
+ )
+
+ def add_int_spin_input(self, name, message, value=0, col='+1', **kwargs):
+ return self._add_input(
+ IntSpinInput(self, name, message, self.move, value, col=col, **kwargs)
+ )
+
+ def add_combo_input(self, name, message, choices, col='+1', **kwargs):
+ return self._add_input(
+ ComboInput(self, name, message, choices, col=col, **kwargs)
+ )
+
+ @overrides(InputKeyHandler)
+ def handle_read(self, c):
+ if not self.inputs: # no inputs added yet
+ return util.ReadState.IGNORED
+ ret = self.inputs[self.active_input].handle_read(c)
+ if ret != util.ReadState.IGNORED:
+ if self.immediate_action:
+ self.immediate_action_cb(
+ state_changed=False if ret == util.ReadState.READ else True
+ )
+ return ret
+
+ ret = util.ReadState.READ
+
+ if c == curses.KEY_UP:
+ self.move_active_up(1)
+ elif c == curses.KEY_DOWN:
+ self.move_active_down(1)
+ elif c == curses.KEY_HOME:
+ self.move_active_up(len(self.inputs))
+ elif c == curses.KEY_END:
+ self.move_active_down(len(self.inputs))
+ elif c == curses.KEY_PPAGE:
+ self.move_active_up(self.move_active_many)
+ elif c == curses.KEY_NPAGE:
+ self.move_active_down(self.move_active_many)
+ elif c == util.KEY_ALT_AND_ARROW_UP:
+ self.lineoff = max(self.lineoff - 1, 0)
+ elif c == util.KEY_ALT_AND_ARROW_DOWN:
+ tot_height = self.get_content_height()
+ self.lineoff = min(
+ self.lineoff + 1, tot_height - self.visible_content_pane_height
+ )
+ elif c == util.KEY_CTRL_AND_ARROW_UP:
+ if not self.allow_rearrange:
+ return ret
+ val = self.inputs.pop(self.active_input)
+ self.active_input -= 1
+ self.inputs.insert(self.active_input, val)
+ if self.immediate_action:
+ self.immediate_action_cb(state_changed=True)
+ elif c == util.KEY_CTRL_AND_ARROW_DOWN:
+ if not self.allow_rearrange:
+ return ret
+ val = self.inputs.pop(self.active_input)
+ self.active_input += 1
+ self.inputs.insert(self.active_input, val)
+ if self.immediate_action:
+ self.immediate_action_cb(state_changed=True)
+ else:
+ ret = util.ReadState.IGNORED
+ return ret
+
+ def get_values(self):
+ vals = {}
+ for i, ipt in enumerate(self.inputs):
+ if not ipt.has_input():
+ continue
+ vals[ipt.name] = {
+ 'value': ipt.get_value(),
+ 'order': i,
+ 'active': self.active_input == i,
+ }
+ return vals
+
+ def immediate_action_cb(self, state_changed=True):
+ pass
+
+ def move_active(self, direction, amount):
+ """
+ direction == -1: Up
+ direction == 1: Down
+
+ """
+ self.last_lineoff_move = direction * amount
+
+ if direction > 0:
+ if self.active_wrap:
+ limit = self.active_input - 1
+ if limit < 0:
+ limit = len(self.inputs) + limit
+ else:
+ limit = len(self.inputs) - 1
+ else:
+ limit = 0
+ if self.active_wrap:
+ limit = self.active_input + 1
+
+ def next_move(nc, direction, limit):
+ next_index = nc
+ while next_index != limit:
+ next_index += direction
+ if direction > 0:
+ next_index %= len(self.inputs)
+ elif next_index < 0:
+ next_index = len(self.inputs) + next_index
+
+ if self.inputs[next_index].selectable():
+ return next_index
+ if next_index == limit:
+ return nc
+ return nc
+
+ next_sel = self.active_input
+ for a in range(amount):
+ cur_sel = next_sel
+ next_sel = next_move(next_sel, direction, limit)
+ if cur_sel == next_sel:
+ tot_height = (
+ self.get_content_height()
+ + self.border_off_north
+ + self.border_off_south
+ )
+ if direction > 0:
+ self.lineoff = min(
+ self.lineoff + 1, tot_height - self.visible_content_pane_height
+ )
+ else:
+ self.lineoff = max(self.lineoff - 1, 0)
+
+ if next_sel is not None:
+ self.active_input = next_sel
+
+ def move_active_up(self, amount):
+ self.move_active(-1, amount)
+ if self.immediate_action:
+ self.immediate_action_cb(state_changed=False)
+
+ def move_active_down(self, amount):
+ self.move_active(1, amount)
+ if self.immediate_action:
+ self.immediate_action_cb(state_changed=False)
+
+ def get_content_height(self):
+ height = 0
+ for i, ipt in enumerate(self.inputs):
+ if ipt.depend_skip():
+ continue
+ height += ipt.height
+ return height
+
+ def ensure_active_visible(self):
+ start_row = 0
+ end_row = self.border_off_north
+ for i, ipt in enumerate(self.inputs):
+ if ipt.depend_skip():
+ continue
+ start_row = end_row
+ end_row += ipt.height
+ if i != self.active_input or not ipt.has_input():
+ continue
+ height = self.visible_content_pane_height
+ if end_row > height + self.lineoff:
+ self.lineoff += end_row - (
+ height + self.lineoff
+ ) # Correct result depends on paranthesis
+ elif start_row < self.lineoff:
+ self.lineoff -= self.lineoff - start_row
+ break
+
+ def render_inputs(self, focused=False):
+ self._cursor_row = -1
+ self._cursor_col = -1
+ util.safe_curs_set(util.Curser.INVISIBLE)
+
+ self.ensure_active_visible()
+
+ crow = self.border_off_north
+ for i, ipt in enumerate(self.inputs):
+ if ipt.depend_skip():
+ continue
+ col = self.border_off_west
+ field_width = self.width - self.border_off_east - self.border_off_west
+ cursor_offset = self.border_off_west
+
+ if ipt.default_col != -1:
+ default_col = int(ipt.default_col)
+ if isinstance(ipt.default_col, ''.__class__) and ipt.default_col[0] in [
+ '+',
+ '-',
+ ]:
+ col += default_col
+ cursor_offset += default_col
+ field_width -= default_col # Increase to col must be reflected here
+ else:
+ col = default_col
+ crow += ipt.render(
+ self.screen,
+ crow,
+ width=field_width,
+ active=i == self.active_input,
+ focused=focused,
+ col=col,
+ cursor_offset=cursor_offset,
+ )
+
+ if self._cursor_row >= 0:
+ util.safe_curs_set(util.Curser.VERY_VISIBLE)
+ move_cursor(self.screen, self._cursor_row, self._cursor_col)
diff --git a/deluge/ui/console/widgets/popup.py b/deluge/ui/console/widgets/popup.py
new file mode 100644
index 0000000..d588bbb
--- /dev/null
+++ b/deluge/ui/console/widgets/popup.py
@@ -0,0 +1,402 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.decorators import overrides
+from deluge.ui.console.modes.basemode import InputKeyHandler
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.utils import format_utils
+from deluge.ui.console.widgets import BaseInputPane, BaseWindow
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+
+
+class ALIGN(object):
+ TOP_LEFT = 1
+ TOP_CENTER = 2
+ TOP_RIGHT = 3
+ MIDDLE_LEFT = 4
+ MIDDLE_CENTER = 5
+ MIDDLE_RIGHT = 6
+ BOTTOM_LEFT = 7
+ BOTTOM_CENTER = 8
+ BOTTOM_RIGHT = 9
+ DEFAULT = MIDDLE_CENTER
+
+
+class PopupsHandler(object):
+ def __init__(self):
+ self._popups = []
+
+ @property
+ def popup(self):
+ if self._popups:
+ return self._popups[-1]
+ return None
+
+ def push_popup(self, pu, clear=False):
+ if clear:
+ self._popups = []
+ self._popups.append(pu)
+
+ def pop_popup(self):
+ if self.popup:
+ return self._popups.pop()
+
+ def report_message(self, title, message):
+ self.push_popup(MessagePopup(self, title, message))
+
+
+class Popup(BaseWindow, InputKeyHandler):
+ def __init__(
+ self,
+ parent_mode,
+ title,
+ width_req=0,
+ height_req=0,
+ align=ALIGN.DEFAULT,
+ close_cb=None,
+ encoding=None,
+ base_popup=None,
+ **kwargs
+ ):
+ """
+ Init a new popup. The default constructor will handle sizing and borders and the like.
+
+ Args:
+ parent_mode (basemode subclass): The mode which the popup will be drawn over
+ title (str): the title of the popup window
+ width_req (int or float): An integer value will be used as the width of the popup in character.
+ A float value will indicate the requested ratio in relation to the
+ parents screen width.
+ height_req (int or float): An integer value will be used as the height of the popup in character.
+ A float value will indicate the requested ratio in relation to the
+ parents screen height.
+ align (ALIGN): The alignment controlling the position of the popup on the screen.
+ close_cb (func): Function to be called when the popup is closed
+ encoding (str): The terminal encoding
+ base_popup (Popup): A popup used to inherit width_req and height_req if not explicitly specified.
+
+ Note: The parent mode is responsible for calling refresh on any popups it wants to show.
+ This should be called as the last thing in the parents refresh method.
+
+ The parent *must* also call read_input on the popup instead of/in addition to
+ running its own read_input code if it wants to have the popup handle user input.
+
+ Popups have two methods that must be implemented:
+
+ refresh(self) - draw the popup window to screen. this default mode simply draws a bordered window
+ with the supplied title to the screen
+
+ read_input(self) - handle user input to the popup.
+
+ """
+ InputKeyHandler.__init__(self)
+ self.parent = parent_mode
+ self.close_cb = close_cb
+ self.height_req = height_req
+ self.width_req = width_req
+ self.align = align
+ if base_popup:
+ if not self.width_req:
+ self.width_req = base_popup.width_req
+ if not self.height_req:
+ self.height_req = base_popup.height_req
+
+ hr, wr, posy, posx = self.calculate_size()
+ BaseWindow.__init__(self, title, wr, hr, encoding=None)
+ self.move_window(posy, posx)
+ self._closed = False
+
+ @overrides(BaseWindow)
+ def refresh(self):
+ self.screen.erase()
+ height = self.get_content_height()
+ self.ensure_content_pane_height(
+ height + self.border_off_north + self.border_off_south
+ )
+ BaseInputPane.render_inputs(self, focused=True)
+ BaseWindow.refresh(self)
+
+ def calculate_size(self):
+
+ if isinstance(self.height_req, float) and 0.0 < self.height_req <= 1.0:
+ height = int((self.parent.rows - 2) * self.height_req)
+ else:
+ height = self.height_req
+
+ if isinstance(self.width_req, float) and 0.0 < self.width_req <= 1.0:
+ width = int((self.parent.cols - 2) * self.width_req)
+ else:
+ width = self.width_req
+
+ # Height
+ if height == 0:
+ height = int(self.parent.rows / 2)
+ elif height == -1:
+ height = self.parent.rows - 2
+ elif height > self.parent.rows - 2:
+ height = self.parent.rows - 2
+
+ # Width
+ if width == 0:
+ width = int(self.parent.cols / 2)
+ elif width == -1:
+ width = self.parent.cols
+ elif width >= self.parent.cols:
+ width = self.parent.cols
+
+ if self.align in [ALIGN.TOP_CENTER, ALIGN.TOP_LEFT, ALIGN.TOP_RIGHT]:
+ begin_y = 1
+ elif self.align in [ALIGN.MIDDLE_CENTER, ALIGN.MIDDLE_LEFT, ALIGN.MIDDLE_RIGHT]:
+ begin_y = (self.parent.rows / 2) - (height / 2)
+ elif self.align in [ALIGN.BOTTOM_CENTER, ALIGN.BOTTOM_LEFT, ALIGN.BOTTOM_RIGHT]:
+ begin_y = self.parent.rows - height - 1
+
+ if self.align in [ALIGN.TOP_LEFT, ALIGN.MIDDLE_LEFT, ALIGN.BOTTOM_LEFT]:
+ begin_x = 0
+ elif self.align in [ALIGN.TOP_CENTER, ALIGN.MIDDLE_CENTER, ALIGN.BOTTOM_CENTER]:
+ begin_x = (self.parent.cols / 2) - (width / 2)
+ elif self.align in [ALIGN.TOP_RIGHT, ALIGN.MIDDLE_RIGHT, ALIGN.BOTTOM_RIGHT]:
+ begin_x = self.parent.cols - width
+
+ return height, width, begin_y, begin_x
+
+ def handle_resize(self):
+ height, width, begin_y, begin_x = self.calculate_size()
+ self.resize_window(height, width)
+ self.move_window(begin_y, begin_x)
+
+ def closed(self):
+ return self._closed
+
+ def close(self, *args, **kwargs):
+ self._closed = True
+ if kwargs.get('call_cb', True):
+ self._call_close_cb(*args)
+ self.panel.hide()
+
+ def _call_close_cb(self, *args, **kwargs):
+ if self.close_cb:
+ self.close_cb(*args, base_popup=self, **kwargs)
+
+ @overrides(InputKeyHandler)
+ def handle_read(self, c):
+ if c == util.KEY_ESC: # close on esc, no action
+ self.close(None)
+ return util.ReadState.READ
+ return util.ReadState.IGNORED
+
+
+class SelectablePopup(BaseInputPane, Popup):
+ """
+ A popup which will let the user select from some of the lines that are added.
+ """
+
+ def __init__(
+ self,
+ parent_mode,
+ title,
+ selection_cb,
+ close_cb=None,
+ input_cb=None,
+ allow_rearrange=False,
+ immediate_action=False,
+ **kwargs
+ ):
+ """
+ Args:
+ parent_mode (basemode subclass): The mode which the popup will be drawn over
+ title (str): the title of the popup window
+ selection_cb (func): Function to be called on selection
+ close_cb (func, optional): Function to be called when the popup is closed
+ input_cb (func, optional): Function to be called on every keyboard input
+ allow_rearrange (bool): Allow rearranging the selectable value
+ immediate_action (bool): If immediate_action_cb should be called for every action
+ kwargs (dict): Arguments passed to Popup
+
+ """
+ Popup.__init__(self, parent_mode, title, close_cb=close_cb, **kwargs)
+ kwargs.update(
+ {'allow_rearrange': allow_rearrange, 'immediate_action': immediate_action}
+ )
+ BaseInputPane.__init__(self, self, **kwargs)
+ self.selection_cb = selection_cb
+ self.input_cb = input_cb
+ self.hotkeys = {}
+ self.cb_arg = {}
+ self.cb_args = kwargs.get('cb_args', {})
+ if 'base_popup' not in self.cb_args:
+ self.cb_args['base_popup'] = self
+
+ @property
+ @overrides(BaseWindow)
+ def visible_content_pane_height(self):
+ """We want to use the Popup property"""
+ return Popup.visible_content_pane_height.fget(self)
+
+ def current_selection(self):
+ """Returns a tuple of (selected index, selected data)."""
+ return self.active_input
+
+ def set_selection(self, index):
+ """Set a selected index"""
+ self.active_input = index
+
+ def add_line(
+ self,
+ name,
+ string,
+ use_underline=True,
+ cb_arg=None,
+ foreground=None,
+ selectable=True,
+ selected=False,
+ **kwargs
+ ):
+ hotkey = None
+ self.cb_arg[name] = cb_arg
+ if use_underline:
+ udx = string.find('_')
+ if udx >= 0:
+ hotkey = string[udx].lower()
+ string = (
+ string[:udx]
+ + '{!+underline!}'
+ + string[udx + 1]
+ + '{!-underline!}'
+ + string[udx + 2 :]
+ )
+
+ kwargs['selectable'] = selectable
+ if foreground:
+ kwargs['color_active'] = '%s,white' % foreground
+ kwargs['color'] = '%s,black' % foreground
+
+ field = self.add_text_field(name, string, **kwargs)
+ if hotkey:
+ self.hotkeys[hotkey] = field
+
+ if selected:
+ self.set_selection(len(self.inputs) - 1)
+
+ @overrides(Popup, BaseInputPane)
+ def handle_read(self, c):
+ if c in [curses.KEY_ENTER, util.KEY_ENTER2]:
+ for k, v in self.get_values().items():
+ if v['active']:
+ if self.selection_cb(k, **dict(self.cb_args, data=self.cb_arg)):
+ self.close(None)
+ return util.ReadState.READ
+ else:
+ ret = BaseInputPane.handle_read(self, c)
+ if ret != util.ReadState.IGNORED:
+ return ret
+ ret = Popup.handle_read(self, c)
+ if ret != util.ReadState.IGNORED:
+ if self.selection_cb(None):
+ self.close(None)
+ return ret
+
+ if self.input_cb:
+ self.input_cb(c)
+
+ self.refresh()
+ return util.ReadState.IGNORED
+
+ def add_divider(self, message=None, char='-', fill_width=True, color='white'):
+ if message is not None:
+ fill_width = False
+ else:
+ message = char
+ self.add_divider_field('', message, selectable=False, fill_width=fill_width)
+
+
+class MessagePopup(Popup, BaseInputPane):
+ """
+ Popup that just displays a message
+ """
+
+ def __init__(
+ self,
+ parent_mode,
+ title,
+ message,
+ align=ALIGN.DEFAULT,
+ height_req=0.75,
+ width_req=0.5,
+ **kwargs
+ ):
+ self.message = message
+ Popup.__init__(
+ self,
+ parent_mode,
+ title,
+ align=align,
+ height_req=height_req,
+ width_req=width_req,
+ )
+ BaseInputPane.__init__(self, self, immediate_action=True, **kwargs)
+ lns = format_utils.wrap_string(self.message, self.width - 3, 3, True)
+
+ if isinstance(self.height_req, float):
+ self.height_req = min(len(lns) + 2, int(parent_mode.rows * self.height_req))
+
+ self.handle_resize()
+ self.no_refresh = False
+ self.add_text_area('TextMessage', message)
+
+ @overrides(Popup, BaseInputPane)
+ def handle_read(self, c):
+ ret = BaseInputPane.handle_read(self, c)
+ if ret != util.ReadState.IGNORED:
+ return ret
+ return Popup.handle_read(self, c)
+
+
+class InputPopup(Popup, BaseInputPane):
+ def __init__(self, parent_mode, title, **kwargs):
+ Popup.__init__(self, parent_mode, title, **kwargs)
+ BaseInputPane.__init__(self, self, **kwargs)
+ # We need to replicate some things in order to wrap our inputs
+ self.encoding = parent_mode.encoding
+
+ def _handle_callback(self, state_changed=True, close=True):
+ self._call_close_cb(self.get_values(), state_changed=state_changed, close=close)
+
+ @overrides(BaseInputPane)
+ def immediate_action_cb(self, state_changed=True):
+ self._handle_callback(state_changed=state_changed, close=False)
+
+ @overrides(Popup, BaseInputPane)
+ def handle_read(self, c):
+ ret = BaseInputPane.handle_read(self, c)
+ if ret != util.ReadState.IGNORED:
+ return ret
+
+ if c in [curses.KEY_ENTER, util.KEY_ENTER2]:
+ if self.close_cb:
+ self._handle_callback(state_changed=False, close=False)
+ util.safe_curs_set(util.Curser.INVISIBLE)
+ return util.ReadState.READ
+ elif c == util.KEY_ESC: # close on esc, no action
+ self._handle_callback(state_changed=False, close=True)
+ self.close(None)
+ return util.ReadState.READ
+
+ self.refresh()
+ return util.ReadState.READ
diff --git a/deluge/ui/console/widgets/sidebar.py b/deluge/ui/console/widgets/sidebar.py
new file mode 100644
index 0000000..cc23717
--- /dev/null
+++ b/deluge/ui/console/widgets/sidebar.py
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import curses
+import logging
+
+from deluge.decorators import overrides
+from deluge.ui.console.modes.basemode import add_string
+from deluge.ui.console.utils import curses_util as util
+from deluge.ui.console.widgets import BaseInputPane, BaseWindow
+
+log = logging.getLogger(__name__)
+
+
+class Sidebar(BaseInputPane, BaseWindow):
+ """Base sidebar widget that handles choosing a selected widget
+ with Up/Down arrows.
+
+ Shows the different states of the torrents and allows to filter the
+ torrents based on state.
+
+ """
+
+ def __init__(
+ self, torrentlist, width, height, title=None, allow_resize=False, **kwargs
+ ):
+ BaseWindow.__init__(self, title, width, height, posy=1)
+ BaseInputPane.__init__(self, self, immediate_action=True, **kwargs)
+ self.parent = torrentlist
+ self.focused = False
+ self.allow_resize = allow_resize
+
+ def set_focused(self, focused):
+ self.focused = focused
+
+ def has_focus(self):
+ return self.focused and not self.hidden()
+
+ @overrides(BaseInputPane)
+ def handle_read(self, c):
+ if c == curses.KEY_UP:
+ self.move_active_up(1)
+ elif c == curses.KEY_DOWN:
+ self.move_active_down(1)
+ elif self.allow_resize and c in [ord('+'), ord('-')]:
+ width = self.visible_content_pane_width + (1 if c == ord('+') else -1)
+ self.on_resize(width)
+ else:
+ return BaseInputPane.handle_read(self, c)
+ return util.ReadState.READ
+
+ def on_resize(self, width):
+ self.resize_window(self.height, width)
+
+ @overrides(BaseWindow)
+ def refresh(self):
+ height = self.get_content_height()
+ self.ensure_content_pane_height(
+ height + self.border_off_north + self.border_off_south
+ )
+ BaseInputPane.render_inputs(self, focused=self.has_focus())
+ BaseWindow.refresh(self)
+
+ def _refresh(self):
+ self.screen.erase()
+ height = self.get_content_height()
+ self.ensure_content_pane_height(
+ height + self.border_off_north + self.border_off_south
+ )
+ BaseInputPane.render_inputs(self, focused=True)
+ BaseWindow.refresh(self)
+
+ def add_string(self, row, string, scr=None, **kwargs):
+ add_string(row, string, self.screen, self.parent.encoding, **kwargs)
diff --git a/deluge/ui/console/widgets/statusbars.py b/deluge/ui/console/widgets/statusbars.py
new file mode 100644
index 0000000..fcf4f2f
--- /dev/null
+++ b/deluge/ui/console/widgets/statusbars.py
@@ -0,0 +1,122 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import deluge.common
+import deluge.component as component
+from deluge.core.preferencesmanager import DEFAULT_PREFS
+from deluge.ui.client import client
+
+
+class StatusBars(component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'StatusBars', 2, depend=['CoreConfig'])
+ self.config = component.get('CoreConfig')
+
+ # Hold some values we get from the core
+ self.connections = 0
+ self.download = ''
+ self.upload = ''
+ self.dht = 0
+ self.external_ip = ''
+
+ # Default values
+ self.topbar = '{!status!}Deluge %s Console - ' % deluge.common.get_version()
+ self.bottombar = '{!status!}C: %s' % self.connections
+
+ def start(self):
+ self.update()
+
+ def update(self):
+ def on_get_session_status(status):
+ self.upload = deluge.common.fsize(status['payload_upload_rate'])
+ self.download = deluge.common.fsize(status['payload_download_rate'])
+ self.connections = status['num_peers']
+ if 'dht_nodes' in status:
+ self.dht = status['dht_nodes']
+
+ self.update_statusbars()
+
+ def on_get_external_ip(external_ip):
+ self.external_ip = external_ip
+
+ keys = ['num_peers', 'payload_upload_rate', 'payload_download_rate']
+
+ if self.config['dht']:
+ keys.append('dht_nodes')
+
+ client.core.get_session_status(keys).addCallback(on_get_session_status)
+ client.core.get_external_ip().addCallback(on_get_external_ip)
+
+ def update_statusbars(self):
+ # Update the topbar string
+ self.topbar = '{!status!}Deluge %s Console - ' % deluge.common.get_version()
+
+ if client.connected():
+ info = client.connection_info()
+ connection_info = ''
+
+ # Client name
+ if info[2] == 'localclient':
+ connection_info += '{!white,blue!}%s'
+ else:
+ connection_info += '{!green,blue,bold!}%s'
+
+ # Hostname
+ if info[0] == '127.0.0.1':
+ connection_info += '{!white,blue,bold!}@{!white,blue!}%s'
+ else:
+ connection_info += '{!white,blue,bold!}@{!red,blue,bold!}%s'
+
+ # Port
+ if info[1] == DEFAULT_PREFS['daemon_port']:
+ connection_info += '{!white,blue!}:%s'
+ else:
+ connection_info += '{!status!}:%s'
+
+ # Change color back to normal, just in case
+ connection_info += '{!status!}'
+
+ self.topbar += connection_info % (info[2], info[0], info[1])
+ else:
+ self.topbar += 'Not Connected'
+
+ # Update the bottombar string
+ self.bottombar = '{!status!}C: {!white,blue!}%s{!status!}' % self.connections
+
+ if self.config['max_connections_global'] > -1:
+ self.bottombar += ' (%s)' % self.config['max_connections_global']
+
+ if self.download != '0.0 KiB':
+ self.bottombar += ' D: {!magenta,blue,bold!}%s{!status!}' % self.download
+ else:
+ self.bottombar += ' D: {!white,blue!}%s{!status!}' % self.download
+
+ if self.config['max_download_speed'] > -1:
+ self.bottombar += (
+ ' (%s ' % self.config['max_download_speed'] + _('KiB/s') + ')'
+ )
+
+ if self.upload != '0.0 KiB':
+ self.bottombar += ' U: {!green,blue,bold!}%s{!status!}' % self.upload
+ else:
+ self.bottombar += ' U: {!white,blue!}%s{!status!}' % self.upload
+
+ if self.config['max_upload_speed'] > -1:
+ self.bottombar += (
+ ' (%s ' % self.config['max_upload_speed'] + _('KiB/s') + ')'
+ )
+
+ if self.config['dht']:
+ self.bottombar += ' ' + _('DHT') + ': {!white,blue!}%s{!status!}' % self.dht
+
+ self.bottombar += ' ' + _('IP {!white,blue!}%s{!status!}') % (
+ self.external_ip if self.external_ip else _('n/a')
+ )
diff --git a/deluge/ui/console/widgets/window.py b/deluge/ui/console/widgets/window.py
new file mode 100644
index 0000000..2ef3528
--- /dev/null
+++ b/deluge/ui/console/widgets/window.py
@@ -0,0 +1,185 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Nick Lanham <nick@afternight.org>
+# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.ui.console.modes.basemode import add_string, mkpad, mkpanel
+from deluge.ui.console.utils.colors import get_color_pair
+
+try:
+ import curses
+except ImportError:
+ pass
+
+log = logging.getLogger(__name__)
+
+
+class BaseWindow(object):
+ """
+ BaseWindow creates a curses screen to be used for showing panels and popup dialogs
+ """
+
+ def __init__(self, title, width, height, posy=0, posx=0, encoding=None):
+ """
+ Args:
+ title (str): The title of the panel
+ width (int): Width of the panel
+ height (int): Height of the panel
+ posy (int): Position of the panel's first row relative to the terminal screen
+ posx (int): Position of the panel's first column relative to the terminal screen
+ encoding (str): Terminal encoding
+ """
+ self.title = title
+ self.posy, self.posx = posy, posx
+ if encoding is None:
+ from deluge import component
+
+ encoding = component.get('ConsoleUI').encoding
+ self.encoding = encoding
+
+ self.panel = mkpanel(curses.COLOR_GREEN, height, width, posy, posx)
+ self.outer_screen = self.panel.window()
+ self.outer_screen.bkgdset(0, curses.COLOR_RED)
+ by, bx = self.outer_screen.getbegyx()
+ self.screen = mkpad(get_color_pair('white', 'black'), height - 1, width - 2)
+ self._height, self._width = self.outer_screen.getmaxyx()
+
+ @property
+ def height(self):
+ return self._height
+
+ @property
+ def width(self):
+ return self._width
+
+ def add_string(self, row, string, scr=None, **kwargs):
+ scr = scr if scr else self.screen
+ add_string(row, string, scr, self.encoding, **kwargs)
+
+ def hide(self):
+ self.panel.hide()
+
+ def show(self):
+ self.panel.show()
+
+ def hidden(self):
+ return self.panel.hidden()
+
+ def set_title(self, title):
+ self.title = title
+
+ @property
+ def visible_content_pane_size(self):
+ y, x = self.outer_screen.getmaxyx()
+ return (y - 2, x - 2)
+
+ @property
+ def visible_content_pane_height(self):
+ y, x = self.visible_content_pane_size
+ return y
+
+ @property
+ def visible_content_pane_width(self):
+ y, x = self.visible_content_pane_size
+ return x
+
+ def getmaxyx(self):
+ return self.screen.getmaxyx()
+
+ def resize_window(self, rows, cols):
+ self.outer_screen.resize(rows, cols)
+ self.screen.resize(rows - 2, cols - 2)
+ self._height, self._width = rows, cols
+
+ def move_window(self, posy, posx):
+ posy = int(posy)
+ posx = int(posx)
+ self.outer_screen.mvwin(posy, posx)
+ self.posy = posy
+ self.posx = posx
+ self._height, self._width = self.screen.getmaxyx()
+
+ def ensure_content_pane_height(self, height):
+ max_y, max_x = self.screen.getmaxyx()
+ if max_y < height:
+ self.screen.resize(height, max_x)
+
+ def draw_scroll_indicator(self, screen):
+ content_height = self.get_content_height()
+ if content_height <= self.visible_content_pane_height:
+ return
+
+ percent_scroll = float(self.lineoff) / (
+ content_height - self.visible_content_pane_height
+ )
+ indicator_row = int(self.visible_content_pane_height * percent_scroll) + 1
+
+ # Never greater than height
+ indicator_row = min(indicator_row, self.visible_content_pane_height)
+ indicator_col = self.width + 1
+
+ add_string(
+ indicator_row,
+ '{!red,black,bold!}#',
+ screen,
+ self.encoding,
+ col=indicator_col,
+ pad=False,
+ trim=False,
+ )
+
+ def refresh(self):
+ height, width = self.visible_content_pane_size
+ self.outer_screen.erase()
+ self.outer_screen.border(0, 0, 0, 0)
+
+ if self.title:
+ toff = max(1, (self.width // 2) - (len(self.title) // 2))
+ self.add_string(
+ 0,
+ '{!white,black,bold!}%s' % self.title,
+ scr=self.outer_screen,
+ col=toff,
+ pad=False,
+ )
+
+ self.draw_scroll_indicator(self.outer_screen)
+ self.outer_screen.noutrefresh()
+
+ try:
+ # pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol
+ # the p arguments refer to the upper left corner of the pad region to be displayed and
+ # the s arguments define a clipping box on the screen within which the pad region is to be displayed.
+ pminrow = self.lineoff
+ pmincol = 0
+ sminrow = self.posy + 1
+ smincol = self.posx + 1
+ smaxrow = height + self.posy
+ smaxcol = width + self.posx
+ self.screen.noutrefresh(
+ pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol
+ )
+ except curses.error as ex:
+ import traceback
+
+ log.warning(
+ 'Error on screen.noutrefresh(%s, %s, %s, %s, %s, %s) Error: %s\nStack: %s',
+ pminrow,
+ pmincol,
+ sminrow,
+ smincol,
+ smaxrow,
+ smaxcol,
+ ex,
+ ''.join(traceback.format_stack()),
+ )
diff --git a/deluge/ui/coreconfig.py b/deluge/ui/coreconfig.py
new file mode 100644
index 0000000..ed6b614
--- /dev/null
+++ b/deluge/ui/coreconfig.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+from deluge.ui.client import client
+
+log = logging.getLogger(__name__)
+
+
+class CoreConfig(component.Component):
+ def __init__(self):
+ log.debug('CoreConfig init..')
+ component.Component.__init__(self, 'CoreConfig')
+ self.config = {}
+
+ def on_configvaluechanged_event(key, value):
+ self.config[key] = value
+
+ client.register_event_handler(
+ 'ConfigValueChangedEvent', on_configvaluechanged_event
+ )
+
+ def start(self):
+ def on_get_config(config):
+ self.config = config
+ return config
+
+ return client.core.get_config().addCallback(on_get_config)
+
+ def stop(self):
+ self.config = {}
+
+ def __contains__(self, key):
+ return key in self.config
+
+ def __getitem__(self, key):
+ return self.config[key]
+
+ def __setitem__(self, key, value):
+ client.core.set_config({key: value})
+
+ def __getattr__(self, attr):
+ # We treat this directly interacting with the dictionary
+ return getattr(self.config, attr)
diff --git a/deluge/ui/countries.py b/deluge/ui/countries.py
new file mode 100644
index 0000000..fe17da1
--- /dev/null
+++ b/deluge/ui/countries.py
@@ -0,0 +1,256 @@
+# -*- coding: utf-8 -*-
+#
+# This file is public domain.
+#
+
+from __future__ import unicode_literals
+
+# ISO 3166-1 country names and codes
+COUNTRIES = {
+ 'AF': _('Afghanistan'),
+ 'AX': _('Aland Islands'),
+ 'AL': _('Albania'),
+ 'DZ': _('Algeria'),
+ 'AS': _('American Samoa'),
+ 'AD': _('Andorra'),
+ 'AO': _('Angola'),
+ 'AI': _('Anguilla'),
+ 'AQ': _('Antarctica'),
+ 'AG': _('Antigua and Barbuda'),
+ 'AR': _('Argentina'),
+ 'AM': _('Armenia'),
+ 'AW': _('Aruba'),
+ 'AU': _('Australia'),
+ 'AT': _('Austria'),
+ 'AZ': _('Azerbaijan'),
+ 'BS': _('Bahamas'),
+ 'BH': _('Bahrain'),
+ 'BD': _('Bangladesh'),
+ 'BB': _('Barbados'),
+ 'BY': _('Belarus'),
+ 'BE': _('Belgium'),
+ 'BZ': _('Belize'),
+ 'BJ': _('Benin'),
+ 'BM': _('Bermuda'),
+ 'BT': _('Bhutan'),
+ 'BO': _('Bolivia'),
+ 'BA': _('Bosnia and Herzegovina'),
+ 'BW': _('Botswana'),
+ 'BV': _('Bouvet Island'),
+ 'BR': _('Brazil'),
+ 'IO': _('British Indian Ocean Territory'),
+ 'BN': _('Brunei Darussalam'),
+ 'BG': _('Bulgaria'),
+ 'BF': _('Burkina Faso'),
+ 'BI': _('Burundi'),
+ 'KH': _('Cambodia'),
+ 'CM': _('Cameroon'),
+ 'CA': _('Canada'),
+ 'CV': _('Cape Verde'),
+ 'KY': _('Cayman Islands'),
+ 'CF': _('Central African Republic'),
+ 'TD': _('Chad'),
+ 'CL': _('Chile'),
+ 'CN': _('China'),
+ 'CX': _('Christmas Island'),
+ 'CC': _('Cocos (Keeling) Islands'),
+ 'CO': _('Colombia'),
+ 'KM': _('Comoros'),
+ 'CG': _('Congo'),
+ 'CD': _('Congo, The Democratic Republic of the'),
+ 'CK': _('Cook Islands'),
+ 'CR': _('Costa Rica'),
+ 'CI': _('Cote d\'Ivoire'),
+ 'HR': _('Croatia'),
+ 'CU': _('Cuba'),
+ 'CY': _('Cyprus'),
+ 'CZ': _('Czech Republic'),
+ 'DK': _('Denmark'),
+ 'DJ': _('Djibouti'),
+ 'DM': _('Dominica'),
+ 'DO': _('Dominican Republic'),
+ 'EC': _('Ecuador'),
+ 'EG': _('Egypt'),
+ 'SV': _('El Salvador'),
+ 'GQ': _('Equatorial Guinea'),
+ 'ER': _('Eritrea'),
+ 'EE': _('Estonia'),
+ 'ET': _('Ethiopia'),
+ 'FK': _('Falkland Islands (Malvinas)'),
+ 'FO': _('Faroe Islands'),
+ 'FJ': _('Fiji'),
+ 'FI': _('Finland'),
+ 'FR': _('France'),
+ 'GF': _('French Guiana'),
+ 'PF': _('French Polynesia'),
+ 'TF': _('French Southern Territories'),
+ 'GA': _('Gabon'),
+ 'GM': _('Gambia'),
+ 'GE': _('Georgia'),
+ 'DE': _('Germany'),
+ 'GH': _('Ghana'),
+ 'GI': _('Gibraltar'),
+ 'GR': _('Greece'),
+ 'GL': _('Greenland'),
+ 'GD': _('Grenada'),
+ 'GP': _('Guadeloupe'),
+ 'GU': _('Guam'),
+ 'GT': _('Guatemala'),
+ 'GG': _('Guernsey'),
+ 'GN': _('Guinea'),
+ 'GW': _('Guinea-Bissau'),
+ 'GY': _('Guyana'),
+ 'HT': _('Haiti'),
+ 'HM': _('Heard Island and McDonald Islands'),
+ 'VA': _('Holy See (Vatican City State)'),
+ 'HN': _('Honduras'),
+ 'HK': _('Hong Kong'),
+ 'HU': _('Hungary'),
+ 'IS': _('Iceland'),
+ 'IN': _('India'),
+ 'ID': _('Indonesia'),
+ 'IR': _('Iran, Islamic Republic of'),
+ 'IQ': _('Iraq'),
+ 'IE': _('Ireland'),
+ 'IM': _('Isle of Man'),
+ 'IL': _('Israel'),
+ 'IT': _('Italy'),
+ 'JM': _('Jamaica'),
+ 'JP': _('Japan'),
+ 'JE': _('Jersey'),
+ 'JO': _('Jordan'),
+ 'KZ': _('Kazakhstan'),
+ 'KE': _('Kenya'),
+ 'KI': _('Kiribati'),
+ 'KP': _('Korea, Democratic People\'s Republic of'),
+ 'KR': _('Korea, Republic of'),
+ 'KW': _('Kuwait'),
+ 'KG': _('Kyrgyzstan'),
+ 'LA': _('Lao People\'s Democratic Republic'),
+ 'LV': _('Latvia'),
+ 'LB': _('Lebanon'),
+ 'LS': _('Lesotho'),
+ 'LR': _('Liberia'),
+ 'LY': _('Libyan Arab Jamahiriya'),
+ 'LI': _('Liechtenstein'),
+ 'LT': _('Lithuania'),
+ 'LU': _('Luxembourg'),
+ 'MO': _('Macao'),
+ 'MK': _('Macedonia, The Former Yugoslav Republic of'),
+ 'MG': _('Madagascar'),
+ 'MW': _('Malawi'),
+ 'MY': _('Malaysia'),
+ 'MV': _('Maldives'),
+ 'ML': _('Mali'),
+ 'MT': _('Malta'),
+ 'MH': _('Marshall Islands'),
+ 'MQ': _('Martinique'),
+ 'MR': _('Mauritania'),
+ 'MU': _('Mauritius'),
+ 'YT': _('Mayotte'),
+ 'MX': _('Mexico'),
+ 'FM': _('Micronesia, Federated States of'),
+ 'MD': _('Moldova'),
+ 'MC': _('Monaco'),
+ 'MN': _('Mongolia'),
+ 'ME': _('Montenegro'),
+ 'MS': _('Montserrat'),
+ 'MA': _('Morocco'),
+ 'MZ': _('Mozambique'),
+ 'MM': _('Myanmar'),
+ 'NA': _('Namibia'),
+ 'NR': _('Nauru'),
+ 'NP': _('Nepal'),
+ 'NL': _('Netherlands'),
+ 'AN': _('Netherlands Antilles'),
+ 'NC': _('New Caledonia'),
+ 'NZ': _('New Zealand'),
+ 'NI': _('Nicaragua'),
+ 'NE': _('Niger'),
+ 'NG': _('Nigeria'),
+ 'NU': _('Niue'),
+ 'NF': _('Norfolk Island'),
+ 'MP': _('Northern Mariana Islands'),
+ 'NO': _('Norway'),
+ 'OM': _('Oman'),
+ 'PK': _('Pakistan'),
+ 'PW': _('Palau'),
+ 'PS': _('Palestinian Territory, Occupied'),
+ 'PA': _('Panama'),
+ 'PG': _('Papua New Guinea'),
+ 'PY': _('Paraguay'),
+ 'PE': _('Peru'),
+ 'PH': _('Philippines'),
+ 'PN': _('Pitcairn'),
+ 'PL': _('Poland'),
+ 'PT': _('Portugal'),
+ 'PR': _('Puerto Rico'),
+ 'QA': _('Qatar'),
+ 'RE': _('Reunion'),
+ 'RO': _('Romania'),
+ 'RU': _('Russian Federation'),
+ 'RW': _('Rwanda'),
+ 'BL': _('Saint Barthelemy'),
+ 'SH': _('Saint Helena'),
+ 'KN': _('Saint Kitts and Nevis'),
+ 'LC': _('Saint Lucia'),
+ 'MF': _('Saint Martin'),
+ 'PM': _('Saint Pierre and Miquelon'),
+ 'VC': _('Saint Vincent and the Grenadines'),
+ 'WS': _('Samoa'),
+ 'SM': _('San Marino'),
+ 'ST': _('Sao Tome and Principe'),
+ 'SA': _('Saudi Arabia'),
+ 'SN': _('Senegal'),
+ 'RS': _('Serbia'),
+ 'SC': _('Seychelles'),
+ 'SL': _('Sierra Leone'),
+ 'SG': _('Singapore'),
+ 'SK': _('Slovakia'),
+ 'SI': _('Slovenia'),
+ 'SB': _('Solomon Islands'),
+ 'SO': _('Somalia'),
+ 'ZA': _('South Africa'),
+ 'GS': _('South Georgia and the South Sandwich Islands'),
+ 'ES': _('Spain'),
+ 'LK': _('Sri Lanka'),
+ 'SD': _('Sudan'),
+ 'SR': _('Suriname'),
+ 'SJ': _('Svalbard and Jan Mayen'),
+ 'SZ': _('Swaziland'),
+ 'SE': _('Sweden'),
+ 'CH': _('Switzerland'),
+ 'SY': _('Syrian Arab Republic'),
+ 'TW': _('Taiwan'),
+ 'TJ': _('Tajikistan'),
+ 'TZ': _('Tanzania, United Republic of'),
+ 'TH': _('Thailand'),
+ 'TL': _('Timor-Leste'),
+ 'TG': _('Togo'),
+ 'TK': _('Tokelau'),
+ 'TO': _('Tonga'),
+ 'TT': _('Trinidad and Tobago'),
+ 'TN': _('Tunisia'),
+ 'TR': _('Turkey'),
+ 'TM': _('Turkmenistan'),
+ 'TC': _('Turks and Caicos Islands'),
+ 'TV': _('Tuvalu'),
+ 'UG': _('Uganda'),
+ 'UA': _('Ukraine'),
+ 'AE': _('United Arab Emirates'),
+ 'GB': _('United Kingdom'),
+ 'US': _('United States'),
+ 'UM': _('United States Minor Outlying Islands'),
+ 'UY': _('Uruguay'),
+ 'UZ': _('Uzbekistan'),
+ 'VU': _('Vanuatu'),
+ 'VE': _('Venezuela'),
+ 'VN': _('Viet Nam'),
+ 'VG': _('Virgin Islands, British'),
+ 'VI': _('Virgin Islands, U.S.'),
+ 'WF': _('Wallis and Futuna'),
+ 'EH': _('Western Sahara'),
+ 'YE': _('Yemen'),
+ 'ZM': _('Zambia'),
+ 'ZW': _('Zimbabwe'),
+}
diff --git a/deluge/ui/data/__pycache__/__init__.cpython-37.pyc b/deluge/ui/data/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..498f846
--- /dev/null
+++ b/deluge/ui/data/__pycache__/__init__.cpython-37.pyc
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/128x128/apps/deluge.png b/deluge/ui/data/icons/hicolor/128x128/apps/deluge.png
new file mode 100644
index 0000000..48fcc47
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/128x128/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/16x16/apps/deluge-panel.png b/deluge/ui/data/icons/hicolor/16x16/apps/deluge-panel.png
new file mode 100644
index 0000000..2f4ae4c
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/16x16/apps/deluge-panel.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/16x16/apps/deluge.png b/deluge/ui/data/icons/hicolor/16x16/apps/deluge.png
new file mode 100644
index 0000000..2f4ae4c
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/16x16/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/192x192/apps/deluge.png b/deluge/ui/data/icons/hicolor/192x192/apps/deluge.png
new file mode 100644
index 0000000..5d54ea4
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/192x192/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/22x22/apps/deluge-panel.png b/deluge/ui/data/icons/hicolor/22x22/apps/deluge-panel.png
new file mode 100644
index 0000000..13fe852
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/22x22/apps/deluge-panel.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/22x22/apps/deluge.png b/deluge/ui/data/icons/hicolor/22x22/apps/deluge.png
new file mode 100644
index 0000000..13fe852
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/22x22/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/24x24/apps/deluge-panel.png b/deluge/ui/data/icons/hicolor/24x24/apps/deluge-panel.png
new file mode 100644
index 0000000..3a345eb
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/24x24/apps/deluge-panel.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/24x24/apps/deluge.png b/deluge/ui/data/icons/hicolor/24x24/apps/deluge.png
new file mode 100644
index 0000000..3a345eb
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/24x24/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/256x256/apps/deluge.png b/deluge/ui/data/icons/hicolor/256x256/apps/deluge.png
new file mode 100644
index 0000000..ee5d290
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/256x256/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/32x32/apps/deluge.png b/deluge/ui/data/icons/hicolor/32x32/apps/deluge.png
new file mode 100644
index 0000000..6787fa3
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/32x32/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/36x36/apps/deluge.png b/deluge/ui/data/icons/hicolor/36x36/apps/deluge.png
new file mode 100644
index 0000000..4050041
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/36x36/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/48x48/apps/deluge.png b/deluge/ui/data/icons/hicolor/48x48/apps/deluge.png
new file mode 100644
index 0000000..7b067ac
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/48x48/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/512x512/apps/deluge.png b/deluge/ui/data/icons/hicolor/512x512/apps/deluge.png
new file mode 100644
index 0000000..70cd91a
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/512x512/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/64x64/apps/deluge.png b/deluge/ui/data/icons/hicolor/64x64/apps/deluge.png
new file mode 100644
index 0000000..4275563
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/64x64/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/72x72/apps/deluge.png b/deluge/ui/data/icons/hicolor/72x72/apps/deluge.png
new file mode 100644
index 0000000..7ba0efb
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/72x72/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/96x96/apps/deluge.png b/deluge/ui/data/icons/hicolor/96x96/apps/deluge.png
new file mode 100644
index 0000000..2c64ec8
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/96x96/apps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/icons/hicolor/scalable/apps/deluge.svg b/deluge/ui/data/icons/hicolor/scalable/apps/deluge.svg
new file mode 100644
index 0000000..4f29f73
--- /dev/null
+++ b/deluge/ui/data/icons/hicolor/scalable/apps/deluge.svg
@@ -0,0 +1,610 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3440"
+ sodipodi:version="0.32"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
+ sodipodi:docname="deluge.svg"
+ inkscape:export-xdpi="32"
+ inkscape:export-ydpi="32"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="TRUE"
+ version="1.1"
+ inkscape:export-filename="/home/calum/Desktop/test1b.png">
+ <defs
+ id="defs3">
+ <color-profile
+ name="sRGB"
+ xlink:href="/usr/share/color/icc/sRGB.icc"
+ id="color-profile2" />
+ <linearGradient
+ id="linearGradient4345"
+ inkscape:collect="always">
+ <stop
+ id="stop4347"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop4349"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2973">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2975" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2977" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4126">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop4128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.16494845;"
+ offset="1.0000000"
+ id="stop4130" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4114">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4116" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4118" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3962">
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop3964" />
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.15517241"
+ id="stop4134" />
+ <stop
+ style="stop-color:#4074ae;stop-opacity:1.0000000;"
+ offset="0.75000000"
+ id="stop4346" />
+ <stop
+ style="stop-color:#36486c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop3966" />
+ </linearGradient>
+ <radialGradient
+ r="13.994944"
+ fy="33.506763"
+ fx="-10.089286"
+ cy="33.506763"
+ cx="-10.089286"
+ gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4019"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4004"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ id="radialGradient3999"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
+ r="13.994946"
+ fy="24.241488"
+ fx="61.662098"
+ cy="24.241488"
+ cx="61.662098"
+ id="radialGradient3943"
+ xlink:href="#linearGradient1312"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient1312">
+ <stop
+ id="stop1314"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1316"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3993">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3995" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop3997" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2973"
+ id="radialGradient3866"
+ cx="-22.375"
+ cy="18.499998"
+ fx="-22.375"
+ fy="18.499998"
+ r="14.33462"
+ gradientTransform="matrix(1,0,0,1.140022,40.17678,1.347091)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ r="12.289036"
+ fy="63.965388"
+ fx="15.115514"
+ cy="63.965388"
+ cx="15.115514"
+ gradientTransform="scale(1.643990,0.608276)"
+ id="radialGradient5000"
+ xlink:href="#linearGradient4114"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4989">
+ <stop
+ id="stop4991"
+ offset="0"
+ style="stop-color:#47abff;stop-opacity:1" />
+ <stop
+ id="stop4993"
+ offset="0.35955963"
+ style="stop-color:#53a6ff;stop-opacity:1" />
+ <stop
+ id="stop4995"
+ offset="0.79518169"
+ style="stop-color:#286cbb;stop-opacity:1" />
+ <stop
+ id="stop4997"
+ offset="1"
+ style="stop-color:#003d87;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4977">
+ <stop
+ id="stop4979"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop4981"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4345"
+ id="radialGradient5878"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.56833945,-0.14774444,0.12240592,0.69984003,9.8157812,6.7018745)"
+ cx="11.707551"
+ cy="36.527763"
+ fx="11.707551"
+ fy="36.527763"
+ r="14.33681" />
+ <filter
+ id="filter6406"
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000000000000002"
+ x="-0.050000000000000017">
+ <feFlood
+ id="feFlood6408"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1"
+ k4="-7.2400000000000002"
+ k3="5.5899999999999999"
+ k2="4.9299999999999997"
+ k1="8.1400000000000006" />
+ <feGaussianBlur
+ id="feGaussianBlur6412"
+ stdDeviation="0.20000000000000001"
+ result="blur"
+ in="composite" />
+ <feOffset
+ id="feOffset6414"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2"
+ operator="" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter4258">
+ <feFlood
+ flood-opacity="0.80200501253132828"
+ flood-color="rgb(197,204,222)"
+ result="flood"
+ id="feFlood4260" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="in"
+ result="composite1"
+ id="feComposite4262"
+ flood-opacity="0.80000000000000004" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4264" />
+ <feOffset
+ dx="-0"
+ dy="-0.5"
+ result="offset"
+ id="feOffset4266" />
+ <feComposite
+ in="SourceGraphic"
+ in2="offset"
+ operator="over"
+ result="composite2"
+ id="feComposite4268" />
+ </filter>
+ <filter
+ id="filter4290"
+ inkscape:label="Drop Shadow"
+ style="color-interpolation-filters:sRGB;">
+ <feFlood
+ id="feFlood4292"
+ result="flood"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="0.59999999999999998" />
+ <feComposite
+ id="feComposite4294"
+ result="composite1"
+ operator="in"
+ in2="SourceGraphic"
+ in="flood" />
+ <feGaussianBlur
+ id="feGaussianBlur4296"
+ result="blur"
+ stdDeviation="6.7999999999999998"
+ in="composite1" />
+ <feOffset
+ id="feOffset4298"
+ result="offset"
+ dy="1.9000000000000004"
+ dx="0.69999999999999996"
+ flood-opacity="0.68000000000000005" />
+ <feComposite
+ id="feComposite4300"
+ result="composite2"
+ in2="offset"
+ in="SourceGraphic"
+ operator="" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4977"
+ id="radialGradient4375"
+ cx="19.015932"
+ cy="19.611181"
+ fx="19.015932"
+ fy="19.611181"
+ r="15.627373"
+ gradientTransform="matrix(-0.21582873,1.1173231,-1.0803619,-0.20155681,42.177326,-6.1234)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.65098039"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="13.92"
+ inkscape:cx="3.3184766"
+ inkscape:cy="26.850801"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1981"
+ inkscape:window-height="1097"
+ inkscape:window-x="67"
+ inkscape:window-y="27"
+ inkscape:showpageshadow="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="1"
+ width="512px"
+ units="px"
+ inkscape:snap-global="false"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-others="true"
+ inkscape:pagecheckerboard="false"
+ showborder="true"
+ borderlayer="false"
+ scale-x="2">
+ <sodipodi:guide
+ orientation="0,1"
+ position="4.331,47"
+ id="guide3056"
+ inkscape:label=""
+ inkscape:color="rgb(99,99,125)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="24,41.875"
+ id="guide3058"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="40,25.375"
+ id="guide5866" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="34.626135,29.742679"
+ id="guide5868" />
+ <sodipodi:guide
+ position="3.8890873,1"
+ orientation="0,1"
+ id="guide4521"
+ inkscape:label=""
+ inkscape:color="rgb(106,106,146)" />
+ <sodipodi:guide
+ position="1,17.324"
+ orientation="1,0"
+ id="guide4523"
+ inkscape:label=""
+ inkscape:color="rgb(152,152,181)" />
+ <sodipodi:guide
+ position="47,33.852737"
+ orientation="1,0"
+ id="guide4525"
+ inkscape:label=""
+ inkscape:color="rgb(121,121,172)" />
+ <sodipodi:guide
+ position="13.433908,46"
+ orientation="0,1"
+ id="guide4527"
+ inkscape:label=""
+ inkscape:color="rgb(255,40,0)" />
+ <sodipodi:guide
+ position="8,36.135"
+ orientation="1,0"
+ id="guide4529"
+ inkscape:label=""
+ inkscape:color="rgb(255,11,0)" />
+ <sodipodi:guide
+ position="40,26.436782"
+ orientation="1,0"
+ id="guide4531"
+ inkscape:label=""
+ inkscape:color="rgb(255,6,0)" />
+ <sodipodi:guide
+ position="34.052,2"
+ orientation="0,1"
+ id="guide4533"
+ inkscape:label=""
+ inkscape:color="rgb(255,0,5)" />
+ <sodipodi:guide
+ position="36.879276,26"
+ orientation="0,1"
+ id="guide4542"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ position="43.660795,14.731391"
+ orientation="0,1"
+ id="guide4546" />
+ <inkscape:grid
+ type="xygrid"
+ id="grid4297" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Tuomas Kuosmanen</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>internet</rdf:li>
+ <rdf:li>tools</rdf:li>
+ <rdf:li>applications</rdf:li>
+ <rdf:li>category</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <path
+ style="fill:#4c90e8;fill-opacity:1;fill-rule:evenodd;stroke:#094491;stroke-width:3.19036889;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 24.00916,2.8848679 35.921225,21.107868 c 7.631218,11.674181 -0.393962,24.296949 -11.919555,24.296949 -11.525593,0 -19.5637412,-12.627213 -11.925606,-24.293557 z"
+ id="path2069"
+ sodipodi:nodetypes="cszsc"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="wave fill"
+ style="display:inline">
+ <path
+ style="display:inline;fill:#094491;fill-opacity:1;fill-rule:evenodd;stroke-width:0.43658349;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 28.249173,24.076764 c -6.513399,-2.656088 -9.930764,4.129513 -8.844266,7.299777 2.363892,6.897492 11.278562,8.624272 17.861607,-2.864877 0,0 0.07021,1.386537 0.139797,2.046235 0.884013,8.376987 -6.162376,13.70953 -13.302295,13.605305 -7.139921,-0.104225 -9.320813,-2.876749 -11.424685,-6.068739 -3.4133569,-5.178732 -2.561398,-13.615464 2.027677,-17.561337 5.237731,-4.328395 11.004287,-2.017675 13.542165,3.543636 z"
+ id="path2969"
+ sodipodi:nodetypes="cscszscc"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ style="display:none"
+ inkscape:label="wave fill light"
+ id="g4327"
+ inkscape:groupmode="layer">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscszscc"
+ id="path4329"
+ d="m 24.811452,24.996951 c -6.049549,-2.467385 -7.648816,3.683738 -6.639688,6.628769 2.195546,6.407462 11.948502,7.605174 18.062738,-3.067723 0,0 0.11598,1.28803 0.180639,1.900859 0.82106,7.781844 -5.621926,12.735535 -12.253379,12.638715 -6.631454,-0.09682 -8.657036,-2.672368 -10.611083,-5.637583 -3.170275,-4.810809 -2.429788,-11.327408 1.78168,-14.840553 4.864733,-3.959831 8.798281,-0.09585 9.479093,2.377516 z"
+ style="display:inline;fill:#99c3f9;fill-opacity:1;fill-rule:evenodd;stroke-width:0.40552941;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="wave stroke 1.3px and fill "
+ style="display:none">
+ <path
+ style="display:inline;fill:#99c3f9;fill-opacity:1;fill-rule:evenodd;stroke:#094491 icc-color(sRGB, 0.18046845, 0.27837034, 0.41960784);stroke-width:1.33399999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 23.761543,24.179576 c -6.481311,-1.72424 -6.932125,6.183803 -5.453851,8.969604 2.408248,4.538333 12.206251,5.377175 17.706883,-3.282742 0,0 0.07651,2.193563 0.02062,2.77892 -0.534334,5.596549 -6.848986,9.789262 -11.999526,9.621298 -5.243605,-0.170999 -8.282469,-2.549917 -10.154056,-5.379263 -3.036492,-4.590373 -2.048612,-10.811985 1.554101,-13.80496 4.248899,-3.646516 7.44994,-0.562347 8.325827,1.097143 z"
+ id="path2969-6"
+ sodipodi:nodetypes="cscssscc"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ style="display:none"
+ inkscape:label="wave stroke 2px and fill "
+ id="g4217"
+ inkscape:groupmode="layer">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscssscc"
+ id="path4219"
+ d="m 23.507553,23.925586 c -6.495438,-1.064032 -6.790118,6.421446 -5.149063,9.579179 2.304561,4.434459 10.903063,6.282759 17.3005,-2.825561 0,0 -0.02509,1.990372 -0.08098,2.575729 -0.534334,5.596549 -6.391805,8.925697 -11.542345,8.757733 -5.243605,-0.170999 -8.247979,-2.119778 -10.001662,-5.023677 -2.772156,-4.590373 -2.467304,-9.592836 0.487345,-12.585811 3.100966,-3.879425 7.831125,-2.714919 8.986201,-0.477592 z"
+ style="display:inline;fill:#99c3f9;fill-opacity:1;fill-rule:evenodd;stroke:#094491 icc-color(sRGB, 0.18046845, 0.27837034, 0.41960784);stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="gradient inner wave "
+ style="display:none">
+ <path
+ style="fill:url(#radialGradient5878);fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 23.55546,23.805666 c -6.490966,-1.345852 -7.700279,4.84717 -6.759909,8.059555 1.100923,3.760845 4.033145,7.507508 11.754513,5.50458 -3.268904,5.846892 -11.255492,4.570412 -13.940353,0.387138 -2.563055,-3.993493 -2.992402,-9.05746 -1.115519,-11.776277 4.049097,-6.655711 9.485026,-4.029293 10.061268,-2.174996 z"
+ id="path3868"
+ sodipodi:nodetypes="cscscc"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ style="display:inline"
+ inkscape:label="solid inner wavelet small"
+ id="g4476"
+ inkscape:groupmode="layer">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscszc"
+ id="path4478"
+ d="m 24.158349,21.568695 c -7.295351,0.177796 -8.680227,8.584045 -6.659444,12.185022 2.809336,5.006167 7.071815,5.968946 12.90485,4.121032 -3.330593,3.620896 -10.166138,4.579185 -14.809086,-0.592946 -3.194749,-3.558875 -3.473998,-8.525976 -1.256883,-12.674161 2.217115,-4.148189 6.638012,-5.301549 9.820563,-3.038947 z"
+ style="fill:#83b8f9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.07657671" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="g4486"
+ inkscape:label="solid inner wavelet larger"
+ style="display:none">
+ <path
+ style="fill:#99c3f9;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 21.55277,22.974939 c -5.188765,1.005551 -6.173294,6.973638 -4.694095,10.155871 2.191227,4.714034 8.449957,8.07696 17.664862,0.691234 -5.828901,10.827975 -14.873199,7.043001 -17.313798,4.977307 -1.97159,-1.66873 -4.164846,-4.855384 -4.11832,-8.341257 0.09522,-7.134172 6.604293,-9.266569 8.461351,-7.483155 z"
+ id="path4488"
+ sodipodi:nodetypes="cscssc"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Finish"
+ style="display:none"
+ sodipodi:insensitive="true">
+ <path
+ style="display:inline;opacity:0.68800001;fill:url(#radialGradient4375);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.01508224;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 23.956644,1.939572 -11.98159,18.384686 c -3.9618093,5.166305 -3.6931007,11.439356 -2.4054307,15.8855 5.3079527,10.817522 14.5668877,9.659123 14.5668877,9.659123 0,0 6.868403,-0.005 11.475831,-5.120874 2.283123,-2.535051 5.325726,-9.801674 2.662706,-16.234991 -0.49634,-1.028711 -3.75284,-6.551522 -4.429455,-7.554788 z"
+ id="path4279"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccsccc" />
+ </g>
+</svg>
diff --git a/deluge/ui/data/pixmaps/__pycache__/__init__.cpython-37.pyc b/deluge/ui/data/pixmaps/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..e07f647
--- /dev/null
+++ b/deluge/ui/data/pixmaps/__pycache__/__init__.cpython-37.pyc
Binary files differ
diff --git a/deluge/ui/data/pixmaps/active.svg b/deluge/ui/data/pixmaps/active.svg
new file mode 100644
index 0000000..2e6116a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/active.svg
@@ -0,0 +1,612 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3440"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="active.svg"
+ inkscape:export-xdpi="30"
+ inkscape:export-ydpi="30"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="TRUE"
+ version="1.1"
+ inkscape:export-filename="/home/calum/projects/deluge-logo/deluge_download16svg.png">
+ <defs
+ id="defs3">
+ <color-profile
+ name="sRGB"
+ xlink:href="/usr/share/color/icc/sRGB.icc"
+ id="color-profile4484" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2973">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2975" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2977" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4126">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop4128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.16494845;"
+ offset="1.0000000"
+ id="stop4130" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4114">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4116" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4118" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3962">
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop3964" />
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.15517241"
+ id="stop4134" />
+ <stop
+ style="stop-color:#4074ae;stop-opacity:1.0000000;"
+ offset="0.75000000"
+ id="stop4346" />
+ <stop
+ style="stop-color:#36486c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop3966" />
+ </linearGradient>
+ <radialGradient
+ r="13.994944"
+ fy="33.506763"
+ fx="-10.089286"
+ cy="33.506763"
+ cx="-10.089286"
+ gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4019"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4004"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ id="radialGradient3999"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
+ r="13.994946"
+ fy="24.241488"
+ fx="61.662098"
+ cy="24.241488"
+ cx="61.662098"
+ id="radialGradient3943"
+ xlink:href="#linearGradient1312"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient1312">
+ <stop
+ id="stop1314"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1316"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3993">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3995" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop3997" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2973"
+ id="radialGradient3866"
+ cx="-22.375"
+ cy="18.499998"
+ fx="-22.375"
+ fy="18.499998"
+ r="14.33462"
+ gradientTransform="matrix(1,0,0,1.140022,40.17678,1.347091)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ r="12.289036"
+ fy="63.965388"
+ fx="15.115514"
+ cy="63.965388"
+ cx="15.115514"
+ gradientTransform="scale(1.643990,0.608276)"
+ id="radialGradient5000"
+ xlink:href="#linearGradient4114"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4989">
+ <stop
+ id="stop4991"
+ offset="0"
+ style="stop-color:#47abff;stop-opacity:1" />
+ <stop
+ id="stop4993"
+ offset="0.35955963"
+ style="stop-color:#53a6ff;stop-opacity:1" />
+ <stop
+ id="stop4995"
+ offset="0.79518169"
+ style="stop-color:#286cbb;stop-opacity:1" />
+ <stop
+ id="stop4997"
+ offset="1"
+ style="stop-color:#003d87;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4977">
+ <stop
+ id="stop4979"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop4981"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <filter
+ id="filter6406"
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000000000000002"
+ x="-0.050000000000000017">
+ <feFlood
+ id="feFlood6408"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1"
+ k1="8.1400000000000006"
+ k2="4.9299999999999997"
+ k3="5.5899999999999999"
+ k4="-7.2400000000000002" />
+ <feGaussianBlur
+ id="feGaussianBlur6412"
+ stdDeviation="0.20000000000000001"
+ result="blur"
+ in="composite" />
+ <feOffset
+ id="feOffset6414"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2"
+ operator="" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter4258">
+ <feFlood
+ flood-opacity="0.80200501253132828"
+ flood-color="rgb(197,204,222)"
+ result="flood"
+ id="feFlood4260" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="in"
+ result="composite1"
+ id="feComposite4262"
+ flood-opacity="0.80000000000000004" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4264" />
+ <feOffset
+ dx="-0"
+ dy="-0.5"
+ result="offset"
+ id="feOffset4266" />
+ <feComposite
+ in="SourceGraphic"
+ in2="offset"
+ operator="over"
+ result="composite2"
+ id="feComposite4268" />
+ </filter>
+ <filter
+ id="filter4290"
+ inkscape:label="Drop Shadow"
+ style="color-interpolation-filters:sRGB;">
+ <feFlood
+ id="feFlood4292"
+ result="flood"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="0.59999999999999998" />
+ <feComposite
+ id="feComposite4294"
+ result="composite1"
+ operator="in"
+ in2="SourceGraphic"
+ in="flood" />
+ <feGaussianBlur
+ id="feGaussianBlur4296"
+ result="blur"
+ stdDeviation="6.7999999999999998"
+ in="composite1" />
+ <feOffset
+ id="feOffset4298"
+ result="offset"
+ dy="1.9000000000000004"
+ dx="0.69999999999999996"
+ flood-opacity="0.68000000000000005" />
+ <feComposite
+ id="feComposite4300"
+ result="composite2"
+ in2="offset"
+ in="SourceGraphic"
+ operator="" />
+ </filter>
+ <filter
+ id="filter6406-6"
+ style="color-interpolation-filters:sRGB"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000001"
+ x="-0.050000001">
+ <feFlood
+ id="feFlood6408-0"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410-6"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1" />
+ <feGaussianBlur
+ id="feGaussianBlur6412-2"
+ stdDeviation="0.20000000000000001"
+ result="blur" />
+ <feOffset
+ id="feOffset6414-6"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416-1"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.17254902"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="23.537703"
+ inkscape:cy="24.61952"
+ inkscape:current-layer="layer5"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1861"
+ inkscape:window-height="1176"
+ inkscape:window-x="59"
+ inkscape:window-y="24"
+ inkscape:showpageshadow="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="1"
+ width="512px"
+ units="px"
+ inkscape:snap-global="false"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-others="true">
+ <sodipodi:guide
+ orientation="0,1"
+ position="4.331,47"
+ id="guide3056"
+ inkscape:label=""
+ inkscape:color="rgb(99,99,125)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="23.9375,24.5625"
+ id="guide3058"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="40,25.375"
+ id="guide5866" />
+ <sodipodi:guide
+ position="3.8890873,1"
+ orientation="0,1"
+ id="guide4521"
+ inkscape:label=""
+ inkscape:color="rgb(106,106,146)" />
+ <sodipodi:guide
+ position="1,17.324"
+ orientation="1,0"
+ id="guide4523"
+ inkscape:label=""
+ inkscape:color="rgb(152,152,181)" />
+ <sodipodi:guide
+ position="47,33.852737"
+ orientation="1,0"
+ id="guide4525"
+ inkscape:label=""
+ inkscape:color="rgb(121,121,172)" />
+ <sodipodi:guide
+ position="13.433908,46"
+ orientation="0,1"
+ id="guide4527"
+ inkscape:label=""
+ inkscape:color="rgb(255,40,0)" />
+ <sodipodi:guide
+ position="8,36.135"
+ orientation="1,0"
+ id="guide4529"
+ inkscape:label=""
+ inkscape:color="rgb(255,11,0)" />
+ <sodipodi:guide
+ position="40,26.436782"
+ orientation="1,0"
+ id="guide4531"
+ inkscape:label=""
+ inkscape:color="rgb(255,6,0)" />
+ <sodipodi:guide
+ position="34.052,2"
+ orientation="0,1"
+ id="guide4533"
+ inkscape:label=""
+ inkscape:color="rgb(255,0,5)" />
+ <sodipodi:guide
+ position="36.879276,26"
+ orientation="0,1"
+ id="guide4542"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ position="43.660795,14.731391"
+ orientation="0,1"
+ id="guide4546" />
+ <sodipodi:guide
+ position="21.25,21"
+ orientation="0,1"
+ id="guide4229" />
+ <sodipodi:guide
+ position="35.84375,19.53125"
+ orientation="0,1"
+ id="guide5116" />
+ <sodipodi:guide
+ position="30.21875,22.46875"
+ orientation="0,1"
+ id="guide5118" />
+ <inkscape:grid
+ type="xygrid"
+ id="grid4217" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Tuomas Kuosmanen</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>internet</rdf:li>
+ <rdf:li>tools</rdf:li>
+ <rdf:li>applications</rdf:li>
+ <rdf:li>category</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="base droplet"
+ inkscape:groupmode="layer"
+ style="display:none">
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#129b00;stroke-width:3.27999091;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter6406)"
+ d="M 23.295622,2.4822833 35.490217,21.297229 C 43.30243,33.350632 35.08691,46.383433 23.287956,46.383433 11.489002,46.383433 3.2602089,33.346045 11.079504,21.30073 Z"
+ id="path2069"
+ sodipodi:nodetypes="cszsc"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.90726715,0,0,0.89972834,2.9383017,2.518482)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="base droplet copy 1"
+ style="display:none" />
+ <g
+ style="display:inline"
+ inkscape:groupmode="layer"
+ inkscape:label="base droplet copy"
+ id="g4225">
+ <path
+ transform="matrix(0.90726715,0,0,0.89972834,2.9383017,2.518482)"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csscc"
+ id="path4227"
+ d="m 38.395387,28.809989 c 1.339184,9.392872 -5.759479,17.573444 -15.107431,17.573444 -5.899477,0 -10.906414,-3.259347 -13.4610694,-8.024358 C 8.3379994,35.581962 7.7795043,32.31798 8.1679076,28.840613 Z"
+ style="display:inline;fill:#16c816;fill-opacity:1;fill-rule:evenodd;stroke:#129b00;stroke-width:3.27999091;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="display:inline;fill:#6699ff;fill-opacity:1;fill-rule:evenodd;stroke:#3366cc;stroke-width:2.96343851;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 24.073654,4.7518625 35.13741,21.680202 c 0.830822,1.271218 1.561747,2.541942 1.952222,3.843334 l -26.064146,0.03312 c 0.398283,-1.282502 1.126319,-2.592255 1.964886,-3.8733 z"
+ id="path2069-8"
+ sodipodi:nodetypes="csccsc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:#16c816;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.27999091;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 36.879847,27.238166 C 38.115698,38.19401 31.666974,44.823427 23.184624,44.750996 14.702274,44.678564 8.2127922,37.110525 9.6490039,27.219671 Z"
+ id="path4228"
+ sodipodi:nodetypes="czcc"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.90726715,0,0,0.89972834,2.9383017,2.518482)" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccsc"
+ id="path4239"
+ d="M 24.011154,7.3143625 33.51241,21.805202 c 0.832698,1.26999 2.522684,3.932567 2.920972,5.249584 l -24.751646,-0.02935 c 0.398283,-1.282502 2.041931,-3.742425 2.871136,-5.02955 z"
+ style="display:inline;fill:#6699ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.96343851;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="seed/download icon"
+ style="display:inline">
+ <path
+ sodipodi:type="star"
+ style="opacity:1;fill:#005000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path5039"
+ sodipodi:sides="3"
+ sodipodi:cx="23.9375"
+ sodipodi:cy="21.1875"
+ sodipodi:r1="4.6958261"
+ sodipodi:r2="2.347913"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 28.004205,23.535413 -4.066705,0 -4.066705,0 2.033353,-3.521869 2.033352,-3.52187 2.033352,3.521869 z"
+ transform="matrix(-1.8442451,0,0,-0.99379036,68.146617,57.377998)"
+ inkscape:transform-center-y="-1.1666696" />
+ <rect
+ style="display:inline;opacity:1;fill:#0e2960;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4364-1-7-0"
+ width="8.3000002"
+ height="4.2000003"
+ x="19.75"
+ y="21.788212" />
+ <rect
+ style="display:inline;opacity:1;fill:#005000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4364-1-7"
+ width="8.3000002"
+ height="4.2000003"
+ x="-28.049999"
+ y="-32.268642"
+ transform="scale(-1,-1)" />
+ <path
+ sodipodi:type="star"
+ style="display:inline;opacity:1;fill:#0e2960;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path5039-2"
+ sodipodi:sides="3"
+ sodipodi:cx="23.9375"
+ sodipodi:cy="21.1875"
+ sodipodi:r1="4.6958261"
+ sodipodi:r2="2.347913"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 28.004205,23.535413 -4.066705,0 -4.066705,0 2.033353,-3.521869 2.033352,-3.52187 2.033352,3.521869 z"
+ inkscape:transform-center-y="-1.1666662"
+ transform="matrix(1.8442451,0,0,0.99379036,-20.146617,-3.2560397)" />
+ </g>
+</svg>
diff --git a/deluge/ui/data/pixmaps/active16.png b/deluge/ui/data/pixmaps/active16.png
new file mode 100644
index 0000000..c9af82a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/active16.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/alert.svg b/deluge/ui/data/pixmaps/alert.svg
new file mode 100644
index 0000000..8f73872
--- /dev/null
+++ b/deluge/ui/data/pixmaps/alert.svg
@@ -0,0 +1,512 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3440"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="alert.svg"
+ inkscape:export-xdpi="960"
+ inkscape:export-ydpi="960"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="TRUE"
+ version="1.1"
+ inkscape:export-filename="/home/calum/projects/deluge-logo/deluge.512.x.png">
+ <defs
+ id="defs3">
+ <color-profile
+ name="sRGB"
+ xlink:href="/usr/share/color/icc/sRGB.icc"
+ id="color-profile4484" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2973">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2975" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2977" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4126">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop4128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.16494845;"
+ offset="1.0000000"
+ id="stop4130" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4114">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4116" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4118" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3962">
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop3964" />
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.15517241"
+ id="stop4134" />
+ <stop
+ style="stop-color:#4074ae;stop-opacity:1.0000000;"
+ offset="0.75000000"
+ id="stop4346" />
+ <stop
+ style="stop-color:#36486c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop3966" />
+ </linearGradient>
+ <radialGradient
+ r="13.994944"
+ fy="33.506763"
+ fx="-10.089286"
+ cy="33.506763"
+ cx="-10.089286"
+ gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4019"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4004"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ id="radialGradient3999"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
+ r="13.994946"
+ fy="24.241488"
+ fx="61.662098"
+ cy="24.241488"
+ cx="61.662098"
+ id="radialGradient3943"
+ xlink:href="#linearGradient1312"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient1312">
+ <stop
+ id="stop1314"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1316"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3993">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3995" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop3997" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2973"
+ id="radialGradient3866"
+ cx="-22.375"
+ cy="18.499998"
+ fx="-22.375"
+ fy="18.499998"
+ r="14.33462"
+ gradientTransform="matrix(1,0,0,1.140022,40.17678,1.347091)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ r="12.289036"
+ fy="63.965388"
+ fx="15.115514"
+ cy="63.965388"
+ cx="15.115514"
+ gradientTransform="scale(1.643990,0.608276)"
+ id="radialGradient5000"
+ xlink:href="#linearGradient4114"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4989">
+ <stop
+ id="stop4991"
+ offset="0"
+ style="stop-color:#47abff;stop-opacity:1" />
+ <stop
+ id="stop4993"
+ offset="0.35955963"
+ style="stop-color:#53a6ff;stop-opacity:1" />
+ <stop
+ id="stop4995"
+ offset="0.79518169"
+ style="stop-color:#286cbb;stop-opacity:1" />
+ <stop
+ id="stop4997"
+ offset="1"
+ style="stop-color:#003d87;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4977">
+ <stop
+ id="stop4979"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop4981"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <filter
+ id="filter6406"
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000000000000002"
+ x="-0.050000000000000017">
+ <feFlood
+ id="feFlood6408"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1"
+ k1="8.1400000000000006"
+ k2="4.9299999999999997"
+ k3="5.5899999999999999"
+ k4="-7.2400000000000002" />
+ <feGaussianBlur
+ id="feGaussianBlur6412"
+ stdDeviation="0.20000000000000001"
+ result="blur"
+ in="composite" />
+ <feOffset
+ id="feOffset6414"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2"
+ operator="" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter4258">
+ <feFlood
+ flood-opacity="0.80200501253132828"
+ flood-color="rgb(197,204,222)"
+ result="flood"
+ id="feFlood4260" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="in"
+ result="composite1"
+ id="feComposite4262"
+ flood-opacity="0.80000000000000004" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4264" />
+ <feOffset
+ dx="-0"
+ dy="-0.5"
+ result="offset"
+ id="feOffset4266" />
+ <feComposite
+ in="SourceGraphic"
+ in2="offset"
+ operator="over"
+ result="composite2"
+ id="feComposite4268" />
+ </filter>
+ <filter
+ id="filter4290"
+ inkscape:label="Drop Shadow"
+ style="color-interpolation-filters:sRGB;">
+ <feFlood
+ id="feFlood4292"
+ result="flood"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="0.59999999999999998" />
+ <feComposite
+ id="feComposite4294"
+ result="composite1"
+ operator="in"
+ in2="SourceGraphic"
+ in="flood" />
+ <feGaussianBlur
+ id="feGaussianBlur4296"
+ result="blur"
+ stdDeviation="6.7999999999999998"
+ in="composite1" />
+ <feOffset
+ id="feOffset4298"
+ result="offset"
+ dy="1.9000000000000004"
+ dx="0.69999999999999996"
+ flood-opacity="0.68000000000000005" />
+ <feComposite
+ id="feComposite4300"
+ result="composite2"
+ in2="offset"
+ in="SourceGraphic"
+ operator="" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.17254902"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="28.836938"
+ inkscape:cy="22.782595"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1861"
+ inkscape:window-height="1176"
+ inkscape:window-x="59"
+ inkscape:window-y="24"
+ inkscape:showpageshadow="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="1"
+ width="512px"
+ units="px"
+ inkscape:snap-global="false"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-others="true">
+ <sodipodi:guide
+ orientation="0,1"
+ position="4.331,47"
+ id="guide3056"
+ inkscape:label=""
+ inkscape:color="rgb(99,99,125)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="23.9375,24.5625"
+ id="guide3058"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="40,25.375"
+ id="guide5866" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="38.448931,29.742679"
+ id="guide5868" />
+ <sodipodi:guide
+ position="3.8890873,1"
+ orientation="0,1"
+ id="guide4521"
+ inkscape:label=""
+ inkscape:color="rgb(106,106,146)" />
+ <sodipodi:guide
+ position="1,17.324"
+ orientation="1,0"
+ id="guide4523"
+ inkscape:label=""
+ inkscape:color="rgb(152,152,181)" />
+ <sodipodi:guide
+ position="47,33.852737"
+ orientation="1,0"
+ id="guide4525"
+ inkscape:label=""
+ inkscape:color="rgb(121,121,172)" />
+ <sodipodi:guide
+ position="13.433908,46"
+ orientation="0,1"
+ id="guide4527"
+ inkscape:label=""
+ inkscape:color="rgb(255,40,0)" />
+ <sodipodi:guide
+ position="8,36.135"
+ orientation="1,0"
+ id="guide4529"
+ inkscape:label=""
+ inkscape:color="rgb(255,11,0)" />
+ <sodipodi:guide
+ position="40,26.436782"
+ orientation="1,0"
+ id="guide4531"
+ inkscape:label=""
+ inkscape:color="rgb(255,6,0)" />
+ <sodipodi:guide
+ position="34.052,2"
+ orientation="0,1"
+ id="guide4533"
+ inkscape:label=""
+ inkscape:color="rgb(255,0,5)" />
+ <sodipodi:guide
+ position="36.879276,26"
+ orientation="0,1"
+ id="guide4542"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ position="43.660795,14.731391"
+ orientation="0,1"
+ id="guide4546" />
+ <inkscape:grid
+ type="xygrid"
+ id="grid4214" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Tuomas Kuosmanen</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>internet</rdf:li>
+ <rdf:li>tools</rdf:li>
+ <rdf:li>applications</rdf:li>
+ <rdf:li>category</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="base droplet"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <path
+ style="fill:#e6381f;fill-opacity:1;fill-rule:evenodd;stroke:#a60e0e;stroke-width:3.27999091;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;"
+ d="M 23.295622,2.4822833 35.490217,21.297229 C 43.30243,33.350632 35.08691,46.383433 23.287956,46.383433 11.489002,46.383433 3.2602089,33.346045 11.079504,21.30073 Z"
+ id="path2069"
+ sodipodi:nodetypes="cszsc"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.90726715,0,0,0.89972834,2.9383017,2.518482)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="seed/download icon"
+ style="display:none">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:17.90330505px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#630000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="12.545032"
+ y="40.473927"
+ id="text5111"
+ sodipodi:linespacing="125%"
+ transform="scale(1.0196557,0.98072319)"><tspan
+ sodipodi:role="line"
+ id="tspan5113"
+ x="12.545032"
+ y="40.473927"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:35.80661011px;font-family:'Courier 10 Pitch';-inkscape-font-specification:'Courier 10 Pitch Bold';fill:#630000;fill-opacity:1;stroke:none">!</tspan></text>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="seed/download icon 1"
+ style="display:inline">
+ <path
+ style="display:inline;opacity:1;fill:#630000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 20.966529,17.53531 6,0 -0.97907,14.309359 -3.824288,0 z"
+ id="rect4203"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="display:inline;opacity:1;fill:#630000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 21.203402,33.393779 5.5,0 0,5.5 -5.5,0 z"
+ id="rect4206"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/deluge/ui/data/pixmaps/alert16.png b/deluge/ui/data/pixmaps/alert16.png
new file mode 100644
index 0000000..7036638
--- /dev/null
+++ b/deluge/ui/data/pixmaps/alert16.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/all.svg b/deluge/ui/data/pixmaps/all.svg
new file mode 100644
index 0000000..6dd99c9
--- /dev/null
+++ b/deluge/ui/data/pixmaps/all.svg
@@ -0,0 +1,826 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3440"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="all.svg"
+ inkscape:export-xdpi="960"
+ inkscape:export-ydpi="960"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="TRUE"
+ version="1.1"
+ inkscape:export-filename="/home/calum/projects/deluge-logo/deluge.512.x.png">
+ <defs
+ id="defs3">
+ <color-profile
+ name="sRGB"
+ xlink:href="/usr/share/color/icc/sRGB.icc"
+ id="color-profile4484" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2973">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2975" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2977" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4126">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop4128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.16494845;"
+ offset="1.0000000"
+ id="stop4130" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4114">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4116" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4118" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3962">
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop3964" />
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.15517241"
+ id="stop4134" />
+ <stop
+ style="stop-color:#4074ae;stop-opacity:1.0000000;"
+ offset="0.75000000"
+ id="stop4346" />
+ <stop
+ style="stop-color:#36486c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop3966" />
+ </linearGradient>
+ <radialGradient
+ r="13.994944"
+ fy="33.506763"
+ fx="-10.089286"
+ cy="33.506763"
+ cx="-10.089286"
+ gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4019"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4004"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ id="radialGradient3999"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
+ r="13.994946"
+ fy="24.241488"
+ fx="61.662098"
+ cy="24.241488"
+ cx="61.662098"
+ id="radialGradient3943"
+ xlink:href="#linearGradient1312"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient1312">
+ <stop
+ id="stop1314"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1316"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3993">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3995" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop3997" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2973"
+ id="radialGradient3866"
+ cx="-22.375"
+ cy="18.499998"
+ fx="-22.375"
+ fy="18.499998"
+ r="14.33462"
+ gradientTransform="matrix(1,0,0,1.140022,40.17678,1.347091)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ r="12.289036"
+ fy="63.965388"
+ fx="15.115514"
+ cy="63.965388"
+ cx="15.115514"
+ gradientTransform="scale(1.643990,0.608276)"
+ id="radialGradient5000"
+ xlink:href="#linearGradient4114"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4989">
+ <stop
+ id="stop4991"
+ offset="0"
+ style="stop-color:#47abff;stop-opacity:1" />
+ <stop
+ id="stop4993"
+ offset="0.35955963"
+ style="stop-color:#53a6ff;stop-opacity:1" />
+ <stop
+ id="stop4995"
+ offset="0.79518169"
+ style="stop-color:#286cbb;stop-opacity:1" />
+ <stop
+ id="stop4997"
+ offset="1"
+ style="stop-color:#003d87;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4977">
+ <stop
+ id="stop4979"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop4981"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <filter
+ id="filter6406"
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000000000000002"
+ x="-0.050000000000000017">
+ <feFlood
+ id="feFlood6408"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1"
+ k1="8.1400000000000006"
+ k2="4.9299999999999997"
+ k3="5.5899999999999999"
+ k4="-7.2400000000000002" />
+ <feGaussianBlur
+ id="feGaussianBlur6412"
+ stdDeviation="0.20000000000000001"
+ result="blur"
+ in="composite" />
+ <feOffset
+ id="feOffset6414"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2"
+ operator="" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter4258">
+ <feFlood
+ flood-opacity="0.80200501253132828"
+ flood-color="rgb(197,204,222)"
+ result="flood"
+ id="feFlood4260" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="in"
+ result="composite1"
+ id="feComposite4262"
+ flood-opacity="0.80000000000000004" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4264" />
+ <feOffset
+ dx="-0"
+ dy="-0.5"
+ result="offset"
+ id="feOffset4266" />
+ <feComposite
+ in="SourceGraphic"
+ in2="offset"
+ operator="over"
+ result="composite2"
+ id="feComposite4268" />
+ </filter>
+ <filter
+ id="filter4290"
+ inkscape:label="Drop Shadow"
+ style="color-interpolation-filters:sRGB;">
+ <feFlood
+ id="feFlood4292"
+ result="flood"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="0.59999999999999998" />
+ <feComposite
+ id="feComposite4294"
+ result="composite1"
+ operator="in"
+ in2="SourceGraphic"
+ in="flood" />
+ <feGaussianBlur
+ id="feGaussianBlur4296"
+ result="blur"
+ stdDeviation="6.7999999999999998"
+ in="composite1" />
+ <feOffset
+ id="feOffset4298"
+ result="offset"
+ dy="1.9000000000000004"
+ dx="0.69999999999999996"
+ flood-opacity="0.68000000000000005" />
+ <feComposite
+ id="feComposite4300"
+ result="composite2"
+ in2="offset"
+ in="SourceGraphic"
+ operator="" />
+ </filter>
+ <filter
+ id="filter6406-6"
+ style="color-interpolation-filters:sRGB"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000001"
+ x="-0.050000001">
+ <feFlood
+ id="feFlood6408-1"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410-2"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1" />
+ <feGaussianBlur
+ id="feGaussianBlur6412-9"
+ stdDeviation="0.20000000000000001"
+ result="blur" />
+ <feOffset
+ id="feOffset6414-3"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416-1"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2" />
+ </filter>
+ <filter
+ id="filter6406-4"
+ style="color-interpolation-filters:sRGB"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000001"
+ x="-0.050000001">
+ <feFlood
+ id="feFlood6408-7"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410-8"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1" />
+ <feGaussianBlur
+ id="feGaussianBlur6412-4"
+ stdDeviation="0.20000000000000001"
+ result="blur" />
+ <feOffset
+ id="feOffset6414-5"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416-0"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2" />
+ </filter>
+ <filter
+ id="filter6406-1"
+ style="color-interpolation-filters:sRGB"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000001"
+ x="-0.050000001">
+ <feFlood
+ id="feFlood6408-0"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410-6"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1" />
+ <feGaussianBlur
+ id="feGaussianBlur6412-3"
+ stdDeviation="0.20000000000000001"
+ result="blur" />
+ <feOffset
+ id="feOffset6414-2"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416-06"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2" />
+ </filter>
+ <filter
+ id="filter6406-65"
+ style="color-interpolation-filters:sRGB"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000001"
+ x="-0.050000001">
+ <feFlood
+ id="feFlood6408-6"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410-9"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1" />
+ <feGaussianBlur
+ id="feGaussianBlur6412-37"
+ stdDeviation="0.20000000000000001"
+ result="blur" />
+ <feOffset
+ id="feOffset6414-4"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416-5"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.17254902"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627418"
+ inkscape:cx="24.522092"
+ inkscape:cy="23.789911"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1861"
+ inkscape:window-height="1176"
+ inkscape:window-x="59"
+ inkscape:window-y="24"
+ inkscape:showpageshadow="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="1"
+ width="512px"
+ units="px"
+ inkscape:snap-global="false"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-others="true">
+ <sodipodi:guide
+ orientation="0,1"
+ position="4.331,47"
+ id="guide3056"
+ inkscape:label=""
+ inkscape:color="rgb(99,99,125)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="23.9375,24.5625"
+ id="guide3058"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="40,25.375"
+ id="guide5866" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="38.448931,29.742679"
+ id="guide5868" />
+ <sodipodi:guide
+ position="3.8890873,1"
+ orientation="0,1"
+ id="guide4521"
+ inkscape:label=""
+ inkscape:color="rgb(106,106,146)" />
+ <sodipodi:guide
+ position="1,17.324"
+ orientation="1,0"
+ id="guide4523"
+ inkscape:label=""
+ inkscape:color="rgb(152,152,181)" />
+ <sodipodi:guide
+ position="47,33.852737"
+ orientation="1,0"
+ id="guide4525"
+ inkscape:label=""
+ inkscape:color="rgb(121,121,172)" />
+ <sodipodi:guide
+ position="13.433908,46"
+ orientation="0,1"
+ id="guide4527"
+ inkscape:label=""
+ inkscape:color="rgb(255,40,0)" />
+ <sodipodi:guide
+ position="8,36.135"
+ orientation="1,0"
+ id="guide4529"
+ inkscape:label=""
+ inkscape:color="rgb(255,11,0)" />
+ <sodipodi:guide
+ position="40,26.436782"
+ orientation="1,0"
+ id="guide4531"
+ inkscape:label=""
+ inkscape:color="rgb(255,6,0)" />
+ <sodipodi:guide
+ position="34.052,2"
+ orientation="0,1"
+ id="guide4533"
+ inkscape:label=""
+ inkscape:color="rgb(255,0,5)" />
+ <sodipodi:guide
+ position="36.879276,26"
+ orientation="0,1"
+ id="guide4542"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ position="43.660795,14.731391"
+ orientation="0,1"
+ id="guide4546" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Tuomas Kuosmanen</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>internet</rdf:li>
+ <rdf:li>tools</rdf:li>
+ <rdf:li>applications</rdf:li>
+ <rdf:li>category</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="seed/download icon"
+ style="display:none" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="paused"
+ style="display:none">
+ <g
+ id="g6424"
+ transform="matrix(0.5,0,0,0.5,2.9837572,-5.2773854)">
+ <path
+ transform="matrix(0.90726715,0,0,0.89972834,26.239516,15.92952)"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cszsc"
+ id="path2069-9"
+ d="M 23.295622,2.4822833 35.490217,21.297229 C 43.30243,33.350632 35.08691,46.383433 23.287956,46.383433 11.489002,46.383433 3.2602089,33.346045 11.079504,21.30073 Z"
+ style="display:inline;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:3.27999091;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter6406-6)" />
+ <rect
+ y="35.411037"
+ x="48.613716"
+ height="16"
+ width="5.5"
+ id="rect4364"
+ style="display:inline;opacity:1;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="35.411037"
+ x="40.426212"
+ height="16"
+ width="5.5"
+ id="rect4364-1"
+ style="display:inline;opacity:1;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ id="layer1"
+ inkscape:label="alert"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <path
+ style="display:inline;fill:#e6381f;fill-opacity:1;fill-rule:evenodd;stroke:#a60e0e;stroke-width:1.48663402;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 23.83453,3.7818049 5.550226,8.4922441 c 3.555636,5.44038 -0.183561,11.322817 -5.553715,11.322817 -5.370156,0 -9.115393,-5.884508 -5.556534,-11.321236 z"
+ id="path2069-8"
+ sodipodi:nodetypes="cszsc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;opacity:1;fill:#630000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 22.275814,10.194729 3.009951,0 -0.491159,7.178411 -1.918487,0 z"
+ id="rect4203"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="display:inline;opacity:1;fill:#630000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 22.394643,18.150264 2.759122,0 0,2.759121 -2.759122,0 z"
+ id="rect4206"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="queue"
+ style="display:inline">
+ <g
+ id="g4381"
+ transform="matrix(0.50041261,0,0,0.50041261,10.301289,13.764121)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cszsc"
+ id="path2069-23"
+ d="M 43.762814,0.18101753 54.826569,17.109357 c 7.087764,10.844788 -0.365907,22.570769 -11.07071,22.570769 -10.704803,0 -18.170517,-11.730108 -11.076327,-22.567619 z"
+ style="display:inline;fill:#dcdc00;fill-opacity:1;fill-rule:evenodd;stroke:#b4b400;stroke-width:2.96343851;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="25.66815"
+ x="35.689159"
+ height="4"
+ width="16"
+ id="rect4221-3-6-7"
+ style="display:inline;opacity:1;fill:#6a6a00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.03118205;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="19.302549"
+ x="35.689159"
+ height="4"
+ width="16"
+ id="rect4221-3-9-5"
+ style="display:inline;opacity:1;fill:#6a6a00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.03118205;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ inkscape:transform-center-x="2.0998475e-05"
+ inkscape:transform-center-y="-0.7497936"
+ transform="matrix(0,121.76383,-210.90115,0,3630.2786,-2895.3827)"
+ d="m 23.88441,17.006021 0.01848,-0.01067 0.01848,-0.01067 0,0.02134 0,0.02134 -0.01848,-0.01067 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="4.1887903"
+ sodipodi:arg1="3.1415927"
+ sodipodi:r2="0.012318929"
+ sodipodi:r1="0.024637857"
+ sodipodi:cy="17.006021"
+ sodipodi:cx="23.909048"
+ sodipodi:sides="3"
+ id="path4266-5-9"
+ style="display:inline;opacity:1;fill:#6a6a00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.97536206;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <path
+ inkscape:transform-center-x="-0.00022730407"
+ inkscape:transform-center-y="0.74972138"
+ transform="matrix(0,-121.76383,210.90115,0,-3542.9004,2944.2596)"
+ d="m 23.88441,17.006021 0.01848,-0.01067 0.01848,-0.01067 0,0.02134 0,0.02134 -0.01848,-0.01067 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="4.1887903"
+ sodipodi:arg1="3.1415927"
+ sodipodi:r2="0.012318929"
+ sodipodi:r1="0.024637857"
+ sodipodi:cy="17.006021"
+ sodipodi:cx="23.909048"
+ sodipodi:sides="3"
+ id="path4266-5-3-2"
+ style="display:inline;opacity:1;fill:#6a6a00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.97536206;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="seed"
+ style="display:inline">
+ <g
+ id="g4316"
+ transform="matrix(0.50386528,0,0,0.50386528,18.968897,3.1952438)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cszsc"
+ id="path2069-18"
+ d="m -6.3533765,21.261638 11.063755,16.928339 c 7.0877645,10.844788 -0.365907,22.570769 -11.07071,22.570769 -10.7048035,0 -18.1705175,-11.730108 -11.0763275,-22.567619 z"
+ style="display:inline;fill:#6699ff;fill-opacity:1;fill-rule:evenodd;stroke:#3366cc;stroke-width:2.96343851;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="49.509773"
+ x="-10.666519"
+ height="4.5"
+ width="8.5"
+ id="rect4364-1-36"
+ style="display:inline;opacity:1;fill:#0f3171;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ inkscape:transform-center-y="1.3125004"
+ transform="matrix(1.9671947,0,0,1.1180142,-53.583459,15.251026)"
+ d="m 28.004205,23.535413 -4.066705,0 -4.066705,0 2.033353,-3.521869 2.033352,-3.52187 2.033352,3.521869 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="1.5707963"
+ sodipodi:arg1="0.52359878"
+ sodipodi:r2="2.347913"
+ sodipodi:r1="4.6958261"
+ sodipodi:cy="21.1875"
+ sodipodi:cx="23.9375"
+ sodipodi:sides="3"
+ id="path5039-7"
+ style="display:inline;opacity:1;fill:#0f3171;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <rect
+ y="43.411861"
+ x="-10.68544"
+ height="4.5"
+ width="8.5"
+ id="rect4364-1-3"
+ style="display:inline;opacity:1;fill:#0f3171;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="down"
+ style="display:inline">
+ <g
+ transform="matrix(0.99398243,0,0,0.99398243,26.888997,23.507801)"
+ style="display:inline"
+ id="g4334">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cszsc"
+ id="path2069-7"
+ d="M -2.9505196,0.78380503 2.6291501,9.3211008 C 6.2036493,14.790341 2.444616,20.703985 -2.9540272,20.703985 c -5.3986437,0 -9.1637498,-5.915725 -5.5860106,-11.3812956 z"
+ style="display:inline;fill:#16c816;fill-opacity:1;fill-rule:evenodd;stroke:#129b00;stroke-width:1.49452055;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ transform="scale(-1,-1)"
+ y="-10.455302"
+ x="0.89548177"
+ height="2.2694387"
+ width="4.2766037"
+ id="rect4364-1-9"
+ style="display:inline;opacity:1;fill:#005000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ inkscape:transform-center-y="-0.65561611"
+ transform="matrix(-0.99209509,0,0,-0.55846672,20.75849,27.675627)"
+ d="m 28.004205,23.535413 -4.066705,0 -4.066705,0 2.033353,-3.521869 2.033352,-3.52187 2.033352,3.521869 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="1.5707963"
+ sodipodi:arg1="0.52359878"
+ sodipodi:r2="2.347913"
+ sodipodi:r1="4.6958261"
+ sodipodi:cy="21.1875"
+ sodipodi:cx="23.9375"
+ sodipodi:sides="3"
+ id="path5039-2"
+ style="display:inline;opacity:1;fill:#005000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <rect
+ transform="scale(-1,-1)"
+ y="-13.625159"
+ x="0.88536817"
+ height="2.2694387"
+ width="4.2766037"
+ id="rect4364-1-3-0"
+ style="display:inline;opacity:1;fill:#005000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/deluge/ui/data/pixmaps/all16.png b/deluge/ui/data/pixmaps/all16.png
new file mode 100644
index 0000000..c63f8df
--- /dev/null
+++ b/deluge/ui/data/pixmaps/all16.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/checking.svg b/deluge/ui/data/pixmaps/checking.svg
new file mode 100644
index 0000000..4d64b7e
--- /dev/null
+++ b/deluge/ui/data/pixmaps/checking.svg
@@ -0,0 +1,504 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3440"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="deluge_checking.svg"
+ inkscape:export-xdpi="960"
+ inkscape:export-ydpi="960"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="TRUE"
+ version="1.1"
+ inkscape:export-filename="/home/calum/projects/deluge-logo/deluge.512.x.png">
+ <defs
+ id="defs3">
+ <color-profile
+ name="sRGB"
+ xlink:href="/usr/share/color/icc/sRGB.icc"
+ id="color-profile4484" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2973">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2975" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2977" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4126">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop4128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.16494845;"
+ offset="1.0000000"
+ id="stop4130" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4114">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4116" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4118" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3962">
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop3964" />
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.15517241"
+ id="stop4134" />
+ <stop
+ style="stop-color:#4074ae;stop-opacity:1.0000000;"
+ offset="0.75000000"
+ id="stop4346" />
+ <stop
+ style="stop-color:#36486c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop3966" />
+ </linearGradient>
+ <radialGradient
+ r="13.994944"
+ fy="33.506763"
+ fx="-10.089286"
+ cy="33.506763"
+ cx="-10.089286"
+ gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4019"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4004"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ id="radialGradient3999"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
+ r="13.994946"
+ fy="24.241488"
+ fx="61.662098"
+ cy="24.241488"
+ cx="61.662098"
+ id="radialGradient3943"
+ xlink:href="#linearGradient1312"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient1312">
+ <stop
+ id="stop1314"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1316"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3993">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3995" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop3997" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2973"
+ id="radialGradient3866"
+ cx="-22.375"
+ cy="18.499998"
+ fx="-22.375"
+ fy="18.499998"
+ r="14.33462"
+ gradientTransform="matrix(1,0,0,1.140022,40.17678,1.347091)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ r="12.289036"
+ fy="63.965388"
+ fx="15.115514"
+ cy="63.965388"
+ cx="15.115514"
+ gradientTransform="scale(1.643990,0.608276)"
+ id="radialGradient5000"
+ xlink:href="#linearGradient4114"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4989">
+ <stop
+ id="stop4991"
+ offset="0"
+ style="stop-color:#47abff;stop-opacity:1" />
+ <stop
+ id="stop4993"
+ offset="0.35955963"
+ style="stop-color:#53a6ff;stop-opacity:1" />
+ <stop
+ id="stop4995"
+ offset="0.79518169"
+ style="stop-color:#286cbb;stop-opacity:1" />
+ <stop
+ id="stop4997"
+ offset="1"
+ style="stop-color:#003d87;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4977">
+ <stop
+ id="stop4979"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop4981"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <filter
+ id="filter6406"
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000000000000002"
+ x="-0.050000000000000017">
+ <feFlood
+ id="feFlood6408"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1"
+ k1="8.1400000000000006"
+ k2="4.9299999999999997"
+ k3="5.5899999999999999"
+ k4="-7.2400000000000002" />
+ <feGaussianBlur
+ id="feGaussianBlur6412"
+ stdDeviation="0.20000000000000001"
+ result="blur"
+ in="composite" />
+ <feOffset
+ id="feOffset6414"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2"
+ operator="" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter4258">
+ <feFlood
+ flood-opacity="0.80200501253132828"
+ flood-color="rgb(197,204,222)"
+ result="flood"
+ id="feFlood4260" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="in"
+ result="composite1"
+ id="feComposite4262"
+ flood-opacity="0.80000000000000004" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4264" />
+ <feOffset
+ dx="-0"
+ dy="-0.5"
+ result="offset"
+ id="feOffset4266" />
+ <feComposite
+ in="SourceGraphic"
+ in2="offset"
+ operator="over"
+ result="composite2"
+ id="feComposite4268" />
+ </filter>
+ <filter
+ id="filter4290"
+ inkscape:label="Drop Shadow"
+ style="color-interpolation-filters:sRGB;">
+ <feFlood
+ id="feFlood4292"
+ result="flood"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="0.59999999999999998" />
+ <feComposite
+ id="feComposite4294"
+ result="composite1"
+ operator="in"
+ in2="SourceGraphic"
+ in="flood" />
+ <feGaussianBlur
+ id="feGaussianBlur4296"
+ result="blur"
+ stdDeviation="6.7999999999999998"
+ in="composite1" />
+ <feOffset
+ id="feOffset4298"
+ result="offset"
+ dy="1.9000000000000004"
+ dx="0.69999999999999996"
+ flood-opacity="0.68000000000000005" />
+ <feComposite
+ id="feComposite4300"
+ result="composite2"
+ in2="offset"
+ in="SourceGraphic"
+ operator="" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.17254902"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313709"
+ inkscape:cx="37.39656"
+ inkscape:cy="17.410941"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1861"
+ inkscape:window-height="1176"
+ inkscape:window-x="59"
+ inkscape:window-y="24"
+ inkscape:showpageshadow="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="1"
+ width="512px"
+ units="px"
+ inkscape:snap-global="false"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-others="true">
+ <sodipodi:guide
+ orientation="0,1"
+ position="4.331,47"
+ id="guide3056"
+ inkscape:label=""
+ inkscape:color="rgb(99,99,125)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="23.9375,24.5625"
+ id="guide3058"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="40,25.375"
+ id="guide5866" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="38.448931,29.742679"
+ id="guide5868" />
+ <sodipodi:guide
+ position="3.8890873,1"
+ orientation="0,1"
+ id="guide4521"
+ inkscape:label=""
+ inkscape:color="rgb(106,106,146)" />
+ <sodipodi:guide
+ position="1,17.324"
+ orientation="1,0"
+ id="guide4523"
+ inkscape:label=""
+ inkscape:color="rgb(152,152,181)" />
+ <sodipodi:guide
+ position="47,33.852737"
+ orientation="1,0"
+ id="guide4525"
+ inkscape:label=""
+ inkscape:color="rgb(121,121,172)" />
+ <sodipodi:guide
+ position="13.433908,46"
+ orientation="0,1"
+ id="guide4527"
+ inkscape:label=""
+ inkscape:color="rgb(255,40,0)" />
+ <sodipodi:guide
+ position="8,36.135"
+ orientation="1,0"
+ id="guide4529"
+ inkscape:label=""
+ inkscape:color="rgb(255,11,0)" />
+ <sodipodi:guide
+ position="40,26.436782"
+ orientation="1,0"
+ id="guide4531"
+ inkscape:label=""
+ inkscape:color="rgb(255,6,0)" />
+ <sodipodi:guide
+ position="34.052,2"
+ orientation="0,1"
+ id="guide4533"
+ inkscape:label=""
+ inkscape:color="rgb(255,0,5)" />
+ <sodipodi:guide
+ position="36.879276,26"
+ orientation="0,1"
+ id="guide4542"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ position="43.660795,14.731391"
+ orientation="0,1"
+ id="guide4546" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Tuomas Kuosmanen</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>internet</rdf:li>
+ <rdf:li>tools</rdf:li>
+ <rdf:li>applications</rdf:li>
+ <rdf:li>category</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="base droplet"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <path
+ style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:3.27999091;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter6406)"
+ d="M 23.295622,2.4822833 35.490217,21.297229 C 43.30243,33.350632 35.08691,46.383433 23.287956,46.383433 11.489002,46.383433 3.2602089,33.346045 11.079504,21.30073 Z"
+ id="path2069"
+ sodipodi:nodetypes="cszsc"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.90726715,0,0,0.89972834,2.9383017,2.518482)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="paused icon"
+ style="display:none">
+ <rect
+ style="display:inline;opacity:1;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4364"
+ width="5.5"
+ height="16"
+ x="25.3125"
+ y="22" />
+ <rect
+ style="display:inline;opacity:1;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4364-1"
+ width="5.5"
+ height="16"
+ x="17.125"
+ y="22" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="checking icon">
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.48776338;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 15.70911,22.157482 c 0.119914,0.199935 0.418813,8.847951 0.34197,8.725818 -0.05095,-0.115892 9.029726,-0.318613 9.052253,-0.33886 -0.04746,0.004 -2.879595,-2.667362 -2.855268,-2.629987 2.723225,-2.451281 6.566426,-1.740041 6.843087,3.098922 0.276661,4.838963 -7.571006,6.978129 -8.064694,0.917979 l -4.575574,-0.07664 c 0.742237,4.962428 4.540705,7.477492 7.550683,7.485704 3.009978,0.0082 8.821989,-1.590934 8.794824,-8.313673 -0.02717,-6.722739 -4.319772,-8.932187 -8.343129,-8.887584 -4.023357,0.0446 -5.694705,2.520898 -5.856847,2.535638 0,0 -2.784162,-2.424246 -2.887305,-2.517317 z"
+ id="path3485"
+ sodipodi:nodetypes="cccczcczzzcc" />
+ </g>
+</svg>
diff --git a/deluge/ui/data/pixmaps/checking16.png b/deluge/ui/data/pixmaps/checking16.png
new file mode 100644
index 0000000..0ac2c65
--- /dev/null
+++ b/deluge/ui/data/pixmaps/checking16.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/deluge-about.png b/deluge/ui/data/pixmaps/deluge-about.png
new file mode 100644
index 0000000..39322eb
--- /dev/null
+++ b/deluge/ui/data/pixmaps/deluge-about.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/deluge.ico b/deluge/ui/data/pixmaps/deluge.ico
new file mode 100644
index 0000000..d946d11
--- /dev/null
+++ b/deluge/ui/data/pixmaps/deluge.ico
Binary files differ
diff --git a/deluge/ui/data/pixmaps/deluge.png b/deluge/ui/data/pixmaps/deluge.png
new file mode 100644
index 0000000..7b067ac
--- /dev/null
+++ b/deluge/ui/data/pixmaps/deluge.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/deluge.svg b/deluge/ui/data/pixmaps/deluge.svg
new file mode 100644
index 0000000..4f29f73
--- /dev/null
+++ b/deluge/ui/data/pixmaps/deluge.svg
@@ -0,0 +1,610 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3440"
+ sodipodi:version="0.32"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
+ sodipodi:docname="deluge.svg"
+ inkscape:export-xdpi="32"
+ inkscape:export-ydpi="32"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="TRUE"
+ version="1.1"
+ inkscape:export-filename="/home/calum/Desktop/test1b.png">
+ <defs
+ id="defs3">
+ <color-profile
+ name="sRGB"
+ xlink:href="/usr/share/color/icc/sRGB.icc"
+ id="color-profile2" />
+ <linearGradient
+ id="linearGradient4345"
+ inkscape:collect="always">
+ <stop
+ id="stop4347"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop4349"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2973">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2975" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2977" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4126">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop4128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.16494845;"
+ offset="1.0000000"
+ id="stop4130" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4114">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4116" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4118" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3962">
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop3964" />
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.15517241"
+ id="stop4134" />
+ <stop
+ style="stop-color:#4074ae;stop-opacity:1.0000000;"
+ offset="0.75000000"
+ id="stop4346" />
+ <stop
+ style="stop-color:#36486c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop3966" />
+ </linearGradient>
+ <radialGradient
+ r="13.994944"
+ fy="33.506763"
+ fx="-10.089286"
+ cy="33.506763"
+ cx="-10.089286"
+ gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4019"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4004"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ id="radialGradient3999"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
+ r="13.994946"
+ fy="24.241488"
+ fx="61.662098"
+ cy="24.241488"
+ cx="61.662098"
+ id="radialGradient3943"
+ xlink:href="#linearGradient1312"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient1312">
+ <stop
+ id="stop1314"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1316"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3993">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3995" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop3997" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2973"
+ id="radialGradient3866"
+ cx="-22.375"
+ cy="18.499998"
+ fx="-22.375"
+ fy="18.499998"
+ r="14.33462"
+ gradientTransform="matrix(1,0,0,1.140022,40.17678,1.347091)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ r="12.289036"
+ fy="63.965388"
+ fx="15.115514"
+ cy="63.965388"
+ cx="15.115514"
+ gradientTransform="scale(1.643990,0.608276)"
+ id="radialGradient5000"
+ xlink:href="#linearGradient4114"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4989">
+ <stop
+ id="stop4991"
+ offset="0"
+ style="stop-color:#47abff;stop-opacity:1" />
+ <stop
+ id="stop4993"
+ offset="0.35955963"
+ style="stop-color:#53a6ff;stop-opacity:1" />
+ <stop
+ id="stop4995"
+ offset="0.79518169"
+ style="stop-color:#286cbb;stop-opacity:1" />
+ <stop
+ id="stop4997"
+ offset="1"
+ style="stop-color:#003d87;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4977">
+ <stop
+ id="stop4979"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop4981"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4345"
+ id="radialGradient5878"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.56833945,-0.14774444,0.12240592,0.69984003,9.8157812,6.7018745)"
+ cx="11.707551"
+ cy="36.527763"
+ fx="11.707551"
+ fy="36.527763"
+ r="14.33681" />
+ <filter
+ id="filter6406"
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000000000000002"
+ x="-0.050000000000000017">
+ <feFlood
+ id="feFlood6408"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1"
+ k4="-7.2400000000000002"
+ k3="5.5899999999999999"
+ k2="4.9299999999999997"
+ k1="8.1400000000000006" />
+ <feGaussianBlur
+ id="feGaussianBlur6412"
+ stdDeviation="0.20000000000000001"
+ result="blur"
+ in="composite" />
+ <feOffset
+ id="feOffset6414"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2"
+ operator="" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter4258">
+ <feFlood
+ flood-opacity="0.80200501253132828"
+ flood-color="rgb(197,204,222)"
+ result="flood"
+ id="feFlood4260" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="in"
+ result="composite1"
+ id="feComposite4262"
+ flood-opacity="0.80000000000000004" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4264" />
+ <feOffset
+ dx="-0"
+ dy="-0.5"
+ result="offset"
+ id="feOffset4266" />
+ <feComposite
+ in="SourceGraphic"
+ in2="offset"
+ operator="over"
+ result="composite2"
+ id="feComposite4268" />
+ </filter>
+ <filter
+ id="filter4290"
+ inkscape:label="Drop Shadow"
+ style="color-interpolation-filters:sRGB;">
+ <feFlood
+ id="feFlood4292"
+ result="flood"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="0.59999999999999998" />
+ <feComposite
+ id="feComposite4294"
+ result="composite1"
+ operator="in"
+ in2="SourceGraphic"
+ in="flood" />
+ <feGaussianBlur
+ id="feGaussianBlur4296"
+ result="blur"
+ stdDeviation="6.7999999999999998"
+ in="composite1" />
+ <feOffset
+ id="feOffset4298"
+ result="offset"
+ dy="1.9000000000000004"
+ dx="0.69999999999999996"
+ flood-opacity="0.68000000000000005" />
+ <feComposite
+ id="feComposite4300"
+ result="composite2"
+ in2="offset"
+ in="SourceGraphic"
+ operator="" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4977"
+ id="radialGradient4375"
+ cx="19.015932"
+ cy="19.611181"
+ fx="19.015932"
+ fy="19.611181"
+ r="15.627373"
+ gradientTransform="matrix(-0.21582873,1.1173231,-1.0803619,-0.20155681,42.177326,-6.1234)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.65098039"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="13.92"
+ inkscape:cx="3.3184766"
+ inkscape:cy="26.850801"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1981"
+ inkscape:window-height="1097"
+ inkscape:window-x="67"
+ inkscape:window-y="27"
+ inkscape:showpageshadow="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="1"
+ width="512px"
+ units="px"
+ inkscape:snap-global="false"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-others="true"
+ inkscape:pagecheckerboard="false"
+ showborder="true"
+ borderlayer="false"
+ scale-x="2">
+ <sodipodi:guide
+ orientation="0,1"
+ position="4.331,47"
+ id="guide3056"
+ inkscape:label=""
+ inkscape:color="rgb(99,99,125)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="24,41.875"
+ id="guide3058"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="40,25.375"
+ id="guide5866" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="34.626135,29.742679"
+ id="guide5868" />
+ <sodipodi:guide
+ position="3.8890873,1"
+ orientation="0,1"
+ id="guide4521"
+ inkscape:label=""
+ inkscape:color="rgb(106,106,146)" />
+ <sodipodi:guide
+ position="1,17.324"
+ orientation="1,0"
+ id="guide4523"
+ inkscape:label=""
+ inkscape:color="rgb(152,152,181)" />
+ <sodipodi:guide
+ position="47,33.852737"
+ orientation="1,0"
+ id="guide4525"
+ inkscape:label=""
+ inkscape:color="rgb(121,121,172)" />
+ <sodipodi:guide
+ position="13.433908,46"
+ orientation="0,1"
+ id="guide4527"
+ inkscape:label=""
+ inkscape:color="rgb(255,40,0)" />
+ <sodipodi:guide
+ position="8,36.135"
+ orientation="1,0"
+ id="guide4529"
+ inkscape:label=""
+ inkscape:color="rgb(255,11,0)" />
+ <sodipodi:guide
+ position="40,26.436782"
+ orientation="1,0"
+ id="guide4531"
+ inkscape:label=""
+ inkscape:color="rgb(255,6,0)" />
+ <sodipodi:guide
+ position="34.052,2"
+ orientation="0,1"
+ id="guide4533"
+ inkscape:label=""
+ inkscape:color="rgb(255,0,5)" />
+ <sodipodi:guide
+ position="36.879276,26"
+ orientation="0,1"
+ id="guide4542"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ position="43.660795,14.731391"
+ orientation="0,1"
+ id="guide4546" />
+ <inkscape:grid
+ type="xygrid"
+ id="grid4297" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Tuomas Kuosmanen</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>internet</rdf:li>
+ <rdf:li>tools</rdf:li>
+ <rdf:li>applications</rdf:li>
+ <rdf:li>category</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <path
+ style="fill:#4c90e8;fill-opacity:1;fill-rule:evenodd;stroke:#094491;stroke-width:3.19036889;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 24.00916,2.8848679 35.921225,21.107868 c 7.631218,11.674181 -0.393962,24.296949 -11.919555,24.296949 -11.525593,0 -19.5637412,-12.627213 -11.925606,-24.293557 z"
+ id="path2069"
+ sodipodi:nodetypes="cszsc"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="wave fill"
+ style="display:inline">
+ <path
+ style="display:inline;fill:#094491;fill-opacity:1;fill-rule:evenodd;stroke-width:0.43658349;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 28.249173,24.076764 c -6.513399,-2.656088 -9.930764,4.129513 -8.844266,7.299777 2.363892,6.897492 11.278562,8.624272 17.861607,-2.864877 0,0 0.07021,1.386537 0.139797,2.046235 0.884013,8.376987 -6.162376,13.70953 -13.302295,13.605305 -7.139921,-0.104225 -9.320813,-2.876749 -11.424685,-6.068739 -3.4133569,-5.178732 -2.561398,-13.615464 2.027677,-17.561337 5.237731,-4.328395 11.004287,-2.017675 13.542165,3.543636 z"
+ id="path2969"
+ sodipodi:nodetypes="cscszscc"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ style="display:none"
+ inkscape:label="wave fill light"
+ id="g4327"
+ inkscape:groupmode="layer">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscszscc"
+ id="path4329"
+ d="m 24.811452,24.996951 c -6.049549,-2.467385 -7.648816,3.683738 -6.639688,6.628769 2.195546,6.407462 11.948502,7.605174 18.062738,-3.067723 0,0 0.11598,1.28803 0.180639,1.900859 0.82106,7.781844 -5.621926,12.735535 -12.253379,12.638715 -6.631454,-0.09682 -8.657036,-2.672368 -10.611083,-5.637583 -3.170275,-4.810809 -2.429788,-11.327408 1.78168,-14.840553 4.864733,-3.959831 8.798281,-0.09585 9.479093,2.377516 z"
+ style="display:inline;fill:#99c3f9;fill-opacity:1;fill-rule:evenodd;stroke-width:0.40552941;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="wave stroke 1.3px and fill "
+ style="display:none">
+ <path
+ style="display:inline;fill:#99c3f9;fill-opacity:1;fill-rule:evenodd;stroke:#094491 icc-color(sRGB, 0.18046845, 0.27837034, 0.41960784);stroke-width:1.33399999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 23.761543,24.179576 c -6.481311,-1.72424 -6.932125,6.183803 -5.453851,8.969604 2.408248,4.538333 12.206251,5.377175 17.706883,-3.282742 0,0 0.07651,2.193563 0.02062,2.77892 -0.534334,5.596549 -6.848986,9.789262 -11.999526,9.621298 -5.243605,-0.170999 -8.282469,-2.549917 -10.154056,-5.379263 -3.036492,-4.590373 -2.048612,-10.811985 1.554101,-13.80496 4.248899,-3.646516 7.44994,-0.562347 8.325827,1.097143 z"
+ id="path2969-6"
+ sodipodi:nodetypes="cscssscc"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ style="display:none"
+ inkscape:label="wave stroke 2px and fill "
+ id="g4217"
+ inkscape:groupmode="layer">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscssscc"
+ id="path4219"
+ d="m 23.507553,23.925586 c -6.495438,-1.064032 -6.790118,6.421446 -5.149063,9.579179 2.304561,4.434459 10.903063,6.282759 17.3005,-2.825561 0,0 -0.02509,1.990372 -0.08098,2.575729 -0.534334,5.596549 -6.391805,8.925697 -11.542345,8.757733 -5.243605,-0.170999 -8.247979,-2.119778 -10.001662,-5.023677 -2.772156,-4.590373 -2.467304,-9.592836 0.487345,-12.585811 3.100966,-3.879425 7.831125,-2.714919 8.986201,-0.477592 z"
+ style="display:inline;fill:#99c3f9;fill-opacity:1;fill-rule:evenodd;stroke:#094491 icc-color(sRGB, 0.18046845, 0.27837034, 0.41960784);stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="gradient inner wave "
+ style="display:none">
+ <path
+ style="fill:url(#radialGradient5878);fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 23.55546,23.805666 c -6.490966,-1.345852 -7.700279,4.84717 -6.759909,8.059555 1.100923,3.760845 4.033145,7.507508 11.754513,5.50458 -3.268904,5.846892 -11.255492,4.570412 -13.940353,0.387138 -2.563055,-3.993493 -2.992402,-9.05746 -1.115519,-11.776277 4.049097,-6.655711 9.485026,-4.029293 10.061268,-2.174996 z"
+ id="path3868"
+ sodipodi:nodetypes="cscscc"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ style="display:inline"
+ inkscape:label="solid inner wavelet small"
+ id="g4476"
+ inkscape:groupmode="layer">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscszc"
+ id="path4478"
+ d="m 24.158349,21.568695 c -7.295351,0.177796 -8.680227,8.584045 -6.659444,12.185022 2.809336,5.006167 7.071815,5.968946 12.90485,4.121032 -3.330593,3.620896 -10.166138,4.579185 -14.809086,-0.592946 -3.194749,-3.558875 -3.473998,-8.525976 -1.256883,-12.674161 2.217115,-4.148189 6.638012,-5.301549 9.820563,-3.038947 z"
+ style="fill:#83b8f9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.07657671" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="g4486"
+ inkscape:label="solid inner wavelet larger"
+ style="display:none">
+ <path
+ style="fill:#99c3f9;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 21.55277,22.974939 c -5.188765,1.005551 -6.173294,6.973638 -4.694095,10.155871 2.191227,4.714034 8.449957,8.07696 17.664862,0.691234 -5.828901,10.827975 -14.873199,7.043001 -17.313798,4.977307 -1.97159,-1.66873 -4.164846,-4.855384 -4.11832,-8.341257 0.09522,-7.134172 6.604293,-9.266569 8.461351,-7.483155 z"
+ id="path4488"
+ sodipodi:nodetypes="cscssc"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Finish"
+ style="display:none"
+ sodipodi:insensitive="true">
+ <path
+ style="display:inline;opacity:0.68800001;fill:url(#radialGradient4375);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.01508224;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 23.956644,1.939572 -11.98159,18.384686 c -3.9618093,5.166305 -3.6931007,11.439356 -2.4054307,15.8855 5.3079527,10.817522 14.5668877,9.659123 14.5668877,9.659123 0,0 6.868403,-0.005 11.475831,-5.120874 2.283123,-2.535051 5.325726,-9.801674 2.662706,-16.234991 -0.49634,-1.028711 -3.75284,-6.551522 -4.429455,-7.554788 z"
+ id="path4279"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccsccc" />
+ </g>
+</svg>
diff --git a/deluge/ui/data/pixmaps/deluge16.png b/deluge/ui/data/pixmaps/deluge16.png
new file mode 100644
index 0000000..5afdbe4
--- /dev/null
+++ b/deluge/ui/data/pixmaps/deluge16.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/dht.svg b/deluge/ui/data/pixmaps/dht.svg
new file mode 100644
index 0000000..f145d0b
--- /dev/null
+++ b/deluge/ui/data/pixmaps/dht.svg
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="128"
+ height="128"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="dht.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/andrew/Projects/deluge/trunk/deluge/data/pixmaps/dht16.png"
+ inkscape:export-xdpi="1.9579109"
+ inkscape:export-ydpi="1.9579109"
+ version="1.1">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10561" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="51.409667"
+ inkscape:cy="66.916781"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ inkscape:window-width="1861"
+ inkscape:window-height="1176"
+ inkscape:window-x="59"
+ inkscape:window-y="24"
+ showgrid="false"
+ inkscape:showpageshadow="false"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-924.36219)">
+ <path
+ style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 51.371573,974.02754 4.703341,36.73196"
+ id="path3695"
+ inkscape:export-filename="/home/andrew/dht16-2.png"
+ inkscape:export-xdpi="3.8918922"
+ inkscape:export-ydpi="3.8918922"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 63.256291,969.16777 23.581249,23.7999"
+ id="path3699"
+ inkscape:export-filename="/home/andrew/dht16-2.png"
+ inkscape:export-xdpi="3.8918922"
+ inkscape:export-ydpi="3.8918922"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 31.776499,981.71786 4.647106,-9.48366"
+ id="path3697"
+ inkscape:export-filename="/home/andrew/dht16-2.png"
+ inkscape:export-xdpi="3.8918922"
+ inkscape:export-ydpi="3.8918922"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 69.943212,952.70635 12.971145,2.50294"
+ id="path3691"
+ inkscape:export-filename="/home/andrew/dht16-2.png"
+ inkscape:export-xdpi="3.8918922"
+ inkscape:export-ydpi="3.8918922"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 67.557838,1019.8019 14.681475,-5.7109"
+ id="path3693"
+ inkscape:export-filename="/home/andrew/dht16-2.png"
+ inkscape:export-xdpi="3.8918922"
+ inkscape:export-ydpi="3.8918922"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <circle
+ style="opacity:1;fill:#16c816;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3437"
+ inkscape:export-filename="/home/andrew/dht16-2.png"
+ inkscape:export-xdpi="3.8918922"
+ inkscape:export-ydpi="3.8918922"
+ cx="47.440121"
+ cy="951.93445"
+ r="24.014807" />
+ <circle
+ style="opacity:1;fill:#4c90e8;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3443"
+ inkscape:export-filename="/home/andrew/dht16-2.png"
+ inkscape:export-xdpi="3.8918922"
+ inkscape:export-ydpi="3.8918922"
+ cx="23.889254"
+ cy="997.40765"
+ r="18.128822" />
+ <circle
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3445"
+ inkscape:export-filename="/home/andrew/dht16-2.png"
+ inkscape:export-xdpi="3.8918922"
+ inkscape:export-ydpi="3.8918922"
+ cx="95.936546"
+ cy="960.33722"
+ r="14.597237" />
+ <circle
+ style="opacity:1;fill:#4c90e8;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3439"
+ inkscape:export-filename="/home/andrew/dht16-2.png"
+ inkscape:export-xdpi="3.8918922"
+ inkscape:export-ydpi="3.8918922"
+ cx="99.223282"
+ cy="1006.9724"
+ r="21.189529" />
+ <circle
+ style="opacity:1;fill:#16c816;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3441"
+ inkscape:export-filename="/home/andrew/dht16-2.png"
+ inkscape:export-xdpi="3.8918922"
+ inkscape:export-ydpi="3.8918922"
+ cx="54.840214"
+ cy="1026.1222"
+ r="18.364264" />
+ </g>
+</svg>
diff --git a/deluge/ui/data/pixmaps/dht16.png b/deluge/ui/data/pixmaps/dht16.png
new file mode 100644
index 0000000..363ee0c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/dht16.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/downloading.svg b/deluge/ui/data/pixmaps/downloading.svg
new file mode 100644
index 0000000..d48cb69
--- /dev/null
+++ b/deluge/ui/data/pixmaps/downloading.svg
@@ -0,0 +1,515 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3440"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="downloading.svg"
+ inkscape:export-xdpi="30"
+ inkscape:export-ydpi="30"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="TRUE"
+ version="1.1"
+ inkscape:export-filename="/home/calum/projects/deluge-logo/deluge_download16.svg.png">
+ <defs
+ id="defs3">
+ <color-profile
+ name="sRGB"
+ xlink:href="/usr/share/color/icc/sRGB.icc"
+ id="color-profile4484" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2973">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2975" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2977" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4126">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop4128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.16494845;"
+ offset="1.0000000"
+ id="stop4130" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4114">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4116" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4118" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3962">
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop3964" />
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.15517241"
+ id="stop4134" />
+ <stop
+ style="stop-color:#4074ae;stop-opacity:1.0000000;"
+ offset="0.75000000"
+ id="stop4346" />
+ <stop
+ style="stop-color:#36486c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop3966" />
+ </linearGradient>
+ <radialGradient
+ r="13.994944"
+ fy="33.506763"
+ fx="-10.089286"
+ cy="33.506763"
+ cx="-10.089286"
+ gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4019"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4004"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ id="radialGradient3999"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
+ r="13.994946"
+ fy="24.241488"
+ fx="61.662098"
+ cy="24.241488"
+ cx="61.662098"
+ id="radialGradient3943"
+ xlink:href="#linearGradient1312"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient1312">
+ <stop
+ id="stop1314"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1316"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3993">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3995" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop3997" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2973"
+ id="radialGradient3866"
+ cx="-22.375"
+ cy="18.499998"
+ fx="-22.375"
+ fy="18.499998"
+ r="14.33462"
+ gradientTransform="matrix(1,0,0,1.140022,40.17678,1.347091)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ r="12.289036"
+ fy="63.965388"
+ fx="15.115514"
+ cy="63.965388"
+ cx="15.115514"
+ gradientTransform="scale(1.643990,0.608276)"
+ id="radialGradient5000"
+ xlink:href="#linearGradient4114"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4989">
+ <stop
+ id="stop4991"
+ offset="0"
+ style="stop-color:#47abff;stop-opacity:1" />
+ <stop
+ id="stop4993"
+ offset="0.35955963"
+ style="stop-color:#53a6ff;stop-opacity:1" />
+ <stop
+ id="stop4995"
+ offset="0.79518169"
+ style="stop-color:#286cbb;stop-opacity:1" />
+ <stop
+ id="stop4997"
+ offset="1"
+ style="stop-color:#003d87;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4977">
+ <stop
+ id="stop4979"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop4981"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <filter
+ id="filter6406"
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000000000000002"
+ x="-0.050000000000000017">
+ <feFlood
+ id="feFlood6408"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1"
+ k1="8.1400000000000006"
+ k2="4.9299999999999997"
+ k3="5.5899999999999999"
+ k4="-7.2400000000000002" />
+ <feGaussianBlur
+ id="feGaussianBlur6412"
+ stdDeviation="0.20000000000000001"
+ result="blur"
+ in="composite" />
+ <feOffset
+ id="feOffset6414"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2"
+ operator="" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter4258">
+ <feFlood
+ flood-opacity="0.80200501253132828"
+ flood-color="rgb(197,204,222)"
+ result="flood"
+ id="feFlood4260" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="in"
+ result="composite1"
+ id="feComposite4262"
+ flood-opacity="0.80000000000000004" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4264" />
+ <feOffset
+ dx="-0"
+ dy="-0.5"
+ result="offset"
+ id="feOffset4266" />
+ <feComposite
+ in="SourceGraphic"
+ in2="offset"
+ operator="over"
+ result="composite2"
+ id="feComposite4268" />
+ </filter>
+ <filter
+ id="filter4290"
+ inkscape:label="Drop Shadow"
+ style="color-interpolation-filters:sRGB;">
+ <feFlood
+ id="feFlood4292"
+ result="flood"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="0.59999999999999998" />
+ <feComposite
+ id="feComposite4294"
+ result="composite1"
+ operator="in"
+ in2="SourceGraphic"
+ in="flood" />
+ <feGaussianBlur
+ id="feGaussianBlur4296"
+ result="blur"
+ stdDeviation="6.7999999999999998"
+ in="composite1" />
+ <feOffset
+ id="feOffset4298"
+ result="offset"
+ dy="1.9000000000000004"
+ dx="0.69999999999999996"
+ flood-opacity="0.68000000000000005" />
+ <feComposite
+ id="feComposite4300"
+ result="composite2"
+ in2="offset"
+ in="SourceGraphic"
+ operator="" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.17254902"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="22.077879"
+ inkscape:cy="23.209575"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1861"
+ inkscape:window-height="1176"
+ inkscape:window-x="59"
+ inkscape:window-y="24"
+ inkscape:showpageshadow="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="1"
+ width="512px"
+ units="px"
+ inkscape:snap-global="false"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-others="true">
+ <sodipodi:guide
+ orientation="0,1"
+ position="4.331,47"
+ id="guide3056"
+ inkscape:label=""
+ inkscape:color="rgb(99,99,125)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="23.9375,24.5625"
+ id="guide3058"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="40,25.375"
+ id="guide5866" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="38.448931,29.742679"
+ id="guide5868" />
+ <sodipodi:guide
+ position="3.8890873,1"
+ orientation="0,1"
+ id="guide4521"
+ inkscape:label=""
+ inkscape:color="rgb(106,106,146)" />
+ <sodipodi:guide
+ position="1,17.324"
+ orientation="1,0"
+ id="guide4523"
+ inkscape:label=""
+ inkscape:color="rgb(152,152,181)" />
+ <sodipodi:guide
+ position="47,33.852737"
+ orientation="1,0"
+ id="guide4525"
+ inkscape:label=""
+ inkscape:color="rgb(121,121,172)" />
+ <sodipodi:guide
+ position="13.433908,46"
+ orientation="0,1"
+ id="guide4527"
+ inkscape:label=""
+ inkscape:color="rgb(255,40,0)" />
+ <sodipodi:guide
+ position="8,36.135"
+ orientation="1,0"
+ id="guide4529"
+ inkscape:label=""
+ inkscape:color="rgb(255,11,0)" />
+ <sodipodi:guide
+ position="40,26.436782"
+ orientation="1,0"
+ id="guide4531"
+ inkscape:label=""
+ inkscape:color="rgb(255,6,0)" />
+ <sodipodi:guide
+ position="34.052,2"
+ orientation="0,1"
+ id="guide4533"
+ inkscape:label=""
+ inkscape:color="rgb(255,0,5)" />
+ <sodipodi:guide
+ position="36.879276,26"
+ orientation="0,1"
+ id="guide4542"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ position="43.660795,14.731391"
+ orientation="0,1"
+ id="guide4546" />
+ <inkscape:grid
+ type="xygrid"
+ id="grid4225" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Tuomas Kuosmanen</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>internet</rdf:li>
+ <rdf:li>tools</rdf:li>
+ <rdf:li>applications</rdf:li>
+ <rdf:li>category</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="base droplet"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <path
+ style="fill:#16c816;fill-opacity:1;fill-rule:evenodd;stroke:#129b00;stroke-width:3.27999091;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;"
+ d="M 23.295622,2.4822833 35.490217,21.297229 C 43.30243,33.350632 35.08691,46.383433 23.287956,46.383433 11.489002,46.383433 3.2602089,33.346045 11.079504,21.30073 Z"
+ id="path2069"
+ sodipodi:nodetypes="cszsc"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.90726715,0,0,0.89972834,2.9383017,2.518482)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="seed/download icon"
+ style="display:inline">
+ <rect
+ style="display:inline;opacity:1;fill:#005000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4364-1"
+ width="8.4799452"
+ height="4.5"
+ x="-28.148525"
+ y="-23.929176"
+ transform="scale(-1,-1)" />
+ <path
+ sodipodi:type="star"
+ style="opacity:1;fill:#005000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path5039"
+ sodipodi:sides="3"
+ sodipodi:cx="23.9375"
+ sodipodi:cy="21.1875"
+ sodipodi:r1="4.6958261"
+ sodipodi:r2="2.347913"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 28.004205,23.535413 -4.066705,0 -4.066705,0 2.033353,-3.521869 2.033352,-3.52187 2.033352,3.521869 z"
+ transform="matrix(-1.9671947,0,0,-1.1073664,71.085518,58.074825)"
+ inkscape:transform-center-y="-1.3000008" />
+ <rect
+ style="display:inline;opacity:1;fill:#005000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4364-1-3"
+ width="8.4799452"
+ height="4.5"
+ x="-28.168579"
+ y="-30.214588"
+ transform="scale(-1,-1)" />
+ </g>
+</svg>
diff --git a/deluge/ui/data/pixmaps/downloading16.png b/deluge/ui/data/pixmaps/downloading16.png
new file mode 100644
index 0000000..24d6ffa
--- /dev/null
+++ b/deluge/ui/data/pixmaps/downloading16.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ad.png b/deluge/ui/data/pixmaps/flags/ad.png
new file mode 100644
index 0000000..93656aa
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ad.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ae.png b/deluge/ui/data/pixmaps/flags/ae.png
new file mode 100644
index 0000000..e3abee1
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ae.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/af.png b/deluge/ui/data/pixmaps/flags/af.png
new file mode 100644
index 0000000..8506736
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/af.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ag.png b/deluge/ui/data/pixmaps/flags/ag.png
new file mode 100644
index 0000000..ba1aff9
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ag.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ai.png b/deluge/ui/data/pixmaps/flags/ai.png
new file mode 100644
index 0000000..37c723c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ai.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/al.png b/deluge/ui/data/pixmaps/flags/al.png
new file mode 100644
index 0000000..9b56fcb
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/al.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/am.png b/deluge/ui/data/pixmaps/flags/am.png
new file mode 100644
index 0000000..83ac72e
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/am.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/an.png b/deluge/ui/data/pixmaps/flags/an.png
new file mode 100644
index 0000000..09cfdb1
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/an.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ao.png b/deluge/ui/data/pixmaps/flags/ao.png
new file mode 100644
index 0000000..c2004d6
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ao.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/aq.png b/deluge/ui/data/pixmaps/flags/aq.png
new file mode 100644
index 0000000..76fe736
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/aq.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ar.png b/deluge/ui/data/pixmaps/flags/ar.png
new file mode 100644
index 0000000..f16a290
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ar.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/as.png b/deluge/ui/data/pixmaps/flags/as.png
new file mode 100644
index 0000000..e38ce43
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/as.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/at.png b/deluge/ui/data/pixmaps/flags/at.png
new file mode 100644
index 0000000..25c7e42
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/at.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/au.png b/deluge/ui/data/pixmaps/flags/au.png
new file mode 100644
index 0000000..0de18f0
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/au.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/aw.png b/deluge/ui/data/pixmaps/flags/aw.png
new file mode 100644
index 0000000..788d738
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/aw.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ax.png b/deluge/ui/data/pixmaps/flags/ax.png
new file mode 100644
index 0000000..0060c35
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ax.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/az.png b/deluge/ui/data/pixmaps/flags/az.png
new file mode 100644
index 0000000..cb9c9a1
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/az.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ba.png b/deluge/ui/data/pixmaps/flags/ba.png
new file mode 100644
index 0000000..160c5e2
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ba.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bb.png b/deluge/ui/data/pixmaps/flags/bb.png
new file mode 100644
index 0000000..c908dcd
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bb.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bd.png b/deluge/ui/data/pixmaps/flags/bd.png
new file mode 100644
index 0000000..10266cd
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bd.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/be.png b/deluge/ui/data/pixmaps/flags/be.png
new file mode 100644
index 0000000..bc09e3c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/be.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bf.png b/deluge/ui/data/pixmaps/flags/bf.png
new file mode 100644
index 0000000..452329a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bf.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bg.png b/deluge/ui/data/pixmaps/flags/bg.png
new file mode 100644
index 0000000..b60e401
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bg.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bh.png b/deluge/ui/data/pixmaps/flags/bh.png
new file mode 100644
index 0000000..1b876e2
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bh.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bi.png b/deluge/ui/data/pixmaps/flags/bi.png
new file mode 100644
index 0000000..f4d9adf
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bi.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bj.png b/deluge/ui/data/pixmaps/flags/bj.png
new file mode 100644
index 0000000..5740ccc
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bj.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bm.png b/deluge/ui/data/pixmaps/flags/bm.png
new file mode 100644
index 0000000..85411bf
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bm.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bn.png b/deluge/ui/data/pixmaps/flags/bn.png
new file mode 100644
index 0000000..a0c223f
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bn.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bo.png b/deluge/ui/data/pixmaps/flags/bo.png
new file mode 100644
index 0000000..c2ef0f4
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bo.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/br.png b/deluge/ui/data/pixmaps/flags/br.png
new file mode 100644
index 0000000..b1a884c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/br.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bs.png b/deluge/ui/data/pixmaps/flags/bs.png
new file mode 100644
index 0000000..959252d
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bs.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bt.png b/deluge/ui/data/pixmaps/flags/bt.png
new file mode 100644
index 0000000..2e19696
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bt.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bv.png b/deluge/ui/data/pixmaps/flags/bv.png
new file mode 100644
index 0000000..ae9060c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bv.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bw.png b/deluge/ui/data/pixmaps/flags/bw.png
new file mode 100644
index 0000000..2dee7fb
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bw.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/by.png b/deluge/ui/data/pixmaps/flags/by.png
new file mode 100644
index 0000000..29361d6
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/by.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/bz.png b/deluge/ui/data/pixmaps/flags/bz.png
new file mode 100644
index 0000000..88e4ea1
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/bz.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ca.png b/deluge/ui/data/pixmaps/flags/ca.png
new file mode 100644
index 0000000..155eea8
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ca.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cc.png b/deluge/ui/data/pixmaps/flags/cc.png
new file mode 100644
index 0000000..93509ae
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cc.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cd.png b/deluge/ui/data/pixmaps/flags/cd.png
new file mode 100644
index 0000000..69886e6
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cd.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cf.png b/deluge/ui/data/pixmaps/flags/cf.png
new file mode 100644
index 0000000..3951b78
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cf.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cg.png b/deluge/ui/data/pixmaps/flags/cg.png
new file mode 100644
index 0000000..6f32484
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cg.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ch.png b/deluge/ui/data/pixmaps/flags/ch.png
new file mode 100644
index 0000000..1553916
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ch.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ci.png b/deluge/ui/data/pixmaps/flags/ci.png
new file mode 100644
index 0000000..ee17406
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ci.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ck.png b/deluge/ui/data/pixmaps/flags/ck.png
new file mode 100644
index 0000000..043a12f
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ck.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cl.png b/deluge/ui/data/pixmaps/flags/cl.png
new file mode 100644
index 0000000..6c05438
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cl.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cm.png b/deluge/ui/data/pixmaps/flags/cm.png
new file mode 100644
index 0000000..e2a7c0a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cm.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cn.png b/deluge/ui/data/pixmaps/flags/cn.png
new file mode 100644
index 0000000..5a893ee
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cn.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/co.png b/deluge/ui/data/pixmaps/flags/co.png
new file mode 100644
index 0000000..24eb981
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/co.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cr.png b/deluge/ui/data/pixmaps/flags/cr.png
new file mode 100644
index 0000000..4efd967
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cr.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cs.png b/deluge/ui/data/pixmaps/flags/cs.png
new file mode 100644
index 0000000..cd58f89
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cs.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cu.png b/deluge/ui/data/pixmaps/flags/cu.png
new file mode 100644
index 0000000..addfb8e
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cu.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cv.png b/deluge/ui/data/pixmaps/flags/cv.png
new file mode 100644
index 0000000..6411a62
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cv.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cx.png b/deluge/ui/data/pixmaps/flags/cx.png
new file mode 100644
index 0000000..75c8bfa
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cx.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cy.png b/deluge/ui/data/pixmaps/flags/cy.png
new file mode 100644
index 0000000..bbacfbe
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cy.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/cz.png b/deluge/ui/data/pixmaps/flags/cz.png
new file mode 100644
index 0000000..830f6a7
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/cz.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/de.png b/deluge/ui/data/pixmaps/flags/de.png
new file mode 100644
index 0000000..933014a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/de.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/dj.png b/deluge/ui/data/pixmaps/flags/dj.png
new file mode 100644
index 0000000..883343a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/dj.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/dk.png b/deluge/ui/data/pixmaps/flags/dk.png
new file mode 100644
index 0000000..408eea2
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/dk.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/dm.png b/deluge/ui/data/pixmaps/flags/dm.png
new file mode 100644
index 0000000..e7671bc
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/dm.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/do.png b/deluge/ui/data/pixmaps/flags/do.png
new file mode 100644
index 0000000..deefc77
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/do.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/dz.png b/deluge/ui/data/pixmaps/flags/dz.png
new file mode 100644
index 0000000..65028f9
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/dz.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ec.png b/deluge/ui/data/pixmaps/flags/ec.png
new file mode 100644
index 0000000..7f93b49
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ec.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ee.png b/deluge/ui/data/pixmaps/flags/ee.png
new file mode 100644
index 0000000..aa2a0b9
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ee.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/eg.png b/deluge/ui/data/pixmaps/flags/eg.png
new file mode 100644
index 0000000..7219431
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/eg.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/eh.png b/deluge/ui/data/pixmaps/flags/eh.png
new file mode 100644
index 0000000..ae7daca
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/eh.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/er.png b/deluge/ui/data/pixmaps/flags/er.png
new file mode 100644
index 0000000..b3644d4
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/er.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/es.png b/deluge/ui/data/pixmaps/flags/es.png
new file mode 100644
index 0000000..9cc55dd
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/es.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/et.png b/deluge/ui/data/pixmaps/flags/et.png
new file mode 100644
index 0000000..f4356fa
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/et.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/fi.png b/deluge/ui/data/pixmaps/flags/fi.png
new file mode 100644
index 0000000..73f8c91
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/fi.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/fj.png b/deluge/ui/data/pixmaps/flags/fj.png
new file mode 100644
index 0000000..0544e7a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/fj.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/fk.png b/deluge/ui/data/pixmaps/flags/fk.png
new file mode 100644
index 0000000..184e890
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/fk.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/fm.png b/deluge/ui/data/pixmaps/flags/fm.png
new file mode 100644
index 0000000..601dba9
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/fm.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/fo.png b/deluge/ui/data/pixmaps/flags/fo.png
new file mode 100644
index 0000000..b922a4f
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/fo.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/fr.png b/deluge/ui/data/pixmaps/flags/fr.png
new file mode 100644
index 0000000..59346a9
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/fr.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/fx.png b/deluge/ui/data/pixmaps/flags/fx.png
new file mode 100644
index 0000000..e1bb1dd
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/fx.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ga.png b/deluge/ui/data/pixmaps/flags/ga.png
new file mode 100644
index 0000000..63cb013
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ga.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gb.png b/deluge/ui/data/pixmaps/flags/gb.png
new file mode 100644
index 0000000..95007c7
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gb.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gd.png b/deluge/ui/data/pixmaps/flags/gd.png
new file mode 100644
index 0000000..1c7de15
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gd.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ge.png b/deluge/ui/data/pixmaps/flags/ge.png
new file mode 100644
index 0000000..44685b6
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ge.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gf.png b/deluge/ui/data/pixmaps/flags/gf.png
new file mode 100644
index 0000000..59346a9
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gf.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gg.png b/deluge/ui/data/pixmaps/flags/gg.png
new file mode 100644
index 0000000..f65fbe1
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gg.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gh.png b/deluge/ui/data/pixmaps/flags/gh.png
new file mode 100644
index 0000000..bc5741c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gh.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gi.png b/deluge/ui/data/pixmaps/flags/gi.png
new file mode 100644
index 0000000..8edbe37
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gi.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gl.png b/deluge/ui/data/pixmaps/flags/gl.png
new file mode 100644
index 0000000..d8c022f
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gl.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gm.png b/deluge/ui/data/pixmaps/flags/gm.png
new file mode 100644
index 0000000..05be830
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gm.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gn.png b/deluge/ui/data/pixmaps/flags/gn.png
new file mode 100644
index 0000000..b738333
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gn.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gp.png b/deluge/ui/data/pixmaps/flags/gp.png
new file mode 100644
index 0000000..81a21d3
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gp.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gq.png b/deluge/ui/data/pixmaps/flags/gq.png
new file mode 100644
index 0000000..5d22f18
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gq.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gr.png b/deluge/ui/data/pixmaps/flags/gr.png
new file mode 100644
index 0000000..9fcb345
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gr.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gs.png b/deluge/ui/data/pixmaps/flags/gs.png
new file mode 100644
index 0000000..ab0a7c7
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gs.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gt.png b/deluge/ui/data/pixmaps/flags/gt.png
new file mode 100644
index 0000000..a05b89c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gt.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gu.png b/deluge/ui/data/pixmaps/flags/gu.png
new file mode 100644
index 0000000..83beb89
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gu.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gw.png b/deluge/ui/data/pixmaps/flags/gw.png
new file mode 100644
index 0000000..fe406b2
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gw.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/gy.png b/deluge/ui/data/pixmaps/flags/gy.png
new file mode 100644
index 0000000..fff34e3
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/gy.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/hk.png b/deluge/ui/data/pixmaps/flags/hk.png
new file mode 100644
index 0000000..6a5625a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/hk.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/hm.png b/deluge/ui/data/pixmaps/flags/hm.png
new file mode 100644
index 0000000..0de18f0
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/hm.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/hn.png b/deluge/ui/data/pixmaps/flags/hn.png
new file mode 100644
index 0000000..77a009a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/hn.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/hr.png b/deluge/ui/data/pixmaps/flags/hr.png
new file mode 100644
index 0000000..f56bc29
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/hr.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ht.png b/deluge/ui/data/pixmaps/flags/ht.png
new file mode 100644
index 0000000..16d00e8
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ht.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/hu.png b/deluge/ui/data/pixmaps/flags/hu.png
new file mode 100644
index 0000000..6f20d2b
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/hu.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/id.png b/deluge/ui/data/pixmaps/flags/id.png
new file mode 100644
index 0000000..201ad0f
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/id.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ie.png b/deluge/ui/data/pixmaps/flags/ie.png
new file mode 100644
index 0000000..238d3b3
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ie.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/il.png b/deluge/ui/data/pixmaps/flags/il.png
new file mode 100644
index 0000000..9c73906
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/il.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/in.png b/deluge/ui/data/pixmaps/flags/in.png
new file mode 100644
index 0000000..0b515d7
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/in.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/io.png b/deluge/ui/data/pixmaps/flags/io.png
new file mode 100644
index 0000000..5e4d175
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/io.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/iq.png b/deluge/ui/data/pixmaps/flags/iq.png
new file mode 100644
index 0000000..cb1ca16
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/iq.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ir.png b/deluge/ui/data/pixmaps/flags/ir.png
new file mode 100644
index 0000000..f6d1027
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ir.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/is.png b/deluge/ui/data/pixmaps/flags/is.png
new file mode 100644
index 0000000..f7383cb
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/is.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/it.png b/deluge/ui/data/pixmaps/flags/it.png
new file mode 100644
index 0000000..c3c3143
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/it.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/je.png b/deluge/ui/data/pixmaps/flags/je.png
new file mode 100644
index 0000000..0d5752d
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/je.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/jm.png b/deluge/ui/data/pixmaps/flags/jm.png
new file mode 100644
index 0000000..1f8b4be
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/jm.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/jo.png b/deluge/ui/data/pixmaps/flags/jo.png
new file mode 100644
index 0000000..8202d6c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/jo.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/jp.png b/deluge/ui/data/pixmaps/flags/jp.png
new file mode 100644
index 0000000..e470d75
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/jp.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ke.png b/deluge/ui/data/pixmaps/flags/ke.png
new file mode 100644
index 0000000..212cc2e
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ke.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/kg.png b/deluge/ui/data/pixmaps/flags/kg.png
new file mode 100644
index 0000000..848da86
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/kg.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/kh.png b/deluge/ui/data/pixmaps/flags/kh.png
new file mode 100644
index 0000000..bf961c5
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/kh.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ki.png b/deluge/ui/data/pixmaps/flags/ki.png
new file mode 100644
index 0000000..db57066
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ki.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/km.png b/deluge/ui/data/pixmaps/flags/km.png
new file mode 100644
index 0000000..7ead97e
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/km.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/kn.png b/deluge/ui/data/pixmaps/flags/kn.png
new file mode 100644
index 0000000..e408227
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/kn.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/kp.png b/deluge/ui/data/pixmaps/flags/kp.png
new file mode 100644
index 0000000..b517d1c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/kp.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/kr.png b/deluge/ui/data/pixmaps/flags/kr.png
new file mode 100644
index 0000000..ea3122e
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/kr.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/kw.png b/deluge/ui/data/pixmaps/flags/kw.png
new file mode 100644
index 0000000..a3a7fcb
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/kw.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ky.png b/deluge/ui/data/pixmaps/flags/ky.png
new file mode 100644
index 0000000..63b5546
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ky.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/kz.png b/deluge/ui/data/pixmaps/flags/kz.png
new file mode 100644
index 0000000..193cf38
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/kz.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/la.png b/deluge/ui/data/pixmaps/flags/la.png
new file mode 100644
index 0000000..85b6097
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/la.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/lb.png b/deluge/ui/data/pixmaps/flags/lb.png
new file mode 100644
index 0000000..b8e9c2f
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/lb.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/lc.png b/deluge/ui/data/pixmaps/flags/lc.png
new file mode 100644
index 0000000..d8a8656
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/lc.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/li.png b/deluge/ui/data/pixmaps/flags/li.png
new file mode 100644
index 0000000..6bb7b2b
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/li.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/lk.png b/deluge/ui/data/pixmaps/flags/lk.png
new file mode 100644
index 0000000..4f16cd7
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/lk.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/lr.png b/deluge/ui/data/pixmaps/flags/lr.png
new file mode 100644
index 0000000..d76e171
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/lr.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ls.png b/deluge/ui/data/pixmaps/flags/ls.png
new file mode 100644
index 0000000..02cdd66
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ls.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/lt.png b/deluge/ui/data/pixmaps/flags/lt.png
new file mode 100644
index 0000000..e0714c5
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/lt.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/lu.png b/deluge/ui/data/pixmaps/flags/lu.png
new file mode 100644
index 0000000..f750b0c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/lu.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/lv.png b/deluge/ui/data/pixmaps/flags/lv.png
new file mode 100644
index 0000000..f357095
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/lv.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ly.png b/deluge/ui/data/pixmaps/flags/ly.png
new file mode 100644
index 0000000..9e35e38
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ly.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ma.png b/deluge/ui/data/pixmaps/flags/ma.png
new file mode 100644
index 0000000..b8f8dec
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ma.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mc.png b/deluge/ui/data/pixmaps/flags/mc.png
new file mode 100644
index 0000000..67099ea
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mc.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/md.png b/deluge/ui/data/pixmaps/flags/md.png
new file mode 100644
index 0000000..6ff6cf5
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/md.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/me.png b/deluge/ui/data/pixmaps/flags/me.png
new file mode 100644
index 0000000..36cbdd5
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/me.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mg.png b/deluge/ui/data/pixmaps/flags/mg.png
new file mode 100644
index 0000000..d9313e2
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mg.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mh.png b/deluge/ui/data/pixmaps/flags/mh.png
new file mode 100644
index 0000000..7618cc6
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mh.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mk.png b/deluge/ui/data/pixmaps/flags/mk.png
new file mode 100644
index 0000000..1c98d51
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mk.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ml.png b/deluge/ui/data/pixmaps/flags/ml.png
new file mode 100644
index 0000000..d59cea8
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ml.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mm.png b/deluge/ui/data/pixmaps/flags/mm.png
new file mode 100644
index 0000000..175fc57
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mm.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mn.png b/deluge/ui/data/pixmaps/flags/mn.png
new file mode 100644
index 0000000..0ad97b3
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mn.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mo.png b/deluge/ui/data/pixmaps/flags/mo.png
new file mode 100644
index 0000000..f49e677
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mo.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mp.png b/deluge/ui/data/pixmaps/flags/mp.png
new file mode 100644
index 0000000..e91b75b
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mp.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mq.png b/deluge/ui/data/pixmaps/flags/mq.png
new file mode 100644
index 0000000..5c5ae82
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mq.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mr.png b/deluge/ui/data/pixmaps/flags/mr.png
new file mode 100644
index 0000000..91d9a5a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mr.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ms.png b/deluge/ui/data/pixmaps/flags/ms.png
new file mode 100644
index 0000000..d45c16c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ms.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mt.png b/deluge/ui/data/pixmaps/flags/mt.png
new file mode 100644
index 0000000..497c59f
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mt.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mu.png b/deluge/ui/data/pixmaps/flags/mu.png
new file mode 100644
index 0000000..ecdc186
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mu.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mv.png b/deluge/ui/data/pixmaps/flags/mv.png
new file mode 100644
index 0000000..b172944
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mv.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mw.png b/deluge/ui/data/pixmaps/flags/mw.png
new file mode 100644
index 0000000..cb9b61f
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mw.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mx.png b/deluge/ui/data/pixmaps/flags/mx.png
new file mode 100644
index 0000000..b8e70b8
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mx.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/my.png b/deluge/ui/data/pixmaps/flags/my.png
new file mode 100644
index 0000000..879cf51
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/my.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/mz.png b/deluge/ui/data/pixmaps/flags/mz.png
new file mode 100644
index 0000000..3554592
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/mz.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/na.png b/deluge/ui/data/pixmaps/flags/na.png
new file mode 100644
index 0000000..426cde9
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/na.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/nc.png b/deluge/ui/data/pixmaps/flags/nc.png
new file mode 100644
index 0000000..88c35ac
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/nc.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ne.png b/deluge/ui/data/pixmaps/flags/ne.png
new file mode 100644
index 0000000..eff1c35
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ne.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/nf.png b/deluge/ui/data/pixmaps/flags/nf.png
new file mode 100644
index 0000000..5ddabca
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/nf.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ng.png b/deluge/ui/data/pixmaps/flags/ng.png
new file mode 100644
index 0000000..e2f2b61
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ng.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ni.png b/deluge/ui/data/pixmaps/flags/ni.png
new file mode 100644
index 0000000..9332b95
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ni.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/nl.png b/deluge/ui/data/pixmaps/flags/nl.png
new file mode 100644
index 0000000..267d1dc
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/nl.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/no.png b/deluge/ui/data/pixmaps/flags/no.png
new file mode 100644
index 0000000..ae9060c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/no.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/np.png b/deluge/ui/data/pixmaps/flags/np.png
new file mode 100644
index 0000000..6637ea5
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/np.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/nr.png b/deluge/ui/data/pixmaps/flags/nr.png
new file mode 100644
index 0000000..60f7346
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/nr.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/nu.png b/deluge/ui/data/pixmaps/flags/nu.png
new file mode 100644
index 0000000..21e52a7
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/nu.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/nz.png b/deluge/ui/data/pixmaps/flags/nz.png
new file mode 100644
index 0000000..d5a7ebc
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/nz.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/om.png b/deluge/ui/data/pixmaps/flags/om.png
new file mode 100644
index 0000000..6dc30d4
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/om.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/pa.png b/deluge/ui/data/pixmaps/flags/pa.png
new file mode 100644
index 0000000..8954436
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/pa.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/pe.png b/deluge/ui/data/pixmaps/flags/pe.png
new file mode 100644
index 0000000..9fc0740
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/pe.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/pf.png b/deluge/ui/data/pixmaps/flags/pf.png
new file mode 100644
index 0000000..ea4d046
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/pf.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/pg.png b/deluge/ui/data/pixmaps/flags/pg.png
new file mode 100644
index 0000000..c97ce6a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/pg.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ph.png b/deluge/ui/data/pixmaps/flags/ph.png
new file mode 100644
index 0000000..67d2891
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ph.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/pk.png b/deluge/ui/data/pixmaps/flags/pk.png
new file mode 100644
index 0000000..a92d71c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/pk.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/pl.png b/deluge/ui/data/pixmaps/flags/pl.png
new file mode 100644
index 0000000..2c4f2ed
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/pl.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/pm.png b/deluge/ui/data/pixmaps/flags/pm.png
new file mode 100644
index 0000000..ce429f0
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/pm.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/pn.png b/deluge/ui/data/pixmaps/flags/pn.png
new file mode 100644
index 0000000..8577faf
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/pn.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/pr.png b/deluge/ui/data/pixmaps/flags/pr.png
new file mode 100644
index 0000000..60d3599
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/pr.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ps.png b/deluge/ui/data/pixmaps/flags/ps.png
new file mode 100644
index 0000000..ceda7d7
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ps.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/pt.png b/deluge/ui/data/pixmaps/flags/pt.png
new file mode 100644
index 0000000..c489acd
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/pt.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/pw.png b/deluge/ui/data/pixmaps/flags/pw.png
new file mode 100644
index 0000000..668c93a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/pw.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/py.png b/deluge/ui/data/pixmaps/flags/py.png
new file mode 100644
index 0000000..d5e943b
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/py.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/qa.png b/deluge/ui/data/pixmaps/flags/qa.png
new file mode 100644
index 0000000..08a3793
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/qa.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/re.png b/deluge/ui/data/pixmaps/flags/re.png
new file mode 100644
index 0000000..59346a9
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/re.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ro.png b/deluge/ui/data/pixmaps/flags/ro.png
new file mode 100644
index 0000000..f80a44a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ro.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/rs.png b/deluge/ui/data/pixmaps/flags/rs.png
new file mode 100644
index 0000000..9a35bcc
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/rs.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ru.png b/deluge/ui/data/pixmaps/flags/ru.png
new file mode 100644
index 0000000..723f732
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ru.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/rw.png b/deluge/ui/data/pixmaps/flags/rw.png
new file mode 100644
index 0000000..0d31437
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/rw.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sa.png b/deluge/ui/data/pixmaps/flags/sa.png
new file mode 100644
index 0000000..2fc1704
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sa.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sb.png b/deluge/ui/data/pixmaps/flags/sb.png
new file mode 100644
index 0000000..65998c6
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sb.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sc.png b/deluge/ui/data/pixmaps/flags/sc.png
new file mode 100644
index 0000000..c25e113
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sc.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sd.png b/deluge/ui/data/pixmaps/flags/sd.png
new file mode 100644
index 0000000..d22408c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sd.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/se.png b/deluge/ui/data/pixmaps/flags/se.png
new file mode 100644
index 0000000..482101a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/se.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sg.png b/deluge/ui/data/pixmaps/flags/sg.png
new file mode 100644
index 0000000..055e04a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sg.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sh.png b/deluge/ui/data/pixmaps/flags/sh.png
new file mode 100644
index 0000000..838dad7
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sh.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/si.png b/deluge/ui/data/pixmaps/flags/si.png
new file mode 100644
index 0000000..206721e
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/si.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sj.png b/deluge/ui/data/pixmaps/flags/sj.png
new file mode 100644
index 0000000..ae9060c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sj.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sk.png b/deluge/ui/data/pixmaps/flags/sk.png
new file mode 100644
index 0000000..acdd189
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sk.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sl.png b/deluge/ui/data/pixmaps/flags/sl.png
new file mode 100644
index 0000000..d50e5d4
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sl.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sm.png b/deluge/ui/data/pixmaps/flags/sm.png
new file mode 100644
index 0000000..168dc78
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sm.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sn.png b/deluge/ui/data/pixmaps/flags/sn.png
new file mode 100644
index 0000000..4029d3a
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sn.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/so.png b/deluge/ui/data/pixmaps/flags/so.png
new file mode 100644
index 0000000..b17fcf2
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/so.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sr.png b/deluge/ui/data/pixmaps/flags/sr.png
new file mode 100644
index 0000000..e790291
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sr.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/st.png b/deluge/ui/data/pixmaps/flags/st.png
new file mode 100644
index 0000000..63c3e12
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/st.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sv.png b/deluge/ui/data/pixmaps/flags/sv.png
new file mode 100644
index 0000000..309eb39
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sv.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sy.png b/deluge/ui/data/pixmaps/flags/sy.png
new file mode 100644
index 0000000..8a369aa
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sy.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/sz.png b/deluge/ui/data/pixmaps/flags/sz.png
new file mode 100644
index 0000000..2da7509
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/sz.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tc.png b/deluge/ui/data/pixmaps/flags/tc.png
new file mode 100644
index 0000000..c7b7354
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tc.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/td.png b/deluge/ui/data/pixmaps/flags/td.png
new file mode 100644
index 0000000..c82f450
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/td.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tf.png b/deluge/ui/data/pixmaps/flags/tf.png
new file mode 100644
index 0000000..bf80773
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tf.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tg.png b/deluge/ui/data/pixmaps/flags/tg.png
new file mode 100644
index 0000000..fecc10c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tg.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/th.png b/deluge/ui/data/pixmaps/flags/th.png
new file mode 100644
index 0000000..bf73994
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/th.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tj.png b/deluge/ui/data/pixmaps/flags/tj.png
new file mode 100644
index 0000000..3efd165
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tj.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tk.png b/deluge/ui/data/pixmaps/flags/tk.png
new file mode 100644
index 0000000..218ca79
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tk.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tl.png b/deluge/ui/data/pixmaps/flags/tl.png
new file mode 100644
index 0000000..d7c41a9
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tl.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tm.png b/deluge/ui/data/pixmaps/flags/tm.png
new file mode 100644
index 0000000..a2aed22
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tm.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tn.png b/deluge/ui/data/pixmaps/flags/tn.png
new file mode 100644
index 0000000..61086fa
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tn.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/to.png b/deluge/ui/data/pixmaps/flags/to.png
new file mode 100644
index 0000000..8e49d30
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/to.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tp.png b/deluge/ui/data/pixmaps/flags/tp.png
new file mode 100644
index 0000000..aa298c0
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tp.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tr.png b/deluge/ui/data/pixmaps/flags/tr.png
new file mode 100644
index 0000000..09f82d0
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tr.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tt.png b/deluge/ui/data/pixmaps/flags/tt.png
new file mode 100644
index 0000000..18b09e1
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tt.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tv.png b/deluge/ui/data/pixmaps/flags/tv.png
new file mode 100644
index 0000000..ff201fd
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tv.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tw.png b/deluge/ui/data/pixmaps/flags/tw.png
new file mode 100644
index 0000000..9bf75fd
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tw.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/tz.png b/deluge/ui/data/pixmaps/flags/tz.png
new file mode 100644
index 0000000..3543543
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/tz.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ua.png b/deluge/ui/data/pixmaps/flags/ua.png
new file mode 100644
index 0000000..e09f110
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ua.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ug.png b/deluge/ui/data/pixmaps/flags/ug.png
new file mode 100644
index 0000000..d1d9bc0
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ug.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/um.png b/deluge/ui/data/pixmaps/flags/um.png
new file mode 100644
index 0000000..2694ab9
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/um.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/us.png b/deluge/ui/data/pixmaps/flags/us.png
new file mode 100644
index 0000000..68707f4
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/us.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/uy.png b/deluge/ui/data/pixmaps/flags/uy.png
new file mode 100644
index 0000000..4c51567
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/uy.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/uz.png b/deluge/ui/data/pixmaps/flags/uz.png
new file mode 100644
index 0000000..e85d67d
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/uz.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/va.png b/deluge/ui/data/pixmaps/flags/va.png
new file mode 100644
index 0000000..582e2ba
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/va.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/vc.png b/deluge/ui/data/pixmaps/flags/vc.png
new file mode 100644
index 0000000..e572611
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/vc.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ve.png b/deluge/ui/data/pixmaps/flags/ve.png
new file mode 100644
index 0000000..0899d54
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ve.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/vg.png b/deluge/ui/data/pixmaps/flags/vg.png
new file mode 100644
index 0000000..d9f04d6
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/vg.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/vi.png b/deluge/ui/data/pixmaps/flags/vi.png
new file mode 100644
index 0000000..2b887b3
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/vi.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/vn.png b/deluge/ui/data/pixmaps/flags/vn.png
new file mode 100644
index 0000000..335e9fc
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/vn.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/vu.png b/deluge/ui/data/pixmaps/flags/vu.png
new file mode 100644
index 0000000..f3fa6e6
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/vu.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/wf.png b/deluge/ui/data/pixmaps/flags/wf.png
new file mode 100644
index 0000000..1d6460e
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/wf.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ws.png b/deluge/ui/data/pixmaps/flags/ws.png
new file mode 100644
index 0000000..628f387
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ws.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/ye.png b/deluge/ui/data/pixmaps/flags/ye.png
new file mode 100644
index 0000000..b3f760b
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/ye.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/yt.png b/deluge/ui/data/pixmaps/flags/yt.png
new file mode 100644
index 0000000..d0c5a2c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/yt.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/yu.png b/deluge/ui/data/pixmaps/flags/yu.png
new file mode 100644
index 0000000..4827aec
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/yu.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/za.png b/deluge/ui/data/pixmaps/flags/za.png
new file mode 100644
index 0000000..53ba7e1
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/za.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/zm.png b/deluge/ui/data/pixmaps/flags/zm.png
new file mode 100644
index 0000000..2911ca7
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/zm.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/flags/zw.png b/deluge/ui/data/pixmaps/flags/zw.png
new file mode 100644
index 0000000..9c06501
--- /dev/null
+++ b/deluge/ui/data/pixmaps/flags/zw.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/inactive.svg b/deluge/ui/data/pixmaps/inactive.svg
new file mode 100644
index 0000000..644f5f3
--- /dev/null
+++ b/deluge/ui/data/pixmaps/inactive.svg
@@ -0,0 +1,492 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3440"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="deluge_paused.svg"
+ inkscape:export-xdpi="960"
+ inkscape:export-ydpi="960"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="TRUE"
+ version="1.1"
+ inkscape:export-filename="/home/calum/projects/deluge-logo/deluge.512.x.png">
+ <defs
+ id="defs3">
+ <color-profile
+ name="sRGB"
+ xlink:href="/usr/share/color/icc/sRGB.icc"
+ id="color-profile4484" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2973">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2975" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2977" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4126">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop4128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.16494845;"
+ offset="1.0000000"
+ id="stop4130" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4114">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4116" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4118" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3962">
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop3964" />
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.15517241"
+ id="stop4134" />
+ <stop
+ style="stop-color:#4074ae;stop-opacity:1.0000000;"
+ offset="0.75000000"
+ id="stop4346" />
+ <stop
+ style="stop-color:#36486c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop3966" />
+ </linearGradient>
+ <radialGradient
+ r="13.994944"
+ fy="33.506763"
+ fx="-10.089286"
+ cy="33.506763"
+ cx="-10.089286"
+ gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4019"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4004"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ id="radialGradient3999"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
+ r="13.994946"
+ fy="24.241488"
+ fx="61.662098"
+ cy="24.241488"
+ cx="61.662098"
+ id="radialGradient3943"
+ xlink:href="#linearGradient1312"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient1312">
+ <stop
+ id="stop1314"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1316"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3993">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3995" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop3997" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2973"
+ id="radialGradient3866"
+ cx="-22.375"
+ cy="18.499998"
+ fx="-22.375"
+ fy="18.499998"
+ r="14.33462"
+ gradientTransform="matrix(1,0,0,1.140022,40.17678,1.347091)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ r="12.289036"
+ fy="63.965388"
+ fx="15.115514"
+ cy="63.965388"
+ cx="15.115514"
+ gradientTransform="scale(1.643990,0.608276)"
+ id="radialGradient5000"
+ xlink:href="#linearGradient4114"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4989">
+ <stop
+ id="stop4991"
+ offset="0"
+ style="stop-color:#47abff;stop-opacity:1" />
+ <stop
+ id="stop4993"
+ offset="0.35955963"
+ style="stop-color:#53a6ff;stop-opacity:1" />
+ <stop
+ id="stop4995"
+ offset="0.79518169"
+ style="stop-color:#286cbb;stop-opacity:1" />
+ <stop
+ id="stop4997"
+ offset="1"
+ style="stop-color:#003d87;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4977">
+ <stop
+ id="stop4979"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop4981"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <filter
+ id="filter6406"
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000000000000002"
+ x="-0.050000000000000017">
+ <feFlood
+ id="feFlood6408"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1"
+ k1="8.1400000000000006"
+ k2="4.9299999999999997"
+ k3="5.5899999999999999"
+ k4="-7.2400000000000002" />
+ <feGaussianBlur
+ id="feGaussianBlur6412"
+ stdDeviation="0.20000000000000001"
+ result="blur"
+ in="composite" />
+ <feOffset
+ id="feOffset6414"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2"
+ operator="" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter4258">
+ <feFlood
+ flood-opacity="0.80200501253132828"
+ flood-color="rgb(197,204,222)"
+ result="flood"
+ id="feFlood4260" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="in"
+ result="composite1"
+ id="feComposite4262"
+ flood-opacity="0.80000000000000004" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4264" />
+ <feOffset
+ dx="-0"
+ dy="-0.5"
+ result="offset"
+ id="feOffset4266" />
+ <feComposite
+ in="SourceGraphic"
+ in2="offset"
+ operator="over"
+ result="composite2"
+ id="feComposite4268" />
+ </filter>
+ <filter
+ id="filter4290"
+ inkscape:label="Drop Shadow"
+ style="color-interpolation-filters:sRGB;">
+ <feFlood
+ id="feFlood4292"
+ result="flood"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="0.59999999999999998" />
+ <feComposite
+ id="feComposite4294"
+ result="composite1"
+ operator="in"
+ in2="SourceGraphic"
+ in="flood" />
+ <feGaussianBlur
+ id="feGaussianBlur4296"
+ result="blur"
+ stdDeviation="6.7999999999999998"
+ in="composite1" />
+ <feOffset
+ id="feOffset4298"
+ result="offset"
+ dy="1.9000000000000004"
+ dx="0.69999999999999996"
+ flood-opacity="0.68000000000000005" />
+ <feComposite
+ id="feComposite4300"
+ result="composite2"
+ in2="offset"
+ in="SourceGraphic"
+ operator="" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.17254902"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="44.452879"
+ inkscape:cy="23.209575"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1861"
+ inkscape:window-height="1176"
+ inkscape:window-x="59"
+ inkscape:window-y="24"
+ inkscape:showpageshadow="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="1"
+ width="512px"
+ units="px"
+ inkscape:snap-global="false"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-others="true">
+ <sodipodi:guide
+ orientation="0,1"
+ position="4.331,47"
+ id="guide3056"
+ inkscape:label=""
+ inkscape:color="rgb(99,99,125)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="23.9375,24.5625"
+ id="guide3058"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="40,25.375"
+ id="guide5866" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="38.448931,29.742679"
+ id="guide5868" />
+ <sodipodi:guide
+ position="3.8890873,1"
+ orientation="0,1"
+ id="guide4521"
+ inkscape:label=""
+ inkscape:color="rgb(106,106,146)" />
+ <sodipodi:guide
+ position="1,17.324"
+ orientation="1,0"
+ id="guide4523"
+ inkscape:label=""
+ inkscape:color="rgb(152,152,181)" />
+ <sodipodi:guide
+ position="47,33.852737"
+ orientation="1,0"
+ id="guide4525"
+ inkscape:label=""
+ inkscape:color="rgb(121,121,172)" />
+ <sodipodi:guide
+ position="13.433908,46"
+ orientation="0,1"
+ id="guide4527"
+ inkscape:label=""
+ inkscape:color="rgb(255,40,0)" />
+ <sodipodi:guide
+ position="8,36.135"
+ orientation="1,0"
+ id="guide4529"
+ inkscape:label=""
+ inkscape:color="rgb(255,11,0)" />
+ <sodipodi:guide
+ position="40,26.436782"
+ orientation="1,0"
+ id="guide4531"
+ inkscape:label=""
+ inkscape:color="rgb(255,6,0)" />
+ <sodipodi:guide
+ position="34.052,2"
+ orientation="0,1"
+ id="guide4533"
+ inkscape:label=""
+ inkscape:color="rgb(255,0,5)" />
+ <sodipodi:guide
+ position="36.879276,26"
+ orientation="0,1"
+ id="guide4542"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ position="43.660795,14.731391"
+ orientation="0,1"
+ id="guide4546" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Tuomas Kuosmanen</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>internet</rdf:li>
+ <rdf:li>tools</rdf:li>
+ <rdf:li>applications</rdf:li>
+ <rdf:li>category</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="base droplet"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <path
+ style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:3.27999091;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter6406)"
+ d="M 23.295622,2.4822833 35.490217,21.297229 C 43.30243,33.350632 35.08691,46.383433 23.287956,46.383433 11.489002,46.383433 3.2602089,33.346045 11.079504,21.30073 Z"
+ id="path2069"
+ sodipodi:nodetypes="cszsc"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.90726715,0,0,0.89972834,2.9383017,2.518482)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="paused icon">
+ <rect
+ style="display:inline;opacity:1;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4364"
+ width="5.5"
+ height="16"
+ x="25.3125"
+ y="22" />
+ <rect
+ style="display:inline;opacity:1;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4364-1"
+ width="5.5"
+ height="16"
+ x="17.125"
+ y="22" />
+ </g>
+</svg>
diff --git a/deluge/ui/data/pixmaps/inactive16.png b/deluge/ui/data/pixmaps/inactive16.png
new file mode 100644
index 0000000..9f38e77
--- /dev/null
+++ b/deluge/ui/data/pixmaps/inactive16.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/loading.gif b/deluge/ui/data/pixmaps/loading.gif
new file mode 100644
index 0000000..09d621e
--- /dev/null
+++ b/deluge/ui/data/pixmaps/loading.gif
Binary files differ
diff --git a/deluge/ui/data/pixmaps/magnet.png b/deluge/ui/data/pixmaps/magnet.png
new file mode 100644
index 0000000..a192cd8
--- /dev/null
+++ b/deluge/ui/data/pixmaps/magnet.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/queued.svg b/deluge/ui/data/pixmaps/queued.svg
new file mode 100644
index 0000000..a3c2d1c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/queued.svg
@@ -0,0 +1,532 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3440"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="queued.svg"
+ inkscape:export-xdpi="960"
+ inkscape:export-ydpi="960"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="TRUE"
+ version="1.1"
+ inkscape:export-filename="/home/calum/projects/deluge-logo/deluge.512.x.png">
+ <defs
+ id="defs3">
+ <color-profile
+ name="sRGB"
+ xlink:href="/usr/share/color/icc/sRGB.icc"
+ id="color-profile4484" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2973">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2975" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2977" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4126">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop4128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.16494845;"
+ offset="1.0000000"
+ id="stop4130" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4114">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4116" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4118" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3962">
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop3964" />
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.15517241"
+ id="stop4134" />
+ <stop
+ style="stop-color:#4074ae;stop-opacity:1.0000000;"
+ offset="0.75000000"
+ id="stop4346" />
+ <stop
+ style="stop-color:#36486c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop3966" />
+ </linearGradient>
+ <radialGradient
+ r="13.994944"
+ fy="33.506763"
+ fx="-10.089286"
+ cy="33.506763"
+ cx="-10.089286"
+ gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4019"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4004"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ id="radialGradient3999"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
+ r="13.994946"
+ fy="24.241488"
+ fx="61.662098"
+ cy="24.241488"
+ cx="61.662098"
+ id="radialGradient3943"
+ xlink:href="#linearGradient1312"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient1312">
+ <stop
+ id="stop1314"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1316"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3993">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3995" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop3997" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2973"
+ id="radialGradient3866"
+ cx="-22.375"
+ cy="18.499998"
+ fx="-22.375"
+ fy="18.499998"
+ r="14.33462"
+ gradientTransform="matrix(1,0,0,1.140022,40.17678,1.347091)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ r="12.289036"
+ fy="63.965388"
+ fx="15.115514"
+ cy="63.965388"
+ cx="15.115514"
+ gradientTransform="scale(1.643990,0.608276)"
+ id="radialGradient5000"
+ xlink:href="#linearGradient4114"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4989">
+ <stop
+ id="stop4991"
+ offset="0"
+ style="stop-color:#47abff;stop-opacity:1" />
+ <stop
+ id="stop4993"
+ offset="0.35955963"
+ style="stop-color:#53a6ff;stop-opacity:1" />
+ <stop
+ id="stop4995"
+ offset="0.79518169"
+ style="stop-color:#286cbb;stop-opacity:1" />
+ <stop
+ id="stop4997"
+ offset="1"
+ style="stop-color:#003d87;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4977">
+ <stop
+ id="stop4979"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop4981"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <filter
+ id="filter6406"
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000000000000002"
+ x="-0.050000000000000017">
+ <feFlood
+ id="feFlood6408"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1"
+ k1="8.1400000000000006"
+ k2="4.9299999999999997"
+ k3="5.5899999999999999"
+ k4="-7.2400000000000002" />
+ <feGaussianBlur
+ id="feGaussianBlur6412"
+ stdDeviation="0.20000000000000001"
+ result="blur"
+ in="composite" />
+ <feOffset
+ id="feOffset6414"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2"
+ operator="" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter4258">
+ <feFlood
+ flood-opacity="0.80200501253132828"
+ flood-color="rgb(197,204,222)"
+ result="flood"
+ id="feFlood4260" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="in"
+ result="composite1"
+ id="feComposite4262"
+ flood-opacity="0.80000000000000004" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4264" />
+ <feOffset
+ dx="-0"
+ dy="-0.5"
+ result="offset"
+ id="feOffset4266" />
+ <feComposite
+ in="SourceGraphic"
+ in2="offset"
+ operator="over"
+ result="composite2"
+ id="feComposite4268" />
+ </filter>
+ <filter
+ id="filter4290"
+ inkscape:label="Drop Shadow"
+ style="color-interpolation-filters:sRGB;">
+ <feFlood
+ id="feFlood4292"
+ result="flood"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="0.59999999999999998" />
+ <feComposite
+ id="feComposite4294"
+ result="composite1"
+ operator="in"
+ in2="SourceGraphic"
+ in="flood" />
+ <feGaussianBlur
+ id="feGaussianBlur4296"
+ result="blur"
+ stdDeviation="6.7999999999999998"
+ in="composite1" />
+ <feOffset
+ id="feOffset4298"
+ result="offset"
+ dy="1.9000000000000004"
+ dx="0.69999999999999996"
+ flood-opacity="0.68000000000000005" />
+ <feComposite
+ id="feComposite4300"
+ result="composite2"
+ in2="offset"
+ in="SourceGraphic"
+ operator="" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.17254902"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="26.569169"
+ inkscape:cy="27.737594"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1861"
+ inkscape:window-height="1176"
+ inkscape:window-x="59"
+ inkscape:window-y="24"
+ inkscape:showpageshadow="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="1"
+ width="512px"
+ units="px"
+ inkscape:snap-global="false"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-others="true">
+ <sodipodi:guide
+ orientation="0,1"
+ position="4.331,47"
+ id="guide3056"
+ inkscape:label=""
+ inkscape:color="rgb(99,99,125)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="23.9375,24.5625"
+ id="guide3058"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="40,25.375"
+ id="guide5866" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="38.448931,29.742679"
+ id="guide5868" />
+ <sodipodi:guide
+ position="3.8890873,1"
+ orientation="0,1"
+ id="guide4521"
+ inkscape:label=""
+ inkscape:color="rgb(106,106,146)" />
+ <sodipodi:guide
+ position="1,17.324"
+ orientation="1,0"
+ id="guide4523"
+ inkscape:label=""
+ inkscape:color="rgb(152,152,181)" />
+ <sodipodi:guide
+ position="47,33.852737"
+ orientation="1,0"
+ id="guide4525"
+ inkscape:label=""
+ inkscape:color="rgb(121,121,172)" />
+ <sodipodi:guide
+ position="13.433908,46"
+ orientation="0,1"
+ id="guide4527"
+ inkscape:label=""
+ inkscape:color="rgb(255,40,0)" />
+ <sodipodi:guide
+ position="8,36.135"
+ orientation="1,0"
+ id="guide4529"
+ inkscape:label=""
+ inkscape:color="rgb(255,11,0)" />
+ <sodipodi:guide
+ position="40,26.436782"
+ orientation="1,0"
+ id="guide4531"
+ inkscape:label=""
+ inkscape:color="rgb(255,6,0)" />
+ <sodipodi:guide
+ position="34.052,2"
+ orientation="0,1"
+ id="guide4533"
+ inkscape:label=""
+ inkscape:color="rgb(255,0,5)" />
+ <sodipodi:guide
+ position="36.879276,26"
+ orientation="0,1"
+ id="guide4542"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ position="43.660795,14.731391"
+ orientation="0,1"
+ id="guide4546" />
+ <inkscape:grid
+ type="xygrid"
+ id="grid4206" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Tuomas Kuosmanen</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>internet</rdf:li>
+ <rdf:li>tools</rdf:li>
+ <rdf:li>applications</rdf:li>
+ <rdf:li>category</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="base droplet"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <path
+ style="fill:#dcdc00;fill-opacity:1;fill-rule:evenodd;stroke:#b4b400;stroke-width:3.27999091;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;"
+ d="M 23.295622,2.4822833 35.490217,21.297229 C 43.30243,33.350632 35.08691,46.383433 23.287956,46.383433 11.489002,46.383433 3.2602089,33.346045 11.079504,21.30073 Z"
+ id="path2069"
+ sodipodi:nodetypes="cszsc"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.90726715,0,0,0.89972834,2.9383017,2.518482)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="queue icon"
+ style="display:inline">
+ <rect
+ style="display:inline;opacity:1;fill:#6a6a00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.03118205;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4221-3-6"
+ width="16"
+ height="4"
+ x="16"
+ y="30.238995" />
+ <rect
+ style="display:inline;opacity:1;fill:#6a6a00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.03118205;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4221-3-9"
+ width="16"
+ height="4"
+ x="16"
+ y="23.873394" />
+ <path
+ sodipodi:type="star"
+ style="display:inline;opacity:1;fill:#6a6a00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.97536206;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4266-5"
+ sodipodi:sides="3"
+ sodipodi:cx="23.909048"
+ sodipodi:cy="17.006021"
+ sodipodi:r1="0.024637857"
+ sodipodi:r2="0.012318929"
+ sodipodi:arg1="3.1415927"
+ sodipodi:arg2="4.1887903"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 23.88441,17.006021 0.01848,-0.01067 0.01848,-0.01067 0,0.02134 0,0.02134 -0.01848,-0.01067 z"
+ transform="matrix(0,121.76383,-210.90115,0,3610.5895,-2890.8119)"
+ inkscape:transform-center-y="-0.7497936"
+ inkscape:transform-center-x="2.0998475e-05" />
+ <path
+ sodipodi:type="star"
+ style="display:inline;opacity:1;fill:#6a6a00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.97536206;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4266-5-3"
+ sodipodi:sides="3"
+ sodipodi:cx="23.909048"
+ sodipodi:cy="17.006021"
+ sodipodi:r1="0.024637857"
+ sodipodi:r2="0.012318929"
+ sodipodi:arg1="3.1415927"
+ sodipodi:arg2="4.1887903"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 23.88441,17.006021 0.01848,-0.01067 0.01848,-0.01067 0,0.02134 0,0.02134 -0.01848,-0.01067 z"
+ transform="matrix(0,-121.76383,210.90115,0,-3562.5895,2948.8304)"
+ inkscape:transform-center-y="0.74972138"
+ inkscape:transform-center-x="-0.00022730407" />
+ </g>
+</svg>
diff --git a/deluge/ui/data/pixmaps/queued16.png b/deluge/ui/data/pixmaps/queued16.png
new file mode 100644
index 0000000..f9f7454
--- /dev/null
+++ b/deluge/ui/data/pixmaps/queued16.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/seeding.svg b/deluge/ui/data/pixmaps/seeding.svg
new file mode 100644
index 0000000..e98b4a0
--- /dev/null
+++ b/deluge/ui/data/pixmaps/seeding.svg
@@ -0,0 +1,509 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3440"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="seeding.svg"
+ inkscape:export-xdpi="960"
+ inkscape:export-ydpi="960"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="TRUE"
+ version="1.1"
+ inkscape:export-filename="/home/calum/projects/deluge-logo/deluge.512.x.png">
+ <defs
+ id="defs3">
+ <color-profile
+ name="sRGB"
+ xlink:href="/usr/share/color/icc/sRGB.icc"
+ id="color-profile4484" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2973">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2975" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2977" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4126">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop4128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.16494845;"
+ offset="1.0000000"
+ id="stop4130" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4114">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4116" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4118" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3962">
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop3964" />
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.15517241"
+ id="stop4134" />
+ <stop
+ style="stop-color:#4074ae;stop-opacity:1.0000000;"
+ offset="0.75000000"
+ id="stop4346" />
+ <stop
+ style="stop-color:#36486c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop3966" />
+ </linearGradient>
+ <radialGradient
+ r="13.994944"
+ fy="33.506763"
+ fx="-10.089286"
+ cy="33.506763"
+ cx="-10.089286"
+ gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4019"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4004"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
+ r="14.057444"
+ fy="31.329016"
+ fx="-10.323107"
+ cy="31.329016"
+ cx="-10.323107"
+ id="radialGradient3999"
+ xlink:href="#linearGradient3993"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
+ r="13.994946"
+ fy="24.241488"
+ fx="61.662098"
+ cy="24.241488"
+ cx="61.662098"
+ id="radialGradient3943"
+ xlink:href="#linearGradient1312"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient1312">
+ <stop
+ id="stop1314"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1316"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3993">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3995" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop3997" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2973"
+ id="radialGradient3866"
+ cx="-22.375"
+ cy="18.499998"
+ fx="-22.375"
+ fy="18.499998"
+ r="14.33462"
+ gradientTransform="matrix(1,0,0,1.140022,40.17678,1.347091)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ r="12.289036"
+ fy="63.965388"
+ fx="15.115514"
+ cy="63.965388"
+ cx="15.115514"
+ gradientTransform="scale(1.643990,0.608276)"
+ id="radialGradient5000"
+ xlink:href="#linearGradient4114"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4989">
+ <stop
+ id="stop4991"
+ offset="0"
+ style="stop-color:#47abff;stop-opacity:1" />
+ <stop
+ id="stop4993"
+ offset="0.35955963"
+ style="stop-color:#53a6ff;stop-opacity:1" />
+ <stop
+ id="stop4995"
+ offset="0.79518169"
+ style="stop-color:#286cbb;stop-opacity:1" />
+ <stop
+ id="stop4997"
+ offset="1"
+ style="stop-color:#003d87;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4977">
+ <stop
+ id="stop4979"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop4981"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <filter
+ id="filter6406"
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ height="1.2"
+ width="1.2"
+ y="-0.15000000000000002"
+ x="-0.050000000000000017">
+ <feFlood
+ id="feFlood6408"
+ flood-opacity="0.50171821305841924"
+ flood-color="rgb(50,51,108)"
+ result="flood"
+ stdDeviation="0.01" />
+ <feComposite
+ id="feComposite6410"
+ in2="SourceGraphic"
+ in="flood"
+ operator="in"
+ result="composite1"
+ k1="8.1400000000000006"
+ k2="4.9299999999999997"
+ k3="5.5899999999999999"
+ k4="-7.2400000000000002" />
+ <feGaussianBlur
+ id="feGaussianBlur6412"
+ stdDeviation="0.20000000000000001"
+ result="blur"
+ in="composite" />
+ <feOffset
+ id="feOffset6414"
+ dx="0.29999999999999999"
+ dy="0.29999999999999999"
+ result="offset"
+ flood-opacity="0.5" />
+ <feComposite
+ id="feComposite6416"
+ in2="offset"
+ in="SourceGraphic"
+ result="composite2"
+ operator="" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter4258">
+ <feFlood
+ flood-opacity="0.80200501253132828"
+ flood-color="rgb(197,204,222)"
+ result="flood"
+ id="feFlood4260" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="in"
+ result="composite1"
+ id="feComposite4262"
+ flood-opacity="0.80000000000000004" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4264" />
+ <feOffset
+ dx="-0"
+ dy="-0.5"
+ result="offset"
+ id="feOffset4266" />
+ <feComposite
+ in="SourceGraphic"
+ in2="offset"
+ operator="over"
+ result="composite2"
+ id="feComposite4268" />
+ </filter>
+ <filter
+ id="filter4290"
+ inkscape:label="Drop Shadow"
+ style="color-interpolation-filters:sRGB;">
+ <feFlood
+ id="feFlood4292"
+ result="flood"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="0.59999999999999998" />
+ <feComposite
+ id="feComposite4294"
+ result="composite1"
+ operator="in"
+ in2="SourceGraphic"
+ in="flood" />
+ <feGaussianBlur
+ id="feGaussianBlur4296"
+ result="blur"
+ stdDeviation="6.7999999999999998"
+ in="composite1" />
+ <feOffset
+ id="feOffset4298"
+ result="offset"
+ dy="1.9000000000000004"
+ dx="0.69999999999999996"
+ flood-opacity="0.68000000000000005" />
+ <feComposite
+ id="feComposite4300"
+ result="composite2"
+ in2="offset"
+ in="SourceGraphic"
+ operator="" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.17254902"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="33.265379"
+ inkscape:cy="23.209575"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1861"
+ inkscape:window-height="1176"
+ inkscape:window-x="59"
+ inkscape:window-y="24"
+ inkscape:showpageshadow="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="1"
+ width="512px"
+ units="px"
+ inkscape:snap-global="false"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-others="true">
+ <sodipodi:guide
+ orientation="0,1"
+ position="4.331,47"
+ id="guide3056"
+ inkscape:label=""
+ inkscape:color="rgb(99,99,125)" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="40,25.375"
+ id="guide5866" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="38.448931,29.742679"
+ id="guide5868" />
+ <sodipodi:guide
+ position="3.8890873,1"
+ orientation="0,1"
+ id="guide4521"
+ inkscape:label=""
+ inkscape:color="rgb(106,106,146)" />
+ <sodipodi:guide
+ position="1,17.324"
+ orientation="1,0"
+ id="guide4523"
+ inkscape:label=""
+ inkscape:color="rgb(152,152,181)" />
+ <sodipodi:guide
+ position="47,33.852737"
+ orientation="1,0"
+ id="guide4525"
+ inkscape:label=""
+ inkscape:color="rgb(121,121,172)" />
+ <sodipodi:guide
+ position="13.433908,46"
+ orientation="0,1"
+ id="guide4527"
+ inkscape:label=""
+ inkscape:color="rgb(255,40,0)" />
+ <sodipodi:guide
+ position="8,36.135"
+ orientation="1,0"
+ id="guide4529"
+ inkscape:label=""
+ inkscape:color="rgb(255,11,0)" />
+ <sodipodi:guide
+ position="40,26.436782"
+ orientation="1,0"
+ id="guide4531"
+ inkscape:label=""
+ inkscape:color="rgb(255,6,0)" />
+ <sodipodi:guide
+ position="34.052,2"
+ orientation="0,1"
+ id="guide4533"
+ inkscape:label=""
+ inkscape:color="rgb(255,0,5)" />
+ <sodipodi:guide
+ position="36.879276,26"
+ orientation="0,1"
+ id="guide4542"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ position="43.660795,14.731391"
+ orientation="0,1"
+ id="guide4546" />
+ <inkscape:grid
+ type="xygrid"
+ id="grid4215" />
+ <sodipodi:guide
+ position="24,45"
+ orientation="1,0"
+ id="guide4225" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Tuomas Kuosmanen</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>internet</rdf:li>
+ <rdf:li>tools</rdf:li>
+ <rdf:li>applications</rdf:li>
+ <rdf:li>category</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="base droplet"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <path
+ style="fill:#6699ff;fill-opacity:1;fill-rule:evenodd;stroke:#3366cc;stroke-width:3.27999091;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;"
+ d="M 23.295622,2.4822833 35.490217,21.297229 C 43.30243,33.350632 35.08691,46.383433 23.287956,46.383433 11.489002,46.383433 3.2602089,33.346045 11.079504,21.30073 Z"
+ id="path2069"
+ sodipodi:nodetypes="cszsc"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.90726715,0,0,0.89972834,2.9383017,2.518482)" />
+ <rect
+ style="display:inline;opacity:1;fill:#0f3171;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4364-1-36"
+ width="8.5"
+ height="4.5"
+ x="19.760511"
+ y="33" />
+ <path
+ sodipodi:type="star"
+ style="display:inline;opacity:1;fill:#0f3171;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path5039-7"
+ sodipodi:sides="3"
+ sodipodi:cx="23.9375"
+ sodipodi:cy="21.1875"
+ sodipodi:r1="4.6958261"
+ sodipodi:r2="2.347913"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 28.004205,23.535413 -4.066705,0 -4.066705,0 2.033353,-3.521869 2.033352,-3.52187 2.033352,3.521869 z"
+ transform="matrix(1.9671947,0,0,1.1180142,-23.156428,-1.2587488)"
+ inkscape:transform-center-y="1.3125004" />
+ <rect
+ style="display:inline;opacity:1;fill:#0f3171;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.54330707;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4364-1-3"
+ width="8.5"
+ height="4.5"
+ x="19.74159"
+ y="26.902088" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="paused icon" />
+</svg>
diff --git a/deluge/ui/data/pixmaps/seeding16.png b/deluge/ui/data/pixmaps/seeding16.png
new file mode 100644
index 0000000..fce70a8
--- /dev/null
+++ b/deluge/ui/data/pixmaps/seeding16.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/tracker_all16.png b/deluge/ui/data/pixmaps/tracker_all16.png
new file mode 100644
index 0000000..36756bb
--- /dev/null
+++ b/deluge/ui/data/pixmaps/tracker_all16.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/tracker_warning16.png b/deluge/ui/data/pixmaps/tracker_warning16.png
new file mode 100644
index 0000000..219432c
--- /dev/null
+++ b/deluge/ui/data/pixmaps/tracker_warning16.png
Binary files differ
diff --git a/deluge/ui/data/pixmaps/traffic.svg b/deluge/ui/data/pixmaps/traffic.svg
new file mode 100644
index 0000000..bea6164
--- /dev/null
+++ b/deluge/ui/data/pixmaps/traffic.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="128"
+ height="128"
+ id="svg2517"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="traffic.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/andrew/Projects/deluge/trunk/deluge/data/pixmaps/traffic16.png"
+ inkscape:export-xdpi="2.459017"
+ inkscape:export-ydpi="2.459017"
+ version="1.1">
+ <defs
+ id="defs2519">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective2525" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6"
+ inkscape:cx="56.051291"
+ inkscape:cy="66.506813"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1861"
+ inkscape:window-height="1176"
+ inkscape:window-x="59"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="1"
+ dotted="false" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2522">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-924.36218)">
+ <path
+ style="opacity:1;fill:#4c90e8;fill-opacity:1;stroke:#000000;stroke-width:4.088;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 79.742286,929.51964 c -14.206752,13.93715 -28.471266,27.83834 -42.678018,41.77545 7.643855,0.014 15.306814,-0.0139 22.950711,0 0,16.50389 0,33.00771 0,49.51151 13.581299,0 27.16264,0 40.743951,0 0,-16.4609 0,-32.92164 0,-49.38258 7.04267,0.0129 14.10294,-0.0129 21.14561,0 -14.04989,-13.98881 -28.112421,-27.91554 -42.162254,-41.90438 z"
+ id="rect2634"
+ inkscape:export-filename="/home/andrew/Projects/deluge/trunk/deluge/data/pixmaps/traffic32.png"
+ inkscape:export-xdpi="4.9180341"
+ inkscape:export-ydpi="4.9180341"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:#16c816;fill-opacity:1;stroke:#000000;stroke-width:4.088;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 48.980975,1047.5605 c -14.206752,-13.9372 -28.471263,-27.8383 -42.6780126,-41.7755 7.6438566,-0.014 15.3068146,0.014 22.9507156,0 0,-16.5037 0,-33.00759 0,-49.51147 13.581288,0 27.162629,0 40.74397,0 0,16.46089 0,32.92179 0,49.38257 7.042653,-0.014 14.102929,0.013 21.145603,0 -14.049885,13.9888 -28.112433,27.9156 -42.162276,41.9044 z"
+ id="path2528"
+ inkscape:export-filename="/home/andrew/Projects/deluge/trunk/deluge/data/pixmaps/traffic32.png"
+ inkscape:export-xdpi="4.9180341"
+ inkscape:export-ydpi="4.9180341"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/deluge/ui/data/pixmaps/traffic16.png b/deluge/ui/data/pixmaps/traffic16.png
new file mode 100644
index 0000000..ecd8720
--- /dev/null
+++ b/deluge/ui/data/pixmaps/traffic16.png
Binary files differ
diff --git a/deluge/ui/data/share/appdata/deluge.appdata.xml.in b/deluge/ui/data/share/appdata/deluge.appdata.xml.in
new file mode 100644
index 0000000..dcbf063
--- /dev/null
+++ b/deluge/ui/data/share/appdata/deluge.appdata.xml.in
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component type="desktop">
+ <id>deluge.desktop</id>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-3.0+</project_license>
+ <translation type="gettext">deluge</translation>
+ <_developer_name>Deluge Team</_developer_name>
+ <_summary>
+ Deluge is a lightweight, Free Software, cross-platform BitTorrent client.
+ </_summary>
+ <url type="homepage">https://www.deluge-torrent.org/</url>
+ <url type="bugtracker">https://dev.deluge-torrent.org</url>
+ <description>
+ <_p>Deluge contains the common features to BitTorrent clients such as
+ Protocol Encryption, DHT, Local Peer Discovery (LSD), Peer Exchange (PEX),
+ UPnP, NAT-PMP, Proxy support, Web seeds, global and per-torrent speed
+ limits. As Deluge heavily utilises the libtorrent library it has a
+ comprehensive list of the features provided.</_p>
+ <_p>Deluge has been designed to run as both a normal standalone desktop
+ application and as a client-server. In Thinclient mode a Deluge daemon
+ handles all the BitTorrent activity and is able to run on headless machines
+ with the user-interfaces connecting remotely from any other platform.</_p>
+ </description>
+ <screenshots>
+ <screenshot type="default">
+ <image>https://upload.wikimedia.org/wikipedia/commons/5/50/Deluge-torrent.png</image>
+ </screenshot>
+ </screenshots>
+ <launchable type="desktop-id">deluge.desktop</launchable>
+</component>
diff --git a/deluge/ui/data/share/applications/deluge.desktop.in b/deluge/ui/data/share/applications/deluge.desktop.in
new file mode 100644
index 0000000..c952d42
--- /dev/null
+++ b/deluge/ui/data/share/applications/deluge.desktop.in
@@ -0,0 +1,16 @@
+[Desktop Entry]
+Version=1.0
+_Name=Deluge
+_GenericName=BitTorrent Client
+_X-GNOME-FullName=Deluge BitTorrent Client
+_Comment=Download and share files over BitTorrent
+TryExec=deluge-gtk
+Exec=deluge-gtk %U
+Icon=deluge
+Terminal=false
+Type=Application
+Categories=Network;FileTransfer;P2P;GTK;
+StartupWMClass=deluge
+StartupNotify=true
+MimeType=application/x-bittorrent;x-scheme-handler/magnet;
+X-GNOME-UsesNotifications=true
diff --git a/deluge/ui/gtk3/__init__.py b/deluge/ui/gtk3/__init__.py
new file mode 100644
index 0000000..3b9d2b1
--- /dev/null
+++ b/deluge/ui/gtk3/__init__.py
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from deluge.ui.ui import UI
+
+log = logging.getLogger(__name__)
+
+
+# Keep this class in __init__.py to avoid the console having to import everything in gtkui.py
+class Gtk(UI):
+
+ cmd_description = """GTK-based graphical user interface"""
+
+ def __init__(self, *args, **kwargs):
+ super(Gtk, self).__init__(
+ 'gtk', *args, description='Starts the Deluge GTK+ interface', **kwargs
+ )
+
+ group = self.parser.add_argument_group(_('GTK Options'))
+ group.add_argument(
+ 'torrents',
+ metavar='<torrent>',
+ nargs='*',
+ default=None,
+ help=_(
+ 'Add one or more torrent files, torrent URLs or magnet URIs'
+ ' to a currently running Deluge GTK instance'
+ ),
+ )
+
+ def start(self):
+ super(Gtk, self).start()
+ from .gtkui import GtkUI
+ import deluge.common
+
+ def run(options):
+ try:
+ gtkui = GtkUI(options)
+ gtkui.start()
+ except Exception as ex:
+ log.exception(ex)
+ raise
+
+ deluge.common.run_profiled(
+ run,
+ self.options,
+ output_file=self.options.profile,
+ do_profile=self.options.profile,
+ )
+
+
+def start():
+ Gtk().start()
diff --git a/deluge/ui/gtk3/aboutdialog.py b/deluge/ui/gtk3/aboutdialog.py
new file mode 100644
index 0000000..9974a13
--- /dev/null
+++ b/deluge/ui/gtk3/aboutdialog.py
@@ -0,0 +1,855 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Marcos Mobley ('markybob') <markybob@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from gi.repository import Gtk
+
+import deluge.component as component
+from deluge.common import get_version, open_url_in_browser, windows_check
+from deluge.ui.client import client
+
+from .common import get_deluge_icon, get_pixbuf
+
+
+class AboutDialog(object):
+ def __init__(self):
+ self.about = Gtk.AboutDialog()
+ self.about.set_transient_for(component.get('MainWindow').window)
+ self.about.set_position(Gtk.WindowPosition.CENTER)
+ self.about.set_name(_('Deluge'))
+ self.about.set_program_name(_('Deluge'))
+ if windows_check():
+
+ def url_hook(dialog, url):
+ """Url hook for Windows OS which has no default browser."""
+ open_url_in_browser(url)
+ return True
+
+ self.about.connect('activate-link', url_hook)
+
+ version = get_version()
+
+ self.about.set_copyright(
+ _('Copyright %(year_start)s-%(year_end)s Deluge Team')
+ % {'year_start': 2007, 'year_end': 2019}
+ )
+ self.about.set_comments(
+ _('A peer-to-peer file sharing program\nutilizing the BitTorrent protocol.')
+ + '\n\n'
+ + _('Client:')
+ + ' %s\n' % version
+ )
+ self.about.set_version(version)
+ self.about.set_authors(
+ [
+ _('Current Developers:'),
+ 'Andrew Resch',
+ 'Damien Churchill',
+ 'John Garland',
+ 'Calum Lind',
+ '',
+ 'libtorrent (libtorrent.org):',
+ 'Arvid Norberg',
+ '',
+ _('Past Developers or Contributors:'),
+ 'Zach Tibbitts',
+ 'Alon Zakai',
+ 'Marcos Mobley',
+ 'Alex Dedul',
+ 'Sadrul Habib Chowdhury',
+ 'Ido Abramovich',
+ 'Martijn Voncken',
+ ]
+ )
+ self.about.set_artists(['Andrew Wedderburn', 'Andrew Resch'])
+ self.about.set_translator_credits(
+ '\n'.join(
+ [
+ 'Aaron Wang Shi',
+ 'abbigss',
+ 'ABCdatos',
+ 'Abcx',
+ 'Actam',
+ 'Adam',
+ 'adaminikisi',
+ 'adi_oporanu',
+ 'Adrian Goll',
+ 'afby',
+ 'Ahmades',
+ 'Ahmad Farghal',
+ 'Ahmad Gharbeia أحمد غربية',
+ 'akira',
+ 'Aki Sivula',
+ 'Alan Pepelko',
+ 'Alberto',
+ 'Alberto Ferrer',
+ 'alcatr4z',
+ 'AlckO',
+ 'Aleksej Korgenkov',
+ 'Alessio Treglia',
+ 'Alexander Ilyashov',
+ 'Alexander Matveev',
+ 'Alexander Saltykov',
+ 'Alexander Taubenkorb',
+ 'Alexander Telenga',
+ 'Alexander Yurtsev',
+ 'Alexandre Martani',
+ 'Alexandre Rosenfeld',
+ 'Alexandre Sapata Carbonell',
+ 'Alexey Osipov',
+ 'Alin Claudiu Radut',
+ 'allah',
+ 'AlSim',
+ 'Alvaro Carrillanca P.',
+ 'A.Matveev',
+ 'Andras Hipsag',
+ 'András Kárász',
+ 'Andrea Ratto',
+ 'Andreas Johansson',
+ 'Andreas Str',
+ 'André F. Oliveira',
+ 'AndreiF',
+ 'andrewh',
+ 'Angel Guzman Maeso',
+ 'Aníbal Deboni Neto',
+ 'animarval',
+ 'Antonio Cono',
+ 'antoniojreyes',
+ 'Anton Shestakov',
+ 'Anton Yakutovich',
+ 'antou',
+ 'Arkadiusz Kalinowski',
+ 'Artin',
+ 'artir',
+ 'Astur',
+ 'Athanasios Lefteris',
+ 'Athmane MOKRAOUI (ButterflyOfFire)',
+ 'Augusta Carla Klug',
+ 'Avoledo Marco',
+ 'axaard',
+ 'AxelRafn',
+ 'Axezium',
+ 'Ayont',
+ 'b3rx',
+ 'Bae Taegil',
+ 'Bajusz Tamás',
+ "Balaam's Miracle",
+ 'Ballestein',
+ 'Bent Ole Fosse',
+ 'berto89',
+ 'bigx',
+ 'Bjorn Inge Berg',
+ 'blackbird',
+ 'Blackeyed',
+ 'blackmx',
+ 'BlueSky',
+ 'Blutheo',
+ 'bmhm',
+ 'bob00work',
+ 'boenki',
+ 'Bogdan Bădic-Spătariu',
+ 'bonpu',
+ 'Boone',
+ 'boss01',
+ 'Branislav Jovanović',
+ 'bronze',
+ 'brownie',
+ 'Brus46',
+ 'bumper',
+ 'butely',
+ 'BXCracer',
+ 'c0nfidencal',
+ 'Can Kaya',
+ 'Carlos Alexandro Becker',
+ 'cassianoleal',
+ 'Cédric.h',
+ 'César Rubén',
+ 'chaoswizard',
+ 'Chen Tao',
+ 'chicha',
+ 'Chien Cheng Wei',
+ 'Christian Kopac',
+ 'Christian Widell',
+ 'Christoffer Brodd-Reijer',
+ 'christooss',
+ 'CityAceE',
+ 'Clopy',
+ 'Clusty',
+ 'cnu',
+ 'Commandant',
+ 'Constantinos Koniaris',
+ 'Coolmax',
+ 'cosmix',
+ 'Costin Chirvasuta',
+ 'CoVaLiDiTy',
+ 'cow_2001',
+ 'Crispin Kirchner',
+ 'crom',
+ 'Cruster',
+ 'Cybolic',
+ 'Dan Bishop',
+ 'Danek',
+ 'Dani',
+ 'Daniel Demarco',
+ 'Daniel Ferreira',
+ 'Daniel Frank',
+ 'Daniel Holm',
+ 'Daniel Høyer Iversen',
+ 'Daniel Marynicz',
+ 'Daniel Nylander',
+ 'Daniel Patriche',
+ 'Daniel Schildt',
+ 'Daniil Sorokin',
+ 'Dante Díaz',
+ 'Daria Michalska',
+ 'DarkenCZ',
+ 'Darren',
+ 'Daspah',
+ 'David Eurenius',
+ 'davidhjelm',
+ 'David Machakhelidze',
+ 'Dawid Dziurdzia',
+ 'Daya Adianto ',
+ 'dcruz',
+ 'Deady',
+ 'Dereck Wonnacott',
+ 'Devgru',
+ 'Devid Antonio Filoni' 'DevilDogTG',
+ 'di0rz`',
+ 'Dialecti Valsamou',
+ 'Diego Medeiros',
+ 'Dkzoffy',
+ 'Dmitrij D. Czarkoff',
+ 'Dmitriy Geels',
+ 'Dmitry Olyenyov',
+ 'Dominik Kozaczko',
+ 'Dominik Lübben',
+ 'doomster',
+ 'Dorota Król',
+ 'Doyen Philippe',
+ 'Dread Knight',
+ 'DreamSonic',
+ 'duan',
+ 'Duong Thanh An',
+ 'DvoglavaZver',
+ 'dwori',
+ 'dylansmrjones',
+ 'Ebuntor',
+ 'Edgar Alejandro Jarquin Flores',
+ 'Eetu',
+ 'ekerazha',
+ 'Elias Julkunen',
+ 'elparia',
+ 'Emberke',
+ 'Emiliano Goday Caneda',
+ 'EndelWar',
+ 'eng.essam',
+ 'enubuntu',
+ 'ercangun',
+ 'Erdal Ronahi',
+ 'ergin üresin',
+ 'Eric',
+ 'Éric Lassauge',
+ 'Erlend Finvåg',
+ 'Errdil',
+ 'ethan shalev',
+ 'Evgeni Spasov',
+ 'ezekielnin',
+ 'Fabian Ordelmans',
+ 'Fabio Mazanatti',
+ 'Fábio Nogueira',
+ 'FaCuZ',
+ 'Felipe Lerena',
+ 'Fernando Pereira',
+ 'fjetland',
+ 'Florian Schäfer',
+ 'FoBoS',
+ 'Folke',
+ 'Force',
+ 'fosk',
+ 'fragarray',
+ 'freddeg',
+ 'Frédéric Perrin',
+ 'Fredrik Kilegran',
+ 'FreeAtMind',
+ 'Fulvio Ciucci',
+ 'Gabor Kelemen',
+ 'Galatsanos Panagiotis',
+ 'Gaussian',
+ 'gdevitis',
+ 'Georg Brzyk',
+ 'George Dumitrescu',
+ 'Georgi Arabadjiev',
+ 'Georg Sieber',
+ 'Gerd Radecke',
+ 'Germán Heusdens',
+ 'Gianni Vialetto',
+ 'Gigih Aji Ibrahim',
+ 'Giorgio Wicklein',
+ 'Giovanni Rapagnani',
+ 'Giuseppe',
+ 'gl',
+ 'glen',
+ 'granjerox',
+ 'Green Fish',
+ 'greentea',
+ 'Greyhound',
+ 'G. U.',
+ 'Guillaume BENOIT',
+ 'Guillaume Pelletier',
+ 'Gustavo Henrique Klug',
+ 'gutocarvalho',
+ 'Guybrush88',
+ 'Hans Rødtang',
+ 'HardDisk',
+ 'Hargas Gábor',
+ 'Heitor Thury Barreiros Barbosa',
+ 'helios91940',
+ 'helix84',
+ 'Helton Rodrigues',
+ 'Hendrik Luup',
+ 'Henrique Ferreiro',
+ 'Henry Goury-Laffont',
+ 'Hezy Amiel',
+ 'hidro',
+ 'hoball',
+ 'hokten',
+ 'Holmsss',
+ 'hristo.num',
+ 'Hubert Życiński',
+ 'Hyo',
+ 'Iarwain',
+ 'ibe',
+ 'ibear',
+ 'Id2ndR',
+ 'Igor Zubarev',
+ 'IKON (Ion)',
+ 'imen',
+ 'IonuÈ› Jula',
+ 'Isabelle STEVANT',
+ 'István Nyitrai',
+ 'Ivan Petrovic',
+ 'Ivan Prignano',
+ 'IvaSerge',
+ 'jackmc',
+ 'Jacks0nxD',
+ 'Jack Shen',
+ 'Jacky Yeung',
+ 'Jacques Stadler',
+ 'Janek Thomaschewski',
+ 'Jan Kaláb',
+ 'Jan Niklas Hasse',
+ 'Jasper Groenewegen',
+ 'Javi Rodríguez',
+ 'Jayasimha (ಜಯಸಿಂಹ)',
+ 'jeannich',
+ 'Jeff Bailes',
+ 'Jesse Zilstorff',
+ 'Joan Duran',
+ 'João Santos',
+ 'Joar Bagge',
+ 'Joe Anderson',
+ 'Joel Calado',
+ 'Johan Linde',
+ 'John Garland',
+ 'Jojan',
+ 'jollyr0ger',
+ 'Jonas Bo Grimsgaard',
+ 'Jonas Granqvist',
+ 'Jonas Slivka',
+ 'Jonathan Zeppettini',
+ 'Jørgen',
+ 'Jørgen Tellnes',
+ 'josé',
+ 'José Geraldo Gouvêa',
+ 'José Iván León Islas',
+ 'José Lou C.',
+ 'Jose Sun',
+ 'Jr.',
+ 'Jukka Kauppinen',
+ 'Julián Alarcón',
+ 'julietgolf',
+ 'Jusic',
+ 'Justzupi',
+ 'Kaarel',
+ 'Kai Thomsen',
+ 'Kalman Tarnay',
+ 'Kamil Páral',
+ 'Kane_F',
+ 'kaotiks@gmail.com',
+ 'Kateikyoushii',
+ 'kaxhinaz',
+ 'Kazuhiro NISHIYAMA',
+ 'Kerberos',
+ 'Keresztes Ãkos',
+ 'kevintyk',
+ 'kiersie',
+ 'Kimbo^',
+ 'Kim Lübbe',
+ 'kitzOgen',
+ 'Kjetil Rydland',
+ 'kluon',
+ 'kmikz',
+ 'Knedlyk',
+ 'koleoptero',
+ 'Kőrösi Krisztián',
+ 'Kouta',
+ 'Krakatos',
+ 'Krešo Kunjas',
+ 'kripken',
+ 'Kristaps',
+ 'Kristian Øllegaard',
+ 'Kristoffer Egil Bonarjee',
+ 'Krzysztof Janowski',
+ 'Krzysztof Zawada',
+ 'Larry Wei Liu',
+ 'laughterwym',
+ 'Laur Mõtus',
+ 'lazka',
+ 'leandrud',
+ 'lê bình',
+ 'Le Coz Florent',
+ 'Leo',
+ 'liorda',
+ 'LKRaider',
+ 'LoLo_SaG',
+ 'Long Tran',
+ 'Lorenz',
+ 'Low Kian Seong',
+ 'Luca Andrea Rossi',
+ 'Luca Ferretti',
+ 'Lucky LIX',
+ 'Luis Gomes',
+ 'Luis Reis',
+ 'Åukasz WyszyÅ„ski',
+ 'luojie-dune',
+ 'maaark',
+ 'Maciej Chojnacki',
+ 'Maciej Meller',
+ 'Mads Peter Rommedahl',
+ 'Major Kong',
+ 'Malaki',
+ 'malde',
+ 'Malte Lenz',
+ 'Mantas KriauÄiÅ«nas',
+ 'Mara Sorella',
+ 'Marcin',
+ 'Marcin Falkiewicz',
+ 'marcobra',
+ 'Marco da Silva',
+ 'Marco de Moulin',
+ 'Marco Rodrigues',
+ 'Marcos',
+ 'Marcos Escalier',
+ 'Marcos Mobley',
+ 'Marcus Ekstrom',
+ 'Marek Dębowski',
+ 'Mário BuÄi',
+ 'Mario Munda',
+ 'Marius Andersen',
+ 'Marius Hudea',
+ 'Marius Mihai',
+ 'Mariusz Cielecki',
+ 'Mark Krapivner',
+ 'marko-markovic',
+ 'Markus Brummer',
+ 'Markus Sutter',
+ 'Martin',
+ 'Martin Dybdal',
+ 'Martin Iglesias',
+ 'Martin Lettner',
+ 'Martin Pihl',
+ 'Masoud Kalali',
+ 'mat02',
+ 'Matej UrbanÄiÄ',
+ 'Mathias-K',
+ 'Mathieu Arès',
+ 'Mathieu D. (MatToufoutu)',
+ 'Mathijs',
+ 'Matrik',
+ 'Matteo Renzulli',
+ 'Matteo Settenvini',
+ 'Matthew Gadd',
+ 'Matthias Benkard',
+ 'Matthias Mailänder',
+ 'Mattias Ohlsson',
+ 'Mauro de Carvalho',
+ 'Max Molchanov',
+ 'Me',
+ 'MercuryCC',
+ 'Mert Bozkurt',
+ 'Mert Dirik',
+ 'MFX',
+ 'mhietar',
+ 'mibtha',
+ 'Michael Budde',
+ 'Michael Kaliszka',
+ 'Michalis Makaronides',
+ 'Michał Tokarczyk',
+ 'Miguel Pires da Rosa',
+ 'Mihai Capotă',
+ 'Miika Metsälä',
+ 'Mikael Fernblad',
+ 'Mike Sierra',
+ 'mikhalek',
+ 'Milan Prvulović',
+ 'Milo Casagrande',
+ 'Mindaugas',
+ 'Miroslav Matejaš',
+ 'misel',
+ 'mithras',
+ 'Mitja Pagon',
+ 'M.Kitchen',
+ 'Mohamed Magdy',
+ 'moonkey',
+ 'MrBlonde',
+ 'muczy',
+ 'Münir Ekinci',
+ 'Mustafa Temizel',
+ 'mvoncken',
+ 'Mytonn',
+ 'NagyMarton',
+ 'neaion',
+ 'Neil Lin',
+ 'Nemo',
+ 'Nerijus Arlauskas',
+ 'Nicklas Larsson',
+ 'Nicolaj Wyke',
+ 'Nicola Piovesan',
+ 'Nicolas Sabatier',
+ 'Nicolas Velin',
+ 'Nightfall',
+ 'NiKoB',
+ 'Nikolai M. Riabov',
+ 'Niko_Thien',
+ 'niska',
+ 'Nithir',
+ 'noisemonkey',
+ 'nomemohes',
+ 'nosense',
+ 'null',
+ 'Nuno Estêvão',
+ 'Nuno Santos',
+ 'nxxs',
+ 'nyo',
+ 'obo',
+ 'Ojan',
+ 'Olav Andreas Lindekleiv',
+ 'oldbeggar',
+ 'Olivier FAURAX',
+ 'orphe',
+ 'osantana',
+ 'Osman Tosun',
+ 'OssiR',
+ 'otypoks',
+ 'ounn',
+ 'Oz123',
+ 'Özgür BASKIN',
+ 'Pablo Carmona A.',
+ 'Pablo Ledesma',
+ 'Pablo Navarro Castillo',
+ 'Paco Molinero',
+ 'PÃ¥l-Eivind Johnsen',
+ 'pano',
+ 'Paolo Naldini',
+ 'Paracelsus',
+ 'Patryk13_03',
+ 'Patryk Skorupa',
+ 'PattogoTehen',
+ 'Paul Lange',
+ 'Pavcio',
+ 'Paweł Wysocki',
+ 'Pedro Brites Moita',
+ 'Pedro Clemente Pereira Neto',
+ 'Pekka "PEXI" Niemistö',
+ 'Penegal',
+ 'Penzo',
+ 'perdido',
+ 'Peter Kotrcka',
+ 'Peter Skov',
+ 'Peter Van den Bosch',
+ 'Petter Eklund',
+ 'Petter Viklund',
+ 'phatsphere',
+ 'Phenomen',
+ 'Philipi',
+ 'Philippides Homer',
+ 'phoenix',
+ 'pidi',
+ 'Pierre Quillery',
+ 'Pierre Rudloff',
+ 'Pierre Slamich',
+ 'Pietrao',
+ 'Piotr Strębski',
+ 'Piotr Wicijowski',
+ 'Pittmann Tamás',
+ 'Playmolas',
+ 'Prescott',
+ 'Prescott_SK',
+ 'pronull',
+ 'Przemysław Kulczycki',
+ 'Pumy',
+ 'pushpika',
+ 'PY',
+ 'qubicllj',
+ 'r21vo',
+ 'Rafał Barański',
+ 'rainofchaos',
+ 'Rajbir',
+ 'ras0ir',
+ 'Rat',
+ 'rd1381',
+ 'Renato',
+ 'Rene Hennig',
+ 'Rene Pärts',
+ 'Ricardo Duarte',
+ 'Richard',
+ 'Robert Hrovat',
+ 'Roberth Sjonøy',
+ 'Robert Lundmark',
+ 'Robin Jakobsson',
+ 'Robin KÃ¥veland',
+ 'Rodrigo Donado',
+ 'Roel Groeneveld',
+ 'rohmaru',
+ 'Rolf Christensen',
+ 'Rolf Leggewie',
+ 'Roni Kantis',
+ 'Ronmi',
+ 'Rostislav Raykov',
+ 'royto',
+ 'RuiAmaro',
+ 'Rui Araújo',
+ 'Rui Moura',
+ 'Rune Svendsen',
+ 'Rusna',
+ 'Rytis',
+ 'Sabirov Mikhail',
+ 'salseeg',
+ 'Sami Koskinen',
+ 'Samir van de Sand',
+ 'Samuel Arroyo Acuña',
+ 'Samuel R. C. Vale',
+ 'Sanel',
+ 'Santi',
+ 'Santi Martínez Cantelli',
+ 'Sardan',
+ 'Sargate Kanogan',
+ 'Sarmad Jari',
+ 'Saša Bodiroža',
+ 'sat0shi',
+ 'Saulius PranckeviÄius',
+ 'Savvas Radevic',
+ 'Sebastian Krauß',
+ 'Sebastián Porta',
+ 'Sedir',
+ 'Sefa DenizoÄŸlu',
+ 'sekolands',
+ 'Selim Suerkan',
+ 'semsomi',
+ 'Sergii Golovatiuk',
+ 'setarcos',
+ 'Sheki',
+ 'Shironeko',
+ 'Shlomil',
+ 'silfiriel',
+ 'Simone Tolotti',
+ 'Simone Vendemia',
+ 'sirkubador',
+ 'Sławomir Więch',
+ 'slip',
+ 'slyon',
+ 'smoke',
+ 'Sonja',
+ 'spectral',
+ 'spin_555',
+ 'spitf1r3',
+ 'Spiziuz',
+ 'Spyros Theodoritsis',
+ 'SqUe',
+ 'Squigly',
+ 'srtck',
+ 'Stefan Horning',
+ 'Stefano Maggiolo',
+ 'Stefano Roberto Soleti',
+ 'steinberger',
+ 'Stéphane Travostino',
+ 'Stephan Klein',
+ 'Steven De Winter',
+ 'Stevie',
+ 'Stian24',
+ 'stylius',
+ 'Sukarn Maini',
+ 'Sunjae Park',
+ 'Susana Pereira',
+ 'szymon siglowy',
+ 'takercena',
+ 'TAS',
+ 'Taygeto',
+ 'temy4',
+ 'texxxxxx',
+ 'thamood',
+ 'Thanos Chatziathanassiou',
+ 'Tharawut Paripaiboon',
+ 'Theodoor',
+ 'Théophane Anestis',
+ 'Thor Marius K. Høgås',
+ 'Tiago Silva',
+ 'Tiago Sousa',
+ 'Tikkel',
+ 'tim__b',
+ 'Tim Bordemann',
+ 'Tim Fuchs',
+ 'Tim Kornhammar',
+ 'Timo',
+ 'Timo Jyrinki',
+ 'Timothy Babych',
+ 'TitkosRejtozo',
+ 'Tom',
+ 'Tomas Gustavsson',
+ 'Tomas ValentukeviÄius',
+ 'Tomasz Dominikowski',
+ 'Tomislav PlavÄić',
+ 'Tom Mannerhagen',
+ 'Tommy Mikkelsen',
+ 'Tom Verdaat',
+ 'Tony Manco',
+ 'Tor Erling H. Opsahl',
+ 'Toudi',
+ 'tqm_z',
+ 'Trapanator',
+ 'Tribaal',
+ 'Triton',
+ 'TuniX12',
+ 'Tuomo Sipola',
+ 'turbojugend_gr',
+ 'Turtle.net',
+ 'twilight',
+ 'tymmej',
+ 'Ulrik',
+ 'Umarzuki Mochlis',
+ 'unikob',
+ 'Vadim Gusev',
+ 'Vagi',
+ 'Valentin Bora',
+ 'Valmantas Palikša',
+ 'VASKITTU',
+ 'Vassilis Skoullis',
+ 'vetal17',
+ 'vicedo',
+ 'viki',
+ 'villads hamann',
+ 'Vincent Garibal',
+ 'Vincent Ortalda',
+ 'vinchi007',
+ 'Vinícius de Figueiredo Silva',
+ 'Vinzenz Vietzke',
+ 'virtoo',
+ 'virtual_spirit',
+ 'Vitor Caike',
+ 'Vitor Lamas Gatti',
+ 'Vladimir Lazic',
+ 'Vladimir Sharshov',
+ 'Wanderlust',
+ 'Wander Nauta',
+ 'Ward De Ridder',
+ 'WebCrusader',
+ 'webdr',
+ 'Wentao Tang',
+ 'wilana',
+ 'Wilfredo Ernesto Guerrero Campos',
+ 'Wim Champagne',
+ 'World Sucks',
+ 'Xabi Ezpeleta',
+ 'Xavi de Moner',
+ 'XavierToo',
+ 'XChesser',
+ 'Xiaodong Xu',
+ 'xyb',
+ 'Yaron',
+ 'Yasen Pramatarov',
+ 'YesPoX',
+ 'Yuren Ju',
+ 'Yves MATHIEU',
+ 'zekopeko',
+ 'zhuqin',
+ 'Zissan',
+ 'Γιάννης ΚατσαμπίÏης',
+ 'Ðртём Попов',
+ 'Миша',
+ 'Шаймарданов МакÑим',
+ '蔡查ç†',
+ ]
+ )
+ )
+ self.about.set_wrap_license(True)
+ self.about.set_license(
+ _(
+ '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. \n\n'
+ '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. \n\n'
+ 'You should have received '
+ 'a copy of the GNU General Public License along with this program; '
+ 'if not, see <http://www.gnu.org/licenses>. \n\n'
+ 'In addition, as a '
+ 'special exception, the copyright holders give permission to link '
+ 'the code of portions of this program with the OpenSSL library. '
+ 'You must obey the GNU General Public License in all respects for '
+ 'all of the code used other than OpenSSL. \n\n'
+ 'If you modify file(s) '
+ 'with this exception, you may extend this exception to your '
+ 'version of the file(s), but you are not obligated to do so. If '
+ 'you do not wish to do so, delete this exception statement from '
+ 'your version. If you delete this exception statement from all '
+ 'source files in the program, then also delete it here.'
+ )
+ )
+ self.about.set_website('http://deluge-torrent.org')
+ self.about.set_website_label('deluge-torrent.org')
+
+ self.about.set_icon(get_deluge_icon())
+ self.about.set_logo(get_pixbuf('deluge-about.png'))
+
+ if client.connected():
+ if not client.is_standalone():
+ self.about.set_comments(
+ self.about.get_comments() + _('Server:') + ' %coreversion%\n'
+ )
+
+ self.about.set_comments(
+ self.about.get_comments() + '\n' + _('libtorrent:') + ' %ltversion%\n'
+ )
+
+ def on_lt_version(result):
+ c = self.about.get_comments()
+ c = c.replace('%ltversion%', result)
+ self.about.set_comments(c)
+
+ def on_info(result):
+ c = self.about.get_comments()
+ c = c.replace('%coreversion%', result)
+ self.about.set_comments(c)
+ client.core.get_libtorrent_version().addCallback(on_lt_version)
+
+ if not client.is_standalone():
+ client.daemon.info().addCallback(on_info)
+ else:
+ client.core.get_libtorrent_version().addCallback(on_lt_version)
+
+ def run(self):
+ self.about.show_all()
+ self.about.run()
+ self.about.destroy()
diff --git a/deluge/ui/gtk3/addtorrentdialog.py b/deluge/ui/gtk3/addtorrentdialog.py
new file mode 100644
index 0000000..9ede710
--- /dev/null
+++ b/deluge/ui/gtk3/addtorrentdialog.py
@@ -0,0 +1,1101 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import logging
+import os
+from base64 import b64encode
+from xml.sax.saxutils import escape as xml_escape
+from xml.sax.saxutils import unescape as xml_unescape
+
+from gi.repository import Gtk
+from gi.repository.GObject import TYPE_INT64, TYPE_UINT64
+
+import deluge.component as component
+from deluge.common import (
+ create_magnet_uri,
+ decode_bytes,
+ fsize,
+ get_magnet_info,
+ is_infohash,
+ is_magnet,
+ is_url,
+ resource_filename,
+)
+from deluge.configmanager import ConfigManager
+from deluge.httpdownloader import download_file
+from deluge.ui.client import client
+from deluge.ui.common import TorrentInfo
+
+from .common import (
+ get_clipboard_text,
+ listview_replace_treestore,
+ reparent_iter,
+ windowing,
+)
+from .dialogs import ErrorDialog
+from .edittrackersdialog import trackers_tiers_from_text
+from .path_chooser import PathChooser
+from .torrentview_data_funcs import cell_data_size
+
+log = logging.getLogger(__name__)
+
+
+class AddTorrentDialog(component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'AddTorrentDialog')
+ self.builder = Gtk.Builder()
+ # The base dialog
+ self.builder.add_from_file(
+ resource_filename(
+ __package__, os.path.join('glade', 'add_torrent_dialog.ui')
+ )
+ )
+ # The infohash dialog
+ self.builder.add_from_file(
+ resource_filename(
+ __package__, os.path.join('glade', 'add_torrent_dialog.infohash.ui')
+ )
+ )
+ # The url dialog
+ self.builder.add_from_file(
+ resource_filename(
+ __package__, os.path.join('glade', 'add_torrent_dialog.url.ui')
+ )
+ )
+
+ self.dialog = self.builder.get_object('dialog_add_torrent')
+
+ self.dialog.connect('delete-event', self._on_delete_event)
+
+ self.builder.connect_signals(self)
+
+ # download?, path, filesize, sequence number, inconsistent?
+ self.files_treestore = Gtk.TreeStore(
+ bool, str, TYPE_UINT64, TYPE_INT64, bool, str
+ )
+ self.files_treestore.set_sort_column_id(1, Gtk.SortType.ASCENDING)
+
+ # Holds the files info
+ self.files = {}
+ self.infos = {}
+ self.core_config = {}
+ self.options = {}
+
+ self.previous_selected_torrent = None
+
+ self.listview_torrents = self.builder.get_object('listview_torrents')
+ self.listview_files = self.builder.get_object('listview_files')
+
+ self.prefetching_magnets = []
+
+ render = Gtk.CellRendererText()
+ render.connect('edited', self._on_torrent_name_edit)
+ render.set_property('editable', True)
+ column = Gtk.TreeViewColumn(_('Torrent'), render, text=1)
+ self.listview_torrents.append_column(column)
+
+ render = Gtk.CellRendererToggle()
+ render.connect('toggled', self._on_file_toggled)
+ column = Gtk.TreeViewColumn(None, render, active=0, inconsistent=4)
+ self.listview_files.append_column(column)
+
+ column = Gtk.TreeViewColumn(_('Filename'))
+ render = Gtk.CellRendererPixbuf()
+ column.pack_start(render, False)
+ column.add_attribute(render, 'icon-name', 5)
+ render = Gtk.CellRendererText()
+ render.set_property('editable', True)
+ render.connect('edited', self._on_filename_edited)
+ column.pack_start(render, True)
+ column.add_attribute(render, 'text', 1)
+ column.set_expand(True)
+ self.listview_files.append_column(column)
+
+ render = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn(_('Size'))
+ column.pack_start(render, True)
+ column.set_cell_data_func(render, cell_data_size, 2)
+ self.listview_files.append_column(column)
+
+ self.torrent_liststore = Gtk.ListStore(str, str, str)
+ self.listview_torrents.set_model(self.torrent_liststore)
+ self.listview_torrents.set_tooltip_column(2)
+ self.listview_files.set_model(self.files_treestore)
+
+ self.listview_files.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)
+ self.listview_torrents.get_selection().connect(
+ 'changed', self._on_torrent_changed
+ )
+ self.torrent_liststore.connect('row-inserted', self.update_dialog_title_count)
+ self.torrent_liststore.connect('row-deleted', self.update_dialog_title_count)
+
+ self.setup_move_completed_path_chooser()
+ self.setup_download_location_path_chooser()
+
+ # Get default config values from the core
+ self.core_keys = [
+ 'pre_allocate_storage',
+ 'max_connections_per_torrent',
+ 'max_upload_slots_per_torrent',
+ 'max_upload_speed_per_torrent',
+ 'max_download_speed_per_torrent',
+ 'prioritize_first_last_pieces',
+ 'sequential_download',
+ 'add_paused',
+ 'download_location',
+ 'download_location_paths_list',
+ 'move_completed',
+ 'move_completed_path',
+ 'move_completed_paths_list',
+ 'super_seeding',
+ ]
+ # self.core_keys += self.move_completed_path_chooser.get_config_keys()
+ self.builder.get_object('notebook1').connect(
+ 'switch-page', self._on_switch_page
+ )
+
+ def start(self):
+ self.update_core_config()
+
+ def show(self, focus=False):
+ self.update_core_config(True, focus)
+
+ def _show(self, focus=False):
+ main_window = component.get('MainWindow')
+ if main_window.is_on_active_workspace():
+ self.dialog.set_transient_for(main_window.window)
+ else:
+ self.dialog.set_transient_for(None)
+ self.dialog.set_position(Gtk.WindowPosition.CENTER)
+
+ if focus:
+ timestamp = main_window.get_timestamp()
+ if windowing('X11'):
+ # Use present with X11 set_user_time since
+ # present_with_time is inconsistent.
+ self.dialog.present()
+ self.dialog.get_window().set_user_time(timestamp)
+ else:
+ self.dialog.present_with_time(timestamp)
+ else:
+ self.dialog.present()
+
+ def hide(self):
+ self.dialog.hide()
+ self.files = {}
+ self.infos = {}
+ self.options = {}
+ self.previous_selected_torrent = None
+ self.torrent_liststore.clear()
+ self.files_treestore.clear()
+ self.prefetching_magnets = []
+ self.dialog.set_transient_for(component.get('MainWindow').window)
+
+ def _on_config_values(self, config, show=False, focus=False):
+ self.core_config = config
+ if self.core_config:
+ self.set_default_options()
+ if show:
+ self._show(focus)
+
+ def update_core_config(self, show=False, focus=False):
+ # Send requests to the core for these config values
+ d = client.core.get_config_values(self.core_keys)
+ d.addCallback(self._on_config_values, show, focus)
+
+ def _add_torrent_liststore(self, info_hash, name, filename, files, filedata):
+ """Add a torrent to torrent_liststore."""
+ if info_hash in self.files:
+ return False
+
+ torrent_row = [info_hash, name, xml_escape(filename)]
+ row_iter = self.torrent_liststore.append(torrent_row)
+ self.files[info_hash] = files
+ self.infos[info_hash] = filedata
+ self.listview_torrents.get_selection().select_iter(row_iter)
+
+ self.set_default_options()
+ self.save_torrent_options(row_iter)
+
+ return row_iter
+
+ def update_dialog_title_count(self, *args):
+ """Update the AddTorrent dialog title with current torrent count."""
+ self.dialog.set_title(_('Add Torrents (%d)') % len(self.torrent_liststore))
+
+ def show_already_added_dialog(self, count):
+ """Show a message about trying to add duplicate torrents."""
+ log.debug('Tried to add %d duplicate torrents!', count)
+ ErrorDialog(
+ _('Duplicate torrent(s)'),
+ _(
+ 'You cannot add the same torrent twice.'
+ ' %d torrents were already added.' % count
+ ),
+ self.dialog,
+ ).run()
+
+ def add_from_files(self, filenames):
+ already_added = 0
+
+ for filename in filenames:
+ # Get the torrent data from the torrent file
+ try:
+ info = TorrentInfo(filename)
+ except Exception as ex:
+ log.debug('Unable to open torrent file: %s', ex)
+ ErrorDialog(_('Invalid File'), ex, self.dialog).run()
+ continue
+
+ if not self._add_torrent_liststore(
+ info.info_hash, info.name, filename, info.files, info.filedata
+ ):
+ already_added += 1
+
+ if already_added:
+ self.show_already_added_dialog(already_added)
+
+ def _on_uri_metadata(self, result, uri, trackers):
+ """Process prefetched metadata to allow file priority selection."""
+ info_hash, metadata = result
+ log.debug('magnet metadata for %s (%s)', uri, info_hash)
+ if info_hash not in self.prefetching_magnets:
+ return
+
+ if metadata:
+ info = TorrentInfo.from_metadata(metadata, [[t] for t in trackers])
+ self.files[info_hash] = info.files
+ self.infos[info_hash] = info.filedata
+ else:
+ log.info('Unable to fetch metadata for magnet: %s', uri)
+ self.prefetching_magnets.remove(info_hash)
+ self._on_torrent_changed(self.listview_torrents.get_selection())
+
+ def _on_uri_metadata_fail(self, result, info_hash):
+ self.prefetching_magnets.remove(info_hash)
+ self._on_torrent_changed(self.listview_torrents.get_selection())
+
+ def prefetch_waiting_message(self, torrent_id, files):
+ """Show magnet files fetching or failed message above files list."""
+ if torrent_id in self.prefetching_magnets:
+ self.builder.get_object('prefetch_label').set_text(
+ _('Please wait for files...')
+ )
+ self.builder.get_object('prefetch_spinner').show()
+ self.builder.get_object('prefetch_hbox').show()
+ elif not files:
+ self.builder.get_object('prefetch_label').set_text(
+ _('Unable to download files for this magnet')
+ )
+ self.builder.get_object('prefetch_spinner').hide()
+ self.builder.get_object('prefetch_hbox').show()
+ else:
+ self.builder.get_object('prefetch_hbox').hide()
+
+ def add_from_magnets(self, uris):
+ """Add a list of magnet uris to torrent_liststore."""
+ already_added = 0
+
+ for uri in uris:
+ magnet = get_magnet_info(uri)
+ if not magnet:
+ log.error('Invalid magnet: %s', uri)
+ continue
+
+ torrent_id = magnet['info_hash']
+ files = magnet['files_tree']
+ if not self._add_torrent_liststore(
+ torrent_id, magnet['name'], uri, files, None
+ ):
+ already_added += 1
+ continue
+
+ if files:
+ continue
+
+ self.prefetching_magnets.append(torrent_id)
+ self.prefetch_waiting_message(torrent_id, None)
+ d = client.core.prefetch_magnet_metadata(uri)
+ d.addCallback(self._on_uri_metadata, uri, magnet['trackers'])
+ d.addErrback(self._on_uri_metadata_fail, torrent_id)
+
+ if already_added:
+ self.show_already_added_dialog(already_added)
+
+ def _on_torrent_changed(self, treeselection):
+ (model, row) = treeselection.get_selected()
+ if row is None or not model.iter_is_valid(row):
+ self.files_treestore.clear()
+ self.previous_selected_torrent = None
+ return
+
+ if model[row][0] not in self.files:
+ self.files_treestore.clear()
+ self.previous_selected_torrent = None
+ return
+
+ # Save the previous torrents options
+ self.save_torrent_options()
+
+ torrent_id = model.get_value(row, 0)
+ # Update files list
+ files_list = self.files[torrent_id]
+ self.prepare_file_store(files_list)
+
+ if self.core_config == {}:
+ self.update_core_config()
+
+ # Update the options frame
+ self.update_torrent_options(torrent_id)
+ # Update magnet prefetch message
+ self.prefetch_waiting_message(torrent_id, files_list)
+
+ self.previous_selected_torrent = row
+
+ def _on_torrent_name_edit(self, w, row, new_name):
+ # TODO: Update torrent name
+ pass
+
+ def _on_switch_page(self, widget, page, page_num):
+ # Save the torrent options when switching notebook pages
+ self.save_torrent_options()
+
+ def prepare_file_store(self, files):
+ with listview_replace_treestore(self.listview_files):
+ split_files = {}
+ for idx, _file in enumerate(files):
+ self.prepare_file(
+ _file, _file['path'], idx, _file.get('download', True), split_files
+ )
+ self.add_files(None, split_files)
+ root = Gtk.TreePath.new_first()
+ self.listview_files.expand_row(root, False)
+
+ def prepare_file(self, _file, file_name, file_num, download, files_storage):
+ first_slash_index = file_name.find(os.path.sep)
+ if first_slash_index == -1:
+ files_storage[file_name] = (file_num, _file, download)
+ else:
+ file_name_chunk = file_name[: first_slash_index + 1]
+ if file_name_chunk not in files_storage:
+ files_storage[file_name_chunk] = {}
+ self.prepare_file(
+ _file,
+ file_name[first_slash_index + 1 :],
+ file_num,
+ download,
+ files_storage[file_name_chunk],
+ )
+
+ def add_files(self, parent_iter, split_files):
+ ret = 0
+ for key, value in split_files.items():
+ if key.endswith(os.path.sep):
+ chunk_iter = self.files_treestore.append(
+ parent_iter, [True, key, 0, -1, False, 'folder-symbolic']
+ )
+ chunk_size = self.add_files(chunk_iter, value)
+ self.files_treestore.set(chunk_iter, 2, chunk_size)
+ ret += chunk_size
+ else:
+ self.files_treestore.append(
+ parent_iter,
+ [
+ value[2],
+ key,
+ value[1]['size'],
+ value[0],
+ False,
+ 'text-x-generic-symbolic',
+ ],
+ )
+ ret += value[1]['size']
+ if parent_iter and self.files_treestore.iter_has_child(parent_iter):
+ # Iterate through the children and see what we should label the
+ # folder, download true, download false or inconsistent.
+ itr = self.files_treestore.iter_children(parent_iter)
+ download = []
+ download_value = False
+ inconsistent = False
+ while itr:
+ download.append(self.files_treestore.get_value(itr, 0))
+ itr = self.files_treestore.iter_next(itr)
+
+ if sum(download) == len(download):
+ download_value = True
+ elif sum(download) == 0:
+ download_value = False
+ else:
+ inconsistent = True
+
+ self.files_treestore.set_value(parent_iter, 0, download_value)
+ self.files_treestore.set_value(parent_iter, 4, inconsistent)
+ return ret
+
+ def load_path_choosers_data(self):
+ self.move_completed_path_chooser.set_text(
+ self.core_config['move_completed_path'], cursor_end=False, default_text=True
+ )
+ self.download_location_path_chooser.set_text(
+ self.core_config['download_location'], cursor_end=False, default_text=True
+ )
+ self.builder.get_object('chk_move_completed').set_active(
+ self.core_config['move_completed']
+ )
+ self.move_completed_path_chooser.set_sensitive(
+ self.core_config['move_completed']
+ )
+
+ def setup_move_completed_path_chooser(self):
+ self.move_completed_hbox = self.builder.get_object(
+ 'hbox_move_completed_chooser'
+ )
+ self.move_completed_path_chooser = PathChooser(
+ 'move_completed_paths_list', parent=self.dialog
+ )
+ self.move_completed_hbox.add(self.move_completed_path_chooser)
+ self.move_completed_hbox.show_all()
+
+ def setup_download_location_path_chooser(self):
+ self.download_location_hbox = self.builder.get_object(
+ 'hbox_download_location_chooser'
+ )
+ self.download_location_path_chooser = PathChooser(
+ 'download_location_paths_list', parent=self.dialog
+ )
+ self.download_location_hbox.add(self.download_location_path_chooser)
+ self.download_location_hbox.show_all()
+
+ def update_torrent_options(self, torrent_id):
+ if torrent_id not in self.options:
+ self.set_default_options()
+ return
+
+ options = self.options[torrent_id]
+
+ self.download_location_path_chooser.set_text(
+ options['download_location'], cursor_end=True
+ )
+ self.move_completed_path_chooser.set_text(
+ options['move_completed_path'], cursor_end=True
+ )
+
+ self.builder.get_object('spin_maxdown').set_value(options['max_download_speed'])
+ self.builder.get_object('spin_maxup').set_value(options['max_upload_speed'])
+ self.builder.get_object('spin_maxconnections').set_value(
+ options['max_connections']
+ )
+ self.builder.get_object('spin_maxupslots').set_value(
+ options['max_upload_slots']
+ )
+ self.builder.get_object('chk_paused').set_active(options['add_paused'])
+ self.builder.get_object('chk_pre_alloc').set_active(
+ options['pre_allocate_storage']
+ )
+ self.builder.get_object('chk_prioritize').set_active(
+ options['prioritize_first_last_pieces']
+ )
+ self.builder.get_object('chk_sequential_download').set_active(
+ options['sequential_download']
+ )
+ self.builder.get_object('chk_move_completed').set_active(
+ options['move_completed']
+ )
+ self.builder.get_object('chk_super_seeding').set_active(
+ options['super_seeding']
+ )
+
+ def save_torrent_options(self, row=None):
+ # Keeps the torrent options dictionary up-to-date with what the user has
+ # selected.
+ if row is None:
+ if self.previous_selected_torrent and self.torrent_liststore.iter_is_valid(
+ self.previous_selected_torrent
+ ):
+ row = self.previous_selected_torrent
+ else:
+ return
+
+ torrent_id = self.torrent_liststore.get_value(row, 0)
+
+ if torrent_id in self.options:
+ options = self.options[torrent_id]
+ else:
+ options = {}
+
+ options['download_location'] = decode_bytes(
+ self.download_location_path_chooser.get_text()
+ )
+ options['move_completed_path'] = decode_bytes(
+ self.move_completed_path_chooser.get_text()
+ )
+ options['pre_allocate_storage'] = self.builder.get_object(
+ 'chk_pre_alloc'
+ ).get_active()
+ options['move_completed'] = self.builder.get_object(
+ 'chk_move_completed'
+ ).get_active()
+ options['max_download_speed'] = self.builder.get_object(
+ 'spin_maxdown'
+ ).get_value()
+ options['max_upload_speed'] = self.builder.get_object('spin_maxup').get_value()
+ options['max_connections'] = self.builder.get_object(
+ 'spin_maxconnections'
+ ).get_value_as_int()
+ options['max_upload_slots'] = self.builder.get_object(
+ 'spin_maxupslots'
+ ).get_value_as_int()
+ options['add_paused'] = self.builder.get_object('chk_paused').get_active()
+ options['prioritize_first_last_pieces'] = self.builder.get_object(
+ 'chk_prioritize'
+ ).get_active()
+ options['sequential_download'] = (
+ self.builder.get_object('chk_sequential_download').get_active() or False
+ )
+ options['move_completed'] = self.builder.get_object(
+ 'chk_move_completed'
+ ).get_active()
+ options['seed_mode'] = self.builder.get_object('chk_seed_mode').get_active()
+ options['super_seeding'] = self.builder.get_object(
+ 'chk_super_seeding'
+ ).get_active()
+
+ self.options[torrent_id] = options
+
+ # Save the file priorities
+ files_priorities = self.build_priorities(
+ self.files_treestore.get_iter_first(), {}
+ )
+
+ if len(files_priorities) > 0:
+ for i, file_dict in enumerate(self.files[torrent_id]):
+ file_dict['download'] = files_priorities[i]
+
+ def build_priorities(self, _iter, priorities):
+ while _iter is not None:
+ if self.files_treestore.iter_has_child(_iter):
+ self.build_priorities(
+ self.files_treestore.iter_children(_iter), priorities
+ )
+ elif not self.files_treestore.get_value(_iter, 1).endswith(os.path.sep):
+ priorities[
+ self.files_treestore.get_value(_iter, 3)
+ ] = self.files_treestore.get_value(_iter, 0)
+ _iter = self.files_treestore.iter_next(_iter)
+ return priorities
+
+ def set_default_options(self):
+ if not self.core_config:
+ # update_core_config will call this method again.
+ self.update_core_config()
+ return
+
+ self.load_path_choosers_data()
+
+ self.builder.get_object('chk_pre_alloc').set_active(
+ self.core_config['pre_allocate_storage']
+ )
+ self.builder.get_object('spin_maxdown').set_value(
+ self.core_config['max_download_speed_per_torrent']
+ )
+ self.builder.get_object('spin_maxup').set_value(
+ self.core_config['max_upload_speed_per_torrent']
+ )
+ self.builder.get_object('spin_maxconnections').set_value(
+ self.core_config['max_connections_per_torrent']
+ )
+ self.builder.get_object('spin_maxupslots').set_value(
+ self.core_config['max_upload_slots_per_torrent']
+ )
+ self.builder.get_object('chk_paused').set_active(self.core_config['add_paused'])
+ self.builder.get_object('chk_prioritize').set_active(
+ self.core_config['prioritize_first_last_pieces']
+ )
+ self.builder.get_object('chk_sequential_download').set_active(
+ self.core_config['sequential_download']
+ )
+ self.builder.get_object('chk_move_completed').set_active(
+ self.core_config['move_completed']
+ )
+ self.builder.get_object('chk_seed_mode').set_active(False)
+ self.builder.get_object('chk_super_seeding').set_active(
+ self.core_config['super_seeding']
+ )
+
+ def get_file_priorities(self, torrent_id):
+ # A list of priorities
+ files_list = []
+
+ for file_dict in self.files[torrent_id]:
+ if not file_dict['download']:
+ files_list.append(0)
+ else:
+ # Default lt file priority is 4
+ files_list.append(4)
+
+ return files_list
+
+ def _on_file_toggled(self, render, path):
+ (model, paths) = self.listview_files.get_selection().get_selected_rows()
+ if len(paths) > 1:
+ for path in paths:
+ row = model.get_iter(path)
+ self.toggle_iter(row)
+ else:
+ row = model.get_iter(path)
+ self.toggle_iter(row)
+ self.update_treeview_toggles(self.files_treestore.get_iter_first())
+
+ def toggle_iter(self, _iter, toggle_to=None):
+ if toggle_to is None:
+ toggle_to = not self.files_treestore.get_value(_iter, 0)
+ self.files_treestore.set_value(_iter, 0, toggle_to)
+ if self.files_treestore.iter_has_child(_iter):
+ child = self.files_treestore.iter_children(_iter)
+ while child is not None:
+ self.toggle_iter(child, toggle_to)
+ child = self.files_treestore.iter_next(child)
+
+ def update_treeview_toggles(self, _iter):
+ toggle_inconsistent = -1
+ this_level_toggle = None
+ while _iter is not None:
+ if self.files_treestore.iter_has_child(_iter):
+ toggle = self.update_treeview_toggles(
+ self.files_treestore.iter_children(_iter)
+ )
+ if toggle == toggle_inconsistent:
+ self.files_treestore.set_value(_iter, 4, True)
+ else:
+ self.files_treestore.set_value(_iter, 0, toggle)
+ # set inconsistent to false
+ self.files_treestore.set_value(_iter, 4, False)
+ else:
+ toggle = self.files_treestore.get_value(_iter, 0)
+ if this_level_toggle is None:
+ this_level_toggle = toggle
+ elif this_level_toggle != toggle:
+ this_level_toggle = toggle_inconsistent
+ _iter = self.files_treestore.iter_next(_iter)
+ return this_level_toggle
+
+ def on_button_file_clicked(self, widget):
+ log.debug('on_button_file_clicked')
+ # Setup the filechooserdialog
+ chooser = Gtk.FileChooserDialog(
+ _('Choose a .torrent file'),
+ None,
+ Gtk.FileChooserAction.OPEN,
+ buttons=(
+ _('_Cancel'),
+ Gtk.ResponseType.CANCEL,
+ _('_Open'),
+ Gtk.ResponseType.OK,
+ ),
+ )
+
+ chooser.set_transient_for(self.dialog)
+ chooser.set_select_multiple(True)
+ chooser.set_property('skip-taskbar-hint', True)
+ chooser.set_local_only(False)
+
+ # Add .torrent and * file filters
+ file_filter = Gtk.FileFilter()
+ file_filter.set_name(_('Torrent files'))
+ file_filter.add_pattern('*.' + 'torrent')
+ chooser.add_filter(file_filter)
+ file_filter = Gtk.FileFilter()
+ file_filter.set_name(_('All files'))
+ file_filter.add_pattern('*')
+ chooser.add_filter(file_filter)
+
+ # Load the 'default_load_path' from the config
+ self.config = ConfigManager('gtk3ui.conf')
+ if (
+ 'default_load_path' in self.config
+ and self.config['default_load_path'] is not None
+ ):
+ chooser.set_current_folder(self.config['default_load_path'])
+
+ # Run the dialog
+ response = chooser.run()
+
+ if response == Gtk.ResponseType.OK:
+ result = [decode_bytes(f) for f in chooser.get_filenames()]
+ self.config['default_load_path'] = decode_bytes(
+ chooser.get_current_folder()
+ )
+ else:
+ chooser.destroy()
+ return
+
+ chooser.destroy()
+ self.add_from_files(result)
+
+ def on_button_url_clicked(self, widget):
+ log.debug('on_button_url_clicked')
+ dialog = self.builder.get_object('url_dialog')
+ entry = self.builder.get_object('entry_url')
+
+ dialog.set_default_response(Gtk.ResponseType.OK)
+ dialog.set_transient_for(self.dialog)
+ entry.grab_focus()
+
+ text = get_clipboard_text()
+ if text and is_url(text) or is_magnet(text):
+ entry.set_text(text)
+
+ dialog.show_all()
+ response = dialog.run()
+
+ if response == Gtk.ResponseType.OK:
+ url = decode_bytes(entry.get_text())
+ else:
+ url = None
+
+ entry.set_text('')
+ dialog.hide()
+
+ # This is where we need to fetch the .torrent file from the URL and
+ # add it to the list.
+ log.debug('url: %s', url)
+ if url:
+ if is_url(url):
+ self.add_from_url(url)
+ elif is_magnet(url):
+ self.add_from_magnets([url])
+ else:
+ ErrorDialog(
+ _('Invalid URL'),
+ '%s %s' % (url, _('is not a valid URL.')),
+ self.dialog,
+ ).run()
+
+ def add_from_url(self, url):
+ dialog = Gtk.Dialog(
+ _('Downloading...'),
+ flags=Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
+ parent=self.dialog,
+ )
+ dialog.set_transient_for(self.dialog)
+
+ pb = Gtk.ProgressBar()
+ dialog.vbox.pack_start(pb, True, True, 0)
+ dialog.show_all()
+
+ # Create a tmp file path
+ import tempfile
+
+ tmp_fd, tmp_file = tempfile.mkstemp(prefix='deluge_url.', suffix='.torrent')
+
+ def on_part(data, current_length, total_length):
+ if total_length:
+ percent = current_length / total_length
+ pb.set_fraction(percent)
+ pb.set_text(
+ '%.2f%% (%s / %s)'
+ % (percent * 100, fsize(current_length), fsize(total_length))
+ )
+ else:
+ pb.pulse()
+ pb.set_text('%s' % fsize(current_length))
+
+ def on_download_success(result):
+ self.add_from_files([result])
+ dialog.destroy()
+
+ def on_download_fail(result):
+ log.debug('Download failed: %s', result)
+ dialog.destroy()
+ ErrorDialog(
+ _('Download Failed'),
+ '%s %s' % (_('Failed to download:'), url),
+ details=result.getErrorMessage(),
+ parent=self.dialog,
+ ).run()
+ return result
+
+ d = download_file(url, tmp_file, on_part)
+ os.close(tmp_fd)
+ d.addCallbacks(on_download_success, on_download_fail)
+
+ def on_button_hash_clicked(self, widget):
+ log.debug('on_button_hash_clicked')
+ dialog = self.builder.get_object('dialog_infohash')
+ entry = self.builder.get_object('entry_hash')
+ textview = self.builder.get_object('text_trackers')
+
+ dialog.set_default_response(Gtk.ResponseType.OK)
+ dialog.set_transient_for(self.dialog)
+ entry.grab_focus()
+
+ text = get_clipboard_text()
+ if is_infohash(text):
+ entry.set_text(text)
+
+ dialog.show_all()
+ response = dialog.run()
+ infohash = decode_bytes(entry.get_text()).strip()
+ if response == Gtk.ResponseType.OK and is_infohash(infohash):
+ # Create a list of trackers from the textview buffer
+ tview_buf = textview.get_buffer()
+ trackers_text = decode_bytes(
+ tview_buf.get_text(*tview_buf.get_bounds(), include_hidden_chars=False)
+ )
+ log.debug('Create torrent tracker lines: %s', trackers_text)
+ trackers = list(trackers_tiers_from_text(trackers_text).keys())
+
+ # Convert the information to a magnet uri, this is just easier to
+ # handle this way.
+ log.debug('trackers: %s', trackers)
+ magnet = create_magnet_uri(infohash, infohash, trackers)
+ log.debug('magnet uri: %s', magnet)
+ self.add_from_magnets([magnet])
+
+ entry.set_text('')
+ textview.get_buffer().set_text('')
+ dialog.hide()
+
+ def on_button_remove_clicked(self, widget):
+ log.debug('on_button_remove_clicked')
+ (model, row) = self.listview_torrents.get_selection().get_selected()
+ if row is None:
+ return
+
+ torrent_id = model.get_value(row, 0)
+
+ model.remove(row)
+ del self.files[torrent_id]
+ del self.infos[torrent_id]
+
+ def on_button_trackers_clicked(self, widget):
+ log.debug('on_button_trackers_clicked')
+
+ def on_button_cancel_clicked(self, widget):
+ log.debug('on_button_cancel_clicked')
+ self.hide()
+
+ def on_button_add_clicked(self, widget):
+ log.debug('on_button_add_clicked')
+ self.add_torrents()
+ self.hide()
+
+ def add_torrents(self):
+ (model, row) = self.listview_torrents.get_selection().get_selected()
+ if row is not None:
+ self.save_torrent_options(row)
+
+ torrents_to_add = []
+
+ row = self.torrent_liststore.get_iter_first()
+ while row is not None:
+ torrent_id = self.torrent_liststore.get_value(row, 0)
+ filename = xml_unescape(
+ decode_bytes(self.torrent_liststore.get_value(row, 2))
+ )
+ try:
+ options = self.options[torrent_id]
+ except KeyError:
+ options = None
+
+ file_priorities = self.get_file_priorities(torrent_id)
+ if options is not None:
+ options['file_priorities'] = file_priorities
+
+ if self.infos[torrent_id]:
+ torrents_to_add.append(
+ (
+ os.path.split(filename)[-1],
+ b64encode(self.infos[torrent_id]),
+ options,
+ )
+ )
+ elif is_magnet(filename):
+ client.core.add_torrent_magnet(filename, options).addErrback(log.debug)
+
+ row = self.torrent_liststore.iter_next(row)
+
+ def on_torrents_added(errors):
+ if errors:
+ log.info(
+ 'Failed to add %d out of %d torrents.',
+ len(errors),
+ len(torrents_to_add),
+ )
+ for e in errors:
+ log.info('Torrent add failed: %s', e)
+ else:
+ log.info('Successfully added %d torrents.', len(torrents_to_add))
+
+ if torrents_to_add:
+ client.core.add_torrent_files(torrents_to_add).addCallback(
+ on_torrents_added
+ )
+
+ def on_button_apply_clicked(self, widget):
+ log.debug('on_button_apply_clicked')
+ (model, row) = self.listview_torrents.get_selection().get_selected()
+ if row is None:
+ return
+
+ self.save_torrent_options(row)
+
+ # The options, except file renames, we want all the torrents to have
+ options = self.options[model.get_value(row, 0)].copy()
+ options.pop('mapped_files', None)
+
+ # Set all the torrent options
+ row = model.get_iter_first()
+ while row is not None:
+ torrent_id = model.get_value(row, 0)
+ self.options[torrent_id].update(options)
+ row = model.iter_next(row)
+
+ def on_button_revert_clicked(self, widget):
+ log.debug('on_button_revert_clicked')
+ (model, row) = self.listview_torrents.get_selection().get_selected()
+ if row is None:
+ return
+
+ del self.options[model.get_value(row, 0)]
+ self.set_default_options()
+
+ def on_chk_move_completed_toggled(self, widget):
+ value = widget.get_active()
+ self.move_completed_path_chooser.set_sensitive(value)
+
+ def _on_delete_event(self, widget, event):
+ self.hide()
+ return True
+
+ def get_file_path(self, row, path=''):
+ if not row:
+ return path
+
+ path = self.files_treestore[row][1] + path
+ return self.get_file_path(self.files_treestore.iter_parent(row), path)
+
+ def _on_filename_edited(self, renderer, path, new_text):
+ index = self.files_treestore[path][3]
+
+ new_text = new_text.strip(os.path.sep).strip()
+
+ # Return if the text hasn't changed
+ if new_text == self.files_treestore[path][1]:
+ return
+
+ # Get the tree iter
+ itr = self.files_treestore.get_iter(path)
+
+ # Get the torrent_id
+ (model, row) = self.listview_torrents.get_selection().get_selected()
+ torrent_id = model[row][0]
+
+ if 'mapped_files' not in self.options[torrent_id]:
+ self.options[torrent_id]['mapped_files'] = {}
+
+ if index > -1:
+ # We're renaming a file! Yay! That's easy!
+ if not new_text:
+ return
+ parent = self.files_treestore.iter_parent(itr)
+ file_path = os.path.join(self.get_file_path(parent), new_text)
+ # Don't rename if filename exists
+ if parent:
+ for row in self.files_treestore[parent].iterchildren():
+ if new_text == row[1]:
+ return
+ if os.path.sep in new_text:
+ # There are folders in this path, so we need to create them
+ # and then move the file iter to top
+ split_text = new_text.split(os.path.sep)
+ for s in split_text[:-1]:
+ parent = self.files_treestore.append(
+ parent, [True, s, 0, -1, False, 'folder-symbolic']
+ )
+
+ self.files_treestore[itr][1] = split_text[-1]
+ reparent_iter(self.files_treestore, itr, parent)
+ else:
+ # Update the row's text
+ self.files_treestore[itr][1] = new_text
+
+ # Update the mapped_files dict in the options with the index and new
+ # file path.
+ # We'll send this to the core when adding the torrent so it knows
+ # what to rename before adding.
+ self.options[torrent_id]['mapped_files'][index] = file_path
+ self.files[torrent_id][index]['path'] = file_path
+ else:
+ # Folder!
+ def walk_tree(row):
+ if not row:
+ return
+
+ # Get the file path base once, since it will be the same for
+ # all siblings
+ file_path_base = self.get_file_path(
+ self.files_treestore.iter_parent(row)
+ )
+
+ # Iterate through all the siblings at this level
+ while row:
+ # We recurse if there are children
+ if self.files_treestore.iter_has_child(row):
+ walk_tree(self.files_treestore.iter_children(row))
+
+ index = self.files_treestore[row][3]
+
+ if index > -1:
+ # Get the new full path for this file
+ file_path = file_path_base + self.files_treestore[row][1]
+
+ # Update the file path in the mapped_files dict
+ self.options[torrent_id]['mapped_files'][index] = file_path
+ self.files[torrent_id][index]['path'] = file_path
+
+ # Get the next siblings iter
+ row = self.files_treestore.iter_next(row)
+
+ # Update the treestore row first so that when walking the tree
+ # we can construct the new proper paths
+
+ # We need to check if this folder has been split
+ if os.path.sep in new_text:
+ # It's been split, so we need to add new folders and then re-parent
+ # itr.
+ parent = self.files_treestore.iter_parent(itr)
+ split_text = new_text.split(os.path.sep)
+ for s in split_text[:-1]:
+ # We don't iterate over the last item because we'll just use
+ # the existing itr and change the text
+ parent = self.files_treestore.append(
+ parent, [True, s + os.path.sep, 0, -1, False, 'folder-symbolic']
+ )
+
+ self.files_treestore[itr][1] = split_text[-1] + os.path.sep
+
+ # Now re-parent itr to parent
+ reparent_iter(self.files_treestore, itr, parent)
+ itr = parent
+
+ # We need to re-expand the view because it might contracted
+ # if we change the root iter
+ root = Gtk.TreePath.new_first()
+ self.listview_files.expand_row(root, False)
+ else:
+ # This was a simple folder rename without any splits, so just
+ # change the path for itr
+ self.files_treestore[itr][1] = new_text + os.path.sep
+
+ # Walk through the tree from 'itr' and add all the new file paths
+ # to the 'mapped_files' option
+ walk_tree(itr)
diff --git a/deluge/ui/gtk3/common.py b/deluge/ui/gtk3/common.py
new file mode 100644
index 0000000..8359327
--- /dev/null
+++ b/deluge/ui/gtk3/common.py
@@ -0,0 +1,395 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Marcos Mobley ('markybob') <markybob@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+"""Common functions for various parts of gtkui to use."""
+from __future__ import unicode_literals
+
+import contextlib
+import logging
+import os
+import shutil
+import sys
+
+import six.moves.cPickle as pickle # noqa: N813
+from gi.repository.Gdk import SELECTION_CLIPBOARD, Display
+from gi.repository.GdkPixbuf import Colorspace, Pixbuf
+from gi.repository.GLib import GError
+from gi.repository.Gtk import (
+ Clipboard,
+ IconTheme,
+ Menu,
+ MenuItem,
+ RadioMenuItem,
+ SeparatorMenuItem,
+ SortType,
+)
+
+from deluge.common import PY2, get_pixmap, osx_check, windows_check
+
+log = logging.getLogger(__name__)
+
+
+def cmp(x, y):
+ """Replacement for built-in function cmp that was removed in Python 3.
+
+ Compare the two objects x and y and return an integer according to
+ the outcome. The return value is negative if x < y, zero if x == y
+ and strictly positive if x > y.
+ """
+
+ return (x > y) - (x < y)
+
+
+def create_blank_pixbuf(size=16):
+ pix = Pixbuf.new(Colorspace.RGB, True, 8, size, size)
+ pix.fill(0x0)
+ return pix
+
+
+def get_pixbuf(filename):
+ try:
+ return Pixbuf.new_from_file(get_pixmap(filename))
+ except GError as ex:
+ log.warning(ex)
+ return create_blank_pixbuf()
+
+
+# Status icons.. Create them from file only once to avoid constantly re-creating them.
+icon_downloading = get_pixbuf('downloading16.png')
+icon_seeding = get_pixbuf('seeding16.png')
+icon_inactive = get_pixbuf('inactive16.png')
+icon_alert = get_pixbuf('alert16.png')
+icon_queued = get_pixbuf('queued16.png')
+icon_checking = get_pixbuf('checking16.png')
+
+
+def get_pixbuf_at_size(filename, size):
+ if not os.path.isabs(filename):
+ filename = get_pixmap(filename)
+ try:
+ return Pixbuf.new_from_file_at_size(filename, size, size)
+ except GError as ex:
+ # Failed to load the pixbuf (Bad image file), so return a blank pixbuf.
+ log.warning(ex)
+ return create_blank_pixbuf(size)
+
+
+def get_logo(size):
+ """A Deluge logo.
+
+ Params:
+ size (int): Size of logo in pixels
+
+ Returns:
+ Pixbuf: deluge logo
+ """
+ filename = 'deluge.svg'
+ if windows_check():
+ filename = 'deluge.png'
+ return get_pixbuf_at_size(filename, size)
+
+
+def build_menu_radio_list(
+ value_list,
+ callback,
+ pref_value=None,
+ suffix=None,
+ show_notset=False,
+ notset_label='∞',
+ notset_lessthan=0,
+ show_other=False,
+):
+ """Build a menu with radio menu items from a list and connect them to the callback.
+
+ Params:
+ value_list [list]: List of values to build into a menu.
+ callback (function): The function to call when menu item is clicked.
+ pref_value (int): A preferred value to insert into value_list
+ suffix (str): Append a suffix the the menu items in value_list.
+ show_notset (bool): Show the unlimited menu item.
+ notset_label (str): The text for the unlimited menu item.
+ notset_lessthan (int): Activates the unlimited menu item if pref_value is less than this.
+ show_other (bool): Show the `Other` menu item.
+
+ The pref_value is what you would like to test for the default active radio item.
+
+ Returns:
+ Menu: The menu radio
+ """
+ menu = Menu()
+ # Create menuitem to prevent unwanted toggled callback when creating menu.
+ menuitem = RadioMenuItem()
+ group = menuitem.get_group()
+
+ if pref_value > -1 and pref_value not in value_list:
+ value_list.pop()
+ value_list.append(pref_value)
+
+ for value in sorted(value_list):
+ item_text = str(value)
+ if suffix:
+ item_text += ' ' + suffix
+ menuitem = RadioMenuItem.new_with_label(group, item_text)
+ if pref_value and value == pref_value:
+ menuitem.set_active(True)
+ if callback:
+ menuitem.connect('toggled', callback)
+ menu.append(menuitem)
+
+ if show_notset:
+ menuitem = RadioMenuItem.new_with_label(group, notset_label)
+ menuitem.set_name('unlimited')
+ if pref_value and pref_value < notset_lessthan:
+ menuitem.set_active(True)
+ menuitem.connect('toggled', callback)
+ menu.append(menuitem)
+
+ if show_other:
+ menuitem = SeparatorMenuItem()
+ menu.append(menuitem)
+ menuitem = MenuItem.new_with_label(_('Other...'))
+ menuitem.set_name('other')
+ menuitem.connect('activate', callback)
+ menu.append(menuitem)
+
+ return menu
+
+
+def reparent_iter(treestore, itr, parent, move_siblings=False):
+ """
+ This effectively moves itr plus it's children to be a child of parent in treestore
+
+ Params:
+ treestore (gtkTreeStore): the treestore
+ itr (gtkTreeIter): the iter to move
+ parent (gtkTreeIter): the new parent for itr
+ move_siblings (bool): if True, it will move all itr's siblings to parent
+ """
+ src = itr
+
+ def move_children(i, dest):
+ while i:
+ n_cols = treestore.append(
+ dest, treestore.get(i, *range(treestore.get_n_columns()))
+ )
+ to_remove = i
+ if treestore.iter_children(i):
+ move_children(treestore.iter_children(i), n_cols)
+ if not move_siblings and i == src:
+ i = None
+ else:
+ i = treestore.iter_next(i)
+
+ treestore.remove(to_remove)
+
+ move_children(itr, parent)
+
+
+def get_deluge_icon():
+ """The deluge icon for use in dialogs.
+
+ It will first attempt to get the icon from the theme and will fallback to using an image
+ that is distributed with the package.
+
+ Returns:
+ Pixbuf: the deluge icon
+ """
+ if windows_check():
+ return get_logo(32)
+ else:
+ try:
+ icon_theme = IconTheme.get_default()
+ return icon_theme.load_icon('deluge', 64, 0)
+ except GError:
+ return get_logo(64)
+
+
+def associate_magnet_links(overwrite=False):
+ """
+ Associates magnet links to Deluge.
+
+ Params:
+ overwrite (bool): if this is True, the current setting will be overwritten
+
+ Returns:
+ bool: True if association was set
+ """
+
+ if windows_check():
+ try:
+ import winreg
+ except ImportError:
+ import _winreg as winreg # For Python 2.
+
+ try:
+ hkey = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, 'Magnet')
+ except WindowsError:
+ overwrite = True
+ else:
+ winreg.CloseKey(hkey)
+
+ if overwrite:
+ deluge_exe = os.path.join(os.path.dirname(sys.executable), 'deluge.exe')
+ try:
+ magnet_key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, 'Magnet')
+ except WindowsError:
+ # Could not create for all users, falling back to current user
+ magnet_key = winreg.CreateKey(
+ winreg.HKEY_CURRENT_USER, 'Software\\Classes\\Magnet'
+ )
+
+ winreg.SetValue(magnet_key, '', winreg.REG_SZ, 'URL:Magnet Protocol')
+ winreg.SetValueEx(magnet_key, 'URL Protocol', 0, winreg.REG_SZ, '')
+ winreg.SetValueEx(magnet_key, 'BrowserFlags', 0, winreg.REG_DWORD, 0x8)
+ winreg.SetValue(
+ magnet_key, 'DefaultIcon', winreg.REG_SZ, '{},0'.format(deluge_exe)
+ )
+ winreg.SetValue(
+ magnet_key,
+ r'shell\open\command',
+ winreg.REG_SZ,
+ '"{}" "%1"'.format(deluge_exe),
+ )
+ winreg.CloseKey(magnet_key)
+
+ # Don't try associate magnet on OSX see: #2420
+ elif not osx_check():
+ # gconf method is only available in a GNOME environment
+ try:
+ import gi
+
+ gi.require_version('GConf', '2.0')
+ from gi.repository import GConf
+ except ValueError:
+ log.debug(
+ 'gconf not available, so will not attempt to register magnet uri handler'
+ )
+ return False
+ else:
+ key = '/desktop/gnome/url-handlers/magnet/command'
+ gconf_client = GConf.Client.get_default()
+ if (gconf_client.get(key) and overwrite) or not gconf_client.get(key):
+ # We are either going to overwrite the key, or do it if it hasn't been set yet
+ if gconf_client.set_string(key, 'deluge "%s"'):
+ gconf_client.set_bool(
+ '/desktop/gnome/url-handlers/magnet/needs_terminal', False
+ )
+ gconf_client.set_bool(
+ '/desktop/gnome/url-handlers/magnet/enabled', True
+ )
+ log.info('Deluge registered as default magnet uri handler!')
+ return True
+ else:
+ log.error(
+ 'Unable to register Deluge as default magnet uri handler.'
+ )
+ return False
+ return False
+
+
+def save_pickled_state_file(filename, state):
+ """Save a file in the config directory and creates a backup
+
+ Params:
+ filename (str): Filename to be saved to config
+ state (state): The data to be pickled and written to file
+ """
+ from deluge.configmanager import get_config_dir
+
+ filepath = os.path.join(get_config_dir(), 'gtk3ui_state', filename)
+ filepath_bak = filepath + '.bak'
+ filepath_tmp = filepath + '.tmp'
+
+ try:
+ if os.path.isfile(filepath):
+ log.debug('Creating backup of %s at: %s', filename, filepath_bak)
+ shutil.copy2(filepath, filepath_bak)
+ except IOError as ex:
+ log.error('Unable to backup %s to %s: %s', filepath, filepath_bak, ex)
+ else:
+ log.info('Saving the %s at: %s', filename, filepath)
+ try:
+ with open(filepath_tmp, 'wb') as _file:
+ # Pickle the state object
+ pickle.dump(state, _file, protocol=2)
+ _file.flush()
+ os.fsync(_file.fileno())
+ shutil.move(filepath_tmp, filepath)
+ except (IOError, EOFError, pickle.PicklingError) as ex:
+ log.error('Unable to save %s: %s', filename, ex)
+ if os.path.isfile(filepath_bak):
+ log.info('Restoring backup of %s from: %s', filename, filepath_bak)
+ shutil.move(filepath_bak, filepath)
+
+
+def load_pickled_state_file(filename):
+ """Loads a file from the config directory, attempting backup if original fails to load.
+
+ Params:
+ filename (str): Filename to be loaded from config
+
+ Returns:
+ state: the unpickled state
+ """
+ from deluge.configmanager import get_config_dir
+
+ filepath = os.path.join(get_config_dir(), 'gtk3ui_state', filename)
+ filepath_bak = filepath + '.bak'
+
+ for _filepath in (filepath, filepath_bak):
+ log.info('Opening %s for load: %s', filename, _filepath)
+ try:
+ with open(_filepath, 'rb') as _file:
+ if PY2:
+ state = pickle.load(_file)
+ else:
+ state = pickle.load(_file, encoding='utf8')
+ except (IOError, pickle.UnpicklingError) as ex:
+ log.warning('Unable to load %s: %s', _filepath, ex)
+ else:
+ log.info('Successfully loaded %s: %s', filename, _filepath)
+ return state
+
+
+@contextlib.contextmanager
+def listview_replace_treestore(listview):
+ """Prepare a listview's treestore to be entirely replaced.
+
+ Params:
+ listview: a listview backed by a treestore
+ """
+ # From http://faq.pygtk.org/index.py?req=show&file=faq13.043.htp
+ # "tips for improving performance when adding many rows to a Treeview"
+ listview.freeze_child_notify()
+ treestore = listview.get_model()
+ listview.set_model(None)
+ treestore.clear()
+ treestore.set_default_sort_func(lambda *args: 0)
+ original_sort = treestore.get_sort_column_id()
+ treestore.set_sort_column_id(-1, SortType.ASCENDING)
+
+ yield
+
+ if original_sort != (None, None):
+ treestore.set_sort_column_id(*original_sort)
+
+ listview.set_model(treestore)
+ listview.thaw_child_notify()
+
+
+def get_clipboard_text():
+ text = (
+ Clipboard.get(selection=SELECTION_CLIPBOARD).wait_for_text()
+ or Clipboard.get().wait_for_text()
+ )
+ if text:
+ return text.strip()
+
+
+def windowing(like):
+ return like.lower() in str(type(Display.get_default())).lower()
diff --git a/deluge/ui/gtk3/connectionmanager.py b/deluge/ui/gtk3/connectionmanager.py
new file mode 100644
index 0000000..d5883c4
--- /dev/null
+++ b/deluge/ui/gtk3/connectionmanager.py
@@ -0,0 +1,568 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+from socket import gaierror, gethostbyname
+
+from gi.repository import Gtk
+from twisted.internet import defer, reactor
+
+import deluge.component as component
+from deluge.common import resource_filename, windows_check
+from deluge.configmanager import ConfigManager, get_config_dir
+from deluge.error import AuthenticationRequired, BadLoginError, IncompatibleClient
+from deluge.ui.client import Client, client
+from deluge.ui.hostlist import DEFAULT_PORT, LOCALHOST, HostList
+
+from .common import get_clipboard_text
+from .dialogs import AuthenticationDialog, ErrorDialog
+
+try:
+ from urllib.parse import urlparse
+except ImportError:
+ # PY2 fallback
+ from urlparse import urlparse # pylint: disable=ungrouped-imports
+
+log = logging.getLogger(__name__)
+
+HOSTLIST_COL_ID = 0
+HOSTLIST_COL_HOST = 1
+HOSTLIST_COL_PORT = 2
+HOSTLIST_COL_USER = 3
+HOSTLIST_COL_PASS = 4
+HOSTLIST_COL_STATUS = 5
+HOSTLIST_COL_VERSION = 6
+HOSTLIST_COL_STATUS_I18N = 7
+
+HOSTLIST_ICONS = {
+ 'offline': 'action-unavailable-symbolic',
+ 'online': 'network-server-symbolic',
+ 'connected': 'network-transmit-receive-symbolic',
+}
+STATUS_I18N = {
+ 'offline': _('Offline'),
+ 'online': _('Online'),
+ 'connected': _('Connected'),
+}
+
+
+def cell_render_host(column, cell, model, row, data):
+ host, port, username = model.get(row, *data)
+ text = host + ':' + str(port)
+ if username:
+ text = username + '@' + text
+ cell.set_property('text', text)
+
+
+def cell_render_status_icon(column, cell, model, row, data):
+ status = model[row][data]
+ status = status if status else 'offline'
+ icon_name = HOSTLIST_ICONS.get(status, None)
+ cell.set_property('icon-name', icon_name)
+
+
+class ConnectionManager(component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'ConnectionManager')
+ self.gtkui_config = ConfigManager('gtk3ui.conf')
+ self.hostlist = HostList()
+ self.running = False
+
+ # Component overrides
+ def start(self):
+ pass
+
+ def stop(self):
+ # Close this dialog when we are shutting down
+ if self.running:
+ self.connection_manager.response(Gtk.ResponseType.CLOSE)
+
+ def shutdown(self):
+ pass
+
+ # Public methods
+ def show(self):
+ """Show the ConnectionManager dialog."""
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(
+ resource_filename(
+ __package__, os.path.join('glade', 'connection_manager.ui')
+ )
+ )
+ self.connection_manager = self.builder.get_object('connection_manager')
+ self.connection_manager.set_transient_for(component.get('MainWindow').window)
+
+ # Setup the hostlist liststore and treeview
+ self.treeview = self.builder.get_object('treeview_hostlist')
+ self.treeview.set_tooltip_column(HOSTLIST_COL_STATUS_I18N)
+ self.liststore = self.builder.get_object('liststore_hostlist')
+
+ render = Gtk.CellRendererPixbuf()
+ column = Gtk.TreeViewColumn(_('Status'), render)
+ column.set_cell_data_func(render, cell_render_status_icon, HOSTLIST_COL_STATUS)
+ self.treeview.append_column(column)
+
+ render = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn(_('Host'), render, text=HOSTLIST_COL_HOST)
+ host_data = (HOSTLIST_COL_HOST, HOSTLIST_COL_PORT, HOSTLIST_COL_USER)
+ column.set_cell_data_func(render, cell_render_host, host_data)
+ column.set_expand(True)
+ self.treeview.append_column(column)
+
+ column = Gtk.TreeViewColumn(
+ _('Version'), Gtk.CellRendererText(), text=HOSTLIST_COL_VERSION
+ )
+ self.treeview.append_column(column)
+
+ # Load any saved host entries
+ self._load_liststore()
+ # Set widgets to values from gtkui config.
+ self._load_widget_config()
+ self._update_widget_buttons()
+
+ # Connect the signals to the handlers
+ self.builder.connect_signals(self)
+ self.treeview.get_selection().connect(
+ 'changed', self.on_hostlist_selection_changed
+ )
+
+ # Set running True before update status call.
+ self.running = True
+
+ if windows_check():
+ # Call to simulate() required to workaround showing daemon status (see #2813)
+ reactor.simulate()
+ self._update_host_status()
+
+ # Trigger the on_selection_changed code and select the first host if possible
+ self.treeview.get_selection().unselect_all()
+ if len(self.liststore):
+ self.treeview.get_selection().select_path(0)
+
+ # Run the dialog
+ self.connection_manager.run()
+
+ # Dialog closed so cleanup.
+ self.running = False
+ self.connection_manager.destroy()
+ del self.builder
+ del self.connection_manager
+ del self.liststore
+ del self.treeview
+
+ def _load_liststore(self):
+ """Load saved host entries"""
+ for host_entry in self.hostlist.get_hosts_info():
+ host_id, host, port, username = host_entry
+ self.liststore.append([host_id, host, port, username, '', '', '', ''])
+
+ def _load_widget_config(self):
+ """Set the widgets to show the correct options from the config."""
+ self.builder.get_object('chk_autoconnect').set_active(
+ self.gtkui_config['autoconnect']
+ )
+ self.builder.get_object('chk_autostart').set_active(
+ self.gtkui_config['autostart_localhost']
+ )
+ self.builder.get_object('chk_donotshow').set_active(
+ not self.gtkui_config['show_connection_manager_on_start']
+ )
+
+ def _update_host_status(self):
+ """Updates the host status"""
+ if not self.running:
+ # Callback likely fired after the window closed.
+ return
+
+ def on_host_status(status_info, row):
+ if self.running and row:
+ status = status_info[1].lower()
+ row[HOSTLIST_COL_STATUS] = status
+ row[HOSTLIST_COL_STATUS_I18N] = STATUS_I18N[status]
+ row[HOSTLIST_COL_VERSION] = status_info[2]
+ self._update_widget_buttons()
+
+ deferreds = []
+ for row in self.liststore:
+ host_id = row[HOSTLIST_COL_ID]
+ d = self.hostlist.get_host_status(host_id)
+ try:
+ d.addCallback(on_host_status, row)
+ except AttributeError:
+ on_host_status(d, row)
+ else:
+ deferreds.append(d)
+ defer.DeferredList(deferreds)
+
+ def _update_widget_buttons(self):
+ """Updates the dialog button states."""
+ self.builder.get_object('button_refresh').set_sensitive(len(self.liststore))
+ self.builder.get_object('button_startdaemon').set_sensitive(False)
+ self.builder.get_object('button_connect').set_sensitive(False)
+ self.builder.get_object('button_connect').set_label(_('C_onnect'))
+ self.builder.get_object('button_edithost').set_sensitive(False)
+ self.builder.get_object('button_removehost').set_sensitive(False)
+ self.builder.get_object('button_startdaemon').set_sensitive(False)
+ self.builder.get_object('image_startdaemon').set_from_icon_name(
+ 'system-run-symbolic', Gtk.IconSize.BUTTON
+ )
+ self.builder.get_object('label_startdaemon').set_text_with_mnemonic(
+ _('_Start Daemon')
+ )
+
+ model, row = self.treeview.get_selection().get_selected()
+ if row:
+ self.builder.get_object('button_edithost').set_sensitive(True)
+ self.builder.get_object('button_removehost').set_sensitive(True)
+ else:
+ return
+
+ # Get selected host info.
+ __, host, port, __, __, status, __, __ = model[row]
+
+ try:
+ gethostbyname(host)
+ except gaierror as ex:
+ log.error(
+ 'Error resolving host %s to ip: %s', row[HOSTLIST_COL_HOST], ex.args[1]
+ )
+ self.builder.get_object('button_connect').set_sensitive(False)
+ return
+
+ log.debug('Host Status: %s, %s', host, status)
+
+ # Check to see if the host is online
+ if status == 'connected' or status == 'online':
+ self.builder.get_object('button_connect').set_sensitive(True)
+ self.builder.get_object('image_startdaemon').set_from_icon_name(
+ 'process-stop-symbolic', Gtk.IconSize.MENU
+ )
+ self.builder.get_object('label_startdaemon').set_text_with_mnemonic(
+ _('_Stop Daemon')
+ )
+ self.builder.get_object('button_startdaemon').set_sensitive(False)
+ if status == 'connected':
+ # Display a disconnect button if we're connected to this host
+ self.builder.get_object('button_connect').set_label(_('_Disconnect'))
+ self.builder.get_object('button_removehost').set_sensitive(False)
+ # Currently can only stop daemon when connected to it
+ self.builder.get_object('button_startdaemon').set_sensitive(True)
+ elif host in LOCALHOST:
+ # If localhost we can start the dameon.
+ self.builder.get_object('button_startdaemon').set_sensitive(True)
+
+ def start_daemon(self, port, config):
+ """Attempts to start local daemon process and will show an ErrorDialog if not.
+
+ Args:
+ port (int): Port for the daemon to listen on.
+ config (str): Config path to pass to daemon.
+
+ Returns:
+ bool: True is successfully started the daemon, False otherwise.
+
+ """
+ if client.start_daemon(port, config):
+ log.debug('Localhost daemon started')
+ reactor.callLater(1, self._update_host_status)
+ return True
+ else:
+ ErrorDialog(
+ _('Unable to start daemon!'),
+ _('Check deluged package is installed and logs for further details'),
+ ).run()
+ return False
+
+ # Signal handlers
+ def _connect(self, host_id, username=None, password=None, try_counter=0):
+ def do_connect(result, username=None, password=None, *args):
+ log.debug('Attempting to connect to daemon...')
+ for host_entry in self.hostlist.config['hosts']:
+ if host_entry[0] == host_id:
+ __, host, port, host_user, host_pass = host_entry
+
+ username = username if username else host_user
+ password = password if password else host_pass
+
+ d = client.connect(host, port, username, password)
+ d.addCallback(self._on_connect, host_id)
+ d.addErrback(self._on_connect_fail, host_id, try_counter)
+ return d
+
+ if client.connected():
+ return client.disconnect().addCallback(do_connect, username, password)
+ else:
+ return do_connect(None, username, password)
+
+ def _on_connect(self, daemon_info, host_id):
+ log.debug('Connected to daemon: %s', host_id)
+ if self.gtkui_config['autoconnect']:
+ self.gtkui_config['autoconnect_host_id'] = host_id
+ if self.running:
+ # When connected to a client, and then trying to connect to another,
+ # this component will be stopped(while the connect deferred is
+ # running), so, self.connection_manager will be deleted.
+ # If that's not the case, close the dialog.
+ self.connection_manager.response(Gtk.ResponseType.OK)
+ component.start()
+
+ def _on_connect_fail(self, reason, host_id, try_counter):
+ log.debug('Failed to connect: %s', reason.value)
+
+ if reason.check(AuthenticationRequired, BadLoginError):
+ log.debug('PasswordRequired exception')
+ dialog = AuthenticationDialog(reason.value.message, reason.value.username)
+
+ def dialog_finished(response_id):
+ if response_id == Gtk.ResponseType.OK:
+ self._connect(host_id, dialog.get_username(), dialog.get_password())
+
+ return dialog.run().addCallback(dialog_finished)
+
+ elif reason.check(IncompatibleClient):
+ return ErrorDialog(_('Incompatible Client'), reason.value.message).run()
+
+ if try_counter:
+ log.info('Retrying connection.. Retries left: %s', try_counter)
+ return reactor.callLater(
+ 0.5, self._connect, host_id, try_counter=try_counter - 1
+ )
+
+ msg = str(reason.value)
+ if not self.gtkui_config['autostart_localhost']:
+ msg += '\n' + _(
+ 'Auto-starting the daemon locally is not enabled. '
+ 'See "Options" on the "Connection Manager".'
+ )
+ ErrorDialog(_('Failed To Connect'), msg).run()
+
+ def on_button_connect_clicked(self, widget=None):
+ """Button handler for connect to or disconnect from daemon."""
+ model, row = self.treeview.get_selection().get_selected()
+ if not row:
+ return
+
+ host_id, host, port, __, __, status, __, __ = model[row]
+ # If status is connected then connect button disconnects instead.
+ if status == 'connected':
+
+ def on_disconnect(reason):
+ self._update_host_status()
+
+ return client.disconnect().addCallback(on_disconnect)
+
+ try_counter = 0
+ auto_start = self.builder.get_object('chk_autostart').get_active()
+ if auto_start and host in LOCALHOST and status == 'offline':
+ # Start the local daemon and then connect with retries set.
+ if self.start_daemon(port, get_config_dir()):
+ try_counter = 6
+ else:
+ # Don't attempt to connect to offline daemon.
+ return
+
+ self._connect(host_id, try_counter=try_counter)
+
+ def on_button_close_clicked(self, widget):
+ self.connection_manager.response(Gtk.ResponseType.CLOSE)
+
+ def _run_addhost_dialog(self, edit_host_info=None):
+ """Create and runs the add host dialog.
+
+ Supplying edit_host_info changes the dialog to an edit dialog.
+
+ Args:
+ edit_host_info (list): A list of (host, port, user, pass) to edit.
+
+ Returns:
+ list: The new host info values (host, port, user, pass).
+
+ """
+ self.builder.add_from_file(
+ resource_filename(
+ __package__, os.path.join('glade', 'connection_manager.addhost.ui')
+ )
+ )
+ dialog = self.builder.get_object('addhost_dialog')
+ dialog.set_transient_for(self.connection_manager)
+ hostname_entry = self.builder.get_object('entry_hostname')
+ port_spinbutton = self.builder.get_object('spinbutton_port')
+ username_entry = self.builder.get_object('entry_username')
+ password_entry = self.builder.get_object('entry_password')
+
+ if edit_host_info:
+ dialog.set_title(_('Edit Host'))
+ hostname_entry.set_text(edit_host_info[0])
+ port_spinbutton.set_value(edit_host_info[1])
+ username_entry.set_text(edit_host_info[2])
+ password_entry.set_text(edit_host_info[3])
+
+ response = dialog.run()
+ new_host_info = []
+ if response:
+ new_host_info.append(hostname_entry.get_text())
+ new_host_info.append(port_spinbutton.get_value_as_int())
+ new_host_info.append(username_entry.get_text())
+ new_host_info.append(password_entry.get_text())
+
+ dialog.destroy()
+ return new_host_info
+
+ def on_button_addhost_clicked(self, widget):
+ log.debug('on_button_addhost_clicked')
+ host_info = self._run_addhost_dialog()
+ if host_info:
+ hostname, port, username, password = host_info
+ try:
+ host_id = self.hostlist.add_host(hostname, port, username, password)
+ except ValueError as ex:
+ ErrorDialog(_('Error Adding Host'), ex).run()
+ else:
+ status = 'offline'
+ version = ''
+ self.liststore.append(
+ [
+ host_id,
+ hostname,
+ port,
+ username,
+ password,
+ status,
+ version,
+ STATUS_I18N[status],
+ ]
+ )
+ self._update_host_status()
+
+ def on_button_edithost_clicked(self, widget=None):
+ log.debug('on_button_edithost_clicked')
+ model, row = self.treeview.get_selection().get_selected()
+ status = model[row][HOSTLIST_COL_STATUS]
+ host_id = model[row][HOSTLIST_COL_ID]
+ host_info = [
+ self.liststore[row][HOSTLIST_COL_HOST],
+ self.liststore[row][HOSTLIST_COL_PORT],
+ self.liststore[row][HOSTLIST_COL_USER],
+ self.liststore[row][HOSTLIST_COL_PASS],
+ ]
+
+ new_host_info = self._run_addhost_dialog(edit_host_info=host_info)
+ if new_host_info:
+ hostname, port, username, password = new_host_info
+ try:
+ self.hostlist.update_host(host_id, hostname, port, username, password)
+ except ValueError as ex:
+ ErrorDialog(_('Error Updating Host'), ex).run()
+ else:
+ self.liststore[row] = (
+ host_id,
+ hostname,
+ port,
+ username,
+ password,
+ '',
+ '',
+ '',
+ )
+ self._update_host_status()
+
+ if status == 'connected':
+
+ def on_disconnect(reason):
+ self._update_host_status()
+
+ client.disconnect().addCallback(on_disconnect)
+
+ def on_button_removehost_clicked(self, widget):
+ log.debug('on_button_removehost_clicked')
+ # Get the selected rows
+ model, row = self.treeview.get_selection().get_selected()
+ self.hostlist.remove_host(model[row][HOSTLIST_COL_ID])
+ self.liststore.remove(row)
+ # Update the hostlist
+ self._update_host_status()
+
+ def on_button_startdaemon_clicked(self, widget):
+ log.debug('on_button_startdaemon_clicked')
+ if not self.liststore.iter_n_children(None):
+ # There is nothing in the list, so lets create a localhost entry
+ try:
+ self.hostlist.add_default_host()
+ except ValueError as ex:
+ log.error('Error adding default host: %s', ex)
+ else:
+ self.start_daemon(DEFAULT_PORT, get_config_dir())
+ finally:
+ return
+
+ paths = self.treeview.get_selection().get_selected_rows()[1]
+ if len(paths):
+ __, host, port, user, password, status, __, __ = self.liststore[paths[0]]
+ else:
+ return
+
+ if host not in LOCALHOST:
+ return
+
+ def on_daemon_status_change(result):
+ """Daemon start/stop callback"""
+ reactor.callLater(0.7, self._update_host_status)
+
+ if status in ('online', 'connected'):
+ # Button will stop the daemon if status is online or connected.
+ def on_connect(d, c):
+ """Client callback to call daemon shutdown"""
+ c.daemon.shutdown().addCallback(on_daemon_status_change)
+
+ if client.connected() and (host, port, user) == client.connection_info():
+ client.daemon.shutdown().addCallback(on_daemon_status_change)
+ elif user and password:
+ c = Client()
+ c.connect(host, port, user, password).addCallback(on_connect, c)
+ else:
+ # Otherwise button will start the daemon.
+ self.start_daemon(port, get_config_dir())
+
+ def on_button_refresh_clicked(self, widget):
+ self._update_host_status()
+
+ def on_hostlist_row_activated(self, tree, path, view_column):
+ self.on_button_connect_clicked()
+
+ def on_hostlist_selection_changed(self, treeselection):
+ self._update_widget_buttons()
+
+ def on_chk_toggled(self, widget):
+ self.gtkui_config['autoconnect'] = self.builder.get_object(
+ 'chk_autoconnect'
+ ).get_active()
+ self.gtkui_config['autostart_localhost'] = self.builder.get_object(
+ 'chk_autostart'
+ ).get_active()
+ self.gtkui_config[
+ 'show_connection_manager_on_start'
+ ] = not self.builder.get_object('chk_donotshow').get_active()
+
+ def on_entry_host_paste_clipboard(self, widget):
+ text = get_clipboard_text()
+ log.debug('on_entry_proxy_host_paste-clipboard: got paste: %s', text)
+ text = text if '//' in text else '//' + text
+ parsed = urlparse(text)
+ if parsed.hostname:
+ widget.set_text(parsed.hostname)
+ widget.emit_stop_by_name('paste-clipboard')
+ if parsed.port:
+ self.builder.get_object('spinbutton_port').set_value(parsed.port)
+ if parsed.username:
+ self.builder.get_object('entry_username').set_text(parsed.username)
+ if parsed.password:
+ self.builder.get_object('entry_password').set_text(parsed.password)
diff --git a/deluge/ui/gtk3/createtorrentdialog.py b/deluge/ui/gtk3/createtorrentdialog.py
new file mode 100644
index 0000000..1e5e73c
--- /dev/null
+++ b/deluge/ui/gtk3/createtorrentdialog.py
@@ -0,0 +1,520 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import logging
+import os.path
+from base64 import b64encode
+
+from gi.repository import Gtk
+from gi.repository.GObject import TYPE_UINT64, idle_add
+from twisted.internet.threads import deferToThread
+
+import deluge.component as component
+from deluge.common import decode_bytes, get_path_size, is_url, resource_filename
+from deluge.configmanager import ConfigManager
+from deluge.ui.client import client
+
+from .edittrackersdialog import (
+ last_tier_trackers_from_liststore,
+ trackers_tiers_from_text,
+)
+from .torrentview_data_funcs import cell_data_size
+
+log = logging.getLogger(__name__)
+
+
+class CreateTorrentDialog(object):
+ def __init__(self):
+ pass
+
+ def show(self):
+ self.builder = Gtk.Builder()
+
+ ui_filenames = [
+ 'create_torrent_dialog.ui',
+ 'create_torrent_dialog.remote_path.ui',
+ 'create_torrent_dialog.remote_save.ui',
+ 'create_torrent_dialog.progress.ui',
+ ]
+ for filename in ui_filenames:
+ self.builder.add_from_file(
+ resource_filename(__package__, os.path.join('glade', filename))
+ )
+
+ self.config = ConfigManager('gtk3ui.conf')
+
+ self.dialog = self.builder.get_object('create_torrent_dialog')
+ self.dialog.set_transient_for(component.get('MainWindow').window)
+
+ self.builder.connect_signals(self)
+
+ # path, icon, size
+ self.files_treestore = Gtk.TreeStore(str, str, TYPE_UINT64)
+
+ column = Gtk.TreeViewColumn(_('Filename'))
+ render = Gtk.CellRendererPixbuf()
+ column.pack_start(render, False)
+ column.add_attribute(render, 'icon-name', 1)
+ render = Gtk.CellRendererText()
+ column.pack_start(render, True)
+ column.add_attribute(render, 'text', 0)
+ column.set_expand(True)
+ self.builder.get_object('treeview_files').append_column(column)
+
+ column = Gtk.TreeViewColumn(_('Size'))
+ render = Gtk.CellRendererText()
+ column.pack_start(render, True)
+ column.set_cell_data_func(render, cell_data_size, 2)
+ self.builder.get_object('treeview_files').append_column(column)
+
+ self.builder.get_object('treeview_files').set_model(self.files_treestore)
+ self.builder.get_object('treeview_files').set_show_expanders(False)
+
+ # tier, url
+ self.trackers_liststore = Gtk.ListStore(int, str)
+
+ self.builder.get_object('tracker_treeview').append_column(
+ Gtk.TreeViewColumn(_('Tier'), Gtk.CellRendererText(), text=0)
+ )
+ self.builder.get_object('tracker_treeview').append_column(
+ Gtk.TreeViewColumn(_('Tracker'), Gtk.CellRendererText(), text=1)
+ )
+
+ self.builder.get_object('tracker_treeview').set_model(self.trackers_liststore)
+ self.trackers_liststore.set_sort_column_id(0, Gtk.SortType.ASCENDING)
+
+ if not client.is_localhost() and client.connected():
+ self.builder.get_object('button_remote_path').show()
+ else:
+ self.builder.get_object('button_remote_path').hide()
+
+ self.dialog.show()
+
+ def parse_piece_size_text(self, value):
+ psize, metric = value.split()
+ psize = int(psize)
+ if psize < 32:
+ # This is a MiB value
+ psize = psize * 1024 * 1024
+ else:
+ # This is a KiB value
+ psize = psize * 1024
+
+ return psize
+
+ def adjust_piece_size(self):
+ """Adjusts the recommended piece based on the file/folder/path selected."""
+ size = self.files_treestore[0][2]
+ model = self.builder.get_object('combo_piece_size').get_model()
+ for index, value in enumerate(model):
+ psize = self.parse_piece_size_text(value[0])
+ pieces = size // psize
+ if pieces < 2048 or (index + 1) == len(model):
+ self.builder.get_object('combo_piece_size').set_active(index)
+ break
+
+ def on_button_file_clicked(self, widget):
+ log.debug('on_button_file_clicked')
+ # Setup the filechooserdialog
+ chooser = Gtk.FileChooserDialog(
+ _('Choose a file'),
+ self.dialog,
+ Gtk.FileChooserAction.OPEN,
+ buttons=(
+ _('_Cancel'),
+ Gtk.ResponseType.CANCEL,
+ _('_Open'),
+ Gtk.ResponseType.OK,
+ ),
+ )
+
+ chooser.set_transient_for(self.dialog)
+ chooser.set_select_multiple(False)
+ chooser.set_property('skip-taskbar-hint', True)
+
+ # Run the dialog
+ response = chooser.run()
+
+ if response == Gtk.ResponseType.OK:
+ result = chooser.get_filename()
+ else:
+ chooser.destroy()
+ return
+
+ path = decode_bytes(result)
+
+ self.files_treestore.clear()
+ self.files_treestore.append(
+ None, [result, 'text-x-generic-symbolic', get_path_size(path)]
+ )
+ self.adjust_piece_size()
+ chooser.destroy()
+
+ def on_button_folder_clicked(self, widget):
+ log.debug('on_button_folder_clicked')
+ # Setup the filechooserdialog
+ chooser = Gtk.FileChooserDialog(
+ _('Choose a folder'),
+ self.dialog,
+ Gtk.FileChooserAction.SELECT_FOLDER,
+ buttons=(
+ _('_Cancel'),
+ Gtk.ResponseType.CANCEL,
+ _('_Open'),
+ Gtk.ResponseType.OK,
+ ),
+ )
+
+ chooser.set_transient_for(self.dialog)
+ chooser.set_select_multiple(False)
+ chooser.set_property('skip-taskbar-hint', True)
+ # Run the dialog
+ response = chooser.run()
+
+ if response == Gtk.ResponseType.OK:
+ result = chooser.get_filename()
+ else:
+ chooser.destroy()
+ return
+
+ path = decode_bytes(result)
+
+ self.files_treestore.clear()
+ self.files_treestore.append(
+ None, [result, 'document-open-symbolic', get_path_size(path)]
+ )
+ self.adjust_piece_size()
+ chooser.destroy()
+
+ def on_button_remote_path_clicked(self, widget):
+ log.debug('on_button_remote_path_clicked')
+ dialog = self.builder.get_object('remote_path_dialog')
+ entry = self.builder.get_object('entry_path')
+ dialog.set_transient_for(self.dialog)
+ entry.set_text('/')
+ entry.grab_focus()
+ response = dialog.run()
+
+ if response == Gtk.ResponseType.OK:
+ result = entry.get_text()
+
+ def _on_get_path_size(size):
+ log.debug('size: %s', size)
+ if size > 0:
+ self.files_treestore.clear()
+ self.files_treestore.append(
+ None, [result, 'network-workgroup-symbolic', size]
+ )
+ self.adjust_piece_size()
+
+ client.core.get_path_size(result).addCallback(_on_get_path_size)
+ client.force_call(True)
+
+ dialog.hide()
+
+ def on_button_cancel_clicked(self, widget):
+ log.debug('on_button_cancel_clicked')
+ self.dialog.destroy()
+
+ def on_button_save_clicked(self, widget):
+ log.debug('on_button_save_clicked')
+ if len(self.files_treestore) == 0:
+ return
+
+ # Get the path
+ path = self.files_treestore[0][0].rstrip('\\/')
+ torrent_filename = '%s.torrent' % os.path.split(path)[-1]
+
+ is_remote = 'network' in self.files_treestore[0][1]
+
+ if is_remote:
+ # This is a remote path
+ dialog = self.builder.get_object('remote_save_dialog')
+ dialog.set_transient_for(self.dialog)
+ dialog_save_path = self.builder.get_object('entry_save_path')
+ dialog_save_path.set_text(path + '.torrent')
+ response = dialog.run()
+ if response == Gtk.ResponseType.OK:
+ result = dialog_save_path.get_text()
+ else:
+ dialog.hide()
+ return
+ dialog.hide()
+ else:
+ # Setup the filechooserdialog
+ chooser = Gtk.FileChooserDialog(
+ _('Save .torrent file'),
+ self.dialog,
+ Gtk.FileChooserAction.SAVE,
+ buttons=(
+ _('_Cancel'),
+ Gtk.ResponseType.CANCEL,
+ _('_Save'),
+ Gtk.ResponseType.OK,
+ ),
+ )
+
+ chooser.set_transient_for(self.dialog)
+ chooser.set_select_multiple(False)
+ chooser.set_property('skip-taskbar-hint', True)
+
+ # Add .torrent and * file filters
+ file_filter = Gtk.FileFilter()
+ file_filter.set_name(_('Torrent files'))
+ file_filter.add_pattern('*.' + 'torrent')
+ chooser.add_filter(file_filter)
+ file_filter = Gtk.FileFilter()
+ file_filter.set_name(_('All files'))
+ file_filter.add_pattern('*')
+ chooser.add_filter(file_filter)
+
+ chooser.set_current_name(torrent_filename)
+ # Run the dialog
+ response = chooser.run()
+
+ if response == Gtk.ResponseType.OK:
+ result = chooser.get_filename()
+ else:
+ chooser.destroy()
+ return
+ chooser.destroy()
+
+ # Fix up torrent filename
+ if len(result) < 9:
+ result += '.torrent'
+ elif result[-8:] != '.torrent':
+ result += '.torrent'
+
+ # Get a list of trackers
+ trackers = []
+ if not len(self.trackers_liststore):
+ tracker = None
+ else:
+ # Create a list of lists [[tier0, ...], [tier1, ...], ...]
+ tier_dict = {}
+ for tier, tracker in self.trackers_liststore:
+ tier_dict.setdefault(tier, []).append(tracker)
+
+ trackers = [tier_dict[tier] for tier in sorted(tier_dict)]
+ # Get the first tracker in the first tier
+ tracker = trackers[0][0]
+
+ # Get a list of webseeds
+ textview_buf = self.builder.get_object('textview_webseeds').get_buffer()
+ lines = (
+ textview_buf.get_text(
+ *textview_buf.get_bounds(), include_hidden_chars=False
+ )
+ .strip()
+ .split('\n')
+ )
+ webseeds = []
+ for line in lines:
+ line = line.replace('\\', '/') # Fix any mistyped urls.
+ if is_url(line):
+ webseeds.append(line)
+ # Get the piece length in bytes
+ combo = self.builder.get_object('combo_piece_size')
+ piece_length = self.parse_piece_size_text(
+ combo.get_model()[combo.get_active()][0]
+ )
+
+ author = self.builder.get_object('entry_author').get_text()
+ comment = self.builder.get_object('entry_comments').get_text()
+ private = self.builder.get_object('chk_private_flag').get_active()
+ add_to_session = self.builder.get_object('chk_add_to_session').get_active()
+
+ if is_remote:
+
+ def torrent_created():
+ self.builder.get_object('progress_dialog').hide()
+ client.deregister_event_handler(
+ 'CreateTorrentProgressEvent', on_create_torrent_progress_event
+ )
+
+ def on_create_torrent_progress_event(piece_count, num_pieces):
+ self._on_create_torrent_progress(piece_count, num_pieces)
+ if piece_count == num_pieces:
+ from twisted.internet import reactor
+
+ reactor.callLater(0.5, torrent_created)
+
+ client.register_event_handler(
+ 'CreateTorrentProgressEvent', on_create_torrent_progress_event
+ )
+
+ client.core.create_torrent(
+ decode_bytes(path),
+ tracker,
+ piece_length,
+ comment,
+ decode_bytes(result),
+ webseeds,
+ private,
+ author,
+ trackers,
+ add_to_session,
+ )
+
+ else:
+
+ def hide_progress(result):
+ self.builder.get_object('progress_dialog').hide()
+
+ deferToThread(
+ self.create_torrent,
+ decode_bytes(path),
+ tracker,
+ piece_length,
+ self._on_create_torrent_progress,
+ comment,
+ decode_bytes(result),
+ webseeds,
+ private,
+ author,
+ trackers,
+ add_to_session,
+ ).addCallback(hide_progress)
+
+ # Setup progress dialog
+ self.builder.get_object('progress_dialog').set_transient_for(
+ component.get('MainWindow').window
+ )
+ self.builder.get_object('progress_dialog').show_all()
+
+ self.dialog.destroy()
+
+ def create_torrent(
+ self,
+ path,
+ tracker,
+ piece_length,
+ progress,
+ comment,
+ target,
+ webseeds,
+ private,
+ created_by,
+ trackers,
+ add_to_session,
+ ):
+ import deluge.metafile
+
+ deluge.metafile.make_meta_file(
+ path,
+ tracker,
+ piece_length,
+ progress=progress,
+ comment=comment,
+ target=target,
+ webseeds=webseeds,
+ private=private,
+ created_by=created_by,
+ trackers=trackers,
+ )
+
+ if add_to_session:
+ with open(target, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ client.core.add_torrent_file_async(
+ os.path.split(target)[-1],
+ filedump,
+ {'download_location': os.path.split(path)[0]},
+ )
+
+ def _on_create_torrent_progress(self, value, num_pieces):
+ percent = value / num_pieces
+
+ def update_pbar_with_gobject(percent):
+ pbar = self.builder.get_object('progressbar')
+ pbar.set_text('%.2f%%' % (percent * 100))
+ pbar.set_fraction(percent)
+ return False
+
+ if percent >= 0 and percent <= 1.0:
+ # Make sure there are no threads race conditions that can
+ # crash the UI while updating it.
+ idle_add(update_pbar_with_gobject, percent)
+
+ def on_button_up_clicked(self, widget):
+ log.debug('on_button_up_clicked')
+ row = (
+ self.builder.get_object('tracker_treeview')
+ .get_selection()
+ .get_selected()[1]
+ )
+ if row is None:
+ return
+ if self.trackers_liststore[row][0] == 0:
+ return
+ else:
+ self.trackers_liststore[row][0] -= 1
+
+ def on_button_down_clicked(self, widget):
+ log.debug('on_button_down_clicked')
+ row = (
+ self.builder.get_object('tracker_treeview')
+ .get_selection()
+ .get_selected()[1]
+ )
+ if row is None:
+ return
+ self.trackers_liststore[row][0] += 1
+
+ def on_button_add_clicked(self, widget):
+ log.debug('on_button_add_clicked')
+ builder = Gtk.Builder()
+ builder.add_from_file(
+ resource_filename(
+ __package__, os.path.join('glade', 'edit_trackers.add.ui')
+ )
+ )
+ dialog = builder.get_object('add_tracker_dialog')
+ dialog.set_transient_for(self.dialog)
+ textview = builder.get_object('textview_trackers')
+ if self.config['createtorrent.trackers']:
+ textview.get_buffer().set_text(
+ '\n'.join(self.config['createtorrent.trackers'])
+ )
+ else:
+ textview.get_buffer().set_text('')
+ textview.grab_focus()
+ response = dialog.run()
+
+ if response == Gtk.ResponseType.OK:
+ # Create a list of trackers from the textview buffer
+ textview_buf = textview.get_buffer()
+ trackers_text = textview_buf.get_text(
+ *textview_buf.get_bounds(), include_hidden_chars=False
+ )
+ log.debug('Create torrent tracker lines: %s', trackers_text)
+ self.config['createtorrent.trackers'] = trackers_text.split('/n')
+
+ # Append trackers liststore with unique trackers and tiers starting from last tier number.
+ last_tier, orig_trackers = last_tier_trackers_from_liststore(
+ self.trackers_liststore
+ )
+ for tracker, tier in trackers_tiers_from_text(trackers_text).items():
+ if tracker not in orig_trackers:
+ self.trackers_liststore.append([tier + last_tier, tracker])
+
+ dialog.destroy()
+
+ def on_button_remove_clicked(self, widget):
+ log.debug('on_button_remove_clicked')
+ row = (
+ self.builder.get_object('tracker_treeview')
+ .get_selection()
+ .get_selected()[1]
+ )
+ if row is None:
+ return
+ self.trackers_liststore.remove(row)
diff --git a/deluge/ui/gtk3/details_tab.py b/deluge/ui/gtk3/details_tab.py
new file mode 100644
index 0000000..2431e08
--- /dev/null
+++ b/deluge/ui/gtk3/details_tab.py
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+from xml.sax.saxutils import escape as xml_escape
+
+import deluge.component as component
+from deluge.common import decode_bytes, fdate, fsize, is_url
+
+from .tab_data_funcs import fdate_or_dash, fpieces_num_size
+from .torrentdetails import Tab
+
+log = logging.getLogger(__name__)
+
+
+class DetailsTab(Tab):
+ def __init__(self):
+ super(DetailsTab, self).__init__('Details', 'details_tab', 'details_tab_label')
+
+ self.add_tab_widget('summary_name', None, ('name',))
+ self.add_tab_widget('summary_total_size', fsize, ('total_size',))
+ self.add_tab_widget('summary_num_files', str, ('num_files',))
+ self.add_tab_widget('summary_completed', fdate_or_dash, ('completed_time',))
+ self.add_tab_widget('summary_date_added', fdate, ('time_added',))
+ self.add_tab_widget('summary_torrent_path', None, ('download_location',))
+ self.add_tab_widget('summary_hash', str, ('hash',))
+ self.add_tab_widget('summary_comments', str, ('comment',))
+ self.add_tab_widget('summary_creator', str, ('creator',))
+ self.add_tab_widget(
+ 'summary_pieces', fpieces_num_size, ('num_pieces', 'piece_length')
+ )
+
+ def update(self):
+ # Get the first selected torrent
+ selected = component.get('TorrentView').get_selected_torrents()
+
+ # Only use the first torrent in the list or return if None selected
+ if selected:
+ selected = selected[0]
+ else:
+ # No torrent is selected in the torrentview
+ self.clear()
+ return
+
+ session = component.get('SessionProxy')
+ session.get_torrent_status(selected, self.status_keys).addCallback(
+ self._on_get_torrent_status
+ )
+
+ def _on_get_torrent_status(self, status):
+ # Check to see if we got valid data from the core
+ if status is None:
+ return
+
+ # Update all the label widgets
+ for widget in self.tab_widgets.values():
+ txt = xml_escape(self.widget_status_as_fstr(widget, status))
+ if decode_bytes(widget.obj.get_text()) != txt:
+ if 'comment' in widget.status_keys and is_url(txt):
+ widget.obj.set_markup('<a href="%s">%s</a>' % (txt, txt))
+ else:
+ widget.obj.set_markup(txt)
+
+ def clear(self):
+ for widget in self.tab_widgets.values():
+ widget.obj.set_text('')
diff --git a/deluge/ui/gtk3/dialogs.py b/deluge/ui/gtk3/dialogs.py
new file mode 100644
index 0000000..5169ab4
--- /dev/null
+++ b/deluge/ui/gtk3/dialogs.py
@@ -0,0 +1,455 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+# pylint: disable=super-on-old-class
+
+from __future__ import unicode_literals
+
+from gi.repository import Gtk
+from twisted.internet import defer
+
+import deluge.component as component
+from deluge.common import windows_check
+
+from .common import get_deluge_icon, get_pixbuf_at_size
+
+
+class BaseDialog(Gtk.Dialog):
+ """
+ Base dialog class that should be used with all dialogs.
+ """
+
+ def __init__(self, header, text, icon, buttons, parent=None):
+ """
+ :param header: str, the header portion of the dialog
+ :param text: str, the text body of the dialog
+ :param icon: icon name from icon theme or icon filename.
+ :param buttons: tuple, of icon name and responses
+ :param parent: gtkWindow, the parent window, if None it will default to the
+ MainWindow
+ """
+ super(BaseDialog, self).__init__(
+ title=header,
+ parent=parent if parent else component.get('MainWindow').window,
+ flags=Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
+ buttons=buttons,
+ )
+
+ self.set_icon(get_deluge_icon())
+
+ self.connect('delete-event', self._on_delete_event)
+ self.connect('response', self._on_response)
+
+ # Setup all the formatting and such to make our dialog look pretty
+ self.set_border_width(5)
+ self.set_default_size(200, 100)
+ hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, spacing=5)
+ image = Gtk.Image()
+ if icon.endswith('.svg') or icon.endswith('.png'):
+ # Hack for Windows since it doesn't support svg
+ if icon.endswith('.svg') and windows_check():
+ icon = icon.rpartition('.svg')[0] + '16.png'
+ image.set_from_pixbuf(get_pixbuf_at_size(icon, 24))
+ else:
+ image.set_from_icon_name(icon, Gtk.IconSize.LARGE_TOOLBAR)
+ image.set_alignment(0.5, 0.0)
+ hbox.pack_start(image, False, False, 0)
+ vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, spacing=5)
+ tlabel = Gtk.Label(label=text)
+ tlabel.set_use_markup(True)
+ tlabel.set_line_wrap(True)
+ tlabel.set_alignment(0.0, 0.5)
+ vbox.pack_start(tlabel, False, False, 0)
+ hbox.pack_start(vbox, False, False, 0)
+ self.vbox.pack_start(hbox, False, False, 0)
+ self.vbox.set_spacing(5)
+ self.vbox.show_all()
+
+ def _on_delete_event(self, widget, event):
+ self.deferred.callback(Gtk.ResponseType.DELETE_EVENT)
+ self.destroy()
+
+ def _on_response(self, widget, response):
+ self.deferred.callback(response)
+ self.destroy()
+
+ def run(self):
+ """
+ Shows the dialog and returns a Deferred object. The deferred, when fired
+ will contain the response ID.
+ """
+ self.deferred = defer.Deferred()
+ self.show()
+ return self.deferred
+
+
+class YesNoDialog(BaseDialog):
+ """
+ Displays a dialog asking the user to select Yes or No to a question.
+
+ When run(), it will return either a Gtk.ResponseType.YES or a Gtk.ResponseType.NO.
+
+ """
+
+ def __init__(self, header, text, parent=None):
+ """
+ :param header: see `:class:BaseDialog`
+ :param text: see `:class:BaseDialog`
+ :param parent: see `:class:BaseDialog`
+ """
+ super(YesNoDialog, self).__init__(
+ header,
+ text,
+ 'dialog-question',
+ (_('_No'), Gtk.ResponseType.NO, _('_Yes'), Gtk.ResponseType.YES),
+ parent,
+ )
+
+
+class InformationDialog(BaseDialog):
+ """
+ Displays an information dialog.
+
+ When run(), it will return a Gtk.ResponseType.CLOSE.
+ """
+
+ def __init__(self, header, text, parent=None):
+ """
+ :param header: see `:class:BaseDialog`
+ :param text: see `:class:BaseDialog`
+ :param parent: see `:class:BaseDialog`
+ """
+ super(InformationDialog, self).__init__(
+ header,
+ text,
+ 'dialog-information',
+ (_('_Close'), Gtk.ResponseType.CLOSE),
+ parent,
+ )
+
+
+class ErrorDialog(BaseDialog):
+ """
+ Displays an error dialog with optional details text for more information.
+
+ When run(), it will return a Gtk.ResponseType.CLOSE.
+ """
+
+ def __init__(self, header, text, parent=None, details=None, traceback=False):
+ """
+ :param header: see `:class:BaseDialog`
+ :param text: see `:class:BaseDialog`
+ :param parent: see `:class:BaseDialog`
+ :param details: extra information that will be displayed in a
+ scrollable textview
+ :type details: string
+ :param traceback: show the traceback information in the details area
+ :type traceback: bool
+ """
+ super(ErrorDialog, self).__init__(
+ header, text, 'dialog-error', (_('_Close'), Gtk.ResponseType.CLOSE), parent
+ )
+
+ if traceback:
+ import traceback
+ import sys
+
+ tb = sys.exc_info()
+ tb = traceback.format_exc(tb[2])
+ if details:
+ details += '\n' + tb
+ else:
+ details = tb
+
+ if details:
+ self.set_default_size(600, 400)
+ textview = Gtk.TextView()
+ textview.set_editable(False)
+ textview.get_buffer().set_text(details)
+ sw = Gtk.ScrolledWindow()
+ sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
+ sw.set_shadow_type(Gtk.ShadowType.IN)
+ sw.add(textview)
+ label = Gtk.Label(label=_('Details:'))
+ label.set_alignment(0.0, 0.5)
+ self.vbox.pack_start(label, False, False, 0)
+ self.vbox.pack_start(sw, True, True, 0)
+ self.vbox.show_all()
+
+
+class AuthenticationDialog(BaseDialog):
+ """
+ Displays a dialog with entry fields asking for username and password.
+
+ When run(), it will return either a Gtk.ResponseType.CANCEL or a
+ Gtk.ResponseType.OK.
+ """
+
+ def __init__(self, err_msg='', username=None, parent=None):
+ """
+ :param err_msg: the error message we got back from the server
+ :type err_msg: string
+ """
+ super(AuthenticationDialog, self).__init__(
+ _('Authenticate'),
+ err_msg,
+ 'dialog-password',
+ (_('_Cancel'), Gtk.ResponseType.CANCEL, _('C_onnect'), Gtk.ResponseType.OK),
+ parent,
+ )
+
+ table = Gtk.Table(2, 2, False)
+ self.username_label = Gtk.Label()
+ self.username_label.set_markup('<b>' + _('Username:') + '</b>')
+ self.username_label.set_alignment(1.0, 0.5)
+ self.username_label.set_padding(5, 5)
+ self.username_entry = Gtk.Entry()
+ table.attach(self.username_label, 0, 1, 0, 1)
+ table.attach(self.username_entry, 1, 2, 0, 1)
+
+ self.password_label = Gtk.Label()
+ self.password_label.set_markup('<b>' + _('Password:') + '</b>')
+ self.password_label.set_alignment(1.0, 0.5)
+ self.password_label.set_padding(5, 5)
+ self.password_entry = Gtk.Entry()
+ self.password_entry.set_visibility(False)
+ self.password_entry.connect('activate', self.on_password_activate)
+ table.attach(self.password_label, 0, 1, 1, 2)
+ table.attach(self.password_entry, 1, 2, 1, 2)
+
+ self.vbox.pack_start(table, False, False, padding=5)
+ self.set_focus(self.password_entry)
+ if username:
+ self.username_entry.set_text(username)
+ self.username_entry.set_editable(False)
+ self.set_focus(self.password_entry)
+ else:
+ self.set_focus(self.username_entry)
+ self.show_all()
+
+ def get_username(self):
+ return self.username_entry.get_text()
+
+ def get_password(self):
+ return self.password_entry.get_text()
+
+ def on_password_activate(self, widget):
+ self.response(Gtk.ResponseType.OK)
+
+
+class AccountDialog(BaseDialog):
+ def __init__(
+ self,
+ username=None,
+ password=None,
+ authlevel=None,
+ levels_mapping=None,
+ parent=None,
+ ):
+ if username:
+ super(AccountDialog, self).__init__(
+ _('Edit Account'),
+ _('Edit existing account'),
+ 'dialog-information',
+ (
+ _('_Cancel'),
+ Gtk.ResponseType.CANCEL,
+ _('_Apply'),
+ Gtk.ResponseType.OK,
+ ),
+ parent,
+ )
+ else:
+ super(AccountDialog, self).__init__(
+ _('New Account'),
+ _('Create a new account'),
+ 'dialog-information',
+ (_('_Cancel'), Gtk.ResponseType.CANCEL, _('_Add'), Gtk.ResponseType.OK),
+ parent,
+ )
+
+ self.levels_mapping = levels_mapping
+
+ table = Gtk.Table(2, 3, False)
+ self.username_label = Gtk.Label()
+ self.username_label.set_markup('<b>' + _('Username:') + '</b>')
+ self.username_label.set_alignment(1.0, 0.5)
+ self.username_label.set_padding(5, 5)
+ self.username_entry = Gtk.Entry()
+ table.attach(self.username_label, 0, 1, 0, 1)
+ table.attach(self.username_entry, 1, 2, 0, 1)
+
+ self.authlevel_label = Gtk.Label()
+ self.authlevel_label.set_markup('<b>' + _('Authentication Level:') + '</b>')
+ self.authlevel_label.set_alignment(1.0, 0.5)
+ self.authlevel_label.set_padding(5, 5)
+
+ # combo_box_new_text is deprecated but no other pygtk alternative.
+ self.authlevel_combo = Gtk.ComboBoxText()
+ active_idx = None
+ for idx, level in enumerate(levels_mapping):
+ self.authlevel_combo.append_text(level)
+ if authlevel and authlevel == level:
+ active_idx = idx
+ elif not authlevel and level == 'DEFAULT':
+ active_idx = idx
+
+ if active_idx is not None:
+ self.authlevel_combo.set_active(active_idx)
+
+ table.attach(self.authlevel_label, 0, 1, 1, 2)
+ table.attach(self.authlevel_combo, 1, 2, 1, 2)
+
+ self.password_label = Gtk.Label()
+ self.password_label.set_markup('<b>' + _('Password:') + '</b>')
+ self.password_label.set_alignment(1.0, 0.5)
+ self.password_label.set_padding(5, 5)
+ self.password_entry = Gtk.Entry()
+ self.password_entry.set_visibility(False)
+ table.attach(self.password_label, 0, 1, 2, 3)
+ table.attach(self.password_entry, 1, 2, 2, 3)
+
+ self.vbox.pack_start(table, False, False, padding=5)
+ if username:
+ self.username_entry.set_text(username)
+ self.username_entry.set_editable(False)
+ else:
+ self.set_focus(self.username_entry)
+
+ if password:
+ self.password_entry.set_text(username)
+
+ self.show_all()
+
+ def get_username(self):
+ return self.username_entry.get_text()
+
+ def get_password(self):
+ return self.password_entry.get_text()
+
+ def get_authlevel(self):
+ combobox = self.authlevel_combo
+ level = combobox.get_model()[combobox.get_active()][0]
+ return level
+
+
+class OtherDialog(BaseDialog):
+ """
+ Displays a dialog with a spinner for setting a value.
+
+ Returns:
+ int or float:
+ """
+
+ def __init__(
+ self, header, text='', unit_text='', icon=None, default=0, parent=None
+ ):
+ self.value_type = type(default)
+ if self.value_type not in (int, float):
+ raise TypeError('default value needs to be an int or float')
+
+ if not icon:
+ icon = 'dialog-information'
+
+ super(OtherDialog, self).__init__(
+ header,
+ text,
+ icon,
+ (_('_Cancel'), Gtk.ResponseType.CANCEL, _('_Apply'), Gtk.ResponseType.OK),
+ parent,
+ )
+
+ hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, spacing=5)
+ alignment_spacer = Gtk.Alignment()
+ hbox.pack_start(alignment_spacer, True, True, 0)
+ alignment_spin = Gtk.Alignment(xalign=1, yalign=0.5, xscale=1, yscale=1)
+ adjustment_spin = Gtk.Adjustment(
+ value=-1, lower=-1, upper=2097151, step_increment=1, page_increment=10
+ )
+ self.spinbutton = Gtk.SpinButton(
+ adjustment=adjustment_spin, climb_rate=0, digits=0
+ )
+ self.spinbutton.set_value(default)
+ self.spinbutton.select_region(0, -1)
+ self.spinbutton.set_width_chars(6)
+ self.spinbutton.set_alignment(1)
+ self.spinbutton.set_max_length(6)
+ if self.value_type is float:
+ self.spinbutton.set_digits(1)
+ alignment_spin.add(self.spinbutton)
+ hbox.pack_start(alignment_spin, False, True, 0)
+ label_type = Gtk.Label()
+ label_type.set_text(unit_text)
+ label_type.set_alignment(0.0, 0.5)
+ hbox.pack_start(label_type, True, True, 0)
+
+ self.vbox.pack_start(hbox, False, False, padding=5)
+ self.vbox.show_all()
+
+ def _on_delete_event(self, widget, event):
+ self.deferred.callback(None)
+ self.destroy()
+
+ def _on_response(self, widget, response):
+ value = None
+ if response == Gtk.ResponseType.OK:
+ if self.value_type is int:
+ value = self.spinbutton.get_value_as_int()
+ else:
+ value = self.spinbutton.get_value()
+ self.deferred.callback(value)
+ self.destroy()
+
+
+class PasswordDialog(BaseDialog):
+ """
+ Displays a dialog with an entry field asking for a password.
+
+ When run(), it will return either a Gtk.ResponseType.CANCEL or a Gtk.ResponseType.OK.
+ """
+
+ def __init__(self, password_msg='', parent=None):
+ """
+ :param password_msg: the error message we got back from the server
+ :type password_msg: string
+ """
+ super(PasswordDialog, self).__init__(
+ header=_('Password Protected'),
+ text=password_msg,
+ icon='dialog-password',
+ buttons=(
+ _('_Cancel'),
+ Gtk.ResponseType.CANCEL,
+ _('_OK'),
+ Gtk.ResponseType.OK,
+ ),
+ parent=parent,
+ )
+
+ table = Gtk.Table(1, 2, False)
+ self.password_label = Gtk.Label()
+ self.password_label.set_markup('<b>' + _('Password:') + '</b>')
+ self.password_label.set_alignment(1.0, 0.5)
+ self.password_label.set_padding(5, 5)
+ self.password_entry = Gtk.Entry()
+ self.password_entry.set_visibility(False)
+ self.password_entry.connect('activate', self.on_password_activate)
+ table.attach(self.password_label, 0, 1, 1, 2)
+ table.attach(self.password_entry, 1, 2, 1, 2)
+
+ self.vbox.pack_start(table, False, False, padding=5)
+ self.set_focus(self.password_entry)
+
+ self.show_all()
+
+ def get_password(self):
+ return self.password_entry.get_text()
+
+ def on_password_activate(self, widget):
+ self.response(Gtk.ResponseType.OK)
diff --git a/deluge/ui/gtk3/edittrackersdialog.py b/deluge/ui/gtk3/edittrackersdialog.py
new file mode 100644
index 0000000..1dfdd2a
--- /dev/null
+++ b/deluge/ui/gtk3/edittrackersdialog.py
@@ -0,0 +1,300 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os.path
+
+from gi.repository import Gtk
+from twisted.internet import defer
+
+import deluge.component as component
+from deluge.common import is_url, resource_filename
+from deluge.configmanager import ConfigManager
+from deluge.ui.client import client
+
+from .common import get_deluge_icon
+
+log = logging.getLogger(__name__)
+
+
+def last_tier_trackers_from_liststore(trackers_liststore):
+ """Create a list of tracker from existing liststore and find last tier number.
+
+ Args:
+ tracker_liststore (Gtk.ListStore): A Gtk.ListStore with [tier (int), tracker (str)] rows.
+
+ Returns:
+ tuple(int, list): A tuple containing last tier number and list of trackers.
+
+ """
+
+ last_tier = 0
+ trackers_from_liststore = []
+ for tier, tracker in trackers_liststore:
+ trackers_from_liststore.append(tracker)
+ if tier >= last_tier:
+ last_tier = tier + 1
+
+ return last_tier, trackers_from_liststore
+
+
+def trackers_tiers_from_text(text_str=''):
+ """Create a list of trackers from text.
+
+ Any duplicate trackers are removed.
+
+ Args:
+ text_input (str): A block of text with tracker separated by newlines.
+
+ Returns:
+ list: The list of trackers.
+
+ Notes:
+ Trackers should be separated by newlines and empty line denotes start of new tier.
+
+ """
+
+ trackers = {}
+ tier = 0
+
+ lines = text_str.strip().split('\n')
+ for line in lines:
+ if not line:
+ tier += 1
+ continue
+ line = line.replace('\\', '/') # Fix any mistyped urls.
+ if is_url(line) and line not in trackers:
+ trackers[line] = tier
+
+ return trackers
+
+
+class EditTrackersDialog(object):
+ def __init__(self, torrent_id, parent=None):
+ self.torrent_id = torrent_id
+ self.builder = Gtk.Builder()
+ self.gtkui_config = ConfigManager('gtk3ui.conf')
+
+ # Main dialog
+ self.builder.add_from_file(
+ resource_filename(__package__, os.path.join('glade', 'edit_trackers.ui'))
+ )
+ # add tracker dialog
+ self.builder.add_from_file(
+ resource_filename(
+ __package__, os.path.join('glade', 'edit_trackers.add.ui')
+ )
+ )
+ # edit tracker dialog
+ self.builder.add_from_file(
+ resource_filename(
+ __package__, os.path.join('glade', 'edit_trackers.edit.ui')
+ )
+ )
+
+ self.dialog = self.builder.get_object('edit_trackers_dialog')
+ self.treeview = self.builder.get_object('tracker_treeview')
+ self.add_tracker_dialog = self.builder.get_object('add_tracker_dialog')
+ self.add_tracker_dialog.set_transient_for(self.dialog)
+ self.edit_tracker_entry = self.builder.get_object('edit_tracker_entry')
+ self.edit_tracker_entry.set_transient_for(self.dialog)
+ self.dialog.set_icon(get_deluge_icon())
+
+ self.load_edit_trackers_dialog_state()
+
+ if parent is not None:
+ self.dialog.set_transient_for(parent)
+
+ # Connect the signals
+ self.builder.connect_signals(self)
+
+ # Create a liststore for tier, url
+ self.liststore = Gtk.ListStore(int, str)
+
+ # Create the columns
+ self.treeview.append_column(
+ Gtk.TreeViewColumn(_('Tier'), Gtk.CellRendererText(), text=0)
+ )
+ self.treeview.append_column(
+ Gtk.TreeViewColumn(_('Tracker'), Gtk.CellRendererText(), text=1)
+ )
+
+ self.treeview.set_model(self.liststore)
+ self.liststore.set_sort_column_id(0, Gtk.SortType.ASCENDING)
+
+ self.dialog.connect('delete-event', self._on_delete_event)
+ self.dialog.connect('response', self._on_response)
+
+ def run(self):
+ # Make sure we have a torrent_id.. if not just return
+ if self.torrent_id is None:
+ return
+
+ # Get the trackers for this torrent
+ session = component.get('SessionProxy')
+ session.get_torrent_status(self.torrent_id, ['trackers']).addCallback(
+ self._on_get_torrent_status
+ )
+ client.force_call()
+
+ self.deferred = defer.Deferred()
+ return self.deferred
+
+ def __del__(self):
+ del self.gtkui_config
+
+ def load_edit_trackers_dialog_state(self):
+ w = self.gtkui_config['edit_trackers_dialog_width']
+ h = self.gtkui_config['edit_trackers_dialog_height']
+ if w is not None and h is not None:
+ self.dialog.resize(w, h)
+
+ def on_edit_trackers_dialog_configure_event(self, widget, event):
+ self.gtkui_config['edit_trackers_dialog_width'] = event.width
+ self.gtkui_config['edit_trackers_dialog_height'] = event.height
+
+ def _on_delete_event(self, widget, event):
+ self.deferred.callback(Gtk.ResponseType.DELETE_EVENT)
+ self.dialog.destroy()
+
+ def _on_response(self, widget, response):
+ if response == 1:
+ self.trackers = []
+
+ def each(model, path, _iter, data):
+ tracker = {}
+ tracker['tier'] = model.get_value(_iter, 0)
+ tracker['url'] = model.get_value(_iter, 1)
+ self.trackers.append(tracker)
+
+ self.liststore.foreach(each, None)
+ if self.old_trackers != self.trackers:
+ # Set the torrens trackers
+ client.core.set_torrent_trackers(self.torrent_id, self.trackers)
+ self.deferred.callback(Gtk.ResponseType.OK)
+ else:
+ self.deferred.callback(Gtk.ResponseType.CANCEL)
+ else:
+ self.deferred.callback(Gtk.ResponseType.CANCEL)
+ self.dialog.destroy()
+
+ def _on_get_torrent_status(self, status):
+ """Display trackers dialog"""
+ self.old_trackers = list(status['trackers'])
+ for tracker in self.old_trackers:
+ self.add_tracker(tracker['tier'], tracker['url'])
+ self.treeview.set_cursor((0))
+ self.dialog.show()
+
+ def add_tracker(self, tier, url):
+ """Adds a tracker to the list"""
+ self.liststore.append([tier, url])
+
+ def get_selected(self):
+ """Returns the selected tracker"""
+ return self.treeview.get_selection().get_selected()[1]
+
+ def on_button_add_clicked(self, widget):
+ log.debug('on_button_add_clicked')
+ # Show the add tracker dialog
+ self.add_tracker_dialog.show()
+ self.builder.get_object('textview_trackers').grab_focus()
+
+ def on_button_remove_clicked(self, widget):
+ log.debug('on_button_remove_clicked')
+ selected = self.get_selected()
+ if selected is not None:
+ self.liststore.remove(selected)
+
+ def on_button_edit_clicked(self, widget):
+ """edits an existing tracker"""
+ log.debug('on_button_edit_clicked')
+ selected = self.get_selected()
+ if selected:
+ tracker = self.liststore.get_value(selected, 1)
+ self.builder.get_object('entry_edit_tracker').set_text(tracker)
+ self.edit_tracker_entry.show()
+ self.edit_tracker_entry.grab_focus()
+ self.dialog.set_sensitive(False)
+
+ def on_button_edit_cancel_clicked(self, widget):
+ log.debug('on_button_edit_cancel_clicked')
+ self.dialog.set_sensitive(True)
+ self.edit_tracker_entry.hide()
+
+ def on_button_edit_ok_clicked(self, widget):
+ log.debug('on_button_edit_ok_clicked')
+ selected = self.get_selected()
+ tracker = self.builder.get_object('entry_edit_tracker').get_text()
+ self.liststore.set_value(selected, 1, tracker)
+ self.dialog.set_sensitive(True)
+ self.edit_tracker_entry.hide()
+
+ def on_button_up_clicked(self, widget):
+ log.debug('on_button_up_clicked')
+ selected = self.get_selected()
+ num_rows = self.liststore.iter_n_children(None)
+ if selected is not None and num_rows > 1:
+ tier = self.liststore.get_value(selected, 0)
+ if tier <= 0:
+ return
+ new_tier = tier - 1
+ # Now change the tier for this tracker
+ self.liststore.set_value(selected, 0, new_tier)
+
+ def on_button_down_clicked(self, widget):
+ log.debug('on_button_down_clicked')
+ selected = self.get_selected()
+ num_rows = self.liststore.iter_n_children(None)
+ if selected is not None and num_rows > 1:
+ tier = self.liststore.get_value(selected, 0)
+ new_tier = tier + 1
+ # Now change the tier for this tracker
+ self.liststore.set_value(selected, 0, new_tier)
+
+ def on_button_add_ok_clicked(self, widget):
+ log.debug('on_button_add_ok_clicked')
+
+ # Create a list of trackers from the textview widget
+ textview_buf = self.builder.get_object('textview_trackers').get_buffer()
+ trackers_text = textview_buf.get_text(
+ *textview_buf.get_bounds(), include_hidden_chars=False
+ )
+
+ for tracker in trackers_tiers_from_text(trackers_text):
+ # Figure out what tier number to use.. it's going to be the highest+1
+ # Also check for duplicates
+ # Check if there are any entries
+ duplicate = False
+ highest_tier = -1
+ for row in self.liststore:
+ tier = row[0]
+ if tier > highest_tier:
+ highest_tier = tier
+ if tracker == row[1]:
+ duplicate = True
+ break
+
+ # If not a duplicate, then add it to the list
+ if not duplicate:
+ # Add the tracker to the list
+ self.add_tracker(highest_tier + 1, tracker)
+
+ # Clear the entry widget and hide the dialog
+ textview_buf.set_text('')
+ self.add_tracker_dialog.hide()
+
+ def on_button_add_cancel_clicked(self, widget):
+ log.debug('on_button_add_cancel_clicked')
+ # Clear the entry widget and hide the dialog
+ b = Gtk.TextBuffer()
+ self.builder.get_object('textview_trackers').set_buffer(b)
+ self.add_tracker_dialog.hide()
diff --git a/deluge/ui/gtk3/files_tab.py b/deluge/ui/gtk3/files_tab.py
new file mode 100644
index 0000000..b3bd5b5
--- /dev/null
+++ b/deluge/ui/gtk3/files_tab.py
@@ -0,0 +1,860 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import json
+import logging
+import os.path
+
+from gi.repository import Gio, Gtk
+from gi.repository.Gdk import DragAction, ModifierType, keyval_name
+from gi.repository.GObject import TYPE_UINT64
+
+import deluge.component as component
+from deluge.common import open_file, show_file
+from deluge.ui.client import client
+from deluge.ui.common import FILE_PRIORITY
+
+from .common import (
+ listview_replace_treestore,
+ load_pickled_state_file,
+ reparent_iter,
+ save_pickled_state_file,
+)
+from .torrentdetails import Tab
+from .torrentview_data_funcs import cell_data_size
+
+log = logging.getLogger(__name__)
+
+CELL_PRIORITY_ICONS = {
+ FILE_PRIORITY['Skip']: 'action-unavailable-symbolic',
+ FILE_PRIORITY['Low']: 'go-down-symbolic',
+ FILE_PRIORITY['Normal']: 'go-next-symbolic',
+ FILE_PRIORITY['High']: 'go-up-symbolic',
+}
+
+G_ICON_DIRECTORY = Gio.content_type_get_icon('inode/directory')
+
+
+def cell_priority(column, cell, model, row, data):
+ if model.get_value(row, 5) == -1:
+ # This is a folder, so lets just set it blank for now
+ cell.set_property('text', '')
+ return
+ priority = model.get_value(row, data)
+ cell.set_property('text', _(FILE_PRIORITY[priority]))
+
+
+def cell_priority_icon(column, cell, model, row, data):
+ if model.get_value(row, 5) == -1:
+ # This is a folder, so lets just set it blank for now
+ cell.set_property('icon-name', None)
+ return
+ priority = model.get_value(row, data)
+ cell.set_property('icon-name', CELL_PRIORITY_ICONS[priority])
+
+
+def cell_filename(column, cell, model, row, data):
+ """Only show the tail portion of the file path"""
+ filepath = model.get_value(row, data)
+ cell.set_property('text', os.path.split(filepath)[1])
+
+
+def cell_progress(column, cell, model, row, data):
+ text = model.get_value(row, data[0])
+ value = model.get_value(row, data[1])
+ cell.set_property('visible', True)
+ cell.set_property('text', text)
+ cell.set_property('value', value)
+
+
+class FilesTab(Tab):
+ def __init__(self):
+ super(FilesTab, self).__init__('Files', 'files_tab', 'files_tab_label')
+
+ self.listview = self.main_builder.get_object('files_listview')
+ # filename, size, progress string, progress value, priority, file index, icon id
+ self.treestore = Gtk.TreeStore(str, TYPE_UINT64, str, float, int, int, Gio.Icon)
+ self.treestore.set_sort_column_id(0, Gtk.SortType.ASCENDING)
+
+ # We need to store the row that's being edited to prevent updating it until
+ # it's been done editing
+ self._editing_index = None
+
+ # Filename column
+ self.filename_column_name = _('Filename')
+ column = Gtk.TreeViewColumn(self.filename_column_name)
+ render = Gtk.CellRendererPixbuf()
+ column.pack_start(render, False)
+ column.add_attribute(render, 'gicon', 6)
+ render = Gtk.CellRendererText()
+ render.set_property('editable', True)
+ render.connect('edited', self._on_filename_edited)
+ render.connect('editing-started', self._on_filename_editing_start)
+ render.connect('editing-canceled', self._on_filename_editing_canceled)
+ column.pack_start(render, True)
+ column.add_attribute(render, 'text', 0)
+ column.set_sort_column_id(0)
+ column.set_clickable(True)
+ column.set_resizable(True)
+ column.set_expand(False)
+ column.set_min_width(200)
+ column.set_reorderable(True)
+ self.listview.append_column(column)
+
+ # Size column
+ column = Gtk.TreeViewColumn(_('Size'))
+ render = Gtk.CellRendererText()
+ column.pack_start(render, False)
+ column.set_cell_data_func(render, cell_data_size, 1)
+ column.set_sort_column_id(1)
+ column.set_clickable(True)
+ column.set_resizable(True)
+ column.set_expand(False)
+ column.set_min_width(50)
+ column.set_reorderable(True)
+ self.listview.append_column(column)
+
+ # Progress column
+ column = Gtk.TreeViewColumn(_('Progress'))
+ render = Gtk.CellRendererProgress()
+ render.set_padding(0, 1)
+ column.pack_start(render, True)
+ column.set_cell_data_func(render, cell_progress, (2, 3))
+ column.set_sort_column_id(3)
+ column.set_clickable(True)
+ column.set_resizable(True)
+ column.set_expand(False)
+ column.set_min_width(100)
+ column.set_reorderable(True)
+ self.listview.append_column(column)
+
+ # Priority column
+ column = Gtk.TreeViewColumn(_('Priority'))
+ render = Gtk.CellRendererPixbuf()
+ column.pack_start(render, False)
+ column.set_cell_data_func(render, cell_priority_icon, 4)
+ render = Gtk.CellRendererText()
+ column.pack_start(render, False)
+ column.set_cell_data_func(render, cell_priority, 4)
+ column.set_sort_column_id(4)
+ column.set_clickable(True)
+ column.set_resizable(True)
+ column.set_expand(False)
+ column.set_min_width(100)
+ # Bugfix: Last column needs max_width set to stop scrollbar appearing
+ column.set_max_width(200)
+ column.set_reorderable(True)
+ self.listview.append_column(column)
+
+ self.listview.set_model(self.treestore)
+
+ self.listview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)
+
+ self.file_menu = self.main_builder.get_object('menu_file_tab')
+ self.file_menu_priority_items = [
+ self.main_builder.get_object('menuitem_skip'),
+ self.main_builder.get_object('menuitem_low'),
+ self.main_builder.get_object('menuitem_normal'),
+ self.main_builder.get_object('menuitem_high'),
+ self.main_builder.get_object('menuitem_priority_sep'),
+ ]
+
+ self.localhost_widgets = [
+ self.main_builder.get_object('menuitem_open_file'),
+ self.main_builder.get_object('menuitem_show_file'),
+ self.main_builder.get_object('menuitem3'),
+ ]
+
+ self.listview.connect('row-activated', self._on_row_activated)
+ self.listview.connect('key-press-event', self._on_key_press_event)
+ self.listview.connect('button-press-event', self._on_button_press_event)
+
+ self.listview.enable_model_drag_source(
+ ModifierType.BUTTON1_MASK,
+ [('text/plain', 0, 0)],
+ DragAction.DEFAULT | DragAction.MOVE,
+ )
+ self.listview.enable_model_drag_dest([('text/plain', 0, 0)], DragAction.DEFAULT)
+
+ self.listview.connect('drag_data_get', self._on_drag_data_get_data)
+ self.listview.connect('drag_data_received', self._on_drag_data_received_data)
+
+ component.get('MainWindow').connect_signals(self)
+
+ # Connect to various events from the daemon
+ client.register_event_handler(
+ 'TorrentFileRenamedEvent', self._on_torrentfilerenamed_event
+ )
+ client.register_event_handler(
+ 'TorrentFolderRenamedEvent', self._on_torrentfolderrenamed_event
+ )
+ client.register_event_handler(
+ 'TorrentRemovedEvent', self._on_torrentremoved_event
+ )
+
+ # Attempt to load state
+ self.load_state()
+
+ # torrent_id: (filepath, size)
+ self.files_list = {}
+
+ self.torrent_id = None
+
+ def start(self):
+ attr = 'hide' if not client.is_localhost() else 'show'
+ for widget in self.localhost_widgets:
+ getattr(widget, attr)()
+
+ def save_state(self):
+ # Get the current sort order of the view
+ column_id, sort_order = self.treestore.get_sort_column_id()
+
+ # Setup state dict
+ state = {
+ 'columns': {},
+ 'sort_id': int(column_id) if column_id >= 0 else None,
+ 'sort_order': int(sort_order) if sort_order >= 0 else None,
+ }
+
+ for index, column in enumerate(self.listview.get_columns()):
+ state['columns'][column.get_title()] = {
+ 'position': index,
+ 'width': column.get_width(),
+ }
+
+ save_pickled_state_file('files_tab.state', state)
+
+ def load_state(self):
+ state = load_pickled_state_file('files_tab.state')
+
+ if not state:
+ return
+
+ if state['sort_id'] is not None and state['sort_order'] is not None:
+ self.treestore.set_sort_column_id(state['sort_id'], state['sort_order'])
+
+ for (index, column) in enumerate(self.listview.get_columns()):
+ cname = column.get_title()
+ if cname in state['columns']:
+ cstate = state['columns'][cname]
+ column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
+ column.set_fixed_width(cstate['width'] if cstate['width'] > 0 else 10)
+ if state['sort_id'] == index and state['sort_order'] is not None:
+ column.set_sort_indicator(True)
+ column.set_sort_order(state['sort_order'])
+ if cstate['position'] != index:
+ # Column is in wrong position
+ if cstate['position'] == 0:
+ self.listview.move_column_after(column, None)
+ elif (
+ self.listview.get_columns()[cstate['position'] - 1].get_title()
+ != cname
+ ):
+ self.listview.move_column_after(
+ column, self.listview.get_columns()[cstate['position'] - 1]
+ )
+
+ def update(self):
+ # Get the first selected torrent
+ torrent_id = component.get('TorrentView').get_selected_torrents()
+
+ # Only use the first torrent in the list or return if None selected
+ if len(torrent_id) != 0:
+ torrent_id = torrent_id[0]
+ else:
+ # No torrent is selected in the torrentview
+ self.clear()
+ return
+
+ status_keys = ['file_progress', 'file_priorities']
+ if torrent_id != self.torrent_id:
+ # We only want to do this if the torrent_id has changed
+ self.treestore.clear()
+ self.torrent_id = torrent_id
+ status_keys += ['storage_mode', 'is_seed']
+
+ if self.torrent_id in self.files_list:
+ # We already have the files list stored, so just update the view
+ self.update_files()
+
+ if (
+ self.torrent_id not in self.files_list
+ or not self.files_list[self.torrent_id]
+ ):
+ # We need to get the files list
+ log.debug('Getting file list from core..')
+ status_keys += ['files']
+
+ component.get('SessionProxy').get_torrent_status(
+ self.torrent_id, status_keys
+ ).addCallback(self._on_get_torrent_status, self.torrent_id)
+
+ def clear(self):
+ self.treestore.clear()
+ self.torrent_id = None
+
+ def _on_row_activated(self, tree, path, view_column):
+ self.on_menuitem_open_file_activate(None)
+
+ def get_file_path(self, row, path=''):
+ if not row:
+ return path
+
+ path = self.treestore.get_value(row, 0) + path
+ return self.get_file_path(self.treestore.iter_parent(row), path)
+
+ def _on_open_file(self, status):
+ paths = self.listview.get_selection().get_selected_rows()[1]
+ selected = []
+ for path in paths:
+ selected.append(self.treestore.get_iter(path))
+
+ for select in selected:
+ path = self.get_file_path(select).split('/')
+ filepath = os.path.join(status['download_location'], *path)
+ log.debug('Open file: %s', filepath)
+ timestamp = component.get('MainWindow').get_timestamp()
+ open_file(filepath, timestamp=timestamp)
+
+ def _on_show_file(self, status):
+ paths = self.listview.get_selection().get_selected_rows()[1]
+ selected = []
+ for path in paths:
+ selected.append(self.treestore.get_iter(path))
+
+ for select in selected:
+ path = self.get_file_path(select).split('/')
+ filepath = os.path.join(status['download_location'], *path)
+ log.debug('Show file: %s', filepath)
+ timestamp = component.get('MainWindow').get_timestamp()
+ show_file(filepath, timestamp=timestamp)
+
+ # The following 3 methods create the folder/file view in the treeview
+ def prepare_file_store(self, torrent_files):
+ split_files = {}
+ for index, torrent_file in enumerate(torrent_files):
+ self.prepare_file(torrent_file, torrent_file['path'], index, split_files)
+ self.add_files(None, split_files)
+
+ def prepare_file(self, torrent_file, file_name, file_num, files_storage):
+ first_slash_index = file_name.find('/')
+ if first_slash_index == -1:
+ files_storage[file_name] = (file_num, torrent_file)
+ else:
+ file_name_chunk = file_name[: first_slash_index + 1]
+ if file_name_chunk not in files_storage:
+ files_storage[file_name_chunk] = {}
+ self.prepare_file(
+ torrent_file,
+ file_name[first_slash_index + 1 :],
+ file_num,
+ files_storage[file_name_chunk],
+ )
+
+ def add_files(self, parent_iter, split_files):
+ chunk_size_total = 0
+ for key, value in split_files.items():
+ if key.endswith('/'):
+ chunk_iter = self.treestore.append(
+ parent_iter, [key, 0, '', 0, 0, -1, G_ICON_DIRECTORY]
+ )
+ chunk_size = self.add_files(chunk_iter, value)
+ self.treestore.set(chunk_iter, 1, chunk_size)
+ chunk_size_total += chunk_size
+ else:
+ mime_type, uncertain = Gio.content_type_guess(key, None)
+ if not uncertain and mime_type:
+ mime_icon = Gio.content_type_get_symbolic_icon(mime_type)
+ else:
+ mime_icon = Gio.content_type_get_symbolic_icon('text/plain')
+ self.treestore.append(
+ parent_iter, [key, value[1]['size'], '', 0, 0, value[0], mime_icon]
+ )
+ chunk_size_total += value[1]['size']
+ return chunk_size_total
+
+ def update_files(self):
+ with listview_replace_treestore(self.listview):
+ self.prepare_file_store(self.files_list[self.torrent_id])
+ root = Gtk.TreePath.new_first()
+ self.listview.expand_row(root, False)
+
+ def get_selected_files(self):
+ """Returns a list of file indexes that are selected."""
+
+ def get_iter_children(itr, selected):
+ i = self.treestore.iter_children(itr)
+ while i:
+ selected.append(self.treestore[i][5])
+ if self.treestore.iter_has_child(i):
+ get_iter_children(i, selected)
+ i = self.treestore.iter_next(i)
+
+ selected = []
+ paths = self.listview.get_selection().get_selected_rows()[1]
+ for path in paths:
+ i = self.treestore.get_iter(path)
+ selected.append(self.treestore[i][5])
+ if self.treestore.iter_has_child(i):
+ get_iter_children(i, selected)
+
+ return selected
+
+ def get_files_from_tree(self, rows, files_list, indent):
+ if not rows:
+ return None
+
+ for row in rows:
+ if row[5] > -1:
+ files_list.append((row[5], row))
+ self.get_files_from_tree(row.iterchildren(), files_list, indent + 1)
+ return None
+
+ def update_folder_percentages(self):
+ """Go through the tree and update the folder complete percentages."""
+ root = self.treestore.get_iter_first()
+ if root is None or self.treestore[root][5] != -1:
+ return
+
+ def get_completed_bytes(row):
+ completed_bytes = 0
+ parent = self.treestore.iter_parent(row)
+ while row:
+ if self.treestore.iter_children(row):
+ completed_bytes += get_completed_bytes(
+ self.treestore.iter_children(row)
+ )
+ else:
+ completed_bytes += (
+ self.treestore[row][1] * self.treestore[row][3] / 100
+ )
+
+ row = self.treestore.iter_next(row)
+
+ try:
+ value = completed_bytes / self.treestore[parent][1] * 100
+ except ZeroDivisionError:
+ # Catch the unusal error found when moving folders around
+ value = 0
+ self.treestore[parent][3] = value
+ self.treestore[parent][2] = '%i%%' % value
+ return completed_bytes
+
+ get_completed_bytes(self.treestore.iter_children(root))
+
+ def _on_get_torrent_status(self, status, torrent_id):
+ # Check stored torrent id matches the callback id
+ if self.torrent_id != torrent_id:
+ return
+
+ if 'is_seed' in status:
+ self.__is_seed = status['is_seed']
+
+ if 'files' in status:
+ self.files_list[self.torrent_id] = status['files']
+ self.update_files()
+
+ # (index, iter)
+ files_list = []
+ self.get_files_from_tree(self.treestore, files_list, 0)
+ files_list.sort()
+ for index, row in files_list:
+ # Do not update a row that is being edited
+ if self._editing_index == row[5]:
+ continue
+
+ try:
+ progress_string = '%i%%' % (status['file_progress'][index] * 100)
+ except IndexError:
+ continue
+ if row[2] != progress_string:
+ row[2] = progress_string
+ progress_value = status['file_progress'][index] * 100
+ if row[3] != progress_value:
+ row[3] = progress_value
+ file_priority = status['file_priorities'][index]
+ if row[4] != file_priority:
+ row[4] = file_priority
+ if self._editing_index != -1:
+ # Only update if no folder is being edited
+ self.update_folder_percentages()
+
+ def _on_button_press_event(self, widget, event):
+ """This is a callback for showing the right-click context menu."""
+ log.debug('on_button_press_event')
+ # We only care about right-clicks
+ if event.button == 3:
+ x, y = event.get_coords()
+ cursor_path = self.listview.get_path_at_pos(int(x), int(y))
+ if not cursor_path:
+ return
+
+ paths = self.listview.get_selection().get_selected_rows()[1]
+ if cursor_path[0] not in paths:
+ row = self.treestore.get_iter(cursor_path[0])
+ self.listview.get_selection().unselect_all()
+ self.listview.get_selection().select_iter(row)
+
+ for widget in self.file_menu_priority_items:
+ widget.set_sensitive(not self.__is_seed)
+
+ self.file_menu.popup(None, None, None, None, event.button, event.time)
+ return True
+
+ def _on_key_press_event(self, widget, event):
+ keyname = keyval_name(event.keyval)
+ if keyname is not None:
+ func = getattr(self, 'keypress_' + keyname.lower(), None)
+ selected_rows = self.listview.get_selection().get_selected_rows()[1]
+ if func and selected_rows:
+ return func(event)
+
+ def keypress_menu(self, event):
+ self.file_menu.popup(None, None, None, None, 3, event.time)
+ return True
+
+ def keypress_f2(self, event):
+ path, col = self.listview.get_cursor()
+ for column in self.listview.get_columns():
+ if column.get_title() == self.filename_column_name:
+ self.listview.set_cursor(path, column, True)
+ return True
+
+ def on_menuitem_open_file_activate(self, menuitem):
+ if client.is_localhost:
+ component.get('SessionProxy').get_torrent_status(
+ self.torrent_id, ['download_location']
+ ).addCallback(self._on_open_file)
+
+ def on_menuitem_show_file_activate(self, menuitem):
+ if client.is_localhost:
+ component.get('SessionProxy').get_torrent_status(
+ self.torrent_id, ['download_location']
+ ).addCallback(self._on_show_file)
+
+ def _set_file_priorities_on_user_change(self, selected, priority):
+ """Sets the file priorities in the core. It will change the selected with the 'priority'"""
+ file_priorities = []
+
+ def set_file_priority(model, path, _iter, data):
+ index = model.get_value(_iter, 5)
+ if index in selected and index != -1:
+ file_priorities.append((index, priority))
+ elif index != -1:
+ file_priorities.append((index, model.get_value(_iter, 4)))
+
+ self.treestore.foreach(set_file_priority, None)
+ file_priorities.sort()
+ priorities = [p[1] for p in file_priorities]
+ log.debug('priorities: %s', priorities)
+ client.core.set_torrent_options(
+ [self.torrent_id], {'file_priorities': priorities}
+ )
+
+ def on_menuitem_skip_activate(self, menuitem):
+ self._set_file_priorities_on_user_change(
+ self.get_selected_files(), FILE_PRIORITY['Skip']
+ )
+
+ def on_menuitem_low_activate(self, menuitem):
+ self._set_file_priorities_on_user_change(
+ self.get_selected_files(), FILE_PRIORITY['Low']
+ )
+
+ def on_menuitem_normal_activate(self, menuitem):
+ self._set_file_priorities_on_user_change(
+ self.get_selected_files(), FILE_PRIORITY['Normal']
+ )
+
+ def on_menuitem_high_activate(self, menuitem):
+ self._set_file_priorities_on_user_change(
+ self.get_selected_files(), FILE_PRIORITY['High']
+ )
+
+ def on_menuitem_expand_all_activate(self, menuitem):
+ self.listview.expand_all()
+
+ def _on_filename_edited(self, renderer, path, new_text):
+ index = self.treestore[path][5]
+ log.debug('new_text: %s', new_text)
+
+ # Don't do anything if the text hasn't changed
+ if new_text == self.treestore[path][0]:
+ self._editing_index = None
+ return
+
+ if index > -1:
+ # We are renaming a file
+ itr = self.treestore.get_iter(path)
+ # Recurse through the treestore to get the actual path of the file
+
+ def get_filepath(i):
+ ip = self.treestore.iter_parent(i)
+ fp = ''
+ while ip:
+ fp = self.treestore[ip][0] + fp
+ ip = self.treestore.iter_parent(ip)
+ return fp
+
+ # Only recurse if file is in a folder..
+ if self.treestore.iter_parent(itr):
+ filepath = get_filepath(itr) + new_text
+ else:
+ filepath = new_text
+
+ log.debug('filepath: %s', filepath)
+
+ client.core.rename_files(self.torrent_id, [(index, filepath)])
+ else:
+ # We are renaming a folder
+ folder = self.treestore[path][0]
+
+ parent_path = ''
+ itr = self.treestore.iter_parent(self.treestore.get_iter(path))
+ while itr:
+ parent_path = self.treestore[itr][0] + parent_path
+ itr = self.treestore.iter_parent(itr)
+
+ client.core.rename_folder(
+ self.torrent_id, parent_path + folder, parent_path + new_text
+ )
+
+ self._editing_index = None
+
+ def _on_filename_editing_start(self, renderer, editable, path):
+ self._editing_index = self.treestore[path][5]
+
+ def _on_filename_editing_canceled(self, renderer):
+ self._editing_index = None
+
+ def _on_torrentfilerenamed_event(self, torrent_id, index, name):
+ log.debug('index: %s name: %s', index, name)
+
+ if torrent_id not in self.files_list:
+ return
+
+ old_name = self.files_list[torrent_id][index]['path']
+ self.files_list[torrent_id][index]['path'] = name
+
+ # We need to update the filename displayed if we're currently viewing
+ # this torrents files.
+ if torrent_id != self.torrent_id:
+ return
+
+ old_name_parent = old_name.split('/')[:-1]
+ parent_path = name.split('/')[:-1]
+
+ if old_name_parent != parent_path:
+ if parent_path:
+ for i, p in enumerate(parent_path):
+ p_itr = self.get_iter_at_path('/'.join(parent_path[: i + 1]) + '/')
+ if not p_itr:
+ p_itr = self.get_iter_at_path('/'.join(parent_path[:i]) + '/')
+ p_itr = self.treestore.append(
+ p_itr,
+ [parent_path[i] + '/', 0, '', 0, 0, -1, G_ICON_DIRECTORY],
+ )
+ p_itr = self.get_iter_at_path('/'.join(parent_path) + '/')
+ old_name_itr = self.get_iter_at_path(old_name)
+ self.treestore.append(
+ p_itr,
+ self.treestore.get(
+ old_name_itr, *range(self.treestore.get_n_columns())
+ ),
+ )
+ self.treestore.remove(old_name_itr)
+
+ # Remove old parent path
+ p_itr = self.get_iter_at_path('/'.join(old_name_parent) + '/')
+ self.remove_childless_folders(p_itr)
+ else:
+ new_folders = name.split('/')[:-1]
+ parent_iter = None
+ for f in new_folders:
+ parent_iter = self.treestore.append(
+ parent_iter, [f + '/', 0, '', 0, 0, -1, G_ICON_DIRECTORY]
+ )
+ child = self.get_iter_at_path(old_name)
+ self.treestore.append(
+ parent_iter,
+ self.treestore.get(child, *range(self.treestore.get_n_columns())),
+ )
+ self.treestore.remove(child)
+
+ else:
+ # This is just changing a filename without any folder changes
+ def set_file_name(model, path, itr, user_data):
+ if model[itr][5] == index:
+ model[itr][0] = os.path.split(name)[-1]
+ return True
+
+ self.treestore.foreach(set_file_name, None)
+
+ def get_iter_at_path(self, filepath):
+ """Returns the gtkTreeIter for filepath."""
+ log.debug('get_iter_at_path: %s', filepath)
+ is_dir = False
+ if filepath[-1] == '/':
+ is_dir = True
+
+ filepath = filepath.split('/')
+ if '' in filepath:
+ filepath.remove('')
+
+ path_iter = None
+ itr = self.treestore.iter_children(None)
+ level = 0
+ while itr:
+ ipath = self.treestore[itr][0]
+ if (level + 1) != len(filepath) and ipath == filepath[level] + '/':
+ # We're not at the last index, but we do have a match
+ itr = self.treestore.iter_children(itr)
+ level += 1
+ continue
+ elif (level + 1) == len(filepath) and ipath == (
+ filepath[level] + '/' if is_dir else filepath[level]
+ ):
+ # This is the iter we've been searching for
+ path_iter = itr
+ break
+ else:
+ itr = self.treestore.iter_next(itr)
+ continue
+ return path_iter
+
+ def remove_childless_folders(self, itr):
+ """Goes up the tree removing childless itrs starting at itr."""
+ while not self.treestore.iter_children(itr):
+ parent = self.treestore.iter_parent(itr)
+ self.treestore.remove(itr)
+ itr = parent
+
+ def _on_torrentfolderrenamed_event(self, torrent_id, old_folder, new_folder):
+ log.debug('on_torrent_folder_renamed_signal')
+ log.debug('old_folder: %s new_folder: %s', old_folder, new_folder)
+
+ if torrent_id not in self.files_list:
+ return
+
+ if old_folder[-1] != '/':
+ old_folder += '/'
+
+ if len(new_folder) > 0 and new_folder[-1] != '/':
+ new_folder += '/'
+
+ for fd in self.files_list[torrent_id]:
+ if fd['path'].startswith(old_folder):
+ fd['path'] = fd['path'].replace(old_folder, new_folder, 1)
+
+ if torrent_id == self.torrent_id:
+
+ old_split = old_folder.split('/')
+ try:
+ old_split.remove('')
+ except ValueError:
+ pass
+
+ new_split = new_folder.split('/')
+ try:
+ new_split.remove('')
+ except ValueError:
+ pass
+
+ old_folder_iter = self.get_iter_at_path(old_folder)
+ old_folder_iter_parent = self.treestore.iter_parent(old_folder_iter)
+
+ new_folder_iter = self.get_iter_at_path(new_folder) if new_folder else None
+
+ if len(new_split) == len(old_split):
+ # These are at the same tree depth, so it's a simple rename
+ self.treestore[old_folder_iter][0] = new_split[-1] + '/'
+ return
+ if new_folder_iter:
+ # This means that a folder by this name already exists
+ reparent_iter(
+ self.treestore,
+ self.treestore.iter_children(old_folder_iter),
+ new_folder_iter,
+ )
+ else:
+ parent = old_folder_iter_parent
+ if new_split:
+ for ns in new_split[:-1]:
+ parent = self.treestore.append(
+ parent, [ns + '/', 0, '', 0, 0, -1, G_ICON_DIRECTORY]
+ )
+
+ self.treestore[old_folder_iter][0] = new_split[-1] + '/'
+ reparent_iter(self.treestore, old_folder_iter, parent)
+ else:
+ child_itr = self.treestore.iter_children(old_folder_iter)
+ reparent_iter(
+ self.treestore,
+ child_itr,
+ old_folder_iter_parent,
+ move_siblings=True,
+ )
+
+ # We need to check if the old_folder_iter no longer has children
+ # and if so, we delete it
+ self.remove_childless_folders(old_folder_iter)
+
+ def _on_torrentremoved_event(self, torrent_id):
+ if torrent_id in self.files_list:
+ del self.files_list[torrent_id]
+
+ def _on_drag_data_get_data(self, treeview, context, selection, target_id, etime):
+ paths = self.listview.get_selection().get_selected_rows()[1]
+ selection.set_text(json.dumps([str(path) for path in paths]), -1)
+
+ def _on_drag_data_received_data(
+ self, treeview, context, x, y, selection, info, etime
+ ):
+ try:
+ selected = json.loads(selection.get_data())
+ except TypeError:
+ log.debug('Invalid selection data: %s', selection.get_data())
+ return
+ log.debug('selection.data: %s', selected)
+ drop_info = treeview.get_dest_row_at_pos(x, y)
+ model = treeview.get_model()
+ if drop_info:
+ itr = model.get_iter(drop_info[0])
+ parent_iter = model.iter_parent(itr)
+ parent_path = ''
+ if model[itr][5] == -1:
+ parent_path += model[itr][0]
+
+ while parent_iter:
+ parent_path = model[parent_iter][0] + parent_path
+ parent_iter = model.iter_parent(parent_iter)
+
+ if model[selected[0]][5] == -1:
+ log.debug('parent_path: %s', parent_path)
+ log.debug('rename_to: %s', parent_path + model[selected[0]][0])
+ # Get the full path of the folder we want to rename
+ pp = ''
+ itr = self.treestore.iter_parent(self.treestore.get_iter(selected[0]))
+ while itr:
+ pp = self.treestore[itr][0] + pp
+ itr = self.treestore.iter_parent(itr)
+ client.core.rename_folder(
+ self.torrent_id,
+ pp + model[selected[0]][0],
+ parent_path + model[selected[0]][0],
+ )
+ else:
+ # [(index, filepath), ...]
+ to_rename = []
+ for s in selected:
+ to_rename.append((model[s][5], parent_path + model[s][0]))
+ log.debug('to_rename: %s', to_rename)
+ client.core.rename_files(self.torrent_id, to_rename)
diff --git a/deluge/ui/gtk3/filtertreeview.py b/deluge/ui/gtk3/filtertreeview.py
new file mode 100644
index 0000000..bd781e0
--- /dev/null
+++ b/deluge/ui/gtk3/filtertreeview.py
@@ -0,0 +1,378 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+# 2008 Andrew Resch <andrewresch@gmail.com>
+# 2014 Calum Lind <calumlind@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+import warnings
+
+from gi.repository import Gtk
+from gi.repository.GdkPixbuf import Pixbuf
+from gi.repository.Pango import EllipsizeMode
+
+import deluge.component as component
+from deluge.common import TORRENT_STATE, decode_bytes, resource_filename
+from deluge.configmanager import ConfigManager
+from deluge.ui.client import client
+
+from .common import get_pixbuf, get_pixbuf_at_size
+
+log = logging.getLogger(__name__)
+
+STATE_PIX = {
+ 'All': 'all',
+ 'Downloading': 'downloading',
+ 'Seeding': 'seeding',
+ 'Paused': 'inactive',
+ 'Checking': 'checking',
+ 'Queued': 'queued',
+ 'Error': 'alert',
+ 'Active': 'active',
+ 'Allocating': 'checking',
+ 'Moving': 'checking',
+}
+
+TRACKER_PIX = {'All': 'tracker_all', 'Error': 'tracker_warning'}
+
+FILTER_COLUMN = 5
+
+
+class FilterTreeView(component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'FilterTreeView', interval=2)
+ self.config = ConfigManager('gtk3ui.conf')
+
+ self.tracker_icons = component.get('TrackerIcons')
+
+ self.sidebar = component.get('SideBar')
+ self.treeview = Gtk.TreeView()
+ self.sidebar.add_tab(self.treeview, 'filters', 'Filters')
+
+ # set filter to all when hidden:
+ self.sidebar.notebook.connect('hide', self._on_hide)
+
+ # Create the treestore
+ # cat, value, label, count, pixmap, visible
+ self.treestore = Gtk.TreeStore(str, str, str, int, Pixbuf, bool)
+
+ # Create the column and cells
+ column = Gtk.TreeViewColumn('Filters')
+ column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
+ # icon cell
+ self.cell_pix = Gtk.CellRendererPixbuf()
+ column.pack_start(self.cell_pix, expand=False)
+ column.add_attribute(self.cell_pix, 'pixbuf', 4)
+ # label cell
+ cell_label = Gtk.CellRendererText()
+ cell_label.set_property('ellipsize', EllipsizeMode.END)
+ column.pack_start(cell_label, expand=True)
+ column.set_cell_data_func(cell_label, self.render_cell_data, None)
+ # count cell
+ self.cell_count = Gtk.CellRendererText()
+ self.cell_count.set_property('xalign', 1.0)
+ self.cell_count.set_padding(3, 0)
+ column.pack_start(self.cell_count, expand=False)
+
+ self.treeview.append_column(column)
+
+ # Style
+ self.treeview.set_show_expanders(True)
+ self.treeview.set_headers_visible(False)
+ self.treeview.set_level_indentation(-21)
+ # Force theme to use expander-size so we don't cut out entries due to indentation hack.
+ Gtk.rc_parse_string(
+ """style "treeview-style" {GtkTreeView::expander-size = 7}
+ class "GtkTreeView" style "treeview-style" """
+ )
+
+ self.treeview.set_model(self.treestore)
+ self.treeview.get_selection().connect('changed', self.on_selection_changed)
+ self.create_model_filter()
+
+ self.treeview.connect('button-press-event', self.on_button_press_event)
+
+ # colors using current theme.
+ style_ctx = component.get('MainWindow').window.get_style_context()
+ self.colour_background = style_ctx.get_background_color(Gtk.StateFlags.NORMAL)
+ self.colour_foreground = style_ctx.get_color(Gtk.StateFlags.NORMAL)
+
+ # filtertree menu
+ builder = Gtk.Builder()
+ builder.add_from_file(
+ resource_filename(__package__, os.path.join('glade', 'filtertree_menu.ui'))
+ )
+ self.menu = builder.get_object('filtertree_menu')
+ builder.connect_signals(self)
+
+ self.default_menu_items = self.menu.get_children()
+
+ # add Cat nodes:
+ self.cat_nodes = {}
+ self.filters = {}
+
+ def start(self):
+ self.cat_nodes = {}
+ self.filters = {}
+ # initial order of state filter:
+ self.cat_nodes['state'] = self.treestore.append(
+ None, ['cat', 'state', _('States'), 0, None, False]
+ )
+ for state in ['All', 'Active'] + TORRENT_STATE:
+ self.update_row('state', state, 0, _(state))
+
+ self.cat_nodes['tracker_host'] = self.treestore.append(
+ None, ['cat', 'tracker_host', _('Trackers'), 0, None, False]
+ )
+ self.update_row('tracker_host', 'All', 0, _('All'))
+ self.update_row('tracker_host', 'Error', 0, _('Error'))
+ self.update_row('tracker_host', '', 0, _('None'))
+
+ self.cat_nodes['owner'] = self.treestore.append(
+ None, ['cat', 'owner', _('Owner'), 0, None, False]
+ )
+ self.update_row('owner', 'localclient', 0, _('Admin'))
+ self.update_row('owner', '', 0, _('None'))
+
+ # We set to this expand the rows on start-up
+ self.expand_rows = True
+
+ self.selected_path = None
+
+ def stop(self):
+ self.treestore.clear()
+
+ def create_model_filter(self):
+ self.model_filter = self.treestore.filter_new()
+ self.model_filter.set_visible_column(FILTER_COLUMN)
+ self.treeview.set_model(self.model_filter)
+
+ def cb_update_filter_tree(self, filter_items):
+ # create missing cat_nodes
+ for cat in filter_items:
+ if cat not in self.cat_nodes:
+ label = _(cat)
+ if cat == 'label':
+ label = _('Labels')
+ self.cat_nodes[cat] = self.treestore.append(
+ None, ['cat', cat, label, 0, None, False]
+ )
+
+ # update rows
+ visible_filters = []
+ for cat, filters in filter_items.items():
+ for value, count in filters:
+ self.update_row(cat, value, count)
+ visible_filters.append((cat, value))
+
+ # hide root-categories not returned by core-part of the plugin.
+ for cat in self.cat_nodes:
+ self.treestore.set_value(
+ self.cat_nodes[cat],
+ FILTER_COLUMN,
+ True if cat in filter_items else False,
+ )
+
+ # hide items not returned by core-plugin.
+ for f in self.filters:
+ if f not in visible_filters:
+ self.treestore.set_value(self.filters[f], FILTER_COLUMN, False)
+
+ if self.expand_rows:
+ self.treeview.expand_all()
+ self.expand_rows = False
+
+ if not self.selected_path:
+ self.select_default_filter()
+
+ def update_row(self, cat, value, count, label=None):
+ def on_get_icon(icon):
+ if icon:
+ self.set_row_image(cat, value, icon.get_filename())
+
+ if (cat, value) in self.filters:
+ row = self.filters[(cat, value)]
+ self.treestore.set_value(row, 3, count)
+ else:
+ pix = self.get_pixmap(cat, value)
+
+ if value == '':
+ if cat == 'label':
+ label = _('No Label')
+ elif cat == 'owner':
+ label = _('No Owner')
+ elif not label and value:
+ label = _(value)
+
+ row = self.treestore.append(
+ self.cat_nodes[cat], [cat, value, label, count, pix, True]
+ )
+ self.filters[(cat, value)] = row
+
+ if cat == 'tracker_host' and value not in ('All', 'Error') and value:
+ d = self.tracker_icons.fetch(value)
+ d.addCallback(on_get_icon)
+
+ self.treestore.set_value(row, FILTER_COLUMN, True)
+ return row
+
+ def render_cell_data(self, column, cell, model, row, data):
+ cat = model.get_value(row, 0)
+ label = decode_bytes(model.get_value(row, 2))
+ count = model.get_value(row, 3)
+
+ # Supress Warning: g_object_set_qdata: assertion `G_IS_OBJECT (object)' failed
+ original_filters = warnings.filters[:]
+ warnings.simplefilter('ignore')
+ try:
+ pix = model.get_value(row, 4)
+ finally:
+ warnings.filters = original_filters
+
+ self.cell_pix.set_property('visible', True if pix else False)
+
+ if cat == 'cat':
+ self.cell_count.set_property('visible', False)
+ cell.set_padding(10, 2)
+ label = '<b>%s</b>' % label
+ else:
+ count_txt = '<small>%s</small>' % count
+ self.cell_count.set_property('markup', count_txt)
+ self.cell_count.set_property('visible', True)
+ cell.set_padding(2, 1)
+ cell.set_property('markup', label)
+
+ def get_pixmap(self, cat, value):
+ pix = None
+ if cat == 'state':
+ pix = STATE_PIX.get(value, None)
+ elif cat == 'tracker_host':
+ pix = TRACKER_PIX.get(value, None)
+
+ if pix:
+ return get_pixbuf('%s16.png' % pix)
+
+ def set_row_image(self, cat, value, filename):
+ pix = get_pixbuf_at_size(filename, 16)
+ row = self.filters[(cat, value)]
+ self.treestore.set_value(row, 4, pix)
+ return False
+
+ def on_selection_changed(self, selection):
+ try:
+ (model, row) = self.treeview.get_selection().get_selected()
+ if not row:
+ log.debug('nothing selected')
+ return
+
+ cat = model.get_value(row, 0)
+ value = model.get_value(row, 1)
+
+ filter_dict = {cat: [value]}
+ if value == 'All' or cat == 'cat':
+ filter_dict = {}
+
+ component.get('TorrentView').set_filter(filter_dict)
+
+ self.selected_path = model.get_path(row)
+
+ except Exception as ex:
+ log.debug(ex)
+ # paths is likely None .. so lets return None
+ return None
+
+ def update(self):
+ try:
+ hide_cat = []
+ if not self.config['sidebar_show_trackers']:
+ hide_cat.append('tracker_host')
+ if not self.config['sidebar_show_owners']:
+ hide_cat.append('owner')
+ client.core.get_filter_tree(
+ self.config['sidebar_show_zero'], hide_cat
+ ).addCallback(self.cb_update_filter_tree)
+ except Exception as ex:
+ log.debug(ex)
+
+ # Callbacks #
+ def on_button_press_event(self, widget, event):
+ """This is a callback for showing the right-click context menu."""
+ x, y = event.get_coords()
+ path = self.treeview.get_path_at_pos(int(x), int(y))
+ if not path:
+ return
+ path = path[0]
+ cat = self.model_filter[path][0]
+
+ if event.button == 1:
+ # Prevent selecting a category label
+ if cat == 'cat':
+ if self.treeview.row_expanded(path):
+ self.treeview.collapse_row(path)
+ else:
+ self.treeview.expand_row(path, False)
+ if not self.selected_path:
+ self.select_default_filter()
+ else:
+ self.treeview.get_selection().select_path(self.selected_path)
+ return True
+
+ elif event.button == 3:
+ # assign current cat, value to self:
+ x, y = event.get_coords()
+ path = self.treeview.get_path_at_pos(int(x), int(y))
+ if not path:
+ return
+ row = self.model_filter.get_iter(path[0])
+ self.cat = self.model_filter.get_value(row, 0)
+ self.value = self.model_filter.get_value(row, 1)
+ self.count = self.model_filter.get_value(row, 3)
+
+ # Show the pop-up menu
+ self.set_menu_sensitivity()
+ self.menu.hide()
+ self.menu.popup(None, None, None, None, event.button, event.time)
+ self.menu.show()
+
+ if cat == 'cat':
+ # Do not select the row
+ return True
+
+ def set_menu_sensitivity(self):
+ # select-all/pause/resume
+ sensitive = self.cat != 'cat' and self.count != 0
+ for item in self.default_menu_items:
+ item.set_sensitive(sensitive)
+
+ def select_all(self):
+ """For use in popup menu."""
+ component.get('TorrentView').treeview.get_selection().select_all()
+
+ def on_select_all(self, event):
+ self.select_all()
+
+ def on_pause_all(self, event):
+ self.select_all()
+ func = getattr(component.get('MenuBar'), 'on_menuitem_%s_activate' % 'pause')
+ func(event)
+
+ def on_resume_all(self, event):
+ self.select_all()
+ func = getattr(component.get('MenuBar'), 'on_menuitem_%s_activate' % 'resume')
+ func(event)
+
+ def _on_hide(self, *args):
+ self.select_default_filter()
+
+ def select_default_filter(self):
+ row = self.filters[('state', 'All')]
+ path = self.treestore.get_path(row)
+ self.treeview.get_selection().select_path(path)
diff --git a/deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui b/deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui
new file mode 100644
index 0000000..a7a8cae
--- /dev/null
+++ b/deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="dialog_infohash">
+ <property name="width_request">462</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Add Infohash</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="decorated">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_magnet_add_cancel">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_magnet_add_ok">
+ <property name="label" translatable="yes">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image_dialog_magnet">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-revert-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">From Infohash</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Infohash:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_hash">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="activates_default">True</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Trackers:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTextView" id="text_trackers">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">button_magnet_add_cancel</action-widget>
+ <action-widget response="-5">button_magnet_add_ok</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/add_torrent_dialog.ui b/deluge/ui/gtk3/glade/add_torrent_dialog.ui
new file mode 100644
index 0000000..4d36803
--- /dev/null
+++ b/deluge/ui/gtk3/glade/add_torrent_dialog.ui
@@ -0,0 +1,1039 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment3">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment4">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkDialog" id="dialog_add_torrent">
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">Add Torrents</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_cancel">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_cancel_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_add">
+ <property name="label" translatable="yes">_Add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_add_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkPaned" id="vpaned1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">3</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <property name="min_content_height">50</property>
+ <child>
+ <object class="GtkTreeView" id="listview_torrents">
+ <property name="height_request">71</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection1"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">center</property>
+ <child>
+ <object class="GtkButton" id="button_file">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_file_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-open-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_File</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_url">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_url_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">insert-link-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_URL</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_hash">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_hash_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-revert-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Info_hash</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_remove">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_remove_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">list-remove-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Remove</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkNotebook" id="notebook1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_border">False</property>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkAlignment" id="alignment9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">5</property>
+ <child>
+ <object class="GtkBox" id="prefetch_hbox">
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkSpinner" id="prefetch_spinner">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="active">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="prefetch_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Please wait for files...</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="border_width">2</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="listview_files">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="border_width">1</property>
+ <property name="headers_visible">False</property>
+ <property name="enable_tree_lines">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection2"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkBox" id="hbox11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImage" id="image9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-open-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Fi_les</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">3</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkFrame" id="frame7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="bottom_padding">1</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkBox" id="hbox_download_location_chooser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Download Folder</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkBox" id="hbox_move_completed_chooser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_move_completed">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="margin_right">10</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_move_completed_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Move Complete Folder</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkFrame" id="frame6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">7</property>
+ <property name="right_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_paused">
+ <property name="label" translatable="yes">Add In _Paused State</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_prioritize">
+ <property name="label" translatable="yes">Prioritize First/Last Pieces</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_sequential_download">
+ <property name="label" translatable="yes">Sequential Download</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">When enabled, the piece picker will pick pieces in
+sequence instead of rarest first.
+
+Enabling sequential download will affect the piece
+distribution negatively in the swarm. It should be
+used sparingly.</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_seed_mode">
+ <property name="label" translatable="yes">Skip File Hash Check</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_markup">Useful if adding a complete torrent for seeding.</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_super_seeding">
+ <property name="label" translatable="yes">Super Seeding</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_markup">Useful if adding a complete torrent for seeding.</property>
+ <property name="halign">start</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_pre_alloc">
+ <property name="label" translatable="yes">Preallocate Disk Space</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Preallocate the disk space for the torrent files</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label_item">
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkGrid" id="table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkSpinButton" id="spin_maxup">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment2</property>
+ <property name="update_policy">if-valid</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_maxconnections">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment3</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_maxupslots">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment4</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_maxdown">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Maximum torrent download speed</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Down Speed:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Maximum torrent upload speed</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Up Speed:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Maximum torrent connections</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Connections:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Maximum torrent upload slots</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Upload Slots:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Bandwidth</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkButton" id="button_apply">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_apply_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImage" id="image7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="icon_name">emblem-ok-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Apply To All</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="button_revert">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_revert_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImage" id="image8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-revert-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Revert To Defaults</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkBox" id="hbox12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImage" id="image10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-properties-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Options</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button_cancel</action-widget>
+ <action-widget response="0">button_add</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkListStore" id="liststore1"/>
+</interface>
diff --git a/deluge/ui/gtk3/glade/add_torrent_dialog.url.ui b/deluge/ui/gtk3/glade/add_torrent_dialog.url.ui
new file mode 100644
index 0000000..ecbd0f7
--- /dev/null
+++ b/deluge/ui/gtk3/glade/add_torrent_dialog.url.ui
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="url_dialog">
+ <property name="width_request">462</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Add URL</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="decorated">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_add_cancel">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_add_ok">
+ <property name="label" translatable="yes">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">list-add-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">From URL</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">URL:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_url">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="activates_default">True</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">button_add_cancel</action-widget>
+ <action-widget response="-5">button_add_ok</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/connect_peer_dialog.ui b/deluge/ui/gtk3/glade/connect_peer_dialog.ui
new file mode 100644
index 0000000..f5e9337
--- /dev/null
+++ b/deluge/ui/gtk3/glade/connect_peer_dialog.ui
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="connect_peer_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Add Peer</property>
+ <property name="window_position">mouse</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
+ <property name="decorated">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button2">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button1">
+ <property name="label" translatable="yes">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">list-add-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Add Peer</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="txt_ip">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="activates_default">True</property>
+ <property name="width_chars">39</property>
+ <property name="text" translatable="yes">hostname:port</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button2</action-widget>
+ <action-widget response="1">button1</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/connection_manager.addhost.ui b/deluge/ui/gtk3/glade/connection_manager.addhost.ui
new file mode 100644
index 0000000..641a71c
--- /dev/null
+++ b/deluge/ui/gtk3/glade/connection_manager.addhost.ui
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAdjustment" id="adjustment_port">
+ <property name="upper">65535</property>
+ <property name="value">58846</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkDialog" id="addhost_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Add Host</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_addhost_cancel">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_addhost_add">
+ <property name="label" translatable="yes">_Save</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Hostname:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">1</property>
+ <child>
+ <object class="GtkEntry" id="entry_hostname">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="activates_default">True</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <signal name="paste-clipboard" handler="on_entry_host_paste_clipboard" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Port:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spinbutton_port">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">5</property>
+ <property name="invisible_char">•</property>
+ <property name="width_chars">5</property>
+ <property name="progress_pulse_step">1</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_port</property>
+ <property name="climb_rate">1</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">5</property>
+ <child>
+ <object class="GtkEntry" id="entry_password">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">•</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">5</property>
+ <child>
+ <object class="GtkEntry" id="entry_username">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Username:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Password:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button_addhost_cancel</action-widget>
+ <action-widget response="1">button_addhost_add</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/connection_manager.ui b/deluge/ui/gtk3/glade/connection_manager.ui
new file mode 100644
index 0000000..11516aa
--- /dev/null
+++ b/deluge/ui/gtk3/glade/connection_manager.ui
@@ -0,0 +1,394 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkListStore" id="liststore_hostlist">
+ <columns>
+ <!-- column-name host_id -->
+ <column type="gchararray"/>
+ <!-- column-name hostname -->
+ <column type="gchararray"/>
+ <!-- column-name port -->
+ <column type="gint"/>
+ <!-- column-name username -->
+ <column type="gchararray"/>
+ <!-- column-name password -->
+ <column type="gchararray"/>
+ <!-- column-name status -->
+ <column type="gchararray"/>
+ <!-- column-name version -->
+ <column type="gchararray"/>
+ <!-- column-name status_i18n -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkDialog" id="connection_manager">
+ <property name="can_focus">False</property>
+ <property name="has_focus">True</property>
+ <property name="is_focus">True</property>
+ <property name="title" translatable="yes">Connection Manager</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="default_width">300</property>
+ <property name="default_height">250</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_close">
+ <property name="label" translatable="yes">_Close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_close_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_connect">
+ <property name="label" translatable="yes">C_onnect</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_connect_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkViewport" id="viewport1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkTreeView" id="treeview_hostlist">
+ <property name="height_request">80</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="model">liststore_hostlist</property>
+ <signal name="row-activated" handler="on_hostlist_row_activated" swapped="no"/>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">3</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButtonBox" id="hbuttonbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="homogeneous">True</property>
+ <property name="layout_style">start</property>
+ <child>
+ <object class="GtkButton" id="button_addhost">
+ <property name="label" translatable="yes">_Add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_addhost_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_edithost">
+ <property name="label" translatable="yes">_Edit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_edithost_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_removehost">
+ <property name="label" translatable="yes">_Remove</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_removehost_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_refresh">
+ <property name="label" translatable="yes">_Refresh</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_refresh_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="button_startdaemon">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_startdaemon_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkImage" id="image_startdaemon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">system-run-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">3</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_startdaemon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Start Daemon</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Deluge Daemons</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkExpander" id="expander1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="expanded">True</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_autoconnect">
+ <property name="label" translatable="yes">Auto-connect to selected Daemon</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_autostart">
+ <property name="label" translatable="yes">Auto-start localhost daemon (if required)</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_donotshow">
+ <property name="label" translatable="yes">Hide this dialog</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Startup Options</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button_close</action-widget>
+ <action-widget response="0">button_connect</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui b/deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui
new file mode 100644
index 0000000..e46ef17
--- /dev/null
+++ b/deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="progress_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Creating Torrent</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkProgressBar" id="progressbar">
+ <property name="width_request">200</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui b/deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui
new file mode 100644
index 0000000..dc7b7e9
--- /dev/null
+++ b/deluge/ui/gtk3/glade/create_torrent_dialog.remote_path.ui
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="remote_path_dialog">
+ <property name="width_request">462</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Enter Remote Path</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="decorated">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_add_cancel">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_add_ok">
+ <property name="label" translatable="yes">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">network-workgroup-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Remote Path</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Path:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_path">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="activates_default">True</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">button_add_cancel</action-widget>
+ <action-widget response="-5">button_add_ok</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui b/deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui
new file mode 100644
index 0000000..a380718
--- /dev/null
+++ b/deluge/ui/gtk3/glade/create_torrent_dialog.remote_save.ui
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="remote_save_dialog">
+ <property name="width_request">462</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Save .torrent as</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="decorated">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_add_cancel1">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_add_ok1">
+ <property name="label" translatable="yes">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">network-workgroup-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Save .torrent file</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Path:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_save_path">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="activates_default">True</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">button_add_cancel1</action-widget>
+ <action-widget response="-5">button_add_ok1</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/create_torrent_dialog.ui b/deluge/ui/gtk3/glade/create_torrent_dialog.ui
new file mode 100644
index 0000000..c27a4b8
--- /dev/null
+++ b/deluge/ui/gtk3/glade/create_torrent_dialog.ui
@@ -0,0 +1,847 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkListStore" id="liststore1">
+ <columns>
+ <!-- column-name item -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">32 KiB</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">64 KiB</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">128 KiB</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">256 KiB</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">512 KiB</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">1 MiB</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">2 MiB</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">4 MiB</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">8 MiB</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">16 MiB</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkWindow" id="create_torrent_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Create Torrent</property>
+ <property name="window_position">center-on-parent</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-new-symbolic</property>
+ <property name="icon_size">5</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Create Torrent</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="treeview_files">
+ <property name="height_request">30</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection1"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="hbuttonbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">center</property>
+ <child>
+ <object class="GtkButton" id="button_file">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_file_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-new-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_File</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_folder">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_folder_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">folder-open-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Fol_der</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_remote_path">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_remote_path_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">network-workgroup-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Remote Path</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Files</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="notebook1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Author:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_author">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Comments:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_comments">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkBox" id="hbox11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">dialog-information-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Info</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+ <child>
+ <object class="GtkBox" id="hbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="tracker_treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection2"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="vbuttonbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">1</property>
+ <property name="layout_style">center</property>
+ <child>
+ <object class="GtkButton" id="button_up">
+ <property name="label" translatable="yes">_Up</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_up_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_add">
+ <property name="label" translatable="yes">_Add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_add_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_remove">
+ <property name="label" translatable="yes">_Remove</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_remove_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_down">
+ <property name="label" translatable="yes">_Down</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_down_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkBox" id="hbox12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">text-editor-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Trackers</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+ <child>
+ <object class="GtkViewport" id="viewport1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <child>
+ <object class="GtkTextView" id="textview_webseeds">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkBox" id="hbox13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">network-workgroup-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Webseeds</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Piece Size:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="combo_piece_size">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="model">liststore1</property>
+ <property name="active">2</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_private_flag">
+ <property name="label" translatable="yes">Set Private Flag</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_add_to_session">
+ <property name="label" translatable="yes">Add this torrent to the session</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkBox" id="hbox14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">preferences-other-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Options</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_cancel">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_cancel_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_save">
+ <property name="label" translatable="yes">_Save</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_save_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/edit_trackers.add.ui b/deluge/ui/gtk3/glade/edit_trackers.add.ui
new file mode 100644
index 0000000..39d1978
--- /dev/null
+++ b/deluge/ui/gtk3/glade/edit_trackers.add.ui
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="add_tracker_dialog">
+ <property name="width_request">400</property>
+ <property name="height_request">200</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Add Tracker</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_add_cancel">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_add_cancel_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_add_ok">
+ <property name="label" translatable="yes">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_add_ok_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">list-add-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Add Trackers</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Trackers:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTextView" id="textview_trackers">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="left_margin">1</property>
+ <property name="right_margin">1</property>
+ <property name="accepts_tab">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">button_add_cancel</action-widget>
+ <action-widget response="-5">button_add_ok</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/edit_trackers.edit.ui b/deluge/ui/gtk3/glade/edit_trackers.edit.ui
new file mode 100644
index 0000000..2521e8f
--- /dev/null
+++ b/deluge/ui/gtk3/glade/edit_trackers.edit.ui
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="edit_tracker_entry">
+ <property name="width_request">400</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Edit Tracker</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_add_cancel1">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_edit_cancel_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_add_ok1">
+ <property name="label" translatable="yes">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_edit_ok_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">text-editor-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Edit Tracker</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Tracker:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_edit_tracker">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="activates_default">True</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button_add_cancel1</action-widget>
+ <action-widget response="1">button_add_ok1</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/edit_trackers.ui b/deluge/ui/gtk3/glade/edit_trackers.ui
new file mode 100644
index 0000000..9b77a9b
--- /dev/null
+++ b/deluge/ui/gtk3/glade/edit_trackers.ui
@@ -0,0 +1,247 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="edit_trackers_dialog">
+ <property name="width_request">400</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Edit Trackers</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="default_width">400</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <signal name="configure-event" handler="on_edit_trackers_dialog_configure_event" swapped="no"/>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_cancel">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_ok">
+ <property name="label" translatable="yes">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">text-editor-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Edit Trackers</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="tracker_treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="vbuttonbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">1</property>
+ <property name="layout_style">center</property>
+ <child>
+ <object class="GtkButton" id="button_up">
+ <property name="label" translatable="yes">_Up</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_up_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_add">
+ <property name="label" translatable="yes">_Add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_add_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_exit">
+ <property name="label" translatable="yes">_Edit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_edit_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_remove">
+ <property name="label" translatable="yes">_Remove</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_remove_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_down">
+ <property name="label" translatable="yes">_Down</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_down_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button_cancel</action-widget>
+ <action-widget response="1">button_ok</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/filtertree_menu.ui b/deluge/ui/gtk3/glade/filtertree_menu.ui
new file mode 100644
index 0000000..d2861e1
--- /dev/null
+++ b/deluge/ui/gtk3/glade/filtertree_menu.ui
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkImage" id="image22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">edit-select-all-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image22">
+ <property name="can_focus">False</property>
+ <property name="icon_name">media-playback-pause-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">media-playback-start-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkMenu" id="filtertree_menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="select_all">
+ <property name="label" translatable="yes">_Select All</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">image22</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_select_all" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_pause">
+ <property name="label" translatable="yes">_Pause All</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">menu-item-image22</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_pause_all" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_resume">
+ <property name="label" translatable="yes">Resu_me All</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Resume selected torrents.</property>
+ <property name="use_underline">True</property>
+ <property name="image">menu-item-image23</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_resume_all" swapped="no"/>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/main_window.new_release.ui b/deluge/ui/gtk3/glade/main_window.new_release.ui
new file mode 100644
index 0000000..f9c7fd5
--- /dev/null
+++ b/deluge/ui/gtk3/glade/main_window.new_release.ui
@@ -0,0 +1,249 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="new_release_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">New Release</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="icon_name">deluge</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_close_new_release">
+ <property name="label" translatable="yes">_Close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_goto_downloads">
+ <property name="label" translatable="yes">_Goto Website</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">10</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image_new_release">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">image-missing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">New Release Available!</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">5</property>
+ <child>
+ <object class="GtkGrid" id="table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">2</property>
+ <property name="column_spacing">10</property>
+ <child>
+ <object class="GtkLabel" id="label_available_version">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_available_version_text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Available Version:</property>
+ <attributes>
+ <attribute name="style" value="italic"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_client_version">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_server_version">
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_server_version_text">
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Server Version</property>
+ <attributes>
+ <attribute name="style" value="italic"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_client_version_text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Current Version:</property>
+ <attributes>
+ <attribute name="style" value="italic"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_do_not_show_new_release">
+ <property name="label" translatable="yes">Do not show this dialog in the future</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button_close_new_release</action-widget>
+ <action-widget response="0">button_goto_downloads</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui b/deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui
new file mode 100644
index 0000000..dd5d66b
--- /dev/null
+++ b/deluge/ui/gtk3/glade/main_window.tabs.menu_file.ui
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">zoom-fit-best-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">action-unavailable-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-next-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-up-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-down-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="image6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-open-symbolic</property>
+ </object>
+ <object class="GtkImage" id="image7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">folder-open-symbolic</property>
+ </object>
+ <object class="GtkMenu" id="menu_file_tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_open_file">
+ <property name="label" translatable="yes">_Open File</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">image6</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_open_file_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_show_file">
+ <property name="label" translatable="yes">_Show Folder</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">image7</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_show_file_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_expand_all">
+ <property name="label" translatable="yes">_Expand All</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">image1</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_expand_all_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem_priority_sep">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_skip">
+ <property name="label" translatable="yes">_Skip</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">image2</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_skip_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_low">
+ <property name="label" translatable="yes">_Low</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">image5</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_low_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_normal">
+ <property name="label" translatable="yes">_Normal</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">image3</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_normal_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_high">
+ <property name="label" translatable="yes">_High</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">image4</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_high_activate" swapped="no"/>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui b/deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui
new file mode 100644
index 0000000..d35ef77
--- /dev/null
+++ b/deluge/ui/gtk3/glade/main_window.tabs.menu_peer.ui
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">list-add-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkMenu" id="menu_peer_tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="add_peer_menuitem">
+ <property name="label" translatable="yes">_Add Peer</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Add a peer by its IP</property>
+ <property name="use_underline">True</property>
+ <property name="image">image1</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_add_peer_activate" swapped="no"/>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/main_window.tabs.ui b/deluge/ui/gtk3/glade/main_window.tabs.ui
new file mode 100644
index 0000000..30bd395
--- /dev/null
+++ b/deluge/ui/gtk3/glade/main_window.tabs.ui
@@ -0,0 +1,1679 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAdjustment" id="spin_max_connections_adjustment">
+ <property name="lower">-1</property>
+ <property name="upper">999999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ <signal name="value-changed" handler="on_spin_value_changed" swapped="no"/>
+ </object>
+ <object class="GtkAdjustment" id="spin_max_download_adjustment">
+ <property name="lower">-1</property>
+ <property name="upper">2097151</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ <signal name="value-changed" handler="on_spin_value_changed" swapped="no"/>
+ </object>
+ <object class="GtkAdjustment" id="spin_max_upload_adjustment">
+ <property name="lower">-1</property>
+ <property name="upper">2097151</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ <signal name="value-changed" handler="on_spin_value_changed" swapped="no"/>
+ </object>
+ <object class="GtkAdjustment" id="spin_max_upload_slots_adjustment">
+ <property name="lower">-1</property>
+ <property name="upper">999999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ <signal name="value-changed" handler="on_spin_value_changed" swapped="no"/>
+ </object>
+ <object class="GtkAdjustment" id="spin_stop_ratio_adjustment">
+ <property name="upper">999999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ <signal name="value-changed" handler="on_spin_value_changed" swapped="no"/>
+ </object>
+ <object class="GtkWindow" id="tabs">
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="dummy_nb_see_main_win_torrent_info">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tab_pos">left</property>
+ <child>
+ <object class="GtkScrolledWindow" id="status_tab">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">10</property>
+ <property name="right_padding">10</property>
+ <child>
+ <object class="GtkBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="status_progress_vbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkProgressBar" id="progressbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pulse_step">0.10000000149</property>
+ <property name="show_text">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="table8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">5</property>
+ <property name="column_spacing">10</property>
+ <child>
+ <object class="GtkLabel" id="summary_total_uploaded">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="width_chars">20</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_total_downloaded">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_upload_speed">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="width_chars">15</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_seed_rank">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_availability">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="wrap">True</property>
+ <property name="wrap_mode">word-char</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_share_ratio">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_peers">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="width_chars">10</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_eta">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_active_time">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_seed_time">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_last_transfer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="wrap">True</property>
+ <property name="wrap_mode">char</property>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_last_seen_complete">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="wrap">True</property>
+ <property name="wrap_mode">char</property>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Down Speed:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Up Speed:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Downloaded:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Uploaded:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_seeds">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="width_chars">10</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_download_speed">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="width_chars">15</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_seeds">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Seeds:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_peers">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Peers:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Share Ratio:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_availablity">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Availability:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_seed_rank">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Seed Rank:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_eta">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">ETA Time:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_last_transfer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Last Transfer:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_active_time">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Active Time:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_last_seen_complete">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Complete Seen:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_seed_time">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Seeding Time:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="status_tab_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">1</property>
+ <property name="label" translatable="yes">_Status</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="details_tab">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">10</property>
+ <property name="right_padding">15</property>
+ <child>
+ <object class="GtkGrid" id="table_details">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">5</property>
+ <property name="column_spacing">10</property>
+ <child>
+ <object class="GtkLabel" id="summary_name">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="wrap">True</property>
+ <property name="wrap_mode">word-char</property>
+ <property name="selectable">True</property>
+ <property name="ellipsize">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_total_size">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_num_files">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_completed">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_date_added">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_pieces">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Pieces:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_pieces">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_hash">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="wrap">True</property>
+ <property name="selectable">True</property>
+ <property name="width_chars">40</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_torrent_path">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="wrap">True</property>
+ <property name="wrap_mode">char</property>
+ <property name="selectable">True</property>
+ <property name="ellipsize">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_comments">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="wrap_mode">char</property>
+ <property name="selectable">True</property>
+ <property name="ellipsize">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_creator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="wrap_mode">char</property>
+ <property name="selectable">True</property>
+ <property name="ellipsize">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_name">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Name:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_path">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Download Folder:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_date_added">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Added:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_total_size">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Total Size:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_num_files">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Total Files:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_hash">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Hash:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_creator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Created By:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_comments">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Comments:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_completed">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Completed:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="vseparator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="height">3</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="details_tab_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">1</property>
+ <property name="label" translatable="yes">_Details</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="files_tab">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkTreeView" id="files_listview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection1"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="files_tab_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">1</property>
+ <property name="label" translatable="yes">Fi_les</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="peers_tab">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkTreeView" id="peers_listview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection2"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="peers_tab_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">1</property>
+ <property name="label" translatable="yes">_Peers</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="options_tab">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">15</property>
+ <child>
+ <object class="GtkGrid" id="table6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkAlignment" id="alignment8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label_owner">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Owner:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_owner">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="wrap_mode">char</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">10</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_shared">
+ <property name="label" translatable="yes">Shared</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_prioritize_first_last">
+ <property name="label" translatable="yes">Prioritize First/Last</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_sequential_download">
+ <property name="label" translatable="yes">Sequential Download</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_super_seeding">
+ <property name="label" translatable="yes">Super Seeding</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_move_completed">
+ <property name="label" translatable="yes">Move completed:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_move_completed_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox_move_completed_path_chooser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkBox" id="vbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">15</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_auto_managed">
+ <property name="label" translatable="yes">Auto Managed</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_stop_at_ratio">
+ <property name="label" translatable="yes">Stop seed at ratio:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_stop_at_ratio_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <property name="right_padding">10</property>
+ <child>
+ <object class="GtkSpinButton" id="spin_stop_ratio">
+ <property name="width_request">50</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">spin_stop_ratio_adjustment</property>
+ <property name="digits">1</property>
+ <property name="numeric">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_remove_at_ratio">
+ <property name="label" translatable="yes">Remove at ratio</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_toggled" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">7</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="button_apply">
+ <property name="label" translatable="yes">_Apply</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_apply_clicked" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkGrid" id="table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="row_spacing">2</property>
+ <property name="column_spacing">4</property>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_connections">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">spin_max_connections_adjustment</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_upload">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">spin_max_upload_adjustment</property>
+ <property name="digits">1</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_download">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">spin_max_download_adjustment</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">1</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Upload Speed:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">K/s</property>
+ <property name="ellipsize">start</property>
+ <attributes>
+ <attribute name="scale" value="0.90000000000000002"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">K/s</property>
+ <attributes>
+ <attribute name="scale" value="0.90000000000000002"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_upload_slots">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">spin_max_upload_slots_adjustment</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Download Speed:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Connections:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Upload Slots:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Bandwidth Limits</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="options_tab_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">1</property>
+ <property name="label" translatable="yes">_Options</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="trackers_tab">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">10</property>
+ <property name="right_padding">15</property>
+ <child>
+ <object class="GtkGrid" id="table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">5</property>
+ <property name="column_spacing">10</property>
+ <child>
+ <object class="GtkLabel" id="label_tracker">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Current Tracker:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_tracker">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_next_announce">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_tracker_status">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="wrap">True</property>
+ <property name="wrap_mode">char</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_tracker_total">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_private">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="wrap_mode">char</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_tracker_total">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Total Trackers:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_tracker_status">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Tracker Status:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_next_announce">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Next Announce:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_private">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Private Torrent:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment_edit_trackers">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="top_padding">5</property>
+ <child>
+ <object class="GtkButton" id="button_edit_trackers">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_edit_trackers_clicked" swapped="no"/>
+ <child>
+ <object class="GtkLabel" id="label_edit_trackers">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Edit Trackers</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="trackers_tab_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">1</property>
+ <property name="label" translatable="yes">_Trackers</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/main_window.ui b/deluge/ui/gtk3/glade/main_window.ui
new file mode 100644
index 0000000..43d8bf0
--- /dev/null
+++ b/deluge/ui/gtk3/glade/main_window.ui
@@ -0,0 +1,796 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkImage" id="about-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">help-about-symbolic</property>
+ </object>
+ <object class="GtkAccelGroup" id="accelgroup1"/>
+ <object class="GtkImage" id="add-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">list-add-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">-1</property>
+ <property name="upper">999999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="lower">-1</property>
+ <property name="upper">99999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment3">
+ <property name="lower">-1</property>
+ <property name="upper">999999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment4">
+ <property name="lower">-1</property>
+ <property name="upper">999999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment5">
+ <property name="upper">99999</property>
+ <property name="value">2</property>
+ <property name="step_increment">0.10000000000000001</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkImage" id="connection-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">preferences-system-network-symbolic</property>
+ </object>
+ <object class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-up-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-top-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="image6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">zoom-fit-best-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="new-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-new-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="prefs-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">preferences-system-symbolic</property>
+ </object>
+ <object class="GtkImage" id="quit-daemon-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">system-shutdown-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="quit_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">application-exit-symbolic</property>
+ </object>
+ <object class="GtkWindow" id="main_window">
+ <property name="can_focus">False</property>
+ <property name="title">Deluge</property>
+ <accel-groups>
+ <group name="accelgroup1"/>
+ </accel-groups>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkMenuBar" id="menubar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="menu_file">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_File</property>
+ <property name="use_underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menuitem1_menu1">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_addtorrent">
+ <property name="label" translatable="yes">_Add Torrent</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">add-image</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_addtorrent_activate" swapped="no"/>
+ <accelerator key="O" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_createtorrent">
+ <property name="label" translatable="yes">_Create Torrent</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">new-image</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_createtorrent_activate" swapped="no"/>
+ <accelerator key="N" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem">
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_quitdaemon">
+ <property name="label" translatable="yes">Quit &amp; _Shutdown Daemon</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">quit-daemon-image</property>
+ <property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
+ <signal name="activate" handler="on_menuitem_quitdaemon_activate" swapped="no"/>
+ <accelerator key="Q" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_quit">
+ <property name="label" translatable="yes">_Quit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">quit_image</property>
+ <property name="use_stock">False</property>
+ <property name="accel_group">accelgroup1</property>
+ <signal name="activate" handler="on_menuitem_quit_activate" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menu_edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Edit</property>
+ <property name="use_underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_preferences">
+ <property name="label" translatable="yes">_Preferences</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">prefs-image</property>
+ <property name="use_stock">False</property>
+ <property name="accel_group">accelgroup1</property>
+ <signal name="activate" handler="on_menuitem_preferences_activate" swapped="no"/>
+ <accelerator key="P" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_connectionmanager">
+ <property name="label" translatable="yes">_Connection Manager</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">connection-image</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_connectionmanager_activate" swapped="no"/>
+ <accelerator key="M" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menu_torrent">
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Torrent</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menu_view">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_View</property>
+ <property name="use_underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckMenuItem" id="menuitem_toolbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Toolbar</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <signal name="toggled" handler="on_menuitem_toolbar_toggled" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="menuitem_sidebar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Sidebar</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <signal name="toggled" handler="on_menuitem_sidebar_toggled" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="menuitem_statusbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Status_bar</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <signal name="toggled" handler="on_menuitem_statusbar_toggled" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menu_tabs">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">T_abs</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menu_columns">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Columns</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="find_menuitem">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Find ...</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="on_search_filter_toggle" swapped="no"/>
+ <accelerator key="f" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menu_Sidebar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="label" translatable="yes">S_idebar</property>
+ <property name="use_underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <child>
+ <object class="GtkCheckMenuItem" id="sidebar_show_zero">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Show _Zero Hits</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <signal name="toggled" handler="on_menuitem_sidebar_zero_toggled" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="sidebar_show_trackers">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Show _Trackers</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <signal name="toggled" handler="on_menuitem_sidebar_trackers_toggled" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="sidebar_show_owners">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Show _Owners</property>
+ <property name="active">True</property>
+ <signal name="toggled" handler="on_menuitem_sidebar_owners_toggled" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menu_help">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Help</property>
+ <property name="use_underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menuitem2_menu1">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_homepage">
+ <property name="label" translatable="yes">_Homepage</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_homepage_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_faq">
+ <property name="label" translatable="yes">_FAQ</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Frequently Asked Questions</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_faq_activate" swapped="no"/>
+ <accelerator key="F1" signal="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_community">
+ <property name="label" translatable="yes">_Community</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
+ <signal name="activate" handler="on_menuitem_community_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_about">
+ <property name="label" translatable="yes">_About</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">about-image</property>
+ <property name="use_stock">False</property>
+ <property name="accel_group">accelgroup1</property>
+ <signal name="activate" handler="on_menuitem_about_activate" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolbar" id="toolbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_size">2</property>
+ <child>
+ <object class="GtkToolButton" id="toolbutton_add">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">Add torrent</property>
+ <property name="label" translatable="yes">Add Torrent</property>
+ <property name="icon_name">list-add-symbolic</property>
+ <signal name="clicked" handler="on_toolbutton_add_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="toolbutton_remove">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">Remove torrent</property>
+ <property name="label" translatable="yes">Remove Torrent</property>
+ <property name="icon_name">list-remove-symbolic</property>
+ <signal name="clicked" handler="on_toolbutton_remove_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="toolbutton_filter">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Filter torrents by name.
+This will filter torrents for the current selection on the sidebar.</property>
+ <property name="label" translatable="yes">Filter</property>
+ <property name="icon_name">system-search-symbolic</property>
+ <signal name="clicked" handler="on_search_filter_toggle" swapped="no"/>
+ <accelerator key="f" signal="clicked" modifiers="GDK_CONTROL_MASK"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparatorToolItem" id="separatortoolitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="toolbutton_pause">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">Pause the selected torrents</property>
+ <property name="label" translatable="yes">Pause</property>
+ <property name="icon_name">media-playback-pause-symbolic</property>
+ <signal name="clicked" handler="on_toolbutton_pause_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="toolbutton_resume">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">Resume the selected torrents</property>
+ <property name="label" translatable="yes">Resume</property>
+ <property name="icon_name">media-playback-start-symbolic</property>
+ <signal name="clicked" handler="on_toolbutton_resume_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparatorToolItem" id="separatortoolitem2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="toolbutton_queue_up">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">Queue Torrent Up</property>
+ <property name="label" translatable="yes">Queue Up</property>
+ <property name="icon_name">go-up-symbolic</property>
+ <signal name="clicked" handler="on_toolbutton_queue_up_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="toolbutton_queue_down">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">Queue Torrent Down</property>
+ <property name="label" translatable="yes">Queue Down</property>
+ <property name="icon_name">go-down-symbolic</property>
+ <signal name="clicked" handler="on_toolbutton_queue_down_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparatorToolItem" id="toolbutton1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="toolbutton_preferences">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">Preferences</property>
+ <property name="label" translatable="yes">Preferences</property>
+ <property name="icon_name">preferences-system-symbolic</property>
+ <signal name="clicked" handler="on_toolbutton_preferences_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="toolbutton_connectionmanager">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">Connection Manager</property>
+ <property name="label" translatable="yes">Connection Manager</property>
+ <property name="icon_name">preferences-system-network-symbolic</property>
+ <signal name="clicked" handler="on_toolbutton_connectionmanager_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <child>
+ <object class="GtkPaned" id="tabsbar_pane">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkPaned" id="sidebar_pane">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkNotebook" id="sidebar_notebook">
+ <property name="can_focus">True</property>
+ <property name="scrollable">True</property>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="search_box">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="close_search_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">Close</property>
+ <property name="relief">none</property>
+ <signal name="clicked" handler="on_close_search_button_clicked" swapped="no"/>
+ <child>
+ <object class="GtkImage" id="close_search_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">window-close-symbolic</property>
+ <property name="icon_size">2</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Filter:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">1</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="search_torrents_entry">
+ <property name="width_request">350</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">Filter torrents by name.
+This will filter torrents for the current selection on the sidebar.</property>
+ <property name="invisible_char">•</property>
+ <property name="truncate_multiline">True</property>
+ <property name="caps_lock_warning">False</property>
+ <property name="secondary_icon_name">edit-clear-symbolic</property>
+ <property name="primary_icon_sensitive">False</property>
+ <property name="secondary_icon_tooltip_text" translatable="yes">Clear the search</property>
+ <property name="secondary_icon_tooltip_markup" translatable="yes">Clear the search</property>
+ <signal name="changed" handler="on_search_torrents_entry_changed" swapped="no"/>
+ <signal name="icon-press" handler="on_search_torrents_entry_icon_press" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">1</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="search_torrents_match">
+ <property name="label" translatable="yes">_Match Case</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_search_torrents_match_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">1</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">out</property>
+ <child>
+ <object class="GtkTreeView" id="torrent_view">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="rules_hint">True</property>
+ <property name="enable_search">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="torrent_info">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tab_pos">left</property>
+ <property name="show_border">False</property>
+ <property name="scrollable">True</property>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkStatusbar" id="statusbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/move_storage_dialog.ui b/deluge/ui/gtk3/glade/move_storage_dialog.ui
new file mode 100644
index 0000000..542d40a
--- /dev/null
+++ b/deluge/ui/gtk3/glade/move_storage_dialog.ui
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="move_storage_dialog">
+ <property name="width_request">500</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Move Download Folder</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_cancel">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_ok">
+ <property name="label" translatable="yes">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-save-as-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Move the torrent(s) download folder.</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Destination:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">button_cancel</action-widget>
+ <action-widget response="-5">button_ok</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/other_dialog.ui b/deluge/ui/gtk3/glade/other_dialog.ui
new file mode 100644
index 0000000..26d3d08
--- /dev/null
+++ b/deluge/ui/gtk3/glade/other_dialog.ui
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">-1</property>
+ <property name="upper">2097151</property>
+ <property name="value">-1</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkDialog" id="other_dialog">
+ <property name="app_paintable">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="modal">True</property>
+ <property name="window_position">mouse</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button3">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button4">
+ <property name="label" translatable="yes">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkImage" id="image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_header">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label">label</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator2">
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSpinButton" id="spinbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">6</property>
+ <property name="activates_default">True</property>
+ <property name="width_chars">6</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment1</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_type">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">label</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">button3</action-widget>
+ <action-widget response="-5">button4</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/path_combo_chooser.ui b/deluge/ui/gtk3/glade/path_combo_chooser.ui
new file mode 100644
index 0000000..f79685d
--- /dev/null
+++ b/deluge/ui/gtk3/glade/path_combo_chooser.ui
@@ -0,0 +1,1002 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment3">
+ <property name="lower">-1</property>
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkDialog" id="completion_config_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Properties</property>
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <signal name="delete-event" handler="on_completion_config_dialog_delete_event" swapped="no"/>
+ <signal name="key-release-event" handler="on_completion_config_dialog_key_release_event" swapped="no"/>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="config_dialog_button_close">
+ <property name="label" translatable="yes">Close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_config_dialog_button_close_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="config_general_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="bottom_padding">3</property>
+ <property name="left_padding">15</property>
+ <property name="right_padding">10</property>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="visible_rows_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Max drop down rows</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="visible_rows_spinbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">2</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment3</property>
+ <property name="climb_rate">1</property>
+ <property name="numeric">True</property>
+ <signal name="value-changed" handler="on_visible_rows_spinbutton_value_changed" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;General&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="bottom_padding">3</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkBox" id="vbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="show_path_entry_checkbutton">
+ <property name="label" translatable="yes">Show path entry</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_show_path_entry_checkbutton_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="show_filechooser_checkbutton">
+ <property name="label" translatable="yes">Show file chooser</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_show_filechooser_checkbutton_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkCheckButton" id="show_folder_name_on_button_checkbutton">
+ <property name="label" translatable="yes">Show folder name</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_show_folder_name_on_button_checkbutton_toggled" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Path Chooser Type</property>
+ <property name="use_markup">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="bottom_padding">3</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkGrid" id="table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">5</property>
+ <property name="column_spacing">5</property>
+ <child>
+ <object class="GtkCheckButton" id="enable_auto_completion_checkbutton">
+ <property name="label" translatable="yes">Enable autocomplete</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_enable_auto_completion_checkbutton_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="show_hidden_files_checkbutton">
+ <property name="label" translatable="yes">Show hidden files</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_show_hidden_files_checkbutton_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="set_completion_accelerator_button">
+ <property name="label" translatable="yes">Set new key</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Press this key to set new key accelerators to trigger auto-complete</property>
+ <signal name="activate" handler="on_set_completion_accelerator_button_pressed" swapped="no"/>
+ <signal name="clicked" handler="on_set_completion_accelerator_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Autocomplete</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="config_short_cuts_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">etched-out</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">4</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">15</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkGrid" id="table3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">2</property>
+ <property name="column_spacing">10</property>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Autocomplete</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Save path</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Ctrl+S</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="completion_accelerator_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Ctrl+E</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Ctrl+R</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Ctrl+H</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Ctrl+D</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Edit path</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Remove path</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="margin_right">8</property>
+ <property name="label" translatable="yes">Toggle hidden files</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Default path</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Shortcuts</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">config_dialog_button_close</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkWindow" id="combobox_window">
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="entry_combobox_hbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">3</property>
+ <signal name="realize" handler="on_entry_combobox_hbox_realize" swapped="no"/>
+ <child>
+ <object class="GtkFileChooserButton" id="filechooser_button">
+ <property name="width_request">160</property>
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="action">select-folder</property>
+ <property name="local_only">False</property>
+ <property name="preview_widget_active">False</property>
+ <property name="title" translatable="yes">Select a Directory</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_open_dialog">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_open_dialog_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">folder-open-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="folder_name_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_text">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <signal name="changed" handler="on_entry_text_changed" swapped="no"/>
+ <signal name="delete-text" handler="on_entry_text_delete_text" swapped="no"/>
+ <signal name="focus-out-event" handler="on_entry_text_focus_out_event" swapped="no"/>
+ <signal name="insert-text" handler="on_entry_text_insert_text" swapped="yes"/>
+ <signal name="key-press-event" handler="on_entry_text_key_press_event" swapped="no"/>
+ <signal name="scroll-event" handler="on_entry_text_scroll_event" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="button_toggle_dropdown">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Saved paths</property>
+ <signal name="button-press-event" handler="on_button_toggle_dropdown_button_press_event" swapped="no"/>
+ <signal name="scroll-event" handler="on_button_toggle_dropdown_scroll_event" swapped="no"/>
+ <signal name="toggled" handler="on_button_toggle_dropdown_toggled" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="height_request">15</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkArrow" id="arrow2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="arrow_type">down</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkListStore" id="completion_tree_store">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkWindow" id="completion_popup_window">
+ <property name="can_focus">False</property>
+ <property name="type">popup</property>
+ <property name="resizable">False</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">combo</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
+ <property name="decorated">False</property>
+ <property name="deletable">False</property>
+ <signal name="button-press-event" handler="on_completion_popup_window_button_press_event" swapped="no"/>
+ <signal name="focus-out-event" handler="on_completion_popup_window_focus_out_event" swapped="no"/>
+ <signal name="key-press-event" handler="on_completion_popup_window_key_press_event" swapped="no"/>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="popup_content_box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">3</property>
+ <property name="spacing">1</property>
+ <child>
+ <object class="GtkScrolledWindow" id="completion_scrolled_window">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="completion_treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="model">completion_tree_store</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ <property name="enable_search">False</property>
+ <property name="search_column">0</property>
+ <property name="show_expanders">False</property>
+ <signal name="button-press-event" handler="on_completion_treeview_mouse_button_press_event" swapped="no"/>
+ <signal name="key-press-event" handler="on_completion_treeview_key_press_event" swapped="no"/>
+ <signal name="motion-notify-event" handler="on_completion_treeview_motion_notify_event" swapped="no"/>
+ <signal name="scroll-event" handler="on_completion_treeview_scroll_event" swapped="no"/>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection1"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="completion_treeview_column">
+ <property name="sizing">autosize</property>
+ <property name="fixed_width">129</property>
+ <property name="title" translatable="yes">column</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="completion_cellrenderertext"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkDialog" id="filechooserdialog">
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">Choose a folder</property>
+ <property name="modal">True</property>
+ <property name="window_position">center</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="box1">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="buttonbox1">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="filechooser_button_cancel">
+ <property name="label" translatable="yes">Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="filechooser_button_open">
+ <property name="label" translatable="yes">Open</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFileChooserWidget" id="filechooser_widget">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action">select-folder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="2">filechooser_button_cancel</action-widget>
+ <action-widget response="0">filechooser_button_open</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkListStore" id="stored_values_tree_store">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkWindow" id="stored_values_popup_window">
+ <property name="can_focus">False</property>
+ <property name="type">popup</property>
+ <property name="resizable">False</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">popup-menu</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
+ <property name="decorated">False</property>
+ <property name="deletable">False</property>
+ <signal name="button-press-event" handler="on_stored_values_popup_window_button_press_event" swapped="no"/>
+ <signal name="focus-out-event" handler="on_stored_values_popup_window_focus_out_event" swapped="no"/>
+ <signal name="hide" handler="on_stored_values_popup_window_hide" swapped="no"/>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">3</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="stored_values_treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="model">stored_values_tree_store</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ <property name="search_column">0</property>
+ <property name="show_expanders">False</property>
+ <signal name="button-press-event" handler="on_stored_values_treeview_mouse_button_press_event" swapped="no"/>
+ <signal name="key-press-event" handler="on_stored_values_treeview_key_press_event" swapped="no"/>
+ <signal name="key-release-event" handler="on_stored_values_treeview_key_release_event" swapped="no"/>
+ <signal name="scroll-event" handler="on_stored_values_treeview_scroll_event" swapped="no"/>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection2"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="stored_values_treeview_column">
+ <property name="sizing">autosize</property>
+ <property name="fixed_width">127</property>
+ <property name="title" translatable="yes">column</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="stored_values_cellrenderertext">
+ <signal name="edited" handler="on_cellrenderertext_edited" swapped="no"/>
+ </object>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkButtonBox" id="buttonbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">1</property>
+ <property name="layout_style">start</property>
+ <signal name="key-press-event" handler="on_buttonbox_key_press_event" swapped="no"/>
+ <child>
+ <object class="GtkButton" id="button_add">
+ <property name="label" translatable="yes">Add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Add the current entry value to the list</property>
+ <signal name="clicked" handler="on_button_add_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_edit">
+ <property name="label" translatable="yes">Edit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Edit the selected entry</property>
+ <signal name="clicked" handler="on_button_edit_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_remove">
+ <property name="label" translatable="yes">Remove</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Remove the selected entry</property>
+ <signal name="clicked" handler="on_button_remove_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_up">
+ <property name="label" translatable="yes">Up</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Move the selected entry up</property>
+ <signal name="clicked" handler="on_button_up_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_down">
+ <property name="label" translatable="yes">Down</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Move the selected entry down</property>
+ <signal name="clicked" handler="on_button_down_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_default">
+ <property name="label" translatable="yes">Default</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">No default path set</property>
+ <signal name="clicked" handler="on_button_default_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_properties">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Open properties dialog</property>
+ <signal name="clicked" handler="on_button_properties_clicked" swapped="no"/>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-properties-symbolic</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">2</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/preferences_dialog.ui b/deluge/ui/gtk3/glade/preferences_dialog.ui
new file mode 100644
index 0000000..e1bbc74
--- /dev/null
+++ b/deluge/ui/gtk3/glade/preferences_dialog.ui
@@ -0,0 +1,5020 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAdjustment" id="adjustment_cache_expiry">
+ <property name="lower">1</property>
+ <property name="upper">32000</property>
+ <property name="value">60</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_cache_size">
+ <property name="upper">999999</property>
+ <property name="value">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_share_ratio">
+ <property name="lower">0.5</property>
+ <property name="upper">100</property>
+ <property name="value">2</property>
+ <property name="step_increment">0.10000000000000001</property>
+ <property name="page_increment">1</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_share_ratio_limit">
+ <property name="lower">-1</property>
+ <property name="upper">100</property>
+ <property name="value">1.5</property>
+ <property name="step_increment">0.10000000000000001</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_active">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_daemon_port">
+ <property name="upper">65535</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_downloading">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_incoming_port">
+ <property name="upper">65535</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_max_conn_global">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_max_conn_per_sec">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_max_conn_per_torrent">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_max_download">
+ <property name="lower">-1</property>
+ <property name="upper">2097151</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_max_download_per_torrent">
+ <property name="lower">-1</property>
+ <property name="upper">2097151</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_max_half_open_conn">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_max_upload">
+ <property name="lower">-1</property>
+ <property name="upper">2097151</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_max_upload_per_torrent">
+ <property name="lower">-1</property>
+ <property name="upper">2097151</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_max_upload_slots_global">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_max_upload_slots_per_torrent">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_outgoing_port_max">
+ <property name="upper">65535</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_outgoing_port_min">
+ <property name="upper">65535</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_proxy_port">
+ <property name="upper">65535</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_seed_time_limit">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_spin_seeding">
+ <property name="lower">-1</property>
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_time_ratio_limit">
+ <property name="lower">-1</property>
+ <property name="upper">100</property>
+ <property name="value">6</property>
+ <property name="step_increment">0.10000000000000001</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkListStore" id="liststore1">
+ <columns>
+ <!-- column-name item -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Forced</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Enabled</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Disabled</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="liststore2">
+ <columns>
+ <!-- column-name item -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Handshake</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Full Stream</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Either</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="liststore3">
+ <columns>
+ <!-- column-name item -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Forced</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Enabled</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Disabled</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="liststore8">
+ <columns>
+ <!-- column-name language_code -->
+ <column type="gchararray"/>
+ <!-- column-name language_name -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkListStore" id="liststore_proxy">
+ <columns>
+ <!-- column-name item -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">None</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Socks4</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Socks5</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Socks5 Auth</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">HTTP</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">HTTP Auth</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">I2P</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkDialog" id="pref_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Preferences</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="default_width">450</property>
+ <property name="default_height">500</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <signal name="configure-event" handler="on_pref_dialog_configure_event" swapped="no"/>
+ <signal name="delete-event" handler="on_pref_dialog_delete_event" swapped="no"/>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_cancel">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_cancel_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_apply">
+ <property name="label" translatable="yes">_Apply</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_apply_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_ok">
+ <property name="label" translatable="yes">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_ok_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkPaned" id="hpaned1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <child>
+ <object class="GtkTreeView" id="treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection1"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="notebook">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">False</property>
+ <property name="scrollable">True</property>
+ <child>
+ <object class="GtkScrolledWindow" id="InterfaceScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="interface_viewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="interface_vbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame_app_mode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment_app_mode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">3</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkBox" id="hbox_app_mode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkRadioButton" id="radio_standalone">
+ <property name="label" translatable="yes">Standalone</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">The standalone self-contained application</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="radio_thinclient">
+ <property name="label" translatable="yes">Thin Client</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Connect to a Deluge daemon (deluged)</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">radio_standalone</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">7</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label_client_mode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Application Mode</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkBox" id="vbox27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_show_rate_in_title">
+ <property name="label" translatable="yes">Show session speed in titlebar</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_focus_main_window_on_add">
+ <property name="label" translatable="yes">Focus window when adding torrent</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="piecesbar_toggle">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">The pieces bar
+will increase bandwidth use between client
+and daemon (does not apply in Standalone mode).</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_piecesbar_toggle_toggled" swapped="no"/>
+ <child>
+ <object class="GtkLabel" id="label62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Show a pieces bar in Status tab</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkExpander" id="piecebar_colors_expander">
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkAlignment" id="alignment58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">25</property>
+ <child>
+ <object class="GtkGrid" id="table6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">1</property>
+ <property name="column_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Completed:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="completed_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="color-set" handler="on_completed_color_set" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Downloading:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="downloading_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="color-set" handler="on_downloading_color_set" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Waiting:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="waiting_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="color-set" handler="on_waiting_color_set" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Missing:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="missing_color">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="color-set" handler="on_missing_color_set" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="revert_color_completed">
+ <property name="label" translatable="yes">_Revert</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Revert color to default</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">right</property>
+ <signal name="clicked" handler="on_revert_color_completed_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="revert_color_downloading">
+ <property name="label" translatable="yes">_Revert</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Revert color to default</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">right</property>
+ <signal name="clicked" handler="on_revert_color_downloading_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="revert_color_waiting">
+ <property name="label" translatable="yes">_Revert</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Revert color to default</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">right</property>
+ <signal name="clicked" handler="on_revert_color_waiting_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="revert_color_missing">
+ <property name="label" translatable="yes">_Revert</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Revert color to default</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">right</property>
+ <signal name="clicked" handler="on_revert_color_missing_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Piece Colors</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label106">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Main Window</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkBox" id="vbox17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_use_tray">
+ <property name="label" translatable="yes">Enable system tray icon</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment_tray_type">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="hbox_tray_type">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkRadioButton" id="radio_appind">
+ <property name="label" translatable="yes">App Indicator</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">radio_systray</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">10</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="radio_systray">
+ <property name="label" translatable="yes">Systray</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment_min_on_close">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_min_on_close">
+ <property name="label" translatable="yes">Minimize to tray on close</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment_start_in_tray">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_start_in_tray">
+ <property name="label" translatable="yes">Start in tray</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment_lock_tray">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="bottom_padding">3</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_lock_tray">
+ <property name="label" translatable="yes">Password protect system tray</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment_tray_password">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">20</property>
+ <child>
+ <object class="GtkBox" id="hbox_tray_password">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="password_label">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Password:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="txt_tray_password">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="width_chars">16</property>
+ <property name="text">********</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">System Tray</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkBox" id="vbox18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkAlignment" id="alignment36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_show_new_releases">
+ <property name="label" translatable="yes">Notify about new releases</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Updates</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton_language">
+ <property name="label" translatable="yes">System Default</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_checkbutton_language_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">20</property>
+ <child>
+ <object class="GtkComboBox" id="combobox_language">
+ <property name="can_focus">False</property>
+ <property name="model">liststore8</property>
+ <property name="active">0</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext8"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Languge&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">page 6</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="DownloadsScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="downloads_vbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkGrid" id="table9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">1</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_move_completed">
+ <property name="label" translatable="yes">Move completed to:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_copy_torrent_file">
+ <property name="label" translatable="yes">Copy of .torrent files to:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_del_copy_torrent_file">
+ <property name="label" translatable="yes">Delete copy of torrent file on remove</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Delete the copy of the torrent file created when the torrent is removed</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Download to:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">15</property>
+ <child>
+ <object class="GtkBox" id="hbox_download_to_path_chooser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">15</property>
+ <child>
+ <object class="GtkBox" id="hbox_move_completed_to_path_chooser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">15</property>
+ <child>
+ <object class="GtkBox" id="hbox_copy_torrent_files_path_chooser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Download Folders</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="newvbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_prioritize_first_last_pieces">
+ <property name="label" translatable="yes">Prioritize first and last pieces of torrent</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Prioritize first and last pieces of files in torrent</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_sequential_download">
+ <property name="label" translatable="yes">Sequential download</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">When enabled, the piece picker will pick pieces in
+sequence instead of rarest first.
+
+Enabling sequential download will affect the piece
+distribution negatively in the swarm. It should be
+used sparingly.</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_add_paused">
+ <property name="label" translatable="yes">Add torrents in Paused state</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_pre_allocation">
+ <property name="label" translatable="yes">Pre-allocate disk space</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Pre-allocate the disk space for the torrent files</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Add Torrent Options</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_show_dialog">
+ <property name="label" translatable="yes">Always show</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_focus_dialog">
+ <property name="label" translatable="yes">Bring the dialog to focus</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Add Torrents Dialog</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">3</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">page 7</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="BandwidthScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="vbox7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkGrid" id="table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">10</property>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_connections_per_second">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_max_conn_per_sec</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_half_open_connections">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_max_half_open_conn</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Connection Attempts per Second:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Half-Open Connections:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">The maximum number of connections allowed. Set -1 for unlimited.</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Connections:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">The maximum upload slots for all torrents. Set -1 for unlimited.</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Upload Slots:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_connections_global">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">The maximum number of connections allowed. Set -1 for unlimited.</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_max_conn_global</property>
+ <property name="climb_rate">1</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">if-valid</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">The maximum download speed for all torrents. Set -1 for unlimited.</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Download Speed:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_download">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">The maximum download speed for all torrents. Set -1 for unlimited.</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_max_download</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">1</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_upload">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">The maximum upload speed for all torrents. Set -1 for unlimited.</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_max_upload</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">1</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_upload_slots_global">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">The maximum upload slots for all torrents. Set -1 for unlimited.</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_max_upload_slots_global</property>
+ <property name="climb_rate">1</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">KiB/s</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">KiB/s</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">The maximum upload speed for all torrents. Set -1 for unlimited.</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Upload Speed:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">5</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_ignore_limits_on_local_network">
+ <property name="label" translatable="yes">Ignore limits on local network</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">5</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_rate_limit_ip_overhead">
+ <property name="label" translatable="yes">Rate limit IP overhead</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">If checked, the estimated TCP/IP overhead is drained from the rate limiters, to avoid exceeding the limits with the total traffic</property>
+ <property name="halign">start</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Global Bandwidth Limits</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkGrid" id="table4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">10</property>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_upload_slots_per_torrent">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">The maximum upload slots per torrent. Set -1 for unlimited.</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_max_upload_slots_per_torrent</property>
+ <property name="climb_rate">1</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_connections_per_torrent">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">The maximum number of connections per torrent. Set -1 for unlimited.</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_max_conn_per_torrent</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Connections:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Upload Slots:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Download Speed:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Upload Speed:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_download_per_torrent">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">The maximum number download speed per torrent. Set -1 for unlimited.</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_max_download_per_torrent</property>
+ <property name="digits">1</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_max_upload_per_torrent">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">The maximum upload speed per torrent. Set -1 for unlimited.</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_max_upload_per_torrent</property>
+ <property name="digits">1</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">KiB/s</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="label" translatable="yes">KiB/s</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Per-Torrent Bandwidth Limits</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">page 8</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="QueueScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <child>
+ <object class="GtkBox" id="queue_prefs_box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkFrame" id="frame10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_queue_new_top">
+ <property name="label" translatable="yes">Queue to top</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">New Torrents</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkGrid" id="table3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">10</property>
+ <child>
+ <object class="GtkSpinButton" id="spin_active">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_active</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_seeding">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_seeding</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Seeding:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Total:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_downloading">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_downloading</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Downloading:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_dont_count_slow_torrents">
+ <property name="label" translatable="yes">Ignore slow torrents</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Torrents not transfering any data do not count towards download/seeding active count.</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_auto_manage_prefer_seeds">
+ <property name="label" translatable="yes">Prefer seeding torrents</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Give preference to seeding torrents over downloading torrents.</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Active Torrents</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkGrid" id="table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">10</property>
+ <child>
+ <object class="GtkLabel" id="label53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Share Ratio:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Time Ratio:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Time (m):</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_seed_time_limit">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_seed_time_limit</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_seed_time_ratio_limit">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_time_ratio_limit</property>
+ <property name="digits">2</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_share_ratio_limit">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_share_ratio_limit</property>
+ <property name="digits">2</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Seeding Rotation</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_share_ratio">
+ <property name="label" translatable="yes">Share Ratio:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_share_ratio">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_share_ratio</property>
+ <property name="digits">2</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">10</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkBox" id="vbox8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkRadioButton" id="radio_pause_ratio">
+ <property name="label" translatable="yes">Pause Torrent</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="radio_remove_ratio">
+ <property name="label" translatable="yes">Remove Torrent</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">radio_pause_ratio</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">3</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Share Ratio Reached</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">page 10</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="NetworkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkEntry" id="entry_interface">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">The IP address of the interface to listen for incoming bittorrent connections on. Leave this empty if you want to use the default.</property>
+ <property name="max_length">15</property>
+ <property name="width_chars">15</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label110">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Incoming Address</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSpinButton" id="spin_incoming_port">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">5</property>
+ <property name="max_width_chars">6</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_incoming_port</property>
+ <property name="climb_rate">1</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_random_incoming_port">
+ <property name="label" translatable="yes">Random</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Uses random ports in range 49152 to 65525</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Active Port:</property>
+ <property name="justify">right</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="active_port_label">
+ <property name="width_request">50</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">0</property>
+ <property name="width_chars">5</property>
+ <attributes>
+ <attribute name="style" value="italic"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_testport">
+ <property name="label" translatable="yes">Test Active Port</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="image_position">right</property>
+ <signal name="clicked" handler="on_test_port_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkImage" id="port_img">
+ <property name="can_focus">False</property>
+ <property name="icon_name">dialog-question-symbolic</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Incoming Port</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkEntry" id="entry_outgoing_interface">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">
+The network interface name or IP address for outgoing BitTorrent connections. (Leave empty for default.)
+ </property>
+ <property name="max_length">15</property>
+ <property name="invisible_char">â—</property>
+ <property name="width_chars">15</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Outgoing Interface</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_random_outgoing_ports">
+ <property name="label" translatable="yes">Random</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Uses random ports in range 49152 to 65525</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_toggle" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">From:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_outgoing_port_min">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">5</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_outgoing_port_min</property>
+ <property name="climb_rate">1</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">To:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_outgoing_port_max">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">5</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_outgoing_port_max</property>
+ <property name="climb_rate">1</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Outgoing Ports</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkBox" id="hbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkGrid" id="table7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">5</property>
+ <child>
+ <object class="GtkComboBox" id="combo_encout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="model">liststore3</property>
+ <signal name="changed" handler="on_combo_encryption_changed" swapped="no"/>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext3"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="combo_encin">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="model">liststore1</property>
+ <signal name="changed" handler="on_combo_encryption_changed" swapped="no"/>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Outgoing:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Incoming:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="hbox15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Level:</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="combo_enclevel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="model">liststore2</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Encryption</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">4</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkGrid" id="table8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">1</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_upnp">
+ <property name="label" translatable="yes">UPnP</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Universal Plug and Play</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_natpmp">
+ <property name="label" translatable="yes">NAT-PMP</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">NAT Port Mapping Protocol</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_utpex">
+ <property name="label" translatable="yes">Peer Exchange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Exchanges peers between clients. (Disabling requires restart)</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_lsd">
+ <property name="label" translatable="yes">LSD</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Local Service Discovery finds local peers on your network.</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_dht">
+ <property name="label" translatable="yes">DHT</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Distributed hash table may improve the amount of active connections.</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label_peer_tos">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Peer TOS Byte:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_peer_tos">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">4</property>
+ <property name="invisible_char">•</property>
+ <property name="width_chars">1</property>
+ <property name="text">0x00</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Network Extras</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">page 11</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="ProxyScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="vbox26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkFrame" id="frame_proxy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+ <child>
+ <object class="GtkGrid" id="table11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label_proxy_pass">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Password:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_proxy_pass">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_proxy_host">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Hostname:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_proxy_host">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <signal name="paste-clipboard" handler="on_entry_proxy_host_paste_clipboard" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_proxy_port">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Port:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment_proxy_port">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSpinButton" id="spin_proxy_port">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_proxy_port</property>
+ <property name="numeric">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_proxy_user">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="combo_proxy_type">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="model">liststore_proxy</property>
+ <signal name="changed" handler="on_combo_proxy_type_changed" swapped="no"/>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext4"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_proxy_user">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Username:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_proxy_host_resolve">
+ <property name="label" translatable="yes">Proxy Hostnames</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Hostnames should be attempted to be resolved through
+the proxy instead of using the local DNS service</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_proxy_peer_conn">
+ <property name="label" translatable="yes">Proxy Peers</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Proxy peer and web seed connections.</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_proxy_tracker_conn">
+ <property name="label" translatable="yes">Proxy Trackers</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label_proxy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Proxy</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame_anon_mode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="vbox9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkAlignment" id="alignment_force_proxy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_force_proxy">
+ <property name="label" translatable="yes">Force Proxy Use</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment_anon_mode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_anonymous_mode">
+ <property name="label" translatable="yes">Hide Client Identity</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Attempt to hide client identity and only use proxy for incoming connections.</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label_force_proxy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Force Proxy</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">page 11</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="CacheScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="vbox31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkGrid" id="table14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label114">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Cache Size (16 KiB blocks):</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label115">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">The number of seconds from the last cached write to a piece in the write cache, to when it's forcefully flushed to disk. Default is 60 seconds.</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Cache Expiry (seconds):</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_cache_size">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_cache_size</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">if-valid</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_cache_expiry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">5</property>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_cache_expiry</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label112">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Settings</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkGrid" id="table18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label116">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">The total number of 16 KiB blocks written to disk since this session was started.</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Blocks Written:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label120">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">The total number of write operations performed since this session was started.</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Writes:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label124">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">The ratio (blocks_written - writes) / blocks_written represents the number of saved write operations per total write operations, i.e. a kind of cache hit ratio for the write cache.</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Write Cache Hit Ratio:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_cache_num_blocks_written">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_cache_write_ops">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_cache_write_hit_ratio">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label132">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Write</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkGrid" id="table19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label118">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">The number of blocks that were requested from the bittorrent engine (from peers), that were served from disk or cache.</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Blocks Read:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label119">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">The number of blocks that were served from cache.</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Blocks Read Hit:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label122">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">The cache hit ratio for the read cache.</property>
+ <property name="label" translatable="yes">Read Cache Hit Ratio:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_cache_num_blocks_read">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_cache_num_blocks_cache_hits">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_cache_read_hit_ratio">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label121">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">The total number of read operations performed since this session was started.</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Reads:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_cache_read_ops">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label133">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Read</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkGrid" id="table20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label123">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">The number of 16 KiB blocks currently in the disk cache. This includes both read and write cache.</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Cache Size:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label117">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Read Cache Size:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_cache_disk_blocks_in_use">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_cache_read_cache_blocks">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label134">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Size</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="hbuttonbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">start</property>
+ <child>
+ <object class="GtkButton" id="button_cache_refresh">
+ <property name="label" translatable="yes">_Refresh</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_cache_refresh_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label113">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Status</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">page 12</property>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="OtherScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="vbox16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">40</property>
+ <child>
+ <object class="GtkBox" id="vbox19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="label44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Help us improve Deluge by sending us your Python version, PyGTK version, OS and processor types. Absolutely no other information is sent.</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">2</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_send_info">
+ <property name="label" translatable="yes">Yes, please send anonymous statistics</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">System Information</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="box20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label109">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Location:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_geoip">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">If Deluge cannot find the database file at this location it will fallback to using DNS to resolve the peer's country.</property>
+ <property name="invisible_char">â—</property>
+ <property name="truncate_multiline">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label108">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">GeoIP Database</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkButtonBox" id="hbuttonbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">start</property>
+ <child>
+ <object class="GtkButton" id="button_associate_magnet">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_associate_magnet_clicked" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkImage" id="image_magnet">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">image-missing</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Associate with Deluge</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Magnet Links</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="DaemonScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="vbox13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="hbox12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Daemon port:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spin_daemon_port">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_width_chars">6</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment_spin_daemon_port</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Port</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_allow_remote_connections">
+ <property name="label" translatable="yes">Allow Remote Connections</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Connections</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">5</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_new_releases">
+ <property name="label" translatable="yes">Periodically check the website for new releases</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Other</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="AccountsFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">20</property>
+ <child>
+ <object class="GtkBox" id="hbox22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkButtonBox" id="vbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <property name="homogeneous">True</property>
+ <property name="layout_style">start</property>
+ <child>
+ <object class="GtkButton" id="accounts_add">
+ <property name="label" translatable="yes">_Add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_accounts_add_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="accounts_edit">
+ <property name="label" translatable="yes">_Edit</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_accounts_edit_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="accounts_delete">
+ <property name="label" translatable="yes">_Delete</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_accounts_delete_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">4</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <property name="min_content_height">150</property>
+ <child>
+ <object class="GtkTreeView" id="accounts_listview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection2"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Accounts</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="PluginsScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="vbox28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkPaned" id="vpaned1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="plugin_listview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection3"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow11">
+ <property name="height_request">115</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkViewport" id="viewport12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkFrame" id="frame8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkGrid" id="table10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label_plugin_details">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_plugin_version">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_plugin_author">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Details:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Version:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Author:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Homepage:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Author Email:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_plugin_homepage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_plugin_email">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Info</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">center</property>
+ <child>
+ <object class="GtkButton" id="button_plugin_install">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_plugin_install_clicked" swapped="no"/>
+ <child>
+ <object class="GtkLabel" id="label28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Install</property>
+ <property name="use_markup">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_rescan_plugins">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_rescan_plugins_clicked" swapped="no"/>
+ <child>
+ <object class="GtkLabel" id="label30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Refresh</property>
+ <property name="use_markup">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_find_plugins">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_find_plugins_clicked" swapped="no"/>
+ <child>
+ <object class="GtkLabel" id="label107">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Find More...</property>
+ <property name="use_markup">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child type="tab">
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button_cancel</action-widget>
+ <action-widget response="0">button_apply</action-widget>
+ <action-widget response="0">button_ok</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/queuedtorrents.ui b/deluge/ui/gtk3/glade/queuedtorrents.ui
new file mode 100644
index 0000000..528ef64
--- /dev/null
+++ b/deluge/ui/gtk3/glade/queuedtorrents.ui
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="queued_torrents_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Queued Torrents</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="default_width">450</property>
+ <property name="default_height">300</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button_close">
+ <property name="label" translatable="yes">_Close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_close_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_add">
+ <property name="label" translatable="yes">_Add</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="has_focus">True</property>
+ <property name="is_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_add_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">list-add-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Add Queued Torrents</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeselection"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">start</property>
+ <child>
+ <object class="GtkButton" id="button_remove">
+ <property name="label" translatable="yes">_Remove</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_remove_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_clear">
+ <property name="label" translatable="yes">_Clear</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <signal name="clicked" handler="on_button_clear_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_autoadd">
+ <property name="label" translatable="yes">Automatically add torrents on connect</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_autoadd_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button_close</action-widget>
+ <action-widget response="0">button_add</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/remove_torrent_dialog.ui b/deluge/ui/gtk3/glade/remove_torrent_dialog.ui
new file mode 100644
index 0000000..4a92037
--- /dev/null
+++ b/deluge/ui/gtk3/glade/remove_torrent_dialog.ui
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkDialog" id="remove_torrent_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Remove Torrent</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="cancel_button">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok_button">
+ <property name="label" translatable="yes">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">dialog-warning-symbolic</property>
+ <property name="icon_size">6</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_title">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Remove the selected torrent(s)?</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.3"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_torrents">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ellipsize">end</property>
+ <attributes>
+ <attribute name="style" value="italic"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckButton" id="delete_files">
+ <property name="label" translatable="yes">Include downloaded files</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_delete_files_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="warning_label">
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">(This is permanent!)</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="0.90000000000000002"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">1</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">cancel_button</action-widget>
+ <action-widget response="-5">ok_button</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/torrent_menu.options.ui b/deluge/ui/gtk3/glade/torrent_menu.options.ui
new file mode 100644
index 0000000..df34445
--- /dev/null
+++ b/deluge/ui/gtk3/glade/torrent_menu.options.ui
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkImage" id="download-limit-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">deluge-downloading</property>
+ </object>
+ <object class="GtkImage" id="max-connections-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">network-transmit-receive-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="upload-limit-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">deluge-seeding</property>
+ </object>
+ <object class="GtkImage" id="upload-slots-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">view-sort-descending-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkMenu" id="options_torrent_menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_down_speed">
+ <property name="label" translatable="yes">_Download Speed Limit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">download-limit-image</property>
+ <property name="use_stock">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_up_speed">
+ <property name="label" translatable="yes">_Upload Speed Limit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">upload-limit-image</property>
+ <property name="use_stock">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_max_connections">
+ <property name="label" translatable="yes">_Connection Limit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">max-connections-image</property>
+ <property name="use_stock">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_upload_slots">
+ <property name="label" translatable="yes">Upload _Slot Limit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">upload-slots-image</property>
+ <property name="use_stock">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menuitem_stop_seed_at_ratio">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Stop seed at _ratio</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menuitem_auto_managed">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Auto Managed</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menuitem_super_seeding">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="label" translatable="yes">_Super Seeding</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menuitem_change_owner">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Change Ownership</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/torrent_menu.queue.ui b/deluge/ui/gtk3/glade/torrent_menu.queue.ui
new file mode 100644
index 0000000..a120af2
--- /dev/null
+++ b/deluge/ui/gtk3/glade/torrent_menu.queue.ui
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-top-symbolic</property>
+ </object>
+ <object class="GtkImage" id="image6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-up-symbolic</property>
+ </object>
+ <object class="GtkImage" id="image7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-down-symbolic</property>
+ </object>
+ <object class="GtkImage" id="image8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-bottom-symbolic</property>
+ </object>
+ <object class="GtkMenu" id="queue_torrent_menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_queue_top">
+ <property name="label" translatable="yes">Top</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="image">image5</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_queue_top_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_queue_up">
+ <property name="label" translatable="yes">Up</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="image">image6</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_queue_up_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_queue_down">
+ <property name="label" translatable="yes">Down</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="image">image7</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_queue_down_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_queue_bottom">
+ <property name="label" translatable="yes">Bottom</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="image">image8</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_queue_bottom_activate" swapped="no"/>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/torrent_menu.ui b/deluge/ui/gtk3/glade/torrent_menu.ui
new file mode 100644
index 0000000..c1b77b4
--- /dev/null
+++ b/deluge/ui/gtk3/glade/torrent_menu.ui
@@ -0,0 +1,225 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAccelGroup" id="accelgroup1"/>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">preferences-system-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image1">
+ <property name="can_focus">False</property>
+ <property name="icon_name">media-playback-stop-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-edit-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">media-playback-start-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image14">
+ <property name="can_focus">False</property>
+ <property name="icon_name">media-playback-pause-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">media-playlist-shuffle-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">media-playlist-repeat-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">view-refresh-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">edit-redo-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">folder-open-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-save-as-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="menu-item-image9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">list-remove-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkMenu" id="torrent_menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_open_folder">
+ <property name="label" translatable="yes">_Open Download Folder</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">menu-item-image7</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_open_folder_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_pause">
+ <property name="label" translatable="yes">_Pause</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">menu-item-image14</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_pause_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_resume">
+ <property name="label" translatable="yes">Resu_me</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Resume selected torrents.</property>
+ <property name="use_underline">True</property>
+ <property name="image">menu-item-image13</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_resume_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_options">
+ <property name="label" translatable="yes">Opt_ions</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">image1</property>
+ <property name="use_stock">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator_menuitem16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_queue">
+ <property name="label" translatable="yes">_Queue</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">menu-item-image19</property>
+ <property name="use_stock">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_updatetracker">
+ <property name="label" translatable="yes">_Update Tracker</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">menu-item-image5</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_updatetracker_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_edittrackers">
+ <property name="label" translatable="yes">_Edit Trackers</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">menu-item-image12</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_edittrackers_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_remove">
+ <property name="label" translatable="yes">_Remove Torrent</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">menu-item-image9</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_remove_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_recheck">
+ <property name="label" translatable="yes">_Force Re-check</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">menu-item-image6</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_recheck_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_move">
+ <property name="label" translatable="yes">_Move Download Folder</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">menu-item-image8</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_move_activate" swapped="no"/>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/glade/tray_menu.ui b/deluge/ui/gtk3/glade/tray_menu.ui
new file mode 100644
index 0000000..060b7a0
--- /dev/null
+++ b/deluge/ui/gtk3/glade/tray_menu.ui
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkAccelGroup" id="accelgroup1"/>
+ <object class="GtkImage" id="add-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">list-add-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="download-limit-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="pause-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">media-playback-stop-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="quit-daemon-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">system-shutdown-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="quit-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">application-exit-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="resume-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">media-playlist-repeat-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="upload-limit-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkMenu" id="tray_menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckMenuItem" id="menuitem_show_deluge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Show Deluge</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="on_menuitem_show_deluge_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_add_torrent">
+ <property name="label" translatable="yes">_Add Torrent</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">add-image</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_add_torrent_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_pause_session">
+ <property name="label" translatable="yes">_Pause Session</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">pause-image</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_pause_session_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_resume_session">
+ <property name="label" translatable="yes">_Resume Session</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">resume-image</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_resume_session_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_download_limit">
+ <property name="label" translatable="yes">_Download Speed Limit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">download-limit-image</property>
+ <property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_upload_limit">
+ <property name="label" translatable="yes">_Upload Speed Limit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">upload-limit-image</property>
+ <property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_quitdaemon">
+ <property name="label" translatable="yes">Quit &amp; Shutdown Daemon</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">quit-daemon-image</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="on_menuitem_quitdaemon_activate" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menuitem_quit">
+ <property name="label" translatable="yes">_Quit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="image">quit-image</property>
+ <property name="use_stock">False</property>
+ <property name="accel_group">accelgroup1</property>
+ <signal name="activate" handler="on_menuitem_quit_activate" swapped="no"/>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/deluge/ui/gtk3/gtkui.py b/deluge/ui/gtk3/gtkui.py
new file mode 100644
index 0000000..d93bd2e
--- /dev/null
+++ b/deluge/ui/gtk3/gtkui.py
@@ -0,0 +1,391 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+# pylint: disable=wrong-import-position
+
+from __future__ import division, unicode_literals
+
+import logging
+import os
+import signal
+import sys
+import time
+
+import gi # isort:skip (Required before Gtk import).
+
+gi.require_version('Gtk', '3.0') # NOQA: E402
+gi.require_version('Gdk', '3.0') # NOQA: E402
+
+# isort:imports-thirdparty
+from gi.repository.GLib import set_prgname
+from gi.repository.Gtk import Builder, ResponseType
+from twisted.internet import defer, gtk3reactor
+from twisted.internet.error import ReactorAlreadyInstalledError
+from twisted.internet.task import LoopingCall
+
+try:
+ # Install twisted reactor, before any other modules import reactor.
+ reactor = gtk3reactor.install()
+except ReactorAlreadyInstalledError:
+ # Running unit tests so trial already installed a rector
+ from twisted.internet import reactor
+
+# isort:imports-firstparty
+import deluge.component as component
+from deluge.common import (
+ fsize,
+ fspeed,
+ get_default_download_dir,
+ osx_check,
+ windows_check,
+)
+from deluge.configmanager import ConfigManager, get_config_dir
+from deluge.error import DaemonRunningError
+from deluge.i18n import I18N_DOMAIN, set_language, setup_translation
+from deluge.ui.client import client
+from deluge.ui.hostlist import LOCALHOST
+from deluge.ui.sessionproxy import SessionProxy
+from deluge.ui.tracker_icons import TrackerIcons
+
+# isort:imports-localfolder
+from .addtorrentdialog import AddTorrentDialog
+from .common import associate_magnet_links, windowing
+from .connectionmanager import ConnectionManager
+from .dialogs import YesNoDialog
+from .filtertreeview import FilterTreeView
+from .ipcinterface import IPCInterface, process_args
+from .mainwindow import MainWindow
+from .menubar import MenuBar
+from .pluginmanager import PluginManager
+from .preferences import Preferences
+from .queuedtorrents import QueuedTorrents
+from .sidebar import SideBar
+from .statusbar import StatusBar
+from .systemtray import SystemTray
+from .toolbar import ToolBar
+from .torrentdetails import TorrentDetails
+from .torrentview import TorrentView
+
+set_prgname('deluge')
+log = logging.getLogger(__name__)
+
+try:
+ from setproctitle import setproctitle, getproctitle
+except ImportError:
+
+ def setproctitle(title):
+ return
+
+ def getproctitle():
+ return
+
+
+DEFAULT_PREFS = {
+ 'standalone': True,
+ 'interactive_add': True,
+ 'focus_add_dialog': True,
+ 'enable_system_tray': True,
+ 'close_to_tray': False,
+ 'start_in_tray': False,
+ 'enable_appindicator': False,
+ 'lock_tray': False,
+ 'tray_password': '',
+ 'check_new_releases': True,
+ 'default_load_path': None,
+ 'window_maximized': False,
+ 'window_x_pos': 0,
+ 'window_y_pos': 0,
+ 'window_width': 640,
+ 'window_height': 480,
+ 'pref_dialog_width': None,
+ 'pref_dialog_height': None,
+ 'edit_trackers_dialog_width': None,
+ 'edit_trackers_dialog_height': None,
+ 'tray_download_speed_list': [5.0, 10.0, 30.0, 80.0, 300.0],
+ 'tray_upload_speed_list': [5.0, 10.0, 30.0, 80.0, 300.0],
+ 'connection_limit_list': [50, 100, 200, 300, 500],
+ 'enabled_plugins': [],
+ 'show_connection_manager_on_start': True,
+ 'autoconnect': False,
+ 'autoconnect_host_id': None,
+ 'autostart_localhost': False,
+ 'autoadd_queued': False,
+ 'choose_directory_dialog_path': get_default_download_dir(),
+ 'show_new_releases': True,
+ 'show_sidebar': True,
+ 'show_toolbar': True,
+ 'show_statusbar': True,
+ 'show_tabsbar': True,
+ 'tabsbar_position': 235,
+ 'sidebar_show_zero': False,
+ 'sidebar_show_trackers': True,
+ 'sidebar_show_owners': True,
+ 'sidebar_position': 170,
+ 'show_rate_in_title': False,
+ 'createtorrent.trackers': [],
+ 'show_piecesbar': False,
+ 'pieces_color_missing': [65535, 0, 0],
+ 'pieces_color_waiting': [4874, 56494, 0],
+ 'pieces_color_downloading': [65535, 55255, 0],
+ 'pieces_color_completed': [4883, 26985, 56540],
+ 'focus_main_window_on_add': True,
+ 'language': None,
+}
+
+
+class GtkUI(object):
+ def __init__(self, args):
+ # Setup gtkbuilder/glade translation
+ setup_translation()
+ Builder().set_translation_domain(I18N_DOMAIN)
+
+ # Setup signals
+ def on_die(*args):
+ log.debug('OS signal "die" caught with args: %s', args)
+ reactor.stop()
+
+ self.osxapp = None
+ if windows_check():
+ from win32api import SetConsoleCtrlHandler
+
+ SetConsoleCtrlHandler(on_die, True)
+ log.debug('Win32 "die" handler registered')
+ elif osx_check() and windowing('quartz'):
+ try:
+ import gtkosx_application
+ except ImportError:
+ pass
+ else:
+ self.osxapp = gtkosx_application.gtkosx_application_get()
+ self.osxapp.connect('NSApplicationWillTerminate', on_die)
+ log.debug('OSX quartz "die" handler registered')
+
+ # Set process name again to fix gtk issue
+ setproctitle(getproctitle())
+
+ # Attempt to register a magnet URI handler with gconf, but do not overwrite
+ # if already set by another program.
+ associate_magnet_links(False)
+
+ # Make sure gtk3ui.conf has at least the defaults set
+ self.config = ConfigManager('gtk3ui.conf', DEFAULT_PREFS)
+
+ # Make sure the gtkui state folder has been created
+ if not os.path.exists(os.path.join(get_config_dir(), 'gtk3ui_state')):
+ os.makedirs(os.path.join(get_config_dir(), 'gtk3ui_state'))
+
+ # Set language
+ if self.config['language'] is not None:
+ set_language(self.config['language'])
+
+ # Start the IPC Interface before anything else.. Just in case we are
+ # already running.
+ self.queuedtorrents = QueuedTorrents()
+ self.ipcinterface = IPCInterface(args.torrents)
+
+ # We make sure that the UI components start once we get a core URI
+ client.set_disconnect_callback(self.__on_disconnect)
+
+ self.trackericons = TrackerIcons()
+ self.sessionproxy = SessionProxy()
+ # Initialize various components of the gtkui
+ self.mainwindow = MainWindow()
+ self.menubar = MenuBar()
+ self.toolbar = ToolBar()
+ self.torrentview = TorrentView()
+ self.torrentdetails = TorrentDetails()
+ self.sidebar = SideBar()
+ self.filtertreeview = FilterTreeView()
+ self.preferences = Preferences()
+ self.systemtray = SystemTray()
+ self.statusbar = StatusBar()
+ self.addtorrentdialog = AddTorrentDialog()
+
+ if self.osxapp:
+
+ def nsapp_open_file(osxapp, filename):
+ # Ignore command name which is raised at app launch (python opening main script).
+ if filename == sys.argv[0]:
+ return True
+ process_args([filename])
+
+ self.osxapp.connect('NSApplicationOpenFile', nsapp_open_file)
+ from .menubar_osx import menubar_osx
+
+ menubar_osx(self, self.osxapp)
+ self.osxapp.ready()
+
+ # Initalize the plugins
+ self.plugins = PluginManager()
+
+ # Show the connection manager
+ self.connectionmanager = ConnectionManager()
+
+ # Setup RPC stats logging
+ # daemon_bps: time, bytes_sent, bytes_recv
+ self.daemon_bps = (0, 0, 0)
+ self.rpc_stats = LoopingCall(self.log_rpc_stats)
+ self.closing = False
+
+ # Twisted catches signals to terminate, so have it call a pre_shutdown method.
+ reactor.addSystemEventTrigger('before', 'gtkui_close', self.close)
+
+ def gtkui_sigint_handler(num, frame):
+ log.debug('SIGINT signal caught, firing event: gtkui_close')
+ reactor.callLater(0, reactor.fireSystemEvent, 'gtkui_close')
+
+ signal.signal(signal.SIGINT, gtkui_sigint_handler)
+
+ def start(self):
+ reactor.callWhenRunning(self._on_reactor_start)
+ reactor.run()
+ # Reactor is not running. Any async callbacks (Deferreds) can no longer
+ # be processed from this point on.
+
+ def shutdown(self, *args, **kwargs):
+ log.debug('GTKUI shutting down...')
+ # Shutdown all components
+ if client.is_standalone:
+ return component.shutdown()
+
+ @defer.inlineCallbacks
+ def close(self):
+ if self.closing:
+ return
+ self.closing = True
+ # Make sure the config is saved.
+ self.config.save()
+ # Ensure columns state is saved
+ self.torrentview.save_state()
+ # Shut down components
+ yield self.shutdown()
+
+ # The gtk modal dialogs (e.g. Preferences) can prevent the application
+ # quitting, so force exiting by destroying MainWindow. Must be done here
+ # to avoid hanging when quitting with SIGINT (CTRL-C).
+ self.mainwindow.window.destroy()
+
+ reactor.stop()
+
+ # Restart the application after closing if MainWindow restart attribute set.
+ if component.get('MainWindow').restart:
+ os.execv(sys.argv[0], sys.argv)
+
+ def log_rpc_stats(self):
+ """Log RPC statistics for thinclient mode."""
+ if not client.connected():
+ return
+
+ t = time.time()
+ recv = client.get_bytes_recv()
+ sent = client.get_bytes_sent()
+ delta_time = t - self.daemon_bps[0]
+ delta_sent = sent - self.daemon_bps[1]
+ delta_recv = recv - self.daemon_bps[2]
+ self.daemon_bps = (t, sent, recv)
+ sent_rate = fspeed(delta_sent / delta_time)
+ recv_rate = fspeed(delta_recv / delta_time)
+ log.debug(
+ 'RPC: Sent %s (%s) Recv %s (%s)',
+ fsize(sent),
+ sent_rate,
+ fsize(recv),
+ recv_rate,
+ )
+
+ def _on_reactor_start(self):
+ log.debug('_on_reactor_start')
+ self.mainwindow.first_show()
+
+ if not self.config['standalone']:
+ return self._start_thinclient()
+
+ err_msg = ''
+ try:
+ client.start_standalone()
+ except DaemonRunningError:
+ err_msg = _(
+ 'A Deluge daemon (deluged) is already running.\n'
+ 'To use Standalone mode, stop local daemon and restart Deluge.'
+ )
+ except ImportError as ex:
+ if 'No module named libtorrent' in str(ex):
+ err_msg = _(
+ 'Only Thin Client mode is available because libtorrent is not installed.\n'
+ 'To use Standalone mode, please install libtorrent package.'
+ )
+ else:
+ log.exception(ex)
+ err_msg = _(
+ 'Only Thin Client mode is available due to unknown Import Error.\n'
+ 'To use Standalone mode, please see logs for error details.'
+ )
+ except Exception as ex:
+ log.exception(ex)
+ err_msg = _(
+ 'Only Thin Client mode is available due to unknown Import Error.\n'
+ 'To use Standalone mode, please see logs for error details.'
+ )
+ else:
+ component.start()
+ return
+
+ def on_dialog_response(response):
+ """User response to switching mode dialog."""
+ if response == ResponseType.YES:
+ # Turning off standalone
+ self.config['standalone'] = False
+ self._start_thinclient()
+ else:
+ # User want keep Standalone Mode so just quit.
+ self.mainwindow.quit()
+
+ # An error occurred so ask user to switch from Standalone to Thin Client mode.
+ err_msg += '\n\n' + _('Continue in Thin Client mode?')
+ d = YesNoDialog(_('Change User Interface Mode'), err_msg).run()
+ d.addCallback(on_dialog_response)
+
+ def _start_thinclient(self):
+ """Start the gtkui in thinclient mode"""
+ if log.isEnabledFor(logging.DEBUG):
+ self.rpc_stats.start(10)
+
+ # Check to see if we need to start the localhost daemon
+ if self.config['autostart_localhost']:
+
+ def on_localhost_status(status_info, port):
+ if status_info[1] == 'Offline':
+ log.debug('Autostarting localhost: %s', host_config[0:3])
+ self.connectionmanager.start_daemon(port, get_config_dir())
+
+ for host_config in self.connectionmanager.hostlist.config['hosts']:
+ if host_config[1] in LOCALHOST:
+ d = self.connectionmanager.hostlist.get_host_status(host_config[0])
+ d.addCallback(on_localhost_status, host_config[2])
+ break
+
+ # Autoconnect to a host
+ if self.config['autoconnect']:
+ for host_config in self.connectionmanager.hostlist.config['hosts']:
+ host_id, host, port, user, __ = host_config
+ if host_id == self.config['autoconnect_host_id']:
+ log.debug('Trying to connect to %s@%s:%s', user, host, port)
+ self.connectionmanager._connect(host_id, try_counter=6)
+ break
+
+ if self.config['show_connection_manager_on_start']:
+ # Dialog is blocking so call last.
+ self.connectionmanager.show()
+
+ def __on_disconnect(self):
+ """
+ Called when disconnected from the daemon. We basically just stop all
+ the components here.
+ """
+ self.daemon_bps = (0, 0, 0)
+ component.stop()
diff --git a/deluge/ui/gtk3/ipcinterface.py b/deluge/ui/gtk3/ipcinterface.py
new file mode 100644
index 0000000..dc51a87
--- /dev/null
+++ b/deluge/ui/gtk3/ipcinterface.py
@@ -0,0 +1,230 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+import sys
+from base64 import b64encode
+from glob import glob
+from tempfile import mkstemp
+
+import rencode
+import twisted.internet.error
+from twisted.internet import reactor
+from twisted.internet.protocol import ClientFactory, Factory, Protocol, connectionDone
+
+import deluge.component as component
+from deluge.common import decode_bytes, is_magnet, is_url, windows_check
+from deluge.configmanager import ConfigManager, get_config_dir
+from deluge.ui.client import client
+
+try:
+ from urllib.parse import urlparse
+ from urllib.request import url2pathname
+except ImportError:
+ # PY2 fallback
+ from urlparse import urlparse # pylint: disable=ungrouped-imports
+ from urllib import url2pathname # pylint: disable=ungrouped-imports
+
+log = logging.getLogger(__name__)
+
+
+class IPCProtocolServer(Protocol):
+ def __init__(self):
+ pass
+
+ def dataReceived(self, data): # NOQA: N802
+ config = ConfigManager('gtk3ui.conf')
+ data = rencode.loads(data, decode_utf8=True)
+ if not data or config['focus_main_window_on_add']:
+ component.get('MainWindow').present()
+ process_args(data)
+
+
+class IPCProtocolClient(Protocol):
+ def __init__(self):
+ pass
+
+ def connectionMade(self): # NOQA: N802
+ self.transport.write(rencode.dumps(self.factory.args))
+ self.transport.loseConnection()
+
+ def connectionLost(self, reason=connectionDone): # NOQA: N802
+ reactor.stop()
+ self.factory.stop = True
+
+
+class IPCClientFactory(ClientFactory):
+ protocol = IPCProtocolClient
+
+ def __init__(self):
+ self.stop = False
+
+ def clientConnectionFailed(self, connector, reason): # NOQA: N802
+ log.warning('Connection to running instance failed.')
+ reactor.stop()
+
+
+class IPCInterface(component.Component):
+ def __init__(self, args):
+ component.Component.__init__(self, 'IPCInterface')
+ self.listener = None
+ ipc_dir = get_config_dir('ipc')
+ if not os.path.exists(ipc_dir):
+ os.makedirs(ipc_dir)
+ socket = os.path.join(ipc_dir, 'deluge-gtk')
+ if windows_check():
+ # If we're on windows we need to check the global mutex to see if deluge is
+ # already running.
+ import win32event
+ import win32api
+ import winerror
+
+ self.mutex = win32event.CreateMutex(None, False, 'deluge')
+ if win32api.GetLastError() != winerror.ERROR_ALREADY_EXISTS:
+ # Create listen socket
+ self.factory = Factory()
+ self.factory.protocol = IPCProtocolServer
+ import random
+
+ port = random.randrange(20000, 65535)
+ self.listener = reactor.listenTCP(port, self.factory)
+ # Store the port number in the socket file
+ with open(socket, 'w') as _file:
+ _file.write(str(port))
+ # We need to process any args when starting this process
+ process_args(args)
+ else:
+ # Send to existing deluge process
+ with open(socket) as _file:
+ port = int(_file.readline())
+ self.factory = ClientFactory()
+ self.factory.args = args
+ self.factory.protocol = IPCProtocolClient
+ reactor.connectTCP('127.0.0.1', port, self.factory)
+ reactor.run()
+ sys.exit(0)
+ else:
+ # Find and remove any restart tempfiles
+ restart_tempfile = glob(os.path.join(ipc_dir, 'restart.*'))
+ for f in restart_tempfile:
+ os.remove(f)
+ lockfile = socket + '.lock'
+ log.debug('Checking if lockfile exists: %s', lockfile)
+ if os.path.lexists(lockfile):
+
+ def delete_lockfile():
+ log.debug('Delete stale lockfile.')
+ try:
+ os.remove(lockfile)
+ os.remove(socket)
+ except OSError as ex:
+ log.error('Failed to delete lockfile: %s', ex)
+
+ try:
+ os.kill(int(os.readlink(lockfile)), 0)
+ except OSError:
+ delete_lockfile()
+ else:
+ if restart_tempfile:
+ log.warning(
+ 'Found running PID but it is not a Deluge process, removing lockfile...'
+ )
+ delete_lockfile()
+ try:
+ self.factory = Factory()
+ self.factory.protocol = IPCProtocolServer
+ self.listener = reactor.listenUNIX(socket, self.factory, wantPID=True)
+ except twisted.internet.error.CannotListenError as ex:
+ log.info(
+ 'Deluge is already running! Sending arguments to running instance...'
+ )
+ self.factory = IPCClientFactory()
+ self.factory.args = args
+ reactor.connectUNIX(socket, self.factory, checkPID=True)
+ reactor.run()
+ if self.factory.stop:
+ log.info('Success sending arguments to running Deluge.')
+ from gi.repository.Gdk import notify_startup_complete
+
+ notify_startup_complete()
+ sys.exit(0)
+ else:
+ if restart_tempfile:
+ log.error('Deluge restart failed: %s', ex)
+ sys.exit(1)
+ else:
+ log.warning('Restarting Deluge... (%s)', ex)
+ # Create a tempfile to keep track of restart
+ mkstemp(prefix='restart.', dir=ipc_dir)
+ os.execv(sys.argv[0], sys.argv)
+ else:
+ process_args(args)
+
+ def shutdown(self):
+ if windows_check():
+ import win32api
+
+ win32api.CloseHandle(self.mutex)
+ if self.listener:
+ return self.listener.stopListening()
+
+
+def process_args(args):
+ """Process arguments sent to already running Deluge"""
+ # Make sure args is a list
+ args = list(args)
+ log.debug('Processing args from other process: %s', args)
+ if not client.connected():
+ # We're not connected so add these to the queue
+ log.debug('Not connected to host.. Adding to queue.')
+ component.get('QueuedTorrents').add_to_queue(args)
+ return
+ config = ConfigManager('gtk3ui.conf')
+
+ for arg in args:
+ if not arg.strip():
+ continue
+ log.debug('arg: %s', arg)
+
+ if is_url(arg):
+ log.debug('Attempting to add url (%s) from external source...', arg)
+ if config['interactive_add']:
+ component.get('AddTorrentDialog').add_from_url(arg)
+ component.get('AddTorrentDialog').show(config['focus_add_dialog'])
+ else:
+ client.core.add_torrent_url(arg, None)
+
+ elif is_magnet(arg):
+ log.debug('Attempting to add magnet (%s) from external source...', arg)
+ if config['interactive_add']:
+ component.get('AddTorrentDialog').add_from_magnets([arg])
+ component.get('AddTorrentDialog').show(config['focus_add_dialog'])
+ else:
+ client.core.add_torrent_magnet(arg, {})
+
+ else:
+ log.debug('Attempting to add file (%s) from external source...', arg)
+ if urlparse(arg).scheme == 'file':
+ arg = url2pathname(urlparse(arg).path)
+ path = os.path.abspath(decode_bytes(arg))
+
+ if not os.path.exists(path):
+ log.error('No such file: %s', path)
+ continue
+
+ if config['interactive_add']:
+ component.get('AddTorrentDialog').add_from_files([path])
+ component.get('AddTorrentDialog').show(config['focus_add_dialog'])
+ else:
+ with open(path, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ client.core.add_torrent_file(os.path.split(path)[-1], filedump, None)
diff --git a/deluge/ui/gtk3/listview.py b/deluge/ui/gtk3/listview.py
new file mode 100644
index 0000000..666bb67
--- /dev/null
+++ b/deluge/ui/gtk3/listview.py
@@ -0,0 +1,838 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from gi.repository import GObject, Gtk
+
+from deluge.common import PY2, decode_bytes
+
+from .common import cmp, load_pickled_state_file, save_pickled_state_file
+
+log = logging.getLogger(__name__)
+
+
+class ListViewColumnState(object):
+ """Class used for saving/loading column state."""
+
+ def __init__(self, name, position, width, visible, sort, sort_order):
+ self.name = name
+ self.position = position
+ self.width = width
+ self.visible = visible
+ self.sort = sort
+ self.sort_order = sort_order
+
+
+class ListView(object):
+ """ListView is used to make custom GtkTreeViews. It supports the adding
+ and removing of columns, creating a menu for a column toggle list and
+ support for 'status_field's which are used while updating the columns data.
+ """
+
+ class ListViewColumn(object):
+ """Holds information regarding a column in the ListView"""
+
+ def __init__(self, name, column_indices):
+ # Name is how a column is identified and is also the header
+ self.name = name
+ # Column_indices holds the indexes to the liststore_columns that
+ # this column utilizes. It is stored as a list.
+ self.column_indices = column_indices
+ # Column is a reference to the GtkTreeViewColumn object
+ self.column = None
+ # This is the name of the status field that the column will query
+ # the core for if an update is called.
+ self.status_field = None
+ # If column is 'hidden' then it will not be visible and will not
+ # show up in any menu listing; it cannot be shown ever.
+ self.hidden = False
+ # If this is set, it is used to sort the model
+ self.sort_func = None
+ self.sort_id = None
+ # Values needed to update TreeViewColumns
+ self.column_type = None
+ self.renderer = None
+ self.text_index = 0
+ self.value_index = 0
+ self.pixbuf_index = 0
+ self.data_func = None
+
+ class TreeviewColumn(Gtk.TreeViewColumn, object):
+ """
+ TreeViewColumn does not signal right-click events, and we need them
+ This subclass is equivalent to TreeViewColumn, but it signals these events
+
+ Most of the code of this class comes from Quod Libet (http://www.sacredchao.net/quodlibet)
+ """
+
+ __gsignals__ = {
+ 'button-press-event'
+ if not PY2
+ else b'button-press-event': (GObject.SIGNAL_RUN_LAST, None, (object,))
+ }
+
+ def __init__(self, title=None, cell_renderer=None, **args):
+ """ Constructor, see Gtk.TreeViewColumn """
+ Gtk.TreeViewColumn.__init__(self, title, cell_renderer, **args)
+ label = Gtk.Label(label=title)
+ self.set_widget(label)
+ label.show()
+ label.__realize = label.connect('realize', self.on_realize)
+ self.title = title
+ self.data_func = None
+ self.data_func_data = None
+ self.cell_renderer = None
+
+ def on_realize(self, widget):
+ widget.disconnect(widget.__realize)
+ del widget.__realize
+ button = widget.get_ancestor(Gtk.Button)
+ if button is not None:
+ button.connect('button-press-event', self.on_button_pressed)
+
+ def on_button_pressed(self, widget, event):
+ self.emit('button-press-event', event)
+
+ def set_cell_data_func_attributes(self, cell_renderer, func, func_data=None):
+ """Store the values to be set by set_cell_data_func"""
+ self.data_func = func
+ self.data_func_data = func_data
+ self.cell_renderer = cell_renderer
+
+ def set_visible(self, visible):
+ Gtk.TreeViewColumn.set_visible(self, visible)
+ if self.data_func:
+ if not visible:
+ # Set data function to None to prevent unecessary calls when column is hidden
+ self.set_cell_data_func(self.cell_renderer, None, func_data=None)
+ else:
+ self.set_cell_data_func(
+ self.cell_renderer, self.data_func, self.data_func_data
+ )
+
+ def set_col_attributes(self, renderer, add=True, **kw):
+ if add is True:
+ for attr, value in kw.items():
+ self.add_attribute(renderer, attr, value)
+ else:
+ self.set_attributes(renderer, **kw)
+
+ def __init__(self, treeview_widget=None, state_file=None):
+ log.debug('ListView initialized..')
+
+ if treeview_widget is not None:
+ # User supplied a treeview widget
+ self.treeview = treeview_widget
+ else:
+ self.treeview = Gtk.TreeView()
+
+ self.treeview.set_enable_search(True)
+ self.treeview.set_search_equal_func(self.on_keypress_search_by_name, None)
+
+ if state_file:
+ self.load_state(state_file)
+
+ self.liststore = None
+ self.model_filter = None
+
+ self.treeview.set_rules_hint(True)
+ self.treeview.set_reorderable(False)
+ self.treeview.set_rubber_banding(True) # Enable mouse multi-row selection.
+ self.treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)
+
+ # Dictionary of 'header' or 'name' to ListViewColumn object
+ self.columns = {}
+ # Column_index keeps track of the order of the visible columns.
+ self.column_index = []
+ # The column types for the list store.. this may have more entries than
+ # visible columns due to some columns utilizing more than 1 liststore
+ # column and some columns being hidden.
+ self.liststore_columns = []
+ # The GtkMenu that is created after every addition, removal or reorder
+ self.menu = None
+ # A list of menus that self.menu will be a submenu of everytime it is
+ # created.
+ self.checklist_menus = []
+
+ # Store removed columns state. This is needed for plugins that remove
+ # their columns prior to having the state list saved on shutdown.
+ self.removed_columns_state = []
+
+ # Since gtk TreeModelSort doesn't do stable sort, remember last sort order so we can
+ self.last_sort_order = {}
+ self.unique_column_id = None
+ self.default_sort_column_id = None
+
+ # Create the model filter and column
+ self.add_bool_column('filter', hidden=True)
+
+ def create_model_filter(self):
+ """create new filter-model
+ must be called after listview.create_new_liststore
+ """
+ model_filter = self.liststore.filter_new()
+ model_filter.set_visible_column(self.columns['filter'].column_indices[0])
+ self.model_filter = Gtk.TreeModelSort(model=model_filter)
+ self.model_filter.connect('sort-column-changed', self.on_model_sort_changed)
+ self.model_filter.connect('row-inserted', self.on_model_row_inserted)
+ self.treeview.set_model(self.model_filter)
+ self.set_sort_functions()
+ self.set_model_sort()
+
+ def set_model_sort(self):
+ column_state = self.get_sort_column_from_state()
+ if column_state:
+ self.treeview.get_model().set_sort_column_id(
+ column_state.sort, column_state.sort_order
+ )
+ # Using the default sort column
+ elif self.default_sort_column_id:
+ self.model_filter.set_sort_column_id(
+ self.default_sort_column_id, Gtk.SortType.ASCENDING
+ )
+ self.model_filter.set_default_sort_func(
+ self.generic_sort_func, self.get_column_index(_('Added'))[0]
+ )
+
+ def get_sort_column_from_state(self):
+ """Find the first (should only be one) state with sort enabled"""
+ if self.state is None:
+ return None
+ for column_state in self.state:
+ if column_state.sort is not None and column_state.sort > -1:
+ return column_state
+ return None
+
+ def on_model_sort_changed(self, model):
+ if self.unique_column_id:
+ self.last_sort_order = {}
+
+ def record_position(model, path, _iter, data):
+ unique_id = model[_iter][self.unique_column_id]
+ self.last_sort_order[unique_id] = int(str(path))
+
+ model.foreach(record_position, None)
+
+ def on_model_row_inserted(self, model, path, _iter):
+ if self.unique_column_id:
+ self.last_sort_order.setdefault(
+ model[_iter][self.unique_column_id], len(model) - 1
+ )
+
+ def stabilize_sort_func(self, sort_func):
+ def stabilized(model, iter1, iter2, data):
+ result = sort_func(model, iter1, iter2, data)
+ if result == 0 and self.unique_column_id:
+ unique1 = model[iter1][self.unique_column_id]
+ unique2 = model[iter2][self.unique_column_id]
+ if unique1 in self.last_sort_order and unique2 in self.last_sort_order:
+ result = cmp(
+ self.last_sort_order[unique1], self.last_sort_order[unique2]
+ )
+ # If all else fails, fall back to sorting by unique column
+ if result == 0:
+ result = cmp(unique1, unique2)
+
+ return result
+
+ return stabilized
+
+ def generic_sort_func(self, model, iter1, iter2, data):
+ return cmp(model[iter1][data], model[iter2][data])
+
+ def set_sort_functions(self):
+ for column in self.columns.values():
+ sort_func = column.sort_func or self.generic_sort_func
+ self.model_filter.set_sort_func(
+ column.sort_id, self.stabilize_sort_func(sort_func), column.sort_id
+ )
+
+ def create_column_state(self, column, position=None):
+ if not position:
+ # Find the position
+ for index, c in enumerate(self.treeview.get_columns()):
+ if column.get_title() == c.get_title():
+ position = index
+ break
+ sort = None
+ if self.model_filter:
+ sort_id, order = self.model_filter.get_sort_column_id()
+ col_title = decode_bytes(column.get_title())
+ if self.get_column_name(sort_id) == col_title:
+ sort = sort_id
+
+ return ListViewColumnState(
+ column.get_title(),
+ position,
+ column.get_width(),
+ column.get_visible(),
+ sort,
+ int(column.get_sort_order()),
+ )
+
+ def save_state(self, filename):
+ """Saves the listview state (column positions and visibility) to
+ filename."""
+ # A list of ListViewColumnStates
+ state = []
+
+ # Workaround for all zero widths after removing column on shutdown
+ if not any(c.get_width() for c in self.treeview.get_columns()):
+ return
+
+ # Get the list of TreeViewColumns from the TreeView
+ for counter, column in enumerate(self.treeview.get_columns()):
+ # Append a new column state to the state list
+ state.append(self.create_column_state(column, counter))
+
+ state += self.removed_columns_state
+
+ self.state = state
+ save_pickled_state_file(filename, state)
+
+ def load_state(self, filename):
+ """Load the listview state from filename."""
+ self.state = load_pickled_state_file(filename)
+
+ def set_treeview(self, treeview_widget):
+ """Set the treeview widget that this listview uses."""
+ self.treeview = treeview_widget
+ self.treeview.set_model(self.liststore)
+ return
+
+ def get_column_index(self, name):
+ """Get the liststore column indices belonging to this column.
+ Will return a list.
+ """
+ return self.columns[name].column_indices
+
+ def get_column_name(self, index):
+ """Get the header name for a liststore column index"""
+ for key, value in self.columns.items():
+ if index in value.column_indices:
+ return key
+
+ def get_state_field_column(self, field):
+ """Returns the column number for the state field"""
+ for column in self.columns:
+ if self.columns[column].status_field is None:
+ continue
+
+ for f in self.columns[column].status_field:
+ if field == f:
+ return self.columns[column].column_indices[
+ self.columns[column].status_field.index(f)
+ ]
+
+ def on_menuitem_toggled(self, widget):
+ """Callback for the generated column menuitems."""
+ # Get the column name from the widget
+ name = widget.get_child().get_text()
+
+ # Set the column's visibility based on the widgets active state
+ try:
+ self.columns[name].column.set_visible(widget.get_active())
+ except KeyError:
+ self.columns[decode_bytes(name)].column.set_visible(widget.get_active())
+ return
+
+ def on_treeview_header_right_clicked(self, column, event):
+ if event.button == 3:
+ self.menu.popup(None, None, None, None, event.button, event.get_time())
+
+ def register_checklist_menu(self, menu):
+ """Register a checklist menu with the listview. It will automatically
+ attach any new checklist menu it makes to this menu.
+ """
+ self.checklist_menus.append(menu)
+
+ def create_checklist_menu(self):
+ """Creates a menu used for toggling the display of columns."""
+ menu = self.menu = Gtk.Menu()
+ # Iterate through the column_index list to preserve order
+ for name in self.column_index:
+ column = self.columns[name]
+ # If the column is hidden, then we do not want to show it in the
+ # menu.
+ if column.hidden is True:
+ continue
+ menuitem = Gtk.CheckMenuItem.new_with_label(column.name)
+ # If the column is currently visible, make sure it's set active
+ # (or checked) in the menu.
+ if column.column.get_visible() is True:
+ menuitem.set_active(True)
+ # Connect to the 'toggled' event
+ menuitem.connect('toggled', self.on_menuitem_toggled)
+ # Add the new checkmenuitem to the menu
+ menu.append(menuitem)
+
+ # Attach this new menu to all the checklist_menus
+ for _menu in self.checklist_menus:
+ _menu.set_submenu(menu)
+ _menu.show_all()
+ return menu
+
+ def create_new_liststore(self):
+ """Creates a new GtkListStore based on the liststore_columns list"""
+ # Create a new liststore with added column and move the data from the
+ # old one to the new one.
+ new_list = Gtk.ListStore(*tuple(self.liststore_columns))
+
+ # This function is used in the liststore.foreach method with user_data
+ # being the new liststore and the columns list
+ def copy_row(model, path, row, user_data):
+ new_list, columns = user_data
+ new_row = new_list.append()
+ for column in range(len(columns)):
+ # Get the current value of the column for this row
+ value = model.get_value(row, column)
+ # Set the value of this row and column in the new liststore
+ new_list.set_value(new_row, column, value)
+
+ # Do the actual row copy
+ if self.liststore is not None:
+ self.liststore.foreach(copy_row, (new_list, self.columns))
+
+ self.liststore = new_list
+
+ def update_treeview_column(self, header, add=True):
+ """Update TreeViewColumn based on ListView column mappings"""
+ column = self.columns[header]
+ tree_column = self.columns[header].column
+
+ if column.column_type == 'text':
+ if add:
+ tree_column.pack_start(column.renderer, True)
+ tree_column.set_col_attributes(
+ column.renderer, add=add, text=column.column_indices[column.text_index]
+ )
+ elif column.column_type == 'bool':
+ if add:
+ tree_column.pack_start(column.renderer, True)
+ tree_column.set_col_attributes(
+ column.renderer, active=column.column_indices[0]
+ )
+ elif column.column_type == 'func':
+ if add:
+ tree_column.pack_start(column.renderer, True)
+ indice_arg = column.column_indices[0]
+ if len(column.column_indices) > 1:
+ indice_arg = tuple(column.column_indices)
+ tree_column.set_cell_data_func(
+ column.renderer, column.data_func, indice_arg
+ )
+ elif column.column_type == 'progress':
+ if add:
+ tree_column.pack_start(column.renderer, True)
+ if column.data_func is None:
+ tree_column.set_col_attributes(
+ column.renderer,
+ add=add,
+ text=column.column_indices[column.text_index],
+ value=column.column_indices[column.value_index],
+ )
+ else:
+ tree_column.set_cell_data_func(
+ column.renderer, column.data_func, tuple(column.column_indices)
+ )
+ elif column.column_type == 'texticon':
+ if add:
+ tree_column.pack_start(column.renderer[column.pixbuf_index], False)
+ tree_column.pack_start(column.renderer[column.text_index], True)
+ tree_column.set_col_attributes(
+ column.renderer[column.text_index],
+ add=add,
+ text=column.column_indices[column.text_index],
+ )
+ if column.data_func is not None:
+ tree_column.set_cell_data_func(
+ column.renderer[column.pixbuf_index],
+ column.data_func,
+ column.column_indices[column.pixbuf_index],
+ )
+ return True
+
+ def remove_column(self, header):
+ """Removes the column with the name 'header' from the listview"""
+ # Store a copy of this columns state in case it's re-added
+ state = self.create_column_state(self.columns[header].column)
+ self.removed_columns_state.append(state)
+ # Only remove column if column is associated with the treeview. This avoids
+ # warning on shutdown when GTKUI is closed before plugins try to remove columns
+ if self.columns[header].column.get_tree_view() is not None:
+ self.treeview.remove_column(self.columns[header].column)
+ # Get the column indices
+ column_indices = self.columns[header].column_indices
+ # Delete the column
+ del self.columns[header]
+ self.column_index.remove(header)
+ # Shift the column_indices values of those columns affected by the
+ # removal. Any column_indices > the one removed.
+ for column in self.columns.values():
+ if column.column_indices[0] > column_indices[0]:
+ # We need to shift this column_indices
+ for i, index in enumerate(column.column_indices):
+ column.column_indices[i] = index - len(column_indices)
+ # Update the associated TreeViewColumn
+ self.update_treeview_column(column.name, add=False)
+
+ # Remove from the liststore columns list
+ for index in sorted(column_indices, reverse=True):
+ del self.liststore_columns[index]
+
+ # Create a new liststore
+ self.create_new_liststore()
+ # Create new model for the treeview
+ self.create_model_filter()
+
+ # Re-create the menu
+ self.create_checklist_menu()
+ return
+
+ def add_column(
+ self,
+ header,
+ render,
+ col_types,
+ hidden,
+ position,
+ status_field,
+ sortid,
+ text=0,
+ value=0,
+ pixbuf=0,
+ function=None,
+ column_type=None,
+ sort_func=None,
+ tooltip=None,
+ default=True,
+ unique=False,
+ default_sort=False,
+ ):
+ """Adds a column to the ListView"""
+ # Add the column types to liststore_columns
+ column_indices = []
+ if isinstance(col_types, list):
+ for col_type in col_types:
+ self.liststore_columns.append(col_type)
+ column_indices.append(len(self.liststore_columns) - 1)
+ else:
+ self.liststore_columns.append(col_types)
+ column_indices.append(len(self.liststore_columns) - 1)
+
+ # Add to the index list so we know the order of the visible columns.
+ if position is not None:
+ self.column_index.insert(position, header)
+ else:
+ self.column_index.append(header)
+
+ # Create a new column object and add it to the list
+ column = self.TreeviewColumn(header)
+ self.columns[header] = self.ListViewColumn(header, column_indices)
+ self.columns[header].column = column
+ self.columns[header].status_field = status_field
+ self.columns[header].sort_func = sort_func
+ self.columns[header].sort_id = column_indices[sortid]
+ # Store creation details
+ self.columns[header].column_type = column_type
+ self.columns[header].renderer = render
+ self.columns[header].text_index = text
+ self.columns[header].value_index = value
+ self.columns[header].pixbuf_index = pixbuf
+ self.columns[header].data_func = function
+
+ if unique:
+ self.unique_column_id = column_indices[sortid]
+ if default_sort:
+ self.default_sort_column_id = column_indices[sortid]
+
+ # Create a new list with the added column
+ self.create_new_liststore()
+
+ # Happens only on columns added after the torrent list has been loaded
+ if self.model_filter:
+ self.create_model_filter()
+
+ if column_type is None:
+ return
+
+ self.update_treeview_column(header)
+
+ column.set_sort_column_id(self.columns[header].column_indices[sortid])
+ column.set_clickable(True)
+ column.set_resizable(True)
+ column.set_expand(False)
+ column.set_min_width(20)
+ column.set_reorderable(True)
+ column.set_visible(not hidden)
+ column.connect('button-press-event', self.on_treeview_header_right_clicked)
+
+ if tooltip:
+ column.get_widget().set_tooltip_markup(tooltip)
+
+ # Check for loaded state and apply
+ column_in_state = False
+ if self.state is not None:
+ for column_state in self.state:
+ if header == decode_bytes(column_state.name):
+ # We found a loaded state
+ column_in_state = True
+ if column_state.width > 0:
+ column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
+ column.set_fixed_width(column_state.width)
+
+ column.set_visible(column_state.visible)
+ position = column_state.position
+ break
+
+ # Set this column to not visible if its not in the state and
+ # its not supposed to be shown by default
+ if not column_in_state and not default and not hidden:
+ column.set_visible(False)
+
+ if position is not None:
+ self.treeview.insert_column(column, position)
+ else:
+ self.treeview.append_column(column)
+
+ # Set hidden in the column
+ self.columns[header].hidden = hidden
+ self.columns[header].column = column
+ # Re-create the menu item because of the new column
+ self.create_checklist_menu()
+
+ return True
+
+ def add_text_column(
+ self,
+ header,
+ col_type=str,
+ hidden=False,
+ position=None,
+ status_field=None,
+ sortid=0,
+ column_type='text',
+ sort_func=None,
+ tooltip=None,
+ default=True,
+ unique=False,
+ default_sort=False,
+ ):
+ """Add a text column to the listview. Only the header name is required.
+ """
+ render = Gtk.CellRendererText()
+ self.add_column(
+ header,
+ render,
+ col_type,
+ hidden,
+ position,
+ status_field,
+ sortid,
+ column_type=column_type,
+ sort_func=sort_func,
+ tooltip=tooltip,
+ default=default,
+ unique=unique,
+ default_sort=default_sort,
+ )
+
+ return True
+
+ def add_bool_column(
+ self,
+ header,
+ col_type=bool,
+ hidden=False,
+ position=None,
+ status_field=None,
+ sortid=0,
+ column_type='bool',
+ tooltip=None,
+ default=True,
+ ):
+ """Add a bool column to the listview"""
+ render = Gtk.CellRendererToggle()
+ self.add_column(
+ header,
+ render,
+ col_type,
+ hidden,
+ position,
+ status_field,
+ sortid,
+ column_type=column_type,
+ tooltip=tooltip,
+ default=default,
+ )
+
+ def add_func_column(
+ self,
+ header,
+ function,
+ col_types,
+ sortid=0,
+ hidden=False,
+ position=None,
+ status_field=None,
+ column_type='func',
+ sort_func=None,
+ tooltip=None,
+ default=True,
+ ):
+ """Add a function column to the listview. Need a header name, the
+ function and the column types."""
+
+ render = Gtk.CellRendererText()
+ self.add_column(
+ header,
+ render,
+ col_types,
+ hidden,
+ position,
+ status_field,
+ sortid,
+ column_type=column_type,
+ function=function,
+ sort_func=sort_func,
+ tooltip=tooltip,
+ default=default,
+ )
+
+ return True
+
+ def add_progress_column(
+ self,
+ header,
+ col_types=None,
+ sortid=0,
+ hidden=False,
+ position=None,
+ status_field=None,
+ function=None,
+ column_type='progress',
+ tooltip=None,
+ sort_func=None,
+ default=True,
+ ):
+ """Add a progress column to the listview."""
+
+ if col_types is None:
+ col_types = [float, str]
+ render = Gtk.CellRendererProgress()
+ self.add_column(
+ header,
+ render,
+ col_types,
+ hidden,
+ position,
+ status_field,
+ sortid,
+ function=function,
+ column_type=column_type,
+ value=0,
+ text=1,
+ tooltip=tooltip,
+ sort_func=sort_func,
+ default=default,
+ )
+
+ return True
+
+ def add_texticon_column(
+ self,
+ header,
+ col_types=None,
+ sortid=1,
+ hidden=False,
+ position=None,
+ status_field=None,
+ column_type='texticon',
+ function=None,
+ sort_func=None,
+ tooltip=None,
+ default=True,
+ default_sort=False,
+ ):
+ """Adds a texticon column to the listview."""
+ if col_types is None:
+ col_types = [str, str]
+ render1 = Gtk.CellRendererPixbuf()
+ render2 = Gtk.CellRendererText()
+
+ self.add_column(
+ header,
+ (render1, render2),
+ col_types,
+ hidden,
+ position,
+ status_field,
+ sortid,
+ column_type=column_type,
+ function=function,
+ pixbuf=0,
+ text=1,
+ tooltip=tooltip,
+ sort_func=sort_func,
+ default=default,
+ default_sort=default_sort,
+ )
+
+ return True
+
+ def on_keypress_search_by_name(self, model, column, key, _iter):
+ torrent_name_col = self.columns[_('Name')].column_indices[1]
+ return not model[_iter][torrent_name_col].lower().startswith(key.lower())
+
+ def restore_columns_order_from_state(self):
+ if self.state is None:
+ # No state file exists, so, no reordering can be done
+ return
+ columns = self.treeview.get_columns()
+
+ def find_column(header):
+ for column in columns:
+ if column.get_title() == header:
+ return column
+
+ restored_columns = []
+ for col_state in self.state:
+ if col_state.name in restored_columns:
+ # Duplicate column in state!?!?!?
+ continue
+ elif not col_state.visible:
+ # Column is not visible, no need to reposition
+ continue
+
+ try:
+ column_at_position = columns[col_state.position]
+ except IndexError:
+ # Ignore extra columns from Plugins in col_state
+ continue
+ if col_state.name == column_at_position.get_title():
+ # It's in the right position
+ continue
+ column = find_column(col_state.name)
+ if not column:
+ log.debug(
+ 'Could not find column matching "%s" on state.', col_state.name
+ )
+ # The cases where I've found that the column could not be found
+ # is when not using the english locale, ie, the default one, or
+ # when changing locales between runs.
+ # On the next load, all should be fine
+ continue
+ self.treeview.move_column_after(column, column_at_position)
+ # Get columns again to keep reordering since positions have changed
+ columns = self.treeview.get_columns()
+ restored_columns.append(col_state.name)
+ self.create_new_liststore()
diff --git a/deluge/ui/gtk3/mainwindow.py b/deluge/ui/gtk3/mainwindow.py
new file mode 100644
index 0000000..5b4240c
--- /dev/null
+++ b/deluge/ui/gtk3/mainwindow.py
@@ -0,0 +1,381 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os.path
+from hashlib import sha1 as sha
+
+import gi
+from gi.repository import Gtk
+from gi.repository.Gdk import DragAction, WindowState
+from twisted.internet import reactor
+from twisted.internet.error import ReactorNotRunning
+
+import deluge.component as component
+from deluge.common import decode_bytes, fspeed, resource_filename
+from deluge.configmanager import ConfigManager
+from deluge.ui.client import client
+
+from .common import get_deluge_icon, windowing
+from .dialogs import PasswordDialog
+from .ipcinterface import process_args
+
+GdkX11 = None
+Wnck = None
+if windowing('X11'):
+ try:
+ from gi.repository import GdkX11
+ except ImportError:
+ pass
+
+ try:
+ gi.require_version('Wnck', '3.0')
+ from gi.repository import Wnck
+ except (ImportError, ValueError):
+ pass
+
+log = logging.getLogger(__name__)
+
+
+class _GtkBuilderSignalsHolder(object):
+ def connect_signals(self, mapping_or_class):
+
+ if isinstance(mapping_or_class, dict):
+ for name, handler in mapping_or_class.items():
+ if hasattr(self, name):
+ raise RuntimeError(
+ 'A handler for signal %r has already been registered: %s'
+ % (name, getattr(self, name))
+ )
+ setattr(self, name, handler)
+ else:
+ for name in dir(mapping_or_class):
+ if not name.startswith('on_'):
+ continue
+ if hasattr(self, name):
+ raise RuntimeError(
+ 'A handler for signal %r has already been registered: %s'
+ % (name, getattr(self, name))
+ )
+ setattr(self, name, getattr(mapping_or_class, name))
+
+
+class MainWindow(component.Component):
+ def __init__(self):
+ if Wnck:
+ self.screen = Wnck.Screen.get_default()
+ component.Component.__init__(self, 'MainWindow', interval=2)
+ self.config = ConfigManager('gtk3ui.conf')
+ self.main_builder = Gtk.Builder()
+
+ # Patch this GtkBuilder to avoid connecting signals from elsewhere
+ #
+ # Think about splitting up mainwindow gtkbuilder file into the necessary parts
+ # to avoid GtkBuilder monkey patch. Those parts would then need adding to mainwindow 'by hand'.
+ self.gtk_builder_signals_holder = _GtkBuilderSignalsHolder()
+ # FIXME: The deepcopy has been removed: copy.deepcopy(self.main_builder.connect_signals)
+ self.main_builder.prev_connect_signals = self.main_builder.connect_signals
+
+ def patched_connect_signals(*a, **k):
+ raise RuntimeError(
+ 'In order to connect signals to this GtkBuilder instance please use '
+ '"component.get(\'MainWindow\').connect_signals()"'
+ )
+
+ self.main_builder.connect_signals = patched_connect_signals
+
+ # Get Gtk Builder files Main Window, New release dialog, and Tabs.
+ ui_filenames = [
+ 'main_window.ui',
+ 'main_window.new_release.ui',
+ 'main_window.tabs.ui',
+ 'main_window.tabs.menu_file.ui',
+ 'main_window.tabs.menu_peer.ui',
+ ]
+ for filename in ui_filenames:
+ self.main_builder.add_from_file(
+ resource_filename(__package__, os.path.join('glade', filename))
+ )
+
+ self.window = self.main_builder.get_object('main_window')
+ self.window.set_icon(get_deluge_icon())
+ self.tabsbar_pane = self.main_builder.get_object('tabsbar_pane')
+ self.sidebar_pane = self.main_builder.get_object('sidebar_pane')
+
+ # Keep a list of components to pause and resume when changing window state.
+ self.child_components = ['TorrentView', 'StatusBar', 'TorrentDetails']
+
+ # Load the window state
+ self.load_window_state()
+
+ # Keep track of window minimization state so we don't update UI when it is minimized.
+ self.is_minimized = False
+ self.restart = False
+
+ self.window.drag_dest_set(
+ Gtk.DestDefaults.ALL,
+ [Gtk.TargetEntry.new(target='text/uri-list', flags=0, info=80)],
+ DragAction.COPY,
+ )
+
+ # Connect events
+ self.window.connect('window-state-event', self.on_window_state_event)
+ self.window.connect('configure-event', self.on_window_configure_event)
+ self.window.connect('delete-event', self.on_window_delete_event)
+ self.window.connect('drag-data-received', self.on_drag_data_received_event)
+ self.tabsbar_pane.connect(
+ 'notify::position', self.on_tabsbar_pane_position_event
+ )
+ self.sidebar_pane.connect(
+ 'notify::position', self.on_sidebar_pane_position_event
+ )
+ self.window.connect('draw', self.on_expose_event)
+
+ self.config.register_set_function(
+ 'show_rate_in_title', self._on_set_show_rate_in_title, apply_now=False
+ )
+
+ client.register_event_handler(
+ 'NewVersionAvailableEvent', self.on_newversionavailable_event
+ )
+
+ def connect_signals(self, mapping_or_class):
+ self.gtk_builder_signals_holder.connect_signals(mapping_or_class)
+
+ def first_show(self):
+ self.main_builder.prev_connect_signals(self.gtk_builder_signals_holder)
+ self.sidebar_pane.set_position(self.config['sidebar_position'])
+ self.tabsbar_pane.set_position(self.config['tabsbar_position'])
+
+ if not (
+ self.config['start_in_tray'] and self.config['enable_system_tray']
+ ) and not self.window.get_property('visible'):
+ log.debug('Showing window')
+ self.show()
+
+ while Gtk.events_pending():
+ Gtk.main_iteration()
+
+ def show(self):
+ component.resume(self.child_components)
+ self.window.show()
+
+ def hide(self):
+ component.get('TorrentView').save_state()
+ component.pause(self.child_components)
+ self.save_position()
+ self.window.hide()
+
+ def present(self):
+ def restore():
+ # Restore the proper x,y coords for the window prior to showing it
+ component.resume(self.child_components)
+ timestamp = self.get_timestamp()
+ if windowing('X11'):
+ # Use present with X11 set_user_time since
+ # present_with_time is inconsistent.
+ self.window.present()
+ self.window.get_window().set_user_time(timestamp)
+ else:
+ self.window.present_with_time(timestamp)
+ self.load_window_state()
+
+ if self.config['lock_tray'] and not self.visible():
+ dialog = PasswordDialog(_('Enter your password to show Deluge...'))
+
+ def on_dialog_response(response_id):
+ if response_id == Gtk.ResponseType.OK:
+ if (
+ self.config['tray_password']
+ == sha(decode_bytes(dialog.get_password()).encode()).hexdigest()
+ ):
+ restore()
+
+ dialog.run().addCallback(on_dialog_response)
+ else:
+ restore()
+
+ def get_timestamp(self):
+ """Returns the timestamp for the windowing server."""
+ timestamp = 0
+ gdk_window = self.window.get_window()
+ if GdkX11 and isinstance(gdk_window, GdkX11.X11Window):
+ timestamp = GdkX11.x11_get_server_time(gdk_window)
+ return timestamp
+
+ def active(self):
+ """Returns True if the window is active, False if not."""
+ return self.window.is_active()
+
+ def visible(self):
+ """Returns True if window is visible, False if not."""
+ return self.window.get_visible()
+
+ def get_builder(self):
+ """Returns a reference to the main window GTK builder object."""
+ return self.main_builder
+
+ def quit(self, shutdown=False, restart=False): # noqa: A003 python builtin
+ """Quits the GtkUI application.
+
+ Args:
+ shutdown (bool): Whether or not to shutdown the daemon as well.
+ restart (bool): Whether or not to restart the application after closing.
+
+ """
+
+ def quit_gtkui():
+ def stop_gtk_reactor(result=None):
+ self.restart = restart
+ try:
+ reactor.callLater(0, reactor.fireSystemEvent, 'gtkui_close')
+ except ReactorNotRunning:
+ log.debug('Attempted to stop the reactor but it is not running...')
+
+ if shutdown:
+ client.daemon.shutdown().addCallback(stop_gtk_reactor)
+ elif not client.is_standalone() and client.connected():
+ client.disconnect().addCallback(stop_gtk_reactor)
+ else:
+ stop_gtk_reactor()
+
+ if self.config['lock_tray'] and not self.visible():
+ dialog = PasswordDialog(_('Enter your password to Quit Deluge...'))
+
+ def on_dialog_response(response_id):
+ if response_id == Gtk.ResponseType.OK:
+ if (
+ self.config['tray_password']
+ == sha(decode_bytes(dialog.get_password()).encode()).hexdigest()
+ ):
+ quit_gtkui()
+
+ dialog.run().addCallback(on_dialog_response)
+ else:
+ quit_gtkui()
+
+ def load_window_state(self):
+ if (
+ self.config['window_x_pos'] == -32000
+ or self.config['window_x_pos'] == -32000
+ ):
+ self.config['window_x_pos'] = self.config['window_y_pos'] = 0
+
+ self.window.move(self.config['window_x_pos'], self.config['window_y_pos'])
+ self.window.resize(self.config['window_width'], self.config['window_height'])
+ if self.config['window_maximized']:
+ self.window.maximize()
+
+ def save_position(self):
+ self.config['window_maximized'] = self.window.props.is_maximized
+ if not self.config['window_maximized'] and self.visible():
+ self.config['window_x_pos'], self.config[
+ 'window_y_pos'
+ ] = self.window.get_position()
+ self.config['window_width'], self.config[
+ 'window_height'
+ ] = self.window.get_size()
+
+ def on_window_configure_event(self, widget, event):
+ self.save_position()
+
+ def on_window_state_event(self, widget, event):
+ if event.changed_mask & WindowState.ICONIFIED:
+ if event.new_window_state & WindowState.ICONIFIED:
+ log.debug('MainWindow is minimized..')
+ component.get('TorrentView').save_state()
+ component.pause(self.child_components)
+ self.is_minimized = True
+ else:
+ log.debug('MainWindow is not minimized..')
+ component.resume(self.child_components)
+ self.is_minimized = False
+ return False
+
+ def on_window_delete_event(self, widget, event):
+ if self.config['close_to_tray'] and self.config['enable_system_tray']:
+ self.hide()
+ else:
+ self.quit()
+
+ return True
+
+ def on_tabsbar_pane_position_event(self, obj, param):
+ self.config['tabsbar_position'] = self.tabsbar_pane.get_position()
+
+ def on_sidebar_pane_position_event(self, obj, param):
+ self.config['sidebar_position'] = self.sidebar_pane.get_position()
+
+ def on_drag_data_received_event(
+ self, widget, drag_context, x, y, selection_data, info, timestamp
+ ):
+ log.debug('Selection(s) dropped on main window %s', selection_data.get_text())
+ if selection_data.get_uris():
+ process_args(selection_data.get_uris())
+ else:
+ process_args(selection_data.get_text().split())
+ drag_context.finish(True, True, timestamp)
+
+ def on_expose_event(self, widget, event):
+ component.get('SystemTray').blink(False)
+
+ def stop(self):
+ self.window.set_title('Deluge')
+
+ def update(self):
+ # Update the window title
+ def _on_get_session_status(status):
+ download_rate = fspeed(
+ status['payload_download_rate'], precision=0, shortform=True
+ )
+ upload_rate = fspeed(
+ status['payload_upload_rate'], precision=0, shortform=True
+ )
+ self.window.set_title(
+ _('D: {download_rate} U: {upload_rate} - Deluge').format(
+ download_rate=download_rate, upload_rate=upload_rate
+ )
+ )
+
+ if self.config['show_rate_in_title']:
+ client.core.get_session_status(
+ ['payload_download_rate', 'payload_upload_rate']
+ ).addCallback(_on_get_session_status)
+
+ def _on_set_show_rate_in_title(self, key, value):
+ if value:
+ self.update()
+ else:
+ self.window.set_title(_('Deluge'))
+
+ def on_newversionavailable_event(self, new_version):
+ if self.config['show_new_releases']:
+ from .new_release_dialog import NewReleaseDialog
+
+ reactor.callLater(5.0, NewReleaseDialog().show, new_version)
+
+ def is_on_active_workspace(self):
+ """Determines if MainWindow is on the active workspace.
+
+ Returns:
+ bool: True if on active workspace (or wnck module not available), otherwise False.
+
+ """
+
+ if Wnck:
+ self.screen.force_update()
+ win = Wnck.Window.get(self.window.get_window().get_xid())
+ if win:
+ active_wksp = win.get_screen().get_active_workspace()
+ if active_wksp:
+ return win.is_on_workspace(active_wksp)
+ return False
+ return True
diff --git a/deluge/ui/gtk3/menubar.py b/deluge/ui/gtk3/menubar.py
new file mode 100644
index 0000000..e09f394
--- /dev/null
+++ b/deluge/ui/gtk3/menubar.py
@@ -0,0 +1,614 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2011 Pedro Algarvio <pedro@algarvio.me>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+
+from __future__ import unicode_literals
+
+import logging
+import os.path
+
+from gi.repository import Gtk
+
+import deluge.common
+import deluge.component as component
+from deluge.configmanager import ConfigManager
+from deluge.ui.client import client
+
+from .dialogs import ErrorDialog, OtherDialog
+from .path_chooser import PathChooser
+
+log = logging.getLogger(__name__)
+
+
+class MenuBar(component.Component):
+ def __init__(self):
+ log.debug('MenuBar init..')
+ component.Component.__init__(self, 'MenuBar')
+ self.mainwindow = component.get('MainWindow')
+ self.main_builder = self.mainwindow.get_builder()
+ self.config = ConfigManager('gtk3ui.conf')
+
+ self.builder = Gtk.Builder()
+ # Get the torrent menu from the gtk builder file
+ self.builder.add_from_file(
+ deluge.common.resource_filename(
+ __package__, os.path.join('glade', 'torrent_menu.ui')
+ )
+ )
+ # Get the torrent options menu from the gtk builder file
+ self.builder.add_from_file(
+ deluge.common.resource_filename(
+ __package__, os.path.join('glade', 'torrent_menu.options.ui')
+ )
+ )
+ # Get the torrent queue menu from the gtk builder file
+ self.builder.add_from_file(
+ deluge.common.resource_filename(
+ __package__, os.path.join('glade', 'torrent_menu.queue.ui')
+ )
+ )
+
+ # Attach queue torrent menu
+ torrent_queue_menu = self.builder.get_object('queue_torrent_menu')
+ self.builder.get_object('menuitem_queue').set_submenu(torrent_queue_menu)
+ # Attach options torrent menu
+ torrent_options_menu = self.builder.get_object('options_torrent_menu')
+ self.builder.get_object('menuitem_options').set_submenu(torrent_options_menu)
+
+ self.builder.get_object('download-limit-image').set_from_file(
+ deluge.common.get_pixmap('downloading16.png')
+ )
+ self.builder.get_object('upload-limit-image').set_from_file(
+ deluge.common.get_pixmap('seeding16.png')
+ )
+
+ for menuitem in (
+ 'menuitem_down_speed',
+ 'menuitem_up_speed',
+ 'menuitem_max_connections',
+ 'menuitem_upload_slots',
+ ):
+ submenu = Gtk.Menu()
+ item = Gtk.MenuItem.new_with_label(_('Set Unlimited'))
+ item.set_name(menuitem)
+ item.connect('activate', self.on_menuitem_set_unlimited)
+ submenu.append(item)
+ item = Gtk.MenuItem.new_with_label(_('Other...'))
+ item.set_name(menuitem)
+ item.connect('activate', self.on_menuitem_set_other)
+ submenu.append(item)
+ submenu.show_all()
+ self.builder.get_object(menuitem).set_submenu(submenu)
+
+ submenu = Gtk.Menu()
+ item = Gtk.MenuItem.new_with_label(_('On'))
+ item.connect('activate', self.on_menuitem_set_automanaged_on)
+ submenu.append(item)
+ item = Gtk.MenuItem.new_with_label(_('Off'))
+ item.connect('activate', self.on_menuitem_set_automanaged_off)
+ submenu.append(item)
+ submenu.show_all()
+ self.builder.get_object('menuitem_auto_managed').set_submenu(submenu)
+
+ submenu = Gtk.Menu()
+ item = Gtk.MenuItem.new_with_label(_('Disable'))
+ item.connect('activate', self.on_menuitem_set_stop_seed_at_ratio_disable)
+ submenu.append(item)
+ item = Gtk.MenuItem.new_with_label(_('Enable...'))
+ item.set_name('menuitem_stop_seed_at_ratio')
+ item.connect('activate', self.on_menuitem_set_other)
+ submenu.append(item)
+ submenu.show_all()
+ self.builder.get_object('menuitem_stop_seed_at_ratio').set_submenu(submenu)
+
+ self.torrentmenu = self.builder.get_object('torrent_menu')
+ self.menu_torrent = self.main_builder.get_object('menu_torrent')
+
+ # Attach the torrent_menu to the Torrent file menu
+ self.menu_torrent.set_submenu(self.torrentmenu)
+
+ # Make sure the view menuitems are showing the correct active state
+ self.main_builder.get_object('menuitem_toolbar').set_active(
+ self.config['show_toolbar']
+ )
+ self.main_builder.get_object('menuitem_sidebar').set_active(
+ self.config['show_sidebar']
+ )
+ self.main_builder.get_object('menuitem_statusbar').set_active(
+ self.config['show_statusbar']
+ )
+ self.main_builder.get_object('sidebar_show_zero').set_active(
+ self.config['sidebar_show_zero']
+ )
+ self.main_builder.get_object('sidebar_show_trackers').set_active(
+ self.config['sidebar_show_trackers']
+ )
+ self.main_builder.get_object('sidebar_show_owners').set_active(
+ self.config['sidebar_show_owners']
+ )
+
+ # Connect main window Signals #
+ self.mainwindow.connect_signals(self)
+
+ # Connect menubar signals
+ self.builder.connect_signals(self)
+
+ self.change_sensitivity = ['menuitem_addtorrent']
+
+ def start(self):
+ for widget in self.change_sensitivity:
+ self.main_builder.get_object(widget).set_sensitive(True)
+
+ # Only show open_folder menuitem and separator if connected to a localhost daemon.
+ localhost_items = ['menuitem_open_folder', 'separator4']
+ if client.is_localhost():
+ for widget in localhost_items:
+ self.builder.get_object(widget).show()
+ self.builder.get_object(widget).set_no_show_all(False)
+ else:
+ for widget in localhost_items:
+ self.builder.get_object(widget).hide()
+ self.builder.get_object(widget).set_no_show_all(True)
+
+ self.main_builder.get_object('separatormenuitem').set_visible(
+ not self.config['standalone']
+ )
+ self.main_builder.get_object('menuitem_quitdaemon').set_visible(
+ not self.config['standalone']
+ )
+ self.main_builder.get_object('menuitem_connectionmanager').set_visible(
+ not self.config['standalone']
+ )
+
+ # Show the Torrent menu because we're connected to a host
+ self.menu_torrent.show()
+
+ if client.get_auth_level() == deluge.common.AUTH_LEVEL_ADMIN:
+ # Get known accounts to allow changing ownership
+ client.core.get_known_accounts().addCallback(
+ self._on_known_accounts
+ ).addErrback(self._on_known_accounts_fail)
+
+ client.register_event_handler(
+ 'TorrentStateChangedEvent', self.on_torrentstatechanged_event
+ )
+ client.register_event_handler(
+ 'TorrentResumedEvent', self.on_torrentresumed_event
+ )
+ client.register_event_handler('SessionPausedEvent', self.on_sessionpaused_event)
+ client.register_event_handler(
+ 'SessionResumedEvent', self.on_sessionresumed_event
+ )
+
+ def stop(self):
+ log.debug('MenuBar stopping')
+
+ client.deregister_event_handler(
+ 'TorrentStateChangedEvent', self.on_torrentstatechanged_event
+ )
+ client.deregister_event_handler(
+ 'TorrentResumedEvent', self.on_torrentresumed_event
+ )
+ client.deregister_event_handler(
+ 'SessionPausedEvent', self.on_sessionpaused_event
+ )
+ client.deregister_event_handler(
+ 'SessionResumedEvent', self.on_sessionresumed_event
+ )
+
+ for widget in self.change_sensitivity:
+ self.main_builder.get_object(widget).set_sensitive(False)
+
+ # Hide the Torrent menu
+ self.menu_torrent.hide()
+
+ self.main_builder.get_object('separatormenuitem').hide()
+ self.main_builder.get_object('menuitem_quitdaemon').hide()
+
+ def update_menu(self):
+ selected = component.get('TorrentView').get_selected_torrents()
+ if not selected or len(selected) == 0:
+ # No torrent is selected. Disable the 'Torrents' menu
+ self.menu_torrent.set_sensitive(False)
+ return
+
+ self.menu_torrent.set_sensitive(True)
+ # XXX: Should also update Pause/Resume/Remove menuitems.
+ # Any better way than duplicating toolbar.py:update_buttons in here?
+
+ def add_torrentmenu_separator(self):
+ sep = Gtk.SeparatorMenuItem()
+ self.torrentmenu.append(sep)
+ sep.show()
+ return sep
+
+ # Callbacks #
+ def on_torrentstatechanged_event(self, torrent_id, state):
+ if state == 'Paused':
+ self.update_menu()
+
+ def on_torrentresumed_event(self, torrent_id):
+ self.update_menu()
+
+ def on_sessionpaused_event(self):
+ self.update_menu()
+
+ def on_sessionresumed_event(self):
+ self.update_menu()
+
+ # File Menu #
+ def on_menuitem_addtorrent_activate(self, data=None):
+ log.debug('on_menuitem_addtorrent_activate')
+ component.get('AddTorrentDialog').show()
+
+ def on_menuitem_createtorrent_activate(self, data=None):
+ log.debug('on_menuitem_createtorrent_activate')
+ from .createtorrentdialog import CreateTorrentDialog
+
+ CreateTorrentDialog().show()
+
+ def on_menuitem_quitdaemon_activate(self, data=None):
+ log.debug('on_menuitem_quitdaemon_activate')
+ self.mainwindow.quit(shutdown=True)
+
+ def on_menuitem_quit_activate(self, data=None):
+ log.debug('on_menuitem_quit_activate')
+ self.mainwindow.quit()
+
+ # Edit Menu #
+ def on_menuitem_preferences_activate(self, data=None):
+ log.debug('on_menuitem_preferences_activate')
+ component.get('Preferences').show()
+
+ def on_menuitem_connectionmanager_activate(self, data=None):
+ log.debug('on_menuitem_connectionmanager_activate')
+ component.get('ConnectionManager').show()
+
+ # Torrent Menu #
+ def on_menuitem_pause_activate(self, data=None):
+ log.debug('on_menuitem_pause_activate')
+ client.core.pause_torrents(component.get('TorrentView').get_selected_torrents())
+
+ def on_menuitem_resume_activate(self, data=None):
+ log.debug('on_menuitem_resume_activate')
+ client.core.resume_torrents(
+ component.get('TorrentView').get_selected_torrents()
+ )
+
+ def on_menuitem_updatetracker_activate(self, data=None):
+ log.debug('on_menuitem_updatetracker_activate')
+ client.core.force_reannounce(
+ component.get('TorrentView').get_selected_torrents()
+ )
+
+ def on_menuitem_edittrackers_activate(self, data=None):
+ log.debug('on_menuitem_edittrackers_activate')
+ from .edittrackersdialog import EditTrackersDialog
+
+ dialog = EditTrackersDialog(
+ component.get('TorrentView').get_selected_torrent(), self.mainwindow.window
+ )
+ dialog.run()
+
+ def on_menuitem_remove_activate(self, data=None):
+ log.debug('on_menuitem_remove_activate')
+ torrent_ids = component.get('TorrentView').get_selected_torrents()
+ if torrent_ids:
+ from .removetorrentdialog import RemoveTorrentDialog
+
+ RemoveTorrentDialog(torrent_ids).run()
+
+ def on_menuitem_recheck_activate(self, data=None):
+ log.debug('on_menuitem_recheck_activate')
+ client.core.force_recheck(component.get('TorrentView').get_selected_torrents())
+
+ def on_menuitem_open_folder_activate(self, data=None):
+ log.debug('on_menuitem_open_folder')
+
+ def _on_torrent_status(status):
+ timestamp = component.get('MainWindow').get_timestamp()
+ path = os.path.join(
+ status['download_location'], status['files'][0]['path'].split('/')[0]
+ )
+ deluge.common.show_file(path, timestamp=timestamp)
+
+ for torrent_id in component.get('TorrentView').get_selected_torrents():
+ component.get('SessionProxy').get_torrent_status(
+ torrent_id, ['download_location', 'files']
+ ).addCallback(_on_torrent_status)
+
+ def on_menuitem_move_activate(self, data=None):
+ log.debug('on_menuitem_move_activate')
+ component.get('SessionProxy').get_torrent_status(
+ component.get('TorrentView').get_selected_torrent(), ['download_location']
+ ).addCallback(self.show_move_storage_dialog)
+
+ def show_move_storage_dialog(self, status):
+ log.debug('show_move_storage_dialog')
+ builder = Gtk.Builder()
+ builder.add_from_file(
+ deluge.common.resource_filename(
+ __package__, os.path.join('glade', 'move_storage_dialog.ui')
+ )
+ )
+ # Keep it referenced:
+ # https://bugzilla.gnome.org/show_bug.cgi?id=546802
+ self.move_storage_dialog = builder.get_object('move_storage_dialog')
+ self.move_storage_dialog.set_transient_for(self.mainwindow.window)
+ self.move_storage_dialog_hbox = builder.get_object('hbox_entry')
+ self.move_storage_path_chooser = PathChooser(
+ 'move_completed_paths_list', self.move_storage_dialog
+ )
+ self.move_storage_dialog_hbox.add(self.move_storage_path_chooser)
+ self.move_storage_dialog_hbox.show_all()
+ self.move_storage_path_chooser.set_text(status['download_location'])
+
+ def on_dialog_response_event(widget, response_id):
+ def on_core_result(result):
+ # Delete references
+ self.move_storage_dialog.hide()
+ del self.move_storage_dialog
+ del self.move_storage_dialog_hbox
+
+ if response_id == Gtk.ResponseType.CANCEL:
+ on_core_result(None)
+
+ if response_id == Gtk.ResponseType.OK:
+ log.debug(
+ 'Moving torrents to %s', self.move_storage_path_chooser.get_text()
+ )
+ path = self.move_storage_path_chooser.get_text()
+ client.core.move_storage(
+ component.get('TorrentView').get_selected_torrents(), path
+ ).addCallback(on_core_result)
+
+ self.move_storage_dialog.connect('response', on_dialog_response_event)
+ self.move_storage_dialog.show()
+
+ def on_menuitem_queue_top_activate(self, value):
+ log.debug('on_menuitem_queue_top_activate')
+ client.core.queue_top(component.get('TorrentView').get_selected_torrents())
+
+ def on_menuitem_queue_up_activate(self, value):
+ log.debug('on_menuitem_queue_up_activate')
+ client.core.queue_up(component.get('TorrentView').get_selected_torrents())
+
+ def on_menuitem_queue_down_activate(self, value):
+ log.debug('on_menuitem_queue_down_activate')
+ client.core.queue_down(component.get('TorrentView').get_selected_torrents())
+
+ def on_menuitem_queue_bottom_activate(self, value):
+ log.debug('on_menuitem_queue_bottom_activate')
+ client.core.queue_bottom(component.get('TorrentView').get_selected_torrents())
+
+ # View Menu #
+ def on_menuitem_toolbar_toggled(self, value):
+ log.debug('on_menuitem_toolbar_toggled')
+ component.get('ToolBar').visible(value.get_active())
+
+ def on_menuitem_sidebar_toggled(self, value):
+ log.debug('on_menuitem_sidebar_toggled')
+ component.get('SideBar').visible(value.get_active())
+
+ def on_menuitem_statusbar_toggled(self, value):
+ log.debug('on_menuitem_statusbar_toggled')
+ component.get('StatusBar').visible(value.get_active())
+
+ # Help Menu #
+ def on_menuitem_homepage_activate(self, data=None):
+ log.debug('on_menuitem_homepage_activate')
+ deluge.common.open_url_in_browser('http://deluge-torrent.org')
+
+ def on_menuitem_faq_activate(self, data=None):
+ log.debug('on_menuitem_faq_activate')
+ deluge.common.open_url_in_browser('http://dev.deluge-torrent.org/wiki/Faq')
+
+ def on_menuitem_community_activate(self, data=None):
+ log.debug('on_menuitem_community_activate')
+ deluge.common.open_url_in_browser('http://forum.deluge-torrent.org/')
+
+ def on_menuitem_about_activate(self, data=None):
+ log.debug('on_menuitem_about_activate')
+ from .aboutdialog import AboutDialog
+
+ AboutDialog().run()
+
+ def on_menuitem_set_unlimited(self, widget):
+ log.debug('widget name: %s', widget.get_name())
+ funcs = {
+ 'menuitem_down_speed': 'max_download_speed',
+ 'menuitem_up_speed': 'max_upload_speed',
+ 'menuitem_max_connections': 'max_connections',
+ 'menuitem_upload_slots': 'max_upload_slots',
+ }
+ if widget.get_name() in funcs:
+ torrent_ids = component.get('TorrentView').get_selected_torrents()
+ client.core.set_torrent_options(torrent_ids, {funcs[widget.get_name()]: -1})
+
+ def on_menuitem_set_other(self, widget):
+ log.debug('widget name: %s', widget.get_name())
+ status_map = {
+ 'menuitem_down_speed': ['max_download_speed', 'max_download_speed'],
+ 'menuitem_up_speed': ['max_upload_speed', 'max_upload_speed'],
+ 'menuitem_max_connections': ['max_connections', 'max_connections_global'],
+ 'menuitem_upload_slots': ['max_upload_slots', 'max_upload_slots_global'],
+ 'menuitem_stop_seed_at_ratio': ['stop_ratio', 'stop_seed_ratio'],
+ }
+
+ other_dialog_info = {
+ 'menuitem_down_speed': [
+ _('Download Speed Limit'),
+ _('Set the maximum download speed'),
+ _('KiB/s'),
+ 'downloading.svg',
+ ],
+ 'menuitem_up_speed': [
+ _('Upload Speed Limit'),
+ _('Set the maximum upload speed'),
+ _('KiB/s'),
+ 'seeding.svg',
+ ],
+ 'menuitem_max_connections': [
+ _('Incoming Connections'),
+ _('Set the maximum incoming connections'),
+ '',
+ 'network-transmit-receive-symbolic',
+ ],
+ 'menuitem_upload_slots': [
+ _('Peer Upload Slots'),
+ _('Set the maximum upload slots'),
+ '',
+ 'view-sort-descending-symbolic',
+ ],
+ 'menuitem_stop_seed_at_ratio': [
+ _('Stop Seed At Ratio'),
+ 'Stop torrent seeding at ratio',
+ '',
+ None,
+ ],
+ }
+
+ core_key = status_map[widget.get_name()][0]
+ core_key_global = status_map[widget.get_name()][1]
+
+ def _on_torrent_status(status):
+ other_dialog = other_dialog_info[widget.get_name()]
+ # Add the default using status value
+ if status:
+ other_dialog.append(status[core_key_global])
+
+ def set_value(value):
+ if value is not None:
+ if value == 0:
+ value += -1
+ options = {core_key: value}
+ if core_key == 'stop_ratio':
+ options['stop_at_ratio'] = True
+ client.core.set_torrent_options(torrent_ids, options)
+
+ dialog = OtherDialog(*other_dialog)
+ dialog.run().addCallback(set_value)
+
+ torrent_ids = component.get('TorrentView').get_selected_torrents()
+ if len(torrent_ids) == 1:
+ core_key_global = core_key
+ d = component.get('SessionProxy').get_torrent_status(
+ torrent_ids[0], [core_key]
+ )
+ else:
+ d = client.core.get_config_values([core_key_global])
+ d.addCallback(_on_torrent_status)
+
+ def on_menuitem_set_automanaged_on(self, widget):
+ client.core.set_torrent_options(
+ component.get('TorrentView').get_selected_torrents(), {'auto_managed': True}
+ )
+
+ def on_menuitem_set_automanaged_off(self, widget):
+ client.core.set_torrent_options(
+ component.get('TorrentView').get_selected_torrents(),
+ {'auto_managed': False},
+ )
+
+ def on_menuitem_set_stop_seed_at_ratio_disable(self, widget):
+ client.core.set_torrent_options(
+ component.get('TorrentView').get_selected_torrents(),
+ {'stop_at_ratio': False},
+ )
+
+ def on_menuitem_sidebar_zero_toggled(self, widget):
+ self.config['sidebar_show_zero'] = widget.get_active()
+ component.get('FilterTreeView').update()
+
+ def on_menuitem_sidebar_trackers_toggled(self, widget):
+ self.config['sidebar_show_trackers'] = widget.get_active()
+ component.get('FilterTreeView').update()
+
+ def on_menuitem_sidebar_owners_toggled(self, widget):
+ self.config['sidebar_show_owners'] = widget.get_active()
+ component.get('FilterTreeView').update()
+
+ def _on_known_accounts(self, known_accounts):
+ known_accounts_to_log = []
+ for account in known_accounts:
+ account_to_log = {}
+ for key, value in account.copy().items():
+ if key == 'password':
+ value = '*' * len(value)
+ account_to_log[key] = value
+ known_accounts_to_log.append(account_to_log)
+ log.debug('_on_known_accounts: %s', known_accounts_to_log)
+ if len(known_accounts) <= 1:
+ return
+
+ self.builder.get_object('menuitem_change_owner').set_visible(True)
+
+ self.change_owner_submenu = Gtk.Menu()
+ self.change_owner_submenu_items = {}
+ maingroup = Gtk.RadioMenuItem()
+
+ self.change_owner_submenu_items[None] = Gtk.RadioMenuItem(maingroup)
+
+ for account in known_accounts:
+ username = account['username']
+ item = Gtk.RadioMenuItem.new_with_label(maingroup, username)
+ self.change_owner_submenu_items[username] = item
+ self.change_owner_submenu.append(item)
+ item.connect('toggled', self._on_change_owner_toggled, username)
+
+ self.change_owner_submenu.show_all()
+ self.change_owner_submenu_items[None].set_active(True)
+ self.change_owner_submenu_items[None].hide()
+ self.builder.get_object('menuitem_change_owner').connect(
+ 'activate', self._on_change_owner_submenu_active
+ )
+ self.builder.get_object('menuitem_change_owner').set_submenu(
+ self.change_owner_submenu
+ )
+
+ def _on_known_accounts_fail(self, reason):
+ self.builder.get_object('menuitem_change_owner').set_visible(False)
+
+ def _on_change_owner_submenu_active(self, widget):
+ log.debug('_on_change_owner_submenu_active')
+ selected = component.get('TorrentView').get_selected_torrents()
+ if len(selected) > 1:
+ self.change_owner_submenu_items[None].set_active(True)
+ return
+
+ torrent_owner = component.get('TorrentView').get_torrent_status(selected[0])[
+ 'owner'
+ ]
+ for username, item in self.change_owner_submenu_items.items():
+ item.set_active(username == torrent_owner)
+
+ def _on_change_owner_toggled(self, widget, username):
+ log.debug('_on_change_owner_toggled')
+ update_torrents = []
+ selected = component.get('TorrentView').get_selected_torrents()
+ for torrent_id in selected:
+ torrent_status = component.get('TorrentView').get_torrent_status(torrent_id)
+ if torrent_status['owner'] != username:
+ update_torrents.append(torrent_id)
+
+ if update_torrents:
+ log.debug('Setting torrent owner "%s" on %s', username, update_torrents)
+
+ def failed_change_owner(failure):
+ ErrorDialog(
+ _('Ownership Change Error'),
+ _('There was an error while trying changing ownership.'),
+ self.mainwindow.window,
+ details=failure.value.logable(),
+ ).run()
+
+ client.core.set_torrent_options(
+ update_torrents, {'owner': username}
+ ).addErrback(failed_change_owner)
diff --git a/deluge/ui/gtk3/menubar_osx.py b/deluge/ui/gtk3/menubar_osx.py
new file mode 100644
index 0000000..1df6fab
--- /dev/null
+++ b/deluge/ui/gtk3/menubar_osx.py
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from gi.repository.Gdk import ModifierType
+from gi.repository.Gtk import SeparatorMenuItem, accel_groups_from_object
+from gi.repository.Gtk.AccelFlags import VISIBLE
+
+from deluge.configmanager import ConfigManager
+
+
+def accel_swap(item, group, skey, smod, dkey, dmod):
+ # Accel map hack broken, see ticket #3078
+ # item.remove_accelerator(group, ord(skey), smod)
+ item.add_accelerator('activate', group, ord(dkey), dmod, VISIBLE)
+
+
+def accel_meta(item, group, key):
+ accel_swap(item, group, key, ModifierType.CONTROL_MASK, key, ModifierType.META_MASK)
+
+
+def menubar_osx(gtkui, osxapp):
+ main_builder = gtkui.mainwindow.get_builder()
+ menubar = main_builder.get_object('menubar')
+ group = accel_groups_from_object(gtkui.mainwindow.window)[0]
+
+ config = ConfigManager('gtk3ui.conf')
+
+ # NOTE: accel maps doesn't work with glade file format
+ # because of libglade not setting MenuItem accel groups
+ # That's why we remove / set accelerators by hand... (dirty)
+ # Clean solution: migrate glades files to gtkbuilder format
+ file_menu = main_builder.get_object('menu_file').get_submenu()
+ file_items = file_menu.get_children()
+ accel_meta(file_items[0], group, 'o')
+ accel_meta(file_items[1], group, 'n')
+ quit_all_item = file_items[3]
+ accel_swap(
+ quit_all_item,
+ group,
+ 'q',
+ ModifierType.SHIFT_MASK | ModifierType.CONTROL_MASK,
+ 'q',
+ ModifierType.SHIFT_MASK | ModifierType.META_MASK,
+ )
+ for item in range(2, len(file_items)): # remove quits
+ file_menu.remove(file_items[item])
+
+ menu_widget = main_builder.get_object('menu_edit')
+ edit_menu = menu_widget.get_submenu()
+ edit_items = edit_menu.get_children()
+ pref_item = edit_items[0]
+ accel_swap(
+ pref_item, group, 'p', ModifierType.CONTROL_MASK, ',', ModifierType.META_MASK
+ )
+ edit_menu.remove(pref_item)
+
+ conn_item = edit_items[1]
+ accel_meta(conn_item, group, 'm')
+ edit_menu.remove(conn_item)
+
+ menubar.remove(menu_widget)
+
+ help_menu = main_builder.get_object('menu_help').get_submenu()
+ help_items = help_menu.get_children()
+ about_item = help_items[4]
+ help_menu.remove(about_item)
+ help_menu.remove(help_items[3]) # separator
+
+ menubar.hide()
+ osxapp.set_menu_bar(menubar)
+ # populate app menu
+ osxapp.insert_app_menu_item(about_item, 0)
+ osxapp.insert_app_menu_item(SeparatorMenuItem(), 1)
+ osxapp.insert_app_menu_item(pref_item, 2)
+ if not config['standalone']:
+ osxapp.insert_app_menu_item(conn_item, 3)
+ if quit_all_item.get_visible():
+ osxapp.insert_app_menu_item(SeparatorMenuItem(), 4)
+ osxapp.insert_app_menu_item(quit_all_item, 5)
diff --git a/deluge/ui/gtk3/new_release_dialog.py b/deluge/ui/gtk3/new_release_dialog.py
new file mode 100644
index 0000000..6aa3282
--- /dev/null
+++ b/deluge/ui/gtk3/new_release_dialog.py
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from gi.repository.Gtk import IconSize
+
+import deluge.common
+import deluge.component as component
+from deluge.configmanager import ConfigManager
+from deluge.ui.client import client
+
+
+class NewReleaseDialog(object):
+ def __init__(self):
+ pass
+
+ def show(self, available_version):
+ self.config = ConfigManager('gtk3ui.conf')
+ main_builder = component.get('MainWindow').get_builder()
+ self.dialog = main_builder.get_object('new_release_dialog')
+ # Set the version labels
+ if deluge.common.windows_check() or deluge.common.osx_check():
+ main_builder.get_object('image_new_release').set_from_file(
+ deluge.common.get_pixmap('deluge16.png')
+ )
+ else:
+ main_builder.get_object('image_new_release').set_from_icon_name(
+ 'deluge', IconSize.LARGE_TOOLBAR
+ )
+ main_builder.get_object('label_available_version').set_text(available_version)
+ main_builder.get_object('label_client_version').set_text(
+ deluge.common.get_version()
+ )
+ self.chk_not_show_dialog = main_builder.get_object(
+ 'chk_do_not_show_new_release'
+ )
+ main_builder.get_object('button_goto_downloads').connect(
+ 'clicked', self._on_button_goto_downloads
+ )
+ main_builder.get_object('button_close_new_release').connect(
+ 'clicked', self._on_button_close_new_release
+ )
+
+ if client.connected():
+
+ def on_info(version):
+ main_builder.get_object('label_server_version').set_text(version)
+ main_builder.get_object('label_server_version').show()
+ main_builder.get_object('label_server_version_text').show()
+
+ if not client.is_standalone():
+ main_builder.get_object('label_client_version_text').set_label(
+ _('<i>Client Version</i>')
+ )
+ client.daemon.info().addCallback(on_info)
+
+ self.dialog.show()
+
+ def _on_button_goto_downloads(self, widget):
+ deluge.common.open_url_in_browser('http://deluge-torrent.org')
+ self.config['show_new_releases'] = not self.chk_not_show_dialog.get_active()
+ self.dialog.destroy()
+
+ def _on_button_close_new_release(self, widget):
+ self.config['show_new_releases'] = not self.chk_not_show_dialog.get_active()
+ self.dialog.destroy()
diff --git a/deluge/ui/gtk3/options_tab.py b/deluge/ui/gtk3/options_tab.py
new file mode 100644
index 0000000..6a25fd1
--- /dev/null
+++ b/deluge/ui/gtk3/options_tab.py
@@ -0,0 +1,222 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+# 2017 Calum Lind <calumlind+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from gi.repository.Gdk import keyval_name
+
+import deluge.component as component
+from deluge.ui.client import client
+
+from .path_chooser import PathChooser
+from .torrentdetails import Tab
+
+
+class OptionsTab(Tab):
+ def __init__(self):
+ super(OptionsTab, self).__init__('Options', 'options_tab', 'options_tab_label')
+
+ self.prev_torrent_ids = None
+ self.prev_status = None
+ self.inconsistent_keys = []
+
+ # Create TabWidget items with widget id, get/set func name, status key.
+ self.add_tab_widget('spin_max_download', 'value', ['max_download_speed'])
+ self.add_tab_widget('spin_max_upload', 'value', ['max_upload_speed'])
+ self.add_tab_widget('spin_max_connections', 'value_as_int', ['max_connections'])
+ self.add_tab_widget(
+ 'spin_max_upload_slots', 'value_as_int', ['max_upload_slots']
+ )
+ self.add_tab_widget(
+ 'chk_prioritize_first_last', 'active', ['prioritize_first_last_pieces']
+ )
+ self.add_tab_widget(
+ 'chk_sequential_download', 'active', ['sequential_download']
+ )
+ self.add_tab_widget('chk_auto_managed', 'active', ['auto_managed'])
+ self.add_tab_widget('chk_stop_at_ratio', 'active', ['stop_at_ratio'])
+ self.add_tab_widget('chk_remove_at_ratio', 'active', ['remove_at_ratio'])
+ self.add_tab_widget('spin_stop_ratio', 'value', ['stop_ratio'])
+ self.add_tab_widget('chk_move_completed', 'active', ['move_completed'])
+ self.add_tab_widget('chk_shared', 'active', ['shared'])
+ self.add_tab_widget('summary_owner', 'text', ['owner'])
+ self.add_tab_widget('chk_super_seeding', 'active', ['super_seeding'])
+
+ # Connect key press event for spin widgets.
+ for widget_id in self.tab_widgets:
+ if widget_id.startswith('spin_'):
+ self.tab_widgets[widget_id].obj.connect(
+ 'key-press-event', self.on_key_press_event
+ )
+
+ self.button_apply = self.main_builder.get_object('button_apply')
+
+ self.move_completed_path_chooser = PathChooser(
+ 'move_completed_paths_list', parent=component.get('MainWindow').window
+ )
+ self.move_completed_path_chooser.set_sensitive(
+ self.tab_widgets['chk_move_completed'].obj.get_active()
+ )
+ self.move_completed_path_chooser.connect(
+ 'text-changed', self.on_path_chooser_text_changed_event
+ )
+ self.status_keys.append('move_completed_path')
+
+ self.move_completed_hbox = self.main_builder.get_object(
+ 'hbox_move_completed_path_chooser'
+ )
+ self.move_completed_hbox.add(self.move_completed_path_chooser)
+ self.move_completed_hbox.show_all()
+
+ component.get('MainWindow').connect_signals(self)
+
+ def start(self):
+ pass
+
+ def stop(self):
+ pass
+
+ def clear(self):
+ self.prev_torrent_ids = None
+ self.prev_status = None
+ self.inconsistent_keys = []
+
+ def update(self):
+ torrent_ids = component.get('TorrentView').get_selected_torrents()
+
+ # Set True if torrent(s) selected in torrentview, else False.
+ self._child_widget.set_sensitive(bool(torrent_ids))
+
+ if torrent_ids:
+ if torrent_ids != self.prev_torrent_ids:
+ self.clear()
+
+ component.get('SessionProxy').get_torrents_status(
+ {'id': torrent_ids}, self.status_keys
+ ).addCallback(self.parse_torrents_statuses)
+
+ self.prev_torrent_ids = torrent_ids
+
+ def parse_torrents_statuses(self, statuses):
+ """Finds common status values to all torrrents in statuses.
+
+ Values which differ are replaced with config values.
+
+
+ Args:
+ statuses (dict): A status dict of {torrent_id: {key: value}}.
+
+ Returns:
+ dict: A single status dict.
+
+ """
+ status = {}
+ if len(statuses) == 1:
+ # A single torrent so pop torrent status.
+ status = statuses.popitem()[1]
+ self.button_apply.set_label('_Apply')
+ else:
+ for status_key in self.status_keys:
+ prev_value = None
+ for idx, status in enumerate(statuses.values()):
+ if idx == 0:
+ prev_value = status[status_key]
+ continue
+ elif status[status_key] != prev_value:
+ self.inconsistent_keys.append(status_key)
+ break
+ status[status_key] = prev_value
+ self.button_apply.set_label(_('_Apply to selected'))
+
+ self.on_get_torrent_status(status)
+
+ def on_get_torrent_status(self, new_status):
+ # So we don't overwrite the user's unapplied changes we only
+ # want to update values that have been applied in the core.
+ if self.prev_status is None:
+ self.prev_status = dict.fromkeys(new_status, None)
+
+ if new_status != self.prev_status:
+ for widget in self.tab_widgets.values():
+ status_key = widget.status_keys[0]
+ status_value = new_status[status_key]
+ if status_value != self.prev_status[status_key]:
+ set_func = 'set_' + widget.func.replace('_as_int', '')
+ getattr(widget.obj, set_func)(status_value)
+ if set_func == 'set_active':
+ widget.obj.set_inconsistent(
+ status_key in self.inconsistent_keys
+ )
+
+ if (
+ new_status['move_completed_path']
+ != self.prev_status['move_completed_path']
+ ):
+ text = new_status['move_completed_path']
+ self.move_completed_path_chooser.set_text(
+ text, cursor_end=False, default_text=True
+ )
+
+ # Update sensitivity of widgets.
+ self.tab_widgets['spin_stop_ratio'].obj.set_sensitive(
+ new_status['stop_at_ratio']
+ )
+ self.tab_widgets['chk_remove_at_ratio'].obj.set_sensitive(
+ new_status['stop_at_ratio']
+ )
+
+ # Ensure apply button sensitivity is set False.
+ self.button_apply.set_sensitive(False)
+ self.prev_status = new_status
+
+ # === Widget signal handlers === #
+
+ def on_button_apply_clicked(self, button):
+ options = {}
+ for widget in self.tab_widgets.values():
+ status_key = widget.status_keys[0]
+ if status_key == 'owner':
+ continue # A label so read-only
+ widget_value = getattr(widget.obj, 'get_' + widget.func)()
+ if widget_value != self.prev_status[status_key] or (
+ status_key in self.inconsistent_keys
+ and not widget.obj.get_inconsistent()
+ ):
+ options[status_key] = widget_value
+
+ if options.get('move_completed', False):
+ options['move_completed_path'] = self.move_completed_path_chooser.get_text()
+
+ client.core.set_torrent_options(self.prev_torrent_ids, options)
+ self.button_apply.set_sensitive(False)
+
+ def on_chk_move_completed_toggled(self, widget):
+ self.move_completed_path_chooser.set_sensitive(widget.get_active())
+ self.on_chk_toggled(widget)
+
+ def on_chk_stop_at_ratio_toggled(self, widget):
+ self.tab_widgets['spin_stop_ratio'].obj.set_sensitive(widget.get_active())
+ self.tab_widgets['chk_remove_at_ratio'].obj.set_sensitive(widget.get_active())
+ self.on_chk_toggled(widget)
+
+ def on_chk_toggled(self, widget):
+ widget.set_inconsistent(False)
+ self.button_apply.set_sensitive(True)
+
+ def on_spin_value_changed(self, widget):
+ self.button_apply.set_sensitive(True)
+
+ def on_key_press_event(self, widget, event):
+ keyname = keyval_name(event.keyval).lstrip('KP_').lower()
+ if keyname.isdigit() or keyname in ['period', 'minus', 'delete', 'backspace']:
+ self.button_apply.set_sensitive(True)
+
+ def on_path_chooser_text_changed_event(self, widget, path):
+ self.button_apply.set_sensitive(True)
diff --git a/deluge/ui/gtk3/path_chooser.py b/deluge/ui/gtk3/path_chooser.py
new file mode 100644
index 0000000..b722841
--- /dev/null
+++ b/deluge/ui/gtk3/path_chooser.py
@@ -0,0 +1,201 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013 Bro <bro.development@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+from deluge.ui.client import client
+
+from .path_combo_chooser import PathChooserComboBox
+
+log = logging.getLogger(__name__)
+
+
+def singleton(cls):
+ instances = {}
+
+ def getinstance():
+ if cls not in instances:
+ instances[cls] = cls()
+ return instances[cls]
+
+ return getinstance
+
+
+@singleton
+class PathChoosersHandler(component.Component):
+ def __init__(self, paths_config_key=None):
+ # self.chooser_name = "PathChooser_%d" % (len(PathChooser.path_choosers) +1)
+ component.Component.__init__(self, 'PathChoosersHandler')
+ self.path_choosers = []
+ self.paths_list_keys = []
+ self.config_properties = {}
+ self.started = False
+ self.config_keys_to_funcs_mapping = {
+ 'path_chooser_show_chooser_button_on_localhost': 'filechooser_button_visible',
+ 'path_chooser_show_path_entry': 'path_entry_visible',
+ 'path_chooser_auto_complete_enabled': 'auto_complete_enabled',
+ 'path_chooser_show_folder_name': 'show_folder_name_on_button',
+ 'path_chooser_accelerator_string': 'accelerator_string',
+ 'path_chooser_show_hidden_files': 'show_hidden_files',
+ 'path_chooser_max_popup_rows': 'max_popup_rows',
+ }
+
+ def start(self):
+ self.started = True
+ self.update_config_from_core()
+
+ def stop(self):
+ self.started = False
+
+ def update_config_from_core(self):
+ def _on_config_values(config):
+ self.config_properties.update(config)
+ for chooser in self.path_choosers:
+ chooser.set_config(config)
+
+ keys = list(self.config_keys_to_funcs_mapping)
+ keys += self.paths_list_keys
+ client.core.get_config_values(keys).addCallback(_on_config_values)
+
+ def register_chooser(self, chooser):
+ chooser.config_key_funcs = {}
+ for key in self.config_keys_to_funcs_mapping:
+ chooser.config_key_funcs[key] = [None, None]
+ chooser.config_key_funcs[key][0] = getattr(
+ chooser, 'get_%s' % self.config_keys_to_funcs_mapping[key]
+ )
+ chooser.config_key_funcs[key][1] = getattr(
+ chooser, 'set_%s' % self.config_keys_to_funcs_mapping[key]
+ )
+
+ self.path_choosers.append(chooser)
+ if chooser.paths_config_key not in self.paths_list_keys:
+ self.paths_list_keys.append(chooser.paths_config_key)
+ if self.started:
+ self.update_config_from_core()
+ else:
+ chooser.set_config(self.config_properties)
+
+ def set_value_for_path_choosers(self, value, key):
+ for chooser in self.path_choosers:
+ chooser.config_key_funcs[key][1](value)
+
+ # Save to core
+ if key != 'path_chooser_max_popup_rows':
+ client.core.set_config({key: value})
+ else:
+ # Since the max rows value can be changed fast with a spinbutton, we
+ # delay saving to core until the values hasn't been changed in 1 second.
+ self.max_rows_value_set = value
+
+ def update(value_):
+ # The value hasn't been changed in one second, so save to core
+ if self.max_rows_value_set == value_:
+ client.core.set_config({'path_chooser_max_popup_rows': value})
+
+ from twisted.internet import reactor
+
+ reactor.callLater(1, update, value)
+
+ def on_list_values_changed(self, values, key, caller):
+ # Save to core
+ config = {key: values}
+ client.core.set_config(config)
+ # Set the values on all path choosers with that key
+ for chooser in self.path_choosers:
+ # Found chooser with values from 'key'
+ if chooser.paths_config_key == key:
+ chooser.set_values(values)
+
+ def get_config_keys(self):
+ keys = list(self.config_keys_to_funcs_mapping)
+ keys += self.paths_list_keys
+ return keys
+
+
+class PathChooser(PathChooserComboBox):
+ def __init__(self, paths_config_key=None, parent=None):
+ self.paths_config_key = paths_config_key
+ super(PathChooser, self).__init__(parent=parent)
+ self.chooser_handler = PathChoosersHandler()
+ self.chooser_handler.register_chooser(self)
+ self.set_auto_completer_func(self.on_completion)
+ self.connect('list-values-changed', self.on_list_values_changed_event)
+ self.connect(
+ 'auto-complete-enabled-toggled', self.on_auto_complete_enabled_toggled
+ )
+ self.connect('show-filechooser-toggled', self.on_show_filechooser_toggled)
+ self.connect(
+ 'show-folder-name-on-button', self.on_show_folder_on_button_toggled
+ )
+ self.connect('show-path-entry-toggled', self.on_show_path_entry_toggled)
+ self.connect('accelerator-set', self.on_accelerator_set)
+ self.connect('max-rows-changed', self.on_max_rows_changed)
+ self.connect('show-hidden-files-toggled', self.on_show_hidden_files_toggled)
+
+ def on_auto_complete_enabled_toggled(self, widget, value):
+ self.chooser_handler.set_value_for_path_choosers(
+ value, 'path_chooser_auto_complete_enabled'
+ )
+
+ def on_show_filechooser_toggled(self, widget, value):
+ self.chooser_handler.set_value_for_path_choosers(
+ value, 'path_chooser_show_chooser_button_on_localhost'
+ )
+
+ def on_show_folder_on_button_toggled(self, widget, value):
+ self.chooser_handler.set_value_for_path_choosers(
+ value, 'path_chooser_show_folder_name'
+ )
+
+ def on_show_path_entry_toggled(self, widget, value):
+ self.chooser_handler.set_value_for_path_choosers(
+ value, 'path_chooser_show_path_entry'
+ )
+
+ def on_accelerator_set(self, widget, value):
+ self.chooser_handler.set_value_for_path_choosers(
+ value, 'path_chooser_accelerator_string'
+ )
+
+ def on_show_hidden_files_toggled(self, widget, value):
+ self.chooser_handler.set_value_for_path_choosers(
+ value, 'path_chooser_show_hidden_files'
+ )
+
+ def on_max_rows_changed(self, widget, value):
+ self.chooser_handler.set_value_for_path_choosers(
+ value, 'path_chooser_max_popup_rows'
+ )
+
+ def on_list_values_changed_event(self, widget, values):
+ self.chooser_handler.on_list_values_changed(values, self.paths_config_key, self)
+
+ def set_config(self, config):
+ self.config = config
+ for key in self.config_key_funcs:
+ if key in config:
+ try:
+ self.config_key_funcs[key][1](config[key])
+ except TypeError as ex:
+ log.warning('TypeError: %s', ex)
+
+ # Set the saved paths
+ if self.paths_config_key and self.paths_config_key in config:
+ self.set_values(config[self.paths_config_key])
+
+ def on_completion(self, args):
+ def on_paths_cb(args):
+ self.complete(args)
+
+ d = client.core.get_completion_paths(args)
+ d.addCallback(on_paths_cb)
diff --git a/deluge/ui/gtk3/path_combo_chooser.py b/deluge/ui/gtk3/path_combo_chooser.py
new file mode 100755
index 0000000..c26289d
--- /dev/null
+++ b/deluge/ui/gtk3/path_combo_chooser.py
@@ -0,0 +1,1742 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013 Bro <bro.development@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, print_function, unicode_literals
+
+import os
+import warnings
+
+from gi.repository import Gdk, GObject, Gtk
+from gi.repository.GObject import SignalFlags
+
+from deluge.common import PY2, resource_filename
+from deluge.path_chooser_common import get_completion_paths
+
+# Filter the pygobject signal warning:
+# g_value_get_int: assertion 'G_VALUE_HOLDS_INT (value)' failed.
+# See: https://gitlab.gnome.org/GNOME/pygobject/issues/12
+warnings.filterwarnings('ignore', '.*g_value_get_int.*G_VALUE_HOLDS_INT.*', Warning)
+
+
+def is_ascii_value(keyval, ascii_key):
+ try:
+ # Set show/hide hidden files
+ if chr(keyval) == ascii_key:
+ return True
+ except ValueError:
+ # Not in ascii range
+ pass
+ return False
+
+
+def key_is_up(keyval):
+ return keyval == Gdk.KEY_Up or keyval == Gdk.KEY_KP_Up
+
+
+def key_is_down(keyval):
+ return keyval == Gdk.KEY_Down or keyval == Gdk.KEY_KP_Down
+
+
+def key_is_up_or_down(keyval):
+ return key_is_up(keyval) or key_is_down(keyval)
+
+
+def key_is_pgup_or_pgdown(keyval):
+ return keyval == Gdk.KEY_Page_Down or keyval == Gdk.KEY_Page_Up
+
+
+def key_is_enter(keyval):
+ return keyval == Gdk.KEY_Return or keyval == Gdk.KEY_KP_Enter
+
+
+def path_without_trailing_path_sep(path):
+ while path.endswith('/') or path.endswith('\\'):
+ if path == '/':
+ return path
+ path = path[0:-1]
+ return path
+
+
+class ValueList(object):
+
+ paths_without_trailing_path_sep = False
+
+ def get_values_count(self):
+ return len(self.tree_store)
+
+ def get_values(self):
+ """
+ Returns the values in the list.
+ """
+ values = []
+ for row in self.tree_store:
+ values.append(row[0])
+ return values
+
+ def add_values(
+ self, paths, append=True, scroll_to_row=False, clear=False, emit_signal=False
+ ):
+ """
+ Add paths to the liststore
+
+ :param paths: the paths to add
+ :type paths: list
+ :param append: if the values should be appended or inserted
+ :type append: boolean
+ :param scroll_to_row: if the treeview should scroll to the new row
+ :type scroll_to_row: boolean
+
+ """
+ if clear:
+ self.tree_store.clear()
+
+ for path in paths:
+ if self.paths_without_trailing_path_sep:
+ path = path_without_trailing_path_sep(path)
+ if append:
+ tree_iter = self.tree_store.append([path])
+ else:
+ tree_iter = self.tree_store.insert(0, [path])
+
+ if scroll_to_row:
+ self.treeview.grab_focus()
+ tree_path = self.tree_store.get_path(tree_iter)
+ # Scroll to path
+ self.handle_list_scroll(path=tree_path)
+
+ if emit_signal:
+ self.emit('list-value-added', paths)
+ self.emit('list-values-changed', self.get_values())
+
+ def set_values(self, paths, scroll_to_row=False, preserve_selection=True):
+ """
+ Add paths to the liststore
+
+ :param paths: the paths to add
+ :type paths: list
+ :param scroll_to_row: if the treeview should scroll to the new row
+ :type scroll_to_row: boolean
+
+ """
+ if not (isinstance(paths, list) or isinstance(paths, tuple)):
+ return
+ sel = None
+ if preserve_selection:
+ sel = self.get_selection_path()
+ self.add_values(paths, scroll_to_row=scroll_to_row, clear=True)
+ if sel:
+ self.treeview.get_selection().select_path(sel)
+
+ def get_selection_path(self):
+ """Returns the (first) selected path from a treeview"""
+ tree_selection = self.treeview.get_selection()
+ model, tree_paths = tree_selection.get_selected_rows()
+ if len(tree_paths) > 0:
+ return tree_paths[0]
+ return None
+
+ def get_selected_value(self):
+ path = self.get_selection_path()
+ if path:
+ return self.tree_store[path][0]
+ return None
+
+ def remove_selected_path(self):
+ path = self.get_selection_path()
+ if path:
+ path_value = self.tree_store[path][0]
+ del self.tree_store[path]
+ index = path[0]
+ # The last row was deleted
+ if index == len(self.tree_store):
+ index -= 1
+ if index >= 0:
+ path = (index,)
+ self.treeview.set_cursor(path)
+ self.set_path_selected(path)
+ self.emit('list-value-removed', path_value)
+ self.emit('list-values-changed', self.get_values())
+
+ def set_selected_value(self, value, select_first=False):
+ """
+ Select the row of the list with value
+
+ :param value: the value to be selected
+ :type value: str
+ :param select_first: if the first item should be selected if the value if not found.
+ :type select_first: boolean
+
+ """
+ for i, row in enumerate(self.tree_store):
+ if row[0] == value:
+ self.treeview.set_cursor((i))
+ return
+ # The value was not found
+ if select_first:
+ self.treeview.set_cursor((0,))
+ else:
+ self.treeview.get_selection().unselect_all()
+
+ def set_path_selected(self, path):
+ self.treeview.get_selection().select_path(path)
+
+ def on_value_list_treeview_key_press_event(self, widget, event):
+ """
+ Mimics Combobox behavior
+
+ Escape or Alt+Up: Close
+ Enter or Return : Select
+ """
+ keyval = event.keyval
+ state = event.get_state() & Gtk.accelerator_get_default_mod_mask()
+ alt_up = (state == Gdk.ModifierType.MOD1_MASK) and key_is_up(keyval)
+ if keyval == Gdk.KEY_Escape or alt_up:
+ self.popdown()
+ return True
+ # Set entry value to the selected row
+ elif key_is_enter(keyval):
+ path = self.get_selection_path()
+ if path:
+ self.set_entry_value(path, popdown=True)
+ return True
+ return False
+
+ def on_treeview_mouse_button_press_event(self, treeview, event, double_click=False):
+ """
+ When left clicking twice, the row value is set for the text entry
+ and the popup is closed.
+
+ """
+ # This is left click
+ if event.button != 3:
+ # Double clicked a row, set this as the entry value
+ # and close the popup
+ if (double_click and event.type == Gdk.EventType._2BUTTON_PRESS) or (
+ not double_click and event.type == Gdk.EventType.BUTTON_PRESS
+ ):
+ path = self.get_selection_path()
+ if path:
+ self.set_entry_value(path, popdown=True)
+ return True
+ return False
+
+ def handle_list_scroll(
+ self, _next=None, path=None, set_entry=False, swap=False, scroll_window=False
+ ):
+ """
+ Handles changes to the row selection.
+
+ :param _next: the direction to change selection. True means down and False means up.
+ None means no change.
+ :type _next: boolean/None
+ :param path: the current path. If None, the currently selected path is used.
+ :type path: tuple
+ :param set_entry: if the new value should be set in the text entry.
+ :type set_entry: boolean
+ :param swap: if the old and new value should be swapped
+ :type swap: boolean
+
+ """
+ if scroll_window:
+ adjustment = self.completion_scrolled_window.get_vadjustment()
+
+ visible_rows_height = self.get_values_count()
+ if visible_rows_height > self.max_visible_rows:
+ visible_rows_height = self.max_visible_rows
+
+ visible_rows_height *= self.row_height
+ value = adjustment.get_value()
+
+ # Max adjustment value
+ max_value = adjustment.get_upper() - visible_rows_height
+ # Set adjustment increment to 3 times the row height
+ adjustment.set_step_increment(self.row_height * 3)
+
+ if _next:
+ # If number of values is less than max rows, no scroll
+ if self.get_values_count() < self.max_visible_rows:
+ return
+ value += adjustment.get_step_increment()
+ if value > max_value:
+ value = max_value
+ else:
+ value -= adjustment.get_step_increment()
+ if value < 0:
+ value = 0
+ adjustment.set_value(value)
+ return
+
+ if path is None:
+ path = self.get_selection_path()
+ if not path:
+ # These options require a selected path
+ if set_entry or swap:
+ return
+ # This is a regular scroll, not setting value in entry or swapping rows,
+ # so we find a path value anyways
+ path = (0,)
+ cursor = self.treeview.get_cursor()
+ if cursor is not None and cursor[0] is not None:
+ path = cursor[0]
+ else:
+ # Since cursor is none, we won't advance the index
+ _next = None
+
+ # If _next is None, we won't change the selection
+ if _next is not None:
+ # We move the selection either one up or down.
+ # If we reach end of list, we wrap
+ index = path[0] if path else 0
+ index = index + 1 if _next else index - 1
+ if index >= len(self.tree_store):
+ index = 0
+ elif index < 0:
+ index = len(self.tree_store) - 1
+
+ # We have the index for the new path
+ new_path = index
+ if swap:
+ p1 = self.tree_store[path][0]
+ p2 = self.tree_store[new_path][0]
+ self.tree_store.swap(
+ self.tree_store.get_iter(path), self.tree_store.get_iter(new_path)
+ )
+ self.emit('list-values-reordered', [p1, p2])
+ self.emit('list-values-changed', self.get_values())
+ path = new_path
+
+ self.treeview.set_cursor(path)
+ self.treeview.get_selection().select_path(path)
+ if set_entry:
+ self.set_entry_value(path)
+
+
+class StoredValuesList(ValueList):
+ def __init__(self):
+ self.tree_store = self.builder.get_object('stored_values_tree_store')
+ self.tree_column = self.builder.get_object('stored_values_treeview_column')
+ self.rendererText = self.builder.get_object('stored_values_cellrenderertext')
+ self.paths_without_trailing_path_sep = False
+
+ # Add signal handlers
+ self.signal_handlers[
+ 'on_stored_values_treeview_mouse_button_press_event'
+ ] = self.on_treeview_mouse_button_press_event
+
+ self.signal_handlers[
+ 'on_stored_values_treeview_key_press_event'
+ ] = self.on_stored_values_treeview_key_press_event
+ self.signal_handlers[
+ 'on_stored_values_treeview_key_release_event'
+ ] = self.on_stored_values_treeview_key_release_event
+
+ self.signal_handlers[
+ 'on_cellrenderertext_edited'
+ ] = self.on_cellrenderertext_edited
+
+ def on_cellrenderertext_edited(self, cellrenderertext, path, new_text):
+ """
+ Callback on the 'edited' signal.
+
+ Sets the new text in the path and disables editing on the renderer.
+ """
+ new_text = path_without_trailing_path_sep(new_text)
+ self.tree_store[path][0] = new_text
+ self.rendererText.set_property('editable', False)
+
+ def on_edit_path(self, path, column):
+ """
+ Starts editing on the provided path
+
+ :param path: the paths to edit
+ :type path: tuple
+ :param column: the column to edit
+ :type column: Gtk.TreeViewColumn
+
+ """
+ self.rendererText.set_property('editable', True)
+ self.treeview.grab_focus()
+ self.treeview.set_cursor(path, column=column, start_editing=True)
+
+ def on_treeview_mouse_button_press_event(self, treeview, event):
+ """
+ Shows popup on selected row when right clicking
+ When left clicking twice, the row value is set for the text entry
+ and the popup is closed.
+
+ """
+ # This is left click
+ if event.button != 3:
+ super(StoredValuesList, self).on_treeview_mouse_button_press_event(
+ treeview, event, double_click=True
+ )
+ return False
+
+ # This is right click, create popup menu for this row
+ x = int(event.x)
+ y = int(event.y)
+ time = event.time
+ pthinfo = treeview.get_path_at_pos(x, y)
+ if pthinfo is not None:
+ path, col, cellx, celly = pthinfo
+ treeview.grab_focus()
+ treeview.set_cursor(path, col, 0)
+
+ self.path_list_popup = Gtk.Menu()
+ menuitem_edit = Gtk.MenuItem.new_with_label('Edit path')
+ self.path_list_popup.append(menuitem_edit)
+ menuitem_remove = Gtk.MenuItem.new_with_label('Remove path')
+ self.path_list_popup.append(menuitem_remove)
+
+ def on_edit_clicked(widget, path):
+ self.on_edit_path(path, self.tree_column)
+
+ def on_remove_clicked(widget, path):
+ self.remove_selected_path()
+
+ menuitem_edit.connect('activate', on_edit_clicked, path)
+ menuitem_remove.connect('activate', on_remove_clicked, path)
+ self.path_list_popup.popup(None, None, None, path, event.button, time)
+ self.path_list_popup.show_all()
+
+ def remove_selected_path(self):
+ ValueList.remove_selected_path(self)
+ # Resize popup
+ PathChooserPopup.popup(self)
+
+ def on_stored_values_treeview_key_press_event(self, widget, event):
+ super(StoredValuesList, self).on_value_list_treeview_key_press_event(
+ widget, event
+ )
+ # Prevent the default event handler to move the cursor in the list
+ if key_is_up_or_down(event.keyval):
+ return True
+
+ def on_stored_values_treeview_key_release_event(self, widget, event):
+ """
+ Mimics Combobox behavior
+
+ Escape or Alt+Up: Close
+ Enter or Return : Select
+
+ """
+ keyval = event.keyval
+ ctrl = event.get_state() & Gdk.ModifierType.CONTROL_MASK
+
+ # Edit selected row
+ if keyval in [Gdk.KEY_Left, Gdk.KEY_Right, Gdk.KEY_space]:
+ path = self.get_selection_path()
+ if path:
+ self.on_edit_path(path, self.tree_column)
+ elif key_is_up_or_down(keyval):
+ # Swap the row value
+ if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
+ self.handle_list_scroll(_next=key_is_down(keyval), swap=True)
+ else:
+ self.handle_list_scroll(_next=key_is_down(keyval))
+ elif key_is_pgup_or_pgdown(event.keyval):
+ # The cursor has been changed by the default key-press-event handler
+ # so set the path of the cursor selected
+ self.set_path_selected(self.treeview.get_cursor()[0])
+ elif ctrl:
+ # Handle key bindings for manipulating the list
+ # Remove the selected entry
+ if is_ascii_value(keyval, 'r'):
+ self.remove_selected_path()
+ return True
+ # Add current value to saved list
+ elif is_ascii_value(keyval, 's'):
+ super(
+ PathChooserComboBox, self
+ ).add_current_value_to_saved_list() # pylint: disable=bad-super-call
+ return True
+ # Edit selected value
+ elif is_ascii_value(keyval, 'e'):
+ self.edit_selected_path()
+ return True
+
+
+class CompletionList(ValueList):
+ def __init__(self):
+ self.tree_store = self.builder.get_object('completion_tree_store')
+ self.tree_column = self.builder.get_object('completion_treeview_column')
+ self.rendererText = self.builder.get_object('completion_cellrenderertext')
+ self.completion_scrolled_window = self.builder.get_object(
+ 'completion_scrolled_window'
+ )
+ self.signal_handlers[
+ 'on_completion_treeview_key_press_event'
+ ] = self.on_completion_treeview_key_press_event
+ self.signal_handlers[
+ 'on_completion_treeview_motion_notify_event'
+ ] = self.on_completion_treeview_motion_notify_event
+
+ # Add super class signal handler
+ self.signal_handlers['on_completion_treeview_mouse_button_press_event'] = super(
+ CompletionList, self
+ ).on_treeview_mouse_button_press_event
+
+ def reduce_values(self, prefix):
+ """
+ Reduce the values in the liststore to those starting with the prefix.
+
+ :param prefix: the prefix to be matched
+ :type paths: string
+
+ """
+ values = self.get_values()
+ matching_values = []
+ for v in values:
+ if v.startswith(prefix):
+ matching_values.append(v)
+ self.add_values(matching_values, clear=True)
+
+ def on_completion_treeview_key_press_event(self, widget, event):
+ ret = super(CompletionList, self).on_value_list_treeview_key_press_event(
+ widget, event
+ )
+ if ret:
+ return ret
+ keyval = event.keyval
+ ctrl = event.get_state() & Gdk.ModifierType.CONTROL_MASK
+ if key_is_up_or_down(keyval):
+ self.handle_list_scroll(_next=key_is_down(keyval))
+ return True
+ elif ctrl:
+ # Set show/hide hidden files
+ if is_ascii_value(keyval, 'h'):
+ self.path_entry.set_show_hidden_files(
+ not self.path_entry.get_show_hidden_files(), do_completion=True
+ )
+ return True
+
+ def on_completion_treeview_motion_notify_event(self, widget, event):
+ if event.is_hint:
+ x, y, state = event.window.get_pointer()
+ else:
+ x = event.x
+ y = event.y
+
+ path = self.treeview.get_path_at_pos(int(x), int(y))
+ if path:
+ self.handle_list_scroll(path=path[0], _next=None)
+
+
+class PathChooserPopup(object):
+ """This creates the popop window for the ComboEntry."""
+
+ def __init__(self, min_visible_rows, max_visible_rows, popup_alignment_widget):
+ self.min_visible_rows = min_visible_rows
+ # Maximum number of rows to display without scrolling
+ self.set_max_popup_rows(max_visible_rows)
+ self.popup_window.realize()
+ self.alignment_widget = popup_alignment_widget
+ self.popup_buttonbox = (
+ None
+ ) # If set, the height of this widget is the minimum height
+
+ def popup(self):
+ """Make the popup visible."""
+ # Entry is not yet visible
+ if not self.path_entry.get_realized():
+ return
+ self.set_window_position_and_size()
+
+ def popdown(self):
+ if not self.is_popped_up():
+ return
+ if not self.path_entry.get_realized():
+ return
+ self.popup_window.grab_remove()
+ self.popup_window.hide()
+
+ def is_popped_up(self):
+ """Check if window is popped up.
+
+ Returns:
+ bool: True if popped up, False otherwise.
+
+ """
+ return self.popup_window.get_mapped()
+
+ def set_window_position_and_size(self):
+ if len(self.tree_store) < self.min_visible_rows:
+ return False
+ x, y, width, height = self.get_position()
+ self.popup_window.set_size_request(width, height)
+ self.popup_window.resize(width, height)
+ self.popup_window.move(x, y)
+ self.popup_window.show_all()
+
+ def get_position(self):
+ """
+ Returns the size of the popup window and the coordinates on the screen.
+
+ """
+
+ # Necessary for the first call, to make treeview.size_request give sensible values
+ # self.popup_window.realize()
+ self.treeview.realize()
+
+ # We start with the coordinates of the parent window
+ z, x, y = self.path_entry.get_window().get_origin()
+
+ # Add the position of the alignment_widget relative to the parent window.
+ x += self.alignment_widget.get_allocation().x
+ y += self.alignment_widget.get_allocation().y
+
+ height_extra = 8
+ buttonbox_width = 0
+ height = self.popup_window.get_preferred_height()[1]
+ width = self.popup_window.get_preferred_width()[1]
+
+ if self.popup_buttonbox:
+ buttonbox_height = max(
+ self.popup_buttonbox.get_preferred_height()[1],
+ self.popup_buttonbox.get_allocation().height,
+ )
+ buttonbox_width = max(
+ self.popup_buttonbox.get_preferred_width()[1],
+ self.popup_buttonbox.get_allocation().width,
+ )
+ treeview_width = self.treeview.get_preferred_width()[1]
+ # After removing an element from the tree store, self.treeview.get_preferred_width()[0]
+ # returns -1 for some reason, so the requested width cannot be used until the treeview
+ # has been displayed once.
+ if treeview_width != -1:
+ width = treeview_width + buttonbox_width
+ # The list is empty, so ignore initial popup width request
+ # Will be set to the minimum width next
+ elif len(self.tree_store) == 0:
+ width = 0
+
+ if width < self.alignment_widget.get_allocation().width:
+ width = self.alignment_widget.get_allocation().width
+
+ # 10 is extra spacing
+ content_width = self.treeview.get_preferred_width()[1] + buttonbox_width + 10
+
+ # Adjust height according to number of list items
+ if len(self.tree_store) > 0 and self.max_visible_rows > 0:
+ # The height for one row in the list
+ self.row_height = self.treeview.get_preferred_height()[1] / len(
+ self.tree_store
+ )
+ # Set height to number of rows
+ height = len(self.tree_store) * self.row_height + height_extra
+ # Adjust the height according to the max number of rows
+ max_height = self.row_height * self.max_visible_rows
+ # Restrict height to max_visible_rows
+ if max_height + height_extra < height:
+ height = max_height
+ height += height_extra
+ # Increase width because of vertical scrollbar
+ content_width += 15
+
+ if self.popup_buttonbox:
+ # Minimum height is the height of the button box
+ if height < buttonbox_height + height_extra:
+ height = buttonbox_height + height_extra
+
+ if content_width > width:
+ width = content_width
+
+ screen = self.path_entry.get_screen()
+ monitor_num = screen.get_monitor_at_window(self.path_entry.get_window())
+ monitor = screen.get_monitor_geometry(monitor_num)
+
+ if x < monitor.x:
+ x = monitor.x
+ elif x + width > monitor.x + monitor.width:
+ x = monitor.x + monitor.width - width
+
+ # Set the position
+ if (
+ y + self.path_entry.get_allocation().height + height
+ <= monitor.y + monitor.height
+ ):
+ y += self.path_entry.get_allocation().height
+ # Not enough space downwards on the screen
+ elif y - height >= monitor.y:
+ y -= height
+ elif (
+ monitor.y + monitor.height - (y + self.path_entry.get_allocation().height)
+ > y - monitor.y
+ ):
+ y += self.path_entry.get_allocation().height
+ height = monitor.y + monitor.height - y
+ else:
+ height = y - monitor.y
+ y = monitor.y
+
+ return x, y, width, height
+
+ def popup_grab_window(self):
+ activate_time = 0
+ if (
+ Gdk.pointer_grab(
+ self.popup_window.get_window(),
+ True,
+ (
+ Gdk.EventMask.BUTTON_PRESS_MASK
+ | Gdk.EventMask.BUTTON_RELEASE_MASK
+ | Gdk.EventMask.POINTER_MOTION_MASK
+ ),
+ None,
+ None,
+ activate_time,
+ )
+ == 0
+ ):
+ if (
+ Gdk.keyboard_grab(self.popup_window.get_window(), True, activate_time)
+ == 0
+ ):
+ return True
+ else:
+ self.popup_window.get_window().get_display().pointer_ungrab(
+ activate_time
+ )
+ return False
+ return False
+
+ def set_entry_value(self, path, popdown=False):
+ """
+
+ Sets the text of the entry to the value in path
+ """
+ self.path_entry.set_text(
+ self.tree_store[path][0], set_file_chooser_folder=True, trigger_event=True
+ )
+ if popdown:
+ self.popdown()
+
+ def set_max_popup_rows(self, rows):
+ try:
+ int(rows)
+ except Exception:
+ self.max_visible_rows = 20
+ return
+ self.max_visible_rows = rows
+
+ def get_max_popup_rows(self):
+ return self.max_visible_rows
+
+ #################
+ # Callbacks
+ #################
+
+ def on_popup_window_button_press_event(self, window, event):
+ # If we're clicking outside of the window close the popup
+ allocation = self.popup_window.get_allocation()
+
+ if (event.x < allocation.x or event.x > allocation.width) or (
+ event.y < allocation.y or event.y > allocation.height
+ ):
+ self.popdown()
+
+
+class StoredValuesPopup(StoredValuesList, PathChooserPopup):
+ """
+
+ The stored values popup
+
+ """
+
+ def __init__(self, builder, path_entry, max_visible_rows, popup_alignment_widget):
+ self.builder = builder
+ self.treeview = self.builder.get_object('stored_values_treeview')
+ self.popup_window = self.builder.get_object('stored_values_popup_window')
+ self.button_default = self.builder.get_object('button_default')
+ self.path_entry = path_entry
+ self.text_entry = path_entry.text_entry
+
+ self.signal_handlers = {}
+ PathChooserPopup.__init__(self, 0, max_visible_rows, popup_alignment_widget)
+ StoredValuesList.__init__(self)
+
+ self.popup_buttonbox = self.builder.get_object('buttonbox')
+
+ # Add signal handlers
+ self.signal_handlers[
+ 'on_buttonbox_key_press_event'
+ ] = self.on_buttonbox_key_press_event
+ self.signal_handlers[
+ 'on_stored_values_treeview_scroll_event'
+ ] = self.on_scroll_event
+ self.signal_handlers[
+ 'on_button_toggle_dropdown_scroll_event'
+ ] = self.on_scroll_event
+ self.signal_handlers['on_entry_text_scroll_event'] = self.on_scroll_event
+ self.signal_handlers[
+ 'on_stored_values_popup_window_focus_out_event'
+ ] = self.on_stored_values_popup_window_focus_out_event
+ # For when clicking outside the popup
+ self.signal_handlers[
+ 'on_stored_values_popup_window_button_press_event'
+ ] = self.on_popup_window_button_press_event
+
+ # Buttons for manipulating the list
+ self.signal_handlers['on_button_add_clicked'] = self.on_button_add_clicked
+ self.signal_handlers['on_button_edit_clicked'] = self.on_button_edit_clicked
+ self.signal_handlers['on_button_remove_clicked'] = self.on_button_remove_clicked
+ self.signal_handlers['on_button_up_clicked'] = self.on_button_up_clicked
+ self.signal_handlers['on_button_down_clicked'] = self.on_button_down_clicked
+ self.signal_handlers[
+ 'on_button_default_clicked'
+ ] = self.on_button_default_clicked
+ self.signal_handlers[
+ 'on_button_properties_clicked'
+ ] = self.path_entry._on_button_properties_clicked
+
+ def popup(self):
+ """
+ Makes the popup visible.
+
+ """
+ # Calling super popup
+ PathChooserPopup.popup(self)
+ self.popup_window.grab_focus()
+
+ if not self.treeview.has_focus():
+ self.treeview.grab_focus()
+ if not self.popup_grab_window():
+ self.popup_window.hide()
+ return
+
+ self.popup_window.grab_add()
+ # Set value selected if it exists
+ self.set_selected_value(
+ path_without_trailing_path_sep(self.path_entry.get_text())
+ )
+
+ #################
+ # Callbacks
+ #################
+
+ def on_stored_values_popup_window_focus_out_event(self, entry, event):
+ """
+ Popup sometimes loses the focus to the text entry, e.g. when right click
+ shows a popup menu on a row. This regains the focus.
+ """
+ self.popup_grab_window()
+ return True
+
+ def on_scroll_event(self, widget, event):
+ """
+ Handles scroll events from text entry, toggle button and treeview
+
+ """
+
+ swap = event.get_state() & Gdk.ModifierType.CONTROL_MASK
+ scroll_window = event.get_state() & Gdk.ModifierType.SHIFT_MASK
+ self.handle_list_scroll(
+ _next=event.direction == Gdk.ScrollDirection.DOWN,
+ set_entry=widget != self.treeview,
+ swap=swap,
+ scroll_window=scroll_window,
+ )
+ return True
+
+ def on_buttonbox_key_press_event(self, widget, event):
+ """
+ Handles when Escape or ALT+arrow up is pressed when focus
+ is on any of the buttons in the popup
+ """
+ keyval = event.keyval
+ state = event.get_state() & Gtk.accelerator_get_default_mod_mask()
+ if keyval == Gdk.KEY_Escape or (
+ key_is_up(keyval) and state == Gdk.ModifierType.MOD1_MASK
+ ):
+ self.popdown()
+ return True
+ return False
+
+ # --------------------------------------------------
+ # Funcs and callbacks on the buttons to manipulate the list
+ # --------------------------------------------------
+ def add_current_value_to_saved_list(self):
+ text = self.path_entry.get_text()
+ text = path_without_trailing_path_sep(text)
+ values = self.get_values()
+ if text in values:
+ # Make the matching value selected
+ self.set_selected_value(text)
+ self.handle_list_scroll()
+ return True
+ self.add_values([text], scroll_to_row=True, append=False, emit_signal=True)
+
+ def edit_selected_path(self):
+ path = self.get_selection_path()
+ if path:
+ self.on_edit_path(path, self.tree_column)
+
+ def on_button_add_clicked(self, widget):
+ self.add_current_value_to_saved_list()
+ self.popup()
+
+ def on_button_edit_clicked(self, widget):
+ self.edit_selected_path()
+
+ def on_button_remove_clicked(self, widget):
+ self.remove_selected_path()
+ return True
+
+ def on_button_up_clicked(self, widget):
+ self.handle_list_scroll(_next=False, swap=True)
+
+ def on_button_down_clicked(self, widget):
+ self.handle_list_scroll(_next=True, swap=True)
+
+ def on_button_default_clicked(self, widget):
+ if self.default_text:
+ self.set_text(self.default_text, trigger_event=True)
+
+
+class PathCompletionPopup(CompletionList, PathChooserPopup):
+ """
+
+ The auto completion popup
+
+ """
+
+ def __init__(self, builder, path_entry, max_visible_rows):
+ self.builder = builder
+ self.treeview = self.builder.get_object('completion_treeview')
+ self.popup_window = self.builder.get_object('completion_popup_window')
+ self.path_entry = path_entry
+ self.text_entry = path_entry.text_entry
+ self.show_hidden_files = False
+
+ self.signal_handlers = {}
+ PathChooserPopup.__init__(self, 1, max_visible_rows, self.text_entry)
+ CompletionList.__init__(self)
+
+ # Add signal handlers
+ self.signal_handlers[
+ 'on_completion_treeview_scroll_event'
+ ] = self.on_scroll_event
+ self.signal_handlers[
+ 'on_completion_popup_window_focus_out_event'
+ ] = self.on_completion_popup_window_focus_out_event
+
+ # For when clicking outside the popup
+ self.signal_handlers[
+ 'on_completion_popup_window_button_press_event'
+ ] = self.on_popup_window_button_press_event
+
+ def popup(self):
+ """
+ Makes the popup visible.
+
+ """
+ PathChooserPopup.popup(self)
+ self.popup_window.grab_focus()
+
+ if not self.treeview.has_focus():
+ self.treeview.grab_focus()
+
+ if not self.popup_grab_window():
+ self.popup_window.hide()
+ return
+
+ self.popup_window.grab_add()
+ self.text_entry.grab_focus()
+ self.text_entry.set_position(len(self.path_entry.text_entry.get_text()))
+ self.set_selected_value(
+ path_without_trailing_path_sep(self.path_entry.get_text()),
+ select_first=True,
+ )
+
+ #################
+ # Callbacks
+ #################
+
+ def on_completion_popup_window_focus_out_event(self, entry, event):
+ """
+ Popup sometimes loses the focus to the text entry, e.g. when right click
+ shows a popup menu on a row. This regains the focus.
+ """
+ self.popup_grab_window()
+ return True
+
+ def on_scroll_event(self, widget, event):
+ """
+ Handles scroll events from the treeview
+
+ """
+ x, y = event.window.get_pointer()
+ self.handle_list_scroll(
+ _next=event.direction == Gdk.ScrollDirection.DOWN,
+ set_entry=widget != self.treeview,
+ scroll_window=True,
+ )
+ path = self.treeview.get_path_at_pos(int(x), int(y))
+ if path:
+ self.handle_list_scroll(path=path[0], _next=None)
+ return True
+
+
+class PathAutoCompleter(object):
+ def __init__(self, builder, path_entry, max_visible_rows):
+ self.completion_popup = PathCompletionPopup(
+ builder, path_entry, max_visible_rows
+ )
+ self.path_entry = path_entry
+ self.dirs_cache = {}
+ self.use_popup = False
+ self.auto_complete_enabled = True
+ self.signal_handlers = self.completion_popup.signal_handlers
+
+ self.signal_handlers[
+ 'on_completion_popup_window_key_press_event'
+ ] = self.on_completion_popup_window_key_press_event
+ self.signal_handlers[
+ 'on_entry_text_delete_text'
+ ] = self.on_entry_text_delete_text
+ self.signal_handlers[
+ 'on_entry_text_insert_text'
+ ] = self.on_entry_text_insert_text
+ self.accelerator_string = Gtk.accelerator_name(Gdk.KEY_Tab, 0)
+
+ def on_entry_text_insert_text(self, entry, new_text, new_text_length, position):
+ if self.path_entry.get_realized():
+ cur_text = self.path_entry.get_text()
+ pos = entry.get_position()
+ new_complete_text = cur_text[:pos] + new_text + cur_text[pos:]
+ # Remove all values from the list that do not start with new_complete_text
+ self.completion_popup.reduce_values(new_complete_text)
+ self.completion_popup.set_selected_value(
+ new_complete_text, select_first=True
+ )
+ if self.completion_popup.is_popped_up():
+ self.completion_popup.set_window_position_and_size()
+
+ def on_entry_text_delete_text(self, entry, start, end):
+ """
+ Do completion when characters are removed
+
+ """
+ if self.completion_popup.is_popped_up():
+ cur_text = self.path_entry.get_text()
+ new_complete_text = cur_text[:start] + cur_text[end:]
+ self.do_completion(value=new_complete_text, forward_completion=False)
+
+ def set_use_popup(self, use):
+ self.use_popup = use
+
+ def on_completion_popup_window_key_press_event(self, entry, event):
+ """
+ Handles key pressed events on the auto-completion popup window
+ """
+ # If on_completion_treeview_key_press_event handles the event, do nothing
+ ret = self.completion_popup.on_completion_treeview_key_press_event(entry, event)
+ if ret:
+ return ret
+ keyval = event.keyval
+ state = event.get_state() & Gtk.accelerator_get_default_mod_mask()
+ if (
+ self.is_auto_completion_accelerator(keyval, state)
+ and self.auto_complete_enabled
+ ):
+ values_count = self.completion_popup.get_values_count()
+ if values_count == 1:
+ self.do_completion()
+ else:
+ self.completion_popup.handle_list_scroll(_next=True)
+ return True
+ # Buggy stuff (in pygobject?) causing type mismatch between EventKey and GdkEvent. Convert manually...
+ n = Gdk.Event()
+ n.type = event.type
+ n.window = event.window
+ n.send_event = event.send_event
+ n.time = event.time
+ n.state = event.state
+ n.keyval = event.keyval
+ n.length = event.length
+ n.string = event.string
+ n.hardware_keycode = event.hardware_keycode
+ n.group = event.group
+ n.is_modifier = event.is_modifier
+ self.path_entry.text_entry.emit('key-press-event', n)
+
+ def is_auto_completion_accelerator(self, keyval, state):
+ return Gtk.accelerator_name(keyval, state) == self.accelerator_string
+
+ def do_completion(self, value=None, forward_completion=True):
+ if not value:
+ value = self.path_entry.get_text()
+ self.path_entry.text_entry.set_position(len(value))
+ opts = {}
+ opts['show_hidden_files'] = self.completion_popup.show_hidden_files
+ opts['completion_text'] = value
+ opts['forward_completion'] = forward_completion
+ self._start_completion(opts)
+
+ def _start_completion(self, args):
+ args = get_completion_paths(args)
+ self._end_completion(args)
+
+ def _end_completion(self, args):
+ value = args['completion_text']
+ paths = args['paths']
+
+ if args['forward_completion']:
+ common_prefix = os.path.commonprefix(paths)
+ if len(common_prefix) > len(value):
+ self.path_entry.set_text(
+ common_prefix, set_file_chooser_folder=True, trigger_event=True
+ )
+
+ self.path_entry.text_entry.set_position(len(self.path_entry.get_text()))
+ self.completion_popup.set_values(paths, preserve_selection=True)
+
+ if self.use_popup and len(paths) > 1:
+ self.completion_popup.popup()
+ elif self.completion_popup.is_popped_up() and args['forward_completion']:
+ self.completion_popup.popdown()
+
+
+class PathChooserComboBox(Gtk.Box, StoredValuesPopup, GObject.GObject):
+
+ __gsignals__ = {
+ signal
+ if not PY2
+ else signal.encode(): (SignalFlags.RUN_FIRST, GObject.TYPE_NONE, (object,))
+ for signal in [
+ 'text-changed',
+ 'accelerator-set',
+ 'max-rows-changed',
+ 'list-value-added',
+ 'list-value-removed',
+ 'list-values-changed',
+ 'list-values-reordered',
+ 'show-path-entry-toggled',
+ 'show-filechooser-toggled',
+ 'show-hidden-files-toggled',
+ 'show-folder-name-on-button',
+ 'auto-complete-enabled-toggled',
+ ]
+ }
+
+ def __init__(
+ self,
+ max_visible_rows=20,
+ auto_complete=True,
+ use_completer_popup=True,
+ parent=None,
+ ):
+ Gtk.Box.__init__(self)
+ GObject.GObject.__init__(self)
+ self.list_box = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, spacing=0)
+ self._stored_values_popping_down = False
+ self.filechooser_visible = True
+ self.filechooser_enabled = True
+ self.path_entry_visible = True
+ self.properties_enabled = True
+ self.show_folder_name_on_button = False
+ self.setting_accelerator_key = False
+ self.builder = Gtk.Builder()
+ self.parent = parent
+ self.popup_buttonbox = self.builder.get_object('buttonbox')
+ self.builder.add_from_file(
+ resource_filename(
+ __package__, os.path.join('glade', 'path_combo_chooser.ui')
+ )
+ )
+ self.button_toggle = self.builder.get_object('button_toggle_dropdown')
+ self.text_entry = self.builder.get_object('entry_text')
+ self.open_filechooser_dialog_button = self.builder.get_object(
+ 'button_open_dialog'
+ )
+ self.filechooser_button = self.open_filechooser_dialog_button
+ self.filechooserdialog = self.builder.get_object('filechooserdialog')
+ self.filechooserdialog.set_transient_for(self.parent)
+ self.filechooser_widget = self.builder.get_object('filechooser_widget')
+ self.folder_name_label = self.builder.get_object('folder_name_label')
+ self.default_text = None
+ self.button_properties = self.builder.get_object('button_properties')
+
+ self.combobox_window = self.builder.get_object('combobox_window')
+ self.combo_hbox = self.builder.get_object('entry_combobox_hbox')
+ # Change the parent of the hbox from the glade Window to this hbox.
+ self.combobox_window.remove(self.combo_hbox)
+ self.combobox_window = self.get_window()
+ self.add(self.combo_hbox)
+ StoredValuesPopup.__init__(
+ self, self.builder, self, max_visible_rows, self.combo_hbox
+ )
+
+ self.tooltips = Gtk.Tooltip()
+ self.auto_completer = PathAutoCompleter(self.builder, self, max_visible_rows)
+ self.auto_completer.set_use_popup(use_completer_popup)
+ self.auto_completer.auto_complete_enabled = auto_complete
+ self._setup_config_dialog()
+
+ signal_handlers = {
+ 'on_button_toggle_dropdown_toggled': self._on_button_toggle_dropdown_toggled,
+ 'on_entry_text_key_press_event': self._on_entry_text_key_press_event,
+ 'on_stored_values_popup_window_hide': self._on_stored_values_popup_window_hide,
+ 'on_button_toggle_dropdown_button_press_event': self._on_button_toggle_dropdown_button_press_event,
+ 'on_entry_combobox_hbox_realize': self._on_entry_combobox_hbox_realize,
+ 'on_button_open_dialog_clicked': self._on_button_open_dialog_clicked,
+ 'on_entry_text_focus_out_event': self._on_entry_text_focus_out_event,
+ 'on_entry_text_changed': self.on_entry_text_changed,
+ }
+ signal_handlers.update(self.signal_handlers)
+ signal_handlers.update(self.auto_completer.signal_handlers)
+ signal_handlers.update(self.config_dialog_signal_handlers)
+ self.builder.connect_signals(signal_handlers)
+
+ def get_text(self):
+ """
+ Get the current text in the Entry
+ """
+ return self.text_entry.get_text()
+
+ def set_text(
+ self,
+ text,
+ set_file_chooser_folder=True,
+ cursor_end=True,
+ default_text=False,
+ trigger_event=False,
+ ):
+ """
+ Set the text for the entry.
+
+ """
+ old_text = self.text_entry.get_text()
+ # We must block the "delete-text" signal to avoid the signal handler being called
+ self.text_entry.handler_block_by_func(
+ self.auto_completer.on_entry_text_delete_text
+ )
+ self.text_entry.set_text(text)
+ self.text_entry.handler_unblock_by_func(
+ self.auto_completer.on_entry_text_delete_text
+ )
+
+ self.text_entry.select_region(0, 0)
+ self.text_entry.set_position(len(text) if cursor_end else 0)
+ self.set_selected_value(text, select_first=True)
+ self.combo_hbox.set_tooltip_text(text)
+ if default_text:
+ self.default_text = text
+ self.button_default.set_tooltip_text(
+ 'Restore the default value in the text entry:\n%s' % self.default_text
+ )
+ self.button_default.set_sensitive(True)
+ # Set text for the filechooser dialog button
+ folder_name = ''
+ if self.show_folder_name_on_button or not self.path_entry_visible:
+ folder_name = path_without_trailing_path_sep(text)
+ if folder_name != '/' and os.path.basename(folder_name):
+ folder_name = os.path.basename(folder_name)
+ self.folder_name_label.set_text(folder_name)
+ # Only trigger event if text has changed
+ if old_text != text and trigger_event:
+ self.on_entry_text_changed(self.text_entry)
+
+ def set_sensitive(self, sensitive):
+ """
+ Set the path chooser widgets sensitive
+
+ :param sensitive: if the widget should be sensitive
+ :type sensitive: bool
+
+ """
+ self.text_entry.set_sensitive(sensitive)
+ self.filechooser_button.set_sensitive(sensitive)
+ self.button_toggle.set_sensitive(sensitive)
+
+ def get_accelerator_string(self):
+ return self.auto_completer.accelerator_string
+
+ def set_accelerator_string(self, accelerator):
+ """
+ Set the accelerator string to trigger auto-completion
+ """
+ if accelerator is None:
+ return
+ try:
+ # Verify that the accelerator can be parsed
+ keyval, mask = Gtk.accelerator_parse(self.auto_completer.accelerator_string)
+ self.auto_completer.accelerator_string = accelerator
+ except TypeError as ex:
+ raise TypeError('TypeError when setting accelerator string: %s' % ex)
+
+ def get_auto_complete_enabled(self):
+ return self.auto_completer.auto_complete_enabled
+
+ def set_auto_complete_enabled(self, enable):
+ if not isinstance(enable, bool):
+ return
+ self.auto_completer.auto_complete_enabled = enable
+
+ def get_show_folder_name_on_button(self):
+ return self.show_folder_name_on_button
+
+ def set_show_folder_name_on_button(self, show):
+ if not isinstance(show, bool):
+ return
+ self.show_folder_name_on_button = show
+ self._set_path_entry_filechooser_widths()
+
+ def get_filechooser_button_enabled(self):
+ return self.filechooser_enabled
+
+ def set_filechooser_button_enabled(self, enable):
+ """
+ Enable/disable the filechooser button.
+
+ By setting filechooser disabled, in will not be possible
+ to change the settings in the properties.
+ """
+ if not isinstance(enable, bool):
+ return
+ self.filechooser_enabled = enable
+ if not enable:
+ self.set_filechooser_button_visible(False, update=False)
+
+ def get_filechooser_button_visible(self):
+ return self.filechooser_visible
+
+ def set_filechooser_button_visible(self, visible, update=True):
+ """
+ Set file chooser button entry visible
+ """
+ if not isinstance(visible, bool):
+ return
+ if update:
+ self.filechooser_visible = visible
+ if visible and not self.filechooser_enabled:
+ return
+ if visible:
+ self.filechooser_button.show()
+ else:
+ self.filechooser_button.hide()
+ # Update width properties
+ self._set_path_entry_filechooser_widths()
+
+ def get_path_entry_visible(self):
+ return self.path_entry_visible
+
+ def set_path_entry_visible(self, visible):
+ """
+ Set the path entry visible
+ """
+ if not isinstance(visible, bool):
+ return
+ self.path_entry_visible = visible
+ if visible:
+ self.text_entry.show()
+ else:
+ self.text_entry.hide()
+ self._set_path_entry_filechooser_widths()
+
+ def get_show_hidden_files(self):
+ return self.auto_completer.completion_popup.show_hidden_files
+
+ def set_show_hidden_files(self, show, do_completion=False, emit_event=False):
+ """
+ Enable/disable showing hidden files on path completion
+ """
+ if not isinstance(show, bool):
+ return
+ self.auto_completer.completion_popup.show_hidden_files = show
+ if do_completion:
+ self.auto_completer.do_completion()
+ if emit_event:
+ self.emit('show-hidden-files-toggled', show)
+
+ def set_enable_properties(self, enable):
+ """
+ Enable/disable the config properties
+ """
+ if not isinstance(enable, bool):
+ return
+ self.properties_enabled = enable
+ if self.properties_enabled:
+ self.popup_buttonbox.add(self.button_properties)
+ else:
+ self.popup_buttonbox.remove(self.button_properties)
+
+ def set_auto_completer_func(self, func):
+ """
+ Set the function to be called when the auto completion
+ accelerator is triggered.
+ """
+ self.auto_completer._start_completion = func
+
+ def complete(self, args):
+ """
+ Perform the auto completion with the provided paths
+ """
+ self.auto_completer._end_completion(args)
+
+ ##############
+ # Callbacks and internal functions
+ ##############
+
+ def on_entry_text_changed(self, entry):
+ self.emit('text-changed', self.get_text())
+
+ def _on_entry_text_focus_out_event(self, widget, event):
+ # FIXME: This causes text to be deselected on right-click.
+ # Update text on the button label
+ self.set_text(self.get_text())
+
+ def _set_path_entry_filechooser_widths(self):
+ if self.path_entry_visible:
+ self.combo_hbox.set_child_packing(
+ self.filechooser_button, 0, 0, 0, Gtk.PackType.START
+ )
+ width, height = self.folder_name_label.get_size_request()
+ width = 120
+ if not self.show_folder_name_on_button:
+ width = 0
+ self.folder_name_label.set_size_request(width, height)
+ self.combo_hbox.set_child_packing(
+ self.filechooser_button, 0, 0, 0, Gtk.PackType.START
+ )
+ else:
+ self.combo_hbox.set_child_packing(
+ self.filechooser_button, 1, 1, 0, Gtk.PackType.START
+ )
+ self.folder_name_label.set_size_request(-1, -1)
+ # Update text on the button label
+ self.set_text(self.get_text())
+
+ def _on_entry_combobox_hbox_realize(self, widget):
+ """ Must do this when the widget is realized """
+ self.set_filechooser_button_visible(self.filechooser_visible)
+ self.set_path_entry_visible(self.path_entry_visible)
+
+ def _on_button_open_dialog_clicked(self, widget):
+ self.filechooser_widget.set_current_folder(self.get_text())
+ response_id = self.filechooserdialog.run()
+
+ if response_id == 0:
+ text = self.filechooser_widget.get_filename()
+ self.set_text(text, trigger_event=True)
+ self.filechooserdialog.hide()
+
+ def _on_entry_text_key_press_event(self, widget, event):
+ """
+ Listen to key events on the entry widget.
+
+ Arrow up/down will change the value of the entry according to the
+ current selection in the list.
+ Enter will show the popup.
+
+ Return True whenever we want no other event listeners to be called.
+
+ """
+ # on_entry_text_key_press_event Errors follow here when pressing ALT key while popup is visible")
+ keyval = event.keyval
+ state = event.get_state() & Gtk.accelerator_get_default_mod_mask()
+ ctrl = event.get_state() & Gdk.ModifierType.CONTROL_MASK
+
+ # Select new row with arrow up/down is pressed
+ if key_is_up_or_down(keyval):
+ self.handle_list_scroll(_next=key_is_down(keyval), set_entry=True)
+ return True
+ elif self.auto_completer.is_auto_completion_accelerator(keyval, state):
+ if self.auto_completer.auto_complete_enabled:
+ self.auto_completer.do_completion()
+ return True
+ # Show popup when Enter is pressed
+ elif key_is_enter(keyval):
+ # This sets the toggle active which results in
+ # on_button_toggle_dropdown_toggled being called which initiates the popup
+ self.button_toggle.set_active(True)
+ return True
+ elif ctrl:
+ # Swap the show hidden files value on CTRL-h
+ if is_ascii_value(keyval, 'h'):
+ # Set show/hide hidden files
+ self.set_show_hidden_files(
+ not self.get_show_hidden_files(), emit_event=True
+ )
+ return True
+ elif is_ascii_value(keyval, 's'):
+ super(PathChooserComboBox, self).add_current_value_to_saved_list()
+ return True
+ elif is_ascii_value(keyval, 'd'):
+ # Set the default value in the text entry
+ self.set_text(self.default_text, trigger_event=True)
+ return True
+ return False
+
+ def _on_button_toggle_dropdown_toggled(self, button):
+ """
+ Shows the popup when clicking the toggle button.
+ """
+ if self._stored_values_popping_down:
+ return
+ self.popup()
+
+ def _on_stored_values_popup_window_hide(self, popup):
+ """Make sure the button toggle is removed when popup is closed"""
+ self._stored_values_popping_down = True
+ self.button_toggle.set_active(False)
+ self._stored_values_popping_down = False
+
+ ##############
+ # Config dialog
+ ##############
+
+ def _on_button_toggle_dropdown_button_press_event(self, widget, event):
+ """Show config when right clicking dropdown toggle button"""
+ if not self.properties_enabled:
+ return False
+ # This is right click
+ if event.button == 3:
+ self._on_button_properties_clicked(widget)
+ return True
+
+ def _on_button_properties_clicked(self, widget):
+ self.popdown()
+ self.enable_completion.set_active(self.get_auto_complete_enabled())
+ # Set the value of the label to the current accelerator
+ keyval, mask = Gtk.accelerator_parse(self.auto_completer.accelerator_string)
+ self.accelerator_label.set_text(Gtk.accelerator_get_label(keyval, mask))
+ self.visible_rows.set_value(self.get_max_popup_rows())
+ self.show_filechooser_checkbutton.set_active(
+ self.get_filechooser_button_visible()
+ )
+ self.show_path_entry_checkbutton.set_active(self.path_entry_visible)
+ self.show_hidden_files_checkbutton.set_active(self.get_show_hidden_files())
+ self.show_folder_name_on_button_checkbutton.set_active(
+ self.get_show_folder_name_on_button()
+ )
+ self._set_properties_widgets_sensitive(True)
+ self.config_dialog.show_all()
+
+ def _set_properties_widgets_sensitive(self, val):
+ self.enable_completion.set_sensitive(val)
+ self.config_short_cuts_frame.set_sensitive(val)
+ self.config_general_frame.set_sensitive(val)
+ self.show_hidden_files_checkbutton.set_sensitive(val)
+
+ def _setup_config_dialog(self):
+ self.config_dialog = self.builder.get_object('completion_config_dialog')
+ self.enable_completion = self.builder.get_object(
+ 'enable_auto_completion_checkbutton'
+ )
+ self.show_filechooser_checkbutton = self.builder.get_object(
+ 'show_filechooser_checkbutton'
+ )
+ self.show_path_entry_checkbutton = self.builder.get_object(
+ 'show_path_entry_checkbutton'
+ )
+ set_key_button = self.builder.get_object('set_completion_accelerator_button')
+ default_set_accelerator_tooltip = set_key_button.get_tooltip_text()
+ self.config_short_cuts_frame = self.builder.get_object(
+ 'config_short_cuts_frame'
+ )
+ self.config_general_frame = self.builder.get_object('config_general_frame')
+ self.accelerator_label = self.builder.get_object('completion_accelerator_label')
+ self.visible_rows = self.builder.get_object('visible_rows_spinbutton')
+ self.visible_rows_label = self.builder.get_object('visible_rows_label')
+ self.show_hidden_files_checkbutton = self.builder.get_object(
+ 'show_hidden_files_checkbutton'
+ )
+ self.show_folder_name_on_button_checkbutton = self.builder.get_object(
+ 'show_folder_name_on_button_checkbutton'
+ )
+ self.config_dialog.set_transient_for(self.parent)
+
+ def on_close(widget, event=None):
+ if not self.setting_accelerator_key:
+ self.config_dialog.hide()
+ else:
+ stop_setting_accelerator()
+ return True
+
+ def on_enable_completion_toggled(widget):
+ self.set_auto_complete_enabled(self.enable_completion.get_active())
+ self.emit(
+ 'auto-complete-enabled-toggled', self.enable_completion.get_active()
+ )
+
+ def on_show_filechooser_toggled(widget):
+ self.set_filechooser_button_visible(
+ self.show_filechooser_checkbutton.get_active()
+ )
+ self.emit(
+ 'show-filechooser-toggled',
+ self.show_filechooser_checkbutton.get_active(),
+ )
+ self.show_folder_name_on_button_checkbutton.set_sensitive(
+ self.show_path_entry_checkbutton.get_active()
+ and self.show_filechooser_checkbutton.get_active()
+ )
+ if not self.filechooser_visible and not self.path_entry_visible:
+ self.show_path_entry_checkbutton.set_active(True)
+ on_show_path_entry_toggled(None)
+
+ def on_show_path_entry_toggled(widget):
+ self.set_path_entry_visible(self.show_path_entry_checkbutton.get_active())
+ self.emit(
+ 'show-path-entry-toggled', self.show_path_entry_checkbutton.get_active()
+ )
+ self.show_folder_name_on_button_checkbutton.set_sensitive(
+ self.show_path_entry_checkbutton.get_active()
+ and self.show_filechooser_checkbutton.get_active()
+ )
+ if not self.filechooser_visible and not self.path_entry_visible:
+ self.show_filechooser_checkbutton.set_active(True)
+ on_show_filechooser_toggled(None)
+
+ def on_show_folder_name_on_button(widget):
+ self.set_show_folder_name_on_button(
+ self.show_folder_name_on_button_checkbutton.get_active()
+ )
+ self._set_path_entry_filechooser_widths()
+ self.emit(
+ 'show-folder-name-on-button',
+ self.show_folder_name_on_button_checkbutton.get_active(),
+ )
+
+ def on_show_hidden_files_toggled(widget):
+ self.set_show_hidden_files(
+ self.show_hidden_files_checkbutton.get_active(), emit_event=True
+ )
+
+ def on_max_rows_changed(widget):
+ self.set_max_popup_rows(self.visible_rows.get_value_as_int())
+ self.emit('max-rows-changed', self.visible_rows.get_value_as_int())
+
+ def set_accelerator(widget):
+ self.setting_accelerator_key = True
+ set_key_button.set_tooltip_text(
+ 'Press the accelerator keys for triggering auto-completion'
+ )
+ self._set_properties_widgets_sensitive(False)
+ return True
+
+ def stop_setting_accelerator():
+ self.setting_accelerator_key = False
+ self._set_properties_widgets_sensitive(True)
+ set_key_button.set_active(False)
+ # Restore default tooltip
+ set_key_button.set_tooltip_text(default_set_accelerator_tooltip)
+
+ def on_completion_config_dialog_key_release_event(widget, event):
+ # We are listening for a new key
+ if set_key_button.get_active():
+ state = event.get_state() & Gtk.accelerator_get_default_mod_mask()
+ accelerator_mask = state.numerator
+ # If e.g. only CTRL key is pressed.
+ if not Gtk.accelerator_valid(event.keyval, accelerator_mask):
+ accelerator_mask = 0
+ self.auto_completer.accelerator_string = Gtk.accelerator_name(
+ event.keyval, accelerator_mask
+ )
+ self.accelerator_label.set_text(
+ Gtk.accelerator_get_label(event.keyval, accelerator_mask)
+ )
+ self.emit('accelerator-set', self.auto_completer.accelerator_string)
+ stop_setting_accelerator()
+ return True
+ else:
+ keyval = event.keyval
+ ctrl = event.get_state() & Gdk.ModifierType.CONTROL_MASK
+ if ctrl:
+ # Set show/hide hidden files
+ if is_ascii_value(keyval, 'h'):
+ self.show_hidden_files_checkbutton.set_active(
+ not self.get_show_hidden_files()
+ )
+ return True
+
+ def on_set_completion_accelerator_button_clicked(widget):
+ if not set_key_button.get_active():
+ stop_setting_accelerator()
+ return True
+
+ self.config_dialog_signal_handlers = {
+ 'on_enable_auto_completion_checkbutton_toggled': on_enable_completion_toggled,
+ 'on_show_filechooser_checkbutton_toggled': on_show_filechooser_toggled,
+ 'on_show_path_entry_checkbutton_toggled': on_show_path_entry_toggled,
+ 'on_show_folder_name_on_button_checkbutton_toggled': on_show_folder_name_on_button,
+ 'on_config_dialog_button_close_clicked': on_close,
+ 'on_visible_rows_spinbutton_value_changed': on_max_rows_changed,
+ 'on_completion_config_dialog_delete_event': on_close,
+ 'on_set_completion_accelerator_button_pressed': set_accelerator,
+ 'on_completion_config_dialog_key_release_event': on_completion_config_dialog_key_release_event,
+ 'on_set_completion_accelerator_button_clicked': on_set_completion_accelerator_button_clicked,
+ 'on_show_hidden_files_checkbutton_toggled': on_show_hidden_files_toggled,
+ }
+
+
+GObject.type_register(PathChooserComboBox)
+
+
+if __name__ == '__main__':
+ import signal
+
+ # necessary to exit with CTRL-C (https://bugzilla.gnome.org/show_bug.cgi?id=622084)
+ signal.signal(signal.SIGINT, signal.SIG_DFL)
+ import sys
+
+ w = Gtk.Window()
+ w.set_position(Gtk.WindowPosition.CENTER)
+ w.set_size_request(600, -1)
+ w.set_title('ComboEntry example')
+ w.connect('delete-event', Gtk.main_quit)
+
+ box1 = Gtk.Box.new(Gtk.Orientation.VERTICAL, spacing=0)
+
+ def get_resource2(filename):
+ return '%s/glade/%s' % (os.path.abspath(os.path.dirname(sys.argv[0])), filename)
+
+ # Override get_resource which fetches from deluge install
+ # get_resource = get_resource2
+
+ entry1 = PathChooserComboBox(max_visible_rows=15)
+ entry2 = PathChooserComboBox()
+
+ box1.add(entry1)
+ box1.add(entry2)
+
+ test_paths = [
+ '/home/bro/Downloads',
+ '/media/Movies-HD',
+ '/media/torrent/in',
+ '/media/Live-show/Misc',
+ '/media/Live-show/Consert',
+ '/media/Series/1/',
+ '/media/Series/2',
+ '/media/Series/17',
+ '/media/Series/18',
+ '/media/Series/19',
+ ]
+
+ entry1.add_values(test_paths)
+ entry1.set_text('/home/bro/', default_text=True)
+ entry2.set_text(
+ '/home/bro/programmer/deluge/deluge-yarss-plugin/build/lib/yarss2/include/bs4/tests/',
+ cursor_end=False,
+ )
+
+ entry2.set_filechooser_button_visible(False)
+ # entry2.set_enable_properties(False)
+ entry2.set_filechooser_button_enabled(False)
+
+ def list_value_added_event(widget, values):
+ print('Current list values:', widget.get_values())
+
+ entry1.connect('list-value-added', list_value_added_event)
+ entry2.connect('list-value-added', list_value_added_event)
+ w.add(box1)
+ w.show_all()
+ Gtk.main()
diff --git a/deluge/ui/gtk3/peers_tab.py b/deluge/ui/gtk3/peers_tab.py
new file mode 100644
index 0000000..33395b9
--- /dev/null
+++ b/deluge/ui/gtk3/peers_tab.py
@@ -0,0 +1,394 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os.path
+
+from gi.repository.GdkPixbuf import Pixbuf
+from gi.repository.Gtk import (
+ Builder,
+ CellRendererPixbuf,
+ CellRendererProgress,
+ CellRendererText,
+ ListStore,
+ TreeViewColumn,
+ TreeViewColumnSizing,
+)
+
+import deluge.common
+import deluge.component as component
+from deluge.ui.client import client
+from deluge.ui.countries import COUNTRIES
+
+from .common import (
+ icon_downloading,
+ icon_seeding,
+ load_pickled_state_file,
+ save_pickled_state_file,
+)
+from .torrentdetails import Tab
+from .torrentview_data_funcs import (
+ cell_data_peer_progress,
+ cell_data_speed_down,
+ cell_data_speed_up,
+)
+
+try:
+ from future_builtins import zip
+except ImportError:
+ # Ignore on Py3.
+ pass
+
+log = logging.getLogger(__name__)
+
+
+class PeersTab(Tab):
+ def __init__(self):
+ super(PeersTab, self).__init__('Peers', 'peers_tab', 'peers_tab_label')
+
+ self.peer_menu = self.main_builder.get_object('menu_peer_tab')
+ component.get('MainWindow').connect_signals(self)
+
+ self.listview = self.main_builder.get_object('peers_listview')
+ self.listview.props.has_tooltip = True
+ self.listview.connect('button-press-event', self._on_button_press_event)
+ self.listview.connect('query-tooltip', self._on_query_tooltip)
+
+ # flag, ip, client, downspd, upspd, country code, int_ip, seed/peer icon, progress
+ self.liststore = ListStore(
+ Pixbuf, str, str, int, int, str, float, Pixbuf, float
+ )
+ self.cached_flag_pixbufs = {}
+
+ self.seed_pixbuf = icon_seeding
+ self.peer_pixbuf = icon_downloading
+
+ # key is ip address, item is row iter
+ self.peers = {}
+
+ # Country column
+ column = TreeViewColumn()
+ render = CellRendererPixbuf()
+ column.pack_start(render, False)
+ column.add_attribute(render, 'pixbuf', 0)
+ column.set_sort_column_id(5)
+ column.set_clickable(True)
+ column.set_resizable(True)
+ column.set_expand(False)
+ column.set_min_width(20)
+ column.set_reorderable(True)
+ self.listview.append_column(column)
+
+ # Address column
+ column = TreeViewColumn(_('Address'))
+ render = CellRendererPixbuf()
+ column.pack_start(render, False)
+ column.add_attribute(render, 'pixbuf', 7)
+ render = CellRendererText()
+ column.pack_start(render, False)
+ column.add_attribute(render, 'text', 1)
+ column.set_sort_column_id(6)
+ column.set_clickable(True)
+ column.set_resizable(True)
+ column.set_expand(False)
+ column.set_min_width(100)
+ column.set_reorderable(True)
+ self.listview.append_column(column)
+
+ # Client column
+ column = TreeViewColumn(_('Client'))
+ render = CellRendererText()
+ column.pack_start(render, False)
+ column.add_attribute(render, 'text', 2)
+ column.set_sort_column_id(2)
+ column.set_clickable(True)
+ column.set_resizable(True)
+ column.set_expand(False)
+ column.set_min_width(100)
+ column.set_reorderable(True)
+ self.listview.append_column(column)
+
+ # Progress column
+ column = TreeViewColumn(_('Progress'))
+ render = CellRendererProgress()
+ column.pack_start(render, True)
+ column.set_cell_data_func(render, cell_data_peer_progress, 8)
+ column.set_sort_column_id(8)
+ column.set_clickable(True)
+ column.set_resizable(True)
+ column.set_expand(False)
+ column.set_min_width(100)
+ column.set_reorderable(True)
+ self.listview.append_column(column)
+
+ # Down Speed column
+ column = TreeViewColumn(_('Down Speed'))
+ render = CellRendererText()
+ column.pack_start(render, False)
+ column.set_cell_data_func(render, cell_data_speed_down, 3)
+ column.set_sort_column_id(3)
+ column.set_clickable(True)
+ column.set_resizable(True)
+ column.set_expand(False)
+ column.set_min_width(50)
+ column.set_reorderable(True)
+ self.listview.append_column(column)
+
+ # Up Speed column
+ column = TreeViewColumn(_('Up Speed'))
+ render = CellRendererText()
+ column.pack_start(render, False)
+ column.set_cell_data_func(render, cell_data_speed_up, 4)
+ column.set_sort_column_id(4)
+ column.set_clickable(True)
+ column.set_resizable(True)
+ column.set_expand(False)
+ column.set_min_width(50)
+ # Bugfix: Last column needs max_width set to stop scrollbar appearing
+ column.set_max_width(150)
+ column.set_reorderable(True)
+ self.listview.append_column(column)
+
+ self.listview.set_model(self.liststore)
+
+ self.load_state()
+
+ self.torrent_id = None
+
+ def save_state(self):
+ # Get the current sort order of the view
+ column_id, sort_order = self.liststore.get_sort_column_id()
+
+ # Setup state dict
+ state = {
+ 'columns': {},
+ 'sort_id': column_id,
+ 'sort_order': int(sort_order) if sort_order else None,
+ }
+
+ for index, column in enumerate(self.listview.get_columns()):
+ state['columns'][column.get_title()] = {
+ 'position': index,
+ 'width': column.get_width(),
+ }
+ save_pickled_state_file('peers_tab.state', state)
+
+ def load_state(self):
+ state = load_pickled_state_file('peers_tab.state')
+
+ if state is None:
+ return
+
+ if len(state['columns']) != len(self.listview.get_columns()):
+ log.warning('peers_tab.state is not compatible! rejecting..')
+ return
+
+ if state['sort_id'] and state['sort_order'] is not None:
+ self.liststore.set_sort_column_id(state['sort_id'], state['sort_order'])
+
+ for (index, column) in enumerate(self.listview.get_columns()):
+ cname = column.get_title()
+ if cname in state['columns']:
+ cstate = state['columns'][cname]
+ column.set_sizing(TreeViewColumnSizing.FIXED)
+ column.set_fixed_width(cstate['width'] if cstate['width'] > 0 else 10)
+ if state['sort_id'] == index and state['sort_order'] is not None:
+ column.set_sort_indicator(True)
+ column.set_sort_order(state['sort_order'])
+ if cstate['position'] != index:
+ # Column is in wrong position
+ if cstate['position'] == 0:
+ self.listview.move_column_after(column, None)
+ elif (
+ self.listview.get_columns()[cstate['position'] - 1].get_title()
+ != cname
+ ):
+ self.listview.move_column_after(
+ column, self.listview.get_columns()[cstate['position'] - 1]
+ )
+
+ def update(self):
+ # Get the first selected torrent
+ torrent_id = component.get('TorrentView').get_selected_torrents()
+
+ # Only use the first torrent in the list or return if None selected
+ if len(torrent_id) != 0:
+ torrent_id = torrent_id[0]
+ else:
+ # No torrent is selected in the torrentview
+ self.liststore.clear()
+ return
+
+ if torrent_id != self.torrent_id:
+ # We only want to do this if the torrent_id has changed
+ self.liststore.clear()
+ self.peers = {}
+ self.torrent_id = torrent_id
+
+ component.get('SessionProxy').get_torrent_status(
+ torrent_id, ['peers']
+ ).addCallback(self._on_get_torrent_status)
+
+ def get_flag_pixbuf(self, country):
+ if not country.strip():
+ return None
+
+ if country not in self.cached_flag_pixbufs:
+ # We haven't created a pixbuf for this country yet
+ try:
+ self.cached_flag_pixbufs[country] = Pixbuf.new_from_file(
+ deluge.common.resource_filename(
+ 'deluge',
+ os.path.join(
+ 'ui', 'data', 'pixmaps', 'flags', country.lower() + '.png'
+ ),
+ )
+ )
+ except Exception as ex:
+ log.debug('Unable to load flag: %s', ex)
+ return None
+
+ return self.cached_flag_pixbufs[country]
+
+ def _on_get_torrent_status(self, status):
+ new_ips = set()
+ for peer in status['peers']:
+ new_ips.add(peer['ip'])
+ if peer['ip'] in self.peers:
+ # We already have this peer in our list, so lets just update it
+ row = self.peers[peer['ip']]
+ if not self.liststore.iter_is_valid(row):
+ # This iter is invalid, delete it and continue to next iteration
+ del self.peers[peer['ip']]
+ continue
+ values = self.liststore.get(row, 3, 4, 5, 7, 8)
+ if peer['down_speed'] != values[0]:
+ self.liststore.set_value(row, 3, peer['down_speed'])
+ if peer['up_speed'] != values[1]:
+ self.liststore.set_value(row, 4, peer['up_speed'])
+ if peer['country'] != values[2]:
+ self.liststore.set_value(row, 5, peer['country'])
+ self.liststore.set_value(
+ row, 0, self.get_flag_pixbuf(peer['country'])
+ )
+ if peer['seed']:
+ icon = self.seed_pixbuf
+ else:
+ icon = self.peer_pixbuf
+
+ if icon != values[3]:
+ self.liststore.set_value(row, 7, icon)
+
+ if peer['progress'] != values[4]:
+ self.liststore.set_value(row, 8, peer['progress'])
+ else:
+ # Peer is not in list so we need to add it
+
+ # Create an int IP address for sorting purposes
+ if peer['ip'].count(':') == 1:
+ # This is an IPv4 address
+ ip_int = sum(
+ int(byte) << shift
+ for byte, shift in zip(
+ peer['ip'].split(':')[0].split('.'), (24, 16, 8, 0)
+ )
+ )
+ peer_ip = peer['ip']
+ else:
+ # This is an IPv6 address
+ import socket
+ import binascii
+
+ # Split out the :port
+ ip = ':'.join(peer['ip'].split(':')[:-1])
+ ip_int = int(
+ binascii.hexlify(socket.inet_pton(socket.AF_INET6, ip)), 16
+ )
+ peer_ip = '[%s]:%s' % (ip, peer['ip'].split(':')[-1])
+
+ if peer['seed']:
+ icon = self.seed_pixbuf
+ else:
+ icon = self.peer_pixbuf
+
+ row = self.liststore.append(
+ [
+ self.get_flag_pixbuf(peer['country']),
+ peer_ip,
+ peer['client'],
+ peer['down_speed'],
+ peer['up_speed'],
+ peer['country'],
+ float(ip_int),
+ icon,
+ peer['progress'],
+ ]
+ )
+
+ self.peers[peer['ip']] = row
+
+ # Now we need to remove any ips that were not in status["peers"] list
+ for ip in set(self.peers).difference(new_ips):
+ self.liststore.remove(self.peers[ip])
+ del self.peers[ip]
+
+ def clear(self):
+ self.liststore.clear()
+
+ def _on_button_press_event(self, widget, event):
+ """This is a callback for showing the right-click context menu."""
+ log.debug('on_button_press_event')
+ # We only care about right-clicks
+ if self.torrent_id and event.button == 3:
+ self.peer_menu.popup(None, None, None, None, event.button, event.time)
+ return True
+
+ def _on_query_tooltip(self, widget, x, y, keyboard_tip, tooltip):
+ is_tooltip, x, y, model, path, _iter = widget.get_tooltip_context(
+ x, y, keyboard_tip
+ )
+ if is_tooltip:
+ country_code = model.get(_iter, 5)[0]
+ if country_code != ' ' and country_code in COUNTRIES:
+ tooltip.set_text(COUNTRIES[country_code])
+ # widget here is self.listview
+ widget.set_tooltip_cell(tooltip, path, widget.get_column(0), None)
+ return True
+ return False
+
+ def on_menuitem_add_peer_activate(self, menuitem):
+ """This is a callback for manually adding a peer"""
+ log.debug('on_menuitem_add_peer')
+ builder = Builder()
+ builder.add_from_file(
+ deluge.common.resource_filename(
+ __package__, os.path.join('glade', 'connect_peer_dialog.ui')
+ )
+ )
+ peer_dialog = builder.get_object('connect_peer_dialog')
+ txt_ip = builder.get_object('txt_ip')
+ response = peer_dialog.run()
+ if response:
+ value = txt_ip.get_text()
+ if value and ':' in value:
+ if ']' in value:
+ # ipv6
+ ip = value.split(']')[0][1:]
+ port = value.split(']')[1][1:]
+ else:
+ # ipv4
+ ip = value.split(':')[0]
+ port = value.split(':')[1]
+ if deluge.common.is_ip(ip):
+ log.debug('adding peer %s to %s', value, self.torrent_id)
+ client.core.connect_peer(self.torrent_id, ip, port)
+ peer_dialog.destroy()
+ return True
diff --git a/deluge/ui/gtk3/piecesbar.py b/deluge/ui/gtk3/piecesbar.py
new file mode 100644
index 0000000..ba03e55
--- /dev/null
+++ b/deluge/ui/gtk3/piecesbar.py
@@ -0,0 +1,235 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Pedro Algarvio <pedro@algarvio.me>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+from math import pi
+
+import gi # isort:skip (Version check required before import).
+
+gi.require_version('PangoCairo', '1.0') # NOQA: E402
+gi.require_version('cairo', '1.0') # NOQA: E402
+
+# isort:imports-thirdparty
+import cairo # Backward compat cairo <= 1.15
+from gi.repository import PangoCairo
+from gi.repository.Gtk import DrawingArea, ProgressBar, StateFlags
+from gi.repository.Pango import SCALE, Weight
+
+# isort:imports-firstparty
+from deluge.common import PY2
+from deluge.configmanager import ConfigManager
+
+COLOR_STATES = ['missing', 'waiting', 'downloading', 'completed']
+
+
+class PiecesBar(DrawingArea):
+ # Draw in response to an draw
+ __gsignals__ = {'draw': 'override'} if not PY2 else {b'draw': b'override'}
+
+ def __init__(self):
+ super(PiecesBar, self).__init__()
+ # Get progress bar styles, in order to keep font consistency
+ pb = ProgressBar()
+ pb_style = pb.get_style_context()
+ self.text_font = pb_style.get_property('font', StateFlags.NORMAL)
+ self.text_font.set_weight(Weight.BOLD)
+ # Done with the ProgressBar styles, don't keep refs of it
+ del pb, pb_style
+
+ self.set_size_request(-1, 25)
+ self.gtkui_config = ConfigManager('gtk3ui.conf')
+
+ self.width = self.prev_width = 0
+ self.height = self.prev_height = 0
+ self.pieces = self.prev_pieces = ()
+ self.num_pieces = None
+ self.text = self.prev_text = ''
+ self.fraction = self.prev_fraction = 0
+ self.progress_overlay = self.text_overlay = self.pieces_overlay = None
+ self.cr = None
+
+ self.connect('size-allocate', self.do_size_allocate_event)
+ self.show()
+
+ def do_size_allocate_event(self, widget, size):
+ self.prev_width = self.width
+ self.width = size.width
+ self.prev_height = self.height
+ self.height = size.height
+
+ # Handle the draw by drawing
+ def do_draw(self, event):
+ # Create cairo context
+ self.cr = self.props.window.cairo_create()
+ self.cr.set_line_width(max(self.cr.device_to_user_distance(0.5, 0.5)))
+
+ # Restrict Cairo to the exposed area; avoid extra work
+ self.roundcorners_clipping()
+
+ self.draw_pieces()
+ self.draw_progress_overlay()
+ self.write_text()
+ self.roundcorners_border()
+
+ # Drawn once, update width, height
+ if self.resized():
+ self.prev_width = self.width
+ self.prev_height = self.height
+
+ def roundcorners_clipping(self):
+ self.create_roundcorners_subpath(self.cr, 0, 0, self.width, self.height)
+ self.cr.clip()
+
+ def roundcorners_border(self):
+ self.create_roundcorners_subpath(
+ self.cr, 0.5, 0.5, self.width - 1, self.height - 1
+ )
+ self.cr.set_source_rgba(0, 0, 0, 0.9)
+ self.cr.stroke()
+
+ @staticmethod
+ def create_roundcorners_subpath(ctx, x, y, width, height):
+ aspect = 1.0
+ corner_radius = height / 10
+ radius = corner_radius / aspect
+ degrees = pi / 180
+ ctx.new_sub_path()
+ ctx.arc(x + width - radius, y + radius, radius, -90 * degrees, 0 * degrees)
+ ctx.arc(
+ x + width - radius, y + height - radius, radius, 0 * degrees, 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()
+ return ctx
+
+ def draw_pieces(self):
+ if not self.num_pieces:
+ # Nothing to draw.
+ return
+
+ if (
+ self.resized()
+ or self.pieces != self.prev_pieces
+ or self.pieces_overlay is None
+ ):
+ # Need to recreate the cache drawing
+ self.pieces_overlay = cairo.ImageSurface(
+ cairo.FORMAT_ARGB32, self.width, self.height
+ )
+ ctx = cairo.Context(self.pieces_overlay)
+
+ if self.pieces:
+ pieces = self.pieces
+ elif self.num_pieces:
+ # Completed torrents do not send any pieces so create list using 'completed' state.
+ pieces = [COLOR_STATES.index('completed')] * self.num_pieces
+ start_pos = 0
+ piece_width = self.width / len(pieces)
+ pieces_colors = [
+ [
+ color / 65535
+ for color in self.gtkui_config['pieces_color_%s' % state]
+ ]
+ for state in COLOR_STATES
+ ]
+ for state in pieces:
+ ctx.set_source_rgb(*pieces_colors[state])
+ ctx.rectangle(start_pos, 0, piece_width, self.height)
+ ctx.fill()
+ start_pos += piece_width
+
+ self.cr.set_source_surface(self.pieces_overlay)
+ self.cr.paint()
+
+ def draw_progress_overlay(self):
+ if not self.text:
+ # Nothing useful to draw, return now!
+ return
+
+ if (
+ self.resized()
+ or self.fraction != self.prev_fraction
+ or self.progress_overlay is None
+ ):
+ # Need to recreate the cache drawing
+ self.progress_overlay = cairo.ImageSurface(
+ cairo.FORMAT_ARGB32, self.width, self.height
+ )
+ ctx = cairo.Context(self.progress_overlay)
+ ctx.set_source_rgba(0.1, 0.1, 0.1, 0.3) # Transparent
+ ctx.rectangle(0, 0, self.width * self.fraction, self.height)
+ ctx.fill()
+ self.cr.set_source_surface(self.progress_overlay)
+ self.cr.paint()
+
+ def write_text(self):
+ if not self.text:
+ # Nothing useful to draw, return now!
+ return
+
+ if self.resized() or self.text != self.prev_text or self.text_overlay is None:
+ # Need to recreate the cache drawing
+ self.text_overlay = cairo.ImageSurface(
+ cairo.FORMAT_ARGB32, self.width, self.height
+ )
+ ctx = cairo.Context(self.text_overlay)
+ pl = PangoCairo.create_layout(ctx)
+ pl.set_font_description(self.text_font)
+ pl.set_width(-1) # No text wrapping
+ pl.set_text(self.text, -1)
+ plsize = pl.get_size()
+ text_width = plsize[0] // SCALE
+ text_height = plsize[1] // SCALE
+ area_width_without_text = self.width - text_width
+ area_height_without_text = self.height - text_height
+ ctx.move_to(area_width_without_text // 2, area_height_without_text // 2)
+ ctx.set_source_rgb(1, 1, 1)
+ PangoCairo.update_layout(ctx, pl)
+ PangoCairo.show_layout(ctx, pl)
+ self.cr.set_source_surface(self.text_overlay)
+ self.cr.paint()
+
+ def resized(self):
+ return self.prev_width != self.width or self.prev_height != self.height
+
+ def set_fraction(self, fraction):
+ self.prev_fraction = self.fraction
+ self.fraction = fraction
+
+ def get_fraction(self):
+ return self.fraction
+
+ def get_text(self):
+ return self.text
+
+ def set_text(self, text):
+ self.prev_text = self.text
+ self.text = text
+
+ def set_pieces(self, pieces, num_pieces):
+ self.prev_pieces = self.pieces
+ self.pieces = pieces
+ self.num_pieces = num_pieces
+
+ def get_pieces(self):
+ return self.pieces
+
+ def clear(self):
+ self.pieces = self.prev_pieces = ()
+ self.num_pieces = None
+ self.text = self.prev_text = ''
+ self.fraction = self.prev_fraction = 0
+ self.progress_overlay = self.text_overlay = self.pieces_overlay = None
+ self.cr = None
+ self.update()
+
+ def update(self):
+ self.queue_draw()
diff --git a/deluge/ui/gtk3/pluginmanager.py b/deluge/ui/gtk3/pluginmanager.py
new file mode 100644
index 0000000..d60f8d3
--- /dev/null
+++ b/deluge/ui/gtk3/pluginmanager.py
@@ -0,0 +1,137 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+import deluge.pluginmanagerbase
+from deluge.configmanager import ConfigManager
+from deluge.ui.client import client
+
+log = logging.getLogger(__name__)
+
+
+class PluginManager(deluge.pluginmanagerbase.PluginManagerBase, component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'PluginManager')
+ self.config = ConfigManager('gtk3ui.conf')
+ deluge.pluginmanagerbase.PluginManagerBase.__init__(
+ self, 'gtk3ui.conf', 'deluge.plugin.gtk3ui'
+ )
+
+ self.hooks = {'on_apply_prefs': [], 'on_show_prefs': []}
+
+ client.register_event_handler(
+ 'PluginEnabledEvent', self._on_plugin_enabled_event
+ )
+ client.register_event_handler(
+ 'PluginDisabledEvent', self._on_plugin_disabled_event
+ )
+
+ def register_hook(self, hook, function):
+ """Register a hook function with the plugin manager"""
+ try:
+ self.hooks[hook].append(function)
+ except KeyError:
+ log.warning('Plugin attempting to register invalid hook.')
+
+ def deregister_hook(self, hook, function):
+ """Deregisters a hook function"""
+ try:
+ self.hooks[hook].remove(function)
+ except KeyError:
+ log.warning('Unable to deregister hook %s', hook)
+
+ def start(self):
+ """Start the plugin manager"""
+ # Update the enabled_plugins from the core
+ client.core.get_enabled_plugins().addCallback(self._on_get_enabled_plugins)
+ for instance in self.plugins.values():
+ component.start([instance.plugin._component_name])
+
+ def stop(self):
+ # Disable the plugins
+ self.disable_plugins()
+
+ def update(self):
+ pass
+
+ def _on_get_enabled_plugins(self, enabled_plugins):
+ log.debug('Core has these plugins enabled: %s', enabled_plugins)
+ for plugin in enabled_plugins:
+ self.enable_plugin(plugin)
+
+ def _on_plugin_enabled_event(self, name):
+ try:
+ self.enable_plugin(name)
+ except Exception as ex:
+ log.warning('Failed to enable plugin "%s": ex: %s', name, ex)
+
+ self.run_on_show_prefs()
+
+ def _on_plugin_disabled_event(self, name):
+ self.disable_plugin(name)
+
+ # Hook functions
+ def run_on_show_prefs(self):
+ """This hook is run before the user is shown the preferences dialog.
+ It is designed so that plugins can update their preference page with
+ the config."""
+ log.debug('run_on_show_prefs')
+ for function in self.hooks['on_show_prefs']:
+ function()
+
+ def run_on_apply_prefs(self):
+ """This hook is run after the user clicks Apply or OK in the preferences
+ dialog.
+ """
+ log.debug('run_on_apply_prefs')
+ for function in self.hooks['on_apply_prefs']:
+ function()
+
+ # Plugin functions.. will likely move to own class..
+
+ def add_torrentview_text_column(self, *args, **kwargs):
+ return component.get('TorrentView').add_text_column(*args, **kwargs)
+
+ def remove_torrentview_column(self, *args):
+ return component.get('TorrentView').remove_column(*args)
+
+ def add_toolbar_separator(self):
+ return component.get('ToolBar').add_separator()
+
+ def add_toolbar_button(self, *args, **kwargs):
+ return component.get('ToolBar').add_toolbutton(*args, **kwargs)
+
+ def remove_toolbar_button(self, *args):
+ return component.get('ToolBar').remove(*args)
+
+ def add_torrentmenu_menu(self, *args):
+ return component.get('MenuBar').torrentmenu.append(*args)
+
+ def add_torrentmenu_separator(self):
+ return component.get('MenuBar').add_torrentmenu_separator()
+
+ def remove_torrentmenu_item(self, *args):
+ return component.get('MenuBar').torrentmenu.remove(*args)
+
+ def add_preferences_page(self, *args):
+ return component.get('Preferences').add_page(*args)
+
+ def remove_preferences_page(self, *args):
+ return component.get('Preferences').remove_page(*args)
+
+ def update_torrent_view(self, *args):
+ return component.get('TorrentView').update(*args)
+
+ def get_selected_torrents(self):
+ """Returns a list of the selected torrent_ids"""
+ return component.get('TorrentView').get_selected_torrents()
diff --git a/deluge/ui/gtk3/preferences.py b/deluge/ui/gtk3/preferences.py
new file mode 100644
index 0000000..b196128
--- /dev/null
+++ b/deluge/ui/gtk3/preferences.py
@@ -0,0 +1,1527 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2011 Pedro Algarvio <pedro@algarvio.me>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+from hashlib import sha1 as sha
+
+from gi import require_version
+from gi.repository import Gtk
+from gi.repository.Gdk import Color
+
+import deluge.common
+import deluge.component as component
+from deluge.configmanager import ConfigManager, get_config_dir
+from deluge.error import AuthManagerError, NotAuthorizedError
+from deluge.i18n import get_languages
+from deluge.ui.client import client
+from deluge.ui.common import DISK_CACHE_KEYS, PREFS_CATOG_TRANS
+
+from .common import associate_magnet_links, get_clipboard_text, get_deluge_icon
+from .dialogs import AccountDialog, ErrorDialog, InformationDialog, YesNoDialog
+from .path_chooser import PathChooser
+
+try:
+ from urllib.parse import urlparse
+except ImportError:
+ # PY2 fallback
+ from urlparse import urlparse # pylint: disable=ungrouped-imports
+
+try:
+ require_version('AppIndicator3', '0.1')
+ from gi.repository import AppIndicator3 # noqa: F401
+except (ImportError, ValueError):
+ appindicator = False
+else:
+ appindicator = True
+
+log = logging.getLogger(__name__)
+
+ACCOUNTS_USERNAME, ACCOUNTS_LEVEL, ACCOUNTS_PASSWORD = list(range(3))
+COLOR_MISSING, COLOR_WAITING, COLOR_DOWNLOADING, COLOR_COMPLETED = list(range(4))
+
+COLOR_STATES = {
+ 'missing': COLOR_MISSING,
+ 'waiting': COLOR_WAITING,
+ 'downloading': COLOR_DOWNLOADING,
+ 'completed': COLOR_COMPLETED,
+}
+
+
+class Preferences(component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'Preferences')
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(
+ deluge.common.resource_filename(
+ __package__, os.path.join('glade', 'preferences_dialog.ui')
+ )
+ )
+ self.pref_dialog = self.builder.get_object('pref_dialog')
+ self.pref_dialog.set_transient_for(component.get('MainWindow').window)
+ self.pref_dialog.set_icon(get_deluge_icon())
+ self.treeview = self.builder.get_object('treeview')
+ self.notebook = self.builder.get_object('notebook')
+ self.gtkui_config = ConfigManager('gtk3ui.conf')
+ self.window_open = False
+
+ self.load_pref_dialog_state()
+
+ self.builder.get_object('image_magnet').set_from_file(
+ deluge.common.get_pixmap('magnet.png')
+ )
+
+ # Hide the unused associate magnet button on OSX see: #2420
+ if deluge.common.osx_check():
+ self.builder.get_object('button_associate_magnet').hide()
+
+ # Setup the liststore for the categories (tab pages)
+ self.liststore = Gtk.ListStore(int, str, str)
+ self.treeview.set_model(self.liststore)
+ render = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn(None, render, text=2)
+ self.treeview.append_column(column)
+
+ # Add the default categories
+ prefs_categories = (
+ 'interface',
+ 'downloads',
+ 'bandwidth',
+ 'queue',
+ 'network',
+ 'proxy',
+ 'cache',
+ 'other',
+ 'daemon',
+ 'plugins',
+ )
+ for idx, category in enumerate(prefs_categories):
+ self.liststore.append([idx, category, PREFS_CATOG_TRANS[category]])
+
+ # Add and set separator after Plugins.
+ def set_separator(model, _iter, data=None):
+ entry = deluge.common.decode_bytes(model.get_value(_iter, 1))
+ if entry == '_separator_':
+ return True
+
+ self.treeview.set_row_separator_func(set_separator, None)
+ self.liststore.append([len(self.liststore), '_separator_', ''])
+ # Add a dummy notebook page to keep indexing synced with liststore.
+ self.notebook.append_page(Gtk.HSeparator())
+
+ # Setup accounts tab lisview
+ self.accounts_levels_mapping = None
+ self.accounts_authlevel = self.builder.get_object('accounts_authlevel')
+ self.accounts_liststore = Gtk.ListStore(str, str, str, int)
+ self.accounts_liststore.set_sort_column_id(
+ ACCOUNTS_USERNAME, Gtk.SortType.ASCENDING
+ )
+ self.accounts_listview = self.builder.get_object('accounts_listview')
+ self.accounts_listview.append_column(
+ Gtk.TreeViewColumn(
+ _('Username'), Gtk.CellRendererText(), text=ACCOUNTS_USERNAME
+ )
+ )
+ self.accounts_listview.append_column(
+ Gtk.TreeViewColumn(_('Level'), Gtk.CellRendererText(), text=ACCOUNTS_LEVEL)
+ )
+ password_column = Gtk.TreeViewColumn(
+ 'password', Gtk.CellRendererText(), text=ACCOUNTS_PASSWORD
+ )
+ self.accounts_listview.append_column(password_column)
+ password_column.set_visible(False)
+ self.accounts_listview.set_model(self.accounts_liststore)
+
+ self.accounts_listview.get_selection().connect(
+ 'changed', self.on_accounts_selection_changed
+ )
+ self.accounts_frame = self.builder.get_object('AccountsFrame')
+
+ # Setup plugin tab listview
+ # The third entry is for holding translated plugin names
+ self.plugin_liststore = Gtk.ListStore(str, bool, str)
+ self.plugin_liststore.set_sort_column_id(0, Gtk.SortType.ASCENDING)
+ self.plugin_listview = self.builder.get_object('plugin_listview')
+ self.plugin_listview.set_model(self.plugin_liststore)
+ render = Gtk.CellRendererToggle()
+ render.connect('toggled', self.on_plugin_toggled)
+ render.set_property('activatable', True)
+ self.plugin_listview.append_column(
+ Gtk.TreeViewColumn(_('Enabled'), render, active=1)
+ )
+ self.plugin_listview.append_column(
+ Gtk.TreeViewColumn(_('Plugin'), Gtk.CellRendererText(), text=2)
+ )
+
+ # Connect to the 'changed' event of TreeViewSelection to get selection
+ # changes.
+ self.treeview.get_selection().connect('changed', self.on_selection_changed)
+
+ self.plugin_listview.get_selection().connect(
+ 'changed', self.on_plugin_selection_changed
+ )
+
+ self.builder.connect_signals(self)
+
+ # Radio buttons to choose between systray and appindicator
+ self.builder.get_object('alignment_tray_type').set_visible(appindicator)
+
+ from .gtkui import DEFAULT_PREFS
+
+ self.COLOR_DEFAULTS = {}
+ for key in ('missing', 'waiting', 'downloading', 'completed'):
+ self.COLOR_DEFAULTS[key] = DEFAULT_PREFS['pieces_color_%s' % key][:]
+ del DEFAULT_PREFS
+
+ # These get updated by requests done to the core
+ self.all_plugins = []
+ self.enabled_plugins = []
+
+ self.setup_path_choosers()
+ self.load_languages()
+
+ def setup_path_choosers(self):
+ self.download_location_hbox = self.builder.get_object(
+ 'hbox_download_to_path_chooser'
+ )
+ self.download_location_path_chooser = PathChooser(
+ 'download_location_paths_list', parent=self.pref_dialog
+ )
+ self.download_location_hbox.add(self.download_location_path_chooser)
+ self.download_location_hbox.show_all()
+
+ self.move_completed_hbox = self.builder.get_object(
+ 'hbox_move_completed_to_path_chooser'
+ )
+ self.move_completed_path_chooser = PathChooser(
+ 'move_completed_paths_list', parent=self.pref_dialog
+ )
+ self.move_completed_hbox.add(self.move_completed_path_chooser)
+ self.move_completed_hbox.show_all()
+
+ self.copy_torrents_to_hbox = self.builder.get_object(
+ 'hbox_copy_torrent_files_path_chooser'
+ )
+ self.copy_torrent_files_path_chooser = PathChooser(
+ 'copy_torrent_files_to_paths_list', parent=self.pref_dialog
+ )
+ self.copy_torrents_to_hbox.add(self.copy_torrent_files_path_chooser)
+ self.copy_torrents_to_hbox.show_all()
+
+ def load_languages(self):
+ self.language_combo = self.builder.get_object('combobox_language')
+ self.language_checkbox = self.builder.get_object('checkbutton_language')
+ lang_model = self.language_combo.get_model()
+ langs = get_languages()
+ index = -1
+ for i, l in enumerate(langs):
+ lang_code, name = l
+ lang_model.append([lang_code, name])
+ if self.gtkui_config['language'] == lang_code:
+ index = i
+
+ if self.gtkui_config['language'] is None:
+ self.language_checkbox.set_active(True)
+ self.language_combo.set_visible(False)
+ else:
+ self.language_combo.set_visible(True)
+ if index != -1:
+ self.language_combo.set_active(index)
+
+ def __del__(self):
+ del self.gtkui_config
+
+ def add_page(self, name, widget):
+ """Add a another page to the notebook"""
+ # Create a header and scrolled window for the preferences tab
+ parent = widget.get_parent()
+ if parent:
+ parent.remove(widget)
+ vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, spacing=0)
+ label = Gtk.Label()
+ label.set_use_markup(True)
+ label.set_markup('<b><i><big>' + name + '</big></i></b>')
+ label.set_alignment(0.00, 0.50)
+ label.set_padding(10, 10)
+ vbox.pack_start(label, False, True, 0)
+ sep = Gtk.HSeparator()
+ vbox.pack_start(sep, False, True, 0)
+ align = Gtk.Alignment()
+ align.set_padding(5, 0, 0, 0)
+ align.set(0, 0, 1, 1)
+ align.add(widget)
+ vbox.pack_start(align, True, True, 0)
+ scrolled = Gtk.ScrolledWindow()
+ viewport = Gtk.Viewport()
+ viewport.set_shadow_type(Gtk.ShadowType.NONE)
+ viewport.add(vbox)
+ scrolled.add(viewport)
+ scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
+ scrolled.show_all()
+ # Add this page to the notebook
+ index = self.notebook.append_page(scrolled, None)
+ self.liststore.append([index, name, _(name)])
+ return name
+
+ def remove_page(self, name):
+ """Removes a page from the notebook"""
+ self.page_num_to_remove = None
+ self.iter_to_remove = None
+
+ def on_foreach_row(model, path, _iter, user_data):
+ row_name = deluge.common.decode_bytes(model.get_value(_iter, 1))
+ if row_name == user_data:
+ # This is the row we need to remove
+ self.page_num_to_remove = model.get_value(_iter, 0)
+ self.iter_to_remove = _iter
+ # Return True to stop foreach iterating
+ return True
+
+ self.liststore.foreach(on_foreach_row, name)
+
+ # Remove the page and row
+ if self.page_num_to_remove is not None:
+ self.notebook.remove_page(self.page_num_to_remove)
+ if self.iter_to_remove is not None:
+ self.liststore.remove(self.iter_to_remove)
+
+ # We need to re-adjust the index values for the remaining pages
+ for idx, __ in enumerate(self.liststore):
+ self.liststore[idx][0] = idx
+
+ def show(self, page=None):
+ """Page should be the string in the left list.. ie, 'Network' or
+ 'Bandwidth'"""
+ self.window_open = True
+ if page is not None:
+ for (index, string, __) in self.liststore:
+ if page == string:
+ self.treeview.get_selection().select_path(index)
+ break
+
+ component.get('PluginManager').run_on_show_prefs()
+
+ # Update the preferences dialog to reflect current config settings
+ self.core_config = {}
+ if client.connected():
+ self._get_accounts_tab_data()
+
+ def on_get_config(config):
+ self.core_config = config
+ client.core.get_available_plugins().addCallback(
+ on_get_available_plugins
+ )
+
+ def on_get_available_plugins(plugins):
+ self.all_plugins = plugins
+ client.core.get_enabled_plugins().addCallback(on_get_enabled_plugins)
+
+ def on_get_enabled_plugins(plugins):
+ self.enabled_plugins = plugins
+ client.core.get_listen_port().addCallback(on_get_listen_port)
+
+ def on_get_listen_port(port):
+ self.active_port = port
+ client.core.get_session_status(DISK_CACHE_KEYS).addCallback(
+ on_get_session_status
+ )
+
+ def on_get_session_status(status):
+ self.cache_status = status
+ self._show()
+
+ # This starts a series of client.core requests prior to showing the window
+ client.core.get_config().addCallback(on_get_config)
+ else:
+ self._show()
+
+ def start(self):
+ if self.window_open:
+ self.show()
+
+ def stop(self):
+ self.core_config = None
+ if self.window_open:
+ self._show()
+
+ def _show(self):
+ self.is_connected = self.core_config != {} and self.core_config is not None
+ core_widgets = {
+ 'chk_move_completed': ('active', 'move_completed'),
+ 'chk_copy_torrent_file': ('active', 'copy_torrent_file'),
+ 'chk_del_copy_torrent_file': ('active', 'del_copy_torrent_file'),
+ 'chk_pre_allocation': ('active', 'pre_allocate_storage'),
+ 'chk_prioritize_first_last_pieces': (
+ 'active',
+ 'prioritize_first_last_pieces',
+ ),
+ 'chk_sequential_download': ('active', 'sequential_download'),
+ 'chk_add_paused': ('active', 'add_paused'),
+ 'active_port_label': ('text', lambda: str(self.active_port)),
+ 'spin_incoming_port': (
+ 'value',
+ lambda: self.core_config['listen_ports'][0],
+ ),
+ 'chk_random_incoming_port': ('active', 'random_port'),
+ 'spin_outgoing_port_min': (
+ 'value',
+ lambda: self.core_config['outgoing_ports'][0],
+ ),
+ 'spin_outgoing_port_max': (
+ 'value',
+ lambda: self.core_config['outgoing_ports'][1],
+ ),
+ 'chk_random_outgoing_ports': ('active', 'random_outgoing_ports'),
+ 'entry_interface': ('text', 'listen_interface'),
+ 'entry_outgoing_interface': ('text', 'outgoing_interface'),
+ 'entry_peer_tos': ('text', 'peer_tos'),
+ 'chk_dht': ('active', 'dht'),
+ 'chk_upnp': ('active', 'upnp'),
+ 'chk_natpmp': ('active', 'natpmp'),
+ 'chk_utpex': ('active', 'utpex'),
+ 'chk_lsd': ('active', 'lsd'),
+ 'chk_new_releases': ('active', 'new_release_check'),
+ 'chk_send_info': ('active', 'send_info'),
+ 'entry_geoip': ('text', 'geoip_db_location'),
+ 'combo_encin': ('active', 'enc_in_policy'),
+ 'combo_encout': ('active', 'enc_out_policy'),
+ 'combo_enclevel': ('active', 'enc_level'),
+ 'spin_max_connections_global': ('value', 'max_connections_global'),
+ 'spin_max_download': ('value', 'max_download_speed'),
+ 'spin_max_upload': ('value', 'max_upload_speed'),
+ 'spin_max_upload_slots_global': ('value', 'max_upload_slots_global'),
+ 'spin_max_half_open_connections': ('value', 'max_connections_per_second'),
+ 'spin_max_connections_per_second': ('value', 'max_connections_per_second'),
+ 'chk_ignore_limits_on_local_network': (
+ 'active',
+ 'ignore_limits_on_local_network',
+ ),
+ 'chk_rate_limit_ip_overhead': ('active', 'rate_limit_ip_overhead'),
+ 'spin_max_connections_per_torrent': (
+ 'value',
+ 'max_connections_per_torrent',
+ ),
+ 'spin_max_upload_slots_per_torrent': (
+ 'value',
+ 'max_upload_slots_per_torrent',
+ ),
+ 'spin_max_download_per_torrent': (
+ 'value',
+ 'max_download_speed_per_torrent',
+ ),
+ 'spin_max_upload_per_torrent': ('value', 'max_upload_speed_per_torrent'),
+ 'spin_daemon_port': ('value', 'daemon_port'),
+ 'chk_allow_remote_connections': ('active', 'allow_remote'),
+ 'spin_active': ('value', 'max_active_limit'),
+ 'spin_seeding': ('value', 'max_active_seeding'),
+ 'spin_downloading': ('value', 'max_active_downloading'),
+ 'chk_dont_count_slow_torrents': ('active', 'dont_count_slow_torrents'),
+ 'chk_auto_manage_prefer_seeds': ('active', 'auto_manage_prefer_seeds'),
+ 'chk_queue_new_top': ('active', 'queue_new_to_top'),
+ 'spin_share_ratio_limit': ('value', 'share_ratio_limit'),
+ 'spin_seed_time_ratio_limit': ('value', 'seed_time_ratio_limit'),
+ 'spin_seed_time_limit': ('value', 'seed_time_limit'),
+ 'chk_share_ratio': ('active', 'stop_seed_at_ratio'),
+ 'spin_share_ratio': ('value', 'stop_seed_ratio'),
+ 'radio_pause_ratio': ('active', 'stop_seed_at_ratio'),
+ 'radio_remove_ratio': ('active', 'remove_seed_at_ratio'),
+ 'spin_cache_size': ('value', 'cache_size'),
+ 'spin_cache_expiry': ('value', 'cache_expiry'),
+ 'combo_proxy_type': ('active', lambda: self.core_config['proxy']['type']),
+ 'entry_proxy_user': ('text', lambda: self.core_config['proxy']['username']),
+ 'entry_proxy_pass': ('text', lambda: self.core_config['proxy']['password']),
+ 'entry_proxy_host': ('text', lambda: self.core_config['proxy']['hostname']),
+ 'spin_proxy_port': ('value', lambda: self.core_config['proxy']['port']),
+ 'chk_proxy_host_resolve': (
+ 'active',
+ lambda: self.core_config['proxy']['proxy_hostnames'],
+ ),
+ 'chk_proxy_peer_conn': (
+ 'active',
+ lambda: self.core_config['proxy']['proxy_peer_connections'],
+ ),
+ 'chk_proxy_tracker_conn': (
+ 'active',
+ lambda: self.core_config['proxy']['proxy_tracker_connections'],
+ ),
+ 'chk_force_proxy': (
+ 'active',
+ lambda: self.core_config['proxy']['force_proxy'],
+ ),
+ 'chk_anonymous_mode': (
+ 'active',
+ lambda: self.core_config['proxy']['anonymous_mode'],
+ ),
+ 'accounts_add': (None, None),
+ 'accounts_listview': (None, None),
+ 'button_cache_refresh': (None, None),
+ 'button_plugin_install': (None, None),
+ 'button_rescan_plugins': (None, None),
+ 'button_find_plugins': (None, None),
+ 'button_testport': (None, None),
+ 'plugin_listview': (None, None),
+ }
+
+ core_widgets[self.download_location_path_chooser] = (
+ 'path_chooser',
+ 'download_location',
+ )
+ core_widgets[self.move_completed_path_chooser] = (
+ 'path_chooser',
+ 'move_completed_path',
+ )
+ core_widgets[self.copy_torrent_files_path_chooser] = (
+ 'path_chooser',
+ 'torrentfiles_location',
+ )
+
+ # Update the widgets accordingly
+ for key in core_widgets:
+ modifier = core_widgets[key][0]
+ try:
+ widget = self.builder.get_object(key)
+ except TypeError:
+ widget = key
+
+ widget.set_sensitive(self.is_connected)
+
+ if self.is_connected:
+ value = core_widgets[key][1]
+ try:
+ value = self.core_config[value]
+ except KeyError:
+ if callable(value):
+ value = value()
+ elif modifier:
+ value = {
+ 'active': False,
+ 'not_active': False,
+ 'value': 0,
+ 'text': '',
+ 'path_chooser': '',
+ }[modifier]
+
+ if modifier == 'active':
+ widget.set_active(value)
+ elif modifier == 'not_active':
+ widget.set_active(not value)
+ elif modifier == 'value':
+ widget.set_value(float(value))
+ elif modifier == 'text':
+ if value is None:
+ value = ''
+ widget.set_text(value)
+ elif modifier == 'path_chooser':
+ widget.set_text(value, cursor_end=False, default_text=True)
+
+ if self.is_connected:
+ for key in core_widgets:
+ try:
+ widget = self.builder.get_object(key)
+ except TypeError:
+ widget = key
+ # Update the toggle status if necessary
+ self.on_toggle(widget)
+
+ # Downloads tab #
+ self.builder.get_object('chk_show_dialog').set_active(
+ self.gtkui_config['interactive_add']
+ )
+ self.builder.get_object('chk_focus_dialog').set_active(
+ self.gtkui_config['focus_add_dialog']
+ )
+
+ # Interface tab #
+ self.builder.get_object('chk_use_tray').set_active(
+ self.gtkui_config['enable_system_tray']
+ )
+ self.builder.get_object('chk_min_on_close').set_active(
+ self.gtkui_config['close_to_tray']
+ )
+ self.builder.get_object('chk_start_in_tray').set_active(
+ self.gtkui_config['start_in_tray']
+ )
+ self.builder.get_object('radio_appind').set_active(
+ self.gtkui_config['enable_appindicator']
+ )
+ self.builder.get_object('chk_lock_tray').set_active(
+ self.gtkui_config['lock_tray']
+ )
+ self.builder.get_object('radio_standalone').set_active(
+ self.gtkui_config['standalone']
+ )
+ self.builder.get_object('radio_thinclient').set_active(
+ not self.gtkui_config['standalone']
+ )
+ self.builder.get_object('chk_show_rate_in_title').set_active(
+ self.gtkui_config['show_rate_in_title']
+ )
+ self.builder.get_object('chk_focus_main_window_on_add').set_active(
+ self.gtkui_config['focus_main_window_on_add']
+ )
+ self.builder.get_object('piecesbar_toggle').set_active(
+ self.gtkui_config['show_piecesbar']
+ )
+ self.__set_color('completed', from_config=True)
+ self.__set_color('downloading', from_config=True)
+ self.__set_color('waiting', from_config=True)
+ self.__set_color('missing', from_config=True)
+
+ # Other tab #
+ self.builder.get_object('chk_show_new_releases').set_active(
+ self.gtkui_config['show_new_releases']
+ )
+
+ # Cache tab #
+ if client.connected():
+ self.__update_cache_status()
+
+ # Plugins tab #
+ all_plugins = self.all_plugins
+ enabled_plugins = self.enabled_plugins
+ # Clear the existing list so we don't duplicate entries.
+ self.plugin_liststore.clear()
+ # Iterate through the lists and add them to the liststore
+ for plugin in all_plugins:
+ enabled = plugin in enabled_plugins
+ row = self.plugin_liststore.append()
+ self.plugin_liststore.set_value(row, 0, plugin)
+ self.plugin_liststore.set_value(row, 1, enabled)
+ self.plugin_liststore.set_value(row, 2, _(plugin))
+
+ # Now show the dialog
+ self.pref_dialog.show()
+
+ def set_config(self, hide=False):
+ """
+ Sets all altered config values in the core.
+
+ :param hide: bool, if True, will not re-show the dialog and will hide it instead
+ """
+
+ # Get the values from the dialog
+ new_core_config = {}
+ new_gtkui_config = {}
+
+ # Downloads tab #
+ new_gtkui_config['interactive_add'] = self.builder.get_object(
+ 'chk_show_dialog'
+ ).get_active()
+ new_gtkui_config['focus_add_dialog'] = self.builder.get_object(
+ 'chk_focus_dialog'
+ ).get_active()
+
+ for state in ('missing', 'waiting', 'downloading', 'completed'):
+ color = self.builder.get_object('%s_color' % state).get_color()
+ new_gtkui_config['pieces_color_%s' % state] = [
+ color.red,
+ color.green,
+ color.blue,
+ ]
+
+ new_core_config['copy_torrent_file'] = self.builder.get_object(
+ 'chk_copy_torrent_file'
+ ).get_active()
+ new_core_config['del_copy_torrent_file'] = self.builder.get_object(
+ 'chk_del_copy_torrent_file'
+ ).get_active()
+ new_core_config['move_completed'] = self.builder.get_object(
+ 'chk_move_completed'
+ ).get_active()
+
+ new_core_config[
+ 'download_location'
+ ] = self.download_location_path_chooser.get_text()
+ new_core_config[
+ 'move_completed_path'
+ ] = self.move_completed_path_chooser.get_text()
+ new_core_config[
+ 'torrentfiles_location'
+ ] = self.copy_torrent_files_path_chooser.get_text()
+ new_core_config['prioritize_first_last_pieces'] = self.builder.get_object(
+ 'chk_prioritize_first_last_pieces'
+ ).get_active()
+ new_core_config['sequential_download'] = self.builder.get_object(
+ 'chk_sequential_download'
+ ).get_active()
+ new_core_config['add_paused'] = self.builder.get_object(
+ 'chk_add_paused'
+ ).get_active()
+ new_core_config['pre_allocate_storage'] = self.builder.get_object(
+ 'chk_pre_allocation'
+ ).get_active()
+
+ # Network tab #
+ listen_ports = [
+ self.builder.get_object('spin_incoming_port').get_value_as_int()
+ ] * 2
+ new_core_config['listen_ports'] = listen_ports
+ new_core_config['random_port'] = self.builder.get_object(
+ 'chk_random_incoming_port'
+ ).get_active()
+ outgoing_ports = (
+ self.builder.get_object('spin_outgoing_port_min').get_value_as_int(),
+ self.builder.get_object('spin_outgoing_port_max').get_value_as_int(),
+ )
+ new_core_config['outgoing_ports'] = outgoing_ports
+ new_core_config['random_outgoing_ports'] = self.builder.get_object(
+ 'chk_random_outgoing_ports'
+ ).get_active()
+ incoming_address = self.builder.get_object('entry_interface').get_text().strip()
+ if deluge.common.is_ip(incoming_address) or not incoming_address:
+ new_core_config['listen_interface'] = incoming_address
+ new_core_config['outgoing_interface'] = (
+ self.builder.get_object('entry_outgoing_interface').get_text().strip()
+ )
+ new_core_config['peer_tos'] = self.builder.get_object(
+ 'entry_peer_tos'
+ ).get_text()
+ new_core_config['dht'] = self.builder.get_object('chk_dht').get_active()
+ new_core_config['upnp'] = self.builder.get_object('chk_upnp').get_active()
+ new_core_config['natpmp'] = self.builder.get_object('chk_natpmp').get_active()
+ new_core_config['utpex'] = self.builder.get_object('chk_utpex').get_active()
+ new_core_config['lsd'] = self.builder.get_object('chk_lsd').get_active()
+ new_core_config['enc_in_policy'] = self.builder.get_object(
+ 'combo_encin'
+ ).get_active()
+ new_core_config['enc_out_policy'] = self.builder.get_object(
+ 'combo_encout'
+ ).get_active()
+ new_core_config['enc_level'] = self.builder.get_object(
+ 'combo_enclevel'
+ ).get_active()
+
+ # Bandwidth tab #
+ new_core_config['max_connections_global'] = self.builder.get_object(
+ 'spin_max_connections_global'
+ ).get_value_as_int()
+ new_core_config['max_download_speed'] = self.builder.get_object(
+ 'spin_max_download'
+ ).get_value()
+ new_core_config['max_upload_speed'] = self.builder.get_object(
+ 'spin_max_upload'
+ ).get_value()
+ new_core_config['max_upload_slots_global'] = self.builder.get_object(
+ 'spin_max_upload_slots_global'
+ ).get_value_as_int()
+ new_core_config['max_half_open_connections'] = self.builder.get_object(
+ 'spin_max_half_open_connections'
+ ).get_value_as_int()
+ new_core_config['max_connections_per_second'] = self.builder.get_object(
+ 'spin_max_connections_per_second'
+ ).get_value_as_int()
+ new_core_config['max_connections_per_torrent'] = self.builder.get_object(
+ 'spin_max_connections_per_torrent'
+ ).get_value_as_int()
+ new_core_config['max_upload_slots_per_torrent'] = self.builder.get_object(
+ 'spin_max_upload_slots_per_torrent'
+ ).get_value_as_int()
+ new_core_config['max_upload_speed_per_torrent'] = self.builder.get_object(
+ 'spin_max_upload_per_torrent'
+ ).get_value()
+ new_core_config['max_download_speed_per_torrent'] = self.builder.get_object(
+ 'spin_max_download_per_torrent'
+ ).get_value()
+ new_core_config['ignore_limits_on_local_network'] = self.builder.get_object(
+ 'chk_ignore_limits_on_local_network'
+ ).get_active()
+ new_core_config['rate_limit_ip_overhead'] = self.builder.get_object(
+ 'chk_rate_limit_ip_overhead'
+ ).get_active()
+
+ # Interface tab #
+ new_gtkui_config['enable_system_tray'] = self.builder.get_object(
+ 'chk_use_tray'
+ ).get_active()
+ new_gtkui_config['close_to_tray'] = self.builder.get_object(
+ 'chk_min_on_close'
+ ).get_active()
+ new_gtkui_config['start_in_tray'] = self.builder.get_object(
+ 'chk_start_in_tray'
+ ).get_active()
+ new_gtkui_config['enable_appindicator'] = self.builder.get_object(
+ 'radio_appind'
+ ).get_active()
+ new_gtkui_config['lock_tray'] = self.builder.get_object(
+ 'chk_lock_tray'
+ ).get_active()
+ passhex = sha(
+ deluge.common.decode_bytes(
+ self.builder.get_object('txt_tray_password').get_text()
+ ).encode()
+ ).hexdigest()
+ if passhex != 'c07eb5a8c0dc7bb81c217b67f11c3b7a5e95ffd7':
+ new_gtkui_config['tray_password'] = passhex
+
+ was_standalone = self.gtkui_config['standalone']
+ new_gtkui_standalone = self.builder.get_object('radio_standalone').get_active()
+ new_gtkui_config['standalone'] = new_gtkui_standalone
+
+ new_gtkui_config['show_rate_in_title'] = self.builder.get_object(
+ 'chk_show_rate_in_title'
+ ).get_active()
+ new_gtkui_config['focus_main_window_on_add'] = self.builder.get_object(
+ 'chk_focus_main_window_on_add'
+ ).get_active()
+
+ # Other tab #
+ new_gtkui_config['show_new_releases'] = self.builder.get_object(
+ 'chk_show_new_releases'
+ ).get_active()
+ new_core_config['send_info'] = self.builder.get_object(
+ 'chk_send_info'
+ ).get_active()
+ new_core_config['geoip_db_location'] = self.builder.get_object(
+ 'entry_geoip'
+ ).get_text()
+
+ # Daemon tab #
+ new_core_config['daemon_port'] = self.builder.get_object(
+ 'spin_daemon_port'
+ ).get_value_as_int()
+ new_core_config['allow_remote'] = self.builder.get_object(
+ 'chk_allow_remote_connections'
+ ).get_active()
+ new_core_config['new_release_check'] = self.builder.get_object(
+ 'chk_new_releases'
+ ).get_active()
+
+ # Proxy tab #
+ new_core_config['proxy'] = {
+ 'type': self.builder.get_object('combo_proxy_type').get_active(),
+ 'username': self.builder.get_object('entry_proxy_user').get_text(),
+ 'password': self.builder.get_object('entry_proxy_pass').get_text(),
+ 'hostname': self.builder.get_object('entry_proxy_host').get_text(),
+ 'port': self.builder.get_object('spin_proxy_port').get_value_as_int(),
+ 'proxy_hostnames': self.builder.get_object(
+ 'chk_proxy_host_resolve'
+ ).get_active(),
+ 'proxy_peer_connections': self.builder.get_object(
+ 'chk_proxy_peer_conn'
+ ).get_active(),
+ 'proxy_tracker_connections': self.builder.get_object(
+ 'chk_proxy_tracker_conn'
+ ).get_active(),
+ 'force_proxy': self.builder.get_object('chk_force_proxy').get_active(),
+ 'anonymous_mode': self.builder.get_object(
+ 'chk_anonymous_mode'
+ ).get_active(),
+ }
+
+ # Queue tab #
+ new_core_config['queue_new_to_top'] = self.builder.get_object(
+ 'chk_queue_new_top'
+ ).get_active()
+ new_core_config['max_active_seeding'] = self.builder.get_object(
+ 'spin_seeding'
+ ).get_value_as_int()
+ new_core_config['max_active_downloading'] = self.builder.get_object(
+ 'spin_downloading'
+ ).get_value_as_int()
+ new_core_config['max_active_limit'] = self.builder.get_object(
+ 'spin_active'
+ ).get_value_as_int()
+ new_core_config['dont_count_slow_torrents'] = self.builder.get_object(
+ 'chk_dont_count_slow_torrents'
+ ).get_active()
+ new_core_config['auto_manage_prefer_seeds'] = self.builder.get_object(
+ 'chk_auto_manage_prefer_seeds'
+ ).get_active()
+ new_core_config['stop_seed_at_ratio'] = self.builder.get_object(
+ 'chk_share_ratio'
+ ).get_active()
+ new_core_config['remove_seed_at_ratio'] = self.builder.get_object(
+ 'radio_remove_ratio'
+ ).get_active()
+ new_core_config['stop_seed_ratio'] = self.builder.get_object(
+ 'spin_share_ratio'
+ ).get_value()
+ new_core_config['share_ratio_limit'] = self.builder.get_object(
+ 'spin_share_ratio_limit'
+ ).get_value()
+ new_core_config['seed_time_ratio_limit'] = self.builder.get_object(
+ 'spin_seed_time_ratio_limit'
+ ).get_value()
+ new_core_config['seed_time_limit'] = self.builder.get_object(
+ 'spin_seed_time_limit'
+ ).get_value()
+
+ # Cache tab #
+ new_core_config['cache_size'] = self.builder.get_object(
+ 'spin_cache_size'
+ ).get_value_as_int()
+ new_core_config['cache_expiry'] = self.builder.get_object(
+ 'spin_cache_expiry'
+ ).get_value_as_int()
+
+ # Run plugin hook to apply preferences
+ component.get('PluginManager').run_on_apply_prefs()
+
+ # Language
+ if self.language_checkbox.get_active():
+ new_gtkui_config['language'] = None
+ else:
+ active = self.language_combo.get_active()
+ if active == -1:
+ dialog = InformationDialog(
+ _('Attention'), _('You must choose a language')
+ )
+ dialog.run()
+ return
+ else:
+ model = self.language_combo.get_model()
+ new_gtkui_config['language'] = model.get(model.get_iter(active), 0)[0]
+
+ if new_gtkui_config['language'] != self.gtkui_config['language']:
+ dialog = InformationDialog(
+ _('Attention'),
+ _('You must now restart the deluge UI for the changes to take effect.'),
+ )
+ dialog.run()
+
+ # GtkUI
+ for key in new_gtkui_config:
+ # The values do not match so this needs to be updated
+ if self.gtkui_config[key] != new_gtkui_config[key]:
+ self.gtkui_config[key] = new_gtkui_config[key]
+
+ # Core
+ if client.connected():
+ # Only do this if we're connected to a daemon
+ config_to_set = {}
+ for key in new_core_config:
+ # The values do not match so this needs to be updated
+ if self.core_config[key] != new_core_config[key]:
+ config_to_set[key] = new_core_config[key]
+
+ if config_to_set:
+ # Set each changed config value in the core
+ client.core.set_config(config_to_set)
+ client.force_call(True)
+ # Update the configuration
+ self.core_config.update(config_to_set)
+
+ if hide:
+ self.hide()
+ else:
+ # Re-show the dialog to make sure everything has been updated
+ self.show()
+
+ if was_standalone != new_gtkui_standalone:
+
+ def on_response(response):
+ if response == Gtk.ResponseType.YES:
+ shutdown_daemon = (
+ not client.is_standalone()
+ and client.connected()
+ and client.is_localhost()
+ )
+ component.get('MainWindow').quit(
+ shutdown=shutdown_daemon, restart=True
+ )
+ else:
+ self.gtkui_config['standalone'] = not new_gtkui_standalone
+ self.builder.get_object('radio_standalone').set_active(
+ self.gtkui_config['standalone']
+ )
+ self.builder.get_object('radio_thinclient').set_active(
+ not self.gtkui_config['standalone']
+ )
+
+ mode = 'Thinclient' if was_standalone else 'Standalone'
+ dialog = YesNoDialog(
+ _('Switching Deluge Client Mode...'),
+ _('Do you want to restart to use %s mode?' % mode),
+ )
+ dialog.run().addCallback(on_response)
+
+ def hide(self):
+ self.window_open = False
+ self.builder.get_object('port_img').hide()
+ self.pref_dialog.hide()
+
+ def __update_cache_status(self):
+ # Updates the cache status labels with the info in the dict
+ cache_labels = (
+ 'label_cache_read_ops',
+ 'label_cache_write_ops',
+ 'label_cache_num_blocks_read',
+ 'label_cache_num_blocks_written',
+ 'label_cache_read_hit_ratio',
+ 'label_cache_write_hit_ratio',
+ 'label_cache_num_blocks_cache_hits',
+ 'label_cache_disk_blocks_in_use',
+ 'label_cache_read_cache_blocks',
+ )
+
+ for widget_name in cache_labels:
+ widget = self.builder.get_object(widget_name)
+ key = widget_name[len('label_cache_') :]
+ if not widget_name.endswith('ratio'):
+ key = 'disk.' + key
+ value = self.cache_status.get(key, 0)
+ if isinstance(value, float):
+ value = '%.2f' % value
+ else:
+ value = str(value)
+
+ widget.set_text(value)
+
+ def on_button_cache_refresh_clicked(self, widget):
+ def on_get_session_status(status):
+ self.cache_status = status
+ self.__update_cache_status()
+
+ client.core.get_session_status(DISK_CACHE_KEYS).addCallback(
+ on_get_session_status
+ )
+
+ def on_pref_dialog_delete_event(self, widget, event):
+ self.hide()
+ return True
+
+ def load_pref_dialog_state(self):
+ w = self.gtkui_config['pref_dialog_width']
+ h = self.gtkui_config['pref_dialog_height']
+ if w is not None and h is not None:
+ self.pref_dialog.resize(w, h)
+
+ def on_pref_dialog_configure_event(self, widget, event):
+ self.gtkui_config['pref_dialog_width'] = event.width
+ self.gtkui_config['pref_dialog_height'] = event.height
+
+ def on_toggle(self, widget):
+ """Handles widget sensitivity based on radio/check button values."""
+ try:
+ value = widget.get_active()
+ except Exception:
+ return
+
+ path_choosers = {
+ 'download_location_path_chooser': self.download_location_path_chooser,
+ 'move_completed_path_chooser': self.move_completed_path_chooser,
+ 'torrentfiles_location_path_chooser': self.copy_torrent_files_path_chooser,
+ }
+
+ dependents = {
+ 'chk_show_dialog': {'chk_focus_dialog': True},
+ 'chk_random_incoming_port': {'spin_incoming_port': False},
+ 'chk_random_outgoing_ports': {
+ 'spin_outgoing_port_min': False,
+ 'spin_outgoing_port_max': False,
+ },
+ 'chk_use_tray': {
+ 'radio_appind': True,
+ 'radio_systray': True,
+ 'chk_min_on_close': True,
+ 'chk_start_in_tray': True,
+ 'alignment_tray_type': True,
+ 'chk_lock_tray': True,
+ },
+ 'chk_lock_tray': {'txt_tray_password': True, 'password_label': True},
+ 'radio_open_folder_custom': {
+ 'combo_file_manager': False,
+ 'txt_open_folder_location': True,
+ },
+ 'chk_move_completed': {'move_completed_path_chooser': True},
+ 'chk_copy_torrent_file': {
+ 'torrentfiles_location_path_chooser': True,
+ 'chk_del_copy_torrent_file': True,
+ },
+ 'chk_share_ratio': {
+ 'spin_share_ratio': True,
+ 'radio_pause_ratio': True,
+ 'radio_remove_ratio': True,
+ },
+ }
+
+ def update_dependent_widgets(name, value):
+ dependency = dependents[name]
+ for dep in dependency:
+ if dep in path_choosers:
+ depwidget = path_choosers[dep]
+ else:
+ depwidget = self.builder.get_object(dep)
+ sensitive = [not value, value][dependency[dep]]
+ depwidget.set_sensitive(sensitive)
+ if dep in dependents:
+ update_dependent_widgets(dep, depwidget.get_active() and sensitive)
+
+ for key in dependents:
+ if widget != self.builder.get_object(key):
+ continue
+ update_dependent_widgets(key, value)
+
+ def on_button_ok_clicked(self, data):
+ log.debug('on_button_ok_clicked')
+ self.set_config(hide=True)
+ return True
+
+ def on_button_apply_clicked(self, data):
+ log.debug('on_button_apply_clicked')
+ self.set_config()
+
+ def on_button_cancel_clicked(self, data):
+ log.debug('on_button_cancel_clicked')
+ self.hide()
+ return True
+
+ def on_selection_changed(self, treeselection):
+ # Show the correct notebook page based on what row is selected.
+ (model, row) = treeselection.get_selected()
+ try:
+ if model.get_value(row, 1) == 'daemon':
+ # Let's see update the accounts related stuff
+ if client.connected():
+ self._get_accounts_tab_data()
+ self.notebook.set_current_page(model.get_value(row, 0))
+ except TypeError:
+ pass
+
+ def on_test_port_clicked(self, data):
+ log.debug('on_test_port_clicked')
+
+ def on_get_test(status):
+ if status:
+ self.builder.get_object('port_img').set_from_icon_name(
+ 'emblem-ok-symbolic', Gtk.IconSize.MENU
+ )
+ self.builder.get_object('port_img').show()
+ else:
+ self.builder.get_object('port_img').set_from_icon_name(
+ 'dialog-warning-symbolic', Gtk.IconSize.MENU
+ )
+ self.builder.get_object('port_img').show()
+
+ client.core.test_listen_port().addCallback(on_get_test)
+ # XXX: Consider using gtk.Spinner() instead of the loading gif
+ # It requires gtk.ver > 2.12
+ self.builder.get_object('port_img').set_from_file(
+ deluge.common.get_pixmap('loading.gif')
+ )
+ self.builder.get_object('port_img').show()
+ client.force_call()
+
+ def on_plugin_toggled(self, renderer, path):
+ row = self.plugin_liststore.get_iter_from_string(path)
+ name = self.plugin_liststore.get_value(row, 0)
+ value = self.plugin_liststore.get_value(row, 1)
+ log.debug('on_plugin_toggled - %s: %s', name, value)
+ self.plugin_liststore.set_value(row, 1, not value)
+ if not value:
+ d = client.core.enable_plugin(name)
+ else:
+ d = client.core.disable_plugin(name)
+
+ def on_plugin_action(arg):
+ if not value and arg is False:
+ log.warning('Failed to enable plugin: %s', name)
+ self.plugin_liststore.set_value(row, 1, False)
+
+ d.addBoth(on_plugin_action)
+
+ def on_plugin_selection_changed(self, treeselection):
+ log.debug('on_plugin_selection_changed')
+ (model, itr) = treeselection.get_selected()
+ if not itr:
+ return
+ name = model[itr][0]
+ plugin_info = component.get('PluginManager').get_plugin_info(name)
+ self.builder.get_object('label_plugin_author').set_text(plugin_info['Author'])
+ self.builder.get_object('label_plugin_version').set_text(plugin_info['Version'])
+ self.builder.get_object('label_plugin_email').set_text(
+ plugin_info['Author-email']
+ )
+ self.builder.get_object('label_plugin_homepage').set_text(
+ plugin_info['Home-page']
+ )
+ self.builder.get_object('label_plugin_details').set_text(
+ plugin_info['Description']
+ )
+
+ def on_button_plugin_install_clicked(self, widget):
+ log.debug('on_button_plugin_install_clicked')
+ chooser = Gtk.FileChooserDialog(
+ _('Select the Plugin'),
+ self.pref_dialog,
+ Gtk.FileChooserAction.OPEN,
+ buttons=(
+ _('_Cancel'),
+ Gtk.ResponseType.CANCEL,
+ _('_Open'),
+ Gtk.ResponseType.OK,
+ ),
+ )
+
+ chooser.set_transient_for(self.pref_dialog)
+ chooser.set_select_multiple(False)
+ chooser.set_property('skip-taskbar-hint', True)
+
+ file_filter = Gtk.FileFilter()
+ file_filter.set_name(_('Plugin Eggs'))
+ file_filter.add_pattern('*.' + 'egg')
+ chooser.add_filter(file_filter)
+
+ # Run the dialog
+ response = chooser.run()
+
+ if response == Gtk.ResponseType.OK:
+ filepath = deluge.common.decode_bytes(chooser.get_filename())
+ else:
+ chooser.destroy()
+ return
+
+ from base64 import b64encode
+ import shutil
+
+ filename = os.path.split(filepath)[1]
+ shutil.copyfile(filepath, os.path.join(get_config_dir(), 'plugins', filename))
+
+ component.get('PluginManager').scan_for_plugins()
+
+ if not client.is_localhost():
+ # We need to send this plugin to the daemon
+ with open(filepath, 'rb') as _file:
+ filedump = b64encode(_file.read())
+ client.core.upload_plugin(filename, filedump)
+
+ client.core.rescan_plugins()
+ chooser.destroy()
+ # We need to re-show the preferences dialog to show the new plugins
+ self.show()
+
+ def on_button_rescan_plugins_clicked(self, widget):
+ component.get('PluginManager').scan_for_plugins()
+ if client.connected():
+ client.core.rescan_plugins()
+ self.show()
+
+ def on_button_find_plugins_clicked(self, widget):
+ deluge.common.open_url_in_browser('http://dev.deluge-torrent.org/wiki/Plugins')
+
+ def on_combo_encryption_changed(self, widget):
+ combo_encin = self.builder.get_object('combo_encin').get_active()
+ combo_encout = self.builder.get_object('combo_encout').get_active()
+ combo_enclevel = self.builder.get_object('combo_enclevel')
+
+ # If incoming and outgoing both set to disabled, disable level combobox
+ if combo_encin == 2 and combo_encout == 2:
+ combo_enclevel.set_sensitive(False)
+ elif self.is_connected:
+ combo_enclevel.set_sensitive(True)
+
+ def on_combo_proxy_type_changed(self, widget):
+ proxy_type = self.builder.get_object('combo_proxy_type').get_active()
+ proxy_entries = [
+ 'label_proxy_host',
+ 'entry_proxy_host',
+ 'label_proxy_port',
+ 'spin_proxy_port',
+ 'label_proxy_pass',
+ 'entry_proxy_pass',
+ 'label_proxy_user',
+ 'entry_proxy_user',
+ 'chk_proxy_host_resolve',
+ 'chk_proxy_peer_conn',
+ 'chk_proxy_tracker_conn',
+ ]
+
+ # 0: None, 1: Socks4, 2: Socks5, 3: Socks5 Auth, 4: HTTP, 5: HTTP Auth, 6: I2P
+ show_entries = []
+ if proxy_type > 0:
+ show_entries.extend(
+ [
+ 'label_proxy_host',
+ 'entry_proxy_host',
+ 'label_proxy_port',
+ 'spin_proxy_port',
+ 'chk_proxy_peer_conn',
+ 'chk_proxy_tracker_conn',
+ ]
+ )
+ if proxy_type in (3, 5):
+ show_entries.extend(
+ [
+ 'label_proxy_pass',
+ 'entry_proxy_pass',
+ 'label_proxy_user',
+ 'entry_proxy_user',
+ ]
+ )
+ if proxy_type in (2, 3, 4, 5):
+ show_entries.extend(['chk_proxy_host_resolve'])
+
+ for entry in proxy_entries:
+ if entry in show_entries:
+ self.builder.get_object(entry).show()
+ else:
+ self.builder.get_object(entry).hide()
+
+ def on_entry_proxy_host_paste_clipboard(self, widget):
+ text = get_clipboard_text()
+ log.debug('on_entry_proxy_host_paste-clipboard: got paste: %s', text)
+ text = text if '//' in text else '//' + text
+ parsed = urlparse(text)
+ if parsed.hostname:
+ widget.set_text(parsed.hostname)
+ widget.emit_stop_by_name('paste-clipboard')
+ if parsed.port:
+ self.builder.get_object('spin_proxy_port').set_value(parsed.port)
+ if parsed.username:
+ self.builder.get_object('entry_proxy_user').set_text(parsed.username)
+ if parsed.password:
+ self.builder.get_object('entry_proxy_pass').set_text(parsed.password)
+
+ def on_button_associate_magnet_clicked(self, widget):
+ associate_magnet_links(True)
+
+ def _get_accounts_tab_data(self):
+ def on_ok(accounts):
+ self.accounts_frame.show()
+ self.on_get_known_accounts(accounts)
+
+ def on_fail(failure):
+ if failure.type == NotAuthorizedError:
+ self.accounts_frame.hide()
+ else:
+ ErrorDialog(
+ _('Server Side Error'),
+ _('An error occurred on the server'),
+ parent=self.pref_dialog,
+ details=failure.getErrorMessage(),
+ ).run()
+
+ client.core.get_known_accounts().addCallback(on_ok).addErrback(on_fail)
+
+ def on_get_known_accounts(self, known_accounts):
+ known_accounts_to_log = []
+ for account in known_accounts:
+ account_to_log = {}
+ for key, value in account.copy().items():
+ if key == 'password':
+ value = '*' * len(value)
+ account_to_log[key] = value
+ known_accounts_to_log.append(account_to_log)
+ log.debug('on_known_accounts: %s', known_accounts_to_log)
+
+ self.accounts_liststore.clear()
+
+ for account in known_accounts:
+ accounts_iter = self.accounts_liststore.append()
+ self.accounts_liststore.set_value(
+ accounts_iter, ACCOUNTS_USERNAME, account['username']
+ )
+ self.accounts_liststore.set_value(
+ accounts_iter, ACCOUNTS_LEVEL, account['authlevel']
+ )
+ self.accounts_liststore.set_value(
+ accounts_iter, ACCOUNTS_PASSWORD, account['password']
+ )
+
+ def on_accounts_selection_changed(self, treeselection):
+ log.debug('on_accounts_selection_changed')
+ (model, itr) = treeselection.get_selected()
+ if not itr:
+ return
+ username = model[itr][0]
+ if username:
+ self.builder.get_object('accounts_edit').set_sensitive(True)
+ self.builder.get_object('accounts_delete').set_sensitive(True)
+ else:
+ self.builder.get_object('accounts_edit').set_sensitive(False)
+ self.builder.get_object('accounts_delete').set_sensitive(False)
+
+ def on_accounts_add_clicked(self, widget):
+ dialog = AccountDialog(
+ levels_mapping=client.auth_levels_mapping, parent=self.pref_dialog
+ )
+
+ def dialog_finished(response_id):
+ username = dialog.get_username()
+ password = dialog.get_password()
+ authlevel = dialog.get_authlevel()
+
+ def add_ok(rv):
+ accounts_iter = self.accounts_liststore.append()
+ self.accounts_liststore.set_value(
+ accounts_iter, ACCOUNTS_USERNAME, username
+ )
+ self.accounts_liststore.set_value(
+ accounts_iter, ACCOUNTS_LEVEL, authlevel
+ )
+ self.accounts_liststore.set_value(
+ accounts_iter, ACCOUNTS_PASSWORD, password
+ )
+
+ def add_fail(failure):
+ if failure.type == AuthManagerError:
+ ErrorDialog(
+ _('Error Adding Account'),
+ _('Authentication failed'),
+ parent=self.pref_dialog,
+ details=failure.getErrorMessage(),
+ ).run()
+ else:
+ ErrorDialog(
+ _('Error Adding Account'),
+ _('An error occurred while adding account'),
+ parent=self.pref_dialog,
+ details=failure.getErrorMessage(),
+ ).run()
+
+ if response_id == Gtk.ResponseType.OK:
+ client.core.create_account(username, password, authlevel).addCallback(
+ add_ok
+ ).addErrback(add_fail)
+
+ dialog.run().addCallback(dialog_finished)
+
+ def on_accounts_edit_clicked(self, widget):
+ (model, itr) = self.accounts_listview.get_selection().get_selected()
+ if not itr:
+ return
+
+ dialog = AccountDialog(
+ model[itr][ACCOUNTS_USERNAME],
+ model[itr][ACCOUNTS_PASSWORD],
+ model[itr][ACCOUNTS_LEVEL],
+ levels_mapping=client.auth_levels_mapping,
+ parent=self.pref_dialog,
+ )
+
+ def dialog_finished(response_id):
+ def update_ok(rc):
+ model.set_value(itr, ACCOUNTS_PASSWORD, dialog.get_username())
+ model.set_value(itr, ACCOUNTS_LEVEL, dialog.get_authlevel())
+
+ def update_fail(failure):
+ ErrorDialog(
+ _('Error Updating Account'),
+ _('An error occurred while updating account'),
+ parent=self.pref_dialog,
+ details=failure.getErrorMessage(),
+ ).run()
+
+ if response_id == Gtk.ResponseType.OK:
+ client.core.update_account(
+ dialog.get_username(), dialog.get_password(), dialog.get_authlevel()
+ ).addCallback(update_ok).addErrback(update_fail)
+
+ dialog.run().addCallback(dialog_finished)
+
+ def on_accounts_delete_clicked(self, widget):
+ (model, itr) = self.accounts_listview.get_selection().get_selected()
+ if not itr:
+ return
+
+ username = model[itr][0]
+ header = _('Remove Account')
+ text = _(
+ 'Are you sure you want to remove the account with the '
+ 'username "%(username)s"?' % {'username': username}
+ )
+ dialog = YesNoDialog(header, text, parent=self.pref_dialog)
+
+ def dialog_finished(response_id):
+ def remove_ok(rc):
+ model.remove(itr)
+
+ def remove_fail(failure):
+ if failure.type == AuthManagerError:
+ ErrorDialog(
+ _('Error Removing Account'),
+ _('Auhentication failed'),
+ parent=self.pref_dialog,
+ details=failure.getErrorMessage(),
+ ).run()
+ else:
+ ErrorDialog(
+ _('Error Removing Account'),
+ _('An error occurred while removing account'),
+ parent=self.pref_dialog,
+ details=failure.getErrorMessage(),
+ ).run()
+
+ if response_id == Gtk.ResponseType.YES:
+ client.core.remove_account(username).addCallback(remove_ok).addErrback(
+ remove_fail
+ )
+
+ dialog.run().addCallback(dialog_finished)
+
+ def on_piecesbar_toggle_toggled(self, widget):
+ self.gtkui_config['show_piecesbar'] = widget.get_active()
+ colors_widget = self.builder.get_object('piecebar_colors_expander')
+ colors_widget.set_visible(widget.get_active())
+
+ def on_checkbutton_language_toggled(self, widget):
+ self.language_combo.set_visible(not self.language_checkbox.get_active())
+
+ def on_completed_color_set(self, widget):
+ self.__set_color('completed')
+
+ def on_revert_color_completed_clicked(self, widget):
+ self.__revert_color('completed')
+
+ def on_downloading_color_set(self, widget):
+ self.__set_color('downloading')
+
+ def on_revert_color_downloading_clicked(self, widget):
+ self.__revert_color('downloading')
+
+ def on_waiting_color_set(self, widget):
+ self.__set_color('waiting')
+
+ def on_revert_color_waiting_clicked(self, widget):
+ self.__revert_color('waiting')
+
+ def on_missing_color_set(self, widget):
+ self.__set_color('missing')
+
+ def on_revert_color_missing_clicked(self, widget):
+ self.__revert_color('missing')
+
+ def __set_color(self, state, from_config=False):
+ if from_config:
+ color = Color(*self.gtkui_config['pieces_color_%s' % state])
+ log.debug(
+ 'Setting %r color state from config to %s',
+ state,
+ (color.red, color.green, color.blue),
+ )
+ self.builder.get_object('%s_color' % state).set_color(color)
+ else:
+ color = self.builder.get_object('%s_color' % state).get_color()
+ log.debug(
+ 'Setting %r color state to %s',
+ state,
+ (color.red, color.green, color.blue),
+ )
+ self.gtkui_config['pieces_color_%s' % state] = [
+ color.red,
+ color.green,
+ color.blue,
+ ]
+ self.gtkui_config.save()
+ self.gtkui_config.apply_set_functions('pieces_colors')
+
+ self.builder.get_object('revert_color_%s' % state).set_sensitive(
+ [color.red, color.green, color.blue] != self.COLOR_DEFAULTS[state]
+ )
+
+ def __revert_color(self, state, from_config=False):
+ log.debug('Reverting %r color state', state)
+ self.builder.get_object('%s_color' % state).set_color(
+ Color(*self.COLOR_DEFAULTS[state])
+ )
+ self.builder.get_object('revert_color_%s' % state).set_sensitive(False)
+ self.gtkui_config.apply_set_functions('pieces_colors')
diff --git a/deluge/ui/gtk3/queuedtorrents.py b/deluge/ui/gtk3/queuedtorrents.py
new file mode 100644
index 0000000..0f08c24
--- /dev/null
+++ b/deluge/ui/gtk3/queuedtorrents.py
@@ -0,0 +1,168 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os.path
+
+from gi.repository.GLib import timeout_add
+from gi.repository.Gtk import Builder, CellRendererText, ListStore, TreeViewColumn
+
+import deluge.common
+import deluge.component as component
+from deluge.configmanager import ConfigManager
+
+from .common import get_logo
+from .ipcinterface import process_args
+
+log = logging.getLogger(__name__)
+
+
+class QueuedTorrents(component.Component):
+ def __init__(self):
+ component.Component.__init__(
+ self, 'QueuedTorrents', depend=['StatusBar', 'AddTorrentDialog']
+ )
+ self.queue = []
+ self.status_item = None
+
+ self.config = ConfigManager('gtk3ui.conf')
+ self.builder = Builder()
+ self.builder.add_from_file(
+ deluge.common.resource_filename(
+ __package__, os.path.join('glade', 'queuedtorrents.ui')
+ )
+ )
+ self.builder.get_object('chk_autoadd').set_active(self.config['autoadd_queued'])
+ self.dialog = self.builder.get_object('queued_torrents_dialog')
+ self.dialog.set_icon(get_logo(32))
+
+ self.builder.connect_signals(self)
+
+ self.treeview = self.builder.get_object('treeview')
+ self.treeview.append_column(
+ TreeViewColumn(_('Torrent'), CellRendererText(), text=0)
+ )
+
+ self.liststore = ListStore(str, str)
+ self.treeview.set_model(self.liststore)
+ self.treeview.set_tooltip_column(1)
+
+ def run(self):
+ self.dialog.set_transient_for(component.get('MainWindow').window)
+ self.dialog.show()
+
+ def start(self):
+ if len(self.queue) == 0:
+ return
+
+ # Make sure status bar info is showing
+ self.update_status_bar()
+
+ # We only want the add button sensitive if we're connected to a host
+ self.builder.get_object('button_add').set_sensitive(True)
+
+ if self.config['autoadd_queued'] or self.config['standalone']:
+ self.on_button_add_clicked(None)
+ else:
+ self.run()
+
+ def stop(self):
+ # We only want the add button sensitive if we're connected to a host
+ self.builder.get_object('button_add').set_sensitive(False)
+ self.update_status_bar()
+
+ def add_to_queue(self, torrents):
+ """Adds the list of torrents to the queue"""
+ # Add to the queue while removing duplicates
+ self.queue = list(set(self.queue + torrents))
+
+ # Update the liststore
+ self.liststore.clear()
+ for torrent in self.queue:
+ if deluge.common.is_magnet(torrent):
+ magnet = deluge.common.get_magnet_info(torrent)
+ self.liststore.append([magnet['name'], torrent])
+ else:
+ self.liststore.append([os.path.split(torrent)[1], torrent])
+
+ # Update the status bar
+ self.update_status_bar()
+
+ def update_status_bar(self):
+ """Attempts to update status bar"""
+ # If there are no queued torrents.. remove statusbar widgets and return
+ if len(self.queue) == 0:
+ if self.status_item is not None:
+ component.get('StatusBar').remove_item(self.status_item)
+ self.status_item = None
+ return False
+
+ try:
+ component.get('StatusBar')
+ except Exception:
+ # The statusbar hasn't been loaded yet, so we'll add a timer to
+ # update it later.
+ timeout_add(100, self.update_status_bar)
+ return False
+
+ # Set the label text for statusbar
+ if len(self.queue) > 1:
+ label = str(len(self.queue)) + _(' Torrents Queued')
+ else:
+ label = str(len(self.queue)) + _(' Torrent Queued')
+
+ # Add the statusbar items if needed, or just modify the label if they
+ # have already been added.
+ if self.status_item is None:
+ self.status_item = component.get('StatusBar').add_item(
+ icon='view-sort-descending',
+ text=label,
+ callback=self.on_statusbar_click,
+ )
+ else:
+ self.status_item.set_text(label)
+
+ # We return False so the timer stops
+ return False
+
+ def on_statusbar_click(self, widget, event):
+ log.debug('on_statusbar_click')
+ self.run()
+
+ def on_button_remove_clicked(self, widget):
+ selected = self.treeview.get_selection().get_selected()[1]
+ if selected is not None:
+ path = self.liststore.get_value(selected, 1)
+ self.liststore.remove(selected)
+ self.queue.remove(path)
+ self.update_status_bar()
+
+ def on_button_clear_clicked(self, widget):
+ self.liststore.clear()
+ del self.queue[:]
+ self.update_status_bar()
+
+ def on_button_close_clicked(self, widget):
+ self.dialog.hide()
+
+ def on_button_add_clicked(self, widget):
+ # Add all the torrents in the liststore
+ def add_torrent(model, path, _iter, data):
+ torrent_path = deluge.common.decode_bytes(model.get_value(_iter, 1))
+ process_args([torrent_path])
+
+ self.liststore.foreach(add_torrent, None)
+ del self.queue[:]
+ self.dialog.hide()
+ self.update_status_bar()
+
+ def on_chk_autoadd_toggled(self, widget):
+ self.config['autoadd_queued'] = widget.get_active()
diff --git a/deluge/ui/gtk3/removetorrentdialog.py b/deluge/ui/gtk3/removetorrentdialog.py
new file mode 100644
index 0000000..48806a5
--- /dev/null
+++ b/deluge/ui/gtk3/removetorrentdialog.py
@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+
+from gi.repository import Gtk
+
+import deluge.common
+import deluge.component as component
+from deluge.ui.client import client
+
+log = logging.getLogger(__name__)
+
+
+class RemoveTorrentDialog(object):
+ """
+ This class is used to create and show a Remove Torrent Dialog.
+
+ :param torrent_ids: the torrent_ids to remove
+ :type torrent_ids: list of torrent_ids
+
+ :raises TypeError: if `torrent_id` is not a sequence type
+ :raises ValueError: if `torrent_id` contains no torrent_ids or is None
+
+ """
+
+ def __init__(self, torrent_ids, delete_files=False):
+ if not isinstance(torrent_ids, list) and not isinstance(torrent_ids, tuple):
+ raise TypeError('requires a list of torrent_ids')
+
+ if not torrent_ids:
+ raise ValueError('requires a list of torrent_ids')
+
+ self.__torrent_ids = torrent_ids
+
+ self.builder = Gtk.Builder()
+ self.builder.add_from_file(
+ deluge.common.resource_filename(
+ __package__, os.path.join('glade', 'remove_torrent_dialog.ui')
+ )
+ )
+
+ self.__dialog = self.builder.get_object('remove_torrent_dialog')
+ self.__dialog.set_transient_for(component.get('MainWindow').window)
+
+ self.builder.connect_signals(self)
+ self.builder.get_object('delete_files').set_active(delete_files)
+ label_title = self.builder.get_object('label_title')
+ label_torrents = self.builder.get_object('label_torrents')
+ num_torrents = len(self.__torrent_ids)
+ if num_torrents == 1:
+ label_torrents.set_markup(
+ component.get('TorrentView').get_torrent_status(self.__torrent_ids[0])[
+ 'name'
+ ]
+ )
+ else:
+ label_title.set_markup(_('Remove the selected torrents?'))
+ label_torrents.set_markup(_('Total of %s torrents selected') % num_torrents)
+
+ def on_delete_files_toggled(self, widget):
+ self.builder.get_object('warning_label').set_visible(widget.get_active())
+
+ def __remove_torrents(self, remove_data):
+ # Unselect all to avoid issues with the selection changed event
+ component.get('TorrentView').treeview.get_selection().unselect_all()
+
+ def on_removed_finished(errors):
+ if errors:
+ log.info('Error(s) occured when trying to delete torrent(s).')
+ for t_id, e_msg in errors:
+ log.warning('Error removing torrent %s : %s', t_id, e_msg)
+
+ d = client.core.remove_torrents(self.__torrent_ids, remove_data)
+ d.addCallback(on_removed_finished)
+
+ def run(self):
+ """
+ Shows the dialog and awaits for user input. The user can select to
+ remove the torrent(s) from the session with or without their data.
+ """
+ if self.__dialog.run() == Gtk.ResponseType.OK:
+ self.__remove_torrents(self.builder.get_object('delete_files').get_active())
+ self.__dialog.destroy()
diff --git a/deluge/ui/gtk3/sidebar.py b/deluge/ui/gtk3/sidebar.py
new file mode 100644
index 0000000..1d75191
--- /dev/null
+++ b/deluge/ui/gtk3/sidebar.py
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2008 Martijn Voncken <mvoncken@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from gi.repository.Gtk import Label, PolicyType, ScrolledWindow
+
+import deluge.component as component
+from deluge.configmanager import ConfigManager
+
+log = logging.getLogger(__name__)
+
+
+class SideBar(component.Component):
+ """
+ manages the sidebar-tabs.
+ purpose : plugins
+ """
+
+ def __init__(self):
+ component.Component.__init__(self, 'SideBar')
+ main_builder = component.get('MainWindow').get_builder()
+ self.notebook = main_builder.get_object('sidebar_notebook')
+ self.config = ConfigManager('gtk3ui.conf')
+
+ # Tabs holds references to the Tab widgets by their name
+ self.tabs = {}
+
+ # Hide if necessary
+ self.visible(self.config['show_sidebar'])
+
+ def visible(self, visible):
+ self.notebook.show() if visible else self.notebook.hide()
+ self.config['show_sidebar'] = visible
+
+ def add_tab(self, widget, tab_name, label):
+ """Adds a tab object to the notebook."""
+ log.debug('add tab: %s', tab_name)
+ self.tabs[tab_name] = widget
+ scrolled = ScrolledWindow()
+ scrolled.set_policy(PolicyType.AUTOMATIC, PolicyType.AUTOMATIC)
+ scrolled.add(widget)
+ self.notebook.insert_page(scrolled, Label(label=label), -1)
+ scrolled.show_all()
+
+ self.after_update()
+
+ def remove_tab(self, tab_name):
+ """Removes a tab by name."""
+ self.notebook.remove_page(self.notebook.page_num(self.tabs[tab_name]))
+ del self.tabs[tab_name]
+
+ self.after_update()
+
+ def after_update(self):
+ # If there are no tabs visible, then do not show the notebook
+ if len(self.tabs) == 0:
+ self.visible(False)
+
+ # If there is 1 tab, hide the tab-headers
+ if len(self.tabs) == 1:
+ self.notebook.set_show_tabs(False)
+ else:
+ self.notebook.set_show_tabs(True)
diff --git a/deluge/ui/gtk3/status_tab.py b/deluge/ui/gtk3/status_tab.py
new file mode 100644
index 0000000..fab6719
--- /dev/null
+++ b/deluge/ui/gtk3/status_tab.py
@@ -0,0 +1,162 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import logging
+
+import deluge.component as component
+from deluge.common import decode_bytes, fpeer
+from deluge.configmanager import ConfigManager
+
+from .piecesbar import PiecesBar
+from .tab_data_funcs import (
+ fdate_or_never,
+ fpcnt,
+ fratio,
+ fseed_rank_or_dash,
+ fspeed_max,
+ ftime_or_dash,
+ ftotal_sized,
+)
+from .torrentdetails import Tab, TabWidget
+
+log = logging.getLogger(__name__)
+
+
+class StatusTab(Tab):
+ def __init__(self):
+ super(StatusTab, self).__init__('Status', 'status_tab', 'status_tab_label')
+
+ self.config = ConfigManager('gtk3ui.conf')
+
+ self.progressbar = self.main_builder.get_object('progressbar')
+ self.piecesbar = None
+
+ self.add_tab_widget('summary_availability', fratio, ('distributed_copies',))
+ self.add_tab_widget(
+ 'summary_total_downloaded',
+ ftotal_sized,
+ ('all_time_download', 'total_payload_download'),
+ )
+ self.add_tab_widget(
+ 'summary_total_uploaded',
+ ftotal_sized,
+ ('total_uploaded', 'total_payload_upload'),
+ )
+ self.add_tab_widget(
+ 'summary_download_speed',
+ fspeed_max,
+ ('download_payload_rate', 'max_download_speed'),
+ )
+ self.add_tab_widget(
+ 'summary_upload_speed',
+ fspeed_max,
+ ('upload_payload_rate', 'max_upload_speed'),
+ )
+ self.add_tab_widget('summary_seeds', fpeer, ('num_seeds', 'total_seeds'))
+ self.add_tab_widget('summary_peers', fpeer, ('num_peers', 'total_peers'))
+ self.add_tab_widget('summary_eta', ftime_or_dash, ('eta',))
+ self.add_tab_widget('summary_share_ratio', fratio, ('ratio',))
+ self.add_tab_widget('summary_active_time', ftime_or_dash, ('active_time',))
+ self.add_tab_widget('summary_seed_time', ftime_or_dash, ('seeding_time',))
+ self.add_tab_widget(
+ 'summary_seed_rank', fseed_rank_or_dash, ('seed_rank', 'seeding_time')
+ )
+ self.add_tab_widget('progressbar', fpcnt, ('progress', 'state', 'message'))
+ self.add_tab_widget(
+ 'summary_last_seen_complete', fdate_or_never, ('last_seen_complete',)
+ )
+ self.add_tab_widget(
+ 'summary_last_transfer', ftime_or_dash, ('time_since_transfer',)
+ )
+
+ self.config.register_set_function(
+ 'show_piecesbar', self.on_show_piecesbar_config_changed, apply_now=True
+ )
+
+ def update(self):
+ # Get the first selected torrent
+ selected = component.get('TorrentView').get_selected_torrent()
+
+ if not selected:
+ # No torrent is selected in the torrentview
+ self.clear()
+ return
+
+ # Get the torrent status
+ status_keys = self.status_keys
+ if self.config['show_piecesbar']:
+ status_keys.extend(['pieces', 'num_pieces'])
+
+ component.get('SessionProxy').get_torrent_status(
+ selected, status_keys
+ ).addCallback(self._on_get_torrent_status)
+
+ def _on_get_torrent_status(self, status):
+ # Check to see if we got valid data from the core
+ if not status:
+ return
+
+ # Update all the label widgets
+ for widget in self.tab_widgets.values():
+ txt = self.widget_status_as_fstr(widget, status)
+ if decode_bytes(widget[0].get_text()) != txt:
+ widget[0].set_text(txt)
+
+ # Update progress bar seperately as it's a special case (not a label).
+ fraction = status['progress'] / 100
+
+ if self.config['show_piecesbar']:
+ if self.piecesbar.get_fraction() != fraction:
+ self.piecesbar.set_fraction(fraction)
+ if (
+ status['state'] != 'Checking'
+ and self.piecesbar.get_pieces() != status['pieces']
+ ):
+ # Skip pieces assignment if checking torrent.
+ self.piecesbar.set_pieces(status['pieces'], status['num_pieces'])
+ self.piecesbar.update()
+ else:
+ if self.progressbar.get_fraction() != fraction:
+ self.progressbar.set_fraction(fraction)
+
+ def on_show_piecesbar_config_changed(self, key, show):
+ if show:
+ self.show_piecesbar()
+ else:
+ self.hide_piecesbar()
+
+ def show_piecesbar(self):
+ if self.piecesbar is None:
+ self.piecesbar = PiecesBar()
+ self.main_builder.get_object('status_progress_vbox').pack_start(
+ self.piecesbar, False, False, 0
+ )
+ self.tab_widgets['piecesbar'] = TabWidget(
+ self.piecesbar, fpcnt, ('progress', 'state', 'message')
+ )
+ self.piecesbar.show()
+ self.progressbar.hide()
+
+ def hide_piecesbar(self):
+ self.progressbar.show()
+ if self.piecesbar:
+ self.piecesbar.hide()
+ self.tab_widgets.pop('piecesbar', None)
+ self.piecesbar = None
+
+ def clear(self):
+ for widget in self.tab_widgets.values():
+ widget[0].set_text('')
+
+ if self.config['show_piecesbar']:
+ self.piecesbar.clear()
+ else:
+ self.progressbar.set_fraction(0)
diff --git a/deluge/ui/gtk3/statusbar.py b/deluge/ui/gtk3/statusbar.py
new file mode 100644
index 0000000..265e7c8
--- /dev/null
+++ b/deluge/ui/gtk3/statusbar.py
@@ -0,0 +1,578 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import logging
+
+from gi.repository import Gtk
+from gi.repository.GLib import timeout_add
+
+import deluge.component as component
+from deluge.common import fsize, fspeed, get_pixmap
+from deluge.configmanager import ConfigManager
+from deluge.ui.client import client
+
+from .common import build_menu_radio_list
+from .dialogs import OtherDialog
+
+log = logging.getLogger(__name__)
+
+
+class StatusBarItem(object):
+ def __init__(
+ self,
+ image=None,
+ stock=None,
+ icon=None,
+ text=None,
+ markup=False,
+ callback=None,
+ tooltip=None,
+ ):
+ self._widgets = []
+ self._ebox = Gtk.EventBox()
+ self._hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, spacing=3)
+ self._image = Gtk.Image()
+ self._label = Gtk.Label()
+ if image or icon or stock:
+ self._hbox.add(self._image)
+ self._hbox.add(self._label)
+ self._ebox.add(self._hbox)
+
+ # Add image from file or stock
+ if image:
+ self.set_image_from_file(image)
+ if stock:
+ self.set_image_from_stock(stock)
+ if icon:
+ self.set_image_from_icon(icon)
+
+ # Add text
+ if markup:
+ self.set_markup(text)
+ else:
+ self.set_text(text)
+
+ if callback is not None:
+ self.set_callback(callback)
+
+ if tooltip:
+ self.set_tooltip(tooltip)
+
+ self.show_all()
+
+ def set_callback(self, callback):
+ self._ebox.connect('button-press-event', callback)
+
+ def show_all(self):
+ self._ebox.show()
+ self._hbox.show()
+ self._image.show()
+
+ def set_image_from_file(self, image):
+ self._image.set_from_file(image)
+
+ def set_image_from_stock(self, stock):
+ self._image.set_from_stock(stock, Gtk.IconSize.MENU)
+
+ def set_image_from_icon(self, icon):
+ self._image.set_from_icon_name(icon, Gtk.IconSize.MENU)
+
+ def set_text(self, text):
+ if not text:
+ self._label.hide()
+ elif self._label.get_text() != text:
+ self._label.set_text(text)
+ self._label.show()
+
+ def set_markup(self, text):
+ if not text:
+ self._label.hide()
+ elif self._label.get_text() != text:
+ self._label.set_markup(text)
+ self._label.show()
+
+ def set_tooltip(self, tip):
+ if self._ebox.get_tooltip_text() != tip:
+ self._ebox.set_tooltip_text(tip)
+
+ def get_widgets(self):
+ return self._widgets
+
+ def get_eventbox(self):
+ return self._ebox
+
+ def get_text(self):
+ return self._label.get_text()
+
+
+class StatusBar(component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'StatusBar', interval=3)
+ main_builder = component.get('MainWindow').get_builder()
+ self.statusbar = main_builder.get_object('statusbar')
+ self.config = ConfigManager('gtk3ui.conf')
+
+ # Status variables that are updated via callback
+ self.max_connections_global = -1
+ self.num_connections = 0
+ self.max_download_speed = -1.0
+ self.download_rate = ''
+ self.max_upload_speed = -1.0
+ self.upload_rate = ''
+ self.dht_nodes = 0
+ self.dht_status = False
+ self.health = False
+ self.download_protocol_rate = 0.0
+ self.upload_protocol_rate = 0.0
+
+ self.config_value_changed_dict = {
+ 'max_connections_global': self._on_max_connections_global,
+ 'max_download_speed': self._on_max_download_speed,
+ 'max_upload_speed': self._on_max_upload_speed,
+ 'dht': self._on_dht,
+ }
+ self.current_warnings = []
+ # Add hbox to the statusbar after removing the initial label widget
+ self.hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, spacing=10)
+ align = Gtk.Alignment()
+ align.set_padding(2, 0, 3, 0)
+ align.add(self.hbox)
+ frame = self.statusbar.get_children()[0]
+ frame.remove(frame.get_children()[0])
+ frame.add(align)
+ self.statusbar.show_all()
+ # Create the not connected item
+ self.not_connected_item = StatusBarItem(
+ icon='network-offline-symbolic',
+ text=_('Not Connected'),
+ callback=self._on_notconnected_item_clicked,
+ )
+ # Show the not connected status bar
+ self.show_not_connected()
+
+ # Hide if necessary
+ self.visible(self.config['show_statusbar'])
+
+ client.register_event_handler(
+ 'ConfigValueChangedEvent', self.on_configvaluechanged_event
+ )
+
+ def start(self):
+ # Add in images and labels
+ self.remove_item(self.not_connected_item)
+
+ self.connections_item = self.add_item(
+ icon='network-transmit-receive-symbolic',
+ callback=self._on_connection_item_clicked,
+ tooltip=_('Connections (Limit)'),
+ pack_start=True,
+ )
+
+ self.download_item = self.add_item(
+ image=get_pixmap('downloading16.png'),
+ callback=self._on_download_item_clicked,
+ tooltip=_('Download Speed (Limit)'),
+ pack_start=True,
+ )
+
+ self.upload_item = self.add_item(
+ image=get_pixmap('seeding16.png'),
+ callback=self._on_upload_item_clicked,
+ tooltip=_('Upload Speed (Limit)'),
+ pack_start=True,
+ )
+
+ self.traffic_item = self.add_item(
+ image=get_pixmap('traffic16.png'),
+ callback=self._on_traffic_item_clicked,
+ tooltip=_('Protocol Traffic (Down:Up)'),
+ pack_start=True,
+ )
+
+ self.dht_item = StatusBarItem(
+ image=get_pixmap('dht16.png'), tooltip=_('DHT Nodes')
+ )
+
+ self.diskspace_item = self.add_item(
+ icon='drive-harddisk-symbolic',
+ callback=self._on_diskspace_item_clicked,
+ tooltip=_('Free Disk Space'),
+ pack_start=True,
+ )
+
+ self.external_ip_item = self.add_item(
+ tooltip=_('External IP Address'),
+ text=_('<b>IP</b> <small>%s</small>') % _('n/a'),
+ markup=True,
+ pack_start=True,
+ )
+
+ self.health_item = self.add_item(
+ icon='network-error-symbolic',
+ text=_('<b><small>Port Issue</small></b>'),
+ markup=True,
+ tooltip=_('No incoming connections, check port forwarding'),
+ callback=self._on_health_icon_clicked,
+ )
+
+ self.health = False
+
+ def update_config_values(configs):
+ self._on_max_connections_global(configs['max_connections_global'])
+ self._on_max_download_speed(configs['max_download_speed'])
+ self._on_max_upload_speed(configs['max_upload_speed'])
+ self._on_dht(configs['dht'])
+
+ # Get some config values
+ client.core.get_config_values(
+ ['max_connections_global', 'max_download_speed', 'max_upload_speed', 'dht']
+ ).addCallback(update_config_values)
+
+ def stop(self):
+ # When stopped, we just show the not connected thingy
+ try:
+ self.remove_item(self.connections_item)
+ self.remove_item(self.dht_item)
+ self.remove_item(self.download_item)
+ self.remove_item(self.upload_item)
+ self.remove_item(self.not_connected_item)
+ self.remove_item(self.health_item)
+ self.remove_item(self.traffic_item)
+ self.remove_item(self.diskspace_item)
+ self.remove_item(self.external_ip_item)
+ except Exception as ex:
+ log.debug('Unable to remove StatusBar item: %s', ex)
+ self.show_not_connected()
+
+ def visible(self, visible):
+ if visible:
+ self.statusbar.show()
+ else:
+ self.statusbar.hide()
+
+ self.config['show_statusbar'] = visible
+
+ def show_not_connected(self):
+ self.hbox.pack_start(self.not_connected_item.get_eventbox(), False, False, 0)
+
+ def add_item(
+ self,
+ image=None,
+ stock=None,
+ icon=None,
+ text=None,
+ markup=False,
+ callback=None,
+ tooltip=None,
+ pack_start=False,
+ ):
+ """Adds an item to the status bar"""
+ # The return tuple.. we return whatever widgets we add
+ item = StatusBarItem(image, stock, icon, text, markup, callback, tooltip)
+ if pack_start:
+ self.hbox.pack_start(item.get_eventbox(), False, False, 0)
+ else:
+ self.hbox.pack_end(item.get_eventbox(), False, False, 0)
+ return item
+
+ def remove_item(self, item):
+ """Removes an item from the statusbar"""
+ if item.get_eventbox() in self.hbox.get_children():
+ try:
+ self.hbox.remove(item.get_eventbox())
+ except Exception as ex:
+ log.debug('Unable to remove widget: %s', ex)
+
+ def add_timeout_item(
+ self, seconds=3, image=None, stock=None, icon=None, text=None, callback=None
+ ):
+ """Adds an item to the StatusBar for seconds"""
+ item = self.add_item(image, stock, icon, text, callback)
+ # Start a timer to remove this item in seconds
+ timeout_add(seconds * 1000, self.remove_item, item)
+
+ def display_warning(self, text, callback=None):
+ """Displays a warning to the user in the status bar"""
+ if text not in self.current_warnings:
+ item = self.add_item(
+ icon='dialog-warning-symbolic', text=text, callback=callback
+ )
+ self.current_warnings.append(text)
+ timeout_add(3000, self.remove_warning, item)
+
+ def remove_warning(self, item):
+ self.current_warnings.remove(item.get_text())
+ self.remove_item(item)
+
+ def clear_statusbar(self):
+ def remove(child):
+ self.hbox.remove(child)
+
+ self.hbox.foreach(remove)
+
+ def send_status_request(self):
+ # Sends an async request for data from the core
+ keys = [
+ 'num_peers',
+ 'upload_rate',
+ 'download_rate',
+ 'payload_upload_rate',
+ 'payload_download_rate',
+ ]
+
+ if self.dht_status:
+ keys.append('dht_nodes')
+
+ if not self.health:
+ keys.append('has_incoming_connections')
+
+ client.core.get_session_status(keys).addCallback(self._on_get_session_status)
+ client.core.get_free_space().addCallback(self._on_get_free_space)
+ client.core.get_external_ip().addCallback(self._on_get_external_ip)
+
+ def on_configvaluechanged_event(self, key, value):
+ """
+ This is called when we receive a ConfigValueChangedEvent from
+ the core.
+ """
+ if key in self.config_value_changed_dict:
+ self.config_value_changed_dict[key](value)
+
+ def _on_max_connections_global(self, max_connections):
+ self.max_connections_global = max_connections
+ self.update_connections_label()
+
+ def _on_dht(self, value):
+ self.dht_status = value
+ if value:
+ self.hbox.pack_start(self.dht_item.get_eventbox(), False, False, 0)
+ self.send_status_request()
+ else:
+ self.remove_item(self.dht_item)
+
+ def _on_get_session_status(self, status):
+ self.download_rate = fspeed(
+ status['payload_download_rate'], precision=0, shortform=True
+ )
+ self.upload_rate = fspeed(
+ status['payload_upload_rate'], precision=0, shortform=True
+ )
+ self.download_protocol_rate = (
+ status['download_rate'] - status['payload_download_rate']
+ ) // 1024
+ self.upload_protocol_rate = (
+ status['upload_rate'] - status['payload_upload_rate']
+ ) // 1024
+ self.num_connections = status['num_peers']
+ self.update_download_label()
+ self.update_upload_label()
+ self.update_traffic_label()
+ self.update_connections_label()
+
+ if 'dht_nodes' in status:
+ self.dht_nodes = status['dht_nodes']
+ self.update_dht_label()
+
+ if 'has_incoming_connections' in status:
+ self.health = status['has_incoming_connections']
+ if self.health:
+ self.remove_item(self.health_item)
+
+ def _on_get_free_space(self, space):
+ if space >= 0:
+ self.diskspace_item.set_markup(
+ '<small>%s</small>' % fsize(space, shortform=True)
+ )
+ else:
+ self.diskspace_item.set_markup(
+ '<span foreground="red">' + _('Error') + '</span>'
+ )
+
+ def _on_max_download_speed(self, max_download_speed):
+ self.max_download_speed = max_download_speed
+ self.update_download_label()
+
+ def _on_max_upload_speed(self, max_upload_speed):
+ self.max_upload_speed = max_upload_speed
+ self.update_upload_label()
+
+ def _on_get_external_ip(self, external_ip):
+ ip = external_ip if external_ip else _('n/a')
+ self.external_ip_item.set_markup(_('<b>IP</b> <small>%s</small>') % ip)
+
+ def update_connections_label(self):
+ # Set the max connections label
+ if self.max_connections_global < 0:
+ label_string = '%s' % self.num_connections
+ else:
+ label_string = '%s <small>(%s)</small>' % (
+ self.num_connections,
+ self.max_connections_global,
+ )
+
+ self.connections_item.set_markup(label_string)
+
+ if self.num_connections:
+ self.connections_item.set_image_from_icon(
+ 'network-transmit-receive-symbolic'
+ )
+ else:
+ self.connections_item.set_image_from_icon('network-idle-symbolic')
+
+ def update_dht_label(self):
+ # Set the max connections label
+ self.dht_item.set_markup('<small>%s</small>' % (self.dht_nodes))
+
+ def update_download_label(self):
+ # Set the download speed label
+ if self.max_download_speed <= 0:
+ label_string = self.download_rate
+ else:
+ label_string = '%s <small>(%i %s)</small>' % (
+ self.download_rate,
+ self.max_download_speed,
+ _('K/s'),
+ )
+
+ self.download_item.set_markup(label_string)
+
+ def update_upload_label(self):
+ # Set the upload speed label
+ if self.max_upload_speed <= 0:
+ label_string = self.upload_rate
+ else:
+ label_string = '%s <small>(%i %s)</small>' % (
+ self.upload_rate,
+ self.max_upload_speed,
+ _('K/s'),
+ )
+
+ self.upload_item.set_markup(label_string)
+
+ def update_traffic_label(self):
+ label_string = '<small>%i:%i %s</small>' % (
+ self.download_protocol_rate,
+ self.upload_protocol_rate,
+ _('K/s'),
+ )
+ self.traffic_item.set_markup(label_string)
+
+ def update(self):
+ self.send_status_request()
+
+ def set_limit_value(self, widget, core_key):
+ log.debug('_on_set_unlimit_other %s', core_key)
+ other_dialog_info = {
+ 'max_download_speed': (
+ _('Download Speed Limit'),
+ _('Set the maximum download speed'),
+ _('K/s'),
+ 'downloading.svg',
+ self.max_download_speed,
+ ),
+ 'max_upload_speed': (
+ _('Upload Speed Limit'),
+ _('Set the maximum upload speed'),
+ _('K/s'),
+ 'seeding.svg',
+ self.max_upload_speed,
+ ),
+ 'max_connections_global': (
+ _('Incoming Connections'),
+ _('Set the maximum incoming connections'),
+ '',
+ 'network-transmit-receive-symbolic',
+ self.max_connections_global,
+ ),
+ }
+
+ def set_value(value):
+ log.debug('value: %s', value)
+ if value is None:
+ return
+ elif value == 0:
+ value = -1
+ # Set the config in the core
+ if value != getattr(self, core_key):
+ client.core.set_config({core_key: value})
+
+ if widget.get_name() == 'unlimited':
+ set_value(-1)
+ elif widget.get_name() == 'other':
+
+ def dialog_finished(response_id):
+ if response_id == Gtk.ResponseType.OK:
+ set_value(dialog.get_value())
+
+ dialog = OtherDialog(*other_dialog_info[core_key])
+ dialog.run().addCallback(set_value)
+ else:
+ value = widget.get_children()[0].get_text().split(' ')[0]
+ set_value(value)
+
+ def _on_download_item_clicked(self, widget, event):
+ self.menu = build_menu_radio_list(
+ self.config['tray_download_speed_list'],
+ self._on_set_download_speed,
+ self.max_download_speed,
+ _('K/s'),
+ show_notset=True,
+ show_other=True,
+ )
+ self.menu.show_all()
+ self.menu.popup(None, None, None, None, event.button, event.time)
+
+ def _on_set_download_speed(self, widget):
+ log.debug('_on_set_download_speed')
+ self.set_limit_value(widget, 'max_download_speed')
+
+ def _on_upload_item_clicked(self, widget, event):
+ self.menu = build_menu_radio_list(
+ self.config['tray_upload_speed_list'],
+ self._on_set_upload_speed,
+ self.max_upload_speed,
+ _('K/s'),
+ show_notset=True,
+ show_other=True,
+ )
+ self.menu.show_all()
+ self.menu.popup(None, None, None, None, event.button, event.time)
+
+ def _on_set_upload_speed(self, widget):
+ log.debug('_on_set_upload_speed')
+ self.set_limit_value(widget, 'max_upload_speed')
+
+ def _on_connection_item_clicked(self, widget, event):
+ self.menu = build_menu_radio_list(
+ self.config['connection_limit_list'],
+ self._on_set_connection_limit,
+ self.max_connections_global,
+ show_notset=True,
+ show_other=True,
+ )
+ self.menu.show_all()
+ self.menu.popup(None, None, None, None, event.button, event.time)
+
+ def _on_set_connection_limit(self, widget):
+ log.debug('_on_set_connection_limit')
+ self.set_limit_value(widget, 'max_connections_global')
+
+ def _on_health_icon_clicked(self, widget, event):
+ component.get('Preferences').show('network')
+
+ def _on_notconnected_item_clicked(self, widget, event):
+ component.get('ConnectionManager').show()
+
+ def _on_traffic_item_clicked(self, widget, event):
+ component.get('Preferences').show('network')
+
+ def _on_diskspace_item_clicked(self, widget, event):
+ component.get('Preferences').show('downloads')
diff --git a/deluge/ui/gtk3/systemtray.py b/deluge/ui/gtk3/systemtray.py
new file mode 100644
index 0000000..f851f32
--- /dev/null
+++ b/deluge/ui/gtk3/systemtray.py
@@ -0,0 +1,445 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+
+from gi import require_version
+from gi.repository.Gtk import Builder, RadioMenuItem, StatusIcon
+
+import deluge.component as component
+from deluge.common import (
+ fspeed,
+ get_pixmap,
+ osx_check,
+ resource_filename,
+ windows_check,
+)
+from deluge.configmanager import ConfigManager
+from deluge.ui.client import client
+
+from .common import build_menu_radio_list, get_logo
+from .dialogs import OtherDialog
+
+try:
+ require_version('AppIndicator3', '0.1')
+ from gi.repository import AppIndicator3
+except (ValueError, ImportError):
+ AppIndicator3 = None
+
+log = logging.getLogger(__name__)
+
+
+class SystemTray(component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'SystemTray', interval=4)
+ self.mainwindow = component.get('MainWindow')
+ self.config = ConfigManager('gtk3ui.conf')
+ # List of widgets that need to be hidden when not connected to a host
+ self.hide_widget_list = [
+ 'menuitem_add_torrent',
+ 'menuitem_pause_session',
+ 'menuitem_resume_session',
+ 'menuitem_download_limit',
+ 'menuitem_upload_limit',
+ 'menuitem_quitdaemon',
+ 'separatormenuitem1',
+ 'separatormenuitem2',
+ 'separatormenuitem3',
+ 'separatormenuitem4',
+ ]
+ self.config.register_set_function(
+ 'enable_system_tray', self.on_enable_system_tray_set
+ )
+ # bit of a hack to prevent function from doing something on startup
+ self.__enabled_set_once = False
+ self.config.register_set_function(
+ 'enable_appindicator', self.on_enable_appindicator_set
+ )
+
+ self.max_download_speed = -1.0
+ self.download_rate = 0.0
+ self.max_upload_speed = -1.0
+ self.upload_rate = 0.0
+
+ self.config_value_changed_dict = {
+ 'max_download_speed': self._on_max_download_speed,
+ 'max_upload_speed': self._on_max_upload_speed,
+ }
+
+ def enable(self):
+ """Enables the system tray icon."""
+ self.builder = Builder()
+ self.builder.add_from_file(
+ resource_filename(__package__, os.path.join('glade', 'tray_menu.ui'))
+ )
+
+ self.builder.connect_signals(self)
+
+ self.tray_menu = self.builder.get_object('tray_menu')
+
+ if AppIndicator3 and self.config['enable_appindicator']:
+ log.debug('Enabling the Application Indicator...')
+ self.indicator = AppIndicator3.Indicator.new(
+ 'deluge',
+ 'deluge-panel',
+ AppIndicator3.IndicatorCategory.APPLICATION_STATUS,
+ )
+ self.indicator.set_property('title', _('Deluge'))
+
+ # Pass the menu to the Application Indicator
+ self.indicator.set_menu(self.tray_menu)
+
+ # Make sure the status of the Show Window MenuItem is correct
+ self._sig_win_hide = self.mainwindow.window.connect(
+ 'hide', self._on_window_hide
+ )
+ self._sig_win_show = self.mainwindow.window.connect(
+ 'show', self._on_window_show
+ )
+ if self.mainwindow.visible():
+ self.builder.get_object('menuitem_show_deluge').set_active(True)
+ else:
+ self.builder.get_object('menuitem_show_deluge').set_active(False)
+
+ # Show the Application Indicator
+ self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
+
+ else:
+ log.debug('Enabling the system tray icon..')
+ if windows_check() or osx_check():
+ self.tray = StatusIcon.new_from_pixbuf(get_logo(32))
+ else:
+ self.tray = StatusIcon.new_from_icon_name('deluge-panel')
+
+ self.tray.connect('activate', self.on_tray_clicked)
+ self.tray.connect('popup-menu', self.on_tray_popup)
+
+ self.builder.get_object('download-limit-image').set_from_file(
+ get_pixmap('downloading16.png')
+ )
+ self.builder.get_object('upload-limit-image').set_from_file(
+ get_pixmap('seeding16.png')
+ )
+
+ client.register_event_handler(
+ 'ConfigValueChangedEvent', self.config_value_changed
+ )
+ if client.connected():
+ # We're connected so we need to get some values from the core
+ self.__start()
+ else:
+ # Hide menu widgets because we're not connected to a host.
+ for widget in self.hide_widget_list:
+ self.builder.get_object(widget).hide()
+
+ def __start(self):
+ if self.config['enable_system_tray']:
+
+ if self.config['standalone']:
+ try:
+ self.hide_widget_list.remove('menuitem_quitdaemon')
+ self.hide_widget_list.remove('separatormenuitem4')
+ except ValueError:
+ pass
+ self.builder.get_object('menuitem_quitdaemon').hide()
+ self.builder.get_object('separatormenuitem4').hide()
+
+ # Show widgets in the hide list because we've connected to a host
+ for widget in self.hide_widget_list:
+ self.builder.get_object(widget).show()
+
+ # Build the bandwidth speed limit menus
+ self.build_tray_bwsetsubmenu()
+
+ # Get some config values
+ def update_config_values(configs):
+ self._on_max_download_speed(configs['max_download_speed'])
+ self._on_max_upload_speed(configs['max_upload_speed'])
+
+ client.core.get_config_values(
+ ['max_download_speed', 'max_upload_speed']
+ ).addCallback(update_config_values)
+
+ def start(self):
+ self.__start()
+
+ def stop(self):
+ if self.config['enable_system_tray'] and not self.config['enable_appindicator']:
+ try:
+ # Hide widgets in hide list because we're not connected to a host
+ for widget in self.hide_widget_list:
+ self.builder.get_object(widget).hide()
+ except Exception as ex:
+ log.debug('Unable to hide system tray menu widgets: %s', ex)
+
+ self.tray.set_tooltip_text(_('Deluge') + '\n' + _('Not Connected...'))
+
+ def shutdown(self):
+ if self.config['enable_system_tray']:
+ if AppIndicator3 and self.config['enable_appindicator']:
+ self.indicator.set_status(AppIndicator3.IndicatorStatus.PASSIVE)
+ else:
+ self.tray.set_visible(False)
+
+ def send_status_request(self):
+ client.core.get_session_status(
+ ['payload_upload_rate', 'payload_download_rate']
+ ).addCallback(self._on_get_session_status)
+
+ def config_value_changed(self, key, value):
+ """This is called when we received a config_value_changed signal from
+ the core."""
+ if key in self.config_value_changed_dict:
+ self.config_value_changed_dict[key](value)
+
+ def _on_max_download_speed(self, max_download_speed):
+ if self.max_download_speed != max_download_speed:
+ self.max_download_speed = max_download_speed
+ self.build_tray_bwsetsubmenu()
+
+ def _on_max_upload_speed(self, max_upload_speed):
+ if self.max_upload_speed != max_upload_speed:
+ self.max_upload_speed = max_upload_speed
+ self.build_tray_bwsetsubmenu()
+
+ def _on_get_session_status(self, status):
+ self.download_rate = fspeed(status['payload_download_rate'], shortform=True)
+ self.upload_rate = fspeed(status['payload_upload_rate'], shortform=True)
+
+ def update(self):
+ if not self.config['enable_system_tray']:
+ return
+
+ # Tool tip text not available for appindicator
+ if AppIndicator3 and self.config['enable_appindicator']:
+ if self.mainwindow.visible():
+ self.builder.get_object('menuitem_show_deluge').set_active(True)
+ else:
+ self.builder.get_object('menuitem_show_deluge').set_active(False)
+ return
+
+ # Set the tool tip text
+ max_download_speed = self.max_download_speed
+ max_upload_speed = self.max_upload_speed
+
+ if max_download_speed == -1:
+ max_download_speed = _('Unlimited')
+ else:
+ max_download_speed = '%s %s' % (max_download_speed, _('K/s'))
+ if max_upload_speed == -1:
+ max_upload_speed = _('Unlimited')
+ else:
+ max_upload_speed = '%s %s' % (max_upload_speed, _('K/s'))
+
+ msg = '%s\n%s: %s (%s)\n%s: %s (%s)' % (
+ _('Deluge'),
+ _('Down'),
+ self.download_rate,
+ max_download_speed,
+ _('Up'),
+ self.upload_rate,
+ max_upload_speed,
+ )
+
+ # Set the tooltip
+ self.tray.set_tooltip_text(msg)
+
+ self.send_status_request()
+
+ def build_tray_bwsetsubmenu(self):
+ # Create the Download speed list sub-menu
+ submenu_bwdownset = build_menu_radio_list(
+ self.config['tray_download_speed_list'],
+ self.on_tray_setbwdown,
+ self.max_download_speed,
+ _('K/s'),
+ show_notset=True,
+ show_other=True,
+ )
+
+ # Create the Upload speed list sub-menu
+ submenu_bwupset = build_menu_radio_list(
+ self.config['tray_upload_speed_list'],
+ self.on_tray_setbwup,
+ self.max_upload_speed,
+ _('K/s'),
+ show_notset=True,
+ show_other=True,
+ )
+ # Add the sub-menus to the tray menu
+ self.builder.get_object('menuitem_download_limit').set_submenu(
+ submenu_bwdownset
+ )
+ self.builder.get_object('menuitem_upload_limit').set_submenu(submenu_bwupset)
+
+ # Show the sub-menus for all to see
+ submenu_bwdownset.show_all()
+ submenu_bwupset.show_all()
+
+ def disable(self, invert_app_ind_conf=False):
+ """Disables the system tray icon or Appindicator."""
+ try:
+ if invert_app_ind_conf:
+ app_ind_conf = not self.config['enable_appindicator']
+ else:
+ app_ind_conf = self.config['enable_appindicator']
+ if AppIndicator3 and app_ind_conf:
+ if hasattr(self, '_sig_win_hide'):
+ self.mainwindow.window.disconnect(self._sig_win_hide)
+ self.mainwindow.window.disconnect(self._sig_win_show)
+ log.debug('Disabling the application indicator..')
+
+ self.indicator.set_status(AppIndicator3.IndicatorStatus.PASSIVE)
+ del self.indicator
+ else:
+ log.debug('Disabling the system tray icon..')
+ self.tray.set_visible(False)
+ del self.tray
+ del self.builder
+ del self.tray_menu
+ except Exception as ex:
+ log.debug('Unable to disable system tray: %s', ex)
+
+ def blink(self, value):
+ try:
+ self.tray.set_blinking(value)
+ except AttributeError:
+ # If self.tray is not defined then ignore. This happens when the
+ # tray icon is not being used.
+ pass
+
+ def on_enable_system_tray_set(self, key, value):
+ """Called whenever the 'enable_system_tray' config key is modified"""
+ if value:
+ self.enable()
+ else:
+ self.disable()
+
+ def on_enable_appindicator_set(self, key, value):
+ """Called whenever the 'enable_appindicator' config key is modified"""
+ if self.__enabled_set_once:
+ self.disable(True)
+ self.enable()
+ self.__enabled_set_once = True
+
+ def on_tray_clicked(self, icon):
+ """Called when the tray icon is left clicked."""
+ self.blink(False)
+
+ if self.mainwindow.active():
+ self.mainwindow.hide()
+ else:
+ self.mainwindow.present()
+
+ def on_tray_popup(self, status_icon, button, activate_time):
+ """Called when the tray icon is right clicked."""
+ self.blink(False)
+
+ if self.mainwindow.visible():
+ self.builder.get_object('menuitem_show_deluge').set_active(True)
+ else:
+ self.builder.get_object('menuitem_show_deluge').set_active(False)
+
+ popup_function = StatusIcon.position_menu
+ if windows_check() or osx_check():
+ popup_function = None
+ button = 0
+ self.tray_menu.popup(
+ None, None, popup_function, status_icon, button, activate_time
+ )
+
+ def on_menuitem_show_deluge_activate(self, menuitem):
+ log.debug('on_menuitem_show_deluge_activate')
+ if menuitem.get_active() and not self.mainwindow.visible():
+ self.mainwindow.present()
+ elif not menuitem.get_active() and self.mainwindow.visible():
+ self.mainwindow.hide()
+
+ def on_menuitem_add_torrent_activate(self, menuitem):
+ log.debug('on_menuitem_add_torrent_activate')
+ component.get('AddTorrentDialog').show()
+
+ def on_menuitem_pause_session_activate(self, menuitem):
+ log.debug('on_menuitem_pause_session_activate')
+ client.core.pause_session()
+
+ def on_menuitem_resume_session_activate(self, menuitem):
+ log.debug('on_menuitem_resume_session_activate')
+ client.core.resume_session()
+
+ def on_menuitem_quit_activate(self, menuitem):
+ log.debug('on_menuitem_quit_activate')
+ self.mainwindow.quit()
+
+ def on_menuitem_quitdaemon_activate(self, menuitem):
+ log.debug('on_menuitem_quitdaemon_activate')
+ self.mainwindow.quit(shutdown=True)
+
+ def on_tray_setbwdown(self, widget, data=None):
+ if isinstance(widget, RadioMenuItem):
+ # ignore previous radiomenuitem value
+ if not widget.get_active():
+ return
+ self.setbwlimit(
+ widget,
+ _('Download Speed Limit'),
+ _('Set the maximum download speed'),
+ 'max_download_speed',
+ 'tray_download_speed_list',
+ self.max_download_speed,
+ 'downloading.svg',
+ )
+
+ def on_tray_setbwup(self, widget, data=None):
+ if isinstance(widget, RadioMenuItem):
+ # ignore previous radiomenuitem value
+ if not widget.get_active():
+ return
+ self.setbwlimit(
+ widget,
+ _('Upload Speed Limit'),
+ _('Set the maximum upload speed'),
+ 'max_upload_speed',
+ 'tray_upload_speed_list',
+ self.max_upload_speed,
+ 'seeding.svg',
+ )
+
+ def _on_window_hide(self, widget, data=None):
+ """_on_window_hide - update the menuitem's status"""
+ log.debug('_on_window_hide')
+ self.builder.get_object('menuitem_show_deluge').set_active(False)
+
+ def _on_window_show(self, widget, data=None):
+ """_on_window_show - update the menuitem's status"""
+ log.debug('_on_window_show')
+ self.builder.get_object('menuitem_show_deluge').set_active(True)
+
+ def setbwlimit(self, widget, header, text, core_key, ui_key, default, image):
+ """Sets the bandwidth limit based on the user selection."""
+
+ def set_value(value):
+ log.debug('setbwlimit: %s', value)
+ if value is None:
+ return
+ elif value == 0:
+ value = -1
+ # Set the config in the core
+ client.core.set_config({core_key: value})
+
+ if widget.get_name() == 'unlimited':
+ set_value(-1)
+ elif widget.get_name() == 'other':
+ dialog = OtherDialog(header, text, _('K/s'), image, default)
+ dialog.run().addCallback(set_value)
+ else:
+ set_value(widget.get_children()[0].get_text().split(' ')[0])
diff --git a/deluge/ui/gtk3/tab_data_funcs.py b/deluge/ui/gtk3/tab_data_funcs.py
new file mode 100644
index 0000000..6fa0ba5
--- /dev/null
+++ b/deluge/ui/gtk3/tab_data_funcs.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+from deluge.common import fdate, fsize, fspeed, ftime
+from deluge.ui.common import TRACKER_STATUS_TRANSLATION
+
+
+def ftotal_sized(first, second):
+ return '%s (%s)' % (fsize(first, shortform=True), fsize(second, shortform=True))
+
+
+def fratio(value):
+ return ('%.3f' % value).rstrip('0').rstrip('.') if value > 0 else '∞'
+
+
+def fpcnt(value, state, message):
+ state_i18n = _(state)
+ if state not in ('Error', 'Seeding') and value < 100:
+ percent = '{:.2f}'.format(value).rstrip('0').rstrip('.')
+ return _('{state} {percent}%').format(state=state_i18n, percent=percent)
+ elif state == 'Error':
+ return _('{state}: {err_msg}').format(state=state_i18n, err_msg=message)
+ else:
+ return state_i18n
+
+
+def fspeed_max(value, max_value=-1):
+ value = fspeed(value, shortform=True)
+ return '%s (%s %s)' % (value, max_value, _('K/s')) if max_value > -1 else value
+
+
+def fdate_or_never(value):
+ """Display value as date, eg 05/05/08 or Never"""
+ return fdate(value, date_only=True) if value > 0 else _('Never')
+
+
+def fdate_or_dash(value):
+ """Display value as date, eg 05/05/08 or dash"""
+ if value > 0.0:
+ return fdate(value)
+ else:
+ return '-'
+
+
+def ftime_or_dash(value):
+ """Display value as time, eg 2h 30m or dash"""
+ if value > 0:
+ return ftime(value)
+ elif value == 0:
+ return '-'
+ else:
+ return '∞'
+
+
+def fseed_rank_or_dash(seed_rank, seeding_time):
+ """Display value if seeding otherwise dash"""
+
+ if seeding_time > 0:
+ if seed_rank >= 1000:
+ return '%i k' % (seed_rank // 1000)
+ else:
+ return str(seed_rank)
+ else:
+ return '-'
+
+
+def fpieces_num_size(num_pieces, piece_size):
+ return '%s (%s)' % (num_pieces, fsize(piece_size, precision=0))
+
+
+def fcount(value):
+ return '%s' % len(value)
+
+
+def ftranslate(text):
+ if text in TRACKER_STATUS_TRANSLATION:
+ text = _(text)
+ elif text:
+ for status in TRACKER_STATUS_TRANSLATION:
+ if status in text:
+ text = text.replace(status, _(status))
+ break
+ return text
+
+
+def fyes_no(value):
+ """Return Yes or No to bool value"""
+ return _('Yes') if value else _('No')
diff --git a/deluge/ui/gtk3/toolbar.py b/deluge/ui/gtk3/toolbar.py
new file mode 100644
index 0000000..7bc029e
--- /dev/null
+++ b/deluge/ui/gtk3/toolbar.py
@@ -0,0 +1,134 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+from gi.repository.Gtk import SeparatorToolItem, ToolButton
+
+import deluge.component as component
+from deluge.configmanager import ConfigManager
+
+log = logging.getLogger(__name__)
+
+
+class ToolBar(component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'ToolBar')
+ log.debug('ToolBar Init..')
+ mainwindow = component.get('MainWindow')
+ self.main_builder = mainwindow.get_builder()
+ self.toolbar = self.main_builder.get_object('toolbar')
+ self.config = ConfigManager('gtk3ui.conf')
+ # Connect main window Signals #
+ mainwindow.connect_signals(self)
+ self.change_sensitivity = [
+ 'toolbutton_add',
+ 'toolbutton_remove',
+ 'toolbutton_pause',
+ 'toolbutton_resume',
+ 'toolbutton_queue_up',
+ 'toolbutton_queue_down',
+ 'toolbutton_filter',
+ 'find_menuitem',
+ ]
+
+ # Hide if necessary
+ self.visible(self.config['show_toolbar'])
+
+ def start(self):
+ self.main_builder.get_object('toolbutton_connectionmanager').set_visible(
+ not self.config['standalone']
+ )
+
+ for widget in self.change_sensitivity:
+ self.main_builder.get_object(widget).set_sensitive(True)
+
+ def stop(self):
+ for widget in self.change_sensitivity:
+ self.main_builder.get_object(widget).set_sensitive(False)
+
+ def visible(self, visible):
+ if visible:
+ self.toolbar.show()
+ else:
+ self.toolbar.hide()
+
+ self.config['show_toolbar'] = visible
+
+ def add_toolbutton(
+ self, callback, label=None, image=None, stock=None, tooltip=None
+ ):
+ """Adds a toolbutton to the toolbar"""
+ toolbutton = ToolButton()
+ if stock is not None:
+ toolbutton.set_stock_id(stock)
+ if label is not None:
+ toolbutton.set_label(label)
+ if image is not None:
+ toolbutton.set_icon_widget(image)
+ if tooltip is not None:
+ toolbutton.set_tooltip_text(tooltip)
+
+ toolbutton.connect('clicked', callback)
+ self.toolbar.insert(toolbutton, -1)
+ toolbutton.show_all()
+
+ return toolbutton
+
+ def add_separator(self, position=None):
+ """Adds a separator toolitem"""
+ sep = SeparatorToolItem()
+ if position is not None:
+ self.toolbar.insert(sep, position)
+ else:
+ self.toolbar.insert(sep, -1)
+
+ sep.show()
+
+ return sep
+
+ def remove(self, widget):
+ """Removes a widget from the toolbar"""
+ self.toolbar.remove(widget)
+
+ # Callbacks (Uses the menubar's callback) #
+
+ def on_toolbutton_add_clicked(self, data):
+ log.debug('on_toolbutton_add_clicked')
+ component.get('MenuBar').on_menuitem_addtorrent_activate(data)
+
+ def on_toolbutton_remove_clicked(self, data):
+ log.debug('on_toolbutton_remove_clicked')
+ component.get('MenuBar').on_menuitem_remove_activate(data)
+
+ def on_toolbutton_pause_clicked(self, data):
+ log.debug('on_toolbutton_pause_clicked')
+ component.get('MenuBar').on_menuitem_pause_activate(data)
+
+ def on_toolbutton_resume_clicked(self, data):
+ log.debug('on_toolbutton_resume_clicked')
+ component.get('MenuBar').on_menuitem_resume_activate(data)
+
+ def on_toolbutton_preferences_clicked(self, data):
+ log.debug('on_toolbutton_preferences_clicked')
+ component.get('MenuBar').on_menuitem_preferences_activate(data)
+
+ def on_toolbutton_connectionmanager_clicked(self, data):
+ log.debug('on_toolbutton_connectionmanager_clicked')
+ component.get('MenuBar').on_menuitem_connectionmanager_activate(data)
+
+ def on_toolbutton_queue_up_clicked(self, data):
+ log.debug('on_toolbutton_queue_up_clicked')
+ component.get('MenuBar').on_menuitem_queue_up_activate(data)
+
+ def on_toolbutton_queue_down_clicked(self, data):
+ log.debug('on_toolbutton_queue_down_clicked')
+ component.get('MenuBar').on_menuitem_queue_down_activate(data)
diff --git a/deluge/ui/gtk3/torrentdetails.py b/deluge/ui/gtk3/torrentdetails.py
new file mode 100644
index 0000000..29e0193
--- /dev/null
+++ b/deluge/ui/gtk3/torrentdetails.py
@@ -0,0 +1,458 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+
+"""The torrent details component shows info about the selected torrent."""
+from __future__ import unicode_literals
+
+import logging
+from collections import namedtuple
+
+from gi.repository.Gtk import CheckMenuItem, Menu, SeparatorMenuItem
+
+import deluge.component as component
+from deluge.ui.client import client
+
+from .common import load_pickled_state_file, save_pickled_state_file
+
+log = logging.getLogger(__name__)
+
+TabWidget = namedtuple('TabWidget', ('obj', 'func', 'status_keys'))
+
+
+class Tab(object):
+ def __init__(self, name=None, child_widget=None, tab_label=None):
+ self._name = name
+ self.is_visible = True
+ self.position = -1
+ self.weight = -1
+
+ self.main_builder = component.get('MainWindow').get_builder()
+ self._child_widget = (
+ self.main_builder.get_object(child_widget) if child_widget else None
+ )
+ self._tab_label = self.main_builder.get_object(tab_label) if tab_label else None
+
+ self.tab_widgets = {}
+ self.status_keys = []
+
+ def get_name(self):
+ return self._name
+
+ def get_child_widget(self):
+ parent = self._child_widget.get_parent()
+ if parent is not None:
+ parent.remove(self._child_widget)
+
+ return self._child_widget
+
+ def get_tab_label(self):
+ parent = self._tab_label.get_parent()
+ log.debug('parent: %s', parent)
+ if parent is not None:
+ parent.remove(self._tab_label)
+
+ return self._tab_label
+
+ def widget_status_as_fstr(self, widget, status):
+ """Use TabWidget status_key and func to format status string.
+
+ Args:
+ widget (TabWidget): A tuple of widget object, func and status_keys.
+ status (dict): Torrent status dict.
+
+ Returns:
+ str: The formatted status string.
+ """
+ try:
+ if widget.func is None:
+ txt = status[widget.status_keys[0]]
+ else:
+ args = [status[key] for key in widget.status_keys]
+ txt = widget.func(*args)
+ except KeyError as ex:
+ log.warning('Unable to get status value: %s', ex)
+ txt = ''
+ return txt
+
+ def add_tab_widget(self, widget_id, format_func, status_keys):
+ """Create TabWidget item in tab_widgets dictionary.
+
+ Args:
+ widget_id (str): The widget id used to retrieve widget from mainwindow builder.
+ format_func (str): A func name related to widget e.g. string label formatter.
+ status_keys (list): List of status keys to lookup for the widget.
+
+ """
+ widget_obj = self.main_builder.get_object(widget_id)
+ self.status_keys.extend(status_keys)
+ # Store the widget in a tab_widgets dict with name as key for faster lookup.
+ self.tab_widgets[widget_id] = TabWidget(widget_obj, format_func, status_keys)
+
+
+class TorrentDetails(component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'TorrentDetails', interval=2)
+ main_builder = component.get('MainWindow').get_builder()
+
+ self.notebook = main_builder.get_object('torrent_info')
+
+ # This is the menu item we'll attach the tabs checklist menu to
+ self.menu_tabs = main_builder.get_object('menu_tabs')
+
+ self.notebook.connect('switch-page', self._on_switch_page)
+
+ # Tabs holds references to the Tab objects by their name
+ self.tabs = {}
+
+ # Add the default tabs
+ from .status_tab import StatusTab
+ from .details_tab import DetailsTab
+ from .files_tab import FilesTab
+ from .peers_tab import PeersTab
+ from .options_tab import OptionsTab
+ from .trackers_tab import TrackersTab
+
+ default_tabs = {
+ 'Status': StatusTab,
+ 'Details': DetailsTab,
+ 'Files': FilesTab,
+ 'Peers': PeersTab,
+ 'Options': OptionsTab,
+ 'Trackers': TrackersTab,
+ }
+
+ # tab_name, visible
+ default_order = [
+ ('Status', True),
+ ('Details', True),
+ ('Options', True),
+ ('Files', True),
+ ('Peers', True),
+ ('Trackers', True),
+ ]
+
+ self.translate_tabs = {
+ 'All': _('_All'),
+ 'Status': _('_Status'),
+ 'Details': _('_Details'),
+ 'Files': _('Fi_les'),
+ 'Peers': _('_Peers'),
+ 'Options': _('_Options'),
+ 'Trackers': _('_Trackers'),
+ }
+
+ # Get the state from saved file
+ state = self.load_state()
+
+ if state:
+ for item in state:
+ if not isinstance(item, tuple):
+ log.debug('Old tabs.state, using default..')
+ state = None
+ break
+
+ # The state is a list of tab_names in the order they should appear
+ if state is None:
+ # Set the default order
+ state = default_order
+
+ # We need to rename the tab in the state for backwards compat
+ self.state = [
+ (tab_name.replace('Statistics', 'Status'), visible)
+ for tab_name, visible in state
+ ]
+
+ for tab in default_tabs.values():
+ self.add_tab(tab(), generate_menu=False)
+
+ # Generate the checklist menu
+ self.generate_menu()
+
+ self.config = component.get('MainWindow').config
+ self.visible(self.config['show_tabsbar'])
+
+ def tab_insert_position(self, weight):
+ """Returns the position a tab with a given weight should be inserted in"""
+ # Determine insert position based on weight
+ # weights is a list of visible tab names in weight order
+
+ weights = sorted(
+ (tab.weight, name) for name, tab in self.tabs.items() if tab.is_visible
+ )
+
+ log.debug('weights: %s', weights)
+ log.debug('weight of tab: %s', weight)
+
+ position = -1
+ for w, name in weights:
+ if w >= weight:
+ position = self.tabs[name].position
+ log.debug('Found pos %d', position)
+ break
+ return position
+
+ def add_tab(self, tab, generate_menu=True, visible=None):
+ name = tab.get_name()
+
+ # find position of tab in self.state, this is the tab weight
+ weight = None
+ for w, item in enumerate(self.state):
+ if item[0] == name:
+ weight = w
+ if visible is None:
+ visible = item[1]
+ break
+
+ if weight is None:
+ if visible is None:
+ visible = True
+ weight = len(self.state)
+ self.state.append((name, visible))
+
+ tab.weight = weight
+
+ if visible:
+ tab.is_visible = True
+ # add the tab at position guided by the weight
+ insert_pos = self.tab_insert_position(weight)
+ log.debug('Trying to insert tab at %d', insert_pos)
+ pos = self.notebook.insert_page(
+ tab.get_child_widget(), tab.get_tab_label(), insert_pos
+ )
+ log.debug('Tab inserted at %d', pos)
+ tab.position = pos
+ if not self.notebook.get_property('visible'):
+ # If the notebook isn't visible, show it
+ self.visible(True)
+ else:
+ tab.is_visible = False
+
+ self.tabs[name] = tab
+ if name not in self.translate_tabs:
+ self.translate_tabs[name] = _(name)
+
+ self.regenerate_positions()
+ if generate_menu:
+ self.generate_menu()
+
+ def regenerate_positions(self):
+ """Sync the positions in the tab, with the position stored in the tab object"""
+ for tab in self.tabs:
+ page_num = self.notebook.page_num(self.tabs[tab]._child_widget)
+ if page_num > -1:
+ self.tabs[tab].position = page_num
+
+ def remove_tab(self, tab_name):
+ """Removes a tab by name."""
+ self.notebook.remove_page(self.tabs[tab_name].position)
+ del self.tabs[tab_name]
+ self.regenerate_positions()
+ self.generate_menu()
+
+ # If there are no tabs visible, then do not show the notebook
+ if len(self.tabs) == 0:
+ self.visible(False)
+
+ def hide_all_tabs(self):
+ """Hides all tabs"""
+ log.debug('n_pages: %s', self.notebook.get_n_pages())
+ for n in range(self.notebook.get_n_pages() - 1, -1, -1):
+ self.notebook.remove_page(n)
+
+ for tab in self.tabs:
+ self.tabs[tab].is_visible = False
+ log.debug('n_pages: %s', self.notebook.get_n_pages())
+ self.generate_menu()
+ self.visible(False)
+
+ def show_all_tabs(self):
+ """Shows all tabs"""
+ for tab in self.tabs:
+ if not self.tabs[tab].is_visible:
+ self.show_tab(tab, generate_menu=False)
+ self.generate_menu()
+
+ def hide_tab(self, tab_name):
+ """Hides tab by name"""
+ self.tabs[tab_name].is_visible = False
+ self.notebook.remove_page(self.tabs[tab_name].position)
+ self.regenerate_positions()
+ self.generate_menu()
+
+ show = False
+ for name, tab in self.tabs.items():
+ show = show or tab.is_visible
+
+ self.visible(show)
+
+ def show_tab(self, tab_name, generate_menu=True):
+ log.debug(
+ '%s\n%s\n%s',
+ self.tabs[tab_name].get_child_widget(),
+ self.tabs[tab_name].get_tab_label(),
+ self.tabs[tab_name].position,
+ )
+
+ position = self.tab_insert_position(self.tabs[tab_name].weight)
+
+ log.debug('position: %s', position)
+ self.notebook.insert_page(
+ self.tabs[tab_name].get_child_widget(),
+ self.tabs[tab_name].get_tab_label(),
+ position,
+ )
+ self.tabs[tab_name].is_visible = True
+ self.regenerate_positions()
+ if generate_menu:
+ self.generate_menu()
+ self.visible(True)
+
+ def generate_menu(self):
+ """Generates the checklist menu for all the tabs and attaches it"""
+ menu = Menu()
+ # Create 'All' menuitem and a separator
+ menuitem = CheckMenuItem.new_with_mnemonic(self.translate_tabs['All'])
+ menuitem.set_name('All')
+
+ all_tabs = True
+ for key in self.tabs:
+ if not self.tabs[key].is_visible:
+ all_tabs = False
+ break
+ menuitem.set_active(all_tabs)
+ menuitem.connect('toggled', self._on_menuitem_toggled)
+
+ menu.append(menuitem)
+
+ menuitem = SeparatorMenuItem()
+ menu.append(menuitem)
+
+ # Create a list in order of tabs to create menu
+ menuitem_list = []
+ for tab_name in self.tabs:
+ menuitem_list.append((self.tabs[tab_name].weight, tab_name))
+ menuitem_list.sort()
+
+ for pos, name in menuitem_list:
+ menuitem = CheckMenuItem.new_with_mnemonic(self.translate_tabs[name])
+ menuitem.set_name(name)
+ menuitem.set_active(self.tabs[name].is_visible)
+ menuitem.connect('toggled', self._on_menuitem_toggled)
+ menu.append(menuitem)
+
+ self.menu_tabs.set_submenu(menu)
+ self.menu_tabs.show_all()
+
+ def visible(self, visible):
+ self.notebook.show() if visible else self.notebook.hide()
+ self.config['show_tabsbar'] = visible
+
+ def set_tab_visible(self, tab_name, visible):
+ """Sets the tab to visible"""
+ log.debug('set_tab_visible name: %s visible: %s', tab_name, visible)
+ if visible and not self.tabs[tab_name].is_visible:
+ self.show_tab(tab_name)
+ elif not visible and self.tabs[tab_name].is_visible:
+ self.hide_tab(tab_name)
+
+ def start(self):
+ for tab in self.tabs.values():
+ try:
+ tab.start()
+ except AttributeError:
+ pass
+
+ def stop(self):
+ self.clear()
+ for tab in self.tabs.values():
+ try:
+ tab.stop()
+ except AttributeError:
+ pass
+
+ def shutdown(self):
+ # Save the state of the tabs
+ for tab in self.tabs:
+ try:
+ self.tabs[tab].save_state()
+ except AttributeError:
+ pass
+
+ # Save tabs state
+ self.save_state()
+
+ def update(self, page_num=None):
+ if len(component.get('TorrentView').get_selected_torrents()) == 0:
+ # No torrents selected, so just clear
+ self.clear()
+
+ if self.notebook.get_property('visible'):
+ if page_num is None:
+ page_num = self.notebook.get_current_page()
+ try:
+ # Get the tab name
+ name = None
+ for tab in self.tabs:
+ if (
+ self.tabs[tab].position == page_num
+ and self.tabs[tab].is_visible
+ ):
+ name = tab
+ except IndexError:
+ return
+ # Update the tab that is in view
+ if name:
+ self.tabs[name].update()
+
+ def clear(self):
+ # Get the tab name
+ try:
+ page_num = self.notebook.get_current_page()
+ name = None
+ for tab in self.tabs:
+ if self.tabs[tab].position == page_num and self.tabs[tab].is_visible:
+ name = tab
+ if name:
+ self.tabs[name].clear()
+ except Exception as ex:
+ log.debug('Unable to clear torrentdetails: %s', ex)
+
+ def _on_switch_page(self, notebook, page, page_num):
+ self.update(page_num)
+ client.force_call(False)
+
+ def _on_menuitem_toggled(self, widget):
+ # Get the tab name
+ name = widget.get_name()
+ if name == 'All':
+ if widget.get_active():
+ self.show_all_tabs()
+ else:
+ self.hide_all_tabs()
+ return
+
+ self.set_tab_visible(name, widget.get_active())
+
+ def save_state(self):
+ """We save the state, which is basically the tab_index list"""
+ # Update the visiblity status of all tabs
+ # Leave tabs we dont know anything about it the state as they
+ # might come from a plugin
+ for i, (name, visible) in enumerate(self.state):
+ log.debug('Testing name: %s', name)
+ if name in self.tabs:
+ self.state[i] = (name, self.tabs[name].is_visible)
+ log.debug('Set to %s', self.state[i])
+ state = self.state
+
+ save_pickled_state_file('tabs.state', state)
+
+ def load_state(self):
+ return load_pickled_state_file('tabs.state')
diff --git a/deluge/ui/gtk3/torrentview.py b/deluge/ui/gtk3/torrentview.py
new file mode 100644
index 0000000..fcc6edf
--- /dev/null
+++ b/deluge/ui/gtk3/torrentview.py
@@ -0,0 +1,934 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+"""The torrent view component that lists all torrents in the session."""
+from __future__ import unicode_literals
+
+import logging
+from locale import strcoll
+
+from gi.repository.Gdk import ModifierType, keyval_name
+from gi.repository.GLib import idle_add
+from gi.repository.GObject import TYPE_UINT64
+from gi.repository.Gtk import EntryIconPosition
+from twisted.internet import reactor
+
+import deluge.component as component
+from deluge.common import decode_bytes
+from deluge.ui.client import client
+
+from . import torrentview_data_funcs as funcs
+from .common import cmp
+from .listview import ListView
+from .removetorrentdialog import RemoveTorrentDialog
+
+log = logging.getLogger(__name__)
+
+try:
+ CTRL_ALT_MASK = ModifierType.CONTROL_MASK | ModifierType.MOD1_MASK
+except TypeError:
+ # Sphinx AutoDoc has a mock issue with Gdk masks.
+ pass
+
+
+def str_nocase_sort(model, iter1, iter2, data):
+ """Sort string column data using ISO 14651 in lowercase.
+
+ Uses locale.strcoll which (allegedly) uses ISO 14651. Compares first
+ value with second and returns -1, 0, 1 for where it should be placed.
+
+ """
+ v1 = model[iter1][data]
+ v2 = model[iter2][data]
+ # Catch any values of None from model.
+ v1 = v1.lower() if v1 else ''
+ v2 = v2.lower() if v2 else ''
+ return strcoll(v1, v2)
+
+
+def queue_peer_seed_sort_function(v1, v2):
+ if v1 == v2:
+ return 0
+ if v2 < 0:
+ return -1
+ if v1 < 0:
+ return 1
+ if v1 > v2:
+ return 1
+ if v2 > v1:
+ return -1
+
+
+def queue_column_sort(model, iter1, iter2, data):
+ v1 = model[iter1][data]
+ v2 = model[iter2][data]
+ return queue_peer_seed_sort_function(v1, v2)
+
+
+def eta_column_sort(model, iter1, iter2, data):
+ v1 = model[iter1][data]
+ v2 = model[iter2][data]
+ if v1 == v2:
+ return 0
+ if v1 == 0:
+ return 1
+ if v2 == 0:
+ return -1
+ if v1 > v2:
+ return 1
+ if v2 > v1:
+ return -1
+
+
+def seed_peer_column_sort(model, iter1, iter2, data):
+ v1 = model[iter1][data] # num seeds/peers
+ v3 = model[iter2][data] # num seeds/peers
+ if v1 == v3:
+ v2 = model[iter1][data + 1] # total seeds/peers
+ v4 = model[iter2][data + 1] # total seeds/peers
+ return queue_peer_seed_sort_function(v2, v4)
+ return queue_peer_seed_sort_function(v1, v3)
+
+
+def progress_sort(model, iter1, iter2, sort_column_id):
+ progress1 = model[iter1][sort_column_id]
+ progress2 = model[iter2][sort_column_id]
+ # Progress value is equal, so sort on state
+ if progress1 == progress2:
+ state1 = model[iter1][sort_column_id + 1]
+ state2 = model[iter2][sort_column_id + 1]
+ return cmp(state1, state2)
+ return cmp(progress1, progress2)
+
+
+class SearchBox(object):
+ def __init__(self, torrentview):
+ self.torrentview = torrentview
+ mainwindow = component.get('MainWindow')
+ main_builder = mainwindow.get_builder()
+
+ self.visible = False
+ self.search_pending = self.prefiltered = None
+
+ self.search_box = main_builder.get_object('search_box')
+ self.search_torrents_entry = main_builder.get_object('search_torrents_entry')
+ self.close_search_button = main_builder.get_object('close_search_button')
+ self.match_search_button = main_builder.get_object('search_torrents_match')
+ mainwindow.connect_signals(self)
+
+ def show(self):
+ self.visible = True
+ self.search_box.show_all()
+ self.search_torrents_entry.grab_focus()
+
+ def hide(self):
+ self.visible = False
+ self.clear_search()
+ self.search_box.hide()
+ self.search_pending = self.prefiltered = None
+
+ def clear_search(self):
+ if self.search_pending and self.search_pending.active():
+ self.search_pending.cancel()
+
+ if self.prefiltered:
+ filter_column = self.torrentview.columns['filter'].column_indices[0]
+ torrent_id_column = self.torrentview.columns['torrent_id'].column_indices[0]
+ for row in self.torrentview.liststore:
+ torrent_id = row[torrent_id_column]
+
+ if torrent_id in self.prefiltered:
+ # Reset to previous filter state
+ self.prefiltered.pop(self.prefiltered.index(torrent_id))
+ row[filter_column] = not row[filter_column]
+
+ self.prefiltered = None
+
+ self.search_torrents_entry.set_text('')
+ if self.torrentview.filter and 'name' in self.torrentview.filter:
+ self.torrentview.filter.pop('name', None)
+ self.search_pending = reactor.callLater(0.5, self.torrentview.update)
+
+ def set_search_filter(self):
+ if self.search_pending and self.search_pending.active():
+ self.search_pending.cancel()
+
+ if self.torrentview.filter and 'name' in self.torrentview.filter:
+ self.torrentview.filter.pop('name', None)
+
+ elif self.torrentview.filter is None:
+ self.torrentview.filter = {}
+
+ search_string = self.search_torrents_entry.get_text()
+ if not search_string:
+ self.clear_search()
+ else:
+ if self.match_search_button.get_active():
+ search_string += '::match'
+ self.torrentview.filter['name'] = search_string
+ self.prefilter_torrentview()
+
+ def prefilter_torrentview(self):
+ filter_column = self.torrentview.columns['filter'].column_indices[0]
+ torrent_id_column = self.torrentview.columns['torrent_id'].column_indices[0]
+ torrent_name_column = self.torrentview.columns[_('Name')].column_indices[1]
+
+ match_case = self.match_search_button.get_active()
+ if match_case:
+ search_string = self.search_torrents_entry.get_text()
+ else:
+ search_string = self.search_torrents_entry.get_text().lower()
+
+ if self.prefiltered is None:
+ self.prefiltered = []
+
+ for row in self.torrentview.liststore:
+ torrent_id = row[torrent_id_column]
+
+ if torrent_id in self.prefiltered:
+ # Reset to previous filter state
+ self.prefiltered.pop(self.prefiltered.index(torrent_id))
+ row[filter_column] = not row[filter_column]
+
+ if not row[filter_column]:
+ # Row is not visible(filtered out, but not by our filter), skip it
+ continue
+
+ if match_case:
+ torrent_name = row[torrent_name_column]
+ else:
+ torrent_name = row[torrent_name_column].lower()
+
+ if search_string in torrent_name and not row[filter_column]:
+ row[filter_column] = True
+ self.prefiltered.append(torrent_id)
+ elif search_string not in torrent_name and row[filter_column]:
+ row[filter_column] = False
+ self.prefiltered.append(torrent_id)
+
+ def on_close_search_button_clicked(self, widget):
+ self.hide()
+
+ def on_search_filter_toggle(self, widget):
+ if self.visible:
+ self.hide()
+ else:
+ self.show()
+
+ def on_search_torrents_match_toggled(self, widget):
+ if self.search_torrents_entry.get_text():
+ self.set_search_filter()
+ self.search_pending = reactor.callLater(0.7, self.torrentview.update)
+
+ def on_search_torrents_entry_icon_press(self, entry, icon, event):
+ if icon != EntryIconPosition.SECONDARY:
+ return
+ self.clear_search()
+
+ def on_search_torrents_entry_changed(self, widget):
+ self.set_search_filter()
+ self.search_pending = reactor.callLater(0.7, self.torrentview.update)
+
+
+class TorrentView(ListView, component.Component):
+ """TorrentView handles the listing of torrents."""
+
+ def __init__(self):
+ component.Component.__init__(
+ self, 'TorrentView', interval=2, depend=['SessionProxy']
+ )
+ main_builder = component.get('MainWindow').get_builder()
+ # Call the ListView constructor
+ ListView.__init__(
+ self, main_builder.get_object('torrent_view'), 'torrentview.state'
+ )
+ log.debug('TorrentView Init..')
+
+ # If we have gotten the state yet
+ self.got_state = False
+
+ # This is where status updates are put
+ self.status = {}
+
+ # We keep a copy of the previous status to compare for changes
+ self.prev_status = {}
+
+ # Register the columns menu with the listview so it gets updated accordingly.
+ self.register_checklist_menu(main_builder.get_object('menu_columns'))
+
+ # Add the columns to the listview
+ self.add_text_column('torrent_id', hidden=True, unique=True)
+ self.add_bool_column('dirty', hidden=True)
+ self.add_func_column(
+ '#',
+ funcs.cell_data_queue,
+ [int],
+ status_field=['queue'],
+ sort_func=queue_column_sort,
+ )
+ self.add_texticon_column(
+ _('Name'),
+ status_field=['state', 'name'],
+ function=funcs.cell_data_statusicon,
+ sort_func=str_nocase_sort,
+ default_sort=True,
+ )
+ self.add_func_column(
+ _('Size'),
+ funcs.cell_data_size,
+ [TYPE_UINT64],
+ status_field=['total_wanted'],
+ )
+ self.add_func_column(
+ _('Downloaded'),
+ funcs.cell_data_size,
+ [TYPE_UINT64],
+ status_field=['all_time_download'],
+ default=False,
+ )
+ self.add_func_column(
+ _('Uploaded'),
+ funcs.cell_data_size,
+ [TYPE_UINT64],
+ status_field=['total_uploaded'],
+ default=False,
+ )
+ self.add_func_column(
+ _('Remaining'),
+ funcs.cell_data_size,
+ [TYPE_UINT64],
+ status_field=['total_remaining'],
+ default=False,
+ )
+ self.add_progress_column(
+ _('Progress'),
+ status_field=['progress', 'state'],
+ col_types=[float, str],
+ function=funcs.cell_data_progress,
+ sort_func=progress_sort,
+ )
+ self.add_func_column(
+ _('Seeds'),
+ funcs.cell_data_peer,
+ [int, int],
+ status_field=['num_seeds', 'total_seeds'],
+ sort_func=seed_peer_column_sort,
+ default=False,
+ )
+ self.add_func_column(
+ _('Peers'),
+ funcs.cell_data_peer,
+ [int, int],
+ status_field=['num_peers', 'total_peers'],
+ sort_func=seed_peer_column_sort,
+ default=False,
+ )
+ self.add_func_column(
+ _('Seeds:Peers'),
+ funcs.cell_data_ratio_seeds_peers,
+ [float],
+ status_field=['seeds_peers_ratio'],
+ default=False,
+ )
+ self.add_func_column(
+ _('Down Speed'),
+ funcs.cell_data_speed_down,
+ [int],
+ status_field=['download_payload_rate'],
+ )
+ self.add_func_column(
+ _('Up Speed'),
+ funcs.cell_data_speed_up,
+ [int],
+ status_field=['upload_payload_rate'],
+ )
+ self.add_func_column(
+ _('Down Limit'),
+ funcs.cell_data_speed_limit_down,
+ [float],
+ status_field=['max_download_speed'],
+ default=False,
+ )
+ self.add_func_column(
+ _('Up Limit'),
+ funcs.cell_data_speed_limit_up,
+ [float],
+ status_field=['max_upload_speed'],
+ default=False,
+ )
+ self.add_func_column(
+ _('ETA'),
+ funcs.cell_data_time,
+ [int],
+ status_field=['eta'],
+ sort_func=eta_column_sort,
+ )
+ self.add_func_column(
+ _('Ratio'),
+ funcs.cell_data_ratio_ratio,
+ [float],
+ status_field=['ratio'],
+ default=False,
+ )
+ self.add_func_column(
+ _('Avail'),
+ funcs.cell_data_ratio_avail,
+ [float],
+ status_field=['distributed_copies'],
+ default=False,
+ )
+ self.add_func_column(
+ _('Added'),
+ funcs.cell_data_date_added,
+ [int],
+ status_field=['time_added'],
+ default=False,
+ )
+ self.add_func_column(
+ _('Completed'),
+ funcs.cell_data_date_completed,
+ [int],
+ status_field=['completed_time'],
+ default=False,
+ )
+ self.add_func_column(
+ _('Complete Seen'),
+ funcs.cell_data_date_or_never,
+ [int],
+ status_field=['last_seen_complete'],
+ default=False,
+ )
+ self.add_texticon_column(
+ _('Tracker'),
+ function=funcs.cell_data_trackericon,
+ status_field=['tracker_host', 'tracker_host'],
+ default=False,
+ )
+ self.add_text_column(
+ _('Download Folder'), status_field=['download_location'], default=False
+ )
+ self.add_text_column(_('Owner'), status_field=['owner'], default=False)
+ self.add_bool_column(
+ _('Shared'),
+ status_field=['shared'],
+ default=False,
+ tooltip=_('Torrent is shared between other Deluge users or not.'),
+ )
+ self.restore_columns_order_from_state()
+
+ # Set filter to None for now
+ self.filter = None
+
+ # Connect Signals #
+ # Connect to the 'button-press-event' to know when to bring up the
+ # torrent menu popup.
+ self.treeview.connect('button-press-event', self.on_button_press_event)
+ # Connect to the 'key-press-event' to know when the bring up the
+ # torrent menu popup via keypress.
+ self.treeview.connect('key-release-event', self.on_key_press_event)
+ # Connect to the 'changed' event of TreeViewSelection to get selection
+ # changes.
+ self.treeview.get_selection().connect('changed', self.on_selection_changed)
+
+ self.treeview.connect('drag-drop', self.on_drag_drop)
+ self.treeview.connect('drag_data_received', self.on_drag_data_received)
+ self.treeview.connect('key-press-event', self.on_key_press_event)
+ self.treeview.connect('columns-changed', self.on_columns_changed_event)
+
+ self.search_box = SearchBox(self)
+ self.permanent_status_keys = ['owner']
+ self.columns_to_update = []
+
+ def start(self):
+ """Start the torrentview"""
+ # We need to get the core session state to know which torrents are in
+ # the session so we can add them to our list.
+ # Only get the status fields required for the visible columns
+ status_fields = []
+ for listview_column in self.columns.values():
+ if listview_column.column.get_visible():
+ if not listview_column.status_field:
+ continue
+ status_fields.extend(listview_column.status_field)
+ component.get('SessionProxy').get_torrents_status(
+ {}, status_fields
+ ).addCallback(self._on_session_state)
+
+ client.register_event_handler(
+ 'TorrentStateChangedEvent', self.on_torrentstatechanged_event
+ )
+ client.register_event_handler('TorrentAddedEvent', self.on_torrentadded_event)
+ client.register_event_handler(
+ 'TorrentRemovedEvent', self.on_torrentremoved_event
+ )
+ client.register_event_handler('SessionPausedEvent', self.on_sessionpaused_event)
+ client.register_event_handler(
+ 'SessionResumedEvent', self.on_sessionresumed_event
+ )
+ client.register_event_handler(
+ 'TorrentQueueChangedEvent', self.on_torrentqueuechanged_event
+ )
+
+ def _on_session_state(self, state):
+ self.add_rows(state)
+ self.got_state = True
+ # Update the view right away with our status
+ self.status = state
+ self.set_columns_to_update()
+ self.update_view(load_new_list=True)
+ self.select_first_row()
+
+ def stop(self):
+ """Stops the torrentview"""
+ client.deregister_event_handler(
+ 'TorrentStateChangedEvent', self.on_torrentstatechanged_event
+ )
+ client.deregister_event_handler('TorrentAddedEvent', self.on_torrentadded_event)
+ client.deregister_event_handler(
+ 'TorrentRemovedEvent', self.on_torrentremoved_event
+ )
+ client.deregister_event_handler(
+ 'SessionPausedEvent', self.on_sessionpaused_event
+ )
+ client.deregister_event_handler(
+ 'SessionResumedEvent', self.on_sessionresumed_event
+ )
+ client.deregister_event_handler(
+ 'TorrentQueueChangedEvent', self.on_torrentqueuechanged_event
+ )
+
+ if self.treeview.get_selection():
+ self.treeview.get_selection().unselect_all()
+
+ # Save column state before clearing liststore
+ # so column sort details are correctly saved.
+ self.save_state()
+ self.liststore.clear()
+ self.prev_status = {}
+ self.filter = None
+ self.search_box.hide()
+
+ def shutdown(self):
+ """Called when GtkUi is exiting"""
+ pass
+
+ def save_state(self):
+ """
+ Saves the state of the torrent view.
+ """
+ if component.get('MainWindow').visible():
+ ListView.save_state(self, 'torrentview.state')
+
+ def remove_column(self, header):
+ """Removes the column with the name 'header' from the torrentview"""
+ self.save_state()
+ ListView.remove_column(self, header)
+
+ def set_filter(self, filter_dict):
+ """
+ Sets filters for the torrentview..
+
+ see: core.get_torrents_status
+ """
+ search_filter = self.filter and self.filter.get('name', None) or None
+ self.filter = dict(filter_dict) # Copied version of filter_dict.
+ if search_filter and 'name' not in filter_dict:
+ self.filter['name'] = search_filter
+ self.update(select_row=True)
+
+ def set_columns_to_update(self, columns=None):
+ status_keys = []
+ self.columns_to_update = []
+
+ if columns is None:
+ # We need to iterate through all columns
+ columns = list(self.columns)
+
+ # Iterate through supplied list of columns to update
+ for column in columns:
+ # Make sure column is visible and has 'status_field' set.
+ # If not, we can ignore it.
+ if (
+ self.columns[column].column.get_visible() is True
+ and self.columns[column].hidden is False
+ and self.columns[column].status_field is not None
+ ):
+ for field in self.columns[column].status_field:
+ status_keys.append(field)
+ self.columns_to_update.append(column)
+
+ # Remove duplicates
+ self.columns_to_update = list(set(self.columns_to_update))
+ status_keys = list(set(status_keys + self.permanent_status_keys))
+ return status_keys
+
+ def send_status_request(self, columns=None, select_row=False):
+ # Store the 'status_fields' we need to send to core
+ status_keys = self.set_columns_to_update(columns)
+
+ # If there is nothing in status_keys then we must not continue
+ if status_keys is []:
+ return
+
+ # Remove duplicates from status_key list
+ status_keys = list(set(status_keys))
+
+ # Request the statuses for all these torrent_ids, this is async so we
+ # will deal with the return in a signal callback.
+ d = (
+ component.get('SessionProxy')
+ .get_torrents_status(self.filter, status_keys)
+ .addCallback(self._on_get_torrents_status)
+ )
+ if select_row:
+ d.addCallback(self.select_first_row)
+
+ def select_first_row(self, ignored=None):
+ """
+ Set the first row in the list selected if a selection does
+ not already exist
+ """
+ rows = self.treeview.get_selection().get_selected_rows()[1]
+ # Only select row if noe rows are selected
+ if not rows:
+ self.treeview.get_selection().select_path((0,))
+
+ def update(self, select_row=False):
+ """
+ Sends a status request to core and updates the torrent list with the result.
+
+ :param select_row: if the first row in the list should be selected if
+ no rows are already selected.
+ :type select_row: boolean
+
+ """
+ if self.got_state:
+ if (
+ self.search_box.search_pending is not None
+ and self.search_box.search_pending.active()
+ ):
+ # An update request is scheduled, let's wait for that one
+ return
+ # Send a status request
+ idle_add(self.send_status_request, None, select_row)
+
+ def update_view(self, load_new_list=False):
+ """Update the torrent view model with data we've received."""
+ filter_column = self.columns['filter'].column_indices[0]
+ status = self.status
+
+ if not load_new_list:
+ # Freeze notications while updating
+ self.treeview.freeze_child_notify()
+
+ # Get the columns to update from one of the torrents
+ if status:
+ torrent_id = list(status)[0]
+ fields_to_update = []
+ for column in self.columns_to_update:
+ column_index = self.get_column_index(column)
+ for i, status_field in enumerate(self.columns[column].status_field):
+ # Only use columns that the torrent has in the state
+ if status_field in status[torrent_id]:
+ fields_to_update.append((column_index[i], status_field))
+
+ for row in self.liststore:
+ torrent_id = row[self.columns['torrent_id'].column_indices[0]]
+ # We expect the torrent_id to be in status and prev_status,
+ # as it will be as long as the list isn't changed by the user
+
+ torrent_id_in_status = False
+ try:
+ torrent_status = status[torrent_id]
+ torrent_id_in_status = True
+ if torrent_status == self.prev_status[torrent_id]:
+ # The status dict is the same, so do nothing to update for this torrent
+ continue
+ except KeyError:
+ pass
+
+ if not torrent_id_in_status:
+ if row[filter_column] is True:
+ row[filter_column] = False
+ else:
+ if row[filter_column] is False:
+ row[filter_column] = True
+
+ # Find the fields to update
+ to_update = []
+ for i, status_field in fields_to_update:
+ row_value = status[torrent_id][status_field]
+ if decode_bytes(row[i]) != row_value:
+ to_update.append(i)
+ to_update.append(row_value)
+ # Update fields in the liststore
+ if to_update:
+ self.liststore.set(row.iter, *to_update)
+
+ if load_new_list:
+ # Create the model filter. This sets the model for the treeview and enables sorting.
+ self.create_model_filter()
+ else:
+ self.treeview.thaw_child_notify()
+
+ component.get('MenuBar').update_menu()
+ self.prev_status = status
+
+ def _on_get_torrents_status(self, status, select_row=False):
+ """Callback function for get_torrents_status(). 'status' should be a
+ dictionary of {torrent_id: {key, value}}."""
+ self.status = status
+ if self.search_box.prefiltered is not None:
+ self.search_box.prefiltered = None
+
+ if self.status == self.prev_status and self.prev_status:
+ # We do not bother updating since the status hasn't changed
+ self.prev_status = self.status
+ return
+ self.update_view()
+
+ def add_rows(self, torrent_ids):
+ """Accepts a list of torrent_ids to add to self.liststore"""
+ torrent_id_column = self.columns['torrent_id'].column_indices[0]
+ dirty_column = self.columns['dirty'].column_indices[0]
+ filter_column = self.columns['filter'].column_indices[0]
+ for torrent_id in torrent_ids:
+ # Insert a new row to the liststore
+ row = self.liststore.append()
+ self.liststore.set(
+ row,
+ torrent_id_column,
+ torrent_id,
+ dirty_column,
+ True,
+ filter_column,
+ True,
+ )
+
+ def remove_row(self, torrent_id):
+ """Removes a row with torrent_id"""
+ for row in self.liststore:
+ if row[self.columns['torrent_id'].column_indices[0]] == torrent_id:
+ self.liststore.remove(row.iter)
+ # Force an update of the torrentview
+ self.update(select_row=True)
+ break
+
+ def mark_dirty(self, torrent_id=None):
+ for row in self.liststore:
+ if (
+ not torrent_id
+ or row[self.columns['torrent_id'].column_indices[0]] == torrent_id
+ ):
+ # log.debug('marking %s dirty', torrent_id)
+ row[self.columns['dirty'].column_indices[0]] = True
+ if torrent_id:
+ break
+
+ def get_selected_torrent(self):
+ """Returns a torrent_id or None. If multiple torrents are selected,
+ it will return the torrent_id of the first one."""
+ selected = self.get_selected_torrents()
+ if selected:
+ return selected[0]
+ else:
+ return selected
+
+ def get_selected_torrents(self):
+ """Returns a list of selected torrents or None"""
+ torrent_ids = []
+ try:
+ paths = self.treeview.get_selection().get_selected_rows()[1]
+ except AttributeError:
+ # paths is likely None .. so lets return []
+ return []
+ try:
+ for path in paths:
+ try:
+ row = self.treeview.get_model().get_iter(path)
+ except Exception as ex:
+ log.debug('Unable to get iter from path: %s', ex)
+ continue
+
+ child_row = self.treeview.get_model().convert_iter_to_child_iter(row)
+ child_row = (
+ self.treeview.get_model()
+ .get_model()
+ .convert_iter_to_child_iter(child_row)
+ )
+ if self.liststore.iter_is_valid(child_row):
+ try:
+ value = self.liststore.get_value(
+ child_row, self.columns['torrent_id'].column_indices[0]
+ )
+ except Exception as ex:
+ log.debug('Unable to get value from row: %s', ex)
+ else:
+ torrent_ids.append(value)
+ if len(torrent_ids) == 0:
+ return []
+
+ return torrent_ids
+ except (ValueError, TypeError):
+ return []
+
+ def get_torrent_status(self, torrent_id):
+ """Returns data stored in self.status, it may not be complete"""
+ try:
+ return self.status[torrent_id]
+ except KeyError:
+ return {}
+
+ def get_visible_torrents(self):
+ return list(self.status)
+
+ # Callbacks #
+ def on_button_press_event(self, widget, event):
+ """This is a callback for showing the right-click context menu."""
+ log.debug('on_button_press_event')
+ # We only care about right-clicks
+ if event.button == 3 and event.window == self.treeview.get_bin_window():
+ x, y = event.get_coords()
+ path = self.treeview.get_path_at_pos(int(x), int(y))
+ if not path:
+ return
+ row = self.model_filter.get_iter(path[0])
+
+ if self.get_selected_torrents():
+ if (
+ self.model_filter.get_value(
+ row, self.columns['torrent_id'].column_indices[0]
+ )
+ not in self.get_selected_torrents()
+ ):
+ self.treeview.get_selection().unselect_all()
+ self.treeview.get_selection().select_iter(row)
+ else:
+ self.treeview.get_selection().select_iter(row)
+ torrentmenu = component.get('MenuBar').torrentmenu
+ torrentmenu.popup(None, None, None, None, event.button, event.time)
+ return True
+
+ def on_selection_changed(self, treeselection):
+ """This callback is know when the selection has changed."""
+ log.debug('on_selection_changed')
+ component.get('TorrentDetails').update()
+ component.get('MenuBar').update_menu()
+
+ def on_drag_drop(self, widget, drag_context, x, y, timestamp):
+ widget.stop_emission('drag-drop')
+
+ def on_drag_data_received(
+ self, widget, drag_context, x, y, selection_data, info, timestamp
+ ):
+ widget.stop_emission('drag_data_received')
+
+ def on_columns_changed_event(self, treeview):
+ log.debug('Treeview Columns Changed')
+ self.save_state()
+
+ def on_torrentadded_event(self, torrent_id, from_state):
+ self.add_rows([torrent_id])
+ self.update(select_row=True)
+
+ def on_torrentremoved_event(self, torrent_id):
+ self.remove_row(torrent_id)
+
+ def on_torrentstatechanged_event(self, torrent_id, state):
+ # Update the torrents state
+ for row in self.liststore:
+ if torrent_id != row[self.columns['torrent_id'].column_indices[0]]:
+ continue
+
+ for name in self.columns_to_update:
+ if not self.columns[name].status_field:
+ continue
+ for idx, status_field in enumerate(self.columns[name].status_field):
+ # Update all columns that use the state field to current state
+ if status_field != 'state':
+ continue
+ row[self.get_column_index(name)[idx]] = state
+
+ if self.filter.get('state', None) is not None:
+ # We have a filter set, let's see if theres anything to hide
+ # and remove from status
+ if (
+ torrent_id in self.status
+ and self.status[torrent_id]['state'] != state
+ ):
+ row[self.columns['filter'].column_indices[0]] = False
+ del self.status[torrent_id]
+
+ self.mark_dirty(torrent_id)
+
+ def on_sessionpaused_event(self):
+ self.mark_dirty()
+ self.update()
+
+ def on_sessionresumed_event(self):
+ self.mark_dirty()
+ self.update(select_row=True)
+
+ def on_torrentqueuechanged_event(self):
+ self.mark_dirty()
+ self.update()
+
+ # Handle keyboard shortcuts
+ def on_key_press_event(self, widget, event):
+ keyname = keyval_name(event.keyval)
+ if keyname is not None:
+ func = getattr(self, 'keypress_' + keyname.lower(), None)
+ if func:
+ return func(event)
+
+ def keypress_up(self, event):
+ """Handle any Up arrow keypresses"""
+ log.debug('keypress_up')
+ torrents = self.get_selected_torrents()
+ if not torrents:
+ return
+
+ # Move queue position up with Ctrl+Alt or Ctrl+Alt+Shift
+ if event.get_state() & CTRL_ALT_MASK:
+ if event.get_state() & ModifierType.SHIFT_MASK:
+ client.core.queue_top(torrents)
+ else:
+ client.core.queue_up(torrents)
+
+ def keypress_down(self, event):
+ """Handle any Down arrow keypresses"""
+ log.debug('keypress_down')
+ torrents = self.get_selected_torrents()
+ if not torrents:
+ return
+
+ # Move queue position down with Ctrl+Alt or Ctrl+Alt+Shift
+ if event.get_state() & CTRL_ALT_MASK:
+ if event.get_state() & ModifierType.SHIFT_MASK:
+ client.core.queue_bottom(torrents)
+ else:
+ client.core.queue_down(torrents)
+
+ def keypress_delete(self, event):
+ log.debug('keypress_delete')
+ torrents = self.get_selected_torrents()
+ if torrents:
+ if event.get_state() & ModifierType.SHIFT_MASK:
+ RemoveTorrentDialog(torrents, delete_files=True).run()
+ else:
+ RemoveTorrentDialog(torrents).run()
+
+ def keypress_menu(self, event):
+ log.debug('keypress_menu')
+ if not self.get_selected_torrent():
+ return
+
+ torrentmenu = component.get('MenuBar').torrentmenu
+ torrentmenu.popup(None, None, None, None, 3, event.time)
+ return True
diff --git a/deluge/ui/gtk3/torrentview_data_funcs.py b/deluge/ui/gtk3/torrentview_data_funcs.py
new file mode 100644
index 0000000..8bd1f9c
--- /dev/null
+++ b/deluge/ui/gtk3/torrentview_data_funcs.py
@@ -0,0 +1,285 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+import warnings
+from functools import partial
+
+import deluge.common as common
+import deluge.component as component
+
+from .common import (
+ create_blank_pixbuf,
+ get_pixbuf_at_size,
+ icon_alert,
+ icon_checking,
+ icon_downloading,
+ icon_inactive,
+ icon_queued,
+ icon_seeding,
+)
+
+# Holds the info for which status icon to display based on TORRENT_STATE
+ICON_STATE = {
+ 'Allocating': icon_checking,
+ 'Checking': icon_checking,
+ 'Downloading': icon_downloading,
+ 'Seeding': icon_seeding,
+ 'Paused': icon_inactive,
+ 'Error': icon_alert,
+ 'Queued': icon_queued,
+ 'Moving': icon_checking,
+}
+
+# Cache the key used to calculate the current value set for the specific cell
+# renderer. This is much cheaper than fetch the current value and test if
+# it's equal.
+func_last_value = {
+ 'cell_data_time': None,
+ 'cell_data_ratio_seeds_peers': None,
+ 'cell_data_ratio_ratio': None,
+ 'cell_data_ratio_avail': None,
+ 'cell_data_date_added': None,
+ 'cell_data_date_completed': None,
+ 'cell_data_date_or_never': None,
+ 'cell_data_speed_limit_down': None,
+ 'cell_data_speed_limit_up': None,
+ 'cell_data_trackericon': None,
+ 'cell_data_statusicon': None,
+ 'cell_data_queue': None,
+ 'cell_data_progress': [None, None],
+ 'cell_data_peer_progress': None,
+}
+
+
+def cell_data_statusicon(column, cell, model, row, data):
+ """Display text with an icon"""
+ try:
+ state = model.get_value(row, data)
+
+ if func_last_value['cell_data_statusicon'] == state:
+ return
+ func_last_value['cell_data_statusicon'] = state
+
+ icon = ICON_STATE[state]
+
+ # Supress Warning: g_object_set_qdata: assertion `G_IS_OBJECT (object)' failed
+ original_filters = warnings.filters[:]
+ warnings.simplefilter('ignore')
+ try:
+ cell.set_property('pixbuf', icon)
+ finally:
+ warnings.filters = original_filters
+
+ except KeyError:
+ pass
+
+
+def set_tracker_icon(tracker_icon, cell):
+ if tracker_icon:
+ pixbuf = tracker_icon.get_cached_icon()
+ if pixbuf is None:
+ pixbuf = get_pixbuf_at_size(tracker_icon.get_filename(), 16)
+ tracker_icon.set_cached_icon(pixbuf)
+ else:
+ pixbuf = create_blank_pixbuf()
+
+ # Suppress Warning: g_object_set_qdata: assertion `G_IS_OBJECT (object)' failed
+ with warnings.catch_warnings():
+ warnings.simplefilter('ignore')
+ cell.set_property('pixbuf', pixbuf)
+
+
+def cell_data_trackericon(column, cell, model, row, data):
+ host = model[row][data]
+
+ if func_last_value['cell_data_trackericon'] == host:
+ return
+ if host:
+ if not component.get('TrackerIcons').has(host):
+ # Set blank icon while waiting for the icon to be loaded
+ set_tracker_icon(None, cell)
+ component.get('TrackerIcons').fetch(host)
+ func_last_value['cell_data_trackericon'] = None
+ else:
+ set_tracker_icon(component.get('TrackerIcons').get(host), cell)
+ # Only set the last value when we have found the icon
+ func_last_value['cell_data_trackericon'] = host
+ else:
+ set_tracker_icon(None, cell)
+ func_last_value['cell_data_trackericon'] = None
+
+
+def cell_data_progress(column, cell, model, row, data):
+ """Display progress bar with text"""
+ (value, state_str) = model.get(row, *data)
+ if func_last_value['cell_data_progress'][0] != value:
+ func_last_value['cell_data_progress'][0] = value
+ cell.set_property('value', value)
+
+ # Marked for translate states text are in filtertreeview
+ textstr = _(state_str)
+ if state_str not in ('Error', 'Seeding') and value < 100:
+ textstr = '%s %i%%' % (textstr, value)
+
+ if func_last_value['cell_data_progress'][1] != textstr:
+ func_last_value['cell_data_progress'][1] = textstr
+ cell.set_property('text', textstr)
+
+
+def cell_data_peer_progress(column, cell, model, row, data):
+ value = model.get_value(row, data) * 100
+ if func_last_value['cell_data_peer_progress'] != value:
+ func_last_value['cell_data_peer_progress'] = value
+ cell.set_property('value', value)
+ cell.set_property('text', '%i%%' % value)
+
+
+def cell_data_queue(column, cell, model, row, data):
+ value = model.get_value(row, data)
+
+ if func_last_value['cell_data_queue'] == value:
+ return
+ func_last_value['cell_data_queue'] = value
+
+ if value < 0:
+ cell.set_property('text', '')
+ else:
+ cell.set_property('text', str(value + 1))
+
+
+def cell_data_speed(cell, model, row, data):
+ """Display value as a speed, eg. 2 KiB/s"""
+ speed = model.get_value(row, data)
+
+ if speed > 0:
+ speed_str = common.fspeed(speed, shortform=True)
+ cell.set_property(
+ 'markup', '{0} <small>{1}</small>'.format(*tuple(speed_str.split()))
+ )
+ else:
+ cell.set_property('text', '')
+
+
+def cell_data_speed_down(column, cell, model, row, data):
+ """Display value as a speed, eg. 2 KiB/s"""
+ cell_data_speed(cell, model, row, data)
+
+
+def cell_data_speed_up(column, cell, model, row, data):
+ """Display value as a speed, eg. 2 KiB/s"""
+ cell_data_speed(cell, model, row, data)
+
+
+def cell_data_speed_limit(cell, model, row, data, cache_key):
+ """Display value as a speed, eg. 2 KiB/s"""
+ speed = model.get_value(row, data)
+
+ if func_last_value[cache_key] == speed:
+ return
+ func_last_value[cache_key] = speed
+
+ if speed > 0:
+ speed_str = common.fspeed(speed * 1024, shortform=True)
+ cell.set_property(
+ 'markup', '{0} <small>{1}</small>'.format(*tuple(speed_str.split()))
+ )
+ else:
+ cell.set_property('text', '')
+
+
+def cell_data_speed_limit_down(column, cell, model, row, data):
+ cell_data_speed_limit(cell, model, row, data, 'cell_data_speed_limit_down')
+
+
+def cell_data_speed_limit_up(column, cell, model, row, data):
+ cell_data_speed_limit(cell, model, row, data, 'cell_data_speed_limit_up')
+
+
+def cell_data_size(column, cell, model, row, data):
+ """Display value in terms of size, eg. 2 MB"""
+ size = model.get_value(row, data)
+ cell.set_property('text', common.fsize(size, shortform=True))
+
+
+def cell_data_peer(column, cell, model, row, data):
+ """Display values as 'value1 (value2)'"""
+ (first, second) = model.get(row, *data)
+ # Only display a (total) if second is greater than -1
+ if second > -1:
+ cell.set_property('text', '%d (%d)' % (first, second))
+ else:
+ cell.set_property('text', '%d' % first)
+
+
+def cell_data_time(column, cell, model, row, data):
+ """Display value as time, eg 1m10s"""
+ time = model.get_value(row, data)
+ if func_last_value['cell_data_time'] == time:
+ return
+ func_last_value['cell_data_time'] = time
+
+ if time <= 0:
+ time_str = ''
+ else:
+ time_str = common.ftime(time)
+ cell.set_property('text', time_str)
+
+
+def cell_data_ratio(cell, model, row, data, cache_key):
+ """Display value as a ratio with a precision of 2."""
+ ratio = model.get_value(row, data)
+ # Previous value in cell is the same as for this value, so ignore
+ if func_last_value[cache_key] == ratio:
+ return
+ func_last_value[cache_key] = ratio
+ cell.set_property(
+ 'text', '∞' if ratio < 0 else ('%.1f' % ratio).rstrip('0').rstrip('.')
+ )
+
+
+def cell_data_ratio_seeds_peers(column, cell, model, row, data):
+ cell_data_ratio(cell, model, row, data, 'cell_data_ratio_seeds_peers')
+
+
+def cell_data_ratio_ratio(column, cell, model, row, data):
+ cell_data_ratio(cell, model, row, data, 'cell_data_ratio_ratio')
+
+
+def cell_data_ratio_avail(column, cell, model, row, data):
+ cell_data_ratio(cell, model, row, data, 'cell_data_ratio_avail')
+
+
+def cell_data_date(column, cell, model, row, data, key):
+ """Display value as date, eg 05/05/08"""
+ date = model.get_value(row, data)
+
+ if func_last_value[key] == date:
+ return
+ func_last_value[key] = date
+
+ date_str = common.fdate(date, date_only=True) if date > 0 else ''
+ cell.set_property('text', date_str)
+
+
+cell_data_date_added = partial(cell_data_date, key='cell_data_date_added')
+cell_data_date_completed = partial(cell_data_date, key='cell_data_date_completed')
+
+
+def cell_data_date_or_never(column, cell, model, row, data):
+ """Display value as date, eg 05/05/08 or Never"""
+ value = model.get_value(row, data)
+
+ if func_last_value['cell_data_date_or_never'] == value:
+ return
+ func_last_value['cell_data_date_or_never'] = value
+
+ date_str = common.fdate(value, date_only=True) if value > 0 else _('Never')
+ cell.set_property('text', date_str)
diff --git a/deluge/ui/gtk3/trackers_tab.py b/deluge/ui/gtk3/trackers_tab.py
new file mode 100644
index 0000000..d83b995
--- /dev/null
+++ b/deluge/ui/gtk3/trackers_tab.py
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.component as component
+from deluge.common import ftime
+
+from .tab_data_funcs import fcount, ftranslate, fyes_no
+from .torrentdetails import Tab
+
+log = logging.getLogger(__name__)
+
+
+class TrackersTab(Tab):
+ def __init__(self):
+ super(TrackersTab, self).__init__(
+ 'Trackers', 'trackers_tab', 'trackers_tab_label'
+ )
+
+ self.add_tab_widget('summary_next_announce', ftime, ('next_announce',))
+ self.add_tab_widget('summary_tracker', None, ('tracker_host',))
+ self.add_tab_widget('summary_tracker_status', ftranslate, ('tracker_status',))
+ self.add_tab_widget('summary_tracker_total', fcount, ('trackers',))
+ self.add_tab_widget('summary_private', fyes_no, ('private',))
+
+ component.get('MainWindow').connect_signals(self)
+
+ def update(self):
+ # Get the first selected torrent
+ selected = component.get('TorrentView').get_selected_torrents()
+
+ # Only use the first torrent in the list or return if None selected
+ if selected:
+ selected = selected[0]
+ else:
+ self.clear()
+ return
+
+ session = component.get('SessionProxy')
+ session.get_torrent_status(selected, self.status_keys).addCallback(
+ self._on_get_torrent_status
+ )
+
+ def _on_get_torrent_status(self, status):
+ # Check to see if we got valid data from the core
+ if not status:
+ return
+
+ # Update all the tab label widgets
+ for widget in self.tab_widgets.values():
+ txt = self.widget_status_as_fstr(widget, status)
+ if widget.obj.get_text() != txt:
+ widget.obj.set_text(txt)
+
+ def clear(self):
+ for widget in self.tab_widgets.values():
+ widget.obj.set_text('')
+
+ def on_button_edit_trackers_clicked(self, button):
+ torrent_id = component.get('TorrentView').get_selected_torrent()
+ if torrent_id:
+ from .edittrackersdialog import EditTrackersDialog
+
+ dialog = EditTrackersDialog(torrent_id, component.get('MainWindow').window)
+ dialog.run()
diff --git a/deluge/ui/hostlist.py b/deluge/ui/hostlist.py
new file mode 100644
index 0000000..ee4c7df
--- /dev/null
+++ b/deluge/ui/hostlist.py
@@ -0,0 +1,292 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) Calum Lind 2017 <calumlind+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+import uuid
+from socket import gaierror, gethostbyname
+
+from twisted.internet import defer
+
+from deluge.common import get_localhost_auth
+from deluge.config import Config
+from deluge.configmanager import get_config_dir
+from deluge.ui.client import Client, client
+
+log = logging.getLogger(__name__)
+
+DEFAULT_HOST = '127.0.0.1'
+DEFAULT_PORT = 58846
+LOCALHOST = ('127.0.0.1', 'localhost')
+
+
+def default_hostlist():
+ """Create a new hosts key for hostlist with a localhost entry"""
+ host_id = uuid.uuid4().hex
+ username, password = get_localhost_auth()
+ return {'hosts': [(host_id, DEFAULT_HOST, DEFAULT_PORT, username, password)]}
+
+
+def validate_host_info(hostname, port):
+ """Checks that hostname and port are valid.
+
+ Args:
+ hostname (str): The IP or hostname of the deluge daemon.
+ port (int): The port of the deluge daemon.
+
+ Raises:
+ ValueError: Host details are not valid with reason.
+ """
+
+ try:
+ gethostbyname(hostname)
+ except gaierror as ex:
+ raise ValueError('Host %s: %s', hostname, ex.args[1])
+
+ if not isinstance(port, int):
+ raise ValueError('Invalid port. Must be an integer')
+
+
+def migrate_hostlist(old_filename, new_filename):
+ """Check for old hostlist filename and save details to new filename"""
+ old_hostlist = get_config_dir(old_filename)
+ if os.path.isfile(old_hostlist):
+ config_v2 = Config(old_filename, config_dir=get_config_dir())
+ config_v2.save(get_config_dir(new_filename))
+ del config_v2
+
+ try:
+ os.rename(old_hostlist, old_hostlist + '.old')
+ except OSError as ex:
+ log.exception(ex)
+
+ try:
+ os.remove(old_hostlist + '.bak')
+ except OSError:
+ pass
+
+
+def migrate_config_2_to_3(config):
+ """Mirgrates old hostlist config files to new file version"""
+ localclient_username, localclient_password = get_localhost_auth()
+ if not localclient_username:
+ # Nothing to do here, there's no auth file
+ return
+ for idx, (__, host, __, username, __) in enumerate(config['hosts'][:]):
+ if host in LOCALHOST and not username:
+ config['hosts'][idx][3] = localclient_username
+ config['hosts'][idx][4] = localclient_password
+ return config
+
+
+class HostList(object):
+ """This class contains methods for adding, removing and looking up hosts in hostlist.conf."""
+
+ def __init__(self):
+ migrate_hostlist('hostlist.conf.1.2', 'hostlist.conf')
+ self.config = Config(
+ 'hostlist.conf',
+ default_hostlist(),
+ config_dir=get_config_dir(),
+ file_version=3,
+ )
+ self.config.run_converter((1, 2), 3, migrate_config_2_to_3)
+ self.config.save()
+
+ def check_info_exists(self, hostname, port, username, skip_host_id=None):
+ """Check for exising host entries with the same details.
+
+ Args:
+ hostname (str): The IP or hostname of the deluge daemon.
+ port (int): The port of the deluge daemon.
+ username (str): The username to login to the daemon with.
+ skip_host_id (str): A host_id to skip to check if other hosts match details.
+
+ Raises:
+ ValueError: Host details already exist.
+
+ """
+ for host_entry in self.config['hosts']:
+ if (hostname, port, username) == (
+ host_entry[1],
+ host_entry[2],
+ host_entry[3],
+ ):
+ if skip_host_id is not None and skip_host_id == host_entry[0]:
+ continue
+ raise ValueError('Host details already in hostlist')
+
+ def add_host(self, hostname, port, username, password):
+ """Add a new host to hostlist.
+
+ Args:
+ hostname (str): The IP or hostname of the deluge daemon.
+ port (int): The port of the deluge daemon.
+ username (str): The username to login to the daemon with.
+ password (str): The password to login to the daemon with.
+
+ Returns:
+ str: The new host id.
+ """
+ if (
+ not password and not username or username == 'localclient'
+ ) and hostname in LOCALHOST:
+ username, password = get_localhost_auth()
+
+ validate_host_info(hostname, port)
+ self.check_info_exists(hostname, port, username)
+ host_id = uuid.uuid4().hex
+ self.config['hosts'].append((host_id, hostname, port, username, password))
+ self.config.save()
+ return host_id
+
+ def get_host_info(self, host_id):
+ """Get the host details for host_id.
+
+ Args:
+ host_id (str): The host id to get info on.
+
+ Returns:
+ list: A list of (host_id, hostname, port, username).
+
+ """
+ for host_entry in self.config['hosts']:
+ if host_entry[0] == host_id:
+ return host_entry[0:4]
+ else:
+ return []
+
+ def get_hosts_info(self):
+ """Get information of all the hosts in the hostlist.
+
+ Returns:
+ list of lists: Host information in the format [(host_id, hostname, port, username)].
+
+ """
+ return [host_entry[0:4] for host_entry in self.config['hosts']]
+
+ def get_host_status(self, host_id):
+ """Gets the current status (online/offline) of the host
+
+ Args:
+ host_id (str): The host id to check status of.
+
+ Returns:
+ tuple: A tuple of strings (host_id, status, version).
+
+ """
+ status_offline = (host_id, 'Offline', '')
+
+ def on_connect(result, c, host_id):
+ """Successfully connected to a daemon"""
+
+ def on_info(info, c):
+ c.disconnect()
+ return host_id, 'Online', info
+
+ def on_info_fail(reason, c):
+ c.disconnect()
+ return status_offline
+
+ return c.daemon.info().addCallback(on_info, c).addErrback(on_info_fail, c)
+
+ def on_connect_failed(reason, host_id):
+ """Connection to daemon failed"""
+ log.debug('Host status failed for %s: %s', host_id, reason)
+ return status_offline
+
+ try:
+ host_id, host, port, user = self.get_host_info(host_id)
+ except ValueError:
+ log.warning('Problem getting host_id info from hostlist')
+ return status_offline
+
+ try:
+ ip = gethostbyname(host)
+ except gaierror as ex:
+ log.error('Error resolving host %s to ip: %s', host, ex.args[1])
+ return status_offline
+
+ host_conn_info = (
+ ip,
+ port,
+ 'localclient' if not user and host in LOCALHOST else user,
+ )
+ if client.connected() and host_conn_info == client.connection_info():
+ # Currently connected to host_id daemon.
+ def on_info(info, host_id):
+ log.debug('Client connected, query info: %s', info)
+ return host_id, 'Connected', info
+
+ return client.daemon.info().addCallback(on_info, host_id)
+ else:
+ # Attempt to connect to daemon with host_id details.
+ c = Client()
+ d = c.connect(host, port, skip_authentication=True)
+ d.addCallback(on_connect, c, host_id)
+ d.addErrback(on_connect_failed, host_id)
+ return d
+
+ def update_host(self, host_id, hostname, port, username, password):
+ """Update the supplied host id with new connection details.
+
+ Args:
+ host_id (str): The host id to update.
+ hostname (str): The new IP or hostname of the deluge daemon.
+ port (int): The new port of the deluge daemon.
+ username (str): The new username to login to the daemon with.
+ password (str): The new password to login to the daemon with.
+
+ """
+ validate_host_info(hostname, port)
+ self.check_info_exists(hostname, port, username, skip_host_id=host_id)
+
+ if (
+ not password and not username or username == 'localclient'
+ ) and hostname in LOCALHOST:
+ username, password = get_localhost_auth()
+
+ for idx, host_entry in enumerate(self.config['hosts']):
+ if host_id == host_entry[0]:
+ self.config['hosts'][idx] = host_id, hostname, port, username, password
+ self.config.save()
+ return True
+ return False
+
+ def remove_host(self, host_id):
+ """Removes the host entry from hostlist config.
+
+ Args:
+ host_id (str): The host id to remove.
+
+ Returns:
+ bool: True is successfully removed, False otherwise.
+
+ """
+ for host_entry in self.config['hosts']:
+ if host_id == host_entry[0]:
+ self.config['hosts'].remove(host_entry)
+ self.config.save()
+ return True
+ else:
+ return False
+
+ def add_default_host(self):
+ self.add_host(DEFAULT_HOST, DEFAULT_PORT, *get_localhost_auth())
+
+ def connect_host(self, host_id):
+ """Connect to host daemon"""
+ for host_entry in self.config['hosts']:
+ if host_entry[0] == host_id:
+ __, host, port, username, password = host_entry
+ return client.connect(host, port, username, password)
+
+ return defer.fail(Exception('Bad host id'))
diff --git a/deluge/ui/sessionproxy.py b/deluge/ui/sessionproxy.py
new file mode 100644
index 0000000..5af8e79
--- /dev/null
+++ b/deluge/ui/sessionproxy.py
@@ -0,0 +1,278 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2010 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+from __future__ import unicode_literals
+
+import logging
+from time import time
+
+from twisted.internet.defer import maybeDeferred, succeed
+
+import deluge.component as component
+from deluge.ui.client import client
+
+log = logging.getLogger(__name__)
+
+
+class SessionProxy(component.Component):
+ """
+ The SessionProxy component is used to cache session information client-side
+ to reduce the number of RPCs needed to provide a rich user interface.
+
+ It will query the Core for only changes in the status of the torrents
+ and will try to satisfy client requests from the cache.
+
+ """
+
+ def __init__(self):
+ log.debug('SessionProxy init..')
+ component.Component.__init__(self, 'SessionProxy', interval=5)
+
+ # Set the cache time in seconds
+ # This is how long data will be valid before re-fetching from the core
+ self.cache_time = 1.5
+
+ # Hold the torrents' status.. {torrent_id: [time, {status_dict}], ...}
+ self.torrents = {}
+
+ # Holds the time of the last key update.. {torrent_id: {key1, time, ...}, ...}
+ self.cache_times = {}
+
+ def start(self):
+ client.register_event_handler(
+ 'TorrentStateChangedEvent', self.on_torrent_state_changed
+ )
+ client.register_event_handler('TorrentRemovedEvent', self.on_torrent_removed)
+ client.register_event_handler('TorrentAddedEvent', self.on_torrent_added)
+
+ def on_get_session_state(torrent_ids):
+ for torrent_id in torrent_ids:
+ # Let's at least store the torrent ids with empty statuses
+ # so that upcoming queries or status updates don't throw errors.
+ self.torrents.setdefault(torrent_id, [time(), {}])
+ self.cache_times.setdefault(torrent_id, {})
+ return torrent_ids
+
+ return client.core.get_session_state().addCallback(on_get_session_state)
+
+ def stop(self):
+ client.deregister_event_handler(
+ 'TorrentStateChangedEvent', self.on_torrent_state_changed
+ )
+ client.deregister_event_handler('TorrentRemovedEvent', self.on_torrent_removed)
+ client.deregister_event_handler('TorrentAddedEvent', self.on_torrent_added)
+ self.torrents = {}
+
+ def create_status_dict(self, torrent_ids, keys):
+ """
+ Creates a status dict from the cache.
+
+ :param torrent_ids: the torrent_ids
+ :type torrent_ids: list of strings
+ :param keys: the status keys
+ :type keys: list of strings
+
+ :returns: a dict with the status information for the *torrent_ids*
+ :rtype: dict
+
+ """
+ sd = {}
+ keys = set(keys)
+ keys_len = (
+ -1
+ ) # The number of keys for the current cache (not the len of keys_diff_cached)
+ keys_diff_cached = []
+
+ for torrent_id in torrent_ids:
+ try:
+ if keys:
+ sd[torrent_id] = self.torrents[torrent_id][1].copy()
+
+ # Have to remove the keys that weren't requested
+ if len(sd[torrent_id]) == keys_len:
+ # If the number of keys are equal they are the same keys
+ # so we use the cached diff of the keys we need to remove
+ keys_to_remove = keys_diff_cached
+ else:
+ # Not the same keys so create a new diff
+ keys_to_remove = set(sd[torrent_id]) - keys
+ # Update the cached diff
+ keys_diff_cached = keys_to_remove
+ keys_len = len(sd[torrent_id])
+
+ # Usually there are no keys to remove, so it's cheaper with
+ # this if-test than a for-loop with no iterations.
+ if keys_to_remove:
+ for k in keys_to_remove:
+ del sd[torrent_id][k]
+ else:
+ sd[torrent_id] = dict(self.torrents[torrent_id][1])
+ except KeyError:
+ continue
+ return sd
+
+ def get_torrent_status(self, torrent_id, keys):
+ """
+ Get a status dict for one torrent.
+
+ :param torrent_id: the torrent_id
+ :type torrent_id: string
+ :param keys: the status keys
+ :type keys: list of strings
+
+ :returns: a dict of status information
+ :rtype: dict
+
+ """
+ if torrent_id in self.torrents:
+ # Keep track of keys we need to request from the core
+ keys_to_get = []
+ if not keys:
+ keys = list(self.torrents[torrent_id][1])
+
+ for key in keys:
+ if (
+ time() - self.cache_times[torrent_id].get(key, 0.0)
+ > self.cache_time
+ ):
+ keys_to_get.append(key)
+ if not keys_to_get:
+ return succeed(self.create_status_dict([torrent_id], keys)[torrent_id])
+ else:
+ d = client.core.get_torrent_status(torrent_id, keys_to_get, True)
+
+ def on_status(result, torrent_id):
+ t = time()
+ self.torrents[torrent_id][0] = t
+ self.torrents[torrent_id][1].update(result)
+ for key in keys_to_get:
+ self.cache_times[torrent_id][key] = t
+ return self.create_status_dict([torrent_id], keys)[torrent_id]
+
+ return d.addCallback(on_status, torrent_id)
+ else:
+ d = client.core.get_torrent_status(torrent_id, keys, True)
+
+ def on_status(result):
+ if result:
+ t = time()
+ self.torrents[torrent_id] = (t, result)
+ self.cache_times[torrent_id] = {}
+ for key in result:
+ self.cache_times[torrent_id][key] = t
+
+ return result
+
+ return d.addCallback(on_status)
+
+ def get_torrents_status(self, filter_dict, keys):
+ """
+ Get a dict of torrent statuses.
+
+ The filter can take 2 keys, *state* and *id*. The state filter can be
+ one of the torrent states or the special one *Active*. The *id* key is
+ simply a list of torrent_ids.
+
+ :param filter_dict: the filter used for this query
+ :type filter_dict: dict
+ :param keys: the status keys
+ :type keys: list of strings
+
+ :returns: a dict of torrent_ids and their status dicts
+ :rtype: dict
+
+ """
+ # Helper functions and callbacks ---------------------------------------
+ def on_status(result, torrent_ids, keys):
+ # Update the internal torrent status dict with the update values
+ t = time()
+ for key, value in result.items():
+ try:
+ self.torrents[key][0] = t
+ self.torrents[key][1].update(value)
+ for k in value:
+ self.cache_times[key][k] = t
+ except KeyError:
+ # The torrent was removed
+ continue
+
+ # Create the status dict
+ if not torrent_ids:
+ torrent_ids = list(result)
+
+ return self.create_status_dict(torrent_ids, keys)
+
+ def find_torrents_to_fetch(torrent_ids):
+ to_fetch = []
+ t = time()
+ for torrent_id in torrent_ids:
+ torrent = self.torrents[torrent_id]
+ if t - torrent[0] > self.cache_time:
+ to_fetch.append(torrent_id)
+ else:
+ # We need to check if a key is expired
+ for key in keys:
+ if (
+ t - self.cache_times[torrent_id].get(key, 0.0)
+ > self.cache_time
+ ):
+ to_fetch.append(torrent_id)
+ break
+
+ return to_fetch
+
+ # -----------------------------------------------------------------------
+
+ if not filter_dict:
+ # This means we want all the torrents status
+ # We get a list of any torrent_ids with expired status dicts
+ torrents_list = list(self.torrents)
+ to_fetch = find_torrents_to_fetch(torrents_list)
+ if to_fetch:
+ d = client.core.get_torrents_status({'id': to_fetch}, keys, True)
+ return d.addCallback(on_status, torrents_list, keys)
+
+ # Don't need to fetch anything
+ return maybeDeferred(self.create_status_dict, torrents_list, keys)
+
+ if len(filter_dict) == 1 and 'id' in filter_dict:
+ # At this point we should have a filter with just "id" in it
+ to_fetch = find_torrents_to_fetch(filter_dict['id'])
+ if to_fetch:
+ d = client.core.get_torrents_status({'id': to_fetch}, keys, True)
+ return d.addCallback(on_status, filter_dict['id'], keys)
+ else:
+ # Don't need to fetch anything, so just return data from the cache
+ return maybeDeferred(self.create_status_dict, filter_dict['id'], keys)
+ else:
+ # This is a keyworded filter so lets just pass it onto the core
+ # XXX: Add more caching here.
+ d = client.core.get_torrents_status(filter_dict, keys, True)
+ return d.addCallback(on_status, None, keys)
+
+ def on_torrent_state_changed(self, torrent_id, state):
+ if torrent_id in self.torrents:
+ self.torrents[torrent_id][1].setdefault('state', state)
+ self.cache_times.setdefault(torrent_id, {}).update(state=time())
+
+ def on_torrent_added(self, torrent_id, from_state):
+ self.torrents[torrent_id] = [time() - self.cache_time - 1, {}]
+ self.cache_times[torrent_id] = {}
+
+ def on_status(status):
+ self.torrents[torrent_id][1].update(status)
+ t = time()
+ for key in status:
+ self.cache_times[torrent_id][key] = t
+
+ client.core.get_torrent_status(torrent_id, []).addCallback(on_status)
+
+ def on_torrent_removed(self, torrent_id):
+ if torrent_id in self.torrents:
+ del self.torrents[torrent_id]
+ del self.cache_times[torrent_id]
diff --git a/deluge/ui/tracker_icons.py b/deluge/ui/tracker_icons.py
new file mode 100644
index 0000000..c10cd2f
--- /dev/null
+++ b/deluge/ui/tracker_icons.py
@@ -0,0 +1,662 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2010 John Garland <johnnybg+deluge@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+from tempfile import mkstemp
+
+from twisted.internet import defer, threads
+from twisted.web.error import PageRedirect
+from twisted.web.resource import ForbiddenResource, NoResource
+
+from deluge.component import Component
+from deluge.configmanager import get_config_dir
+from deluge.decorators import proxy
+from deluge.httpdownloader import download_file
+
+try:
+ from html.parser import HTMLParser
+ from urllib.parse import urljoin, urlparse
+except ImportError:
+ # PY2 fallback
+ from HTMLParser import HTMLParser
+ from urlparse import urljoin, urlparse # pylint: disable=ungrouped-imports
+
+try:
+ from PIL import Image
+except ImportError:
+ Image = None
+
+log = logging.getLogger(__name__)
+
+
+class TrackerIcon(object):
+ """
+ Represents a tracker's icon
+ """
+
+ def __init__(self, filename):
+ """
+ Initialises a new TrackerIcon object
+
+ :param filename: the filename of the icon
+ :type filename: string
+ """
+ self.filename = os.path.abspath(filename)
+ self.mimetype = extension_to_mimetype(self.filename.rpartition('.')[2])
+ self.data = None
+ self.icon_cache = None
+
+ def __eq__(self, other):
+ """
+ Compares this TrackerIcon with another to determine if they're equal
+
+ :param other: the TrackerIcon to compare to
+ :type other: TrackerIcon
+ :returns: whether or not they're equal
+ :rtype: boolean
+ """
+ return (
+ os.path.samefile(self.filename, other.filename)
+ or self.get_mimetype() == other.get_mimetype()
+ and self.get_data() == other.get_data()
+ )
+
+ def get_mimetype(self):
+ """
+ Returns the mimetype of this TrackerIcon's image
+
+ :returns: the mimetype of the image
+ :rtype: string
+ """
+ return self.mimetype
+
+ def get_data(self):
+ """
+ Returns the TrackerIcon's image data as a string
+
+ :returns: the image data
+ :rtype: string
+ """
+ if not self.data:
+ with open(self.filename, 'rb') as _file:
+ self.data = _file.read()
+ return self.data
+
+ def get_filename(self, full=True):
+ """
+ Returns the TrackerIcon image's filename
+
+ :param full: an (optional) arg to indicate whether or not to
+ return the full path
+ :type full: boolean
+ :returns: the path of the TrackerIcon's image
+ :rtype: string
+ """
+ return self.filename if full else os.path.basename(self.filename)
+
+ def set_cached_icon(self, data):
+ """
+ Set the cached icon data.
+
+ """
+ self.icon_cache = data
+
+ def get_cached_icon(self):
+ """
+ Returns the cached icon data.
+
+ """
+ return self.icon_cache
+
+
+class TrackerIcons(Component):
+ """
+ A TrackerIcon factory class
+ """
+
+ def __init__(self, icon_dir=None, no_icon=None):
+ """
+ Initialises a new TrackerIcons object
+
+ :param icon_dir: the (optional) directory of where to store the icons
+ :type icon_dir: string
+ :param no_icon: the (optional) path name of the icon to show when no icon
+ can be fetched
+ :type no_icon: string
+ """
+ Component.__init__(self, 'TrackerIcons')
+ if not icon_dir:
+ icon_dir = get_config_dir('icons')
+ self.dir = icon_dir
+ if not os.path.isdir(self.dir):
+ os.makedirs(self.dir)
+
+ self.icons = {}
+ for icon in os.listdir(self.dir):
+ if icon != no_icon:
+ host = icon_name_to_host(icon)
+ try:
+ self.icons[host] = TrackerIcon(os.path.join(self.dir, icon))
+ except KeyError:
+ log.warning('invalid icon %s', icon)
+ if no_icon:
+ self.icons[None] = TrackerIcon(no_icon)
+ else:
+ self.icons[None] = None
+ self.icons[''] = self.icons[None]
+
+ self.pending = {}
+ self.redirects = {}
+
+ def has(self, host):
+ """
+ Returns True or False if the tracker icon for the given host exists or not.
+
+ :param host: the host for the TrackerIcon
+ :type host: string
+ :returns: True or False
+ :rtype: bool
+ """
+ return host.lower() in self.icons
+
+ def get(self, host):
+ """
+ Returns a TrackerIcon for the given tracker's host
+ from the icon cache.
+
+ :param host: the host for the TrackerIcon
+ :type host: string
+ :returns: the TrackerIcon for the host
+ :rtype: TrackerIcon
+ """
+ host = host.lower()
+ if host in self.icons:
+ return self.icons[host]
+ else:
+ return None
+
+ def fetch(self, host):
+ """
+ Fetches (downloads) the icon for the given host.
+ When the icon is downloaded a callback is fired
+ on the the queue of callers to this function.
+
+ :param host: the host to obtain the TrackerIcon for
+ :type host: string
+ :returns: a Deferred which fires with the TrackerIcon for the given host
+ :rtype: Deferred
+ """
+ host = host.lower()
+ if host in self.icons:
+ # We already have it, so let's return it
+ d = defer.succeed(self.icons[host])
+ elif host in self.pending:
+ # We're in the middle of getting it
+ # Add ourselves to the waiting list
+ d = defer.Deferred()
+ self.pending[host].append(d)
+ else:
+ # We need to fetch it
+ self.pending[host] = []
+ # Start callback chain
+ d = self.download_page(host)
+ d.addCallbacks(
+ self.on_download_page_complete,
+ self.on_download_page_fail,
+ errbackArgs=(host,),
+ )
+ d.addCallback(self.parse_html_page)
+ d.addCallbacks(
+ self.on_parse_complete, self.on_parse_fail, callbackArgs=(host,)
+ )
+ d.addCallback(self.download_icon, host)
+ d.addCallbacks(
+ self.on_download_icon_complete,
+ self.on_download_icon_fail,
+ callbackArgs=(host,),
+ errbackArgs=(host,),
+ )
+ d.addCallback(self.resize_icon)
+ d.addCallback(self.store_icon, host)
+ return d
+
+ def download_page(self, host, url=None):
+ """
+ Downloads a tracker host's page
+ If no url is provided, it bases the url on the host
+
+ :param host: the tracker host
+ :type host: string
+ :param url: the (optional) url of the host
+ :type url: string
+ :returns: the filename of the tracker host's page
+ :rtype: Deferred
+ """
+ if not url:
+ url = self.host_to_url(host)
+ log.debug('Downloading %s %s', host, url)
+ tmp_fd, tmp_file = mkstemp(prefix='deluge_ticon.')
+ os.close(tmp_fd)
+ return download_file(url, tmp_file, force_filename=True, handle_redirects=False)
+
+ def on_download_page_complete(self, page):
+ """
+ Runs any download clean up functions
+
+ :param page: the page that finished downloading
+ :type page: string
+ :returns: the page that finished downloading
+ :rtype: string
+ """
+ log.debug('Finished downloading %s', page)
+ return page
+
+ def on_download_page_fail(self, f, host):
+ """
+ Recovers from download error
+
+ :param f: the failure that occurred
+ :type f: Failure
+ :param host: the name of the host whose page failed to download
+ :type host: string
+ :returns: a Deferred if recovery was possible
+ else the original failure
+ :rtype: Deferred or Failure
+ """
+ error_msg = f.getErrorMessage()
+ log.debug('Error downloading page: %s', error_msg)
+ d = f
+ if f.check(PageRedirect):
+ # Handle redirect errors
+ location = urljoin(self.host_to_url(host), error_msg.split(' to ')[1])
+ self.redirects[host] = url_to_host(location)
+ d = self.download_page(host, url=location)
+ d.addCallbacks(
+ self.on_download_page_complete,
+ self.on_download_page_fail,
+ errbackArgs=(host,),
+ )
+
+ return d
+
+ @proxy(threads.deferToThread)
+ def parse_html_page(self, page):
+ """
+ Parses the html page for favicons
+
+ :param page: the page to parse
+ :type page: string
+ :returns: a Deferred which callbacks a list of available favicons (url, type)
+ :rtype: Deferred
+ """
+ with open(page, 'r') as _file:
+ parser = FaviconParser()
+ for line in _file:
+ parser.feed(line)
+ if parser.left_head:
+ break
+ parser.close()
+ try:
+ os.remove(page)
+ except OSError as ex:
+ log.warning('Could not remove temp file: %s', ex)
+
+ return parser.get_icons()
+
+ def on_parse_complete(self, icons, host):
+ """
+ Runs any parse clean up functions
+
+ :param icons: the icons that were extracted from the page
+ :type icons: list
+ :param host: the host the icons are for
+ :type host: string
+ :returns: the icons that were extracted from the page
+ :rtype: list
+ """
+ log.debug('Parse Complete, got icons for %s: %s', host, icons)
+ url = self.host_to_url(host)
+ icons = [(urljoin(url, icon), mimetype) for icon, mimetype in icons]
+ log.debug('Icon urls from %s: %s', host, icons)
+ return icons
+
+ def on_parse_fail(self, f):
+ """
+ Recovers from a parse error
+
+ :param f: the failure that occurred
+ :type f: Failure
+ :returns: a Deferred if recovery was possible
+ else the original failure
+ :rtype: Deferred or Failure
+ """
+ log.debug('Error parsing page: %s', f.getErrorMessage())
+ return f
+
+ def download_icon(self, icons, host):
+ """
+ Downloads the first available icon from icons
+
+ :param icons: a list of icons
+ :type icons: list
+ :param host: the tracker's host name
+ :type host: string
+ :returns: a Deferred which fires with the downloaded icon's filename
+ :rtype: Deferred
+ """
+ if len(icons) == 0:
+ raise NoIconsError('empty icons list')
+ (url, mimetype) = icons.pop(0)
+ d = download_file(
+ url,
+ os.path.join(self.dir, host_to_icon_name(host, mimetype)),
+ force_filename=True,
+ )
+ d.addCallback(self.check_icon_is_valid)
+ if icons:
+ d.addErrback(self.on_download_icon_fail, host, icons)
+ return d
+
+ @proxy(threads.deferToThread)
+ def check_icon_is_valid(self, icon_name):
+ """
+ Performs a sanity check on icon_name
+
+ :param icon_name: the name of the icon to check
+ :type icon_name: string
+ :returns: the name of the validated icon
+ :rtype: string
+ :raises: InvalidIconError
+ """
+
+ if Image:
+ try:
+ with Image.open(icon_name):
+ pass
+ except IOError as ex:
+ raise InvalidIconError(ex)
+ else:
+ if not os.path.getsize(icon_name):
+ raise InvalidIconError('empty icon')
+
+ return icon_name
+
+ def on_download_icon_complete(self, icon_name, host):
+ """
+ Runs any download cleanup functions
+
+ :param icon_name: the filename of the icon that finished downloading
+ :type icon_name: string
+ :param host: the host the icon completed to download for
+ :type host: string
+ :returns: the icon that finished downloading
+ :rtype: TrackerIcon
+ """
+ log.debug('Successfully downloaded from %s: %s', host, icon_name)
+ return TrackerIcon(icon_name)
+
+ def on_download_icon_fail(self, f, host, icons=None):
+ """
+ Recovers from a download error
+
+ :param f: the failure that occurred
+ :type f: Failure
+ :param host: the host the icon failed to download for
+ :type host: string
+ :param icons: the (optional) list of remaining icons
+ :type icons: list
+ :returns: a Deferred if recovery was possible
+ else the original failure
+ :rtype: Deferred or Failure
+ """
+ if not icons:
+ icons = []
+ error_msg = f.getErrorMessage()
+ log.debug('Error downloading icon from %s: %s', host, error_msg)
+ d = f
+ if f.check(PageRedirect):
+ # Handle redirect errors
+ location = urljoin(self.host_to_url(host), error_msg.split(' to ')[1])
+ d = self.download_icon(
+ [(location, extension_to_mimetype(location.rpartition('.')[2]))]
+ + icons,
+ host,
+ )
+ if not icons:
+ d.addCallbacks(
+ self.on_download_icon_complete,
+ self.on_download_icon_fail,
+ callbackArgs=(host,),
+ errbackArgs=(host,),
+ )
+ elif f.check(NoResource, ForbiddenResource) and icons:
+ d = self.download_icon(icons, host)
+ elif f.check(NoIconsError):
+ # No icons, try favicon.ico as an act of desperation
+ d = self.download_icon(
+ [
+ (
+ urljoin(self.host_to_url(host), 'favicon.ico'),
+ extension_to_mimetype('ico'),
+ )
+ ],
+ host,
+ )
+ d.addCallbacks(
+ self.on_download_icon_complete,
+ self.on_download_icon_fail,
+ callbackArgs=(host,),
+ errbackArgs=(host,),
+ )
+ else:
+ # No icons :(
+ # Return the None Icon
+ d = self.icons[None]
+
+ return d
+
+ @proxy(threads.deferToThread)
+ def resize_icon(self, icon):
+ """
+ Resizes the given icon to be 16x16 pixels
+
+ :param icon: the icon to resize
+ :type icon: TrackerIcon
+ :returns: the resized icon
+ :rtype: TrackerIcon
+ """
+ # Requires Pillow(PIL) to resize.
+ if icon and Image:
+ filename = icon.get_filename()
+ with Image.open(filename) as img:
+ if img.size > (16, 16):
+ new_filename = filename.rpartition('.')[0] + '.png'
+ img = img.resize((16, 16), Image.ANTIALIAS)
+ img.save(new_filename)
+ if new_filename != filename:
+ os.remove(filename)
+ icon = TrackerIcon(new_filename)
+ return icon
+
+ def store_icon(self, icon, host):
+ """
+ Stores the icon for the given host
+ Callbacks any pending deferreds waiting on this icon
+
+ :param icon: the icon to store
+ :type icon: TrackerIcon or None
+ :param host: the host to store it for
+ :type host: string
+ :returns: the stored icon
+ :rtype: TrackerIcon or None
+ """
+ self.icons[host] = icon
+ for d in self.pending[host]:
+ d.callback(icon)
+ del self.pending[host]
+ return icon
+
+ def host_to_url(self, host):
+ """
+ Given a host, returns the URL to fetch
+
+ :param host: the tracker host
+ :type host: string
+ :returns: the url of the tracker
+ :rtype: string
+ """
+ if host in self.redirects:
+ host = self.redirects[host]
+ return 'http://%s/' % host
+
+
+# ------- HELPER CLASSES ------
+
+
+class FaviconParser(HTMLParser):
+ """
+ A HTMLParser which extracts favicons from a HTML page
+ """
+
+ def __init__(self):
+ self.icons = []
+ self.left_head = False
+ HTMLParser.__init__(self)
+
+ def handle_starttag(self, tag, attrs):
+ if (
+ tag == 'link'
+ and ('rel', 'icon') in attrs
+ or ('rel', 'shortcut icon') in attrs
+ ):
+ href = None
+ icon_type = None
+ for attr, value in attrs:
+ if attr == 'href':
+ href = value
+ elif attr == 'type':
+ icon_type = value
+ if href:
+ try:
+ mimetype = extension_to_mimetype(href.rpartition('.')[2])
+ except KeyError:
+ pass
+ else:
+ icon_type = mimetype
+ if icon_type:
+ self.icons.append((href, icon_type))
+
+ def handle_endtag(self, tag):
+ if tag == 'head':
+ self.left_head = True
+
+ def get_icons(self):
+ """
+ Returns a list of favicons extracted from the HTML page
+
+ :returns: a list of favicons
+ :rtype: list
+ """
+ return self.icons
+
+
+# ------ HELPER FUNCTIONS ------
+
+
+def url_to_host(url):
+ """
+ Given a URL, returns the host it belongs to
+
+ :param url: the URL in question
+ :type url: string
+ :returns: the host of the given URL
+ :rtype: string
+ """
+ return urlparse(url).hostname
+
+
+def host_to_icon_name(host, mimetype):
+ """
+ Given a host, returns the appropriate icon name
+
+ :param host: the host in question
+ :type host: string
+ :param mimetype: the mimetype of the icon
+ :type mimetype: string
+ :returns: the icon's filename
+ :rtype: string
+
+ """
+ return host + '.' + mimetype_to_extension(mimetype)
+
+
+def icon_name_to_host(icon):
+ """
+ Given a host's icon name, returns the host name
+
+ :param icon: the icon name
+ :type icon: string
+ :returns: the host name
+ :rtype: string
+ """
+ return icon.rpartition('.')[0]
+
+
+MIME_MAP = {
+ 'image/gif': 'gif',
+ 'image/jpeg': 'jpg',
+ 'image/png': 'png',
+ 'image/vnd.microsoft.icon': 'ico',
+ 'image/x-icon': 'ico',
+ 'gif': 'image/gif',
+ 'jpg': 'image/jpeg',
+ 'jpeg': 'image/jpeg',
+ 'png': 'image/png',
+ 'ico': 'image/vnd.microsoft.icon',
+}
+
+
+def mimetype_to_extension(mimetype):
+ """
+ Given a mimetype, returns the appropriate filename extension
+
+ :param mimetype: the mimetype
+ :type mimetype: string
+ :returns: the filename extension for the given mimetype
+ :rtype: string
+ :raises KeyError: if given an invalid mimetype
+ """
+ return MIME_MAP[mimetype.lower()]
+
+
+def extension_to_mimetype(extension):
+ """
+ Given a filename extension, returns the appropriate mimetype
+
+ :param extension: the filename extension
+ :type extension: string
+ :returns: the mimetype for the given filename extension
+ :rtype: string
+ :raises KeyError: if given an invalid filename extension
+ """
+ return MIME_MAP[extension.lower()]
+
+
+# ------ EXCEPTIONS ------
+
+
+class NoIconsError(Exception):
+ pass
+
+
+class InvalidIconError(Exception):
+ pass
diff --git a/deluge/ui/ui.py b/deluge/ui/ui.py
new file mode 100644
index 0000000..0986ec7
--- /dev/null
+++ b/deluge/ui/ui.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+
+import deluge.common
+import deluge.configmanager
+import deluge.log
+from deluge.argparserbase import ArgParserBase
+from deluge.i18n import setup_translation
+
+log = logging.getLogger(__name__)
+
+try:
+ from setproctitle import setproctitle
+except ImportError:
+
+ def setproctitle(title):
+ return
+
+
+class UI(object):
+ """
+ Base class for UI implementations.
+
+ """
+
+ cmd_description = """Override with command description"""
+
+ def __init__(self, name, **kwargs):
+ self.__name = name
+ self.ui_args = kwargs.pop('ui_args', None)
+ setup_translation()
+ self.__parser = ArgParserBase(**kwargs)
+
+ def parse_args(self, parser, args=None):
+ options = parser.parse_args(args)
+ if not hasattr(options, 'remaining'):
+ options.remaining = []
+ return options
+
+ @property
+ def name(self):
+ return self.__name
+
+ @property
+ def parser(self):
+ return self.__parser
+
+ @property
+ def options(self):
+ return self.__options
+
+ def start(self, parser=None):
+ args = deluge.common.unicode_argv()[1:]
+ if parser is None:
+ parser = self.parser
+ self.__options = self.parse_args(parser, args)
+
+ setproctitle('deluge-%s' % self.__name)
+
+ log.info('Deluge ui %s', deluge.common.get_version())
+ log.debug('options: %s', self.__options)
+ log.info('Starting %s ui..', self.__name)
diff --git a/deluge/ui/ui_entry.py b/deluge/ui/ui_entry.py
new file mode 100644
index 0000000..71ce837
--- /dev/null
+++ b/deluge/ui/ui_entry.py
@@ -0,0 +1,143 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com>
+# Copyright (C) 2010 Pedro Algarvio <pedro@algarvio.me>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+# The main starting point for the program. This function is called when the
+# user runs the command 'deluge'.
+
+"""Main starting point for Deluge"""
+from __future__ import unicode_literals
+
+import argparse
+import logging
+import os
+import sys
+
+import pkg_resources
+
+import deluge.common
+import deluge.configmanager
+from deluge.argparserbase import ArgParserBase
+from deluge.i18n import setup_translation
+
+DEFAULT_PREFS = {'default_ui': 'gtk'}
+
+AMBIGUOUS_CMD_ARGS = ('-h', '--help', '-v', '-V', '--version')
+
+
+def start_ui():
+ """Entry point for ui script"""
+ setup_translation()
+
+ # Get the registered UI entry points
+ ui_entrypoints = {}
+ for entrypoint in pkg_resources.iter_entry_points('deluge.ui'):
+ try:
+ ui_entrypoints[entrypoint.name] = entrypoint.load()
+ except ImportError:
+ # Unable to load entrypoint so skip adding it.
+ pass
+
+ ui_titles = sorted(ui_entrypoints)
+
+ def add_ui_options_group(_parser):
+ """Function to enable reuse of UI Options group"""
+ group = _parser.add_argument_group(_('UI Options'))
+ group.add_argument(
+ '-s',
+ '--set-default-ui',
+ dest='default_ui',
+ choices=ui_titles,
+ help=_('Set the default UI to be run, when no UI is specified'),
+ )
+ return _parser
+
+ # Setup parser with Common Options and add UI Options group.
+ parser = add_ui_options_group(ArgParserBase())
+
+ # Parse and handle common/process group options
+ options = parser.parse_known_ui_args(sys.argv, withhold=AMBIGUOUS_CMD_ARGS)
+
+ config = deluge.configmanager.ConfigManager('ui.conf', DEFAULT_PREFS)
+ log = logging.getLogger(__name__)
+ log.info('Deluge ui %s', deluge.common.get_version())
+
+ if options.default_ui:
+ config['default_ui'] = options.default_ui
+ config.save()
+ log.info('The default UI has been changed to %s', options.default_ui)
+ sys.exit(0)
+
+ default_ui = config['default_ui']
+ config.save() # Save in case config didn't already exist.
+ del config
+
+ # We have parsed and got the config dir needed to get the default UI
+ # Now create a parser for choosing the UI. We reuse the ui option group for
+ # parsing to succeed and the text displayed to user, but result is not used.
+ parser = add_ui_options_group(ArgParserBase(common_help=True))
+
+ # Create subparser for each registered UI. Empty title is used to remove unwanted positional text.
+ subparsers = parser.add_subparsers(
+ dest='selected_ui',
+ metavar='{%s} [UI args]' % ','.join(ui_titles),
+ title=None,
+ help=_('Alternative UI to launch, with optional ui args \n (default UI: *)'),
+ )
+ for ui in ui_titles:
+ parser_ui = subparsers.add_parser(
+ ui,
+ common_help=False,
+ help=getattr(ui_entrypoints[ui], 'cmd_description', ''),
+ )
+ parser_ui.add_argument('ui_args', nargs=argparse.REMAINDER)
+ # If the UI is set as default, indicate this in help by prefixing with a star.
+ subactions = subparsers._get_subactions()
+ prefix = '*' if ui == default_ui else ' '
+ subactions[-1].metavar = '%s %s' % (prefix, ui)
+
+ # Insert a default UI subcommand unless one of the ambiguous_args are specified
+ parser.set_default_subparser(default_ui, abort_opts=AMBIGUOUS_CMD_ARGS)
+
+ # Only parse known arguments to leave the UIs to show a help message if parsing fails.
+ options, remaining = parser.parse_known_args()
+ selected_ui = options.selected_ui
+ ui_args = remaining + options.ui_args
+
+ # Remove the UI argument before launching the UI.
+ sys.argv.remove(selected_ui)
+
+ try:
+ ui = ui_entrypoints[selected_ui](
+ prog='%s %s' % (os.path.basename(sys.argv[0]), selected_ui), ui_args=ui_args
+ )
+ except KeyError:
+ log.error(
+ 'Unable to find chosen UI: "%s". Please choose a different UI '
+ 'or use "--set-default-ui" to change default UI.',
+ selected_ui,
+ )
+ except ImportError as ex:
+ import traceback
+
+ error_type, error_value, tb = sys.exc_info()
+ stack = traceback.extract_tb(tb)
+ last_frame = stack[-1]
+ if last_frame[0] == __file__:
+ log.error(
+ 'Unable to find chosen UI: "%s". Please choose a different UI '
+ 'or use "--set-default-ui" to change default UI.',
+ selected_ui,
+ )
+ else:
+ log.exception(ex)
+ log.error('Encountered an error launching the request UI: %s', selected_ui)
+ sys.exit(1)
+ else:
+ ui.start()
diff --git a/deluge/ui/web/__init__.py b/deluge/ui/web/__init__.py
new file mode 100644
index 0000000..0be7eed
--- /dev/null
+++ b/deluge/ui/web/__init__.py
@@ -0,0 +1,8 @@
+from __future__ import unicode_literals
+
+from deluge.ui.web.web import Web
+
+
+def start():
+ web = Web()
+ web.start()
diff --git a/deluge/ui/web/auth.py b/deluge/ui/web/auth.py
new file mode 100644
index 0000000..fa95049
--- /dev/null
+++ b/deluge/ui/web/auth.py
@@ -0,0 +1,257 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import hashlib
+import logging
+import os
+import time
+from datetime import datetime, timedelta
+from email.utils import formatdate
+
+from twisted.internet.task import LoopingCall
+
+from deluge.common import AUTH_LEVEL_ADMIN, AUTH_LEVEL_NONE
+from deluge.error import NotAuthorizedError
+from deluge.ui.web.json_api import JSONComponent, export
+
+log = logging.getLogger(__name__)
+
+
+def make_checksum(session_id):
+ checksum = 0
+ for value in [ord(char) for char in session_id]:
+ checksum += value
+ return checksum
+
+
+def get_session_id(session_id):
+ """
+ Checks a session id against its checksum
+ """
+ if not session_id:
+ return None
+
+ try:
+ checksum = int(session_id[-4:])
+ session_id = session_id[:-4]
+
+ if checksum == make_checksum(session_id):
+ return session_id
+ return None
+ except Exception as ex:
+ log.exception(ex)
+ return None
+
+
+def make_expires(timeout):
+ dt = timedelta(seconds=timeout)
+ expires = time.mktime((datetime.now() + dt).timetuple())
+ expires_str = formatdate(timeval=expires, localtime=False, usegmt=True)
+ return expires, expires_str
+
+
+class Auth(JSONComponent):
+ """
+ The component that implements authentification into the JSON interface.
+ """
+
+ def __init__(self, config):
+ super(Auth, self).__init__('Auth')
+ self.worker = LoopingCall(self._clean_sessions)
+ self.config = config
+
+ def start(self):
+ self.worker.start(5)
+
+ def stop(self):
+ self.worker.stop()
+
+ def _clean_sessions(self):
+ now = time.gmtime()
+ for session_id in list(self.config['sessions']):
+ session = self.config['sessions'][session_id]
+
+ if 'expires' not in session:
+ del self.config['sessions'][session_id]
+ continue
+
+ if time.gmtime(session['expires']) < now:
+ del self.config['sessions'][session_id]
+ continue
+
+ def _create_session(self, request, login='admin'):
+ """
+ Creates a new session.
+
+ :param login: the username of the user logging in, currently \
+ only for future use currently.
+ :type login: string
+ """
+ m = hashlib.sha256()
+ m.update(os.urandom(32))
+ session_id = m.hexdigest()
+
+ expires, expires_str = make_expires(self.config['session_timeout'])
+ checksum = str(make_checksum(session_id))
+
+ request.addCookie(
+ b'_session_id',
+ session_id + checksum,
+ path=request.base + b'json',
+ expires=expires_str,
+ )
+
+ log.debug('Creating session for %s', login)
+
+ if isinstance(self.config['sessions'], list):
+ self.config['sessions'] = {}
+
+ self.config['sessions'][session_id] = {
+ 'login': login,
+ 'level': AUTH_LEVEL_ADMIN,
+ 'expires': expires,
+ }
+ return True
+
+ def check_password(self, password):
+ config = self.config
+ if 'pwd_sha1' not in config.config:
+ log.debug('Failed to find config login details.')
+ return False
+
+ s = hashlib.sha1()
+ s.update(config['pwd_salt'].encode('utf8'))
+ s.update(password.encode('utf8'))
+ return s.hexdigest() == config['pwd_sha1']
+
+ def check_request(self, request, method=None, level=None):
+ """
+ Check to ensure that a request is authorised to call the specified
+ method of authentication level.
+
+ :param request: The HTTP request in question
+ :type request: twisted.web.http.Request
+ :param method: Check the specified method
+ :type method: function
+ :param level: Check the specified auth level
+ :type level: integer
+
+ :raises: Exception
+ """
+ cookie_sess_id = request.getCookie(b'_session_id')
+ if cookie_sess_id:
+ session_id = get_session_id(cookie_sess_id.decode())
+ else:
+ session_id = None
+
+ if session_id not in self.config['sessions']:
+ auth_level = AUTH_LEVEL_NONE
+ session_id = None
+ else:
+ session = self.config['sessions'][session_id]
+ auth_level = session['level']
+ expires, expires_str = make_expires(self.config['session_timeout'])
+ session['expires'] = expires
+
+ _session_id = request.getCookie(b'_session_id')
+ request.addCookie(
+ b'_session_id',
+ _session_id,
+ path=request.base + b'json',
+ expires=expires_str.encode('utf8'),
+ )
+
+ if method:
+ if not hasattr(method, '_json_export'):
+ raise Exception('Not an exported method')
+
+ method_level = getattr(method, '_json_auth_level')
+ if method_level is None:
+ raise Exception('Method has no auth level')
+
+ level = method_level
+
+ if level is None:
+ raise Exception('No level specified to check against')
+
+ request.auth_level = auth_level
+ request.session_id = session_id
+
+ if auth_level < level:
+ raise NotAuthorizedError(auth_level, level)
+
+ def _change_password(self, new_password):
+ """
+ Change the password. This is to allow the UI to change/reset a
+ password.
+
+ :param new_password: the password to change to
+ :type new_password: string
+ """
+ log.debug('Changing password')
+ salt = hashlib.sha1(os.urandom(32)).hexdigest()
+ s = hashlib.sha1(salt.encode('utf-8'))
+ s.update(new_password.encode('utf8'))
+ self.config['pwd_salt'] = salt
+ self.config['pwd_sha1'] = s.hexdigest()
+ return True
+
+ @export
+ def change_password(self, old_password, new_password):
+ """
+ Change the password.
+
+ :param old_password: the current password
+ :type old_password: string
+ :param new_password: the password to change to
+ :type new_password: string
+ """
+ if not self.check_password(old_password):
+ return False
+ return self._change_password(new_password)
+
+ @export(AUTH_LEVEL_NONE)
+ def check_session(self, session_id=None):
+ """
+ Check a session to see if it's still valid.
+
+ :returns: True if the session is valid, False if not.
+ :rtype: booleon
+ """
+ return __request__.session_id is not None
+
+ @export
+ def delete_session(self):
+ """
+ Removes a session.
+
+ :param session_id: the id for the session to remove
+ :type session_id: string
+ """
+ del self.config['sessions'][__request__.session_id]
+ return True
+
+ @export(AUTH_LEVEL_NONE)
+ def login(self, password):
+ """
+ Test a password to see if it's valid.
+
+ :param password: the password to test
+ :type password: string
+ :returns: a session id or False
+ :rtype: string or False
+ """
+ if self.check_password(password):
+ log.info('Login success (ClientIP %s)', __request__.getClientIP())
+ return self._create_session(__request__)
+ else:
+ log.error('Login failed (ClientIP %s)', __request__.getClientIP())
+ return False
diff --git a/deluge/ui/web/common.py b/deluge/ui/web/common.py
new file mode 100644
index 0000000..475f335
--- /dev/null
+++ b/deluge/ui/web/common.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import gettext
+
+from mako.template import Template as MakoTemplate
+
+from deluge.common import PY2, get_version
+
+
+def _(text):
+ text_local = gettext.gettext(text)
+ if PY2:
+ return text_local.decode('utf-8')
+ return text_local
+
+
+def escape(text):
+ """
+ Used by gettext.js template to escape any translated language strings that
+ might contain newlines or quotes as they would break the script.
+ """
+ text = text.replace("'", "\\'")
+ text = text.replace('\r\n', '\\n')
+ text = text.replace('\r', '\\n')
+ text = text.replace('\n', '\\n')
+ return text
+
+
+class Template(MakoTemplate):
+ """
+ A template that adds some built-ins to the rendering
+ """
+
+ builtins = {'_': _, 'escape': escape, 'version': get_version()}
+
+ def render(self, *args, **data):
+ data.update(self.builtins)
+ rendered = MakoTemplate.render_unicode(self, *args, **data)
+ return rendered.encode('utf-8')
diff --git a/deluge/ui/web/css/deluge.css b/deluge/ui/web/css/deluge.css
new file mode 100644
index 0000000..b9fa03e
--- /dev/null
+++ b/deluge/ui/web/css/deluge.css
@@ -0,0 +1,568 @@
+html,
+body {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+ margin: 0;
+ padding: 0;
+ border: 0 none;
+ overflow: hidden;
+ height: 100%;
+}
+
+input {
+ color: Black;
+}
+
+/* remove dotted line on buttons in Firefox */
+button::-moz-focus-inner {
+ border: 0;
+}
+
+.x-deluge-main-panel {
+ background-image: url('../icons/deluge.png') !important;
+}
+
+.x-deluge-logo {
+ background-image: url('../ui_images/deluge-about.png');
+}
+
+#tbar-deluge-text * {
+ color: black !important;
+ font-weight: bold;
+}
+
+#tbar-deluge-text {
+ opacity: 1 !important;
+}
+
+.deluge-torrents td,
+.x-deluge-peers td {
+ height: 16px;
+ line-height: 16px;
+}
+
+.deluge-torrents .torrent-name,
+.x-deluge-peer,
+.x-deluge-seed {
+ padding-left: 20px;
+ background-repeat: no-repeat;
+}
+
+.deluge-torrents .deluge-torrent-progress {
+ text-align: center;
+}
+
+/* Icon classes */
+.x-deluge-all {
+ background-image: url('../icons/all.png');
+}
+.x-deluge-active {
+ background-image: url('../icons/active.png');
+}
+.x-deluge-downloading,
+.x-btn .x-deluge-downloading,
+.x-deluge-peer {
+ background-image: url('../icons/downloading.png');
+}
+.x-deluge-seeding,
+.x-btn .x-deluge-seeding,
+.deluge-torrents .seeding,
+.x-deluge-seed {
+ background-image: url('../icons/seeding.png');
+}
+.x-deluge-queued,
+.x-btn .x-deluge-queued,
+.deluge-torrents .queued {
+ background-image: url('../icons/queued.png');
+}
+.x-deluge-paused,
+.x-btn .x-deluge-paused,
+.deluge-torrents .paused {
+ background-image: url('../icons/inactive.png');
+}
+.x-deluge-error,
+.deluge-torrents .error {
+ background-image: url('../icons/alert.png');
+}
+.x-deluge-checking,
+.deluge-torrents .checking {
+ background-image: url('../icons/checking.png');
+}
+.x-deluge-dht,
+.x-btn .x-deluge-dht {
+ background-image: url('../icons/dht.png');
+}
+.x-deluge-preferences,
+.x-btn .x-deluge-preferences {
+ background-image: url('../icons/preferences.png');
+}
+.x-deluge-connections,
+.x-btn .x-deluge-connections {
+ background-image: url('../icons/connections.png');
+}
+.x-deluge-connection-manager,
+.x-btn .x-deluge-connection-manager {
+ background-image: url('../icons/connection_manager.png');
+}
+.x-deluge-traffic,
+.x-btn .x-deluge-traffic {
+ background-image: url('../icons/traffic.png');
+}
+.x-deluge-edit-trackers,
+.x-btn .x-deluge-edit-trackers {
+ background-image: url('../icons/edit_trackers.png');
+}
+.x-deluge-freespace,
+.x-btn .x-deluge-freespace {
+ background-image: url('../icons/drive.png');
+}
+
+.x-deluge-install-plugin,
+.x-btn .x-deluge-install-plugin {
+ background-image: url('../icons/install_plugin.png');
+}
+.x-deluge-find-more,
+.x-btn .x-deluge-find-more {
+ background-image: url('../icons/find_more.png');
+}
+
+/* Torrent Details */
+#torrentDetails dl,
+#torrentDetails dl.singleline {
+ float: left;
+ min-height: 120px;
+}
+
+#torrentDetails dl dt,
+dl.singleline dt {
+ float: left;
+ font-weight: bold;
+ height: 19px;
+}
+
+#torrentDetails dl dd,
+dl.singleline dd {
+ margin-left: 100px;
+ width: 140px;
+ height: 19px;
+}
+
+dl.singleline {
+ float: left;
+}
+
+dl.singleline dt {
+ width: 80px;
+}
+
+dl.singleline dd {
+ margin-left: 85px;
+ width: auto;
+}
+
+.x-deluge-plugins {
+ background: White;
+}
+
+/* Torrent Details - Status Tab */
+.x-deluge-status-progressbar {
+ margin: 5px;
+}
+
+.x-deluge-status {
+ margin: 10px;
+}
+
+.x-deluge-status dd.downloaded,
+.x-deluge-status dd.uploaded,
+.x-deluge-status dd.share,
+.x-deluge-status dd.announce,
+.x-deluge-status dd.tracker_status {
+ width: 200px;
+ margin-left: 100px;
+}
+
+.x-deluge-status dd.downspeed,
+.x-deluge-status dd.upspeed,
+.x-deluge-status dd.eta,
+.x-deluge-status dd.pieces {
+ margin-left: 100px;
+}
+
+.x-deluge-status dd.active_time,
+.x-deluge-status dd.seeding_time,
+.x-deluge-status dd.seed_rank,
+.x-deluge-status dd.time_added {
+ width: 100px;
+}
+.x-deluge-status dd.last_seen_complete {
+ width: 100px;
+}
+
+/* Torrent Details - Details Tab */
+#torrentDetails dd.torrent_name,
+#torrentDetails dd.status,
+#torrentDetails dd.tracker,
+#torrentDetails dd.path,
+#torrentDetails dd.comment {
+ width: auto;
+}
+
+.detailsPanel .x-panel-header {
+ height: 0;
+ padding: 0;
+ border: 0;
+}
+
+.detailsPanel .x-tool {
+ height: 15px;
+ z-index: 1;
+ position: fixed;
+ right: 0;
+ margin: 5px 10px;
+}
+
+/* Login Window */
+.x-deluge-login-window-icon {
+ background: url('../icons/login.png') no-repeat 2px;
+}
+
+/* Remove Window */
+.x-deluge-remove-window-icon {
+ background: url('../icons/remove.png') no-repeat 2px;
+}
+
+/* Add Window */
+.x-deluge-add-window-icon {
+ background: url('../icons/add.png') no-repeat 2px;
+}
+
+.x-deluge-add-torrent-name {
+ line-height: 20px;
+}
+
+.x-deluge-add-torrent-name-loading {
+ padding-left: 20px;
+ line-height: 20px;
+ background: url('/themes/default/tree/loading.gif') no-repeat 2px;
+}
+
+/* Add Url Window */
+.x-deluge-add-file,
+.x-btn .x-deluge-add-file {
+ background: url('../icons/add_file.png') no-repeat 2px;
+}
+
+.x-deluge-add-url-window-icon {
+ background: url('../icons/add_url.png') no-repeat 2px;
+}
+
+/* Connect Window */
+.x-deluge-connect-window-icon {
+ background: url('../icons/connection_manager.png') no-repeat 2px;
+}
+
+/* Statusbar */
+.x-deluge-statusbar {
+ background: no-repeat 2px !important;
+ padding-left: 20px !important;
+}
+
+.x-not-connected {
+ background-image: url('../icons/error.png') !important;
+}
+
+.x-connected {
+ background-image: none !important;
+}
+
+/* Styles for renderered progress bars */
+.x-progress-renderered .x-progress-bar {
+ height: 16px;
+}
+
+.x-progress-renderered .x-progress-bar .x-progress-text {
+ margin-top: -1px;
+ height: 18px;
+}
+
+/* Adjust progressbar for torrent files tree */
+.x-tree .x-progress-wrap {
+ width: 100px;
+}
+
+.x-tree .x-progress-renderered .x-progress-inner {
+ height: 12px;
+}
+
+.x-tree .x-progress-renderered .x-progress-bar {
+ height: 12px;
+}
+
+.x-tree .x-progress-renderered .x-progress-text {
+ vertical-align: top;
+ height: 12px;
+ font-size: 11px;
+ font-weight: normal;
+ padding: 0px;
+ margin-top: 0px;
+}
+
+.x-tree .x-progress-renderered .x-progress-bar .x-progress-text {
+ margin-top: 0px;
+}
+
+/* Files TreeGrid */
+.x-treegrid-root-table {
+ border-right: 1px solid;
+}
+
+.x-treegrid-root-node {
+ overflow: auto;
+}
+
+.x-treegrid-hd-hidden {
+ visibility: hidden;
+ border: 0;
+ width: 0;
+}
+
+.x-treegrid-col {
+ border-bottom: 1px solid;
+ height: 20px;
+ overflow: hidden;
+ vertical-align: top;
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.x-treegrid-text {
+ padding-left: 4px;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+}
+
+.x-treegrid-resizer {
+ border-left: 1px solid;
+ border-right: 1px solid;
+ position: absolute;
+ left: 0;
+ top: 0;
+}
+
+.x-treegrid-header-inner {
+ overflow: hidden;
+}
+
+.x-treegrid-root-table,
+.x-treegrid-col {
+ border-color: #ededed;
+}
+
+.x-treegrid-resizer {
+ border-left-color: #555;
+ border-right-color: #555;
+}
+
+/* Options Tab Styles */
+.x-deluge-options-label {
+ margin-right: 10px;
+}
+
+.x-deluge-indent-checkbox {
+ padding-left: 10px;
+}
+
+/* Sidebar styles */
+#sidebar .x-grid3-col-filter {
+ height: 16px;
+ line-height: 16px;
+ padding: 2px;
+ cursor: pointer;
+}
+
+#sidebar .x-deluge-filter {
+ background-repeat: no-repeat;
+ background-size: contain;
+ background-position: left;
+ padding-left: 20px;
+ line-height: 16px;
+}
+
+#sidebar .x-list-selected em {
+ font-weight: bold;
+}
+
+/* MessageBox icon styles */
+.x-deluge-icon-warning {
+ background: url('../icons/warning.png') no-repeat 2px;
+}
+
+.x-deluge-icon-error {
+ background: url('../icons/error.png') no-repeat 2px;
+}
+
+.x-tree-node-leaf .x-deluge-file {
+ background-image: url('../icons/document.png');
+}
+
+.x-deluge-add-file-checkbox {
+ margin-top: 2px;
+}
+
+/* Filepriority styles */
+.x-no-download,
+.x-low-download,
+.x-normal-download,
+.x-high-download,
+.x-mixed-download {
+ padding-left: 20px;
+ background-repeat: no-repeat;
+ line-height: 16px;
+}
+
+.x-no-download {
+ background-image: url(../icons/no_download.png);
+}
+
+.x-low-download {
+ background-image: url(../icons/low.png);
+}
+
+.x-normal-download {
+ background-image: url(../icons/normal.png);
+}
+
+.x-high-download {
+ background-image: url(../icons/high.png);
+}
+
+.x-mixed-download {
+ /*background-image: url(../icons/mixed.png);*/
+}
+
+/**
+ * Deluge Default Icon Set
+ * n.b. this needs to be forked out at some point
+ */
+
+.icon-create {
+ background-image: url('../icons/create.png') !important;
+}
+
+.icon-add {
+ background-image: url('../icons/add.png') !important;
+}
+
+.icon-add-url {
+ background-image: url('../icons/add_url.png') !important;
+}
+
+.icon-add-magnet {
+ background-image: url('../icons/add_magnet.png') !important;
+}
+
+.icon-pause {
+ background-image: url('../icons/pause.png') !important;
+}
+
+.icon-resume {
+ background-image: url('../icons/start.png') !important;
+}
+
+.icon-options {
+ background-image: url('../icons/preferences.png') !important;
+}
+
+.icon-queue {
+ background-image: url('../icons/queue.png') !important;
+}
+
+.icon-top {
+ background-image: url('../icons/top.png') !important;
+}
+
+.icon-up {
+ background-image: url('../icons/up.png') !important;
+}
+
+.icon-down {
+ background-image: url('../icons/down.png') !important;
+}
+
+.icon-bottom {
+ background-image: url('../icons/bottom.png') !important;
+}
+
+.icon-update-tracker {
+ background-image: url('../icons/update.png') !important;
+}
+
+.icon-edit-trackers,
+.icon-edit {
+ background-image: url('../icons/edit_trackers.png') !important;
+}
+
+.icon-remove {
+ background-image: url('../icons/remove.png') !important;
+}
+
+.icon-recheck {
+ background-image: url('../icons/recheck.png') !important;
+}
+
+.icon-move {
+ background-image: url('../icons/move.png') !important;
+}
+
+.icon-help {
+ background-image: url('../icons/help.png') !important;
+}
+
+.icon-logout {
+ background-image: url('../icons/logout.png') !important;
+}
+
+.icon-back {
+ background-image: url('../icons/back.png') !important;
+}
+
+.icon-forward {
+ background-image: url('../icons/forward.png') !important;
+}
+
+.icon-home {
+ background-image: url('../icons/home.png') !important;
+}
+
+.icon-ok {
+ background-image: url('../icons/ok.png') !important;
+}
+
+.icon-error {
+ background-image: url('../icons/error.png') !important;
+}
+
+.icon-upload-slots {
+ background-image: url('../icons/upload_slots.png') !important;
+}
+
+.icon-expand-all {
+ background-image: url('../icons/expand_all.png') !important;
+}
+
+.icon-do-not-download {
+ background-image: url('../icons/no_download.png') !important;
+}
+
+.icon-low {
+ background-image: url('../icons/low.png') !important;
+}
+
+.icon-normal {
+ background-image: url('../icons/normal.png') !important;
+}
+
+.icon-high {
+ background-image: url('../icons/high.png') !important;
+}
diff --git a/deluge/ui/web/css/ext-all-notheme.css b/deluge/ui/web/css/ext-all-notheme.css
new file mode 100644
index 0000000..40bac82
--- /dev/null
+++ b/deluge/ui/web/css/ext-all-notheme.css
@@ -0,0 +1,5349 @@
+/*
+This file is part of Ext JS 3.4
+
+Copyright (c) 2011-2013 Sencha Inc
+
+Contact: http://www.sencha.com/contact
+
+GNU General Public License Usage
+This file may be used under the terms of the GNU General Public License version 3.0 as
+published by the Free Software Foundation and appearing in the file LICENSE included in the
+packaging of this file.
+
+Please review the following information to ensure the GNU General Public License version 3.0
+requirements will be met: http://www.gnu.org/copyleft/gpl.html.
+
+If you are unsure which license is appropriate for your use, please contact the sales department
+at http://www.sencha.com/contact.
+
+Build date: 2013-04-03 15:07:25
+*/
+html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}img,body,html{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';}
+
+.ext-forced-border-box, .ext-forced-border-box * {
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+}
+.ext-el-mask {
+ z-index: 100;
+ position: absolute;
+ top:0;
+ left:0;
+ -moz-opacity: 0.5;
+ opacity: .50;
+ filter: alpha(opacity=50);
+ width: 100%;
+ height: 100%;
+ zoom: 1;
+}
+
+.ext-el-mask-msg {
+ z-index: 20001;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border:1px solid;
+ background:repeat-x 0 -16px;
+ padding:2px;
+}
+
+.ext-el-mask-msg div {
+ padding:5px 10px 5px 10px;
+ border:1px solid;
+ cursor:wait;
+}
+
+.ext-shim {
+ position:absolute;
+ visibility:hidden;
+ left:0;
+ top:0;
+ overflow:hidden;
+}
+
+.ext-ie .ext-shim {
+ filter: alpha(opacity=0);
+}
+
+.ext-ie6 .ext-shim {
+ margin-left: 5px;
+ margin-top: 3px;
+}
+
+.x-mask-loading div {
+ padding:5px 10px 5px 25px;
+ background:no-repeat 5px 5px;
+ line-height:16px;
+}
+
+/* class for hiding elements without using display:none */
+.x-hidden, .x-hide-offsets {
+ position:absolute !important;
+ left:-10000px;
+ top:-10000px;
+ visibility:hidden;
+}
+
+.x-hide-display {
+ display:none !important;
+}
+
+.x-hide-nosize,
+.x-hide-nosize * /* Emulate display:none for children */
+ {
+ height:0px!important;
+ width:0px!important;
+ visibility:hidden!important;
+ border:none!important;
+ zoom:1;
+}
+
+.x-hide-visibility {
+ visibility:hidden !important;
+}
+
+.x-masked {
+ overflow: hidden !important;
+}
+.x-masked-relative {
+ position: relative !important;
+}
+
+.x-masked select, .x-masked object, .x-masked embed {
+ visibility: hidden;
+}
+
+.x-layer {
+ visibility: hidden;
+}
+
+.x-unselectable, .x-unselectable * {
+ user-select: none;
+ -o-user-select: none;
+ -ms-user-select: none;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ cursor:default;
+}
+
+.x-repaint {
+ zoom: 1;
+ background-color: transparent;
+ -moz-outline: none;
+ outline: none;
+}
+
+.x-item-disabled {
+ cursor: default;
+ opacity: .6;
+ -moz-opacity: .6;
+ filter: alpha(opacity=60);
+}
+
+.x-item-disabled * {
+ cursor: default !important;
+}
+
+.x-form-radio-group .x-item-disabled {
+ filter: none;
+}
+
+.x-splitbar-proxy {
+ position: absolute;
+ visibility: hidden;
+ z-index: 20001;
+ zoom: 1;
+ line-height: 1px;
+ font-size: 1px;
+ overflow: hidden;
+}
+
+.x-splitbar-h, .x-splitbar-proxy-h {
+ cursor: e-resize;
+ cursor: col-resize;
+}
+
+.x-splitbar-v, .x-splitbar-proxy-v {
+ cursor: s-resize;
+ cursor: row-resize;
+}
+
+.x-color-palette {
+ width: 150px;
+ height: 92px;
+ cursor: pointer;
+}
+
+.x-color-palette a {
+ border: 1px solid;
+ float: left;
+ padding: 2px;
+ text-decoration: none;
+ -moz-outline: 0 none;
+ outline: 0 none;
+ cursor: pointer;
+}
+
+.x-color-palette a:hover, .x-color-palette a.x-color-palette-sel {
+ border: 1px solid;
+}
+
+.x-color-palette em {
+ display: block;
+ border: 1px solid;
+}
+
+.x-color-palette em span {
+ cursor: pointer;
+ display: block;
+ height: 10px;
+ line-height: 10px;
+ width: 10px;
+}
+
+.x-ie-shadow {
+ display: none;
+ position: absolute;
+ overflow: hidden;
+ left:0;
+ top:0;
+ zoom:1;
+}
+
+.x-shadow {
+ display: none;
+ position: absolute;
+ overflow: hidden;
+ left:0;
+ top:0;
+}
+
+.x-shadow * {
+ overflow: hidden;
+}
+
+.x-shadow * {
+ padding: 0;
+ border: 0;
+ margin: 0;
+ clear: none;
+ zoom: 1;
+}
+
+/* top bottom */
+.x-shadow .xstc, .x-shadow .xsbc {
+ height: 6px;
+ float: left;
+}
+
+/* corners */
+.x-shadow .xstl, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbr {
+ width: 6px;
+ height: 6px;
+ float: left;
+}
+
+/* sides */
+.x-shadow .xsc {
+ width: 100%;
+}
+
+.x-shadow .xsml, .x-shadow .xsmr {
+ width: 6px;
+ float: left;
+ height: 100%;
+}
+
+.x-shadow .xsmc {
+ float: left;
+ height: 100%;
+ background-color: transparent;
+}
+
+.x-shadow .xst, .x-shadow .xsb {
+ height: 6px;
+ overflow: hidden;
+ width: 100%;
+}
+
+.x-shadow .xsml {
+ background: transparent repeat-y 0 0;
+}
+
+.x-shadow .xsmr {
+ background: transparent repeat-y -6px 0;
+}
+
+.x-shadow .xstl {
+ background: transparent no-repeat 0 0;
+}
+
+.x-shadow .xstc {
+ background: transparent repeat-x 0 -30px;
+}
+
+.x-shadow .xstr {
+ background: transparent repeat-x 0 -18px;
+}
+
+.x-shadow .xsbl {
+ background: transparent no-repeat 0 -12px;
+}
+
+.x-shadow .xsbc {
+ background: transparent repeat-x 0 -36px;
+}
+
+.x-shadow .xsbr {
+ background: transparent repeat-x 0 -6px;
+}
+
+.loading-indicator {
+ background: no-repeat left;
+ padding-left: 20px;
+ line-height: 16px;
+ margin: 3px;
+}
+
+.x-text-resize {
+ position: absolute;
+ left: -1000px;
+ top: -1000px;
+ visibility: hidden;
+ zoom: 1;
+}
+
+.x-drag-overlay {
+ width: 100%;
+ height: 100%;
+ display: none;
+ position: absolute;
+ left: 0;
+ top: 0;
+ background-image:url(../images/default/s.gif);
+ z-index: 20000;
+}
+
+.x-clear {
+ clear:both;
+ height:0;
+ overflow:hidden;
+ line-height:0;
+ font-size:0;
+}
+
+.x-spotlight {
+ z-index: 8999;
+ position: absolute;
+ top:0;
+ left:0;
+ -moz-opacity: 0.5;
+ opacity: .50;
+ filter: alpha(opacity=50);
+ width:0;
+ height:0;
+ zoom: 1;
+}
+
+#x-history-frame {
+ position:absolute;
+ top:-1px;
+ left:0;
+ width:1px;
+ height:1px;
+ visibility:hidden;
+}
+
+#x-history-field {
+ position:absolute;
+ top:0;
+ left:-1px;
+ width:1px;
+ height:1px;
+ visibility:hidden;
+}
+.x-resizable-handle {
+ position:absolute;
+ z-index:100;
+ /* ie needs these */
+ font-size:1px;
+ line-height:6px;
+ overflow:hidden;
+ filter:alpha(opacity=0);
+ opacity:0;
+ zoom:1;
+}
+
+.x-resizable-handle-east{
+ width:6px;
+ cursor:e-resize;
+ right:0;
+ top:0;
+ height:100%;
+}
+
+.ext-ie .x-resizable-handle-east {
+ margin-right:-1px; /*IE rounding error*/
+}
+
+.x-resizable-handle-south{
+ width:100%;
+ cursor:s-resize;
+ left:0;
+ bottom:0;
+ height:6px;
+}
+
+.ext-ie .x-resizable-handle-south {
+ margin-bottom:-1px; /*IE rounding error*/
+}
+
+.x-resizable-handle-west{
+ width:6px;
+ cursor:w-resize;
+ left:0;
+ top:0;
+ height:100%;
+}
+
+.x-resizable-handle-north{
+ width:100%;
+ cursor:n-resize;
+ left:0;
+ top:0;
+ height:6px;
+}
+
+.x-resizable-handle-southeast{
+ width:6px;
+ cursor:se-resize;
+ right:0;
+ bottom:0;
+ height:6px;
+ z-index:101;
+}
+
+.x-resizable-handle-northwest{
+ width:6px;
+ cursor:nw-resize;
+ left:0;
+ top:0;
+ height:6px;
+ z-index:101;
+}
+
+.x-resizable-handle-northeast{
+ width:6px;
+ cursor:ne-resize;
+ right:0;
+ top:0;
+ height:6px;
+ z-index:101;
+}
+
+.x-resizable-handle-southwest{
+ width:6px;
+ cursor:sw-resize;
+ left:0;
+ bottom:0;
+ height:6px;
+ z-index:101;
+}
+
+.x-resizable-over .x-resizable-handle, .x-resizable-pinned .x-resizable-handle{
+ filter:alpha(opacity=100);
+ opacity:1;
+}
+
+.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east,
+.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west
+{
+ background-position: left;
+}
+
+.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south,
+.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north
+{
+ background-position: top;
+}
+
+.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{
+ background-position: top left;
+}
+
+.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{
+ background-position:bottom right;
+}
+
+.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{
+ background-position: bottom left;
+}
+
+.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{
+ background-position: top right;
+}
+
+.x-resizable-proxy{
+ border: 1px dashed;
+ position:absolute;
+ overflow:hidden;
+ display:none;
+ left:0;
+ top:0;
+ z-index:50000;
+}
+
+.x-resizable-overlay{
+ width:100%;
+ height:100%;
+ display:none;
+ position:absolute;
+ left:0;
+ top:0;
+ z-index:200000;
+ -moz-opacity: 0;
+ opacity:0;
+ filter: alpha(opacity=0);
+}
+.x-tab-panel {
+ overflow:hidden;
+}
+
+.x-tab-panel-header, .x-tab-panel-footer {
+ border: 1px solid;
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-tab-panel-header {
+ border: 1px solid;
+ padding-bottom: 2px;
+}
+
+.x-tab-panel-footer {
+ border: 1px solid;
+ padding-top: 2px;
+}
+
+.x-tab-strip-wrap {
+ width:100%;
+ overflow:hidden;
+ position:relative;
+ zoom:1;
+}
+
+ul.x-tab-strip {
+ display:block;
+ width:5000px;
+ zoom:1;
+}
+
+ul.x-tab-strip-top{
+ padding-top: 1px;
+ background: repeat-x bottom;
+ border-bottom: 1px solid;
+}
+
+ul.x-tab-strip-bottom{
+ padding-bottom: 1px;
+ background: repeat-x top;
+ border-top: 1px solid;
+ border-bottom: 0 none;
+}
+
+.x-tab-panel-header-plain .x-tab-strip-top {
+ background:transparent !important;
+ padding-top:0 !important;
+}
+
+.x-tab-panel-header-plain {
+ background:transparent !important;
+ border-width:0 !important;
+ padding-bottom:0 !important;
+}
+
+.x-tab-panel-header-plain .x-tab-strip-spacer,
+.x-tab-panel-footer-plain .x-tab-strip-spacer {
+ border:1px solid;
+ height:2px;
+ font-size:1px;
+ line-height:1px;
+}
+
+.x-tab-panel-header-plain .x-tab-strip-spacer {
+ border-top: 0 none;
+}
+
+.x-tab-panel-footer-plain .x-tab-strip-spacer {
+ border-bottom: 0 none;
+}
+
+.x-tab-panel-footer-plain .x-tab-strip-bottom {
+ background:transparent !important;
+ padding-bottom:0 !important;
+}
+
+.x-tab-panel-footer-plain {
+ background:transparent !important;
+ border-width:0 !important;
+ padding-top:0 !important;
+}
+
+.ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer,
+.ext-border-box .x-tab-panel-footer-plain .x-tab-strip-spacer {
+ height:3px;
+}
+
+ul.x-tab-strip li {
+ float:left;
+ margin-left:2px;
+}
+
+ul.x-tab-strip li.x-tab-edge {
+ float:left;
+ margin:0 !important;
+ padding:0 !important;
+ border:0 none !important;
+ font-size:1px !important;
+ line-height:1px !important;
+ overflow:hidden;
+ zoom:1;
+ background:transparent !important;
+ width:1px;
+}
+
+.x-tab-strip a, .x-tab-strip span, .x-tab-strip em {
+ display:block;
+}
+
+.x-tab-strip a {
+ text-decoration:none !important;
+ -moz-outline: none;
+ outline: none;
+ cursor:pointer;
+}
+
+.x-tab-strip-inner {
+ overflow:hidden;
+ text-overflow: ellipsis;
+}
+
+.x-tab-strip span.x-tab-strip-text {
+ white-space: nowrap;
+ cursor:pointer;
+ padding:4px 0;
+}
+
+.x-tab-strip-top .x-tab-with-icon .x-tab-right {
+ padding-left:6px;
+}
+
+.x-tab-strip .x-tab-with-icon span.x-tab-strip-text {
+ padding-left:20px;
+ background-position: 0 3px;
+ background-repeat: no-repeat;
+}
+
+.x-tab-strip-active, .x-tab-strip-active a.x-tab-right {
+ cursor:default;
+}
+
+.x-tab-strip-active span.x-tab-strip-text {
+ cursor:default;
+}
+
+.x-tab-strip-disabled .x-tabs-text {
+ cursor:default;
+}
+
+.x-tab-panel-body {
+ overflow:hidden;
+}
+
+.x-tab-panel-bwrap {
+ overflow:hidden;
+}
+
+.ext-ie .x-tab-strip .x-tab-right {
+ position:relative;
+}
+
+.x-tab-strip-top .x-tab-strip-active .x-tab-right {
+ margin-bottom:-1px;
+}
+
+/*
+ * For IE8/9 in quirks mode
+ */
+.ext-ie8 .x-tab-strip li {
+ position: relative;
+}
+.ext-border-box .ext-ie8 .x-tab-strip-top .x-tab-right, .ext-border-box .ext-ie9 .x-tab-strip-top .x-tab-right {
+ top: 1px;
+}
+.ext-ie8 .x-tab-strip-top, .ext-ie9 .x-tab-strip-top {
+ padding-top: 1px;
+}
+.ext-border-box .ext-ie8 .x-tab-strip-top, .ext-border-box .ext-ie9 .x-tab-strip-top {
+ padding-top: 0;
+}
+.ext-ie8 .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close, .ext-ie9 .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close {
+ top:3px;
+}
+.ext-border-box .ext-ie8 .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close,
+.ext-border-box .ext-ie9 .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close {
+ top:4px;
+}
+.ext-ie8 .x-tab-strip-bottom .x-tab-right, .ext-ie9 .x-tab-strip-bottom .x-tab-right{
+ top:0;
+}
+
+
+.x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text {
+ padding-bottom:5px;
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-right {
+ margin-top:-1px;
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-right span.x-tab-strip-text {
+ padding-top:5px;
+}
+
+.x-tab-strip-top .x-tab-right {
+ background: transparent no-repeat 0 -51px;
+ padding-left:10px;
+}
+
+.x-tab-strip-top .x-tab-left {
+ background: transparent no-repeat right -351px;
+ padding-right:10px;
+}
+
+.x-tab-strip-top .x-tab-strip-inner {
+ background: transparent repeat-x 0 -201px;
+}
+
+.x-tab-strip-top .x-tab-strip-over .x-tab-right {
+ background-position:0 -101px;
+}
+
+.x-tab-strip-top .x-tab-strip-over .x-tab-left {
+ background-position:right -401px;
+}
+
+.x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner {
+ background-position:0 -251px;
+}
+
+.x-tab-strip-top .x-tab-strip-active .x-tab-right {
+ background-position: 0 0;
+}
+
+.x-tab-strip-top .x-tab-strip-active .x-tab-left {
+ background-position: right -301px;
+}
+
+.x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner {
+ background-position: 0 -151px;
+}
+
+.x-tab-strip-bottom .x-tab-right {
+ background: no-repeat bottom right;
+}
+
+.x-tab-strip-bottom .x-tab-left {
+ background: no-repeat bottom left;
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-right {
+ background: no-repeat bottom right;
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-left {
+ background: no-repeat bottom left;
+}
+
+.x-tab-strip-bottom .x-tab-left {
+ margin-right: 3px;
+ padding:0 10px;
+}
+
+.x-tab-strip-bottom .x-tab-right {
+ padding:0;
+}
+
+.x-tab-strip .x-tab-strip-close {
+ display:none;
+}
+
+.x-tab-strip-closable {
+ position:relative;
+}
+
+.x-tab-strip-closable .x-tab-left {
+ padding-right:19px;
+}
+
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close {
+ opacity:.6;
+ -moz-opacity:.6;
+ background-repeat:no-repeat;
+ display:block;
+ width:11px;
+ height:11px;
+ position:absolute;
+ top:3px;
+ right:3px;
+ cursor:pointer;
+ z-index:2;
+}
+
+.x-tab-strip .x-tab-strip-active a.x-tab-strip-close {
+ opacity:.8;
+ -moz-opacity:.8;
+}
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{
+ opacity:1;
+ -moz-opacity:1;
+}
+
+.x-tab-panel-body {
+ border: 1px solid;
+}
+
+.x-tab-panel-body-top {
+ border-top: 0 none;
+}
+
+.x-tab-panel-body-bottom {
+ border-bottom: 0 none;
+}
+
+.x-tab-scroller-left {
+ background: transparent no-repeat -18px 0;
+ border-bottom: 1px solid;
+ width:18px;
+ position:absolute;
+ left:0;
+ top:0;
+ z-index:10;
+ cursor:pointer;
+}
+.x-tab-scroller-left-over {
+ background-position: 0 0;
+}
+
+.x-tab-scroller-left-disabled {
+ background-position: -18px 0;
+ opacity:.5;
+ -moz-opacity:.5;
+ filter:alpha(opacity=50);
+ cursor:default;
+}
+
+.x-tab-scroller-right {
+ background: transparent no-repeat 0 0;
+ border-bottom: 1px solid;
+ width:18px;
+ position:absolute;
+ right:0;
+ top:0;
+ z-index:10;
+ cursor:pointer;
+}
+
+.x-tab-scroller-right-over {
+ background-position: -18px 0;
+}
+
+.x-tab-scroller-right-disabled {
+ background-position: 0 0;
+ opacity:.5;
+ -moz-opacity:.5;
+ filter:alpha(opacity=50);
+ cursor:default;
+}
+
+.x-tab-scrolling-bottom .x-tab-scroller-left, .x-tab-scrolling-bottom .x-tab-scroller-right{
+ margin-top: 1px;
+}
+
+.x-tab-scrolling .x-tab-strip-wrap {
+ margin-left:18px;
+ margin-right:18px;
+}
+
+.x-tab-scrolling {
+ position:relative;
+}
+
+.x-tab-panel-bbar .x-toolbar {
+ border:1px solid;
+ border-top:0 none;
+ overflow:hidden;
+ padding:2px;
+}
+
+.x-tab-panel-tbar .x-toolbar {
+ border:1px solid;
+ border-top:0 none;
+ overflow:hidden;
+ padding:2px;
+}/* all fields */
+.x-form-field{
+ margin: 0 0 0 0;
+}
+
+.ext-webkit *:focus{
+ outline: none !important;
+}
+
+/* ---- text fields ---- */
+.x-form-text, textarea.x-form-field{
+ padding:1px 3px;
+ background:repeat-x 0 0;
+ border:1px solid;
+}
+
+textarea.x-form-field {
+ padding:2px 3px;
+}
+
+.x-form-text, .ext-ie .x-form-file {
+ height:22px;
+ line-height:18px;
+ vertical-align:middle;
+}
+
+.ext-ie6 .x-form-text, .ext-ie7 .x-form-text {
+ margin:-1px 0; /* ie bogus margin bug */
+ height:22px; /* ie quirks */
+ line-height:18px;
+}
+
+.x-quirks .ext-ie9 .x-form-text {
+ height: 22px;
+ padding-top: 3px;
+ padding-bottom: 0px;
+}
+
+/* Ugly hacks for the bogus 1px margin bug in IE9 quirks */
+.x-quirks .ext-ie9 .x-input-wrapper .x-form-text,
+.x-quirks .ext-ie9 .x-form-field-trigger-wrap .x-form-text {
+ margin-top: -1px;
+ margin-bottom: -1px;
+}
+.x-quirks .ext-ie9 .x-input-wrapper .x-form-element {
+ margin-bottom: -1px;
+}
+
+.ext-ie6 .x-form-field-wrap .x-form-file-btn, .ext-ie7 .x-form-field-wrap .x-form-file-btn {
+ top: -1px; /* because of all these margin hacks, these buttons are off by one pixel in IE6,7 */
+}
+
+.ext-ie6 textarea.x-form-field, .ext-ie7 textarea.x-form-field {
+ margin:-1px 0; /* ie bogus margin bug */
+}
+
+.ext-strict .x-form-text {
+ height:18px;
+}
+
+.ext-safari.ext-mac textarea.x-form-field {
+ margin-bottom:-2px; /* another bogus margin bug, safari/mac only */
+}
+
+/*
+.ext-strict .ext-ie8 .x-form-text, .ext-strict .ext-ie8 textarea.x-form-field {
+ margin-bottom: 1px;
+}
+*/
+
+.ext-gecko .x-form-text , .ext-ie8 .x-form-text {
+ padding-top:2px; /* FF won't center the text vertically */
+ padding-bottom:0;
+}
+
+.ext-ie6 .x-form-composite .x-form-text.x-box-item, .ext-ie7 .x-form-composite .x-form-text.x-box-item {
+ margin: 0 !important; /* clear ie bogus margin bug fix */
+}
+
+textarea {
+ resize: none; /* Disable browser resizable textarea */
+}
+
+/* select boxes */
+.x-form-select-one {
+ height:20px;
+ line-height:18px;
+ vertical-align:middle;
+ border: 1px solid;
+}
+
+/* multi select boxes */
+
+/* --- TODO --- */
+
+/* 2.0.2 style */
+.x-form-check-wrap {
+ line-height:18px;
+ height: auto;
+}
+
+.ext-ie .x-form-check-wrap input {
+ width:15px;
+ height:15px;
+}
+
+.x-form-check-wrap input{
+ vertical-align: bottom;
+}
+
+.x-editor .x-form-check-wrap {
+ padding:3px;
+}
+
+.x-editor .x-form-checkbox {
+ height:13px;
+}
+
+.x-form-check-group-label {
+ border-bottom: 1px solid;
+ margin-bottom: 5px;
+ padding-left: 3px !important;
+ float: none !important;
+}
+
+/* wrapped fields and triggers */
+.x-form-field-wrap .x-form-trigger{
+ width:17px;
+ height:21px;
+ border:0;
+ background:transparent no-repeat 0 0;
+ cursor:pointer;
+ border-bottom: 1px solid;
+ position:absolute;
+ top:0;
+}
+
+.x-form-field-wrap .x-form-date-trigger, .x-form-field-wrap .x-form-clear-trigger, .x-form-field-wrap .x-form-search-trigger{
+ cursor:pointer;
+}
+
+.x-form-field-wrap .x-form-twin-triggers .x-form-trigger{
+ position:static;
+ top:auto;
+ vertical-align:top;
+}
+
+.x-form-field-wrap {
+ position:relative;
+ left:0;top:0;
+ text-align: left;
+ zoom:1;
+ white-space: nowrap;
+}
+
+.ext-strict .ext-ie8 .x-toolbar-cell .x-form-field-trigger-wrap .x-form-trigger {
+ right: 0; /* IE8 Strict mode trigger bug */
+}
+
+.x-form-field-wrap .x-form-trigger-over{
+ background-position:-17px 0;
+}
+
+.x-form-field-wrap .x-form-trigger-click{
+ background-position:-34px 0;
+}
+
+.x-trigger-wrap-focus .x-form-trigger{
+ background-position:-51px 0;
+}
+
+.x-trigger-wrap-focus .x-form-trigger-over{
+ background-position:-68px 0;
+}
+
+.x-trigger-wrap-focus .x-form-trigger-click{
+ background-position:-85px 0;
+}
+
+.x-trigger-wrap-focus .x-form-trigger{
+ border-bottom: 1px solid;
+}
+
+.x-item-disabled .x-form-trigger-over{
+ background-position:0 0 !important;
+ border-bottom: 1px solid;
+}
+
+.x-item-disabled .x-form-trigger-click{
+ background-position:0 0 !important;
+ border-bottom: 1px solid;
+}
+
+.x-trigger-noedit{
+ cursor:pointer;
+}
+
+/* field focus style */
+.x-form-focus, textarea.x-form-focus{
+ border: 1px solid;
+}
+
+/* invalid fields */
+.x-form-invalid, textarea.x-form-invalid{
+ background:repeat-x bottom;
+ border: 1px solid;
+}
+
+.x-form-inner-invalid, textarea.x-form-inner-invalid{
+ background:repeat-x bottom;
+}
+
+/* editors */
+.x-editor {
+ visibility:hidden;
+ padding:0;
+ margin:0;
+}
+
+.x-form-grow-sizer {
+ left: -10000px;
+ padding: 8px 3px;
+ position: absolute;
+ visibility:hidden;
+ top: -10000px;
+ white-space: pre-wrap;
+ white-space: -moz-pre-wrap;
+ white-space: -pre-wrap;
+ white-space: -o-pre-wrap;
+ word-wrap: break-word;
+ zoom:1;
+}
+
+.x-form-grow-sizer p {
+ margin:0 !important;
+ border:0 none !important;
+ padding:0 !important;
+}
+
+/* Form Items CSS */
+
+.x-form-item {
+ display:block;
+ margin-bottom:4px;
+ zoom:1;
+}
+
+.x-form-item label.x-form-item-label {
+ display:block;
+ float:left;
+ width:100px;
+ padding:3px;
+ padding-left:0;
+ clear:left;
+ z-index:2;
+ position:relative;
+}
+
+.x-form-element {
+ padding-left:105px;
+ position:relative;
+}
+
+.x-form-invalid-msg {
+ padding:2px;
+ padding-left:18px;
+ background: transparent no-repeat 0 2px;
+ line-height:16px;
+ width:200px;
+}
+
+.x-form-label-left label.x-form-item-label {
+ text-align:left;
+}
+
+.x-form-label-right label.x-form-item-label {
+ text-align:right;
+}
+
+.x-form-label-top .x-form-item label.x-form-item-label {
+ width:auto;
+ float:none;
+ clear:none;
+ display:inline;
+ margin-bottom:4px;
+ position:static;
+}
+
+.x-form-label-top .x-form-element {
+ padding-left:0;
+ padding-top:4px;
+}
+
+.x-form-label-top .x-form-item {
+ padding-bottom:4px;
+}
+
+/* Editor small font for grid, toolbar and tree */
+.x-small-editor .x-form-text {
+ height:20px;
+ line-height:16px;
+ vertical-align:middle;
+}
+
+.ext-ie6 .x-small-editor .x-form-text, .ext-ie7 .x-small-editor .x-form-text {
+ margin-top:-1px !important; /* ie bogus margin bug */
+ margin-bottom:-1px !important;
+ height:20px !important; /* ie quirks */
+ line-height:16px !important;
+}
+
+.ext-strict .x-small-editor .x-form-text {
+ height:16px !important;
+}
+
+.ext-ie6 .x-small-editor .x-form-text, .ext-ie7 .x-small-editor .x-form-text {
+ height:20px;
+ line-height:16px;
+}
+
+.ext-border-box .x-small-editor .x-form-text {
+ height:20px;
+}
+
+.x-small-editor .x-form-select-one {
+ height:20px;
+ line-height:16px;
+ vertical-align:middle;
+}
+
+.x-small-editor .x-form-num-field {
+ text-align:right;
+}
+
+.x-small-editor .x-form-field-wrap .x-form-trigger{
+ height:19px;
+}
+
+.ext-webkit .x-small-editor .x-form-text{padding-top:3px;font-size:100%;}
+
+.ext-strict .ext-webkit .x-small-editor .x-form-text{
+ height:14px !important;
+}
+
+.x-form-clear {
+ clear:both;
+ height:0;
+ overflow:hidden;
+ line-height:0;
+ font-size:0;
+}
+.x-form-clear-left {
+ clear:left;
+ height:0;
+ overflow:hidden;
+ line-height:0;
+ font-size:0;
+}
+
+.ext-ie6 .x-form-check-wrap input, .ext-border-box .x-form-check-wrap input{
+ margin-top: 3px;
+}
+
+.x-form-cb-label {
+ position: relative;
+ margin-left:4px;
+ top: 2px;
+}
+
+.ext-ie .x-form-cb-label{
+ top: 1px;
+}
+
+.ext-ie6 .x-form-cb-label, .ext-border-box .x-form-cb-label{
+ top: 3px;
+}
+
+.x-form-display-field{
+ padding-top: 2px;
+}
+
+.ext-gecko .x-form-display-field, .ext-strict .ext-ie7 .x-form-display-field{
+ padding-top: 1px;
+}
+
+.ext-ie .x-form-display-field{
+ padding-top: 3px;
+}
+
+.ext-strict .ext-ie8 .x-form-display-field{
+ padding-top: 0;
+}
+
+.x-form-column {
+ float:left;
+ padding:0;
+ margin:0;
+ width:48%;
+ overflow:hidden;
+ zoom:1;
+}
+
+/* buttons */
+.x-form .x-form-btns-ct .x-btn{
+ float:right;
+ clear:none;
+}
+
+.x-form .x-form-btns-ct .x-form-btns td {
+ border:0;
+ padding:0;
+}
+
+.x-form .x-form-btns-ct .x-form-btns-right table{
+ float:right;
+ clear:none;
+}
+
+.x-form .x-form-btns-ct .x-form-btns-left table{
+ float:left;
+ clear:none;
+}
+
+.x-form .x-form-btns-ct .x-form-btns-center{
+ text-align:center; /*ie*/
+}
+
+.x-form .x-form-btns-ct .x-form-btns-center table{
+ margin:0 auto; /*everyone else*/
+}
+
+.x-form .x-form-btns-ct table td.x-form-btn-td{
+ padding:3px;
+}
+
+.x-form .x-form-btns-ct .x-btn-focus .x-btn-left{
+ background-position:0 -147px;
+}
+
+.x-form .x-form-btns-ct .x-btn-focus .x-btn-right{
+ background-position:0 -168px;
+}
+
+.x-form .x-form-btns-ct .x-btn-focus .x-btn-center{
+ background-position:0 -189px;
+}
+
+.x-form .x-form-btns-ct .x-btn-click .x-btn-center{
+ background-position:0 -126px;
+}
+
+.x-form .x-form-btns-ct .x-btn-click .x-btn-right{
+ background-position:0 -84px;
+}
+
+.x-form .x-form-btns-ct .x-btn-click .x-btn-left{
+ background-position:0 -63px;
+}
+
+.x-form-invalid-icon {
+ width:16px;
+ height:18px;
+ visibility:hidden;
+ position:absolute;
+ left:0;
+ top:0;
+ display:block;
+ background:transparent no-repeat 0 2px;
+}
+
+/* fieldsets */
+.x-fieldset {
+ border:1px solid;
+ padding:10px;
+ margin-bottom:10px;
+ display:block; /* preserve margins in IE */
+}
+
+/* make top of checkbox/tools visible in webkit */
+.ext-webkit .x-fieldset-header {
+ padding-top: 1px;
+}
+
+.ext-ie .x-fieldset legend {
+ margin-bottom:10px;
+}
+
+.ext-strict .ext-ie9 .x-fieldset legend.x-fieldset-header {
+ padding-top: 1px;
+}
+
+.ext-ie .x-fieldset {
+ padding-top: 0;
+ padding-bottom:10px;
+}
+
+.x-fieldset legend .x-tool-toggle {
+ margin-right:3px;
+ margin-left:0;
+ float:left !important;
+}
+
+.x-fieldset legend input {
+ margin-right:3px;
+ float:left !important;
+ height:13px;
+ width:13px;
+}
+
+fieldset.x-panel-collapsed {
+ padding-bottom:0 !important;
+ border-width: 1px 1px 0 1px !important;
+ border-left-color: transparent;
+ border-right-color: transparent;
+}
+
+.ext-ie6 fieldset.x-panel-collapsed{
+ padding-bottom:0 !important;
+ border-width: 1px 0 0 0 !important;
+ margin-left: 1px;
+ margin-right: 1px;
+}
+
+fieldset.x-panel-collapsed .x-fieldset-bwrap {
+ visibility:hidden;
+ position:absolute;
+ left:-1000px;
+ top:-1000px;
+}
+
+.ext-ie .x-fieldset-bwrap {
+ zoom:1;
+}
+
+.x-fieldset-noborder {
+ border:0px none transparent;
+}
+
+.x-fieldset-noborder legend {
+ margin-left:-3px;
+}
+
+/* IE legend positioning bug */
+.ext-ie .x-fieldset-noborder legend {
+ position: relative;
+ margin-bottom:23px;
+}
+.ext-ie .x-fieldset-noborder legend span {
+ position: absolute;
+ left:16px;
+}
+
+.ext-gecko .x-window-body .x-form-item {
+ -moz-outline: none;
+ outline: none;
+ overflow: auto;
+}
+
+.ext-mac.ext-gecko .x-window-body .x-form-item {
+ overflow:hidden;
+}
+
+.ext-gecko .x-form-item {
+ -moz-outline: none;
+ outline: none;
+}
+
+.x-hide-label label.x-form-item-label {
+ display:none;
+}
+
+.x-hide-label .x-form-element {
+ padding-left: 0 !important;
+}
+
+.x-form-label-top .x-hide-label label.x-form-item-label{
+ display: none;
+}
+
+.x-fieldset {
+ overflow:hidden;
+}
+
+.x-fieldset-bwrap {
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-fieldset-body {
+ overflow:hidden;
+}
+.x-btn{
+ cursor:pointer;
+ white-space: nowrap;
+}
+
+.x-btn button{
+ border:0 none;
+ background-color:transparent;
+ padding-left:3px;
+ padding-right:3px;
+ cursor:pointer;
+ margin:0;
+ overflow:visible;
+ width:auto;
+ -moz-outline:0 none;
+ outline:0 none;
+}
+
+* html .ext-ie .x-btn button {
+ width:1px;
+}
+
+.ext-gecko .x-btn button, .ext-webkit .x-btn button {
+ padding-left:0;
+ padding-right:0;
+}
+
+.ext-gecko .x-btn button::-moz-focus-inner {
+ padding:0;
+}
+
+.ext-ie .x-btn button {
+ padding-top:2px;
+}
+
+.x-btn td {
+ padding:0 !important;
+}
+
+.x-btn-text {
+ cursor:pointer;
+ white-space: nowrap;
+ padding:0;
+}
+
+/* icon placement and sizing styles */
+
+/* Only text */
+.x-btn-noicon .x-btn-small .x-btn-text{
+ height: 16px;
+}
+
+.x-btn-noicon .x-btn-medium .x-btn-text{
+ height: 24px;
+}
+
+.x-btn-noicon .x-btn-large .x-btn-text{
+ height: 32px;
+}
+
+/* Only icons */
+.x-btn-icon .x-btn-text{
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+.x-btn-icon .x-btn-small .x-btn-text{
+ height: 16px;
+ width: 16px;
+}
+
+.x-btn-icon .x-btn-medium .x-btn-text{
+ height: 24px;
+ width: 24px;
+}
+
+.x-btn-icon .x-btn-large .x-btn-text{
+ height: 32px;
+ width: 32px;
+}
+
+/* Icons and text */
+/* left */
+.x-btn-text-icon .x-btn-icon-small-left .x-btn-text{
+ background-position: 0 center;
+ background-repeat: no-repeat;
+ padding-left:18px;
+ height:16px;
+}
+
+.x-btn-text-icon .x-btn-icon-medium-left .x-btn-text{
+ background-position: 0 center;
+ background-repeat: no-repeat;
+ padding-left:26px;
+ height:24px;
+}
+
+.x-btn-text-icon .x-btn-icon-large-left .x-btn-text{
+ background-position: 0 center;
+ background-repeat: no-repeat;
+ padding-left:34px;
+ height:32px;
+}
+
+/* top */
+.x-btn-text-icon .x-btn-icon-small-top .x-btn-text{
+ background-position: center 0;
+ background-repeat: no-repeat;
+ padding-top:18px;
+}
+
+.x-btn-text-icon .x-btn-icon-medium-top .x-btn-text{
+ background-position: center 0;
+ background-repeat: no-repeat;
+ padding-top:26px;
+}
+
+.x-btn-text-icon .x-btn-icon-large-top .x-btn-text{
+ background-position: center 0;
+ background-repeat: no-repeat;
+ padding-top:34px;
+}
+
+/* right */
+.x-btn-text-icon .x-btn-icon-small-right .x-btn-text{
+ background-position: right center;
+ background-repeat: no-repeat;
+ padding-right:18px;
+ height:16px;
+}
+
+.x-btn-text-icon .x-btn-icon-medium-right .x-btn-text{
+ background-position: right center;
+ background-repeat: no-repeat;
+ padding-right:26px;
+ height:24px;
+}
+
+.x-btn-text-icon .x-btn-icon-large-right .x-btn-text{
+ background-position: right center;
+ background-repeat: no-repeat;
+ padding-right:34px;
+ height:32px;
+}
+
+/* bottom */
+.x-btn-text-icon .x-btn-icon-small-bottom .x-btn-text{
+ background-position: center bottom;
+ background-repeat: no-repeat;
+ padding-bottom:18px;
+}
+
+.x-btn-text-icon .x-btn-icon-medium-bottom .x-btn-text{
+ background-position: center bottom;
+ background-repeat: no-repeat;
+ padding-bottom:26px;
+}
+
+.x-btn-text-icon .x-btn-icon-large-bottom .x-btn-text{
+ background-position: center bottom;
+ background-repeat: no-repeat;
+ padding-bottom:34px;
+}
+
+/* background positioning */
+.x-btn-tr i, .x-btn-tl i, .x-btn-mr i, .x-btn-ml i, .x-btn-br i, .x-btn-bl i{
+ font-size:1px;
+ line-height:1px;
+ width:3px;
+ display:block;
+ overflow:hidden;
+}
+
+.x-btn-tr i, .x-btn-tl i, .x-btn-br i, .x-btn-bl i{
+ height:3px;
+}
+
+.x-btn-tl{
+ width:3px;
+ height:3px;
+ background:no-repeat 0 0;
+}
+.x-btn-tr{
+ width:3px;
+ height:3px;
+ background:no-repeat -3px 0;
+}
+.x-btn-tc{
+ height:3px;
+ background:repeat-x 0 -6px;
+}
+
+.x-btn-ml{
+ width:3px;
+ background:no-repeat 0 -24px;
+}
+.x-btn-mr{
+ width:3px;
+ background:no-repeat -3px -24px;
+}
+
+.x-btn-mc{
+ background:repeat-x 0 -1096px;
+ vertical-align: middle;
+ text-align:center;
+ padding:0 5px;
+ cursor:pointer;
+ white-space:nowrap;
+}
+
+/* Fixes an issue with the button height */
+.ext-strict .ext-ie6 .x-btn-mc, .ext-strict .ext-ie7 .x-btn-mc {
+ height: 100%;
+}
+
+.x-btn-bl{
+ width:3px;
+ height:3px;
+ background:no-repeat 0 -3px;
+}
+
+.x-btn-br{
+ width:3px;
+ height:3px;
+ background:no-repeat -3px -3px;
+}
+
+.x-btn-bc{
+ height:3px;
+ background:repeat-x 0 -15px;
+}
+
+.x-btn-over .x-btn-tl{
+ background-position: -6px 0;
+}
+
+.x-btn-over .x-btn-tr{
+ background-position: -9px 0;
+}
+
+.x-btn-over .x-btn-tc{
+ background-position: 0 -9px;
+}
+
+.x-btn-over .x-btn-ml{
+ background-position: -6px -24px;
+}
+
+.x-btn-over .x-btn-mr{
+ background-position: -9px -24px;
+}
+
+.x-btn-over .x-btn-mc{
+ background-position: 0 -2168px;
+}
+
+.x-btn-over .x-btn-bl{
+ background-position: -6px -3px;
+}
+
+.x-btn-over .x-btn-br{
+ background-position: -9px -3px;
+}
+
+.x-btn-over .x-btn-bc{
+ background-position: 0 -18px;
+}
+
+.x-btn-click .x-btn-tl, .x-btn-menu-active .x-btn-tl, .x-btn-pressed .x-btn-tl{
+ background-position: -12px 0;
+}
+
+.x-btn-click .x-btn-tr, .x-btn-menu-active .x-btn-tr, .x-btn-pressed .x-btn-tr{
+ background-position: -15px 0;
+}
+
+.x-btn-click .x-btn-tc, .x-btn-menu-active .x-btn-tc, .x-btn-pressed .x-btn-tc{
+ background-position: 0 -12px;
+}
+
+.x-btn-click .x-btn-ml, .x-btn-menu-active .x-btn-ml, .x-btn-pressed .x-btn-ml{
+ background-position: -12px -24px;
+}
+
+.x-btn-click .x-btn-mr, .x-btn-menu-active .x-btn-mr, .x-btn-pressed .x-btn-mr{
+ background-position: -15px -24px;
+}
+
+.x-btn-click .x-btn-mc, .x-btn-menu-active .x-btn-mc, .x-btn-pressed .x-btn-mc{
+ background-position: 0 -3240px;
+}
+
+.x-btn-click .x-btn-bl, .x-btn-menu-active .x-btn-bl, .x-btn-pressed .x-btn-bl{
+ background-position: -12px -3px;
+}
+
+.x-btn-click .x-btn-br, .x-btn-menu-active .x-btn-br, .x-btn-pressed .x-btn-br{
+ background-position: -15px -3px;
+}
+
+.x-btn-click .x-btn-bc, .x-btn-menu-active .x-btn-bc, .x-btn-pressed .x-btn-bc{
+ background-position: 0 -21px;
+}
+
+.x-btn-disabled *{
+ cursor:default !important;
+}
+
+
+/* With a menu arrow */
+/* right */
+.x-btn-mc em.x-btn-arrow {
+ display:block;
+ background:transparent no-repeat right center;
+ padding-right:10px;
+}
+
+.x-btn-mc em.x-btn-split {
+ display:block;
+ background:transparent no-repeat right center;
+ padding-right:14px;
+}
+
+/* bottom */
+.x-btn-mc em.x-btn-arrow-bottom {
+ display:block;
+ background:transparent no-repeat center bottom;
+ padding-bottom:14px;
+}
+
+.x-btn-mc em.x-btn-split-bottom {
+ display:block;
+ background:transparent no-repeat center bottom;
+ padding-bottom:14px;
+}
+
+/* height adjustment class */
+.x-btn-as-arrow .x-btn-mc em {
+ display:block;
+ background-color:transparent;
+ padding-bottom:14px;
+}
+
+/* groups */
+.x-btn-group {
+ padding:1px;
+}
+
+.x-btn-group-header {
+ padding:2px;
+ text-align:center;
+}
+
+.x-btn-group-tc {
+ background: transparent repeat-x 0 0;
+ overflow:hidden;
+}
+
+.x-btn-group-tl {
+ background: transparent no-repeat 0 0;
+ padding-left:3px;
+ zoom:1;
+}
+
+.x-btn-group-tr {
+ background: transparent no-repeat right 0;
+ zoom:1;
+ padding-right:3px;
+}
+
+.x-btn-group-bc {
+ background: transparent repeat-x 0 bottom;
+ zoom:1;
+}
+
+.x-btn-group-bc .x-panel-footer {
+ zoom:1;
+}
+
+.x-btn-group-bl {
+ background: transparent no-repeat 0 bottom;
+ padding-left:3px;
+ zoom:1;
+}
+
+.x-btn-group-br {
+ background: transparent no-repeat right bottom;
+ padding-right:3px;
+ zoom:1;
+}
+
+.x-btn-group-mc {
+ border:0 none;
+ padding:1px 0 0 0;
+ margin:0;
+}
+
+.x-btn-group-mc .x-btn-group-body {
+ background-color:transparent;
+ border: 0 none;
+}
+
+.x-btn-group-ml {
+ background: transparent repeat-y 0 0;
+ padding-left:3px;
+ zoom:1;
+}
+
+.x-btn-group-mr {
+ background: transparent repeat-y right 0;
+ padding-right:3px;
+ zoom:1;
+}
+
+.x-btn-group-bc .x-btn-group-footer {
+ padding-bottom:6px;
+}
+
+.x-panel-nofooter .x-btn-group-bc {
+ height:3px;
+ font-size:0;
+ line-height:0;
+}
+
+.x-btn-group-bwrap {
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-btn-group-body {
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-btn-group-notitle .x-btn-group-tc {
+ background: transparent repeat-x 0 0;
+ overflow:hidden;
+ height:2px;
+}.x-toolbar{
+ border-style:solid;
+ border-width:0 0 1px 0;
+ display: block;
+ padding:2px;
+ background:repeat-x top left;
+ position:relative;
+ left:0;
+ top:0;
+ zoom:1;
+ overflow:hidden;
+}
+
+.x-toolbar-left {
+ width: 100%;
+}
+
+.x-toolbar .x-item-disabled .x-btn-icon {
+ opacity: .35;
+ -moz-opacity: .35;
+ filter: alpha(opacity=35);
+}
+
+.x-toolbar td {
+ vertical-align:middle;
+}
+
+.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{
+ white-space: nowrap;
+}
+
+.x-toolbar .x-item-disabled {
+ cursor:default;
+ opacity:.6;
+ -moz-opacity:.6;
+ filter:alpha(opacity=60);
+}
+
+.x-toolbar .x-item-disabled * {
+ cursor:default;
+}
+
+.x-toolbar .x-toolbar-cell {
+ vertical-align:middle;
+}
+
+.x-toolbar .x-btn-tl, .x-toolbar .x-btn-tr, .x-toolbar .x-btn-tc, .x-toolbar .x-btn-ml, .x-toolbar .x-btn-mr,
+.x-toolbar .x-btn-mc, .x-toolbar .x-btn-bl, .x-toolbar .x-btn-br, .x-toolbar .x-btn-bc
+{
+ background-position: 500px 500px;
+}
+
+/* These rules are duplicated from button.css to give priority of x-toolbar rules above */
+.x-toolbar .x-btn-over .x-btn-tl{
+ background-position: -6px 0;
+}
+
+.x-toolbar .x-btn-over .x-btn-tr{
+ background-position: -9px 0;
+}
+
+.x-toolbar .x-btn-over .x-btn-tc{
+ background-position: 0 -9px;
+}
+
+.x-toolbar .x-btn-over .x-btn-ml{
+ background-position: -6px -24px;
+}
+
+.x-toolbar .x-btn-over .x-btn-mr{
+ background-position: -9px -24px;
+}
+
+.x-toolbar .x-btn-over .x-btn-mc{
+ background-position: 0 -2168px;
+}
+
+.x-toolbar .x-btn-over .x-btn-bl{
+ background-position: -6px -3px;
+}
+
+.x-toolbar .x-btn-over .x-btn-br{
+ background-position: -9px -3px;
+}
+
+.x-toolbar .x-btn-over .x-btn-bc{
+ background-position: 0 -18px;
+}
+
+.x-toolbar .x-btn-click .x-btn-tl, .x-toolbar .x-btn-menu-active .x-btn-tl, .x-toolbar .x-btn-pressed .x-btn-tl{
+ background-position: -12px 0;
+}
+
+.x-toolbar .x-btn-click .x-btn-tr, .x-toolbar .x-btn-menu-active .x-btn-tr, .x-toolbar .x-btn-pressed .x-btn-tr{
+ background-position: -15px 0;
+}
+
+.x-toolbar .x-btn-click .x-btn-tc, .x-toolbar .x-btn-menu-active .x-btn-tc, .x-toolbar .x-btn-pressed .x-btn-tc{
+ background-position: 0 -12px;
+}
+
+.x-toolbar .x-btn-click .x-btn-ml, .x-toolbar .x-btn-menu-active .x-btn-ml, .x-toolbar .x-btn-pressed .x-btn-ml{
+ background-position: -12px -24px;
+}
+
+.x-toolbar .x-btn-click .x-btn-mr, .x-toolbar .x-btn-menu-active .x-btn-mr, .x-toolbar .x-btn-pressed .x-btn-mr{
+ background-position: -15px -24px;
+}
+
+.x-toolbar .x-btn-click .x-btn-mc, .x-toolbar .x-btn-menu-active .x-btn-mc, .x-toolbar .x-btn-pressed .x-btn-mc{
+ background-position: 0 -3240px;
+}
+
+.x-toolbar .x-btn-click .x-btn-bl, .x-toolbar .x-btn-menu-active .x-btn-bl, .x-toolbar .x-btn-pressed .x-btn-bl{
+ background-position: -12px -3px;
+}
+
+.x-toolbar .x-btn-click .x-btn-br, .x-toolbar .x-btn-menu-active .x-btn-br, .x-toolbar .x-btn-pressed .x-btn-br{
+ background-position: -15px -3px;
+}
+
+.x-toolbar .x-btn-click .x-btn-bc, .x-toolbar .x-btn-menu-active .x-btn-bc, .x-toolbar .x-btn-pressed .x-btn-bc{
+ background-position: 0 -21px;
+}
+
+.x-toolbar div.xtb-text{
+ padding:2px 2px 0;
+ line-height:16px;
+ display:block;
+}
+
+.x-toolbar .xtb-sep {
+ background-position: center;
+ background-repeat: no-repeat;
+ display: block;
+ font-size: 1px;
+ height: 16px;
+ width:4px;
+ overflow: hidden;
+ cursor:default;
+ margin: 0 2px 0;
+ border:0;
+}
+
+.x-toolbar .xtb-spacer {
+ width:2px;
+}
+
+/* Paging Toolbar */
+.x-tbar-page-number{
+ width:30px;
+ height:14px;
+}
+
+.ext-ie .x-tbar-page-number{
+ margin-top: 2px;
+}
+
+.x-paging-info {
+ position:absolute;
+ top:5px;
+ right: 8px;
+}
+
+/* floating */
+.x-toolbar-ct {
+ width:100%;
+}
+
+.x-toolbar-right td {
+ text-align: center;
+}
+
+.x-panel-tbar, .x-panel-bbar, .x-window-tbar, .x-window-bbar, .x-tab-panel-tbar, .x-tab-panel-bbar, .x-plain-tbar, .x-plain-bbar {
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-toolbar-more .x-btn-small .x-btn-text{
+ height: 16px;
+ width: 12px;
+}
+
+.x-toolbar-more em.x-btn-arrow {
+ display:inline;
+ background-color:transparent;
+ padding-right:0;
+}
+
+.x-toolbar-more .x-btn-mc em.x-btn-arrow {
+ background-image: none;
+}
+
+div.x-toolbar-no-items {
+ color:gray !important;
+ padding:5px 10px !important;
+}
+
+/* fix ie toolbar form items */
+.ext-border-box .x-toolbar-cell .x-form-text {
+ margin-bottom:-1px !important;
+}
+
+.ext-border-box .x-toolbar-cell .x-form-field-wrap .x-form-text {
+ margin:0 !important;
+}
+
+.ext-ie .x-toolbar-cell .x-form-field-wrap {
+ height:21px;
+}
+
+.ext-ie .x-toolbar-cell .x-form-text {
+ position:relative;
+ top:-1px;
+}
+
+.ext-strict .ext-ie8 .x-toolbar-cell .x-form-field-trigger-wrap .x-form-text, .ext-strict .ext-ie .x-toolbar-cell .x-form-text {
+ top: 0px;
+}
+
+.x-toolbar-right td .x-form-field-trigger-wrap{
+ text-align: left;
+}
+
+.x-toolbar-cell .x-form-checkbox, .x-toolbar-cell .x-form-radio{
+ margin-top: 5px;
+}
+
+.x-toolbar-cell .x-form-cb-label{
+ vertical-align: bottom;
+ top: 1px;
+}
+
+.ext-ie .x-toolbar-cell .x-form-checkbox, .ext-ie .x-toolbar-cell .x-form-radio{
+ margin-top: 4px;
+}
+
+.ext-ie .x-toolbar-cell .x-form-cb-label{
+ top: 0;
+}
+/* Grid3 styles */
+.x-grid3 {
+ position:relative;
+ overflow:hidden;
+}
+
+.x-grid-panel .x-panel-body {
+ overflow:hidden !important;
+}
+
+.x-grid-panel .x-panel-mc .x-panel-body {
+ border:1px solid;
+}
+
+.x-grid3 table {
+ table-layout:fixed;
+}
+
+.x-grid3-viewport{
+ overflow:hidden;
+}
+
+.x-grid3-hd-row td, .x-grid3-row td, .x-grid3-summary-row td{
+ -moz-outline: none;
+ outline: none;
+ -moz-user-focus: normal;
+}
+
+.x-grid3-row td, .x-grid3-summary-row td {
+ line-height:13px;
+ vertical-align: top;
+ padding-left:1px;
+ padding-right:1px;
+ -moz-user-select: none;
+ -khtml-user-select:none;
+ -webkit-user-select:ignore;
+}
+
+.x-grid3-cell{
+ -moz-user-select: none;
+ -khtml-user-select:none;
+ -webkit-user-select:ignore;
+}
+
+.x-grid3-hd-row td {
+ line-height:15px;
+ vertical-align:middle;
+ border-left:1px solid;
+ border-right:1px solid;
+}
+
+.x-grid3-hd-row .x-grid3-marker-hd {
+ padding:3px;
+}
+
+.x-grid3-row .x-grid3-marker {
+ padding:3px;
+}
+
+.x-grid3-cell-inner, .x-grid3-hd-inner{
+ overflow:hidden;
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+ padding:3px 3px 3px 5px;
+ white-space: nowrap;
+}
+
+/* ActionColumn, reduce padding to accommodate 16x16 icons in normal row height */
+.x-action-col-cell .x-grid3-cell-inner {
+ padding-top: 1px;
+ padding-bottom: 1px;
+}
+
+.x-action-col-icon {
+ cursor: pointer;
+}
+
+.x-grid3-hd-inner {
+ position:relative;
+ cursor:inherit;
+ padding:4px 3px 4px 5px;
+}
+
+.x-grid3-row-body {
+ white-space:normal;
+}
+
+.x-grid3-body-cell {
+ -moz-outline:0 none;
+ outline:0 none;
+}
+
+/* IE Quirks to clip */
+.ext-ie .x-grid3-cell-inner, .ext-ie .x-grid3-hd-inner{
+ width:100%;
+}
+
+/* reverse above in strict mode */
+.ext-strict .x-grid3-cell-inner, .ext-strict .x-grid3-hd-inner{
+ width:auto;
+}
+
+.x-grid-row-loading {
+ background: no-repeat center center;
+}
+
+.x-grid-page {
+ overflow:hidden;
+}
+
+.x-grid3-row {
+ cursor: default;
+ border: 1px solid;
+ width:100%;
+}
+
+.x-grid3-row-over {
+ border:1px solid;
+ background: repeat-x left top;
+}
+
+.x-grid3-resize-proxy {
+ width:1px;
+ left:0;
+ cursor: e-resize;
+ cursor: col-resize;
+ position:absolute;
+ top:0;
+ height:100px;
+ overflow:hidden;
+ visibility:hidden;
+ border:0 none;
+ z-index:7;
+}
+
+.x-grid3-resize-marker {
+ width:1px;
+ left:0;
+ position:absolute;
+ top:0;
+ height:100px;
+ overflow:hidden;
+ visibility:hidden;
+ border:0 none;
+ z-index:7;
+}
+
+.x-grid3-focus {
+ position:absolute;
+ left:0;
+ top:0;
+ width:1px;
+ height:1px;
+ line-height:1px;
+ font-size:1px;
+ -moz-outline:0 none;
+ outline:0 none;
+ -moz-user-select: text;
+ -khtml-user-select: text;
+ -webkit-user-select:ignore;
+}
+
+/* header styles */
+.x-grid3-header{
+ background: repeat-x 0 bottom;
+ cursor:default;
+ zoom:1;
+ padding:1px 0 0 0;
+}
+
+.x-grid3-header-pop {
+ border-left:1px solid;
+ float:right;
+ clear:none;
+}
+
+.x-grid3-header-pop-inner {
+ border-left:1px solid;
+ width:14px;
+ height:19px;
+ background: transparent no-repeat center center;
+}
+
+.ext-ie .x-grid3-header-pop-inner {
+ width:15px;
+}
+
+.ext-strict .x-grid3-header-pop-inner {
+ width:14px;
+}
+
+.x-grid3-header-inner {
+ overflow:hidden;
+ zoom:1;
+ float:left;
+}
+
+.x-grid3-header-offset {
+ padding-left:1px;
+ text-align: left;
+}
+
+td.x-grid3-hd-over, td.sort-desc, td.sort-asc, td.x-grid3-hd-menu-open {
+ border-left:1px solid;
+ border-right:1px solid;
+}
+
+td.x-grid3-hd-over .x-grid3-hd-inner, td.sort-desc .x-grid3-hd-inner, td.sort-asc .x-grid3-hd-inner, td.x-grid3-hd-menu-open .x-grid3-hd-inner {
+ background: repeat-x left bottom;
+
+}
+
+.x-grid3-sort-icon{
+ background-repeat: no-repeat;
+ display: none;
+ height: 4px;
+ width: 13px;
+ margin-left:3px;
+ vertical-align: middle;
+}
+
+.sort-asc .x-grid3-sort-icon, .sort-desc .x-grid3-sort-icon {
+ display: inline;
+}
+
+/* Header position fixes for IE strict mode */
+.ext-strict .ext-ie .x-grid3-header-inner, .ext-strict .ext-ie6 .x-grid3-hd {
+ position:relative;
+}
+
+.ext-strict .ext-ie6 .x-grid3-hd-inner{
+ position:static;
+}
+
+/* Body Styles */
+.x-grid3-body {
+ zoom:1;
+}
+
+.x-grid3-scroller {
+ overflow:auto;
+ zoom:1;
+ position:relative;
+}
+
+.x-grid3-cell-text, .x-grid3-hd-text {
+ display: block;
+ padding: 3px 5px 3px 5px;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select:ignore;
+}
+
+.x-grid3-split {
+ background-position: center;
+ background-repeat: no-repeat;
+ cursor: e-resize;
+ cursor: col-resize;
+ display: block;
+ font-size: 1px;
+ height: 16px;
+ overflow: hidden;
+ position: absolute;
+ top: 2px;
+ width: 6px;
+ z-index: 3;
+}
+
+/* Column Reorder DD */
+.x-dd-drag-proxy .x-grid3-hd-inner{
+ background: repeat-x left bottom;
+ width:120px;
+ padding:3px;
+ border:1px solid;
+ overflow:hidden;
+}
+
+.col-move-top, .col-move-bottom{
+ width:9px;
+ height:9px;
+ position:absolute;
+ top:0;
+ line-height:1px;
+ font-size:1px;
+ overflow:hidden;
+ visibility:hidden;
+ z-index:20000;
+ background:transparent no-repeat left top;
+}
+
+/* Selection Styles */
+.x-grid3-row-selected {
+ border:1px dotted;
+}
+
+.x-grid3-locked td.x-grid3-row-marker, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{
+ background: repeat-x 0 bottom !important;
+ vertical-align:middle !important;
+ padding:0;
+ border-top:1px solid;
+ border-bottom:none !important;
+ border-right:1px solid !important;
+ text-align:center;
+}
+
+.x-grid3-locked td.x-grid3-row-marker div, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{
+ padding:0 4px;
+ text-align:center;
+}
+
+/* dirty cells */
+.x-grid3-dirty-cell {
+ background: transparent no-repeat 0 0;
+}
+
+/* Grid Toolbars */
+.x-grid3-topbar, .x-grid3-bottombar{
+ overflow:hidden;
+ display:none;
+ zoom:1;
+ position:relative;
+}
+
+.x-grid3-topbar .x-toolbar{
+ border-right:0 none;
+}
+
+.x-grid3-bottombar .x-toolbar{
+ border-right:0 none;
+ border-bottom:0 none;
+ border-top:1px solid;
+}
+
+/* Props Grid Styles */
+.x-props-grid .x-grid3-cell{
+ padding:1px;
+}
+
+.x-props-grid .x-grid3-td-name .x-grid3-cell-inner{
+ background:transparent repeat-y -16px !important;
+ padding-left:12px;
+}
+
+.x-props-grid .x-grid3-body .x-grid3-td-name{
+ padding:1px;
+ padding-right:0;
+ border:0 none;
+ border-right:1px solid;
+}
+
+/* dd */
+.x-grid3-col-dd {
+ border:0 none;
+ padding:0;
+ background-color:transparent;
+}
+
+.x-dd-drag-ghost .x-grid3-dd-wrap {
+ padding:1px 3px 3px 1px;
+}
+
+.x-grid3-hd {
+ -moz-user-select:none;
+ -khtml-user-select:none;
+ -webkit-user-select:ignore;
+}
+
+.x-grid3-hd-btn {
+ display:none;
+ position:absolute;
+ width:14px;
+ background:no-repeat left center;
+ right:0;
+ top:0;
+ z-index:2;
+ cursor:pointer;
+}
+
+.x-grid3-hd-over .x-grid3-hd-btn, .x-grid3-hd-menu-open .x-grid3-hd-btn {
+ display:block;
+}
+
+a.x-grid3-hd-btn:hover {
+ background-position:-14px center;
+}
+
+/* Expanders */
+.x-grid3-body .x-grid3-td-expander {
+ background:transparent repeat-y right;
+}
+
+.x-grid3-body .x-grid3-td-expander .x-grid3-cell-inner {
+ padding:0 !important;
+ height:100%;
+}
+
+.x-grid3-row-expander {
+ width:100%;
+ height:18px;
+ background-position:4px 2px;
+ background-repeat:no-repeat;
+ background-color:transparent;
+}
+
+.x-grid3-row-collapsed .x-grid3-row-expander {
+ background-position:4px 2px;
+}
+
+.x-grid3-row-expanded .x-grid3-row-expander {
+ background-position:-21px 2px;
+}
+
+.x-grid3-row-collapsed .x-grid3-row-body {
+ display:none !important;
+}
+
+.x-grid3-row-expanded .x-grid3-row-body {
+ display:block !important;
+}
+
+/* Checkers */
+.x-grid3-body .x-grid3-td-checker {
+ background:transparent repeat-y right;
+}
+
+.x-grid3-body .x-grid3-td-checker .x-grid3-cell-inner, .x-grid3-header .x-grid3-td-checker .x-grid3-hd-inner {
+ padding:0 !important;
+ height:100%;
+}
+
+.x-grid3-row-checker, .x-grid3-hd-checker {
+ width:100%;
+ height:18px;
+ background-position:2px 2px;
+ background-repeat:no-repeat;
+ background-color:transparent;
+}
+
+.x-grid3-row .x-grid3-row-checker {
+ background-position:2px 2px;
+}
+
+.x-grid3-row-selected .x-grid3-row-checker, .x-grid3-hd-checker-on .x-grid3-hd-checker,.x-grid3-row-checked .x-grid3-row-checker {
+ background-position:-23px 2px;
+}
+
+.x-grid3-hd-checker {
+ background-position:2px 1px;
+}
+
+.ext-border-box .x-grid3-hd-checker {
+ background-position:2px 3px;
+}
+
+.x-grid3-hd-checker-on .x-grid3-hd-checker {
+ background-position:-23px 1px;
+}
+
+.ext-border-box .x-grid3-hd-checker-on .x-grid3-hd-checker {
+ background-position:-23px 3px;
+}
+
+/* Numberer */
+.x-grid3-body .x-grid3-td-numberer {
+ background:transparent repeat-y right;
+}
+
+.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner {
+ padding:3px 5px 0 0 !important;
+ text-align:right;
+}
+
+/* Row Icon */
+
+.x-grid3-body .x-grid3-td-row-icon {
+ background:transparent repeat-y right;
+ vertical-align:top;
+ text-align:center;
+}
+
+.x-grid3-body .x-grid3-td-row-icon .x-grid3-cell-inner {
+ padding:0 !important;
+ background-position:center center;
+ background-repeat:no-repeat;
+ width:16px;
+ height:16px;
+ margin-left:2px;
+ margin-top:3px;
+}
+
+/* All specials */
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander {
+ background:transparent repeat-y right;
+}
+
+.x-grid3-body .x-grid3-check-col-td .x-grid3-cell-inner {
+ padding: 1px 0 0 0 !important;
+}
+
+.x-grid3-check-col {
+ width:100%;
+ height:16px;
+ background-position:center center;
+ background-repeat:no-repeat;
+ background-color:transparent;
+}
+
+.x-grid3-check-col-on {
+ width:100%;
+ height:16px;
+ background-position:center center;
+ background-repeat:no-repeat;
+ background-color:transparent;
+}
+
+/* Grouping classes */
+.x-grid-group, .x-grid-group-body, .x-grid-group-hd {
+ zoom:1;
+}
+
+.x-grid-group-hd {
+ border-bottom: 2px solid;
+ cursor:pointer;
+ padding-top:6px;
+}
+
+.x-grid-group-hd div.x-grid-group-title {
+ background:transparent no-repeat 3px 3px;
+ padding:4px 4px 4px 17px;
+}
+
+.x-grid-group-collapsed .x-grid-group-body {
+ display:none;
+}
+
+.ext-ie6 .x-grid3 .x-editor .x-form-text, .ext-ie7 .x-grid3 .x-editor .x-form-text {
+ position:relative;
+ top:-1px;
+}
+
+.x-grid-editor .x-form-check-wrap {
+ text-align: center;
+ margin-top: -4px;
+}
+
+.ext-ie .x-props-grid .x-editor .x-form-text {
+ position:static;
+ top:0;
+}
+
+.x-grid-empty {
+ padding:10px;
+}
+
+/* fix floating toolbar issue */
+.ext-ie7 .x-grid-panel .x-panel-bbar {
+ position:relative;
+}
+
+
+/* Reset position to static when Grid Panel has been framed */
+/* to resolve 'snapping' from top to bottom behavior. */
+/* @forumThread 86656 */
+.ext-ie7 .x-grid-panel .x-panel-mc .x-panel-bbar {
+ position: static;
+}
+
+.ext-ie6 .x-grid3-header {
+ position: relative;
+}
+
+/* Fix WebKit bug in Grids */
+.ext-webkit .x-grid-panel .x-panel-bwrap{
+ -webkit-user-select:none;
+}
+.ext-webkit .x-tbar-page-number{
+ -webkit-user-select:ignore;
+}
+/* end*/
+
+/* column lines */
+.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell {
+ padding-right:0;
+ border-right:1px solid;
+}
+.x-pivotgrid .x-grid3-header-offset table {
+ width: 100%;
+ border-collapse: collapse;
+}
+
+.x-pivotgrid .x-grid3-header-offset table td {
+ padding: 4px 3px 4px 5px;
+ text-align: center;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ font-size: 11px;
+ line-height: 13px;
+ font-family: tahoma;
+}
+
+.x-pivotgrid .x-grid3-row-headers {
+ display: block;
+ float: left;
+}
+
+.x-pivotgrid .x-grid3-row-headers table {
+ height: 100%;
+ width: 100%;
+ border-collapse: collapse;
+}
+
+.x-pivotgrid .x-grid3-row-headers table td {
+ height: 18px;
+ padding: 2px 7px 0 0;
+ text-align: right;
+ text-overflow: ellipsis;
+ font-size: 11px;
+ font-family: tahoma;
+}
+
+.ext-gecko .x-pivotgrid .x-grid3-row-headers table td {
+ height: 21px;
+}
+
+.x-grid3-header-title {
+ top: 0%;
+ left: 0%;
+ position: absolute;
+ text-align: center;
+ vertical-align: middle;
+ font-family: tahoma;
+ font-size: 11px;
+ padding: auto 1px;
+ display: table-cell;
+}
+
+.x-grid3-header-title span {
+ position: absolute;
+ top: 50%;
+ left: 0%;
+ width: 100%;
+ margin-top: -6px;
+}.x-dd-drag-proxy{
+ position:absolute;
+ left:0;
+ top:0;
+ visibility:hidden;
+ z-index:15000;
+}
+
+.x-dd-drag-ghost{
+ -moz-opacity: 0.85;
+ opacity:.85;
+ filter: alpha(opacity=85);
+ border: 1px solid;
+ padding:3px;
+ padding-left:20px;
+ white-space:nowrap;
+}
+
+.x-dd-drag-repair .x-dd-drag-ghost{
+ -moz-opacity: 0.4;
+ opacity:.4;
+ filter: alpha(opacity=40);
+ border:0 none;
+ padding:0;
+ background-color:transparent;
+}
+
+.x-dd-drag-repair .x-dd-drop-icon{
+ visibility:hidden;
+}
+
+.x-dd-drop-icon{
+ position:absolute;
+ top:3px;
+ left:3px;
+ display:block;
+ width:16px;
+ height:16px;
+ background-color:transparent;
+ background-position: center;
+ background-repeat: no-repeat;
+ z-index:1;
+}
+
+.x-view-selector {
+ position:absolute;
+ left:0;
+ top:0;
+ width:0;
+ border:1px dotted;
+ opacity: .5;
+ -moz-opacity: .5;
+ filter:alpha(opacity=50);
+ zoom:1;
+}.ext-strict .ext-ie .x-tree .x-panel-bwrap{
+ position:relative;
+ overflow:hidden;
+}
+
+.x-tree-icon, .x-tree-ec-icon, .x-tree-elbow-line, .x-tree-elbow, .x-tree-elbow-end, .x-tree-elbow-plus, .x-tree-elbow-minus, .x-tree-elbow-end-plus, .x-tree-elbow-end-minus{
+ border: 0 none;
+ height: 18px;
+ margin: 0;
+ padding: 0;
+ vertical-align: top;
+ width: 16px;
+ background-repeat: no-repeat;
+}
+
+.x-tree-node-collapsed .x-tree-node-icon, .x-tree-node-expanded .x-tree-node-icon, .x-tree-node-leaf .x-tree-node-icon{
+ border: 0 none;
+ height: 18px;
+ margin: 0;
+ padding: 0;
+ vertical-align: top;
+ width: 16px;
+ background-position:center;
+ background-repeat: no-repeat;
+}
+
+.ext-ie .x-tree-node-indent img, .ext-ie .x-tree-node-icon, .ext-ie .x-tree-ec-icon {
+ vertical-align: middle !important;
+}
+
+.ext-strict .ext-ie8 .x-tree-node-indent img, .ext-strict .ext-ie8 .x-tree-node-icon, .ext-strict .ext-ie8 .x-tree-ec-icon {
+ vertical-align: top !important;
+}
+
+/* checkboxes */
+
+input.x-tree-node-cb {
+ margin-left:1px;
+ height: 19px;
+ vertical-align: bottom;
+}
+
+.ext-ie input.x-tree-node-cb {
+ margin-left:0;
+ margin-top: 1px;
+ width: 16px;
+ height: 16px;
+ vertical-align: middle;
+}
+
+.ext-strict .ext-ie8 input.x-tree-node-cb{
+ margin: 1px 1px;
+ height: 14px;
+ vertical-align: bottom;
+}
+
+.ext-strict .ext-ie8 input.x-tree-node-cb + a{
+ vertical-align: bottom;
+}
+
+.ext-opera input.x-tree-node-cb {
+ height: 14px;
+ vertical-align: middle;
+}
+
+.x-tree-noicon .x-tree-node-icon{
+ width:0; height:0;
+}
+
+/* No line styles */
+.x-tree-no-lines .x-tree-elbow{
+ background-color:transparent;
+}
+
+.x-tree-no-lines .x-tree-elbow-end{
+ background-color:transparent;
+}
+
+.x-tree-no-lines .x-tree-elbow-line{
+ background-color:transparent;
+}
+
+/* Arrows */
+.x-tree-arrows .x-tree-elbow{
+ background-color:transparent;
+}
+
+.x-tree-arrows .x-tree-elbow-plus{
+ background:transparent no-repeat 0 0;
+}
+
+.x-tree-arrows .x-tree-elbow-minus{
+ background:transparent no-repeat -16px 0;
+}
+
+.x-tree-arrows .x-tree-elbow-end{
+ background-color:transparent;
+}
+
+.x-tree-arrows .x-tree-elbow-end-plus{
+ background:transparent no-repeat 0 0;
+}
+
+.x-tree-arrows .x-tree-elbow-end-minus{
+ background:transparent no-repeat -16px 0;
+}
+
+.x-tree-arrows .x-tree-elbow-line{
+ background-color:transparent;
+}
+
+.x-tree-arrows .x-tree-ec-over .x-tree-elbow-plus{
+ background-position:-32px 0;
+}
+
+.x-tree-arrows .x-tree-ec-over .x-tree-elbow-minus{
+ background-position:-48px 0;
+}
+
+.x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-plus{
+ background-position:-32px 0;
+}
+
+.x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-minus{
+ background-position:-48px 0;
+}
+
+.x-tree-elbow-plus, .x-tree-elbow-minus, .x-tree-elbow-end-plus, .x-tree-elbow-end-minus{
+ cursor:pointer;
+}
+
+.ext-ie ul.x-tree-node-ct{
+ font-size:0;
+ line-height:0;
+ zoom:1;
+}
+
+.x-tree-node{
+ white-space: nowrap;
+}
+
+.x-tree-node-el {
+ line-height:18px;
+ cursor:pointer;
+}
+
+.x-tree-node a, .x-dd-drag-ghost a{
+ text-decoration:none;
+ -khtml-user-select:none;
+ -moz-user-select:none;
+ -webkit-user-select:ignore;
+ -kthml-user-focus:normal;
+ -moz-user-focus:normal;
+ -moz-outline: 0 none;
+ outline:0 none;
+}
+
+.x-tree-node a span, .x-dd-drag-ghost a span{
+ text-decoration:none;
+ padding:1px 3px 1px 2px;
+}
+
+.x-tree-node .x-tree-node-disabled .x-tree-node-icon{
+ -moz-opacity: 0.5;
+ opacity:.5;
+ filter: alpha(opacity=50);
+}
+
+.x-tree-node .x-tree-node-inline-icon{
+ background-color:transparent;
+}
+
+.x-tree-node a:hover, .x-dd-drag-ghost a:hover{
+ text-decoration:none;
+}
+
+.x-tree-node div.x-tree-drag-insert-below{
+ border-bottom:1px dotted;
+}
+
+.x-tree-node div.x-tree-drag-insert-above{
+ border-top:1px dotted;
+}
+
+.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below{
+ border-bottom:0 none;
+}
+
+.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above{
+ border-top:0 none;
+}
+
+.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{
+ border-bottom:2px solid;
+}
+
+.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{
+ border-top:2px solid;
+}
+
+.x-tree-node .x-tree-drag-append a span{
+ border:1px dotted;
+}
+
+.x-dd-drag-ghost .x-tree-node-indent, .x-dd-drag-ghost .x-tree-ec-icon{
+ display:none !important;
+}
+
+/* Fix for ie rootVisible:false issue */
+.x-tree-root-ct {
+ zoom:1;
+}
+.x-date-picker {
+ border: 1px solid;
+ border-top:0 none;
+ position:relative;
+}
+
+.x-date-picker a {
+ -moz-outline:0 none;
+ outline:0 none;
+}
+
+.x-date-inner, .x-date-inner td, .x-date-inner th{
+ border-collapse:separate;
+}
+
+.x-date-middle,.x-date-left,.x-date-right {
+ background: repeat-x 0 -83px;
+ overflow:hidden;
+}
+
+.x-date-middle .x-btn-tc,.x-date-middle .x-btn-tl,.x-date-middle .x-btn-tr,
+.x-date-middle .x-btn-mc,.x-date-middle .x-btn-ml,.x-date-middle .x-btn-mr,
+.x-date-middle .x-btn-bc,.x-date-middle .x-btn-bl,.x-date-middle .x-btn-br{
+ background:transparent !important;
+ vertical-align:middle;
+}
+
+.x-date-middle .x-btn-mc em.x-btn-arrow {
+ background:transparent no-repeat right 0;
+}
+
+.x-date-right, .x-date-left {
+ width:18px;
+}
+
+.x-date-right{
+ text-align:right;
+}
+
+.x-date-middle {
+ padding-top:2px;
+ padding-bottom:2px;
+ width:130px; /* FF3 */
+}
+
+.x-date-right a, .x-date-left a{
+ display:block;
+ width:16px;
+ height:16px;
+ background-position: center;
+ background-repeat: no-repeat;
+ cursor:pointer;
+ -moz-opacity: 0.6;
+ opacity:.6;
+ filter: alpha(opacity=60);
+}
+
+.x-date-right a:hover, .x-date-left a:hover{
+ -moz-opacity: 1;
+ opacity:1;
+ filter: alpha(opacity=100);
+}
+
+.x-item-disabled .x-date-right a:hover, .x-item-disabled .x-date-left a:hover{
+ -moz-opacity: 0.6;
+ opacity:.6;
+ filter: alpha(opacity=60);
+}
+
+.x-date-right a {
+ margin-right:2px;
+ text-decoration:none !important;
+}
+
+.x-date-left a{
+ margin-left:2px;
+ text-decoration:none !important;
+}
+
+table.x-date-inner {
+ width: 100%;
+ table-layout:fixed;
+}
+
+.ext-webkit table.x-date-inner{
+ /* Fix for webkit browsers */
+ width: 175px;
+}
+
+
+.x-date-inner th {
+ width:25px;
+}
+
+.x-date-inner th {
+ background: repeat-x left top;
+ text-align:right !important;
+ border-bottom: 1px solid;
+ cursor:default;
+ padding:0;
+ border-collapse:separate;
+}
+
+.x-date-inner th span {
+ display:block;
+ padding:2px;
+ padding-right:7px;
+}
+
+.x-date-inner td {
+ border: 1px solid;
+ text-align:right;
+ padding:0;
+}
+
+.x-date-inner a {
+ padding:2px 5px;
+ display:block;
+ text-decoration:none;
+ text-align:right;
+ zoom:1;
+}
+
+.x-date-inner .x-date-active{
+ cursor:pointer;
+ color:black;
+}
+
+.x-date-inner .x-date-selected a{
+ background: repeat-x left top;
+ border:1px solid;
+ padding:1px 4px;
+}
+
+.x-date-inner .x-date-today a{
+ border: 1px solid;
+ padding:1px 4px;
+}
+
+.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a {
+ text-decoration:none !important;
+}
+
+.x-date-bottom {
+ padding:4px;
+ border-top: 1px solid;
+ background: repeat-x left top;
+}
+
+.x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{
+ text-decoration:none !important;
+}
+
+.x-item-disabled .x-date-inner a:hover{
+ background: none;
+}
+
+.x-date-inner .x-date-disabled a {
+ cursor:default;
+}
+
+.x-date-menu .x-menu-item {
+ padding:1px 24px 1px 4px;
+ white-space: nowrap;
+}
+
+.x-date-menu .x-menu-item .x-menu-item-icon {
+ width:10px;
+ height:10px;
+ margin-right:5px;
+ background-position:center -4px !important;
+}
+
+.x-date-mp {
+ position:absolute;
+ left:0;
+ top:0;
+ display:none;
+}
+
+.x-date-mp td {
+ padding:2px;
+ font:normal 11px arial, helvetica,tahoma,sans-serif;
+}
+
+td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn {
+ border: 0 none;
+ text-align:center;
+ vertical-align: middle;
+ width:25%;
+}
+
+.x-date-mp-ok {
+ margin-right:3px;
+}
+
+.x-date-mp-btns button {
+ text-decoration:none;
+ text-align:center;
+ text-decoration:none !important;
+ border:1px solid;
+ padding:1px 3px 1px;
+ cursor:pointer;
+}
+
+.x-date-mp-btns {
+ background: repeat-x left top;
+}
+
+.x-date-mp-btns td {
+ border-top: 1px solid;
+ text-align:center;
+}
+
+td.x-date-mp-month a,td.x-date-mp-year a {
+ display:block;
+ padding:2px 4px;
+ text-decoration:none;
+ text-align:center;
+}
+
+td.x-date-mp-month a:hover,td.x-date-mp-year a:hover {
+ text-decoration:none;
+ cursor:pointer;
+}
+
+td.x-date-mp-sel a {
+ padding:1px 3px;
+ background: repeat-x left top;
+ border:1px solid;
+}
+
+.x-date-mp-ybtn a {
+ overflow:hidden;
+ width:15px;
+ height:15px;
+ cursor:pointer;
+ background:transparent no-repeat;
+ display:block;
+ margin:0 auto;
+}
+
+.x-date-mp-ybtn a.x-date-mp-next {
+ background-position:0 -120px;
+}
+
+.x-date-mp-ybtn a.x-date-mp-next:hover {
+ background-position:-15px -120px;
+}
+
+.x-date-mp-ybtn a.x-date-mp-prev {
+ background-position:0 -105px;
+}
+
+.x-date-mp-ybtn a.x-date-mp-prev:hover {
+ background-position:-15px -105px;
+}
+
+.x-date-mp-ybtn {
+ text-align:center;
+}
+
+td.x-date-mp-sep {
+ border-right:1px solid;
+}.x-tip{
+ position: absolute;
+ top: 0;
+ left:0;
+ visibility: hidden;
+ z-index: 20002;
+ border:0 none;
+}
+
+.x-tip .x-tip-close{
+ height: 15px;
+ float:right;
+ width: 15px;
+ margin:0 0 2px 2px;
+ cursor:pointer;
+ display:none;
+}
+
+.x-tip .x-tip-tc {
+ background: transparent no-repeat 0 -62px;
+ padding-top:3px;
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-tip .x-tip-tl {
+ background: transparent no-repeat 0 0;
+ padding-left:6px;
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-tip .x-tip-tr {
+ background: transparent no-repeat right 0;
+ padding-right:6px;
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-tip .x-tip-bc {
+ background: transparent no-repeat 0 -121px;
+ height:3px;
+ overflow:hidden;
+}
+
+.x-tip .x-tip-bl {
+ background: transparent no-repeat 0 -59px;
+ padding-left:6px;
+ zoom:1;
+}
+
+.x-tip .x-tip-br {
+ background: transparent no-repeat right -59px;
+ padding-right:6px;
+ zoom:1;
+}
+
+.x-tip .x-tip-mc {
+ border:0 none;
+}
+
+.x-tip .x-tip-ml {
+ background: no-repeat 0 -124px;
+ padding-left:6px;
+ zoom:1;
+}
+
+.x-tip .x-tip-mr {
+ background: transparent no-repeat right -124px;
+ padding-right:6px;
+ zoom:1;
+}
+
+.ext-ie .x-tip .x-tip-header,.ext-ie .x-tip .x-tip-tc {
+ font-size:0;
+ line-height:0;
+}
+
+.ext-border-box .x-tip .x-tip-header, .ext-border-box .x-tip .x-tip-tc{
+ line-height: 1px;
+}
+
+.x-tip .x-tip-header-text {
+ padding:0;
+ margin:0 0 2px 0;
+}
+
+.x-tip .x-tip-body {
+ margin:0 !important;
+ line-height:14px;
+ padding:0;
+}
+
+.x-tip .x-tip-body .loading-indicator {
+ margin:0;
+}
+
+.x-tip-draggable .x-tip-header,.x-tip-draggable .x-tip-header-text {
+ cursor:move;
+}
+
+.x-form-invalid-tip .x-tip-tc {
+ background: repeat-x 0 -12px;
+ padding-top:6px;
+}
+
+.x-form-invalid-tip .x-tip-bc {
+ background: repeat-x 0 -18px;
+ height:6px;
+}
+
+.x-form-invalid-tip .x-tip-bl {
+ background: no-repeat 0 -6px;
+}
+
+.x-form-invalid-tip .x-tip-br {
+ background: no-repeat right -6px;
+}
+
+.x-form-invalid-tip .x-tip-body {
+ padding:2px;
+}
+
+.x-form-invalid-tip .x-tip-body {
+ padding-left:24px;
+ background:transparent no-repeat 2px 2px;
+}
+
+.x-tip-anchor {
+ position: absolute;
+ width: 9px;
+ height: 10px;
+ overflow:hidden;
+ background: transparent no-repeat 0 0;
+ zoom:1;
+}
+.x-tip-anchor-bottom {
+ background-position: -9px 0;
+}
+.x-tip-anchor-right {
+ background-position: -18px 0;
+ width: 10px;
+}
+.x-tip-anchor-left {
+ background-position: -28px 0;
+ width: 10px;
+}.x-menu {
+ z-index: 15000;
+ zoom: 1;
+ background: repeat-y;
+}
+
+.x-menu-floating{
+ border: 1px solid;
+}
+
+.x-menu a {
+ text-decoration: none !important;
+}
+
+.ext-ie .x-menu {
+ zoom:1;
+ overflow:hidden;
+}
+
+.x-menu-list{
+ padding: 2px;
+ background-color:transparent;
+ border:0 none;
+ overflow:hidden;
+ overflow-y: hidden;
+}
+
+.ext-strict .ext-ie .x-menu-list{
+ position: relative;
+}
+
+.x-menu li{
+ line-height:100%;
+}
+
+.x-menu li.x-menu-sep-li{
+ font-size:1px;
+ line-height:1px;
+}
+
+.x-menu-list-item{
+ white-space: nowrap;
+ display:block;
+ padding:1px;
+}
+
+.x-menu-item{
+ -moz-user-select: none;
+ -khtml-user-select:none;
+ -webkit-user-select:ignore;
+}
+
+.x-menu-item-arrow{
+ background:transparent no-repeat right;
+}
+
+.x-menu-sep {
+ display:block;
+ font-size:1px;
+ line-height:1px;
+ margin: 2px 3px;
+ border-bottom:1px solid;
+ overflow:hidden;
+}
+
+.x-menu-focus {
+ position:absolute;
+ left:-1px;
+ top:-1px;
+ width:1px;
+ height:1px;
+ line-height:1px;
+ font-size:1px;
+ -moz-outline:0 none;
+ outline:0 none;
+ -moz-user-select: none;
+ -khtml-user-select:none;
+ -webkit-user-select:ignore;
+ overflow:hidden;
+ display:block;
+}
+
+a.x-menu-item {
+ cursor: pointer;
+ display: block;
+ line-height: 16px;
+ outline-color: -moz-use-text-color;
+ outline-style: none;
+ outline-width: 0;
+ padding: 3px 21px 3px 27px;
+ position: relative;
+ text-decoration: none;
+ white-space: nowrap;
+}
+
+.x-menu-item-active {
+ background-repeat: repeat-x;
+ background-position: left bottom;
+ border-style:solid;
+ border-width: 1px 0;
+ margin:0 1px;
+ padding: 0;
+}
+
+.x-menu-item-active a.x-menu-item {
+ border-style:solid;
+ border-width:0 1px;
+ margin:0 -1px;
+}
+
+.x-menu-item-icon {
+ border: 0 none;
+ height: 16px;
+ padding: 0;
+ vertical-align: top;
+ width: 16px;
+ position: absolute;
+ left: 3px;
+ top: 3px;
+ margin: 0;
+ background-position:center;
+}
+
+.ext-ie .x-menu-item-icon {
+ left: -24px;
+}
+.ext-strict .x-menu-item-icon {
+ left: 3px;
+}
+
+.ext-ie6 .x-menu-item-icon {
+ left: -24px;
+}
+
+.ext-ie .x-menu-item-icon {
+ vertical-align: middle;
+}
+
+.x-menu-check-item .x-menu-item-icon{
+ background: transparent no-repeat center;
+}
+
+.x-menu-group-item .x-menu-item-icon{
+ background-color: transparent;
+}
+
+.x-menu-item-checked .x-menu-group-item .x-menu-item-icon{
+ background: transparent no-repeat center;
+}
+
+.x-date-menu .x-menu-list{
+ padding: 0;
+}
+
+.x-menu-date-item{
+ padding:0;
+}
+
+.x-menu .x-color-palette, .x-menu .x-date-picker{
+ margin-left: 26px;
+ margin-right:4px;
+}
+
+.x-menu .x-date-picker{
+ border:1px solid;
+ margin-top:2px;
+ margin-bottom:2px;
+}
+
+.x-menu-plain .x-color-palette, .x-menu-plain .x-date-picker{
+ margin: 0;
+ border: 0 none;
+}
+
+.x-date-menu {
+ padding:0 !important;
+}
+
+/*
+ * fixes separator visibility problem in IE 6
+ */
+.ext-strict .ext-ie6 .x-menu-sep-li {
+ padding: 3px 4px;
+}
+.ext-strict .ext-ie6 .x-menu-sep {
+ margin: 0;
+ height: 1px;
+}
+
+/*
+ * Fixes an issue with "fat" separators in webkit
+ */
+.ext-webkit .x-menu-sep{
+ height: 1px;
+}
+
+/*
+ * Ugly mess to remove the white border under the picker
+ */
+.ext-ie .x-date-menu{
+ height: 199px;
+}
+
+.ext-strict .ext-ie .x-date-menu, .ext-border-box .ext-ie8 .x-date-menu{
+ height: 197px;
+}
+
+.ext-strict .ext-ie7 .x-date-menu{
+ height: 195px;
+}
+
+.ext-strict .ext-ie8 .x-date-menu{
+ height: auto;
+}
+
+.x-cycle-menu .x-menu-item-checked {
+ border:1px dotted !important;
+ padding:0;
+}
+
+.x-menu .x-menu-scroller {
+ width: 100%;
+ background-repeat:no-repeat;
+ background-position:center;
+ height:8px;
+ line-height: 8px;
+ cursor:pointer;
+ margin: 0;
+ padding: 0;
+}
+
+.x-menu .x-menu-scroller-active{
+ height: 6px;
+ line-height: 6px;
+}
+
+.x-menu-list-item-indent{
+ padding-left: 27px;
+}/*
+ Creates rounded, raised boxes like on the Ext website - the markup isn't pretty:
+ <div class="x-box-blue">
+ <div class="x-box-tl"><div class="x-box-tr"><div class="x-box-tc"></div></div></div>
+ <div class="x-box-ml"><div class="x-box-mr"><div class="x-box-mc">
+ <h3>YOUR TITLE HERE (optional)</h3>
+ <div>YOUR CONTENT HERE</div>
+ </div></div></div>
+ <div class="x-box-bl"><div class="x-box-br"><div class="x-box-bc"></div></div></div>
+ </div>
+ */
+
+.x-box-tl {
+ background: transparent no-repeat 0 0;
+ zoom:1;
+}
+
+.x-box-tc {
+ height: 8px;
+ background: transparent repeat-x 0 0;
+ overflow: hidden;
+}
+
+.x-box-tr {
+ background: transparent no-repeat right -8px;
+}
+
+.x-box-ml {
+ background: transparent repeat-y 0;
+ padding-left: 4px;
+ overflow: hidden;
+ zoom:1;
+}
+
+.x-box-mc {
+ background: repeat-x 0 -16px;
+ padding: 4px 10px;
+}
+
+.x-box-mc h3 {
+ margin: 0 0 4px 0;
+ zoom:1;
+}
+
+.x-box-mr {
+ background: transparent repeat-y right;
+ padding-right: 4px;
+ overflow: hidden;
+}
+
+.x-box-bl {
+ background: transparent no-repeat 0 -16px;
+ zoom:1;
+}
+
+.x-box-bc {
+ background: transparent repeat-x 0 -8px;
+ height: 8px;
+ overflow: hidden;
+}
+
+.x-box-br {
+ background: transparent no-repeat right -24px;
+}
+
+.x-box-tl, .x-box-bl {
+ padding-left: 8px;
+ overflow: hidden;
+}
+
+.x-box-tr, .x-box-br {
+ padding-right: 8px;
+ overflow: hidden;
+}.x-combo-list {
+ border:1px solid;
+ zoom:1;
+ overflow:hidden;
+}
+
+.x-combo-list-inner {
+ overflow:auto;
+ position:relative; /* for calculating scroll offsets */
+ zoom:1;
+ overflow-x:hidden;
+}
+
+.x-combo-list-hd {
+ border-bottom:1px solid;
+ padding:3px;
+}
+
+.x-resizable-pinned .x-combo-list-inner {
+ border-bottom:1px solid;
+}
+
+.x-combo-list-item {
+ padding:2px;
+ border:1px solid;
+ white-space: nowrap;
+ overflow:hidden;
+ text-overflow: ellipsis;
+}
+
+.x-combo-list .x-combo-selected{
+ border:1px dotted !important;
+ cursor:pointer;
+}
+
+.x-combo-list .x-toolbar {
+ border-top:1px solid;
+ border-bottom:0 none;
+}.x-panel {
+ border-style: solid;
+ border-width:0;
+}
+
+.x-panel-header {
+ overflow:hidden;
+ zoom:1;
+ padding:5px 3px 4px 5px;
+ border:1px solid;
+ line-height: 15px;
+ background: transparent repeat-x 0 -1px;
+}
+
+.x-panel-body {
+ border:1px solid;
+ border-top:0 none;
+ overflow:hidden;
+ position: relative; /* added for item scroll positioning */
+}
+
+.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar {
+ border:1px solid;
+ border-top:0 none;
+ overflow:hidden;
+ padding:2px;
+}
+
+.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar {
+ border-top:1px solid;
+ border-bottom: 0 none;
+}
+
+.x-panel-body-noheader, .x-panel-mc .x-panel-body {
+ border-top:1px solid;
+}
+
+.x-panel-header {
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-panel-tl .x-panel-header {
+ padding:5px 0 4px 0;
+ border:0 none;
+ background:transparent no-repeat;
+}
+
+.x-panel-tl .x-panel-icon, .x-window-tl .x-panel-icon {
+ padding-left:20px !important;
+ background-repeat:no-repeat;
+ background-position:0 4px;
+ zoom:1;
+}
+
+.x-panel-inline-icon {
+ width:16px;
+ height:16px;
+ background-repeat:no-repeat;
+ background-position:0 0;
+ vertical-align:middle;
+ margin-right:4px;
+ margin-top:-1px;
+ margin-bottom:-1px;
+}
+
+.x-panel-tc {
+ background: transparent repeat-x 0 0;
+ overflow:hidden;
+}
+
+/* fix ie7 strict mode bug */
+.ext-strict .ext-ie7 .x-panel-tc {
+ overflow: visible;
+}
+
+.x-panel-tl {
+ background: transparent no-repeat 0 0;
+ padding-left:6px;
+ zoom:1;
+ border-bottom:1px solid;
+}
+
+.x-panel-tr {
+ background: transparent no-repeat right 0;
+ zoom:1;
+ padding-right:6px;
+}
+
+.x-panel-bc {
+ background: transparent repeat-x 0 bottom;
+ zoom:1;
+}
+
+.x-panel-bc .x-panel-footer {
+ zoom:1;
+}
+
+.x-panel-bl {
+ background: transparent no-repeat 0 bottom;
+ padding-left:6px;
+ zoom:1;
+}
+
+.x-panel-br {
+ background: transparent no-repeat right bottom;
+ padding-right:6px;
+ zoom:1;
+}
+
+.x-panel-mc {
+ border:0 none;
+ padding:0;
+ margin:0;
+ padding-top:6px;
+}
+
+.x-panel-mc .x-panel-body {
+ background-color:transparent;
+ border: 0 none;
+}
+
+.x-panel-ml {
+ background: repeat-y 0 0;
+ padding-left:6px;
+ zoom:1;
+}
+
+.x-panel-mr {
+ background: transparent repeat-y right 0;
+ padding-right:6px;
+ zoom:1;
+}
+
+.x-panel-bc .x-panel-footer {
+ padding-bottom:6px;
+}
+
+.x-panel-nofooter .x-panel-bc, .x-panel-nofooter .x-window-bc {
+ height:6px;
+ font-size:0;
+ line-height:0;
+}
+
+.x-panel-bwrap {
+ overflow:hidden;
+ zoom:1;
+ left:0;
+ top:0;
+}
+.x-panel-body {
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-panel-collapsed .x-resizable-handle{
+ display:none;
+}
+
+.ext-gecko .x-panel-animated div {
+ overflow:hidden !important;
+}
+
+/* Plain */
+.x-plain-body {
+ overflow:hidden;
+}
+
+.x-plain-bbar .x-toolbar {
+ overflow:hidden;
+ padding:2px;
+}
+
+.x-plain-tbar .x-toolbar {
+ overflow:hidden;
+ padding:2px;
+}
+
+.x-plain-bwrap {
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-plain {
+ overflow:hidden;
+}
+
+/* Tools */
+.x-tool {
+ overflow:hidden;
+ width:15px;
+ height:15px;
+ float:right;
+ cursor:pointer;
+ background:transparent no-repeat;
+ margin-left:2px;
+}
+
+/* expand / collapse tools */
+.x-tool-toggle {
+ background-position:0 -60px;
+}
+
+.x-tool-toggle-over {
+ background-position:-15px -60px;
+}
+
+.x-panel-collapsed .x-tool-toggle {
+ background-position:0 -75px;
+}
+
+.x-panel-collapsed .x-tool-toggle-over {
+ background-position:-15px -75px;
+}
+
+
+.x-tool-close {
+ background-position:0 -0;
+}
+
+.x-tool-close-over {
+ background-position:-15px 0;
+}
+
+.x-tool-minimize {
+ background-position:0 -15px;
+}
+
+.x-tool-minimize-over {
+ background-position:-15px -15px;
+}
+
+.x-tool-maximize {
+ background-position:0 -30px;
+}
+
+.x-tool-maximize-over {
+ background-position:-15px -30px;
+}
+
+.x-tool-restore {
+ background-position:0 -45px;
+}
+
+.x-tool-restore-over {
+ background-position:-15px -45px;
+}
+
+.x-tool-gear {
+ background-position:0 -90px;
+}
+
+.x-tool-gear-over {
+ background-position:-15px -90px;
+}
+
+.x-tool-prev {
+ background-position:0 -105px;
+}
+
+.x-tool-prev-over {
+ background-position:-15px -105px;
+}
+
+.x-tool-next {
+ background-position:0 -120px;
+}
+
+.x-tool-next-over {
+ background-position:-15px -120px;
+}
+
+.x-tool-pin {
+ background-position:0 -135px;
+}
+
+.x-tool-pin-over {
+ background-position:-15px -135px;
+}
+
+.x-tool-unpin {
+ background-position:0 -150px;
+}
+
+.x-tool-unpin-over {
+ background-position:-15px -150px;
+}
+
+.x-tool-right {
+ background-position:0 -165px;
+}
+
+.x-tool-right-over {
+ background-position:-15px -165px;
+}
+
+.x-tool-left {
+ background-position:0 -180px;
+}
+
+.x-tool-left-over {
+ background-position:-15px -180px;
+}
+
+.x-tool-down {
+ background-position:0 -195px;
+}
+
+.x-tool-down-over {
+ background-position:-15px -195px;
+}
+
+.x-tool-up {
+ background-position:0 -210px;
+}
+
+.x-tool-up-over {
+ background-position:-15px -210px;
+}
+
+.x-tool-refresh {
+ background-position:0 -225px;
+}
+
+.x-tool-refresh-over {
+ background-position:-15px -225px;
+}
+
+.x-tool-plus {
+ background-position:0 -240px;
+}
+
+.x-tool-plus-over {
+ background-position:-15px -240px;
+}
+
+.x-tool-minus {
+ background-position:0 -255px;
+}
+
+.x-tool-minus-over {
+ background-position:-15px -255px;
+}
+
+.x-tool-search {
+ background-position:0 -270px;
+}
+
+.x-tool-search-over {
+ background-position:-15px -270px;
+}
+
+.x-tool-save {
+ background-position:0 -285px;
+}
+
+.x-tool-save-over {
+ background-position:-15px -285px;
+}
+
+.x-tool-help {
+ background-position:0 -300px;
+}
+
+.x-tool-help-over {
+ background-position:-15px -300px;
+}
+
+.x-tool-print {
+ background-position:0 -315px;
+}
+
+.x-tool-print-over {
+ background-position:-15px -315px;
+}
+
+.x-tool-expand {
+ background-position:0 -330px;
+}
+
+.x-tool-expand-over {
+ background-position:-15px -330px;
+}
+
+.x-tool-collapse {
+ background-position:0 -345px;
+}
+
+.x-tool-collapse-over {
+ background-position:-15px -345px;
+}
+
+.x-tool-resize {
+ background-position:0 -360px;
+}
+
+.x-tool-resize-over {
+ background-position:-15px -360px;
+}
+
+.x-tool-move {
+ background-position:0 -375px;
+}
+
+.x-tool-move-over {
+ background-position:-15px -375px;
+}
+
+/* Ghosting */
+.x-panel-ghost {
+ z-index:12000;
+ overflow:hidden;
+ position:absolute;
+ left:0;top:0;
+ opacity:.65;
+ -moz-opacity:.65;
+ filter:alpha(opacity=65);
+}
+
+.x-panel-ghost ul {
+ margin:0;
+ padding:0;
+ overflow:hidden;
+ font-size:0;
+ line-height:0;
+ border:1px solid;
+ border-top:0 none;
+ display:block;
+}
+
+.x-panel-ghost * {
+ cursor:move !important;
+}
+
+.x-panel-dd-spacer {
+ border:2px dashed;
+}
+
+/* Buttons */
+.x-panel-btns {
+ padding:5px;
+ overflow:hidden;
+}
+
+.x-panel-btns td.x-toolbar-cell{
+ padding:3px;
+}
+
+.x-panel-btns .x-btn-focus .x-btn-left{
+ background-position:0 -147px;
+}
+
+.x-panel-btns .x-btn-focus .x-btn-right{
+ background-position:0 -168px;
+}
+
+.x-panel-btns .x-btn-focus .x-btn-center{
+ background-position:0 -189px;
+}
+
+.x-panel-btns .x-btn-over .x-btn-left{
+ background-position:0 -63px;
+}
+
+.x-panel-btns .x-btn-over .x-btn-right{
+ background-position:0 -84px;
+}
+
+.x-panel-btns .x-btn-over .x-btn-center{
+ background-position:0 -105px;
+}
+
+.x-panel-btns .x-btn-click .x-btn-center{
+ background-position:0 -126px;
+}
+
+.x-panel-btns .x-btn-click .x-btn-right{
+ background-position:0 -84px;
+}
+
+.x-panel-btns .x-btn-click .x-btn-left{
+ background-position:0 -63px;
+}
+
+.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{
+ white-space: nowrap;
+}
+/**
+ * W3C Suggested Default style sheet for HTML 4
+ * http://www.w3.org/TR/CSS21/sample.html
+ *
+ * Resets for Ext.Panel @cfg normal: true
+ */
+.x-panel-reset .x-panel-body html,
+.x-panel-reset .x-panel-body address,
+.x-panel-reset .x-panel-body blockquote,
+.x-panel-reset .x-panel-body body,
+.x-panel-reset .x-panel-body dd,
+.x-panel-reset .x-panel-body div,
+.x-panel-reset .x-panel-body dl,
+.x-panel-reset .x-panel-body dt,
+.x-panel-reset .x-panel-body fieldset,
+.x-panel-reset .x-panel-body form,
+.x-panel-reset .x-panel-body frame, frameset,
+.x-panel-reset .x-panel-body h1,
+.x-panel-reset .x-panel-body h2,
+.x-panel-reset .x-panel-body h3,
+.x-panel-reset .x-panel-body h4,
+.x-panel-reset .x-panel-body h5,
+.x-panel-reset .x-panel-body h6,
+.x-panel-reset .x-panel-body noframes,
+.x-panel-reset .x-panel-body ol,
+.x-panel-reset .x-panel-body p,
+.x-panel-reset .x-panel-body ul,
+.x-panel-reset .x-panel-body center,
+.x-panel-reset .x-panel-body dir,
+.x-panel-reset .x-panel-body hr,
+.x-panel-reset .x-panel-body menu,
+.x-panel-reset .x-panel-body pre { display: block }
+.x-panel-reset .x-panel-body li { display: list-item }
+.x-panel-reset .x-panel-body head { display: none }
+.x-panel-reset .x-panel-body table { display: table }
+.x-panel-reset .x-panel-body tr { display: table-row }
+.x-panel-reset .x-panel-body thead { display: table-header-group }
+.x-panel-reset .x-panel-body tbody { display: table-row-group }
+.x-panel-reset .x-panel-body tfoot { display: table-footer-group }
+.x-panel-reset .x-panel-body col { display: table-column }
+.x-panel-reset .x-panel-body colgroup { display: table-column-group }
+.x-panel-reset .x-panel-body td,
+.x-panel-reset .x-panel-body th { display: table-cell }
+.x-panel-reset .x-panel-body caption { display: table-caption }
+.x-panel-reset .x-panel-body th { font-weight: bolder; text-align: center }
+.x-panel-reset .x-panel-body caption { text-align: center }
+.x-panel-reset .x-panel-body body { margin: 8px }
+.x-panel-reset .x-panel-body h1 { font-size: 2em; margin: .67em 0 }
+.x-panel-reset .x-panel-body h2 { font-size: 1.5em; margin: .75em 0 }
+.x-panel-reset .x-panel-body h3 { font-size: 1.17em; margin: .83em 0 }
+.x-panel-reset .x-panel-body h4,
+.x-panel-reset .x-panel-body p,
+.x-panel-reset .x-panel-body blockquote,
+.x-panel-reset .x-panel-body ul,
+.x-panel-reset .x-panel-body fieldset,
+.x-panel-reset .x-panel-body form,
+.x-panel-reset .x-panel-body ol,
+.x-panel-reset .x-panel-body dl,
+.x-panel-reset .x-panel-body dir,
+.x-panel-reset .x-panel-body menu { margin: 1.12em 0 }
+.x-panel-reset .x-panel-body h5 { font-size: .83em; margin: 1.5em 0 }
+.x-panel-reset .x-panel-body h6 { font-size: .75em; margin: 1.67em 0 }
+.x-panel-reset .x-panel-body h1,
+.x-panel-reset .x-panel-body h2,
+.x-panel-reset .x-panel-body h3,
+.x-panel-reset .x-panel-body h4,
+.x-panel-reset .x-panel-body h5,
+.x-panel-reset .x-panel-body h6,
+.x-panel-reset .x-panel-body b,
+.x-panel-reset .x-panel-body strong { font-weight: bolder }
+.x-panel-reset .x-panel-body blockquote { margin-left: 40px; margin-right: 40px }
+.x-panel-reset .x-panel-body i,
+.x-panel-reset .x-panel-body cite,
+.x-panel-reset .x-panel-body em,
+.x-panel-reset .x-panel-body var,
+.x-panel-reset .x-panel-body address { font-style: italic }
+.x-panel-reset .x-panel-body pre,
+.x-panel-reset .x-panel-body tt,
+.x-panel-reset .x-panel-body code,
+.x-panel-reset .x-panel-body kbd,
+.x-panel-reset .x-panel-body samp { font-family: monospace }
+.x-panel-reset .x-panel-body pre { white-space: pre }
+.x-panel-reset .x-panel-body button,
+.x-panel-reset .x-panel-body textarea,
+.x-panel-reset .x-panel-body input,
+.x-panel-reset .x-panel-body select { display: inline-block }
+.x-panel-reset .x-panel-body big { font-size: 1.17em }
+.x-panel-reset .x-panel-body small,
+.x-panel-reset .x-panel-body sub,
+.x-panel-reset .x-panel-body sup { font-size: .83em }
+.x-panel-reset .x-panel-body sub { vertical-align: sub }
+.x-panel-reset .x-panel-body sup { vertical-align: super }
+.x-panel-reset .x-panel-body table { border-spacing: 2px; }
+.x-panel-reset .x-panel-body thead,
+.x-panel-reset .x-panel-body tbody,
+.x-panel-reset .x-panel-body tfoot { vertical-align: middle }
+.x-panel-reset .x-panel-body td,
+.x-panel-reset .x-panel-body th { vertical-align: inherit }
+.x-panel-reset .x-panel-body s,
+.x-panel-reset .x-panel-body strike,
+.x-panel-reset .x-panel-body del { text-decoration: line-through }
+.x-panel-reset .x-panel-body hr { border: 1px inset }
+.x-panel-reset .x-panel-body ol,
+.x-panel-reset .x-panel-body ul,
+.x-panel-reset .x-panel-body dir,
+.x-panel-reset .x-panel-body menu,
+.x-panel-reset .x-panel-body dd { margin-left: 40px }
+.x-panel-reset .x-panel-body ul, .x-panel-reset .x-panel-body menu, .x-panel-reset .x-panel-body dir { list-style-type: disc;}
+.x-panel-reset .x-panel-body ol { list-style-type: decimal }
+.x-panel-reset .x-panel-body ol ul,
+.x-panel-reset .x-panel-body ul ol,
+.x-panel-reset .x-panel-body ul ul,
+.x-panel-reset .x-panel-body ol ol { margin-top: 0; margin-bottom: 0 }
+.x-panel-reset .x-panel-body u,
+.x-panel-reset .x-panel-body ins { text-decoration: underline }
+.x-panel-reset .x-panel-body br:before { content: "\A" }
+.x-panel-reset .x-panel-body :before, .x-panel-reset .x-panel-body :after { white-space: pre-line }
+.x-panel-reset .x-panel-body center { text-align: center }
+.x-panel-reset .x-panel-body :link, .x-panel-reset .x-panel-body :visited { text-decoration: underline }
+.x-panel-reset .x-panel-body :focus { outline: invert dotted thin }
+
+/* Begin bidirectionality settings (do not change) */
+.x-panel-reset .x-panel-body BDO[DIR="ltr"] { direction: ltr; unicode-bidi: bidi-override }
+.x-panel-reset .x-panel-body BDO[DIR="rtl"] { direction: rtl; unicode-bidi: bidi-override }
+.x-window {
+ zoom:1;
+}
+
+.x-window .x-window-handle {
+ opacity:0;
+ -moz-opacity:0;
+ filter:alpha(opacity=0);
+}
+
+.x-window-proxy {
+ border:1px solid;
+ z-index:12000;
+ overflow:hidden;
+ position:absolute;
+ left:0;top:0;
+ display:none;
+ opacity:.5;
+ -moz-opacity:.5;
+ filter:alpha(opacity=50);
+}
+
+.x-window-header {
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-window-bwrap {
+ z-index:1;
+ position:relative;
+ zoom:1;
+ left:0;top:0;
+}
+
+.x-window-tl .x-window-header {
+ padding:5px 0 4px 0;
+}
+
+.x-window-header-text {
+ cursor:pointer;
+}
+
+.x-window-tc {
+ background: transparent repeat-x 0 0;
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-window-tl {
+ background: transparent no-repeat 0 0;
+ padding-left:6px;
+ zoom:1;
+ z-index:1;
+ position:relative;
+}
+
+.x-window-tr {
+ background: transparent no-repeat right 0;
+ padding-right:6px;
+}
+
+.x-window-bc {
+ background: transparent repeat-x 0 bottom;
+ zoom:1;
+}
+
+.x-window-bc .x-window-footer {
+ padding-bottom:6px;
+ zoom:1;
+ font-size:0;
+ line-height:0;
+}
+
+.x-window-bl {
+ background: transparent no-repeat 0 bottom;
+ padding-left:6px;
+ zoom:1;
+}
+
+.x-window-br {
+ background: transparent no-repeat right bottom;
+ padding-right:6px;
+ zoom:1;
+}
+
+.x-window-mc {
+ border:1px solid;
+ padding:0;
+ margin:0;
+}
+
+.x-window-ml {
+ background: transparent repeat-y 0 0;
+ padding-left:6px;
+ zoom:1;
+}
+
+.x-window-mr {
+ background: transparent repeat-y right 0;
+ padding-right:6px;
+ zoom:1;
+}
+
+.x-window-body {
+ overflow:hidden;
+}
+
+.x-window-bwrap {
+ overflow:hidden;
+}
+
+.x-window-maximized .x-window-bl, .x-window-maximized .x-window-br,
+ .x-window-maximized .x-window-ml, .x-window-maximized .x-window-mr,
+ .x-window-maximized .x-window-tl, .x-window-maximized .x-window-tr {
+ padding:0;
+}
+
+.x-window-maximized .x-window-footer {
+ padding-bottom:0;
+}
+
+.x-window-maximized .x-window-tc {
+ padding-left:3px;
+ padding-right:3px;
+}
+
+.x-window-maximized .x-window-mc {
+ border-left:0 none;
+ border-right:0 none;
+}
+
+.x-window-tbar .x-toolbar, .x-window-bbar .x-toolbar {
+ border-left:0 none;
+ border-right: 0 none;
+}
+
+.x-window-bbar .x-toolbar {
+ border-top:1px solid;
+ border-bottom:0 none;
+}
+
+.x-window-draggable, .x-window-draggable .x-window-header-text {
+ cursor:move;
+}
+
+.x-window-maximized .x-window-draggable, .x-window-maximized .x-window-draggable .x-window-header-text {
+ cursor:default;
+}
+
+.x-window-body {
+ background-color:transparent;
+}
+
+.x-panel-ghost .x-window-tl {
+ border-bottom:1px solid;
+}
+
+.x-panel-collapsed .x-window-tl {
+ border-bottom:1px solid;
+}
+
+.x-window-maximized-ct {
+ overflow:hidden;
+}
+
+.x-window-maximized .x-window-handle {
+ display:none;
+}
+
+.x-window-sizing-ghost ul {
+ border:0 none !important;
+}
+
+.x-dlg-focus{
+ -moz-outline:0 none;
+ outline:0 none;
+ width:0;
+ height:0;
+ overflow:hidden;
+ position:absolute;
+ top:0;
+ left:0;
+}
+
+.ext-webkit .x-dlg-focus{
+ width: 1px;
+ height: 1px;
+}
+
+.x-dlg-mask{
+ z-index:10000;
+ display:none;
+ position:absolute;
+ top:0;
+ left:0;
+ -moz-opacity: 0.5;
+ opacity:.50;
+ filter: alpha(opacity=50);
+}
+
+body.ext-ie6.x-body-masked select {
+ visibility:hidden;
+}
+
+body.ext-ie6.x-body-masked .x-window select {
+ visibility:visible;
+}
+
+.x-window-plain .x-window-mc {
+ border: 1px solid;
+}
+
+.x-window-plain .x-window-body {
+ border: 1px solid;
+ background:transparent !important;
+}.x-html-editor-wrap {
+ border:1px solid;
+}
+
+.x-html-editor-tb .x-btn-text {
+ background:transparent no-repeat;
+}
+
+.x-html-editor-tb .x-edit-bold, .x-menu-item img.x-edit-bold {
+ background-position:0 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-italic, .x-menu-item img.x-edit-italic {
+ background-position:-16px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-underline, .x-menu-item img.x-edit-underline {
+ background-position:-32px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-forecolor, .x-menu-item img.x-edit-forecolor {
+ background-position:-160px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-backcolor, .x-menu-item img.x-edit-backcolor {
+ background-position:-176px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-justifyleft, .x-menu-item img.x-edit-justifyleft {
+ background-position:-112px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-justifycenter, .x-menu-item img.x-edit-justifycenter {
+ background-position:-128px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-justifyright, .x-menu-item img.x-edit-justifyright {
+ background-position:-144px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-insertorderedlist, .x-menu-item img.x-edit-insertorderedlist {
+ background-position:-80px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-insertunorderedlist, .x-menu-item img.x-edit-insertunorderedlist {
+ background-position:-96px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-increasefontsize, .x-menu-item img.x-edit-increasefontsize {
+ background-position:-48px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-decreasefontsize, .x-menu-item img.x-edit-decreasefontsize {
+ background-position:-64px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-sourceedit, .x-menu-item img.x-edit-sourceedit {
+ background-position:-192px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-createlink, .x-menu-item img.x-edit-createlink {
+ background-position:-208px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tip .x-tip-bd .x-tip-bd-inner {
+ padding:5px;
+ padding-bottom:1px;
+}
+
+.x-html-editor-tb .x-toolbar {
+ position:static !important;
+}.x-panel-noborder .x-panel-body-noborder {
+ border-width:0;
+}
+
+.x-panel-noborder .x-panel-header-noborder {
+ border-width:0 0 1px;
+ border-style:solid;
+}
+
+.x-panel-noborder .x-panel-tbar-noborder .x-toolbar {
+ border-width:0 0 1px;
+ border-style:solid;
+}
+
+.x-panel-noborder .x-panel-bbar-noborder .x-toolbar {
+ border-width:1px 0 0 0;
+ border-style:solid;
+}
+
+.x-window-noborder .x-window-mc {
+ border-width:0;
+}
+
+.x-window-plain .x-window-body-noborder {
+ border-width:0;
+}
+
+.x-tab-panel-noborder .x-tab-panel-body-noborder {
+ border-width:0;
+}
+
+.x-tab-panel-noborder .x-tab-panel-header-noborder {
+ border-width: 0 0 1px 0;
+}
+
+.x-tab-panel-noborder .x-tab-panel-footer-noborder {
+ border-width: 1px 0 0 0;
+}
+
+.x-tab-panel-bbar-noborder .x-toolbar {
+ border-width: 1px 0 0 0;
+ border-style:solid;
+}
+
+.x-tab-panel-tbar-noborder .x-toolbar {
+ border-width:0 0 1px;
+ border-style:solid;
+}.x-border-layout-ct {
+ position: relative;
+}
+
+.x-border-panel {
+ position:absolute;
+ left:0;
+ top:0;
+}
+
+.x-tool-collapse-south {
+ background-position:0 -195px;
+}
+
+.x-tool-collapse-south-over {
+ background-position:-15px -195px;
+}
+
+.x-tool-collapse-north {
+ background-position:0 -210px;
+}
+
+.x-tool-collapse-north-over {
+ background-position:-15px -210px;
+}
+
+.x-tool-collapse-west {
+ background-position:0 -180px;
+}
+
+.x-tool-collapse-west-over {
+ background-position:-15px -180px;
+}
+
+.x-tool-collapse-east {
+ background-position:0 -165px;
+}
+
+.x-tool-collapse-east-over {
+ background-position:-15px -165px;
+}
+
+.x-tool-expand-south {
+ background-position:0 -210px;
+}
+
+.x-tool-expand-south-over {
+ background-position:-15px -210px;
+}
+
+.x-tool-expand-north {
+ background-position:0 -195px;
+}
+.x-tool-expand-north-over {
+ background-position:-15px -195px;
+}
+
+.x-tool-expand-west {
+ background-position:0 -165px;
+}
+
+.x-tool-expand-west-over {
+ background-position:-15px -165px;
+}
+
+.x-tool-expand-east {
+ background-position:0 -180px;
+}
+
+.x-tool-expand-east-over {
+ background-position:-15px -180px;
+}
+
+.x-tool-expand-north, .x-tool-expand-south {
+ float:right;
+ margin:3px;
+}
+
+.x-tool-expand-east, .x-tool-expand-west {
+ float:none;
+ margin:3px 2px;
+}
+
+.x-accordion-hd .x-tool-toggle {
+ background-position:0 -255px;
+}
+
+.x-accordion-hd .x-tool-toggle-over {
+ background-position:-15px -255px;
+}
+
+.x-panel-collapsed .x-accordion-hd .x-tool-toggle {
+ background-position:0 -240px;
+}
+
+.x-panel-collapsed .x-accordion-hd .x-tool-toggle-over {
+ background-position:-15px -240px;
+}
+
+.x-accordion-hd {
+ padding-top:4px;
+ padding-bottom:3px;
+ border-top:0 none;
+ background: transparent repeat-x 0 -9px;
+}
+
+.x-layout-collapsed{
+ position:absolute;
+ left:-10000px;
+ top:-10000px;
+ visibility:hidden;
+ width:20px;
+ height:20px;
+ overflow:hidden;
+ border:1px solid;
+ z-index:20;
+}
+
+.ext-border-box .x-layout-collapsed{
+ width:22px;
+ height:22px;
+}
+
+.x-layout-collapsed-over{
+ cursor:pointer;
+}
+
+.x-layout-collapsed-west .x-layout-collapsed-tools, .x-layout-collapsed-east .x-layout-collapsed-tools{
+ position:absolute;
+ top:0;
+ left:0;
+ width:20px;
+ height:20px;
+}
+
+
+.x-layout-split{
+ position:absolute;
+ height:5px;
+ width:5px;
+ line-height:1px;
+ font-size:1px;
+ z-index:3;
+ background-color:transparent;
+}
+
+/* IE6 strict won't drag w/out a color */
+.ext-strict .ext-ie6 .x-layout-split{
+ background-color: #fff !important;
+ filter: alpha(opacity=1);
+}
+
+.x-layout-split-h{
+ background-image:url(../images/default/s.gif);
+ background-position: left;
+}
+
+.x-layout-split-v{
+ background-image:url(../images/default/s.gif);
+ background-position: top;
+}
+
+.x-column-layout-ct {
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-column {
+ float:left;
+ padding:0;
+ margin:0;
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-column-inner {
+ overflow:hidden;
+ zoom:1;
+}
+
+/* mini mode */
+.x-layout-mini {
+ position:absolute;
+ top:0;
+ left:0;
+ display:block;
+ width:5px;
+ height:35px;
+ cursor:pointer;
+ opacity:.5;
+ -moz-opacity:.5;
+ filter:alpha(opacity=50);
+}
+
+.x-layout-mini-over, .x-layout-collapsed-over .x-layout-mini{
+ opacity:1;
+ -moz-opacity:1;
+ filter:none;
+}
+
+.x-layout-split-west .x-layout-mini {
+ top:48%;
+}
+
+.x-layout-split-east .x-layout-mini {
+ top:48%;
+}
+
+.x-layout-split-north .x-layout-mini {
+ left:48%;
+ height:5px;
+ width:35px;
+}
+
+.x-layout-split-south .x-layout-mini {
+ left:48%;
+ height:5px;
+ width:35px;
+}
+
+.x-layout-cmini-west .x-layout-mini {
+ top:48%;
+}
+
+.x-layout-cmini-east .x-layout-mini {
+ top:48%;
+}
+
+.x-layout-cmini-north .x-layout-mini {
+ left:48%;
+ height:5px;
+ width:35px;
+}
+
+.x-layout-cmini-south .x-layout-mini {
+ left:48%;
+ height:5px;
+ width:35px;
+}
+
+.x-layout-cmini-west, .x-layout-cmini-east {
+ border:0 none;
+ width:5px !important;
+ padding:0;
+ background-color:transparent;
+}
+
+.x-layout-cmini-north, .x-layout-cmini-south {
+ border:0 none;
+ height:5px !important;
+ padding:0;
+ background-color:transparent;
+}
+
+.x-viewport, .x-viewport body {
+ margin: 0;
+ padding: 0;
+ border: 0 none;
+ overflow: hidden;
+ height: 100%;
+}
+
+.x-abs-layout-item {
+ position:absolute;
+ left:0;
+ top:0;
+}
+
+.ext-ie input.x-abs-layout-item, .ext-ie textarea.x-abs-layout-item {
+ margin:0;
+}
+
+.x-box-layout-ct {
+ overflow:hidden;
+ zoom:1;
+}
+
+.x-box-inner {
+ overflow:hidden;
+ zoom:1;
+ position:relative;
+ left:0;
+ top:0;
+}
+
+.x-box-item {
+ position:absolute;
+ left:0;
+ top:0;
+}.x-progress-wrap {
+ border:1px solid;
+ overflow:hidden;
+}
+
+.x-progress-inner {
+ height:18px;
+ background:repeat-x;
+ position:relative;
+}
+
+.x-progress-bar {
+ height:18px;
+ float:left;
+ width:0;
+ background: repeat-x left center;
+ border-top:1px solid;
+ border-bottom:1px solid;
+ border-right:1px solid;
+}
+
+.x-progress-text {
+ padding:1px 5px;
+ overflow:hidden;
+ position:absolute;
+ left:0;
+ text-align:center;
+}
+
+.x-progress-text-back {
+ line-height:16px;
+}
+
+.ext-ie .x-progress-text-back {
+ line-height:15px;
+}
+
+.ext-strict .ext-ie7 .x-progress-text-back{
+ width: 100%;
+}
+.x-list-header{
+ background: repeat-x 0 bottom;
+ cursor:default;
+ zoom:1;
+ height:22px;
+}
+
+.x-list-header-inner div {
+ display:block;
+ float:left;
+ overflow:hidden;
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.x-list-header-inner div em {
+ display:block;
+ border-left:1px solid;
+ padding:4px 4px;
+ overflow:hidden;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ line-height:14px;
+}
+
+.x-list-body {
+ overflow:auto;
+ overflow-x:hidden;
+ overflow-y:auto;
+ zoom:1;
+ float: left;
+ width: 100%;
+}
+
+.x-list-body dl {
+ zoom:1;
+}
+
+.x-list-body dt {
+ display:block;
+ float:left;
+ overflow:hidden;
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ cursor:pointer;
+ zoom:1;
+}
+
+.x-list-body dt em {
+ display:block;
+ padding:3px 4px;
+ overflow:hidden;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+}
+
+.x-list-resizer {
+ border-left:1px solid;
+ border-right:1px solid;
+ position:absolute;
+ left:0;
+ top:0;
+}
+
+.x-list-header-inner em.sort-asc {
+ background: transparent no-repeat center 0;
+ border-style:solid;
+ border-width: 0 1px 1px;
+ padding-bottom:3px;
+}
+
+.x-list-header-inner em.sort-desc {
+ background: transparent no-repeat center -23px;
+ border-style:solid;
+ border-width: 0 1px 1px;
+ padding-bottom:3px;
+}
+
+/* Shared styles */
+.x-slider {
+ zoom:1;
+}
+
+.x-slider-inner {
+ position:relative;
+ left:0;
+ top:0;
+ overflow:visible;
+ zoom:1;
+}
+
+.x-slider-focus {
+ position:absolute;
+ left:0;
+ top:0;
+ width:1px;
+ height:1px;
+ line-height:1px;
+ font-size:1px;
+ -moz-outline:0 none;
+ outline:0 none;
+ -moz-user-select: none;
+ -khtml-user-select:none;
+ -webkit-user-select:ignore;
+ display:block;
+ overflow:hidden;
+}
+
+/* Horizontal styles */
+.x-slider-horz {
+ padding-left:7px;
+ background:transparent no-repeat 0 -22px;
+}
+
+.x-slider-horz .x-slider-end {
+ padding-right:7px;
+ zoom:1;
+ background:transparent no-repeat right -44px;
+}
+
+.x-slider-horz .x-slider-inner {
+ background:transparent repeat-x 0 0;
+ height:22px;
+}
+
+.x-slider-horz .x-slider-thumb {
+ width:14px;
+ height:15px;
+ position:absolute;
+ left:0;
+ top:3px;
+ background:transparent no-repeat 0 0;
+}
+
+.x-slider-horz .x-slider-thumb-over {
+ background-position: -14px -15px;
+}
+
+.x-slider-horz .x-slider-thumb-drag {
+ background-position: -28px -30px;
+}
+
+/* Vertical styles */
+.x-slider-vert {
+ padding-top:7px;
+ background:transparent no-repeat -44px 0;
+ width:22px;
+}
+
+.x-slider-vert .x-slider-end {
+ padding-bottom:7px;
+ zoom:1;
+ background:transparent no-repeat -22px bottom;
+}
+
+.x-slider-vert .x-slider-inner {
+ background:transparent repeat-y 0 0;
+}
+
+.x-slider-vert .x-slider-thumb {
+ width:15px;
+ height:14px;
+ position:absolute;
+ left:3px;
+ bottom:0;
+ background:transparent no-repeat 0 0;
+}
+
+.x-slider-vert .x-slider-thumb-over {
+ background-position: -15px -14px;
+}
+
+.x-slider-vert .x-slider-thumb-drag {
+ background-position: -30px -28px;
+}.x-window-dlg .x-window-body {
+ border:0 none !important;
+ padding:5px 10px;
+ overflow:hidden !important;
+}
+
+.x-window-dlg .x-window-mc {
+ border:0 none !important;
+}
+
+.x-window-dlg .ext-mb-input {
+ margin-top:4px;
+ width:95%;
+}
+
+.x-window-dlg .ext-mb-textarea {
+ margin-top:4px;
+}
+
+.x-window-dlg .x-progress-wrap {
+ margin-top:4px;
+}
+
+.ext-ie .x-window-dlg .x-progress-wrap {
+ margin-top:6px;
+}
+
+.x-window-dlg .x-msg-box-wait {
+ background:transparent no-repeat left;
+ display:block;
+ width:300px;
+ padding-left:18px;
+ line-height:18px;
+}
+
+.x-window-dlg .ext-mb-icon {
+ float:left;
+ width:47px;
+ height:32px;
+}
+
+.x-window-dlg .x-dlg-icon .ext-mb-content{
+ zoom: 1;
+ margin-left: 47px;
+}
+
+.x-window-dlg .ext-mb-info, .x-window-dlg .ext-mb-warning, .x-window-dlg .ext-mb-question, .x-window-dlg .ext-mb-error {
+ background:transparent no-repeat top left;
+}
+
+.ext-gecko2 .ext-mb-fix-cursor {
+ overflow:auto;
+}
diff --git a/deluge/ui/web/css/ext-extensions-debug.css b/deluge/ui/web/css/ext-extensions-debug.css
new file mode 100644
index 0000000..89a41fd
--- /dev/null
+++ b/deluge/ui/web/css/ext-extensions-debug.css
@@ -0,0 +1,261 @@
+/*
+ * ColumnTree styles
+ */
+.x-column-tree .x-tree-node {
+ zoom:1;
+}
+.x-column-tree .x-tree-node-el {
+ /*border-bottom:1px solid #eee; borders? */
+ zoom:1;
+}
+.x-column-tree .x-tree-selected {
+ background: #d9e8fb;
+}
+.x-column-tree .x-tree-node a {
+ line-height:18px;
+ vertical-align:middle;
+}
+.x-column-tree .x-tree-node a span{
+
+}
+.x-column-tree .x-tree-node .x-tree-selected a span{
+ background:transparent;
+ color:#000;
+}
+.x-tree-col {
+ float:left;
+ overflow:hidden;
+ padding:0 1px;
+ zoom:1;
+}
+
+.x-tree-col-text, .x-tree-hd-text {
+ overflow:hidden;
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+ padding:3px 3px 3px 5px;
+ white-space: nowrap;
+ font:normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-tree-headers {
+ background: #f9f9f9 url(../../resources/images/default/grid/grid3-hrow.gif) repeat-x 0 bottom;
+ cursor:default;
+ zoom:1;
+}
+
+.x-tree-hd {
+ float:left;
+ overflow:hidden;
+ border-left:1px solid #eee;
+ border-right:1px solid #d0d0d0;
+}
+
+/*
+ * FileUploadField component styles
+ */
+.x-form-file-wrap {
+ position: relative;
+ height: 22px;
+}
+.x-form-file-wrap .x-form-file {
+ position: absolute;
+ right: 0;
+ -moz-opacity: 0;
+ filter:alpha(opacity: 0);
+ opacity: 0;
+ z-index: 2;
+ height: 22px;
+ cursor: pointer;
+}
+.x-form-file-wrap .x-btn {
+ position: absolute;
+ right: 0;
+ z-index: 1;
+}
+.x-form-file-wrap .x-form-file-text {
+ position: absolute;
+ left: 0;
+ z-index: 3;
+ color: #777;
+}
+
+/*
+ * Spinner styles
+ */
+.x-form-spinner-proxy{
+ /*background-color:#ff00cc;*/
+}
+.x-form-field-wrap .x-form-spinner-trigger {
+ background: transparent url(../images/spinner.gif) no-repeat 0 0;
+}
+
+.x-form-field-wrap .x-form-spinner-overup{
+ background-position:-17px 0;
+}
+.x-form-field-wrap .x-form-spinner-clickup{
+ background-position:-34px 0;
+}
+.x-form-field-wrap .x-form-spinner-overdown{
+ background-position:-51px 0;
+}
+.x-form-field-wrap .x-form-spinner-clickdown{
+ background-position:-68px 0;
+}
+
+
+.x-trigger-wrap-focus .x-form-spinner-trigger{
+ background-position:-85px 0;
+}
+.x-trigger-wrap-focus .x-form-spinner-overup{
+ background-position:-102px 0;
+}
+.x-trigger-wrap-focus .x-form-spinner-clickup{
+ background-position:-119px 0;
+}
+.x-trigger-wrap-focus .x-form-spinner-overdown{
+ background-position:-136px 0;
+}
+.x-trigger-wrap-focus .x-form-spinner-clickdown{
+ background-position:-153px 0;
+}
+.x-trigger-wrap-focus .x-form-trigger{
+ border-bottom: 1px solid #7eadd9;
+}
+
+.x-form-field-wrap .x-form-spinner-splitter {
+ line-height:1px;
+ font-size:1px;
+ background:transparent url(../images/spinner-split.gif) no-repeat 0 0;
+ position:absolute;
+ cursor: n-resize;
+}
+.x-trigger-wrap-focus .x-form-spinner-splitter{
+ background-position:-14px 0;
+}
+
+.x-form-uxspinner .x-form-field-wrap {
+ height: 24px;
+}
+
+/*
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/* StatusBar - structure */
+.x-statusbar .x-status-text {
+ cursor: default;
+/*
+ height: 21px;
+ line-height: 21px;
+ padding: 0 4px;
+*/
+}
+.x-statusbar .x-status-busy {
+ padding-left: 25px !important;
+ background: transparent no-repeat 3px 2px;
+}
+
+.x-toolbar div.xtb-text
+
+.x-statusbar .x-status-text-panel {
+ border-top: 1px solid;
+ border-right: 1px solid;
+ border-bottom: 1px solid;
+ border-left: 1px solid;
+ padding: 2px 8px 2px 5px;
+}
+
+/* StatusBar word processor example styles */
+
+#word-status .x-status-text-panel .spacer {
+ width: 60px;
+ font-size:0;
+ line-height:0;
+}
+#word-status .x-status-busy {
+ padding-left: 25px !important;
+ background: transparent no-repeat 3px 2px;
+}
+#word-status .x-status-saved {
+ padding-left: 25px !important;
+ background: transparent no-repeat 3px 2px;
+}
+
+/* StatusBar form validation example styles */
+
+.x-statusbar .x-status-error {
+ cursor: pointer;
+ padding-left: 25px !important;
+ background: transparent no-repeat 3px 2px;
+}
+.x-statusbar .x-status-valid {
+ padding-left: 25px !important;
+ background: transparent no-repeat 3px 2px;
+}
+.x-status-error-list {
+ font: 11px tahoma,arial,verdana,sans-serif;
+ position: absolute;
+ z-index: 9999;
+ border-top: 1px solid;
+ border-right: 1px solid;
+ border-bottom: 1px solid;
+ border-left: 1px solid;
+ padding: 5px 10px;
+}
+.x-status-error-list li {
+ cursor: pointer;
+ list-style: disc;
+ margin-left: 10px;
+}
+.x-status-error-list li a {
+ text-decoration: none;
+}
+.x-status-error-list li a:hover {
+ text-decoration: underline;
+}
+
+
+/* *********************************************************** */
+/* *********************************************************** */
+/* *********************************************************** */
+
+
+/* StatusBar - visual */
+
+.x-statusbar .x-status-busy {
+ background-image: url(../images/loading.gif);
+}
+.x-statusbar .x-status-text-panel {
+ border-color: #99bbe8 #fff #fff #99bbe8;
+}
+
+/* StatusBar word processor example styles */
+
+#word-status .x-status-text {
+ color: #777;
+}
+#word-status .x-status-busy {
+ background-image: url(../images/saving.gif);
+}
+#word-status .x-status-saved {
+ background-image: url(../images/saved.png);
+}
+
+/* StatusBar form validation example styles */
+
+.x-statusbar .x-status-error {
+ color: #C33;
+ background-image: url(../images/exclamation.gif);
+}
+.x-statusbar .x-status-valid {
+ background-image: url(../images/accept.png);
+}
+.x-status-error-list {
+ border-color: #C33;
+}
+.x-status-error-list li a {
+ color: #15428B;
+}
diff --git a/deluge/ui/web/css/ext-extensions.css b/deluge/ui/web/css/ext-extensions.css
new file mode 100644
index 0000000..63df411
--- /dev/null
+++ b/deluge/ui/web/css/ext-extensions.css
@@ -0,0 +1 @@
+ .x-column-tree .x-tree-node{zoom:1}.x-column-tree .x-tree-node-el{zoom:1}.x-column-tree .x-tree-selected{background:#d9e8fb}.x-column-tree .x-tree-node a{line-height:18px;vertical-align:middle}.x-column-tree .x-tree-node .x-tree-selected a span{background:transparent;color:#000}.x-tree-col{float:left;overflow:hidden;padding:0 1px;zoom:1}.x-tree-col-text,.x-tree-hd-text{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;padding:3px 3px 3px 5px;white-space:nowrap;font:normal 11px arial,tahoma,helvetica,sans-serif}.x-tree-headers{background:#f9f9f9 url(../../resources/images/default/grid/grid3-hrow.gif) repeat-x 0 bottom;cursor:default;zoom:1}.x-tree-hd{float:left;overflow:hidden;border-left:1px solid #eee;border-right:1px solid #d0d0d0}.x-form-file-wrap{position:relative;height:22px}.x-form-file-wrap .x-form-file{position:absolute;right:0;-moz-opacity:0;filter:alpha(opacity:0);opacity:0;z-index:2;height:22px;cursor:pointer}.x-form-file-wrap .x-btn{position:absolute;right:0;z-index:1}.x-form-file-wrap .x-form-file-text{position:absolute;left:0;z-index:3;color:#777}.x-form-field-wrap .x-form-spinner-trigger{background:transparent url(../images/spinner.gif) no-repeat 0 0}.x-form-field-wrap .x-form-spinner-overup{background-position:-17px 0}.x-form-field-wrap .x-form-spinner-clickup{background-position:-34px 0}.x-form-field-wrap .x-form-spinner-overdown{background-position:-51px 0}.x-form-field-wrap .x-form-spinner-clickdown{background-position:-68px 0}.x-trigger-wrap-focus .x-form-spinner-trigger{background-position:-85px 0}.x-trigger-wrap-focus .x-form-spinner-overup{background-position:-102px 0}.x-trigger-wrap-focus .x-form-spinner-clickup{background-position:-119px 0}.x-trigger-wrap-focus .x-form-spinner-overdown{background-position:-136px 0}.x-trigger-wrap-focus .x-form-spinner-clickdown{background-position:-153px 0}.x-trigger-wrap-focus .x-form-trigger{border-bottom:1px solid #7eadd9}.x-form-field-wrap .x-form-spinner-splitter{line-height:1px;font-size:1px;background:transparent url(../images/spinner-split.gif) no-repeat 0 0;position:absolute;cursor:n-resize}.x-trigger-wrap-focus .x-form-spinner-splitter{background-position:-14px 0}.x-form-uxspinner .x-form-field-wrap{height:24px}.x-statusbar .x-status-text{cursor:default}.x-statusbar .x-status-busy{padding-left:25px!important;background:transparent no-repeat 3px 2px}.x-toolbar div.xtb-text .x-statusbar .x-status-text-panel{border-top:1px solid;border-right:1px solid;border-bottom:1px solid;border-left:1px solid;padding:2px 8px 2px 5px}#word-status .x-status-text-panel .spacer{width:60px;font-size:0;line-height:0}#word-status .x-status-busy{padding-left:25px!important;background:transparent no-repeat 3px 2px}#word-status .x-status-saved{padding-left:25px!important;background:transparent no-repeat 3px 2px}.x-statusbar .x-status-error{cursor:pointer;padding-left:25px!important;background:transparent no-repeat 3px 2px}.x-statusbar .x-status-valid{padding-left:25px!important;background:transparent no-repeat 3px 2px}.x-status-error-list{font:11px tahoma,arial,verdana,sans-serif;position:absolute;z-index:9999;border-top:1px solid;border-right:1px solid;border-bottom:1px solid;border-left:1px solid;padding:5px 10px}.x-status-error-list li{cursor:pointer;list-style:disc;margin-left:10px}.x-status-error-list li a{text-decoration:none}.x-status-error-list li a:hover{text-decoration:underline}.x-statusbar .x-status-busy{background-image:url(../images/loading.gif)}.x-statusbar .x-status-text-panel{border-color:#99bbe8 #fff #fff #99bbe8}#word-status .x-status-text{color:#777}#word-status .x-status-busy{background-image:url(../images/saving.gif)}#word-status .x-status-saved{background-image:url(../images/saved.png)}.x-statusbar .x-status-error{color:#C33;background-image:url(../images/exclamation.gif)}.x-statusbar .x-status-valid{background-image:url(../images/accept.png)}.x-status-error-list{border-color:#C33}.x-status-error-list li a{color:#15428b} \ No newline at end of file
diff --git a/deluge/ui/web/icons/active.png b/deluge/ui/web/icons/active.png
new file mode 100644
index 0000000..daa4f64
--- /dev/null
+++ b/deluge/ui/web/icons/active.png
Binary files differ
diff --git a/deluge/ui/web/icons/add.png b/deluge/ui/web/icons/add.png
new file mode 100644
index 0000000..3bc06ca
--- /dev/null
+++ b/deluge/ui/web/icons/add.png
Binary files differ
diff --git a/deluge/ui/web/icons/add_file.png b/deluge/ui/web/icons/add_file.png
new file mode 100644
index 0000000..6a05745
--- /dev/null
+++ b/deluge/ui/web/icons/add_file.png
Binary files differ
diff --git a/deluge/ui/web/icons/add_magnet.png b/deluge/ui/web/icons/add_magnet.png
new file mode 100644
index 0000000..c015b18
--- /dev/null
+++ b/deluge/ui/web/icons/add_magnet.png
Binary files differ
diff --git a/deluge/ui/web/icons/add_url.png b/deluge/ui/web/icons/add_url.png
new file mode 100644
index 0000000..74dc99f
--- /dev/null
+++ b/deluge/ui/web/icons/add_url.png
Binary files differ
diff --git a/deluge/ui/web/icons/alert.png b/deluge/ui/web/icons/alert.png
new file mode 100644
index 0000000..7036638
--- /dev/null
+++ b/deluge/ui/web/icons/alert.png
Binary files differ
diff --git a/deluge/ui/web/icons/all.png b/deluge/ui/web/icons/all.png
new file mode 100644
index 0000000..c63f8df
--- /dev/null
+++ b/deluge/ui/web/icons/all.png
Binary files differ
diff --git a/deluge/ui/web/icons/back.png b/deluge/ui/web/icons/back.png
new file mode 100644
index 0000000..fdcf9f0
--- /dev/null
+++ b/deluge/ui/web/icons/back.png
Binary files differ
diff --git a/deluge/ui/web/icons/bottom.png b/deluge/ui/web/icons/bottom.png
new file mode 100644
index 0000000..ca32c1f
--- /dev/null
+++ b/deluge/ui/web/icons/bottom.png
Binary files differ
diff --git a/deluge/ui/web/icons/checking.png b/deluge/ui/web/icons/checking.png
new file mode 100644
index 0000000..7487352
--- /dev/null
+++ b/deluge/ui/web/icons/checking.png
Binary files differ
diff --git a/deluge/ui/web/icons/connection_manager.png b/deluge/ui/web/icons/connection_manager.png
new file mode 100644
index 0000000..a033306
--- /dev/null
+++ b/deluge/ui/web/icons/connection_manager.png
Binary files differ
diff --git a/deluge/ui/web/icons/connections.png b/deluge/ui/web/icons/connections.png
new file mode 100644
index 0000000..f0b660b
--- /dev/null
+++ b/deluge/ui/web/icons/connections.png
Binary files differ
diff --git a/deluge/ui/web/icons/create.png b/deluge/ui/web/icons/create.png
new file mode 100644
index 0000000..9008c98
--- /dev/null
+++ b/deluge/ui/web/icons/create.png
Binary files differ
diff --git a/deluge/ui/web/icons/deluge-192.png b/deluge/ui/web/icons/deluge-192.png
new file mode 100644
index 0000000..b49a318
--- /dev/null
+++ b/deluge/ui/web/icons/deluge-192.png
Binary files differ
diff --git a/deluge/ui/web/icons/deluge-32.png b/deluge/ui/web/icons/deluge-32.png
new file mode 100644
index 0000000..6787fa3
--- /dev/null
+++ b/deluge/ui/web/icons/deluge-32.png
Binary files differ
diff --git a/deluge/ui/web/icons/deluge-512.png b/deluge/ui/web/icons/deluge-512.png
new file mode 100644
index 0000000..866f6b9
--- /dev/null
+++ b/deluge/ui/web/icons/deluge-512.png
Binary files differ
diff --git a/deluge/ui/web/icons/deluge-apple-180.png b/deluge/ui/web/icons/deluge-apple-180.png
new file mode 100644
index 0000000..82f7be2
--- /dev/null
+++ b/deluge/ui/web/icons/deluge-apple-180.png
Binary files differ
diff --git a/deluge/ui/web/icons/deluge.png b/deluge/ui/web/icons/deluge.png
new file mode 100644
index 0000000..2f4ae4c
--- /dev/null
+++ b/deluge/ui/web/icons/deluge.png
Binary files differ
diff --git a/deluge/ui/web/icons/dht.png b/deluge/ui/web/icons/dht.png
new file mode 100644
index 0000000..363ee0c
--- /dev/null
+++ b/deluge/ui/web/icons/dht.png
Binary files differ
diff --git a/deluge/ui/web/icons/document.png b/deluge/ui/web/icons/document.png
new file mode 100644
index 0000000..5ee0018
--- /dev/null
+++ b/deluge/ui/web/icons/document.png
Binary files differ
diff --git a/deluge/ui/web/icons/down.png b/deluge/ui/web/icons/down.png
new file mode 100644
index 0000000..68be2b3
--- /dev/null
+++ b/deluge/ui/web/icons/down.png
Binary files differ
diff --git a/deluge/ui/web/icons/downloading.png b/deluge/ui/web/icons/downloading.png
new file mode 100644
index 0000000..ec58cb5
--- /dev/null
+++ b/deluge/ui/web/icons/downloading.png
Binary files differ
diff --git a/deluge/ui/web/icons/drive.png b/deluge/ui/web/icons/drive.png
new file mode 100644
index 0000000..6fd688e
--- /dev/null
+++ b/deluge/ui/web/icons/drive.png
Binary files differ
diff --git a/deluge/ui/web/icons/edit_trackers.png b/deluge/ui/web/icons/edit_trackers.png
new file mode 100644
index 0000000..80455ec
--- /dev/null
+++ b/deluge/ui/web/icons/edit_trackers.png
Binary files differ
diff --git a/deluge/ui/web/icons/error.png b/deluge/ui/web/icons/error.png
new file mode 100644
index 0000000..20ad66a
--- /dev/null
+++ b/deluge/ui/web/icons/error.png
Binary files differ
diff --git a/deluge/ui/web/icons/expand_all.png b/deluge/ui/web/icons/expand_all.png
new file mode 100644
index 0000000..050419f
--- /dev/null
+++ b/deluge/ui/web/icons/expand_all.png
Binary files differ
diff --git a/deluge/ui/web/icons/favicon.ico b/deluge/ui/web/icons/favicon.ico
new file mode 100644
index 0000000..4e6f124
--- /dev/null
+++ b/deluge/ui/web/icons/favicon.ico
Binary files differ
diff --git a/deluge/ui/web/icons/find_more.png b/deluge/ui/web/icons/find_more.png
new file mode 100644
index 0000000..199d73e
--- /dev/null
+++ b/deluge/ui/web/icons/find_more.png
Binary files differ
diff --git a/deluge/ui/web/icons/forward.png b/deluge/ui/web/icons/forward.png
new file mode 100644
index 0000000..2e55489
--- /dev/null
+++ b/deluge/ui/web/icons/forward.png
Binary files differ
diff --git a/deluge/ui/web/icons/help.png b/deluge/ui/web/icons/help.png
new file mode 100644
index 0000000..0566ae0
--- /dev/null
+++ b/deluge/ui/web/icons/help.png
Binary files differ
diff --git a/deluge/ui/web/icons/high.png b/deluge/ui/web/icons/high.png
new file mode 100644
index 0000000..4b2b1ff
--- /dev/null
+++ b/deluge/ui/web/icons/high.png
Binary files differ
diff --git a/deluge/ui/web/icons/home.png b/deluge/ui/web/icons/home.png
new file mode 100644
index 0000000..a319df6
--- /dev/null
+++ b/deluge/ui/web/icons/home.png
Binary files differ
diff --git a/deluge/ui/web/icons/inactive.png b/deluge/ui/web/icons/inactive.png
new file mode 100644
index 0000000..b56213e
--- /dev/null
+++ b/deluge/ui/web/icons/inactive.png
Binary files differ
diff --git a/deluge/ui/web/icons/install_plugin.png b/deluge/ui/web/icons/install_plugin.png
new file mode 100644
index 0000000..aff31e7
--- /dev/null
+++ b/deluge/ui/web/icons/install_plugin.png
Binary files differ
diff --git a/deluge/ui/web/icons/login.png b/deluge/ui/web/icons/login.png
new file mode 100644
index 0000000..c06d0d1
--- /dev/null
+++ b/deluge/ui/web/icons/login.png
Binary files differ
diff --git a/deluge/ui/web/icons/logout.png b/deluge/ui/web/icons/logout.png
new file mode 100644
index 0000000..2f53a65
--- /dev/null
+++ b/deluge/ui/web/icons/logout.png
Binary files differ
diff --git a/deluge/ui/web/icons/low.png b/deluge/ui/web/icons/low.png
new file mode 100644
index 0000000..ff669db
--- /dev/null
+++ b/deluge/ui/web/icons/low.png
Binary files differ
diff --git a/deluge/ui/web/icons/move.png b/deluge/ui/web/icons/move.png
new file mode 100644
index 0000000..ea83832
--- /dev/null
+++ b/deluge/ui/web/icons/move.png
Binary files differ
diff --git a/deluge/ui/web/icons/no_download.png b/deluge/ui/web/icons/no_download.png
new file mode 100644
index 0000000..206d436
--- /dev/null
+++ b/deluge/ui/web/icons/no_download.png
Binary files differ
diff --git a/deluge/ui/web/icons/normal.png b/deluge/ui/web/icons/normal.png
new file mode 100644
index 0000000..2e55489
--- /dev/null
+++ b/deluge/ui/web/icons/normal.png
Binary files differ
diff --git a/deluge/ui/web/icons/ok.png b/deluge/ui/web/icons/ok.png
new file mode 100644
index 0000000..33eb7db
--- /dev/null
+++ b/deluge/ui/web/icons/ok.png
Binary files differ
diff --git a/deluge/ui/web/icons/pause.png b/deluge/ui/web/icons/pause.png
new file mode 100644
index 0000000..8fdd6bc
--- /dev/null
+++ b/deluge/ui/web/icons/pause.png
Binary files differ
diff --git a/deluge/ui/web/icons/preferences.png b/deluge/ui/web/icons/preferences.png
new file mode 100644
index 0000000..7d6deb2
--- /dev/null
+++ b/deluge/ui/web/icons/preferences.png
Binary files differ
diff --git a/deluge/ui/web/icons/queue.png b/deluge/ui/web/icons/queue.png
new file mode 100644
index 0000000..3e4b4be
--- /dev/null
+++ b/deluge/ui/web/icons/queue.png
Binary files differ
diff --git a/deluge/ui/web/icons/queued.png b/deluge/ui/web/icons/queued.png
new file mode 100644
index 0000000..f9f7454
--- /dev/null
+++ b/deluge/ui/web/icons/queued.png
Binary files differ
diff --git a/deluge/ui/web/icons/recheck.png b/deluge/ui/web/icons/recheck.png
new file mode 100644
index 0000000..199d73e
--- /dev/null
+++ b/deluge/ui/web/icons/recheck.png
Binary files differ
diff --git a/deluge/ui/web/icons/remove.png b/deluge/ui/web/icons/remove.png
new file mode 100644
index 0000000..3f91191
--- /dev/null
+++ b/deluge/ui/web/icons/remove.png
Binary files differ
diff --git a/deluge/ui/web/icons/seeding.png b/deluge/ui/web/icons/seeding.png
new file mode 100644
index 0000000..fce70a8
--- /dev/null
+++ b/deluge/ui/web/icons/seeding.png
Binary files differ
diff --git a/deluge/ui/web/icons/start.png b/deluge/ui/web/icons/start.png
new file mode 100644
index 0000000..ff669db
--- /dev/null
+++ b/deluge/ui/web/icons/start.png
Binary files differ
diff --git a/deluge/ui/web/icons/top.png b/deluge/ui/web/icons/top.png
new file mode 100644
index 0000000..850656f
--- /dev/null
+++ b/deluge/ui/web/icons/top.png
Binary files differ
diff --git a/deluge/ui/web/icons/traffic.png b/deluge/ui/web/icons/traffic.png
new file mode 100644
index 0000000..ecd8720
--- /dev/null
+++ b/deluge/ui/web/icons/traffic.png
Binary files differ
diff --git a/deluge/ui/web/icons/up.png b/deluge/ui/web/icons/up.png
new file mode 100644
index 0000000..223e733
--- /dev/null
+++ b/deluge/ui/web/icons/up.png
Binary files differ
diff --git a/deluge/ui/web/icons/update.png b/deluge/ui/web/icons/update.png
new file mode 100644
index 0000000..0ff6d45
--- /dev/null
+++ b/deluge/ui/web/icons/update.png
Binary files differ
diff --git a/deluge/ui/web/icons/upload_slots.png b/deluge/ui/web/icons/upload_slots.png
new file mode 100644
index 0000000..0e7000d
--- /dev/null
+++ b/deluge/ui/web/icons/upload_slots.png
Binary files differ
diff --git a/deluge/ui/web/icons/warning.png b/deluge/ui/web/icons/warning.png
new file mode 100644
index 0000000..f66feda
--- /dev/null
+++ b/deluge/ui/web/icons/warning.png
Binary files differ
diff --git a/deluge/ui/web/images/s.gif b/deluge/ui/web/images/s.gif
new file mode 100644
index 0000000..1d11fa9
--- /dev/null
+++ b/deluge/ui/web/images/s.gif
Binary files differ
diff --git a/deluge/ui/web/images/spinner-split.gif b/deluge/ui/web/images/spinner-split.gif
new file mode 100644
index 0000000..7281146
--- /dev/null
+++ b/deluge/ui/web/images/spinner-split.gif
Binary files differ
diff --git a/deluge/ui/web/images/spinner.gif b/deluge/ui/web/images/spinner.gif
new file mode 100644
index 0000000..4e72f53
--- /dev/null
+++ b/deluge/ui/web/images/spinner.gif
Binary files differ
diff --git a/deluge/ui/web/index.html b/deluge/ui/web/index.html
new file mode 100644
index 0000000..08c6d8b
--- /dev/null
+++ b/deluge/ui/web/index.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Deluge WebUI ${version}</title>
+
+ <link rel="icon" sizes="16x16" type="image/png"
+ href="${base}icons/deluge.png"/>
+ <link rel="icon" sizes="32x32" type="image/png"
+ href="${base}icons/deluge-32.png"/>
+ <!-- For Chrome, Android, iOS and Windows touch shortcuts: -->
+ <link rel="icon" sizes="192x192" type="image/png"
+ href="${base}icons/deluge-192.png"/>
+ <link rel="icon" sizes="512x512" type="image/png"
+ href="${base}icons/deluge-512.png"/>
+ <link rel="apple-touch-icon-precomposed"
+ href="${base}icons/deluge-apple-180.png"/>
+ <meta name="msapplication-TileColor" content="#599eee">
+ <meta name="theme-color" content="#599eee">
+
+ <!-- Stylesheets -->
+ % for stylesheet in stylesheets:
+ <link rel="stylesheet" type="text/css" href="${base}${stylesheet}"/>
+ % endfor
+
+ <script type="text/javascript">
+ deluge = {
+ author: 'Deluge Team',
+ version: '${version}',
+ config: ${js_config}
+ }
+ </script>
+
+ <!-- Javascript -->
+ % for script in scripts:
+ <script type="text/javascript" src="${base}${script}"></script>
+ % endfor
+ <script type="text/javascript">
+ Deluge.debug = ${debug};
+ </script>
+ </head>
+ <body>
+ <div style="background-image: url('${base}themes/images/default/tree/loading.gif');"></div>
+
+ <!-- Preload icon classes -->
+ <div class="ext-mb-error"></div>
+ <div class="icon-ok"></div>
+ </body>
+</html>
diff --git a/deluge/ui/web/js/deluge-all-debug.js b/deluge/ui/web/js/deluge-all-debug.js
new file mode 100644
index 0000000..afbbabe
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all-debug.js
@@ -0,0 +1,9868 @@
+/**
+ * Deluge.add.Window.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge.add');
+
+/**
+ * @class Deluge.add.Window
+ * @extends Ext.Window
+ * Base class for an add Window
+ */
+Deluge.add.Window = Ext.extend(Ext.Window, {
+ initComponent: function() {
+ Deluge.add.Window.superclass.initComponent.call(this);
+ this.addEvents('beforeadd', 'add');
+ },
+
+ /**
+ * Create an id for the torrent before we have any info about it.
+ */
+ createTorrentId: function() {
+ return new Date().getTime().toString();
+ },
+});
+/**
+ * Deluge.add.AddWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.namespace('Deluge.add');
+
+// This override allows file upload buttons to contain icons
+Ext.override(Ext.ux.form.FileUploadField, {
+ onRender: function(ct, position) {
+ Ext.ux.form.FileUploadField.superclass.onRender.call(
+ this,
+ ct,
+ position
+ );
+
+ this.wrap = this.el.wrap({ cls: 'x-form-field-wrap x-form-file-wrap' });
+ this.el.addClass('x-form-file-text');
+ this.el.dom.removeAttribute('name');
+ this.createFileInput();
+
+ var btnCfg = Ext.applyIf(this.buttonCfg || {}, {
+ text: this.buttonText,
+ });
+ this.button = new Ext.Button(
+ Ext.apply(btnCfg, {
+ renderTo: this.wrap,
+ cls:
+ 'x-form-file-btn' +
+ (btnCfg.iconCls ? ' x-btn-text-icon' : ''),
+ })
+ );
+
+ if (this.buttonOnly) {
+ this.el.hide();
+ this.wrap.setWidth(this.button.getEl().getWidth());
+ }
+
+ this.bindListeners();
+ this.resizeEl = this.positionEl = this.wrap;
+ },
+});
+
+Deluge.add.AddWindow = Ext.extend(Deluge.add.Window, {
+ title: _('Add Torrents'),
+ layout: 'border',
+ width: 470,
+ height: 450,
+ bodyStyle: 'padding: 10px 5px;',
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ closable: true,
+ plain: true,
+ iconCls: 'x-deluge-add-window-icon',
+
+ initComponent: function() {
+ Deluge.add.AddWindow.superclass.initComponent.call(this);
+
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+ this.addButton(_('Add'), this.onAddClick, this);
+
+ function torrentRenderer(value, p, r) {
+ if (r.data['info_hash']) {
+ return String.format(
+ '<div class="x-deluge-add-torrent-name">{0}</div>',
+ value
+ );
+ } else {
+ return String.format(
+ '<div class="x-deluge-add-torrent-name-loading">{0}</div>',
+ value
+ );
+ }
+ }
+
+ this.list = new Ext.list.ListView({
+ store: new Ext.data.SimpleStore({
+ fields: [
+ { name: 'info_hash', mapping: 1 },
+ { name: 'text', mapping: 2 },
+ ],
+ id: 0,
+ }),
+ columns: [
+ {
+ id: 'torrent',
+ width: 150,
+ sortable: true,
+ renderer: torrentRenderer,
+ dataIndex: 'text',
+ },
+ ],
+ stripeRows: true,
+ singleSelect: true,
+ listeners: {
+ selectionchange: {
+ fn: this.onSelect,
+ scope: this,
+ },
+ },
+ hideHeaders: true,
+ autoExpandColumn: 'torrent',
+ height: '100%',
+ autoScroll: true,
+ });
+
+ this.add({
+ region: 'center',
+ items: [this.list],
+ border: false,
+ bbar: new Ext.Toolbar({
+ items: [
+ {
+ id: 'fileUploadForm',
+ xtype: 'form',
+ layout: 'fit',
+ baseCls: 'x-plain',
+ fileUpload: true,
+ items: [
+ {
+ buttonOnly: true,
+ xtype: 'fileuploadfield',
+ id: 'torrentFile',
+ name: 'file',
+ multiple: true,
+ buttonCfg: {
+ iconCls: 'x-deluge-add-file',
+ text: _('File'),
+ },
+ listeners: {
+ scope: this,
+ fileselected: this.onFileSelected,
+ },
+ },
+ ],
+ },
+ {
+ text: _('Url'),
+ iconCls: 'icon-add-url',
+ handler: this.onUrl,
+ scope: this,
+ },
+ {
+ text: _('Infohash'),
+ iconCls: 'icon-add-magnet',
+ hidden: true,
+ disabled: true,
+ },
+ '->',
+ {
+ text: _('Remove'),
+ iconCls: 'icon-remove',
+ handler: this.onRemove,
+ scope: this,
+ },
+ ],
+ }),
+ });
+
+ this.fileUploadForm = Ext.getCmp('fileUploadForm').getForm();
+ this.optionsPanel = this.add(new Deluge.add.OptionsPanel());
+ this.on('hide', this.onHide, this);
+ this.on('show', this.onShow, this);
+ },
+
+ clear: function() {
+ this.list.getStore().removeAll();
+ this.optionsPanel.clear();
+ // Reset upload form so handler fires when a canceled file is reselected
+ this.fileUploadForm.reset();
+ },
+
+ onAddClick: function() {
+ var torrents = [];
+ if (!this.list) return;
+ this.list.getStore().each(function(r) {
+ var id = r.get('info_hash');
+ torrents.push({
+ path: this.optionsPanel.getFilename(id),
+ options: this.optionsPanel.getOptions(id),
+ });
+ }, this);
+
+ deluge.client.web.add_torrents(torrents, {
+ success: function(result) {},
+ });
+ this.clear();
+ this.hide();
+ },
+
+ onCancelClick: function() {
+ this.clear();
+ this.hide();
+ },
+
+ onFile: function() {
+ if (!this.file) this.file = new Deluge.add.FileWindow();
+ this.file.show();
+ },
+
+ onHide: function() {
+ this.optionsPanel.setActiveTab(0);
+ this.optionsPanel.files.setDisabled(true);
+ this.optionsPanel.form.setDisabled(true);
+ },
+
+ onRemove: function() {
+ if (!this.list.getSelectionCount()) return;
+ var torrent = this.list.getSelectedRecords()[0];
+ if (!torrent) return;
+ this.list.getStore().remove(torrent);
+ this.optionsPanel.clear();
+
+ if (this.torrents && this.torrents[torrent.id])
+ delete this.torrents[torrent.id];
+ },
+
+ onSelect: function(list, selections) {
+ if (selections.length) {
+ var record = this.list.getRecord(selections[0]);
+ this.optionsPanel.setTorrent(record.get('info_hash'));
+ } else {
+ this.optionsPanel.files.setDisabled(true);
+ this.optionsPanel.form.setDisabled(true);
+ }
+ },
+
+ onShow: function() {
+ if (!this.url) {
+ this.url = new Deluge.add.UrlWindow();
+ this.url.on('beforeadd', this.onTorrentBeforeAdd, this);
+ this.url.on('add', this.onTorrentAdd, this);
+ }
+
+ this.optionsPanel.form.getDefaults();
+ },
+
+ onFileSelected: function() {
+ if (this.fileUploadForm.isValid()) {
+ var torrentIds = [];
+ var files = this.fileUploadForm.findField('torrentFile').value;
+ var randomId = this.createTorrentId();
+ Array.prototype.forEach.call(
+ files,
+ function(file, i) {
+ // Append index for batch of unique torrentIds.
+ var torrentId = randomId + i.toString();
+ torrentIds.push(torrentId);
+ this.onTorrentBeforeAdd(torrentId, file.name);
+ }.bind(this)
+ );
+ this.fileUploadForm.submit({
+ url: deluge.config.base + 'upload',
+ waitMsg: _('Uploading your torrent...'),
+ success: this.onUploadSuccess,
+ scope: this,
+ torrentIds: torrentIds,
+ });
+ }
+ },
+
+ onUploadSuccess: function(fp, upload) {
+ if (!upload.result.success) {
+ this.clear();
+ return;
+ }
+
+ upload.result.files.forEach(
+ function(filename, i) {
+ deluge.client.web.get_torrent_info(filename, {
+ success: this.onGotInfo,
+ scope: this,
+ filename: filename,
+ torrentId: upload.options.torrentIds[i],
+ });
+ }.bind(this)
+ );
+ this.fileUploadForm.reset();
+ },
+
+ onGotInfo: function(info, obj, response, request) {
+ info.filename = request.options.filename;
+ torrentId = request.options.torrentId;
+ this.onTorrentAdd(torrentId, info);
+ },
+
+ onTorrentBeforeAdd: function(torrentId, text) {
+ var store = this.list.getStore();
+ store.loadData([[torrentId, null, text]], true);
+ },
+
+ onTorrentAdd: function(torrentId, info) {
+ var r = this.list.getStore().getById(torrentId);
+ if (!info) {
+ Ext.MessageBox.show({
+ title: _('Error'),
+ msg: _('Not a valid torrent'),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ this.list.getStore().remove(r);
+ } else {
+ r.set('info_hash', info['info_hash']);
+ r.set('text', info['name']);
+ this.list.getStore().commitChanges();
+ this.optionsPanel.addTorrent(info);
+ this.list.select(r);
+ }
+ },
+
+ onUrl: function(button, event) {
+ this.url.show();
+ },
+});
+/**
+ * Deluge.add.FilesTab.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge.add');
+
+/**
+ * @class Deluge.add.FilesTab
+ * @extends Ext.ux.tree.TreeGrid
+ */
+Deluge.add.FilesTab = Ext.extend(Ext.ux.tree.TreeGrid, {
+ layout: 'fit',
+ title: _('Files'),
+
+ autoScroll: false,
+ animate: false,
+ border: false,
+ disabled: true,
+ rootVisible: false,
+
+ columns: [
+ {
+ header: _('Filename'),
+ width: 295,
+ dataIndex: 'filename',
+ },
+ {
+ header: _('Size'),
+ width: 60,
+ dataIndex: 'size',
+ tpl: new Ext.XTemplate('{size:this.fsize}', {
+ fsize: function(v) {
+ return fsize(v);
+ },
+ }),
+ },
+ {
+ header: _('Download'),
+ width: 65,
+ dataIndex: 'download',
+ tpl: new Ext.XTemplate('{download:this.format}', {
+ format: function(v) {
+ return (
+ '<div rel="chkbox" class="x-grid3-check-col' +
+ (v ? '-on' : '') +
+ '"> </div>'
+ );
+ },
+ }),
+ },
+ ],
+
+ initComponent: function() {
+ Deluge.add.FilesTab.superclass.initComponent.call(this);
+ this.on('click', this.onNodeClick, this);
+ },
+
+ clearFiles: function() {
+ var root = this.getRootNode();
+ if (!root.hasChildNodes()) return;
+ root.cascade(function(node) {
+ if (!node.parentNode || !node.getOwnerTree()) return;
+ node.remove();
+ });
+ },
+
+ setDownload: function(node, value, suppress) {
+ node.attributes.download = value;
+ node.ui.updateColumns();
+
+ if (node.isLeaf()) {
+ if (!suppress) {
+ return this.fireEvent('fileschecked', [node], value, !value);
+ }
+ } else {
+ var nodes = [node];
+ node.cascade(function(n) {
+ n.attributes.download = value;
+ n.ui.updateColumns();
+ nodes.push(n);
+ }, this);
+ if (!suppress) {
+ return this.fireEvent('fileschecked', nodes, value, !value);
+ }
+ }
+ },
+
+ onNodeClick: function(node, e) {
+ var el = new Ext.Element(e.target);
+ if (el.getAttribute('rel') == 'chkbox') {
+ this.setDownload(node, !node.attributes.download);
+ }
+ },
+});
+/**
+ * Deluge.add.Infohash.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Ext.deluge.add');
+/**
+ * Deluge.add.OptionsPanel.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge.add');
+
+Deluge.add.OptionsPanel = Ext.extend(Ext.TabPanel, {
+ torrents: {},
+
+ // layout options
+ region: 'south',
+ border: false,
+ activeTab: 0,
+ height: 265,
+
+ initComponent: function() {
+ Deluge.add.OptionsPanel.superclass.initComponent.call(this);
+ this.files = this.add(new Deluge.add.FilesTab());
+ this.form = this.add(new Deluge.add.OptionsTab());
+
+ this.files.on('fileschecked', this.onFilesChecked, this);
+ },
+
+ addTorrent: function(torrent) {
+ this.torrents[torrent['info_hash']] = torrent;
+ var fileIndexes = {};
+ this.walkFileTree(
+ torrent['files_tree'],
+ function(filename, type, entry, parent) {
+ if (type != 'file') return;
+ fileIndexes[entry.index] = entry.download;
+ },
+ this
+ );
+
+ var priorities = [];
+ Ext.each(Ext.keys(fileIndexes), function(index) {
+ priorities[index] = fileIndexes[index];
+ });
+
+ var oldId = this.form.optionsManager.changeId(
+ torrent['info_hash'],
+ true
+ );
+ this.form.optionsManager.setDefault('file_priorities', priorities);
+ this.form.optionsManager.changeId(oldId, true);
+ },
+
+ clear: function() {
+ this.files.clearFiles();
+ this.form.optionsManager.resetAll();
+ },
+
+ getFilename: function(torrentId) {
+ return this.torrents[torrentId]['filename'];
+ },
+
+ getOptions: function(torrentId) {
+ var oldId = this.form.optionsManager.changeId(torrentId, true);
+ var options = this.form.optionsManager.get();
+ this.form.optionsManager.changeId(oldId, true);
+ Ext.each(options['file_priorities'], function(priority, index) {
+ options['file_priorities'][index] = priority ? 1 : 0;
+ });
+ return options;
+ },
+
+ setTorrent: function(torrentId) {
+ if (!torrentId) return;
+
+ this.torrentId = torrentId;
+ this.form.optionsManager.changeId(torrentId);
+
+ this.files.clearFiles();
+ var root = this.files.getRootNode();
+ var priorities = this.form.optionsManager.get('file_priorities');
+
+ this.form.setDisabled(false);
+
+ if (this.torrents[torrentId]['files_tree']) {
+ this.walkFileTree(
+ this.torrents[torrentId]['files_tree'],
+ function(filename, type, entry, parentNode) {
+ var node = new Ext.tree.TreeNode({
+ download: entry.index ? priorities[entry.index] : true,
+ filename: filename,
+ fileindex: entry.index,
+ leaf: type != 'dir',
+ size: entry.length,
+ });
+ parentNode.appendChild(node);
+ if (type == 'dir') return node;
+ },
+ this,
+ root
+ );
+ root.firstChild.expand();
+ this.files.setDisabled(false);
+ this.files.show();
+ } else {
+ // Files tab is empty so show options tab
+ this.form.show();
+ this.files.setDisabled(true);
+ }
+ },
+
+ walkFileTree: function(files, callback, scope, parentNode) {
+ for (var filename in files.contents) {
+ var entry = files.contents[filename];
+ var type = entry.type;
+
+ if (scope) {
+ var ret = callback.apply(scope, [
+ filename,
+ type,
+ entry,
+ parentNode,
+ ]);
+ } else {
+ var ret = callback(filename, type, entry, parentNode);
+ }
+
+ if (type == 'dir') this.walkFileTree(entry, callback, scope, ret);
+ }
+ },
+
+ onFilesChecked: function(nodes, newValue, oldValue) {
+ Ext.each(
+ nodes,
+ function(node) {
+ if (node.attributes.fileindex < 0) return;
+ var priorities = this.form.optionsManager.get(
+ 'file_priorities'
+ );
+ priorities[node.attributes.fileindex] = newValue;
+ this.form.optionsManager.update('file_priorities', priorities);
+ },
+ this
+ );
+ },
+});
+/**
+ * Deluge.add.OptionsPanel.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge.add');
+
+/**
+ * @class Deluge.add.OptionsTab
+ * @extends Ext.form.FormPanel
+ */
+Deluge.add.OptionsTab = Ext.extend(Ext.form.FormPanel, {
+ title: _('Options'),
+ height: 170,
+ border: false,
+ bodyStyle: 'padding: 5px',
+ disabled: true,
+ labelWidth: 1,
+
+ initComponent: function() {
+ Deluge.add.OptionsTab.superclass.initComponent.call(this);
+
+ this.optionsManager = new Deluge.MultiOptionsManager();
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ title: _('Download Folder'),
+ border: false,
+ autoHeight: true,
+ defaultType: 'textfield',
+ labelWidth: 1,
+ fieldLabel: '',
+ style: 'padding: 5px 0; margin-bottom: 0;',
+ });
+ this.optionsManager.bind(
+ 'download_location',
+ fieldset.add({
+ fieldLabel: '',
+ name: 'download_location',
+ anchor: '95%',
+ labelSeparator: '',
+ })
+ );
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ title: _('Move Completed Folder'),
+ border: false,
+ autoHeight: true,
+ defaultType: 'togglefield',
+ labelWidth: 1,
+ fieldLabel: '',
+ style: 'padding: 5px 0; margin-bottom: 0;',
+ });
+ var field = fieldset.add({
+ fieldLabel: '',
+ name: 'move_completed_path',
+ anchor: '98%',
+ });
+ this.optionsManager.bind('move_completed', field.toggle);
+ this.optionsManager.bind('move_completed_path', field.input);
+
+ var panel = this.add({
+ border: false,
+ layout: 'column',
+ defaultType: 'fieldset',
+ });
+
+ fieldset = panel.add({
+ title: _('Bandwidth'),
+ border: false,
+ autoHeight: true,
+ bodyStyle: 'padding: 2px 5px',
+ labelWidth: 105,
+ width: 200,
+ defaultType: 'spinnerfield',
+ style: 'padding-right: 10px;',
+ });
+ this.optionsManager.bind(
+ 'max_download_speed',
+ fieldset.add({
+ fieldLabel: _('Max Down Speed'),
+ name: 'max_download_speed',
+ width: 60,
+ })
+ );
+ this.optionsManager.bind(
+ 'max_upload_speed',
+ fieldset.add({
+ fieldLabel: _('Max Up Speed'),
+ name: 'max_upload_speed',
+ width: 60,
+ })
+ );
+ this.optionsManager.bind(
+ 'max_connections',
+ fieldset.add({
+ fieldLabel: _('Max Connections'),
+ name: 'max_connections',
+ width: 60,
+ })
+ );
+ this.optionsManager.bind(
+ 'max_upload_slots',
+ fieldset.add({
+ fieldLabel: _('Max Upload Slots'),
+ name: 'max_upload_slots',
+ width: 60,
+ })
+ );
+
+ fieldset = panel.add({
+ // title: _('General'),
+ border: false,
+ autoHeight: true,
+ defaultType: 'checkbox',
+ });
+ this.optionsManager.bind(
+ 'add_paused',
+ fieldset.add({
+ name: 'add_paused',
+ boxLabel: _('Add In Paused State'),
+ fieldLabel: '',
+ labelSeparator: '',
+ })
+ );
+ this.optionsManager.bind(
+ 'prioritize_first_last_pieces',
+ fieldset.add({
+ name: 'prioritize_first_last_pieces',
+ boxLabel: _('Prioritize First/Last Pieces'),
+ fieldLabel: '',
+ labelSeparator: '',
+ })
+ );
+ this.optionsManager.bind(
+ 'sequential_download',
+ fieldset.add({
+ name: 'sequential_download',
+ boxLabel: _('Sequential Download'),
+ fieldLabel: '',
+ labelSeparator: '',
+ })
+ );
+ this.optionsManager.bind(
+ 'seed_mode',
+ fieldset.add({
+ name: 'seed_mode',
+ boxLabel: _('Skip File Hash Check'),
+ fieldLabel: '',
+ labelSeparator: '',
+ })
+ );
+ this.optionsManager.bind(
+ 'super_seeding',
+ fieldset.add({
+ name: 'super_seeding',
+ boxLabel: _('Super Seed'),
+ fieldLabel: '',
+ labelSeparator: '',
+ })
+ );
+ this.optionsManager.bind(
+ 'pre_allocate_storage',
+ fieldset.add({
+ name: 'pre_allocate_storage',
+ boxLabel: _('Preallocate Disk Space'),
+ fieldLabel: '',
+ labelSeparator: '',
+ })
+ );
+ },
+
+ getDefaults: function() {
+ var keys = [
+ 'add_paused',
+ 'pre_allocate_storage',
+ 'download_location',
+ 'max_connections_per_torrent',
+ 'max_download_speed_per_torrent',
+ 'move_completed',
+ 'move_completed_path',
+ 'max_upload_slots_per_torrent',
+ 'max_upload_speed_per_torrent',
+ 'prioritize_first_last_pieces',
+ 'sequential_download',
+ ];
+
+ deluge.client.core.get_config_values(keys, {
+ success: function(config) {
+ var options = {
+ file_priorities: [],
+ add_paused: config.add_paused,
+ sequential_download: config.sequential_download,
+ pre_allocate_storage: config.pre_allocate_storage,
+ download_location: config.download_location,
+ move_completed: config.move_completed,
+ move_completed_path: config.move_completed_path,
+ max_connections: config.max_connections_per_torrent,
+ max_download_speed: config.max_download_speed_per_torrent,
+ max_upload_slots: config.max_upload_slots_per_torrent,
+ max_upload_speed: config.max_upload_speed_per_torrent,
+ prioritize_first_last_pieces:
+ config.prioritize_first_last_pieces,
+ seed_mode: false,
+ super_seeding: false,
+ };
+ this.optionsManager.options = options;
+ this.optionsManager.resetAll();
+ },
+ scope: this,
+ });
+ },
+});
+/**
+ * Deluge.add.UrlWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.namespace('Deluge.add');
+Deluge.add.UrlWindow = Ext.extend(Deluge.add.Window, {
+ title: _('Add from Url'),
+ modal: true,
+ plain: true,
+ layout: 'fit',
+ width: 350,
+ height: 155,
+
+ buttonAlign: 'center',
+ closeAction: 'hide',
+ bodyStyle: 'padding: 10px 5px;',
+ iconCls: 'x-deluge-add-url-window-icon',
+
+ initComponent: function() {
+ Deluge.add.UrlWindow.superclass.initComponent.call(this);
+ this.addButton(_('Add'), this.onAddClick, this);
+
+ var form = this.add({
+ xtype: 'form',
+ defaultType: 'textfield',
+ baseCls: 'x-plain',
+ labelWidth: 55,
+ });
+
+ this.urlField = form.add({
+ fieldLabel: _('Url'),
+ id: 'url',
+ name: 'url',
+ width: '97%',
+ });
+ this.urlField.on('specialkey', this.onAdd, this);
+
+ this.cookieField = form.add({
+ fieldLabel: _('Cookies'),
+ id: 'cookies',
+ name: 'cookies',
+ width: '97%',
+ });
+ this.cookieField.on('specialkey', this.onAdd, this);
+ },
+
+ onAddClick: function(field, e) {
+ if (
+ (field.id == 'url' || field.id == 'cookies') &&
+ e.getKey() != e.ENTER
+ )
+ return;
+
+ var field = this.urlField;
+ var url = field.getValue();
+ var cookies = this.cookieField.getValue();
+ var torrentId = this.createTorrentId();
+
+ if (url.indexOf('magnet:?') == 0 && url.indexOf('xt=urn:btih') > -1) {
+ deluge.client.web.get_magnet_info(url, {
+ success: this.onGotInfo,
+ scope: this,
+ filename: url,
+ torrentId: torrentId,
+ });
+ } else {
+ deluge.client.web.download_torrent_from_url(url, cookies, {
+ success: this.onDownload,
+ scope: this,
+ torrentId: torrentId,
+ });
+ }
+
+ this.hide();
+ this.urlField.setValue('');
+ this.fireEvent('beforeadd', torrentId, url);
+ },
+
+ onDownload: function(filename, obj, resp, req) {
+ deluge.client.web.get_torrent_info(filename, {
+ success: this.onGotInfo,
+ scope: this,
+ filename: filename,
+ torrentId: req.options.torrentId,
+ });
+ },
+
+ onGotInfo: function(info, obj, response, request) {
+ info['filename'] = request.options.filename;
+ this.fireEvent('add', request.options.torrentId, info);
+ },
+});
+/**
+ * Deluge.data.SortTypes.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.data');
+
+/**
+ * Common sort functions that can be used for data Stores.
+ *
+ * @author Damien Churchill <damoxc@gmail.com>
+ * @version 1.3
+ *
+ * @class Deluge.data.SortTypes
+ * @singleton
+ */
+Deluge.data.SortTypes = {
+ // prettier-ignore
+ asIPAddress: function(value) {
+ var d = value.match(
+ /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\:(\d+)/
+ );
+ return ((+d[1] * 256 + (+d[2])) * 256 + (+d[3])) * 256 + (+d[4]);
+ },
+
+ asQueuePosition: function(value) {
+ return value > -1 ? value : Number.MAX_VALUE;
+ },
+
+ asName: function(value) {
+ return String(value).toLowerCase();
+ },
+};
+/**
+ * Deluge.data.PeerRecord.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.data');
+
+/**
+ * Deluge.data.Peer record
+ *
+ * @author Damien Churchill <damoxc@gmail.com>
+ * @version 1.3
+ *
+ * @class Deluge.data.Peer
+ * @extends Ext.data.Record
+ * @constructor
+ * @param {Object} data The peer data
+ */
+Deluge.data.Peer = Ext.data.Record.create([
+ {
+ name: 'country',
+ type: 'string',
+ },
+ {
+ name: 'ip',
+ type: 'string',
+ sortType: Deluge.data.SortTypes.asIPAddress,
+ },
+ {
+ name: 'client',
+ type: 'string',
+ },
+ {
+ name: 'progress',
+ type: 'float',
+ },
+ {
+ name: 'down_speed',
+ type: 'int',
+ },
+ {
+ name: 'up_speed',
+ type: 'int',
+ },
+ {
+ name: 'seed',
+ type: 'int',
+ },
+]);
+/**
+ * Deluge.data.TorrentRecord.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.data');
+
+/**
+ * Deluge.data.Torrent record
+ *
+ * @author Damien Churchill <damoxc@gmail.com>
+ * @version 1.3
+ *
+ * @class Deluge.data.Torrent
+ * @extends Ext.data.Record
+ * @constructor
+ * @param {Object} data The torrents data
+ */
+Deluge.data.Torrent = Ext.data.Record.create([
+ {
+ name: 'queue',
+ type: 'int',
+ },
+ {
+ name: 'name',
+ type: 'string',
+ sortType: Deluge.data.SortTypes.asName,
+ },
+ {
+ name: 'total_wanted',
+ type: 'int',
+ },
+ {
+ name: 'state',
+ type: 'string',
+ },
+ {
+ name: 'progress',
+ type: 'int',
+ },
+ {
+ name: 'num_seeds',
+ type: 'int',
+ },
+ {
+ name: 'total_seeds',
+ type: 'int',
+ },
+ {
+ name: 'num_peers',
+ type: 'int',
+ },
+ {
+ name: 'total_peers',
+ type: 'int',
+ },
+ {
+ name: 'download_payload_rate',
+ type: 'int',
+ },
+ {
+ name: 'upload_payload_rate',
+ type: 'int',
+ },
+ {
+ name: 'eta',
+ type: 'int',
+ },
+ {
+ name: 'ratio',
+ type: 'float',
+ },
+ {
+ name: 'distributed_copies',
+ type: 'float',
+ },
+ {
+ name: 'time_added',
+ type: 'int',
+ },
+ {
+ name: 'tracker_host',
+ type: 'string',
+ },
+ {
+ name: 'save_path',
+ type: 'string',
+ },
+ {
+ name: 'total_done',
+ type: 'int',
+ },
+ {
+ name: 'total_uploaded',
+ type: 'int',
+ },
+ {
+ name: 'total_remaining',
+ type: 'int',
+ },
+ {
+ name: 'max_download_speed',
+ type: 'int',
+ },
+ {
+ name: 'max_upload_speed',
+ type: 'int',
+ },
+ {
+ name: 'seeds_peers_ratio',
+ type: 'float',
+ },
+ {
+ name: 'time_since_transfer',
+ type: 'int',
+ },
+]);
+/**
+ * Deluge.details.DetailsPanel.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.details');
+
+/**
+ * @class Deluge.details.DetailsPanel
+ */
+Deluge.details.DetailsPanel = Ext.extend(Ext.TabPanel, {
+ id: 'torrentDetails',
+ activeTab: 0,
+
+ initComponent: function() {
+ Deluge.details.DetailsPanel.superclass.initComponent.call(this);
+ this.add(new Deluge.details.StatusTab());
+ this.add(new Deluge.details.DetailsTab());
+ this.add(new Deluge.details.FilesTab());
+ this.add(new Deluge.details.PeersTab());
+ this.add(new Deluge.details.OptionsTab());
+ },
+
+ clear: function() {
+ this.items.each(function(panel) {
+ if (panel.clear) {
+ panel.clear.defer(100, panel);
+ panel.disable();
+ }
+ });
+ },
+
+ update: function(tab) {
+ var torrent = deluge.torrents.getSelected();
+ if (!torrent) {
+ this.clear();
+ return;
+ }
+
+ this.items.each(function(tab) {
+ if (tab.disabled) tab.enable();
+ });
+
+ tab = tab || this.getActiveTab();
+ if (tab.update) tab.update(torrent.id);
+ },
+
+ /* Event Handlers */
+
+ // We need to add the events in onRender since Deluge.Torrents has not been created yet.
+ onRender: function(ct, position) {
+ Deluge.details.DetailsPanel.superclass.onRender.call(
+ this,
+ ct,
+ position
+ );
+ deluge.events.on('disconnect', this.clear, this);
+ deluge.torrents.on('rowclick', this.onTorrentsClick, this);
+ this.on('tabchange', this.onTabChange, this);
+
+ deluge.torrents.getSelectionModel().on(
+ 'selectionchange',
+ function(selModel) {
+ if (!selModel.hasSelection()) this.clear();
+ },
+ this
+ );
+ },
+
+ onTabChange: function(panel, tab) {
+ this.update(tab);
+ },
+
+ onTorrentsClick: function(grid, rowIndex, e) {
+ this.update();
+ },
+});
+/**
+ * Deluge.Details.Details.js
+ * The details tab displayed in the details panel.
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Deluge.details.DetailsTab = Ext.extend(Ext.Panel, {
+ title: _('Details'),
+
+ fields: {},
+ autoScroll: true,
+ queuedItems: {},
+
+ oldData: {},
+
+ initComponent: function() {
+ Deluge.details.DetailsTab.superclass.initComponent.call(this);
+ this.addItem('torrent_name', _('Name:'));
+ this.addItem('hash', _('Hash:'));
+ this.addItem('path', _('Download Folder:'));
+ this.addItem('size', _('Total Size:'));
+ this.addItem('files', _('Total Files:'));
+ this.addItem('comment', _('Comment:'));
+ this.addItem('status', _('Status:'));
+ this.addItem('tracker', _('Tracker:'));
+ this.addItem('creator', _('Created By:'));
+ },
+
+ onRender: function(ct, position) {
+ Deluge.details.DetailsTab.superclass.onRender.call(this, ct, position);
+ this.body.setStyle('padding', '10px');
+ this.dl = Ext.DomHelper.append(this.body, { tag: 'dl' }, true);
+
+ for (var id in this.queuedItems) {
+ this.doAddItem(id, this.queuedItems[id]);
+ }
+ },
+
+ addItem: function(id, label) {
+ if (!this.rendered) {
+ this.queuedItems[id] = label;
+ } else {
+ this.doAddItem(id, label);
+ }
+ },
+
+ // private
+ doAddItem: function(id, label) {
+ Ext.DomHelper.append(this.dl, { tag: 'dt', cls: id, html: label });
+ this.fields[id] = Ext.DomHelper.append(
+ this.dl,
+ { tag: 'dd', cls: id, html: '' },
+ true
+ );
+ },
+
+ clear: function() {
+ if (!this.fields) return;
+ for (var k in this.fields) {
+ this.fields[k].dom.innerHTML = '';
+ }
+ this.oldData = {};
+ },
+
+ update: function(torrentId) {
+ deluge.client.web.get_torrent_status(torrentId, Deluge.Keys.Details, {
+ success: this.onRequestComplete,
+ scope: this,
+ torrentId: torrentId,
+ });
+ },
+
+ onRequestComplete: function(torrent, request, response, options) {
+ var data = {
+ torrent_name: torrent.name,
+ hash: options.options.torrentId,
+ path: torrent.download_location,
+ size: fsize(torrent.total_size),
+ files: torrent.num_files,
+ status: torrent.message,
+ tracker: torrent.tracker_host,
+ comment: torrent.comment,
+ creator: torrent.creator,
+ };
+
+ for (var field in this.fields) {
+ if (!Ext.isDefined(data[field])) continue; // This is a field we are not responsible for.
+ if (data[field] == this.oldData[field]) continue;
+ this.fields[field].dom.innerHTML = Ext.escapeHTML(data[field]);
+ }
+ this.oldData = data;
+ },
+});
+/**
+ * Deluge.details.FilesTab.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Deluge.details.FilesTab = Ext.extend(Ext.ux.tree.TreeGrid, {
+ title: _('Files'),
+
+ rootVisible: false,
+
+ columns: [
+ {
+ header: _('Filename'),
+ width: 330,
+ dataIndex: 'filename',
+ },
+ {
+ header: _('Size'),
+ width: 150,
+ dataIndex: 'size',
+ tpl: new Ext.XTemplate('{size:this.fsize}', {
+ fsize: function(v) {
+ return fsize(v);
+ },
+ }),
+ },
+ {
+ xtype: 'tgrendercolumn',
+ header: _('Progress'),
+ width: 150,
+ dataIndex: 'progress',
+ renderer: function(v) {
+ var progress = v * 100;
+ return Deluge.progressBar(
+ progress,
+ this.col.width,
+ progress.toFixed(2) + '%',
+ 0
+ );
+ },
+ },
+ {
+ header: _('Priority'),
+ width: 150,
+ dataIndex: 'priority',
+ tpl: new Ext.XTemplate(
+ '<tpl if="!isNaN(priority)">' +
+ '<div class="{priority:this.getClass}">' +
+ '{priority:this.getName}' +
+ '</div></tpl>',
+ {
+ getClass: function(v) {
+ return FILE_PRIORITY_CSS[v];
+ },
+
+ getName: function(v) {
+ return _(FILE_PRIORITY[v]);
+ },
+ }
+ ),
+ },
+ ],
+
+ selModel: new Ext.tree.MultiSelectionModel(),
+
+ initComponent: function() {
+ Deluge.details.FilesTab.superclass.initComponent.call(this);
+ this.setRootNode(new Ext.tree.TreeNode({ text: _('Files') }));
+ },
+
+ clear: function() {
+ var root = this.getRootNode();
+ if (!root.hasChildNodes()) return;
+ root.cascade(function(node) {
+ var parentNode = node.parentNode;
+ if (!parentNode) return;
+ if (!parentNode.ownerTree) return;
+ parentNode.removeChild(node);
+ });
+ },
+
+ createFileTree: function(files) {
+ function walk(files, parentNode) {
+ for (var file in files.contents) {
+ var item = files.contents[file];
+ if (item.type == 'dir') {
+ walk(
+ item,
+ parentNode.appendChild(
+ new Ext.tree.TreeNode({
+ text: file,
+ filename: file,
+ size: item.size,
+ progress: item.progress,
+ priority: item.priority,
+ })
+ )
+ );
+ } else {
+ parentNode.appendChild(
+ new Ext.tree.TreeNode({
+ text: file,
+ filename: file,
+ fileIndex: item.index,
+ size: item.size,
+ progress: item.progress,
+ priority: item.priority,
+ leaf: true,
+ iconCls: 'x-deluge-file',
+ uiProvider: Ext.ux.tree.TreeGridNodeUI,
+ })
+ );
+ }
+ }
+ }
+ var root = this.getRootNode();
+ walk(files, root);
+ root.firstChild.expand();
+ },
+
+ update: function(torrentId) {
+ if (this.torrentId != torrentId) {
+ this.clear();
+ this.torrentId = torrentId;
+ }
+
+ deluge.client.web.get_torrent_files(torrentId, {
+ success: this.onRequestComplete,
+ scope: this,
+ torrentId: torrentId,
+ });
+ },
+
+ updateFileTree: function(files) {
+ function walk(files, parentNode) {
+ for (var file in files.contents) {
+ var item = files.contents[file];
+ var node = parentNode.findChild('filename', file);
+ node.attributes.size = item.size;
+ node.attributes.progress = item.progress;
+ node.attributes.priority = item.priority;
+ node.ui.updateColumns();
+ if (item.type == 'dir') {
+ walk(item, node);
+ }
+ }
+ }
+ walk(files, this.getRootNode());
+ },
+
+ onRender: function(ct, position) {
+ Deluge.details.FilesTab.superclass.onRender.call(this, ct, position);
+ deluge.menus.filePriorities.on('itemclick', this.onItemClick, this);
+ this.on('contextmenu', this.onContextMenu, this);
+ this.sorter = new Ext.tree.TreeSorter(this, {
+ folderSort: true,
+ });
+ },
+
+ onContextMenu: function(node, e) {
+ e.stopEvent();
+ var selModel = this.getSelectionModel();
+ if (selModel.getSelectedNodes().length < 2) {
+ selModel.clearSelections();
+ node.select();
+ }
+ deluge.menus.filePriorities.showAt(e.getPoint());
+ },
+
+ onItemClick: function(baseItem, e) {
+ switch (baseItem.id) {
+ case 'expandAll':
+ this.expandAll();
+ break;
+ default:
+ var indexes = {};
+ var walk = function(node) {
+ if (Ext.isEmpty(node.attributes.fileIndex)) return;
+ indexes[node.attributes.fileIndex] =
+ node.attributes.priority;
+ };
+ this.getRootNode().cascade(walk);
+
+ var nodes = this.getSelectionModel().getSelectedNodes();
+ Ext.each(nodes, function(node) {
+ if (!node.isLeaf()) {
+ var setPriorities = function(node) {
+ if (Ext.isEmpty(node.attributes.fileIndex)) return;
+ indexes[node.attributes.fileIndex] =
+ baseItem.filePriority;
+ };
+ node.cascade(setPriorities);
+ } else if (!Ext.isEmpty(node.attributes.fileIndex)) {
+ indexes[node.attributes.fileIndex] =
+ baseItem.filePriority;
+ return;
+ }
+ });
+
+ var priorities = new Array(Ext.keys(indexes).length);
+ for (var index in indexes) {
+ priorities[index] = indexes[index];
+ }
+
+ deluge.client.core.set_torrent_options(
+ [this.torrentId],
+ { file_priorities: priorities },
+ {
+ success: function() {
+ Ext.each(nodes, function(node) {
+ node.setColumnValue(3, baseItem.filePriority);
+ });
+ },
+ scope: this,
+ }
+ );
+ break;
+ }
+ },
+
+ onRequestComplete: function(files, options) {
+ if (!this.getRootNode().hasChildNodes()) {
+ this.createFileTree(files);
+ } else {
+ this.updateFileTree(files);
+ }
+ },
+});
+/**
+ * Deluge.details.OptionsTab.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ autoScroll: true,
+ bodyStyle: 'padding: 5px;',
+ border: false,
+ cls: 'x-deluge-options',
+ defaults: {
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ },
+ deferredRender: false,
+ layout: 'column',
+ title: _('Options'),
+ },
+ config
+ );
+ Deluge.details.OptionsTab.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.details.OptionsTab.superclass.initComponent.call(this);
+
+ (this.fieldsets = {}), (this.fields = {});
+ this.optionsManager = new Deluge.MultiOptionsManager({
+ options: {
+ max_download_speed: -1,
+ max_upload_speed: -1,
+ max_connections: -1,
+ max_upload_slots: -1,
+ auto_managed: false,
+ stop_at_ratio: false,
+ stop_ratio: 2.0,
+ remove_at_ratio: false,
+ move_completed: false,
+ move_completed_path: '',
+ private: false,
+ prioritize_first_last: false,
+ super_seeding: false,
+ },
+ });
+
+ /*
+ * Bandwidth Options
+ */
+ this.fieldsets.bandwidth = this.add({
+ xtype: 'fieldset',
+ defaultType: 'spinnerfield',
+ bodyStyle: 'padding: 5px',
+
+ layout: 'table',
+ layoutConfig: { columns: 3 },
+ labelWidth: 150,
+
+ style: 'margin-left: 10px; margin-right: 5px; padding: 5px',
+ title: _('Bandwidth'),
+ width: 250,
+ });
+
+ /*
+ * Max Download Speed
+ */
+ this.fieldsets.bandwidth.add({
+ xtype: 'label',
+ text: _('Max Download Speed:'),
+ forId: 'max_download_speed',
+ cls: 'x-deluge-options-label',
+ });
+ this.fields.max_download_speed = this.fieldsets.bandwidth.add({
+ id: 'max_download_speed',
+ name: 'max_download_speed',
+ width: 70,
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 1,
+ minValue: -1,
+ maxValue: 99999,
+ },
+ });
+ this.fieldsets.bandwidth.add({
+ xtype: 'label',
+ text: _('KiB/s'),
+ style: 'margin-left: 10px',
+ });
+
+ /*
+ * Max Upload Speed
+ */
+ this.fieldsets.bandwidth.add({
+ xtype: 'label',
+ text: _('Max Upload Speed:'),
+ forId: 'max_upload_speed',
+ cls: 'x-deluge-options-label',
+ });
+ this.fields.max_upload_speed = this.fieldsets.bandwidth.add({
+ id: 'max_upload_speed',
+ name: 'max_upload_speed',
+ width: 70,
+ value: -1,
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 1,
+ minValue: -1,
+ maxValue: 99999,
+ },
+ });
+ this.fieldsets.bandwidth.add({
+ xtype: 'label',
+ text: _('KiB/s'),
+ style: 'margin-left: 10px',
+ });
+
+ /*
+ * Max Connections
+ */
+ this.fieldsets.bandwidth.add({
+ xtype: 'label',
+ text: _('Max Connections:'),
+ forId: 'max_connections',
+ cls: 'x-deluge-options-label',
+ });
+ this.fields.max_connections = this.fieldsets.bandwidth.add({
+ id: 'max_connections',
+ name: 'max_connections',
+ width: 70,
+ value: -1,
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ },
+ colspan: 2,
+ });
+
+ /*
+ * Max Upload Slots
+ */
+ this.fieldsets.bandwidth.add({
+ xtype: 'label',
+ text: _('Max Upload Slots:'),
+ forId: 'max_upload_slots',
+ cls: 'x-deluge-options-label',
+ });
+ this.fields.max_upload_slots = this.fieldsets.bandwidth.add({
+ id: 'max_upload_slots',
+ name: 'max_upload_slots',
+ width: 70,
+ value: -1,
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ },
+ colspan: 2,
+ });
+
+ /*
+ * Queue Options
+ */
+ this.fieldsets.queue = this.add({
+ xtype: 'fieldset',
+ title: _('Queue'),
+ style: 'margin-left: 5px; margin-right: 5px; padding: 5px',
+ width: 210,
+
+ layout: 'table',
+ layoutConfig: { columns: 2 },
+ labelWidth: 0,
+
+ defaults: {
+ fieldLabel: '',
+ labelSeparator: '',
+ },
+ });
+
+ this.fields.auto_managed = this.fieldsets.queue.add({
+ xtype: 'checkbox',
+ fieldLabel: '',
+ labelSeparator: '',
+ name: 'is_auto_managed',
+ boxLabel: _('Auto Managed'),
+ width: 200,
+ colspan: 2,
+ });
+
+ this.fields.stop_at_ratio = this.fieldsets.queue.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ id: 'stop_at_ratio',
+ width: 120,
+ boxLabel: _('Stop seed at ratio:'),
+ handler: this.onStopRatioChecked,
+ scope: this,
+ });
+
+ this.fields.stop_ratio = this.fieldsets.queue.add({
+ xtype: 'spinnerfield',
+ id: 'stop_ratio',
+ name: 'stop_ratio',
+ disabled: true,
+ width: 50,
+ value: 2.0,
+ strategy: {
+ xtype: 'number',
+ minValue: -1,
+ maxValue: 99999,
+ incrementValue: 0.1,
+ alternateIncrementValue: 1,
+ decimalPrecision: 1,
+ },
+ });
+
+ this.fields.remove_at_ratio = this.fieldsets.queue.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ id: 'remove_at_ratio',
+ ctCls: 'x-deluge-indent-checkbox',
+ bodyStyle: 'padding-left: 10px',
+ boxLabel: _('Remove at ratio'),
+ disabled: true,
+ colspan: 2,
+ });
+
+ this.fields.move_completed = this.fieldsets.queue.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ id: 'move_completed',
+ boxLabel: _('Move Completed:'),
+ colspan: 2,
+ handler: this.onMoveCompletedChecked,
+ scope: this,
+ });
+
+ this.fields.move_completed_path = this.fieldsets.queue.add({
+ xtype: 'textfield',
+ fieldLabel: '',
+ id: 'move_completed_path',
+ colspan: 3,
+ bodyStyle: 'margin-left: 20px',
+ width: 180,
+ disabled: true,
+ });
+
+ /*
+ * General Options
+ */
+ this.rightColumn = this.add({
+ border: false,
+ autoHeight: true,
+ style: 'margin-left: 5px',
+ width: 210,
+ });
+
+ this.fieldsets.general = this.rightColumn.add({
+ xtype: 'fieldset',
+ autoHeight: true,
+ defaultType: 'checkbox',
+ title: _('General'),
+ layout: 'form',
+ });
+
+ this.fields['private'] = this.fieldsets.general.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Private'),
+ id: 'private',
+ disabled: true,
+ });
+
+ this.fields.prioritize_first_last = this.fieldsets.general.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Prioritize First/Last'),
+ id: 'prioritize_first_last',
+ });
+
+ this.fields.super_seeding = this.fieldsets.general.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Super Seeding'),
+ id: 'super_seeding',
+ });
+
+ // Bind the fields so the options manager can manage them.
+ for (var id in this.fields) {
+ this.optionsManager.bind(id, this.fields[id]);
+ }
+
+ /*
+ * Buttons
+ */
+ this.buttonPanel = this.rightColumn.add({
+ layout: 'hbox',
+ xtype: 'panel',
+ border: false,
+ });
+
+ /*
+ * Edit Trackers button
+ */
+ this.buttonPanel.add({
+ id: 'edit_trackers',
+ xtype: 'button',
+ text: _('Edit Trackers'),
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-edit-trackers',
+ border: false,
+ width: 100,
+ handler: this.onEditTrackers,
+ scope: this,
+ });
+
+ /*
+ * Apply button
+ */
+ this.buttonPanel.add({
+ id: 'apply',
+ xtype: 'button',
+ text: _('Apply'),
+ style: 'margin-left: 10px;',
+ border: false,
+ width: 100,
+ handler: this.onApply,
+ scope: this,
+ });
+ },
+
+ onRender: function(ct, position) {
+ Deluge.details.OptionsTab.superclass.onRender.call(this, ct, position);
+
+ // This is another hack I think, so keep an eye out here when upgrading.
+ this.layout = new Ext.layout.ColumnLayout();
+ this.layout.setContainer(this);
+ this.doLayout();
+ },
+
+ clear: function() {
+ if (this.torrentId == null) return;
+ this.torrentId = null;
+ this.optionsManager.changeId(null);
+ },
+
+ reset: function() {
+ if (this.torrentId) this.optionsManager.reset();
+ },
+
+ update: function(torrentId) {
+ if (this.torrentId && !torrentId) this.clear(); // we want to clear the pane if we get a null torrent torrentIds
+
+ if (!torrentId) return; // We do not care about null torrentIds.
+
+ if (this.torrentId != torrentId) {
+ this.torrentId = torrentId;
+ this.optionsManager.changeId(torrentId);
+ }
+ deluge.client.web.get_torrent_status(torrentId, Deluge.Keys.Options, {
+ success: this.onRequestComplete,
+ scope: this,
+ });
+ },
+
+ onApply: function() {
+ var changed = this.optionsManager.getDirty();
+ deluge.client.core.set_torrent_options([this.torrentId], changed, {
+ success: function() {
+ this.optionsManager.commit();
+ },
+ scope: this,
+ });
+ },
+
+ onEditTrackers: function() {
+ deluge.editTrackers.show();
+ },
+
+ onMoveCompletedChecked: function(checkbox, checked) {
+ this.fields.move_completed_path.setDisabled(!checked);
+
+ if (!checked) return;
+ this.fields.move_completed_path.focus();
+ },
+
+ onStopRatioChecked: function(checkbox, checked) {
+ this.fields.remove_at_ratio.setDisabled(!checked);
+ this.fields.stop_ratio.setDisabled(!checked);
+ },
+
+ onRequestComplete: function(torrent, options) {
+ this.fields['private'].setValue(torrent['private']);
+ this.fields['private'].setDisabled(true);
+ delete torrent['private'];
+ torrent['auto_managed'] = torrent['is_auto_managed'];
+ torrent['prioritize_first_last_pieces'] =
+ torrent['prioritize_first_last'];
+ this.optionsManager.setDefault(torrent);
+ var stop_at_ratio = this.optionsManager.get('stop_at_ratio');
+ this.fields.remove_at_ratio.setDisabled(!stop_at_ratio);
+ this.fields.stop_ratio.setDisabled(!stop_at_ratio);
+ this.fields.move_completed_path.setDisabled(
+ !this.optionsManager.get('move_completed')
+ );
+ },
+});
+/**
+ * Deluge.details.PeersTab.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+(function() {
+ function flagRenderer(value) {
+ if (!value.replace(' ', '').replace(' ', '')) {
+ return '';
+ }
+ return String.format(
+ '<img src="{0}flag/{1}" />',
+ deluge.config.base,
+ value
+ );
+ }
+ function peerAddressRenderer(value, p, record) {
+ var seed =
+ record.data['seed'] == 1024 ? 'x-deluge-seed' : 'x-deluge-peer';
+ // Modify display of IPv6 to include brackets
+ var peer_ip = value.split(':');
+ if (peer_ip.length > 2) {
+ var port = peer_ip.pop();
+ var ip = peer_ip.join(':');
+ value = '[' + ip + ']:' + port;
+ }
+ return String.format('<div class="{0}">{1}</div>', seed, value);
+ }
+ function peerProgressRenderer(value) {
+ var progress = (value * 100).toFixed(0);
+ return Deluge.progressBar(progress, this.width - 8, progress + '%');
+ }
+
+ Deluge.details.PeersTab = Ext.extend(Ext.grid.GridPanel, {
+ // fast way to figure out if we have a peer already.
+ peers: {},
+
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ title: _('Peers'),
+ cls: 'x-deluge-peers',
+ store: new Ext.data.Store({
+ reader: new Ext.data.JsonReader(
+ {
+ idProperty: 'ip',
+ root: 'peers',
+ },
+ Deluge.data.Peer
+ ),
+ }),
+ columns: [
+ {
+ header: '&nbsp;',
+ width: 30,
+ sortable: true,
+ renderer: flagRenderer,
+ dataIndex: 'country',
+ },
+ {
+ header: _('Address'),
+ width: 125,
+ sortable: true,
+ renderer: peerAddressRenderer,
+ dataIndex: 'ip',
+ },
+ {
+ header: _('Client'),
+ width: 125,
+ sortable: true,
+ renderer: fplain,
+ dataIndex: 'client',
+ },
+ {
+ header: _('Progress'),
+ width: 150,
+ sortable: true,
+ renderer: peerProgressRenderer,
+ dataIndex: 'progress',
+ },
+ {
+ header: _('Down Speed'),
+ width: 100,
+ sortable: true,
+ renderer: fspeed,
+ dataIndex: 'down_speed',
+ },
+ {
+ header: _('Up Speed'),
+ width: 100,
+ sortable: true,
+ renderer: fspeed,
+ dataIndex: 'up_speed',
+ },
+ ],
+ stripeRows: true,
+ deferredRender: false,
+ autoScroll: true,
+ },
+ config
+ );
+ Deluge.details.PeersTab.superclass.constructor.call(this, config);
+ },
+
+ clear: function() {
+ this.getStore().removeAll();
+ this.peers = {};
+ },
+
+ update: function(torrentId) {
+ deluge.client.web.get_torrent_status(torrentId, Deluge.Keys.Peers, {
+ success: this.onRequestComplete,
+ scope: this,
+ });
+ },
+
+ onRequestComplete: function(torrent, options) {
+ if (!torrent) return;
+
+ var store = this.getStore();
+ var newPeers = [];
+ var addresses = {};
+
+ // Go through the peers updating and creating peer records
+ Ext.each(
+ torrent.peers,
+ function(peer) {
+ if (this.peers[peer.ip]) {
+ var record = store.getById(peer.ip);
+ record.beginEdit();
+ for (var k in peer) {
+ if (record.get(k) != peer[k]) {
+ record.set(k, peer[k]);
+ }
+ }
+ record.endEdit();
+ } else {
+ this.peers[peer.ip] = 1;
+ newPeers.push(new Deluge.data.Peer(peer, peer.ip));
+ }
+ addresses[peer.ip] = 1;
+ },
+ this
+ );
+ store.add(newPeers);
+
+ // Remove any peers that should not be left in the store.
+ store.each(function(record) {
+ if (!addresses[record.id]) {
+ store.remove(record);
+ delete this.peers[record.id];
+ }
+ }, this);
+ store.commitChanges();
+
+ var sortState = store.getSortState();
+ if (!sortState) return;
+ store.sort(sortState.field, sortState.direction);
+ },
+ });
+})();
+/**
+ * Deluge.details.StatusTab.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge.details');
+
+/**
+ * @class Deluge.details.StatusTab
+ * @extends Ext.Panel
+ */
+Deluge.details.StatusTab = Ext.extend(Ext.Panel, {
+ title: _('Status'),
+ autoScroll: true,
+
+ onRender: function(ct, position) {
+ Deluge.details.StatusTab.superclass.onRender.call(this, ct, position);
+
+ this.progressBar = this.add({
+ xtype: 'progress',
+ cls: 'x-deluge-status-progressbar',
+ });
+
+ this.status = this.add({
+ cls: 'x-deluge-status',
+ id: 'deluge-details-status',
+
+ border: false,
+ width: 1000,
+ listeners: {
+ render: {
+ fn: function(panel) {
+ panel.load({
+ url: deluge.config.base + 'render/tab_status.html',
+ text: _('Loading') + '...',
+ });
+ panel
+ .getUpdater()
+ .on('update', this.onPanelUpdate, this);
+ },
+ scope: this,
+ },
+ },
+ });
+ },
+
+ clear: function() {
+ this.progressBar.updateProgress(0, ' ');
+ for (var k in this.fields) {
+ this.fields[k].innerHTML = '';
+ }
+ },
+
+ update: function(torrentId) {
+ if (!this.fields) this.getFields();
+ deluge.client.web.get_torrent_status(torrentId, Deluge.Keys.Status, {
+ success: this.onRequestComplete,
+ scope: this,
+ });
+ },
+
+ onPanelUpdate: function(el, response) {
+ this.fields = {};
+ Ext.each(
+ Ext.query('dd', this.status.body.dom),
+ function(field) {
+ this.fields[field.className] = field;
+ },
+ this
+ );
+ },
+
+ onRequestComplete: function(status) {
+ seeds =
+ status.total_seeds > -1
+ ? status.num_seeds + ' (' + status.total_seeds + ')'
+ : status.num_seeds;
+ peers =
+ status.total_peers > -1
+ ? status.num_peers + ' (' + status.total_peers + ')'
+ : status.num_peers;
+ last_seen_complete =
+ status.last_seen_complete > 0.0
+ ? fdate(status.last_seen_complete)
+ : 'Never';
+ completed_time =
+ status.completed_time > 0.0 ? fdate(status.completed_time) : '';
+
+ var data = {
+ downloaded: fsize(status.total_done, true),
+ uploaded: fsize(status.total_uploaded, true),
+ share: status.ratio == -1 ? '&infin;' : status.ratio.toFixed(3),
+ announce: ftime(status.next_announce),
+ tracker_status: status.tracker_status,
+ downspeed: status.download_payload_rate
+ ? fspeed(status.download_payload_rate)
+ : '0.0 KiB/s',
+ upspeed: status.upload_payload_rate
+ ? fspeed(status.upload_payload_rate)
+ : '0.0 KiB/s',
+ eta: status.eta < 0 ? '&infin;' : ftime(status.eta),
+ pieces: status.num_pieces + ' (' + fsize(status.piece_length) + ')',
+ seeds: seeds,
+ peers: peers,
+ avail: status.distributed_copies.toFixed(3),
+ active_time: ftime(status.active_time),
+ seeding_time: ftime(status.seeding_time),
+ seed_rank: status.seed_rank,
+ time_added: fdate(status.time_added),
+ last_seen_complete: last_seen_complete,
+ completed_time: completed_time,
+ time_since_transfer: ftime(status.time_since_transfer),
+ };
+ data.auto_managed = _(status.is_auto_managed ? 'True' : 'False');
+
+ var translate_tracker_status = {
+ Error: _('Error'),
+ Warning: _('Warning'),
+ 'Announce OK': _('Announce OK'),
+ 'Announce Sent': _('Announce Sent'),
+ };
+ for (var key in translate_tracker_status) {
+ if (data.tracker_status.indexOf(key) != -1) {
+ data.tracker_status = data.tracker_status.replace(
+ key,
+ translate_tracker_status[key]
+ );
+ break;
+ }
+ }
+
+ data.downloaded +=
+ ' (' +
+ (status.total_payload_download
+ ? fsize(status.total_payload_download)
+ : '0.0 KiB') +
+ ')';
+ data.uploaded +=
+ ' (' +
+ (status.total_payload_upload
+ ? fsize(status.total_payload_upload)
+ : '0.0 KiB') +
+ ')';
+
+ for (var field in this.fields) {
+ this.fields[field].innerHTML = data[field];
+ }
+ var text = status.state + ' ' + status.progress.toFixed(2) + '%';
+ this.progressBar.updateProgress(status.progress / 100.0, text);
+ },
+});
+/**
+ * Deluge.preferences.BandwidthPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Bandwidth
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Bandwidth = Ext.extend(Ext.form.FormPanel, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ border: false,
+ title: _('Bandwidth'),
+ header: false,
+ layout: 'form',
+ labelWidth: 10,
+ },
+ config
+ );
+ Deluge.preferences.Bandwidth.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.preferences.Bandwidth.superclass.initComponent.call(this);
+
+ var om = deluge.preferences.getOptionsManager();
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Global Bandwidth Usage'),
+ labelWidth: 200,
+ defaultType: 'spinnerfield',
+ defaults: {
+ minValue: -1,
+ maxValue: 99999,
+ },
+ style: 'margin-bottom: 0px; padding-bottom: 0px;',
+ autoHeight: true,
+ });
+ om.bind(
+ 'max_connections_global',
+ fieldset.add({
+ name: 'max_connections_global',
+ fieldLabel: _('Maximum Connections:'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ om.bind(
+ 'max_upload_slots_global',
+ fieldset.add({
+ name: 'max_upload_slots_global',
+ fieldLabel: _('Maximum Upload Slots'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ om.bind(
+ 'max_download_speed',
+ fieldset.add({
+ name: 'max_download_speed',
+ fieldLabel: _('Maximum Download Speed (KiB/s):'),
+ labelSeparator: '',
+ width: 80,
+ value: -1.0,
+ decimalPrecision: 1,
+ })
+ );
+ om.bind(
+ 'max_upload_speed',
+ fieldset.add({
+ name: 'max_upload_speed',
+ fieldLabel: _('Maximum Upload Speed (KiB/s):'),
+ labelSeparator: '',
+ width: 80,
+ value: -1.0,
+ decimalPrecision: 1,
+ })
+ );
+ om.bind(
+ 'max_half_open_connections',
+ fieldset.add({
+ name: 'max_half_open_connections',
+ fieldLabel: _('Maximum Half-Open Connections:'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ om.bind(
+ 'max_connections_per_second',
+ fieldset.add({
+ name: 'max_connections_per_second',
+ fieldLabel: _('Maximum Connection Attempts per Second:'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: '',
+ defaultType: 'checkbox',
+ style:
+ 'padding-top: 0px; padding-bottom: 5px; margin-top: 0px; margin-bottom: 0px;',
+ autoHeight: true,
+ });
+ om.bind(
+ 'ignore_limits_on_local_network',
+ fieldset.add({
+ name: 'ignore_limits_on_local_network',
+ height: 22,
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Ignore limits on local network'),
+ })
+ );
+ om.bind(
+ 'rate_limit_ip_overhead',
+ fieldset.add({
+ name: 'rate_limit_ip_overhead',
+ height: 22,
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Rate limit IP overhead'),
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Per Torrent Bandwidth Usage'),
+ style: 'margin-bottom: 0px; padding-bottom: 0px;',
+ defaultType: 'spinnerfield',
+ labelWidth: 200,
+ defaults: {
+ minValue: -1,
+ maxValue: 99999,
+ },
+ autoHeight: true,
+ });
+ om.bind(
+ 'max_connections_per_torrent',
+ fieldset.add({
+ name: 'max_connections_per_torrent',
+ fieldLabel: _('Maximum Connections:'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ om.bind(
+ 'max_upload_slots_per_torrent',
+ fieldset.add({
+ name: 'max_upload_slots_per_torrent',
+ fieldLabel: _('Maximum Upload Slots:'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ om.bind(
+ 'max_download_speed_per_torrent',
+ fieldset.add({
+ name: 'max_download_speed_per_torrent',
+ fieldLabel: _('Maximum Download Speed (KiB/s):'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ om.bind(
+ 'max_upload_speed_per_torrent',
+ fieldset.add({
+ name: 'max_upload_speed_per_torrent',
+ fieldLabel: _('Maximum Upload Speed (KiB/s):'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ },
+});
+/**
+ * Deluge.preferences.CachePage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Cache
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Cache = Ext.extend(Ext.form.FormPanel, {
+ border: false,
+ title: _('Cache'),
+ header: false,
+ layout: 'form',
+
+ initComponent: function() {
+ Deluge.preferences.Cache.superclass.initComponent.call(this);
+
+ var om = deluge.preferences.getOptionsManager();
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Settings'),
+ autoHeight: true,
+ labelWidth: 180,
+ defaultType: 'spinnerfield',
+ defaults: {
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 999999,
+ },
+ });
+ om.bind(
+ 'cache_size',
+ fieldset.add({
+ fieldLabel: _('Cache Size (16 KiB Blocks):'),
+ labelSeparator: '',
+ name: 'cache_size',
+ width: 60,
+ value: 512,
+ })
+ );
+ om.bind(
+ 'cache_expiry',
+ fieldset.add({
+ fieldLabel: _('Cache Expiry (seconds):'),
+ labelSeparator: '',
+ name: 'cache_expiry',
+ width: 60,
+ value: 60,
+ })
+ );
+ },
+});
+/**
+ * Deluge.preferences.DaemonPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Daemon
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Daemon = Ext.extend(Ext.form.FormPanel, {
+ border: false,
+ title: _('Daemon'),
+ header: false,
+ layout: 'form',
+
+ initComponent: function() {
+ Deluge.preferences.Daemon.superclass.initComponent.call(this);
+
+ var om = deluge.preferences.getOptionsManager();
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Port'),
+ autoHeight: true,
+ defaultType: 'spinnerfield',
+ });
+ om.bind(
+ 'daemon_port',
+ fieldset.add({
+ fieldLabel: _('Daemon port:'),
+ labelSeparator: '',
+ name: 'daemon_port',
+ value: 58846,
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Connections'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ om.bind(
+ 'allow_remote',
+ fieldset.add({
+ fieldLabel: '',
+ height: 22,
+ labelSeparator: '',
+ boxLabel: _('Allow Remote Connections'),
+ name: 'allow_remote',
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Other'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ om.bind(
+ 'new_release_check',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ height: 40,
+ boxLabel: _('Periodically check the website for new releases'),
+ id: 'new_release_check',
+ })
+ );
+ },
+});
+/**
+ * Deluge.preferences.DownloadsPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Downloads
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Downloads = Ext.extend(Ext.FormPanel, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ border: false,
+ title: _('Downloads'),
+ header: false,
+ layout: 'form',
+ autoHeight: true,
+ width: 320,
+ },
+ config
+ );
+ Deluge.preferences.Downloads.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.preferences.Downloads.superclass.initComponent.call(this);
+
+ var optMan = deluge.preferences.getOptionsManager();
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Folders'),
+ labelWidth: 150,
+ defaultType: 'togglefield',
+ autoHeight: true,
+ labelAlign: 'top',
+ width: 300,
+ style: 'margin-bottom: 5px; padding-bottom: 5px;',
+ });
+
+ optMan.bind(
+ 'download_location',
+ fieldset.add({
+ xtype: 'textfield',
+ name: 'download_location',
+ fieldLabel: _('Download to:'),
+ labelSeparator: '',
+ width: 280,
+ })
+ );
+
+ var field = fieldset.add({
+ name: 'move_completed_path',
+ fieldLabel: _('Move completed to:'),
+ labelSeparator: '',
+ width: 280,
+ });
+ optMan.bind('move_completed', field.toggle);
+ optMan.bind('move_completed_path', field.input);
+
+ field = fieldset.add({
+ name: 'torrentfiles_location',
+ fieldLabel: _('Copy of .torrent files to:'),
+ labelSeparator: '',
+ width: 280,
+ });
+ optMan.bind('copy_torrent_file', field.toggle);
+ optMan.bind('torrentfiles_location', field.input);
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Options'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ style: 'margin-bottom: 0; padding-bottom: 0;',
+ width: 280,
+ });
+ optMan.bind(
+ 'prioritize_first_last_pieces',
+ fieldset.add({
+ name: 'prioritize_first_last_pieces',
+ labelSeparator: '',
+ height: 22,
+ boxLabel: _('Prioritize first and last pieces of torrent'),
+ })
+ );
+ optMan.bind(
+ 'sequential_download',
+ fieldset.add({
+ name: 'sequential_download',
+ labelSeparator: '',
+ height: 22,
+ boxLabel: _('Sequential download'),
+ })
+ );
+ optMan.bind(
+ 'add_paused',
+ fieldset.add({
+ name: 'add_paused',
+ labelSeparator: '',
+ height: 22,
+ boxLabel: _('Add torrents in Paused state'),
+ })
+ );
+ optMan.bind(
+ 'pre_allocate_storage',
+ fieldset.add({
+ name: 'pre_allocate_storage',
+ labelSeparator: '',
+ height: 22,
+ boxLabel: _('Pre-allocate disk space'),
+ })
+ );
+ },
+});
+/**
+ * Deluge.preferences.EncryptionPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Encryption
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Encryption = Ext.extend(Ext.form.FormPanel, {
+ border: false,
+ title: _('Encryption'),
+ header: false,
+
+ initComponent: function() {
+ Deluge.preferences.Encryption.superclass.initComponent.call(this);
+
+ var optMan = deluge.preferences.getOptionsManager();
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Settings'),
+ header: false,
+ autoHeight: true,
+ defaultType: 'combo',
+ width: 300,
+ });
+ optMan.bind(
+ 'enc_in_policy',
+ fieldset.add({
+ fieldLabel: _('Incoming:'),
+ labelSeparator: '',
+ mode: 'local',
+ width: 150,
+ store: new Ext.data.ArrayStore({
+ fields: ['id', 'text'],
+ data: [
+ [0, _('Forced')],
+ [1, _('Enabled')],
+ [2, _('Disabled')],
+ ],
+ }),
+ editable: false,
+ triggerAction: 'all',
+ valueField: 'id',
+ displayField: 'text',
+ })
+ );
+ optMan.bind(
+ 'enc_out_policy',
+ fieldset.add({
+ fieldLabel: _('Outgoing:'),
+ labelSeparator: '',
+ mode: 'local',
+ width: 150,
+ store: new Ext.data.SimpleStore({
+ fields: ['id', 'text'],
+ data: [
+ [0, _('Forced')],
+ [1, _('Enabled')],
+ [2, _('Disabled')],
+ ],
+ }),
+ editable: false,
+ triggerAction: 'all',
+ valueField: 'id',
+ displayField: 'text',
+ })
+ );
+ optMan.bind(
+ 'enc_level',
+ fieldset.add({
+ fieldLabel: _('Level:'),
+ labelSeparator: '',
+ mode: 'local',
+ width: 150,
+ store: new Ext.data.SimpleStore({
+ fields: ['id', 'text'],
+ data: [
+ [0, _('Handshake')],
+ [1, _('Full Stream')],
+ [2, _('Either')],
+ ],
+ }),
+ editable: false,
+ triggerAction: 'all',
+ valueField: 'id',
+ displayField: 'text',
+ })
+ );
+ },
+});
+/**
+ * Deluge.preferences.InstallPluginWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.InstallPluginWindow
+ * @extends Ext.Window
+ */
+Deluge.preferences.InstallPluginWindow = Ext.extend(Ext.Window, {
+ title: _('Install Plugin'),
+ layout: 'fit',
+ height: 115,
+ width: 350,
+ constrainHeader: true,
+ bodyStyle: 'padding: 10px 5px;',
+ buttonAlign: 'center',
+ closeAction: 'hide',
+ iconCls: 'x-deluge-install-plugin',
+ modal: true,
+ plain: true,
+
+ initComponent: function() {
+ Deluge.preferences.InstallPluginWindow.superclass.initComponent.call(
+ this
+ );
+ this.addButton(_('Install'), this.onInstall, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ baseCls: 'x-plain',
+ labelWidth: 70,
+ autoHeight: true,
+ fileUpload: true,
+ items: [
+ {
+ xtype: 'fileuploadfield',
+ width: 240,
+ emptyText: _('Select an egg'),
+ fieldLabel: _('Plugin Egg'),
+ name: 'file',
+ buttonCfg: {
+ text: _('Browse...'),
+ },
+ },
+ ],
+ });
+ },
+
+ onInstall: function(field, e) {
+ this.form.getForm().submit({
+ url: deluge.config.base + 'upload',
+ waitMsg: _('Uploading your plugin...'),
+ success: this.onUploadSuccess,
+ scope: this,
+ });
+ },
+
+ onUploadPlugin: function(info, obj, response, request) {
+ this.fireEvent('pluginadded');
+ },
+
+ onUploadSuccess: function(fp, upload) {
+ this.hide();
+ if (upload.result.success) {
+ var filename = this.form.getForm().getFieldValues().file;
+ filename = filename.split('\\').slice(-1)[0];
+ var path = upload.result.files[0];
+ this.form.getForm().setValues({ file: '' });
+ deluge.client.web.upload_plugin(filename, path, {
+ success: this.onUploadPlugin,
+ scope: this,
+ filename: filename,
+ });
+ }
+ },
+});
+/**
+ * Deluge.preferences.InterfacePage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Interface
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Interface = Ext.extend(Ext.form.FormPanel, {
+ border: false,
+ title: _('Interface'),
+ header: false,
+ layout: 'form',
+
+ initComponent: function() {
+ Deluge.preferences.Interface.superclass.initComponent.call(this);
+
+ var om = (this.optionsManager = new Deluge.OptionsManager());
+ this.on('show', this.onPageShow, this);
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Interface'),
+ style: 'margin-bottom: 0px; padding-bottom: 5px; padding-top: 5px',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ defaults: {
+ height: 17,
+ fieldLabel: '',
+ labelSeparator: '',
+ },
+ });
+ om.bind(
+ 'show_session_speed',
+ fieldset.add({
+ name: 'show_session_speed',
+ boxLabel: _('Show session speed in titlebar'),
+ })
+ );
+ om.bind(
+ 'sidebar_show_zero',
+ fieldset.add({
+ name: 'sidebar_show_zero',
+ boxLabel: _('Show filters with zero torrents'),
+ })
+ );
+ om.bind(
+ 'sidebar_multiple_filters',
+ fieldset.add({
+ name: 'sidebar_multiple_filters',
+ boxLabel: _('Allow the use of multiple filters at once'),
+ })
+ );
+
+ var languagePanel = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Language'),
+ style: 'margin-bottom: 0px; padding-bottom: 5px; padding-top: 5px',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ this.language = om.bind(
+ 'language',
+ languagePanel.add({
+ xtype: 'combo',
+ labelSeparator: '',
+ name: 'language',
+ mode: 'local',
+ width: 200,
+ store: new Ext.data.ArrayStore({
+ fields: ['id', 'text'],
+ }),
+ editable: false,
+ triggerAction: 'all',
+ valueField: 'id',
+ displayField: 'text',
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('WebUI Password'),
+ style: 'margin-bottom: 0px; padding-bottom: 5px; padding-top: 5px',
+ autoHeight: true,
+ labelWidth: 100,
+ defaultType: 'textfield',
+ defaults: {
+ width: 100,
+ inputType: 'password',
+ labelStyle: 'padding-left: 5px',
+ height: 20,
+ labelSeparator: '',
+ },
+ });
+
+ this.oldPassword = fieldset.add({
+ name: 'old_password',
+ fieldLabel: _('Old:'),
+ });
+ this.newPassword = fieldset.add({
+ name: 'new_password',
+ fieldLabel: _('New:'),
+ });
+ this.confirmPassword = fieldset.add({
+ name: 'confirm_password',
+ fieldLabel: _('Confirm:'),
+ });
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Server'),
+ style: 'padding-top: 5px; margin-bottom: 0px; padding-bottom: 5px',
+ autoHeight: true,
+ labelWidth: 100,
+ defaultType: 'spinnerfield',
+ defaults: {
+ labelSeparator: '',
+ labelStyle: 'padding-left: 5px',
+ height: 20,
+ width: 80,
+ },
+ });
+ om.bind(
+ 'session_timeout',
+ fieldset.add({
+ name: 'session_timeout',
+ fieldLabel: _('Session Timeout:'),
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ })
+ );
+ om.bind(
+ 'port',
+ fieldset.add({
+ name: 'port',
+ fieldLabel: _('Port:'),
+ decimalPrecision: 0,
+ minValue: 1,
+ maxValue: 65535,
+ })
+ );
+ this.httpsField = om.bind(
+ 'https',
+ fieldset.add({
+ xtype: 'checkbox',
+ name: 'https',
+ hideLabel: true,
+ width: 300,
+ style: 'margin-left: 5px',
+ boxLabel: _(
+ 'Enable SSL (paths relative to Deluge config folder)'
+ ),
+ })
+ );
+ this.httpsField.on('check', this.onSSLCheck, this);
+ this.pkeyField = om.bind(
+ 'pkey',
+ fieldset.add({
+ xtype: 'textfield',
+ disabled: true,
+ name: 'pkey',
+ width: 180,
+ fieldLabel: _('Private Key:'),
+ })
+ );
+ this.certField = om.bind(
+ 'cert',
+ fieldset.add({
+ xtype: 'textfield',
+ disabled: true,
+ name: 'cert',
+ width: 180,
+ fieldLabel: _('Certificate:'),
+ })
+ );
+ },
+
+ onApply: function() {
+ var changed = this.optionsManager.getDirty();
+ if (!Ext.isObjectEmpty(changed)) {
+ deluge.client.web.set_config(changed, {
+ success: this.onSetConfig,
+ scope: this,
+ });
+
+ for (var key in deluge.config) {
+ deluge.config[key] = this.optionsManager.get(key);
+ }
+ if ('language' in changed) {
+ Ext.Msg.show({
+ title: _('WebUI Language Changed'),
+ msg: _(
+ 'Do you want to refresh the page now to use the new language?'
+ ),
+ buttons: {
+ yes: _('Refresh'),
+ no: _('Close'),
+ },
+ multiline: false,
+ fn: function(btnText) {
+ if (btnText === 'yes') location.reload();
+ },
+ icon: Ext.MessageBox.QUESTION,
+ });
+ }
+ }
+ if (this.oldPassword.getValue() || this.newPassword.getValue()) {
+ this.onPasswordChange();
+ }
+ },
+
+ onOk: function() {
+ this.onApply();
+ },
+
+ onGotConfig: function(config) {
+ this.optionsManager.set(config);
+ },
+
+ onGotLanguages: function(info, obj, response, request) {
+ info.unshift(['', _('System Default')]);
+ this.language.store.loadData(info);
+ this.language.setValue(this.optionsManager.get('language'));
+ },
+
+ onPasswordChange: function() {
+ var newPassword = this.newPassword.getValue();
+ if (newPassword != this.confirmPassword.getValue()) {
+ Ext.MessageBox.show({
+ title: _('Invalid Password'),
+ msg: _("Your passwords don't match!"),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ return;
+ }
+
+ var oldPassword = this.oldPassword.getValue();
+ deluge.client.auth.change_password(oldPassword, newPassword, {
+ success: function(result) {
+ if (!result) {
+ Ext.MessageBox.show({
+ title: _('Password'),
+ msg: _('Your old password was incorrect!'),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ this.oldPassword.setValue('');
+ } else {
+ Ext.MessageBox.show({
+ title: _('Change Successful'),
+ msg: _('Your password was successfully changed!'),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.INFO,
+ iconCls: 'x-deluge-icon-info',
+ });
+ this.oldPassword.setValue('');
+ this.newPassword.setValue('');
+ this.confirmPassword.setValue('');
+ }
+ },
+ scope: this,
+ });
+ },
+
+ onSetConfig: function() {
+ this.optionsManager.commit();
+ },
+
+ onPageShow: function() {
+ deluge.client.web.get_config({
+ success: this.onGotConfig,
+ scope: this,
+ });
+ deluge.client.webutils.get_languages({
+ success: this.onGotLanguages,
+ scope: this,
+ });
+ },
+
+ onSSLCheck: function(e, checked) {
+ this.pkeyField.setDisabled(!checked);
+ this.certField.setDisabled(!checked);
+ },
+});
+/**
+ * Deluge.preferences.NetworkPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+// custom Vtype for vtype:'IPAddress'
+Ext.apply(Ext.form.VTypes, {
+ IPAddress: function(v) {
+ return /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(v);
+ },
+ IPAddressText: 'Must be a numeric IP address',
+ IPAddressMask: /[\d\.]/i,
+});
+
+/**
+ * @class Deluge.preferences.Network
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Network = Ext.extend(Ext.form.FormPanel, {
+ border: false,
+ layout: 'form',
+ title: _('Network'),
+ header: false,
+
+ initComponent: function() {
+ Deluge.preferences.Network.superclass.initComponent.call(this);
+ var optMan = deluge.preferences.getOptionsManager();
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Incoming Address'),
+ style: 'margin-bottom: 5px; padding-bottom: 0px;',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'textfield',
+ });
+ optMan.bind(
+ 'listen_interface',
+ fieldset.add({
+ name: 'listen_interface',
+ fieldLabel: '',
+ labelSeparator: '',
+ width: 200,
+ vtype: 'IPAddress',
+ })
+ );
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Incoming Port'),
+ style: 'margin-bottom: 5px; padding-bottom: 0px;',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ optMan.bind(
+ 'random_port',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Use Random Port'),
+ name: 'random_port',
+ height: 22,
+ listeners: {
+ check: {
+ fn: function(e, checked) {
+ this.listenPort.setDisabled(checked);
+ },
+ scope: this,
+ },
+ },
+ })
+ );
+
+ this.listenPort = fieldset.add({
+ xtype: 'spinnerfield',
+ name: 'listen_port',
+ fieldLabel: '',
+ labelSeparator: '',
+ width: 75,
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: 0,
+ maxValue: 65535,
+ },
+ });
+ optMan.bind('listen_ports', this.listenPort);
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Outgoing Interface'),
+ style: 'margin-bottom: 5px; padding-bottom: 0px;',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'textfield',
+ });
+ optMan.bind(
+ 'outgoing_interface',
+ fieldset.add({
+ name: 'outgoing_interface',
+ fieldLabel: '',
+ labelSeparator: '',
+ width: 40,
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Outgoing Ports'),
+ style: 'margin-bottom: 5px; padding-bottom: 0px;',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ optMan.bind(
+ 'random_outgoing_ports',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Use Random Ports'),
+ name: 'random_outgoing_ports',
+ height: 22,
+ listeners: {
+ check: {
+ fn: function(e, checked) {
+ this.outgoingPorts.setDisabled(checked);
+ },
+ scope: this,
+ },
+ },
+ })
+ );
+ this.outgoingPorts = fieldset.add({
+ xtype: 'spinnergroup',
+ name: 'outgoing_ports',
+ fieldLabel: '',
+ labelSeparator: '',
+ colCfg: {
+ labelWidth: 40,
+ style: 'margin-right: 10px;',
+ },
+ items: [
+ {
+ fieldLabel: _('From:'),
+ labelSeparator: '',
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: 0,
+ maxValue: 65535,
+ },
+ },
+ {
+ fieldLabel: _('To:'),
+ labelSeparator: '',
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: 0,
+ maxValue: 65535,
+ },
+ },
+ ],
+ });
+ optMan.bind('outgoing_ports', this.outgoingPorts);
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Network Extras'),
+ autoHeight: true,
+ layout: 'table',
+ layoutConfig: {
+ columns: 3,
+ },
+ defaultType: 'checkbox',
+ });
+ optMan.bind(
+ 'upnp',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('UPnP'),
+ name: 'upnp',
+ })
+ );
+ optMan.bind(
+ 'natpmp',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('NAT-PMP'),
+ ctCls: 'x-deluge-indent-checkbox',
+ name: 'natpmp',
+ })
+ );
+ optMan.bind(
+ 'utpex',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Peer Exchange'),
+ ctCls: 'x-deluge-indent-checkbox',
+ name: 'utpex',
+ })
+ );
+ optMan.bind(
+ 'lsd',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('LSD'),
+ name: 'lsd',
+ })
+ );
+ optMan.bind(
+ 'dht',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('DHT'),
+ ctCls: 'x-deluge-indent-checkbox',
+ name: 'dht',
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Type Of Service'),
+ style: 'margin-bottom: 5px; padding-bottom: 0px;',
+ bodyStyle: 'margin: 0px; padding: 0px',
+ autoHeight: true,
+ defaultType: 'textfield',
+ });
+ optMan.bind(
+ 'peer_tos',
+ fieldset.add({
+ name: 'peer_tos',
+ fieldLabel: _('Peer TOS Byte:'),
+ labelSeparator: '',
+ width: 40,
+ })
+ );
+ },
+});
+/**
+ * Deluge.preferences.OtherPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Other
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Other = Ext.extend(Ext.form.FormPanel, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ border: false,
+ title: _('Other'),
+ header: false,
+ layout: 'form',
+ },
+ config
+ );
+ Deluge.preferences.Other.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.preferences.Other.superclass.initComponent.call(this);
+
+ var optMan = deluge.preferences.getOptionsManager();
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Updates'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ optMan.bind(
+ 'new_release_check',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ height: 22,
+ name: 'new_release_check',
+ boxLabel: _('Be alerted about new releases'),
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('System Information'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ fieldset.add({
+ xtype: 'panel',
+ border: false,
+ bodyCfg: {
+ html: _(
+ 'Help us improve Deluge by sending us your Python version, PyGTK version, OS and processor types. Absolutely no other information is sent.'
+ ),
+ },
+ });
+ optMan.bind(
+ 'send_info',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ height: 22,
+ boxLabel: _('Yes, please send anonymous statistics'),
+ name: 'send_info',
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('GeoIP Database'),
+ autoHeight: true,
+ labelWidth: 80,
+ defaultType: 'textfield',
+ });
+ optMan.bind(
+ 'geoip_db_location',
+ fieldset.add({
+ name: 'geoip_db_location',
+ fieldLabel: _('Path:'),
+ labelSeparator: '',
+ width: 200,
+ })
+ );
+ },
+});
+/**
+ * Deluge.preferences.PluginsPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Plugins
+ * @extends Ext.Panel
+ */
+Deluge.preferences.Plugins = Ext.extend(Ext.Panel, {
+ layout: 'border',
+ title: _('Plugins'),
+ header: false,
+ border: false,
+ cls: 'x-deluge-plugins',
+
+ pluginTemplate: new Ext.Template(
+ '<dl class="singleline">' +
+ '<dt>' +
+ _('Author:') +
+ '</dt><dd>{author}</dd>' +
+ '<dt>' +
+ _('Version:') +
+ '</dt><dd>{version}</dd>' +
+ '<dt>' +
+ _('Author Email:') +
+ '</dt><dd>{email}</dd>' +
+ '<dt>' +
+ _('Homepage:') +
+ '</dt><dd>{homepage}</dd>' +
+ '<dt>' +
+ _('Details:') +
+ '</dt><dd style="white-space:normal">{details}</dd>' +
+ '</dl>'
+ ),
+
+ initComponent: function() {
+ Deluge.preferences.Plugins.superclass.initComponent.call(this);
+ this.defaultValues = {
+ version: '',
+ email: '',
+ homepage: '',
+ details: '',
+ };
+ this.pluginTemplate.compile();
+
+ var checkboxRenderer = function(v, p, record) {
+ p.css += ' x-grid3-check-col-td';
+ return (
+ '<div class="x-grid3-check-col' + (v ? '-on' : '') + '"> </div>'
+ );
+ };
+
+ this.list = this.add({
+ xtype: 'listview',
+ store: new Ext.data.ArrayStore({
+ fields: [
+ { name: 'enabled', mapping: 0 },
+ { name: 'plugin', mapping: 1, sortType: 'asUCString' },
+ ],
+ }),
+ columns: [
+ {
+ id: 'enabled',
+ header: _('Enabled'),
+ width: 0.2,
+ sortable: true,
+ tpl: new Ext.XTemplate('{enabled:this.getCheckbox}', {
+ getCheckbox: function(v) {
+ return (
+ '<div class="x-grid3-check-col' +
+ (v ? '-on' : '') +
+ '" rel="chkbox"> </div>'
+ );
+ },
+ }),
+ dataIndex: 'enabled',
+ },
+ {
+ id: 'plugin',
+ header: _('Plugin'),
+ width: 0.8,
+ sortable: true,
+ dataIndex: 'plugin',
+ },
+ ],
+ singleSelect: true,
+ autoExpandColumn: 'plugin',
+ listeners: {
+ selectionchange: { fn: this.onPluginSelect, scope: this },
+ },
+ });
+
+ this.panel = this.add({
+ region: 'center',
+ autoScroll: true,
+ items: [this.list],
+ bbar: new Ext.Toolbar({
+ items: [
+ {
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-install-plugin',
+ text: _('Install'),
+ handler: this.onInstallPluginWindow,
+ scope: this,
+ },
+ '->',
+ {
+ cls: 'x-btn-text-icon',
+ text: _('Find More'),
+ iconCls: 'x-deluge-find-more',
+ handler: this.onFindMorePlugins,
+ scope: this,
+ },
+ ],
+ }),
+ });
+
+ var pp = (this.pluginInfo = this.add({
+ xtype: 'panel',
+ border: false,
+ height: 100,
+ region: 'south',
+ padding: '5',
+ autoScroll: true,
+ bodyCfg: {
+ style: 'white-space: nowrap',
+ },
+ }));
+
+ this.pluginInfo.on('render', this.onPluginInfoRender, this);
+ this.list.on('click', this.onNodeClick, this);
+ deluge.preferences.on('show', this.onPreferencesShow, this);
+ deluge.events.on('PluginDisabledEvent', this.onPluginDisabled, this);
+ deluge.events.on('PluginEnabledEvent', this.onPluginEnabled, this);
+ },
+
+ disablePlugin: function(plugin) {
+ deluge.client.core.disable_plugin(plugin);
+ },
+
+ enablePlugin: function(plugin) {
+ deluge.client.core.enable_plugin(plugin);
+ },
+
+ setInfo: function(plugin) {
+ if (!this.pluginInfo.rendered) return;
+ var values = plugin || this.defaultValues;
+ this.pluginInfo.body.dom.innerHTML = this.pluginTemplate.apply(values);
+ },
+
+ updatePlugins: function() {
+ var onGotAvailablePlugins = function(plugins) {
+ this.availablePlugins = plugins.sort(function(a, b) {
+ return a.toLowerCase().localeCompare(b.toLowerCase());
+ });
+
+ deluge.client.core.get_enabled_plugins({
+ success: onGotEnabledPlugins,
+ scope: this,
+ });
+ };
+
+ var onGotEnabledPlugins = function(plugins) {
+ this.enabledPlugins = plugins;
+ this.onGotPlugins();
+ };
+
+ deluge.client.core.get_available_plugins({
+ success: onGotAvailablePlugins,
+ scope: this,
+ });
+ },
+
+ updatePluginsGrid: function() {
+ var plugins = [];
+ Ext.each(
+ this.availablePlugins,
+ function(plugin) {
+ if (this.enabledPlugins.indexOf(plugin) > -1) {
+ plugins.push([true, plugin]);
+ } else {
+ plugins.push([false, plugin]);
+ }
+ },
+ this
+ );
+ this.list.getStore().loadData(plugins);
+ },
+
+ onNodeClick: function(dv, index, node, e) {
+ var el = new Ext.Element(e.target);
+ if (el.getAttribute('rel') != 'chkbox') return;
+
+ var r = dv.getStore().getAt(index);
+ if (r.get('plugin') == 'WebUi') return;
+ r.set('enabled', !r.get('enabled'));
+ r.commit();
+ if (r.get('enabled')) {
+ this.enablePlugin(r.get('plugin'));
+ } else {
+ this.disablePlugin(r.get('plugin'));
+ }
+ },
+
+ onFindMorePlugins: function() {
+ window.open('http://dev.deluge-torrent.org/wiki/Plugins');
+ },
+
+ onGotPlugins: function() {
+ this.setInfo();
+ this.updatePluginsGrid();
+ },
+
+ onGotPluginInfo: function(info) {
+ var values = {
+ author: info['Author'],
+ version: info['Version'],
+ email: info['Author-email'],
+ homepage: info['Home-page'],
+ details: info['Description'],
+ };
+ this.setInfo(values);
+ delete info;
+ },
+
+ onInstallPluginWindow: function() {
+ if (!this.installWindow) {
+ this.installWindow = new Deluge.preferences.InstallPluginWindow();
+ this.installWindow.on('pluginadded', this.onPluginInstall, this);
+ }
+ this.installWindow.show();
+ },
+
+ onPluginEnabled: function(pluginName) {
+ var index = this.list.getStore().find('plugin', pluginName);
+ if (index == -1) return;
+ var plugin = this.list.getStore().getAt(index);
+ plugin.set('enabled', true);
+ plugin.commit();
+ },
+
+ onPluginDisabled: function(pluginName) {
+ var index = this.list.getStore().find('plugin', pluginName);
+ if (index == -1) return;
+ var plugin = this.list.getStore().getAt(index);
+ plugin.set('enabled', false);
+ plugin.commit();
+ },
+
+ onPluginInstall: function() {
+ this.updatePlugins();
+ },
+
+ onPluginSelect: function(dv, selections) {
+ if (selections.length == 0) return;
+ var r = dv.getRecords(selections)[0];
+ deluge.client.web.get_plugin_info(r.get('plugin'), {
+ success: this.onGotPluginInfo,
+ scope: this,
+ });
+ },
+
+ onPreferencesShow: function() {
+ this.updatePlugins();
+ },
+
+ onPluginInfoRender: function(ct, position) {
+ this.setInfo();
+ },
+});
+/**
+ * Deluge.preferences.PreferencesWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+PreferencesRecord = Ext.data.Record.create([{ name: 'name', type: 'string' }]);
+
+/**
+ * @class Deluge.preferences.PreferencesWindow
+ * @extends Ext.Window
+ */
+Deluge.preferences.PreferencesWindow = Ext.extend(Ext.Window, {
+ /**
+ * @property {String} currentPage The currently selected page.
+ */
+ currentPage: null,
+
+ title: _('Preferences'),
+ layout: 'border',
+ width: 485,
+ height: 500,
+ border: false,
+ constrainHeader: true,
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ closable: true,
+ iconCls: 'x-deluge-preferences',
+ plain: true,
+ resizable: false,
+
+ pages: {},
+
+ initComponent: function() {
+ Deluge.preferences.PreferencesWindow.superclass.initComponent.call(
+ this
+ );
+
+ this.list = new Ext.list.ListView({
+ store: new Ext.data.Store(),
+ columns: [
+ {
+ id: 'name',
+ renderer: fplain,
+ dataIndex: 'name',
+ },
+ ],
+ singleSelect: true,
+ listeners: {
+ selectionchange: {
+ fn: this.onPageSelect,
+ scope: this,
+ },
+ },
+ hideHeaders: true,
+ autoExpandColumn: 'name',
+ deferredRender: false,
+ autoScroll: true,
+ collapsible: true,
+ });
+ this.add({
+ region: 'west',
+ items: [this.list],
+ width: 120,
+ margins: '0 5 0 0',
+ cmargins: '0 5 0 0',
+ });
+
+ this.configPanel = this.add({
+ type: 'container',
+ autoDestroy: false,
+ region: 'center',
+ layout: 'card',
+ layoutConfig: {
+ deferredRender: true,
+ },
+ autoScroll: true,
+ width: 300,
+ });
+
+ this.addButton(_('Close'), this.onClose, this);
+ this.addButton(_('Apply'), this.onApply, this);
+ this.addButton(_('OK'), this.onOk, this);
+
+ this.optionsManager = new Deluge.OptionsManager();
+ this.on('afterrender', this.onAfterRender, this);
+ this.on('show', this.onShow, this);
+
+ this.initPages();
+ },
+
+ initPages: function() {
+ deluge.preferences = this;
+ this.addPage(new Deluge.preferences.Downloads());
+ this.addPage(new Deluge.preferences.Network());
+ this.addPage(new Deluge.preferences.Encryption());
+ this.addPage(new Deluge.preferences.Bandwidth());
+ this.addPage(new Deluge.preferences.Interface());
+ this.addPage(new Deluge.preferences.Other());
+ this.addPage(new Deluge.preferences.Daemon());
+ this.addPage(new Deluge.preferences.Queue());
+ this.addPage(new Deluge.preferences.Proxy());
+ this.addPage(new Deluge.preferences.Cache());
+ this.addPage(new Deluge.preferences.Plugins());
+ },
+
+ onApply: function(e) {
+ var changed = this.optionsManager.getDirty();
+ if (!Ext.isObjectEmpty(changed)) {
+ // Workaround for only displaying single listen port but still pass array to core.
+ if ('listen_ports' in changed) {
+ changed.listen_ports = [
+ changed.listen_ports,
+ changed.listen_ports,
+ ];
+ }
+ deluge.client.core.set_config(changed, {
+ success: this.onSetConfig,
+ scope: this,
+ });
+ }
+
+ for (var page in this.pages) {
+ if (this.pages[page].onApply) this.pages[page].onApply();
+ }
+ },
+
+ /**
+ * Return the options manager for the preferences window.
+ * @returns {Deluge.OptionsManager} the options manager
+ */
+ getOptionsManager: function() {
+ return this.optionsManager;
+ },
+
+ /**
+ * Adds a page to the preferences window.
+ * @param {Mixed} page
+ */
+ addPage: function(page) {
+ var store = this.list.getStore();
+ var name = page.title;
+ store.add([new PreferencesRecord({ name: name })]);
+ page['bodyStyle'] = 'padding: 5px';
+ page.preferences = this;
+ this.pages[name] = this.configPanel.add(page);
+ this.pages[name].index = -1;
+ return this.pages[name];
+ },
+
+ /**
+ * Removes a preferences page from the window.
+ * @param {mixed} name
+ */
+ removePage: function(page) {
+ var name = page.title;
+ var store = this.list.getStore();
+ store.removeAt(store.find('name', name));
+ this.configPanel.remove(page);
+ delete this.pages[page.title];
+ },
+
+ /**
+ * Select which preferences page is displayed.
+ * @param {String} page The page name to change to
+ */
+ selectPage: function(page) {
+ if (this.pages[page].index < 0) {
+ this.pages[page].index = this.configPanel.items.indexOf(
+ this.pages[page]
+ );
+ }
+ this.list.select(this.pages[page].index);
+ },
+
+ // private
+ doSelectPage: function(page) {
+ if (this.pages[page].index < 0) {
+ this.pages[page].index = this.configPanel.items.indexOf(
+ this.pages[page]
+ );
+ }
+ this.configPanel.getLayout().setActiveItem(this.pages[page].index);
+ this.currentPage = page;
+ },
+
+ // private
+ onGotConfig: function(config) {
+ this.getOptionsManager().set(config);
+ },
+
+ // private
+ onPageSelect: function(list, selections) {
+ var r = list.getRecord(selections[0]);
+ this.doSelectPage(r.get('name'));
+ },
+
+ // private
+ onSetConfig: function() {
+ this.getOptionsManager().commit();
+ },
+
+ // private
+ onAfterRender: function() {
+ if (!this.list.getSelectionCount()) {
+ this.list.select(0);
+ }
+ this.configPanel.getLayout().setActiveItem(0);
+ },
+
+ // private
+ onShow: function() {
+ if (!deluge.client.core) return;
+ deluge.client.core.get_config({
+ success: this.onGotConfig,
+ scope: this,
+ });
+ },
+
+ // private
+ onClose: function() {
+ this.hide();
+ },
+
+ // private
+ onOk: function() {
+ var changed = this.optionsManager.getDirty();
+ if (!Ext.isObjectEmpty(changed)) {
+ deluge.client.core.set_config(changed, {
+ success: this.onSetConfig,
+ scope: this,
+ });
+ }
+
+ for (var page in this.pages) {
+ if (this.pages[page].onOk) this.pages[page].onOk();
+ }
+
+ this.hide();
+ },
+});
+/**
+ * Deluge.preferences.ProxyField.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.ProxyField
+ * @extends Ext.form.FieldSet
+ */
+Deluge.preferences.ProxyField = Ext.extend(Ext.form.FieldSet, {
+ border: false,
+ autoHeight: true,
+ labelWidth: 70,
+
+ initComponent: function() {
+ Deluge.preferences.ProxyField.superclass.initComponent.call(this);
+ this.proxyType = this.add({
+ xtype: 'combo',
+ fieldLabel: _('Type:'),
+ labelSeparator: '',
+ name: 'proxytype',
+ mode: 'local',
+ width: 150,
+ store: new Ext.data.ArrayStore({
+ fields: ['id', 'text'],
+ data: [
+ [0, _('None')],
+ [1, _('Socks4')],
+ [2, _('Socks5')],
+ [3, _('Socks5 Auth')],
+ [4, _('HTTP')],
+ [5, _('HTTP Auth')],
+ [6, _('I2P')],
+ ],
+ }),
+ editable: false,
+ triggerAction: 'all',
+ valueField: 'id',
+ displayField: 'text',
+ });
+ this.proxyType.on('change', this.onFieldChange, this);
+ this.proxyType.on('select', this.onTypeSelect, this);
+
+ this.hostname = this.add({
+ xtype: 'textfield',
+ name: 'hostname',
+ fieldLabel: _('Host:'),
+ labelSeparator: '',
+ width: 220,
+ });
+ this.hostname.on('change', this.onFieldChange, this);
+
+ this.port = this.add({
+ xtype: 'spinnerfield',
+ name: 'port',
+ fieldLabel: _('Port:'),
+ labelSeparator: '',
+ width: 80,
+ decimalPrecision: 0,
+ minValue: 0,
+ maxValue: 65535,
+ });
+ this.port.on('change', this.onFieldChange, this);
+
+ this.username = this.add({
+ xtype: 'textfield',
+ name: 'username',
+ fieldLabel: _('Username:'),
+ labelSeparator: '',
+ width: 220,
+ });
+ this.username.on('change', this.onFieldChange, this);
+
+ this.password = this.add({
+ xtype: 'textfield',
+ name: 'password',
+ fieldLabel: _('Password:'),
+ labelSeparator: '',
+ inputType: 'password',
+ width: 220,
+ });
+ this.password.on('change', this.onFieldChange, this);
+
+ this.proxy_host_resolve = this.add({
+ xtype: 'checkbox',
+ name: 'proxy_host_resolve',
+ fieldLabel: '',
+ boxLabel: _('Proxy Hostnames'),
+ width: 220,
+ });
+ this.proxy_host_resolve.on('change', this.onFieldChange, this);
+
+ this.proxy_peer_conn = this.add({
+ xtype: 'checkbox',
+ name: 'proxy_peer_conn',
+ fieldLabel: '',
+ boxLabel: _('Proxy Peers'),
+ width: 220,
+ });
+ this.proxy_peer_conn.on('change', this.onFieldChange, this);
+
+ this.proxy_tracker_conn = this.add({
+ xtype: 'checkbox',
+ name: 'proxy_tracker_conn',
+ fieldLabel: '',
+ boxLabel: _('Proxy Trackers'),
+ width: 220,
+ });
+ this.proxy_tracker_conn.on('change', this.onFieldChange, this);
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Force Proxy'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ style: 'padding-left: 0px; margin-top: 10px',
+ });
+
+ this.force_proxy = fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ height: 20,
+ name: 'force_proxy',
+ boxLabel: _('Force Use of Proxy'),
+ });
+ this.force_proxy.on('change', this.onFieldChange, this);
+
+ this.anonymous_mode = fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ height: 20,
+ name: 'anonymous_mode',
+ boxLabel: _('Hide Client Identity'),
+ });
+ this.anonymous_mode.on('change', this.onFieldChange, this);
+
+ this.setting = false;
+ },
+
+ getName: function() {
+ return this.initialConfig.name;
+ },
+
+ getValue: function() {
+ return {
+ type: this.proxyType.getValue(),
+ hostname: this.hostname.getValue(),
+ port: Number(this.port.getValue()),
+ username: this.username.getValue(),
+ password: this.password.getValue(),
+ proxy_hostnames: this.proxy_host_resolve.getValue(),
+ proxy_peer_connections: this.proxy_peer_conn.getValue(),
+ proxy_tracker_connections: this.proxy_tracker_conn.getValue(),
+ force_proxy: this.force_proxy.getValue(),
+ anonymous_mode: this.anonymous_mode.getValue(),
+ };
+ },
+
+ // Set the values of the proxies
+ setValue: function(value) {
+ this.setting = true;
+ this.proxyType.setValue(value['type']);
+ var index = this.proxyType.getStore().find('id', value['type']);
+ var record = this.proxyType.getStore().getAt(index);
+
+ this.hostname.setValue(value['hostname']);
+ this.port.setValue(value['port']);
+ this.username.setValue(value['username']);
+ this.password.setValue(value['password']);
+ this.proxy_host_resolve.setValue(value['proxy_hostnames']);
+ this.proxy_peer_conn.setValue(value['proxy_peer_connections']);
+ this.proxy_tracker_conn.setValue(value['proxy_tracker_connections']);
+ this.force_proxy.setValue(value['force_proxy']);
+ this.anonymous_mode.setValue(value['anonymous_mode']);
+
+ this.onTypeSelect(this.type, record, index);
+ this.setting = false;
+ },
+
+ onFieldChange: function(field, newValue, oldValue) {
+ if (this.setting) return;
+ var newValues = this.getValue();
+ var oldValues = Ext.apply({}, newValues);
+ oldValues[field.getName()] = oldValue;
+
+ this.fireEvent('change', this, newValues, oldValues);
+ },
+
+ onTypeSelect: function(combo, record, index) {
+ var typeId = record.get('id');
+ if (typeId > 0) {
+ this.hostname.show();
+ this.port.show();
+ this.proxy_peer_conn.show();
+ this.proxy_tracker_conn.show();
+ if (typeId > 1 && typeId < 6) {
+ this.proxy_host_resolve.show();
+ } else {
+ this.proxy_host_resolve.hide();
+ }
+ } else {
+ this.hostname.hide();
+ this.port.hide();
+ this.proxy_host_resolve.hide();
+ this.proxy_peer_conn.hide();
+ this.proxy_tracker_conn.hide();
+ }
+
+ if (typeId == 3 || typeId == 5) {
+ this.username.show();
+ this.password.show();
+ } else {
+ this.username.hide();
+ this.password.hide();
+ }
+ },
+});
+/**
+ * Deluge.preferences.ProxyPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Proxy
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Proxy = Ext.extend(Ext.form.FormPanel, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ border: false,
+ title: _('Proxy'),
+ header: false,
+ layout: 'form',
+ autoScroll: true,
+ },
+ config
+ );
+ Deluge.preferences.Proxy.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.preferences.Proxy.superclass.initComponent.call(this);
+ this.proxy = this.add(
+ new Deluge.preferences.ProxyField({
+ title: _('Proxy'),
+ name: 'proxy',
+ })
+ );
+ this.proxy.on('change', this.onProxyChange, this);
+ deluge.preferences.getOptionsManager().bind('proxy', this.proxy);
+ },
+
+ getValue: function() {
+ return {
+ proxy: this.proxy.getValue(),
+ };
+ },
+
+ setValue: function(value) {
+ for (var proxy in value) {
+ this[proxy].setValue(value[proxy]);
+ }
+ },
+
+ onProxyChange: function(field, newValue, oldValue) {
+ var newValues = this.getValue();
+ var oldValues = Ext.apply({}, newValues);
+ oldValues[field.getName()] = oldValue;
+
+ this.fireEvent('change', this, newValues, oldValues);
+ },
+});
+/**
+ * Deluge.preferences.QueuePage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Queue
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Queue = Ext.extend(Ext.form.FormPanel, {
+ border: false,
+ title: _('Queue'),
+ header: false,
+ layout: 'form',
+
+ initComponent: function() {
+ Deluge.preferences.Queue.superclass.initComponent.call(this);
+
+ var om = deluge.preferences.getOptionsManager();
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('New Torrents'),
+ style: 'padding-top: 5px; margin-bottom: 0px;',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ om.bind(
+ 'queue_new_to_top',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ height: 22,
+ boxLabel: _('Queue to top'),
+ name: 'queue_new_to_top',
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Active Torrents'),
+ autoHeight: true,
+ labelWidth: 150,
+ defaultType: 'spinnerfield',
+ style: 'padding-top: 5px; margin-bottom: 0px',
+ });
+ om.bind(
+ 'max_active_limit',
+ fieldset.add({
+ fieldLabel: _('Total:'),
+ labelSeparator: '',
+ name: 'max_active_limit',
+ value: 8,
+ width: 80,
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ })
+ );
+ om.bind(
+ 'max_active_downloading',
+ fieldset.add({
+ fieldLabel: _('Downloading:'),
+ labelSeparator: '',
+ name: 'max_active_downloading',
+ value: 3,
+ width: 80,
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ })
+ );
+ om.bind(
+ 'max_active_seeding',
+ fieldset.add({
+ fieldLabel: _('Seeding:'),
+ labelSeparator: '',
+ name: 'max_active_seeding',
+ value: 5,
+ width: 80,
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ })
+ );
+ om.bind(
+ 'dont_count_slow_torrents',
+ fieldset.add({
+ xtype: 'checkbox',
+ name: 'dont_count_slow_torrents',
+ height: 22,
+ hideLabel: true,
+ boxLabel: _('Ignore slow torrents'),
+ })
+ );
+ om.bind(
+ 'auto_manage_prefer_seeds',
+ fieldset.add({
+ xtype: 'checkbox',
+ name: 'auto_manage_prefer_seeds',
+ hideLabel: true,
+ boxLabel: _('Prefer seeding torrents'),
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Seeding Rotation'),
+ autoHeight: true,
+ labelWidth: 150,
+ defaultType: 'spinnerfield',
+ style: 'padding-top: 5px; margin-bottom: 0px',
+ });
+ om.bind(
+ 'share_ratio_limit',
+ fieldset.add({
+ fieldLabel: _('Share Ratio:'),
+ labelSeparator: '',
+ name: 'share_ratio_limit',
+ value: 8,
+ width: 80,
+ incrementValue: 0.1,
+ minValue: -1,
+ maxValue: 99999,
+ alternateIncrementValue: 1,
+ decimalPrecision: 2,
+ })
+ );
+ om.bind(
+ 'seed_time_ratio_limit',
+ fieldset.add({
+ fieldLabel: _('Time Ratio:'),
+ labelSeparator: '',
+ name: 'seed_time_ratio_limit',
+ value: 3,
+ width: 80,
+ incrementValue: 0.1,
+ minValue: -1,
+ maxValue: 99999,
+ alternateIncrementValue: 1,
+ decimalPrecision: 2,
+ })
+ );
+ om.bind(
+ 'seed_time_limit',
+ fieldset.add({
+ fieldLabel: _('Time (m):'),
+ labelSeparator: '',
+ name: 'seed_time_limit',
+ value: 5,
+ width: 80,
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ autoHeight: true,
+ style: 'padding-top: 5px; margin-bottom: 0px',
+ title: _('Share Ratio Reached'),
+
+ layout: 'table',
+ layoutConfig: { columns: 2 },
+ labelWidth: 0,
+ defaultType: 'checkbox',
+
+ defaults: {
+ fieldLabel: '',
+ labelSeparator: '',
+ },
+ });
+ this.stopAtRatio = fieldset.add({
+ name: 'stop_seed_at_ratio',
+ boxLabel: _('Share Ratio:'),
+ });
+ this.stopAtRatio.on('check', this.onStopRatioCheck, this);
+ om.bind('stop_seed_at_ratio', this.stopAtRatio);
+
+ this.stopRatio = fieldset.add({
+ xtype: 'spinnerfield',
+ name: 'stop_seed_ratio',
+ ctCls: 'x-deluge-indent-checkbox',
+ disabled: true,
+ value: '2.0',
+ width: 60,
+ incrementValue: 0.1,
+ minValue: -1,
+ maxValue: 99999,
+ alternateIncrementValue: 1,
+ decimalPrecision: 2,
+ });
+ om.bind('stop_seed_ratio', this.stopRatio);
+
+ this.removeAtRatio = fieldset.add({
+ xtype: 'radiogroup',
+ columns: 1,
+ colspan: 2,
+ disabled: true,
+ style: 'margin-left: 10px',
+ items: [
+ {
+ boxLabel: _('Pause torrent'),
+ name: 'at_ratio',
+ inputValue: false,
+ checked: true,
+ },
+ {
+ boxLabel: _('Remove torrent'),
+ name: 'at_ratio',
+ inputValue: true,
+ },
+ ],
+ });
+ om.bind('remove_seed_at_ratio', this.removeAtRatio);
+ },
+
+ onStopRatioCheck: function(e, checked) {
+ this.stopRatio.setDisabled(!checked);
+ this.removeAtRatio.setDisabled(!checked);
+ },
+});
+/**
+ * Deluge.StatusbarMenu.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * Menu that handles setting the statusbar limits correctly.
+ * @class Deluge.StatusbarMenu
+ * @extends Ext.menu.Menu
+ */
+Deluge.StatusbarMenu = Ext.extend(Ext.menu.Menu, {
+ initComponent: function() {
+ Deluge.StatusbarMenu.superclass.initComponent.call(this);
+ this.otherWin = new Deluge.OtherLimitWindow(
+ this.initialConfig.otherWin || {}
+ );
+
+ this.items.each(function(item) {
+ if (item.getXType() != 'menucheckitem') return;
+ if (item.value == 'other') {
+ item.on('click', this.onOtherClicked, this);
+ } else {
+ item.on('checkchange', this.onLimitChanged, this);
+ }
+ }, this);
+ },
+
+ setValue: function(value) {
+ var beenSet = false;
+ // set the new value
+ this.value = value = value == 0 ? -1 : value;
+
+ var other = null;
+ // uncheck all items
+ this.items.each(function(item) {
+ if (item.setChecked) {
+ item.suspendEvents();
+ if (item.value == value) {
+ item.setChecked(true);
+ beenSet = true;
+ } else {
+ item.setChecked(false);
+ }
+ item.resumeEvents();
+ }
+
+ if (item.value == 'other') other = item;
+ });
+
+ if (beenSet) return;
+
+ other.suspendEvents();
+ other.setChecked(true);
+ other.resumeEvents();
+ },
+
+ onLimitChanged: function(item, checked) {
+ if (!checked || item.value == 'other') return; // We do not care about unchecked or other.
+ var config = {};
+ config[item.group] = item.value;
+ deluge.client.core.set_config(config, {
+ success: function() {
+ deluge.ui.update();
+ },
+ });
+ },
+
+ onOtherClicked: function(item, e) {
+ this.otherWin.group = item.group;
+ this.otherWin.setValue(this.value);
+ this.otherWin.show();
+ },
+});
+/**
+ * Deluge.OptionsManager.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge');
+
+/**
+ * @class Deluge.OptionsManager
+ * @extends Ext.util.Observable
+ * A class that can be used to manage options throughout the ui.
+ * @constructor
+ * Creates a new OptionsManager
+ * @param {Object} config Configuration options
+ */
+Deluge.OptionsManager = Ext.extend(Ext.util.Observable, {
+ constructor: function(config) {
+ config = config || {};
+ this.binds = {};
+ this.changed = {};
+ this.options = (config && config['options']) || {};
+ this.focused = null;
+
+ this.addEvents({
+ /**
+ * @event add
+ * Fires when an option is added
+ */
+ add: true,
+
+ /**
+ * @event changed
+ * Fires when an option is changed
+ * @param {String} option The changed option
+ * @param {Mixed} value The options new value
+ * @param {Mixed} oldValue The options old value
+ */
+ changed: true,
+
+ /**
+ * @event reset
+ * Fires when the options are reset
+ */
+ reset: true,
+ });
+ this.on('changed', this.onChange, this);
+
+ Deluge.OptionsManager.superclass.constructor.call(this);
+ },
+
+ /**
+ * Add a set of default options and values to the options manager
+ * @param {Object} options The default options.
+ */
+ addOptions: function(options) {
+ this.options = Ext.applyIf(this.options, options);
+ },
+
+ /**
+ * Binds a form field to the specified option.
+ * @param {String} option
+ * @param {Ext.form.Field} field
+ */
+ bind: function(option, field) {
+ this.binds[option] = this.binds[option] || [];
+ this.binds[option].push(field);
+ field._doption = option;
+
+ field.on('focus', this.onFieldFocus, this);
+ field.on('blur', this.onFieldBlur, this);
+ field.on('change', this.onFieldChange, this);
+ field.on('check', this.onFieldChange, this);
+ field.on('spin', this.onFieldChange, this);
+ return field;
+ },
+
+ /**
+ * Changes all the changed values to be the default values
+ */
+ commit: function() {
+ this.options = Ext.apply(this.options, this.changed);
+ this.reset();
+ },
+
+ /**
+ * Converts the value so it matches the originals type
+ * @param {Mixed} oldValue The original value
+ * @param {Mixed} value The new value to convert
+ */
+ convertValueType: function(oldValue, value) {
+ if (Ext.type(oldValue) != Ext.type(value)) {
+ switch (Ext.type(oldValue)) {
+ case 'string':
+ value = String(value);
+ break;
+ case 'number':
+ value = Number(value);
+ break;
+ case 'boolean':
+ if (Ext.type(value) == 'string') {
+ value = value.toLowerCase();
+ value =
+ value == 'true' || value == '1' || value == 'on'
+ ? true
+ : false;
+ } else {
+ value = Boolean(value);
+ }
+ break;
+ }
+ }
+ return value;
+ },
+
+ /**
+ * Get the value for an option or options.
+ * @param {String} [option] A single option or an array of options to return.
+ * @returns {Object} the options value.
+ */
+ get: function() {
+ if (arguments.length == 1) {
+ var option = arguments[0];
+ return this.isDirty(option)
+ ? this.changed[option]
+ : this.options[option];
+ } else {
+ var options = {};
+ Ext.each(
+ arguments,
+ function(option) {
+ if (!this.has(option)) return;
+ options[option] = this.isDirty(option)
+ ? this.changed[option]
+ : this.options[option];
+ },
+ this
+ );
+ return options;
+ }
+ },
+
+ /**
+ * Get the default value for an option or options.
+ * @param {String|Array} [option] A single option or an array of options to return.
+ * @returns {Object} the value of the option
+ */
+ getDefault: function(option) {
+ return this.options[option];
+ },
+
+ /**
+ * Returns the dirty (changed) values.
+ * @returns {Object} the changed options
+ */
+ getDirty: function() {
+ return this.changed;
+ },
+
+ /**
+ * @param {String} [option] The option to check
+ * @returns {Boolean} true if the option has been changed from the default.
+ */
+ isDirty: function(option) {
+ return !Ext.isEmpty(this.changed[option]);
+ },
+
+ /**
+ * Check to see if an option exists in the options manager
+ * @param {String} option
+ * @returns {Boolean} true if the option exists, else false.
+ */
+ has: function(option) {
+ return this.options[option];
+ },
+
+ /**
+ * Reset the options back to the default values.
+ */
+ reset: function() {
+ this.changed = {};
+ },
+
+ /**
+ * Sets the value of specified option(s) for the passed in id.
+ * @param {String} option
+ * @param {Object} value The value for the option
+ */
+ set: function(option, value) {
+ if (option === undefined) {
+ return;
+ } else if (typeof option == 'object') {
+ var options = option;
+ this.options = Ext.apply(this.options, options);
+ for (var option in options) {
+ this.onChange(option, options[option]);
+ }
+ } else {
+ this.options[option] = value;
+ this.onChange(option, value);
+ }
+ },
+
+ /**
+ * Update the value for the specified option and id.
+ * @param {String/Object} option or options to update
+ * @param {Object} [value];
+ */
+ update: function(option, value) {
+ if (option === undefined) {
+ return;
+ } else if (value === undefined) {
+ for (var key in option) {
+ this.update(key, option[key]);
+ }
+ } else {
+ var defaultValue = this.getDefault(option);
+ value = this.convertValueType(defaultValue, value);
+
+ var oldValue = this.get(option);
+ if (oldValue == value) return;
+
+ if (defaultValue == value) {
+ if (this.isDirty(option)) delete this.changed[option];
+ this.fireEvent('changed', option, value, oldValue);
+ return;
+ }
+
+ this.changed[option] = value;
+ this.fireEvent('changed', option, value, oldValue);
+ }
+ },
+
+ /**
+ * Lets the option manager know when a field is blurred so if a value
+ * so value changing operations can continue on that field.
+ */
+ onFieldBlur: function(field, event) {
+ if (this.focused == field) {
+ this.focused = null;
+ }
+ },
+
+ /**
+ * Stops a form fields value from being blocked by the change functions
+ * @param {Ext.form.Field} field
+ * @private
+ */
+ onFieldChange: function(field, event) {
+ if (field.field) field = field.field; // fix for spinners
+ this.update(field._doption, field.getValue());
+ },
+
+ /**
+ * Lets the option manager know when a field is focused so if a value changing
+ * operation is performed it will not change the value of the field.
+ */
+ onFieldFocus: function(field, event) {
+ this.focused = field;
+ },
+
+ onChange: function(option, newValue, oldValue) {
+ // If we don't have a bind there's nothing to do.
+ if (Ext.isEmpty(this.binds[option])) return;
+ Ext.each(
+ this.binds[option],
+ function(bind) {
+ // The field is currently focused so we do not want to change it.
+ if (bind == this.focused) return;
+ // Set the form field to the new value.
+ bind.setValue(newValue);
+ },
+ this
+ );
+ },
+});
+/**
+ * Deluge.AboutWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.namespace('Deluge.about');
+
+/**
+ * @class Deluge.about.AboutWindow
+ * @extends Ext.Window
+ */
+Deluge.about.AboutWindow = Ext.extend(Ext.Window, {
+ id: 'AboutWindow',
+ title: _('About Deluge'),
+ height: 330,
+ width: 270,
+ iconCls: 'x-deluge-main-panel',
+ resizable: false,
+ plain: true,
+ layout: {
+ type: 'vbox',
+ align: 'center',
+ },
+ buttonAlign: 'center',
+
+ initComponent: function() {
+ Deluge.about.AboutWindow.superclass.initComponent.call(this);
+ this.addEvents({
+ build_ready: true,
+ });
+
+ var self = this;
+ var libtorrent = function() {
+ deluge.client.core.get_libtorrent_version({
+ success: function(lt_version) {
+ comment += '<br/>' + _('libtorrent:') + ' ' + lt_version;
+ Ext.getCmp('about_comment').setText(comment, false);
+ self.fireEvent('build_ready');
+ },
+ });
+ };
+
+ var client_version = deluge.version;
+
+ var comment =
+ _(
+ 'A peer-to-peer file sharing program\nutilizing the BitTorrent protocol.'
+ ).replace('\n', '<br/>') +
+ '<br/><br/>' +
+ _('Client:') +
+ ' ' +
+ client_version +
+ '<br/>';
+ deluge.client.web.connected({
+ success: function(connected) {
+ if (connected) {
+ deluge.client.daemon.get_version({
+ success: function(server_version) {
+ comment +=
+ _('Server:') + ' ' + server_version + '<br/>';
+ libtorrent();
+ },
+ });
+ } else {
+ this.fireEvent('build_ready');
+ }
+ },
+ failure: function() {
+ this.fireEvent('build_ready');
+ },
+ scope: this,
+ });
+
+ this.add([
+ {
+ xtype: 'box',
+ style: 'padding-top: 5px',
+ height: 80,
+ width: 240,
+ cls: 'x-deluge-logo',
+ hideLabel: true,
+ },
+ {
+ xtype: 'label',
+ style: 'padding-top: 10px; font-weight: bold; font-size: 16px;',
+ text: _('Deluge') + ' ' + client_version,
+ },
+ {
+ xtype: 'label',
+ id: 'about_comment',
+ style: 'padding-top: 10px; text-align:center; font-size: 12px;',
+ html: comment,
+ },
+ {
+ xtype: 'label',
+ style: 'padding-top: 10px; font-size: 10px;',
+ text: _('Copyright 2007-2018 Deluge Team'),
+ },
+ {
+ xtype: 'label',
+ style: 'padding-top: 5px; font-size: 12px;',
+ html:
+ '<a href="https://deluge-torrent.org" target="_blank">deluge-torrent.org</a>',
+ },
+ ]);
+ this.addButton(_('Close'), this.onCloseClick, this);
+ },
+
+ show: function() {
+ this.on('build_ready', function() {
+ Deluge.about.AboutWindow.superclass.show.call(this);
+ });
+ },
+
+ onCloseClick: function() {
+ this.close();
+ },
+});
+
+Ext.namespace('Deluge');
+
+Deluge.About = function() {
+ new Deluge.about.AboutWindow().show();
+};
+/**
+ * Deluge.AddConnectionWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.AddConnectionWindow
+ * @extends Ext.Window
+ */
+Deluge.AddConnectionWindow = Ext.extend(Ext.Window, {
+ title: _('Add Connection'),
+ iconCls: 'x-deluge-add-window-icon',
+
+ layout: 'fit',
+ width: 300,
+ height: 195,
+ constrainHeader: true,
+ bodyStyle: 'padding: 10px 5px;',
+ closeAction: 'hide',
+
+ initComponent: function() {
+ Deluge.AddConnectionWindow.superclass.initComponent.call(this);
+
+ this.addEvents('hostadded');
+
+ this.addButton(_('Close'), this.hide, this);
+ this.addButton(_('Add'), this.onAddClick, this);
+
+ this.on('hide', this.onHide, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ defaultType: 'textfield',
+ baseCls: 'x-plain',
+ labelWidth: 60,
+ items: [
+ {
+ fieldLabel: _('Host:'),
+ labelSeparator: '',
+ name: 'host',
+ anchor: '75%',
+ value: '',
+ },
+ {
+ xtype: 'spinnerfield',
+ fieldLabel: _('Port:'),
+ labelSeparator: '',
+ name: 'port',
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 65535,
+ },
+ value: '58846',
+ anchor: '40%',
+ },
+ {
+ fieldLabel: _('Username:'),
+ labelSeparator: '',
+ name: 'username',
+ anchor: '75%',
+ value: '',
+ },
+ {
+ fieldLabel: _('Password:'),
+ labelSeparator: '',
+ anchor: '75%',
+ name: 'password',
+ inputType: 'password',
+ value: '',
+ },
+ ],
+ });
+ },
+
+ onAddClick: function() {
+ var values = this.form.getForm().getValues();
+ deluge.client.web.add_host(
+ values.host,
+ Number(values.port),
+ values.username,
+ values.password,
+ {
+ success: function(result) {
+ if (!result[0]) {
+ Ext.MessageBox.show({
+ title: _('Error'),
+ msg: String.format(
+ _('Unable to add host: {0}'),
+ result[1]
+ ),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ } else {
+ this.fireEvent('hostadded');
+ }
+ this.hide();
+ },
+ scope: this,
+ }
+ );
+ },
+
+ onHide: function() {
+ this.form.getForm().reset();
+ },
+});
+/**
+ * Deluge.AddTrackerWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+// Custom VType validator for tracker urls
+var trackerUrlTest = /(((^https?)|(^udp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
+Ext.apply(Ext.form.VTypes, {
+ trackerUrl: function(val, field) {
+ return trackerUrlTest.test(val);
+ },
+ trackerUrlText: 'Not a valid tracker url',
+});
+
+/**
+ * @class Deluge.AddTrackerWindow
+ * @extends Ext.Window
+ */
+Deluge.AddTrackerWindow = Ext.extend(Ext.Window, {
+ title: _('Add Tracker'),
+ layout: 'fit',
+ width: 375,
+ height: 150,
+ plain: true,
+ closable: true,
+ resizable: false,
+ constrainHeader: true,
+ bodyStyle: 'padding: 5px',
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ iconCls: 'x-deluge-edit-trackers',
+
+ initComponent: function() {
+ Deluge.AddTrackerWindow.superclass.initComponent.call(this);
+
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+ this.addButton(_('Add'), this.onAddClick, this);
+ this.addEvents('add');
+
+ this.form = this.add({
+ xtype: 'form',
+ defaultType: 'textarea',
+ baseCls: 'x-plain',
+ labelWidth: 55,
+ items: [
+ {
+ fieldLabel: _('Trackers:'),
+ labelSeparator: '',
+ name: 'trackers',
+ anchor: '100%',
+ },
+ ],
+ });
+ },
+
+ onAddClick: function() {
+ var trackers = this.form
+ .getForm()
+ .findField('trackers')
+ .getValue();
+ trackers = trackers.split('\n');
+
+ var cleaned = [];
+ Ext.each(
+ trackers,
+ function(tracker) {
+ if (Ext.form.VTypes.trackerUrl(tracker)) {
+ cleaned.push(tracker);
+ }
+ },
+ this
+ );
+ this.fireEvent('add', cleaned);
+ this.hide();
+ this.form
+ .getForm()
+ .findField('trackers')
+ .setValue('');
+ },
+
+ onCancelClick: function() {
+ this.form
+ .getForm()
+ .findField('trackers')
+ .setValue('');
+ this.hide();
+ },
+});
+/**
+ * Deluge.Client.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Ext.ux.util');
+
+/**
+ * A class that connects to a json-rpc resource and adds the available
+ * methods as functions to the class instance.
+ * @class Ext.ux.util.RpcClient
+ * @namespace Ext.ux.util
+ */
+Ext.ux.util.RpcClient = Ext.extend(Ext.util.Observable, {
+ _components: [],
+
+ _methods: [],
+
+ _requests: {},
+
+ _url: null,
+
+ _optionKeys: ['scope', 'success', 'failure'],
+
+ /**
+ * @event connected
+ * Fires when the client has retrieved the list of methods from the server.
+ * @param {Ext.ux.util.RpcClient} this
+ */
+ constructor: function(config) {
+ Ext.ux.util.RpcClient.superclass.constructor.call(this, config);
+ this._url = config.url || null;
+ this._id = 0;
+
+ this.addEvents(
+ // raw events
+ 'connected',
+ 'error'
+ );
+ this.reloadMethods();
+ },
+
+ reloadMethods: function() {
+ this._execute('system.listMethods', {
+ success: this._setMethods,
+ scope: this,
+ });
+ },
+
+ _execute: function(method, options) {
+ options = options || {};
+ options.params = options.params || [];
+ options.id = this._id;
+
+ var request = Ext.encode({
+ method: method,
+ params: options.params,
+ id: options.id,
+ });
+ this._id++;
+
+ return Ext.Ajax.request({
+ url: this._url,
+ method: 'POST',
+ success: this._onSuccess,
+ failure: this._onFailure,
+ scope: this,
+ jsonData: request,
+ options: options,
+ });
+ },
+
+ _onFailure: function(response, requestOptions) {
+ var options = requestOptions.options;
+ errorObj = {
+ id: options.id,
+ result: null,
+ error: {
+ msg: 'HTTP: ' + response.status + ' ' + response.statusText,
+ code: 255,
+ },
+ };
+
+ this.fireEvent('error', errorObj, response, requestOptions);
+
+ if (Ext.type(options.failure) != 'function') return;
+ if (options.scope) {
+ options.failure.call(
+ options.scope,
+ errorObj,
+ response,
+ requestOptions
+ );
+ } else {
+ options.failure(errorObj, response, requestOptions);
+ }
+ },
+
+ _onSuccess: function(response, requestOptions) {
+ var responseObj = Ext.decode(response.responseText);
+ var options = requestOptions.options;
+ if (responseObj.error) {
+ this.fireEvent('error', responseObj, response, requestOptions);
+
+ if (Ext.type(options.failure) != 'function') return;
+ if (options.scope) {
+ options.failure.call(
+ options.scope,
+ responseObj,
+ response,
+ requestOptions
+ );
+ } else {
+ options.failure(responseObj, response, requestOptions);
+ }
+ } else {
+ if (Ext.type(options.success) != 'function') return;
+ if (options.scope) {
+ options.success.call(
+ options.scope,
+ responseObj.result,
+ responseObj,
+ response,
+ requestOptions
+ );
+ } else {
+ options.success(
+ responseObj.result,
+ responseObj,
+ response,
+ requestOptions
+ );
+ }
+ }
+ },
+
+ _parseArgs: function(args) {
+ var params = [];
+ Ext.each(args, function(arg) {
+ params.push(arg);
+ });
+
+ var options = params[params.length - 1];
+ if (Ext.type(options) == 'object') {
+ var keys = Ext.keys(options),
+ isOption = false;
+
+ Ext.each(this._optionKeys, function(key) {
+ if (keys.indexOf(key) > -1) isOption = true;
+ });
+
+ if (isOption) {
+ params.remove(options);
+ } else {
+ options = {};
+ }
+ } else {
+ options = {};
+ }
+ options.params = params;
+ return options;
+ },
+
+ _setMethods: function(methods) {
+ var components = {},
+ self = this;
+
+ Ext.each(methods, function(method) {
+ var parts = method.split('.');
+ var component = components[parts[0]] || {};
+
+ var fn = function() {
+ var options = self._parseArgs(arguments);
+ return self._execute(method, options);
+ };
+ component[parts[1]] = fn;
+ components[parts[0]] = component;
+ });
+
+ for (var name in components) {
+ self[name] = components[name];
+ }
+ Ext.each(
+ this._components,
+ function(component) {
+ if (!component in components) {
+ delete this[component];
+ }
+ },
+ this
+ );
+ this._components = Ext.keys(components);
+ this.fireEvent('connected', this);
+ },
+});
+/**
+ * Deluge.ConnectionManager.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Deluge.ConnectionManager = Ext.extend(Ext.Window, {
+ layout: 'fit',
+ width: 300,
+ height: 220,
+ bodyStyle: 'padding: 10px 5px;',
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ closable: true,
+ plain: true,
+ constrainHeader: true,
+ title: _('Connection Manager'),
+ iconCls: 'x-deluge-connect-window-icon',
+
+ initComponent: function() {
+ Deluge.ConnectionManager.superclass.initComponent.call(this);
+ this.on('hide', this.onHide, this);
+ this.on('show', this.onShow, this);
+
+ deluge.events.on('login', this.onLogin, this);
+ deluge.events.on('logout', this.onLogout, this);
+
+ this.addButton(_('Close'), this.onClose, this);
+ this.addButton(_('Connect'), this.onConnect, this);
+
+ this.list = new Ext.list.ListView({
+ store: new Ext.data.ArrayStore({
+ fields: [
+ { name: 'status', mapping: 4 },
+ { name: 'host', mapping: 1 },
+ { name: 'port', mapping: 2 },
+ { name: 'user', mapping: 3 },
+ { name: 'version', mapping: 5 },
+ ],
+ id: 0,
+ }),
+ columns: [
+ {
+ header: _('Status'),
+ width: 0.24,
+ sortable: true,
+ tpl: new Ext.XTemplate(
+ '<tpl if="status == \'Online\'">',
+ _('Online'),
+ '</tpl>',
+ '<tpl if="status == \'Offline\'">',
+ _('Offline'),
+ '</tpl>',
+ '<tpl if="status == \'Connected\'">',
+ _('Connected'),
+ '</tpl>'
+ ),
+ dataIndex: 'status',
+ },
+ {
+ id: 'host',
+ header: _('Host'),
+ width: 0.51,
+ sortable: true,
+ tpl: '{user}@{host}:{port}',
+ dataIndex: 'host',
+ },
+ {
+ header: _('Version'),
+ width: 0.25,
+ sortable: true,
+ tpl: '<tpl if="version">{version}</tpl>',
+ dataIndex: 'version',
+ },
+ ],
+ singleSelect: true,
+ listeners: {
+ selectionchange: { fn: this.onSelectionChanged, scope: this },
+ },
+ });
+
+ this.panel = this.add({
+ autoScroll: true,
+ items: [this.list],
+ bbar: new Ext.Toolbar({
+ buttons: [
+ {
+ id: 'cm-add',
+ cls: 'x-btn-text-icon',
+ text: _('Add'),
+ iconCls: 'icon-add',
+ handler: this.onAddClick,
+ scope: this,
+ },
+ {
+ id: 'cm-edit',
+ cls: 'x-btn-text-icon',
+ text: _('Edit'),
+ iconCls: 'icon-edit',
+ handler: this.onEditClick,
+ scope: this,
+ },
+ {
+ id: 'cm-remove',
+ cls: 'x-btn-text-icon',
+ text: _('Remove'),
+ iconCls: 'icon-remove',
+ handler: this.onRemoveClick,
+ disabled: true,
+ scope: this,
+ },
+ '->',
+ {
+ id: 'cm-stop',
+ cls: 'x-btn-text-icon',
+ text: _('Stop Daemon'),
+ iconCls: 'icon-error',
+ handler: this.onStopClick,
+ disabled: true,
+ scope: this,
+ },
+ ],
+ }),
+ });
+ this.update = this.update.createDelegate(this);
+ },
+
+ /**
+ * Check to see if the the web interface is currently connected
+ * to a Deluge Daemon and show the Connection Manager if not.
+ */
+ checkConnected: function() {
+ deluge.client.web.connected({
+ success: function(connected) {
+ if (connected) {
+ deluge.events.fire('connect');
+ } else {
+ this.show();
+ }
+ },
+ scope: this,
+ });
+ },
+
+ disconnect: function(show) {
+ deluge.events.fire('disconnect');
+ if (show) {
+ if (this.isVisible()) return;
+ this.show();
+ }
+ },
+
+ loadHosts: function() {
+ deluge.client.web.get_hosts({
+ success: this.onGetHosts,
+ scope: this,
+ });
+ },
+
+ update: function() {
+ this.list.getStore().each(function(r) {
+ deluge.client.web.get_host_status(r.id, {
+ success: this.onGetHostStatus,
+ scope: this,
+ });
+ }, this);
+ },
+
+ /**
+ * Updates the buttons in the Connection Manager UI according to the
+ * passed in records host state.
+ * @param {Ext.data.Record} record The hosts record to update the UI for
+ */
+ updateButtons: function(record) {
+ var button = this.buttons[1],
+ status = record.get('status');
+
+ // Update the Connect/Disconnect button
+ button.enable();
+ if (status.toLowerCase() == 'connected') {
+ button.setText(_('Disconnect'));
+ } else {
+ button.setText(_('Connect'));
+ if (status.toLowerCase() != 'online') button.disable();
+ }
+
+ // Update the Stop/Start Daemon button
+ if (
+ status.toLowerCase() == 'connected' ||
+ status.toLowerCase() == 'online'
+ ) {
+ this.stopHostButton.enable();
+ this.stopHostButton.setText(_('Stop Daemon'));
+ } else {
+ if (
+ record.get('host') == '127.0.0.1' ||
+ record.get('host') == 'localhost'
+ ) {
+ this.stopHostButton.enable();
+ this.stopHostButton.setText(_('Start Daemon'));
+ } else {
+ this.stopHostButton.disable();
+ }
+ }
+ },
+
+ // private
+ onAddClick: function(button, e) {
+ if (!this.addWindow) {
+ this.addWindow = new Deluge.AddConnectionWindow();
+ this.addWindow.on('hostadded', this.onHostChange, this);
+ }
+ this.addWindow.show();
+ },
+
+ // private
+ onEditClick: function(button, e) {
+ var connection = this.list.getSelectedRecords()[0];
+ if (!connection) return;
+
+ if (!this.editWindow) {
+ this.editWindow = new Deluge.EditConnectionWindow();
+ this.editWindow.on('hostedited', this.onHostChange, this);
+ }
+ this.editWindow.show(connection);
+ },
+
+ // private
+ onHostChange: function() {
+ this.loadHosts();
+ },
+
+ // private
+ onClose: function(e) {
+ this.hide();
+ },
+
+ // private
+ onConnect: function(e) {
+ var selected = this.list.getSelectedRecords()[0];
+ if (!selected) return;
+
+ var me = this;
+ var disconnect = function() {
+ deluge.client.web.disconnect({
+ success: function(result) {
+ this.update(this);
+ deluge.events.fire('disconnect');
+ },
+ scope: me,
+ });
+ };
+
+ if (selected.get('status').toLowerCase() == 'connected') {
+ disconnect();
+ } else {
+ if (
+ this.list
+ .getStore()
+ .find('status', 'Connected', 0, false, false) > -1
+ ) {
+ disconnect();
+ }
+
+ var id = selected.id;
+ deluge.client.web.connect(id, {
+ success: function(methods) {
+ deluge.client.reloadMethods();
+ deluge.client.on(
+ 'connected',
+ function(e) {
+ deluge.events.fire('connect');
+ },
+ this,
+ { single: true }
+ );
+ },
+ });
+ this.hide();
+ }
+ },
+
+ // private
+ onGetHosts: function(hosts) {
+ this.list.getStore().loadData(hosts);
+ Ext.each(
+ hosts,
+ function(host) {
+ deluge.client.web.get_host_status(host[0], {
+ success: this.onGetHostStatus,
+ scope: this,
+ });
+ },
+ this
+ );
+ },
+
+ // private
+ onGetHostStatus: function(host) {
+ var record = this.list.getStore().getById(host[0]);
+ record.set('status', host[1]);
+ record.set('version', host[2]);
+ record.commit();
+ var selected = this.list.getSelectedRecords()[0];
+ if (!selected) return;
+ if (selected == record) this.updateButtons(record);
+ },
+
+ // private
+ onHide: function() {
+ if (this.running) window.clearInterval(this.running);
+ },
+
+ // private
+ onLogin: function() {
+ if (deluge.config.first_login) {
+ Ext.MessageBox.confirm(
+ _('Change Default Password'),
+ _(
+ 'We recommend changing the default password.<br><br>Would you like to change it now?'
+ ),
+ function(res) {
+ this.checkConnected();
+ if (res == 'yes') {
+ deluge.preferences.show();
+ deluge.preferences.selectPage('Interface');
+ }
+ deluge.client.web.set_config({ first_login: false });
+ },
+ this
+ );
+ } else {
+ this.checkConnected();
+ }
+ },
+
+ // private
+ onLogout: function() {
+ this.disconnect();
+ if (!this.hidden && this.rendered) {
+ this.hide();
+ }
+ },
+
+ // private
+ onRemoveClick: function(button) {
+ var connection = this.list.getSelectedRecords()[0];
+ if (!connection) return;
+
+ deluge.client.web.remove_host(connection.id, {
+ success: function(result) {
+ if (!result) {
+ Ext.MessageBox.show({
+ title: _('Error'),
+ msg: result[1],
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ } else {
+ this.list.getStore().remove(connection);
+ }
+ },
+ scope: this,
+ });
+ },
+
+ // private
+ onSelectionChanged: function(list, selections) {
+ if (selections[0]) {
+ this.editHostButton.enable();
+ this.removeHostButton.enable();
+ this.stopHostButton.enable();
+ this.stopHostButton.setText(_('Stop Daemon'));
+ this.updateButtons(this.list.getRecord(selections[0]));
+ } else {
+ this.editHostButton.disable();
+ this.removeHostButton.disable();
+ this.stopHostButton.disable();
+ }
+ },
+
+ // FIXME: Find out why this is being fired twice
+ // private
+ onShow: function() {
+ if (!this.addHostButton) {
+ var bbar = this.panel.getBottomToolbar();
+ this.addHostButton = bbar.items.get('cm-add');
+ this.editHostButton = bbar.items.get('cm-edit');
+ this.removeHostButton = bbar.items.get('cm-remove');
+ this.stopHostButton = bbar.items.get('cm-stop');
+ }
+ this.loadHosts();
+ if (this.running) return;
+ this.running = window.setInterval(this.update, 2000, this);
+ },
+
+ // private
+ onStopClick: function(button, e) {
+ var connection = this.list.getSelectedRecords()[0];
+ if (!connection) return;
+
+ if (connection.get('status') == 'Offline') {
+ // This means we need to start the daemon
+ deluge.client.web.start_daemon(connection.get('port'));
+ } else {
+ // This means we need to stop the daemon
+ deluge.client.web.stop_daemon(connection.id, {
+ success: function(result) {
+ if (!result[0]) {
+ Ext.MessageBox.show({
+ title: _('Error'),
+ msg: result[1],
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ }
+ },
+ });
+ }
+ },
+});
+/**
+ * Deluge.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+// Setup the state manager
+Ext.state.Manager.setProvider(
+ new Ext.state.CookieProvider({
+ /**
+ * By default, cookies will expire after 7 days. Provide
+ * an expiry date 10 years in the future to approximate
+ * a cookie that does not expire.
+ */
+ expires: new Date(
+ new Date().getTime() + 1000 * 60 * 60 * 24 * 365 * 10
+ ),
+ })
+);
+
+// Add some additional functions to ext and setup some of the
+// configurable parameters
+Ext.apply(Ext, {
+ escapeHTML: function(text) {
+ text = String(text)
+ .replace('<', '&lt;')
+ .replace('>', '&gt;');
+ return text.replace('&', '&amp;');
+ },
+
+ isObjectEmpty: function(obj) {
+ for (var i in obj) {
+ return false;
+ }
+ return true;
+ },
+
+ areObjectsEqual: function(obj1, obj2) {
+ var equal = true;
+ if (!obj1 || !obj2) return false;
+ for (var i in obj1) {
+ if (obj1[i] != obj2[i]) {
+ equal = false;
+ }
+ }
+ return equal;
+ },
+
+ keys: function(obj) {
+ var keys = [];
+ for (var i in obj)
+ if (obj.hasOwnProperty(i)) {
+ keys.push(i);
+ }
+ return keys;
+ },
+
+ values: function(obj) {
+ var values = [];
+ for (var i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ values.push(obj[i]);
+ }
+ }
+ return values;
+ },
+
+ splat: function(obj) {
+ var type = Ext.type(obj);
+ return type ? (type != 'array' ? [obj] : obj) : [];
+ },
+});
+Ext.getKeys = Ext.keys;
+Ext.BLANK_IMAGE_URL = deluge.config.base + 'images/s.gif';
+Ext.USE_NATIVE_JSON = true;
+
+// Create the Deluge namespace
+Ext.apply(Deluge, {
+ // private
+ pluginStore: {},
+
+ // private
+ progressTpl:
+ '<div class="x-progress-wrap x-progress-renderered">' +
+ '<div class="x-progress-inner">' +
+ '<div style="width: {2}px" class="x-progress-bar">' +
+ '<div style="z-index: 99; width: {3}px" class="x-progress-text">' +
+ '<div style="width: {1}px;">{0}</div>' +
+ '</div>' +
+ '</div>' +
+ '<div class="x-progress-text x-progress-text-back">' +
+ '<div style="width: {1}px;">{0}</div>' +
+ '</div>' +
+ '</div>' +
+ '</div>',
+
+ /**
+ * A method to create a progress bar that can be used by renderers
+ * to display a bar within a grid or tree.
+ * @param {Number} progress The bars progress
+ * @param {Number} width The width of the bar
+ * @param {String} text The text to display on the bar
+ * @param {Number} modified Amount to subtract from the width allowing for fixes
+ */
+ progressBar: function(progress, width, text, modifier) {
+ modifier = Ext.value(modifier, 10);
+ var progressWidth = ((width / 100.0) * progress).toFixed(0);
+ var barWidth = progressWidth - 1;
+ var textWidth =
+ progressWidth - modifier > 0 ? progressWidth - modifier : 0;
+ return String.format(
+ Deluge.progressTpl,
+ text,
+ width,
+ barWidth,
+ textWidth
+ );
+ },
+
+ /**
+ * Constructs a new instance of the specified plugin.
+ * @param {String} name The plugin name to create
+ */
+ createPlugin: function(name) {
+ return new Deluge.pluginStore[name]();
+ },
+
+ /**
+ * Check to see if a plugin has been registered.
+ * @param {String} name The plugin name to check
+ */
+ hasPlugin: function(name) {
+ return Deluge.pluginStore[name] ? true : false;
+ },
+
+ /**
+ * Register a plugin with the Deluge interface.
+ * @param {String} name The plugin name to register
+ * @param {Plugin} plugin The plugin to register
+ */
+ registerPlugin: function(name, plugin) {
+ Deluge.pluginStore[name] = plugin;
+ },
+});
+
+// Setup a space for plugins to insert themselves
+deluge.plugins = {};
+
+// Hinting for gettext_gen.py
+// _('Skip')
+// _('Low')
+// _('Normal')
+// _('High')
+// _('Mixed')
+FILE_PRIORITY = {
+ 0: 'Skip',
+ 1: 'Low',
+ 2: 'Low',
+ 3: 'Low',
+ 4: 'Normal',
+ 5: 'High',
+ 6: 'High',
+ 7: 'High',
+ 9: 'Mixed',
+ Skip: 0,
+ Low: 1,
+ Normal: 4,
+ High: 7,
+ Mixed: 9,
+};
+
+FILE_PRIORITY_CSS = {
+ 0: 'x-no-download',
+ 1: 'x-low-download',
+ 2: 'x-low-download',
+ 3: 'x-low-download',
+ 4: 'x-normal-download',
+ 5: 'x-high-download',
+ 6: 'x-high-download',
+ 7: 'x-high-download',
+ 9: 'x-mixed-download',
+};
+/**
+ * Deluge.EditConnectionWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.EditConnectionWindow
+ * @extends Ext.Window
+ */
+Deluge.EditConnectionWindow = Ext.extend(Ext.Window, {
+ title: _('Edit Connection'),
+ iconCls: 'x-deluge-add-window-icon',
+
+ layout: 'fit',
+ width: 300,
+ height: 195,
+ constrainHeader: true,
+ bodyStyle: 'padding: 10px 5px;',
+ closeAction: 'hide',
+
+ initComponent: function() {
+ Deluge.EditConnectionWindow.superclass.initComponent.call(this);
+
+ this.addEvents('hostedited');
+
+ this.addButton(_('Close'), this.hide, this);
+ this.addButton(_('Edit'), this.onEditClick, this);
+
+ this.on('hide', this.onHide, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ defaultType: 'textfield',
+ baseCls: 'x-plain',
+ labelWidth: 60,
+ items: [
+ {
+ fieldLabel: _('Host:'),
+ labelSeparator: '',
+ name: 'host',
+ anchor: '75%',
+ value: '',
+ },
+ {
+ xtype: 'spinnerfield',
+ fieldLabel: _('Port:'),
+ labelSeparator: '',
+ name: 'port',
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: 0,
+ maxValue: 65535,
+ },
+ anchor: '40%',
+ value: 58846,
+ },
+ {
+ fieldLabel: _('Username:'),
+ labelSeparator: '',
+ name: 'username',
+ anchor: '75%',
+ value: '',
+ },
+ {
+ fieldLabel: _('Password:'),
+ labelSeparator: '',
+ anchor: '75%',
+ name: 'password',
+ inputType: 'password',
+ value: '',
+ },
+ ],
+ });
+ },
+
+ show: function(connection) {
+ Deluge.EditConnectionWindow.superclass.show.call(this);
+
+ this.form
+ .getForm()
+ .findField('host')
+ .setValue(connection.get('host'));
+ this.form
+ .getForm()
+ .findField('port')
+ .setValue(connection.get('port'));
+ this.form
+ .getForm()
+ .findField('username')
+ .setValue(connection.get('user'));
+ this.host_id = connection.id;
+ },
+
+ onEditClick: function() {
+ var values = this.form.getForm().getValues();
+ deluge.client.web.edit_host(
+ this.host_id,
+ values.host,
+ Number(values.port),
+ values.username,
+ values.password,
+ {
+ success: function(result) {
+ if (!result) {
+ console.log(result);
+ Ext.MessageBox.show({
+ title: _('Error'),
+ msg: String.format(_('Unable to edit host')),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ } else {
+ this.fireEvent('hostedited');
+ }
+ this.hide();
+ },
+ scope: this,
+ }
+ );
+ },
+
+ onHide: function() {
+ this.form.getForm().reset();
+ },
+});
+/**
+ * Deluge.EditTrackerWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.EditTrackerWindow
+ * @extends Ext.Window
+ */
+Deluge.EditTrackerWindow = Ext.extend(Ext.Window, {
+ title: _('Edit Tracker'),
+ layout: 'fit',
+ width: 375,
+ height: 110,
+ plain: true,
+ closable: true,
+ resizable: false,
+ constrainHeader: true,
+ bodyStyle: 'padding: 5px',
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ iconCls: 'x-deluge-edit-trackers',
+
+ initComponent: function() {
+ Deluge.EditTrackerWindow.superclass.initComponent.call(this);
+
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+ this.addButton(_('Save'), this.onSaveClick, this);
+ this.on('hide', this.onHide, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ defaultType: 'textfield',
+ baseCls: 'x-plain',
+ labelWidth: 55,
+ items: [
+ {
+ fieldLabel: _('Tracker:'),
+ labelSeparator: '',
+ name: 'tracker',
+ anchor: '100%',
+ },
+ ],
+ });
+ },
+
+ show: function(record) {
+ Deluge.EditTrackerWindow.superclass.show.call(this);
+
+ this.record = record;
+ this.form
+ .getForm()
+ .findField('tracker')
+ .setValue(record.data['url']);
+ },
+
+ onCancelClick: function() {
+ this.hide();
+ },
+
+ onHide: function() {
+ this.form
+ .getForm()
+ .findField('tracker')
+ .setValue('');
+ },
+
+ onSaveClick: function() {
+ var url = this.form
+ .getForm()
+ .findField('tracker')
+ .getValue();
+ this.record.set('url', url);
+ this.record.commit();
+ this.hide();
+ },
+});
+/**
+ * Deluge.EditTrackers.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.EditTrackerWindow
+ * @extends Ext.Window
+ */
+Deluge.EditTrackersWindow = Ext.extend(Ext.Window, {
+ title: _('Edit Trackers'),
+ layout: 'fit',
+ width: 350,
+ height: 220,
+ plain: true,
+ closable: true,
+ resizable: true,
+ constrainHeader: true,
+
+ bodyStyle: 'padding: 5px',
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ iconCls: 'x-deluge-edit-trackers',
+
+ initComponent: function() {
+ Deluge.EditTrackersWindow.superclass.initComponent.call(this);
+
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+ this.addButton(_('OK'), this.onOkClick, this);
+ this.addEvents('save');
+
+ this.on('show', this.onShow, this);
+ this.on('save', this.onSave, this);
+
+ this.addWindow = new Deluge.AddTrackerWindow();
+ this.addWindow.on('add', this.onAddTrackers, this);
+ this.editWindow = new Deluge.EditTrackerWindow();
+
+ this.list = new Ext.list.ListView({
+ store: new Ext.data.JsonStore({
+ root: 'trackers',
+ fields: ['tier', 'url'],
+ }),
+ columns: [
+ {
+ header: _('Tier'),
+ width: 0.1,
+ dataIndex: 'tier',
+ },
+ {
+ header: _('Tracker'),
+ width: 0.9,
+ dataIndex: 'url',
+ },
+ ],
+ columnSort: {
+ sortClasses: ['', ''],
+ },
+ stripeRows: true,
+ singleSelect: true,
+ listeners: {
+ dblclick: { fn: this.onListNodeDblClicked, scope: this },
+ selectionchange: { fn: this.onSelect, scope: this },
+ },
+ });
+
+ this.panel = this.add({
+ items: [this.list],
+ autoScroll: true,
+ bbar: new Ext.Toolbar({
+ items: [
+ {
+ text: _('Up'),
+ iconCls: 'icon-up',
+ handler: this.onUpClick,
+ scope: this,
+ },
+ {
+ text: _('Down'),
+ iconCls: 'icon-down',
+ handler: this.onDownClick,
+ scope: this,
+ },
+ '->',
+ {
+ text: _('Add'),
+ iconCls: 'icon-add',
+ handler: this.onAddClick,
+ scope: this,
+ },
+ {
+ text: _('Edit'),
+ iconCls: 'icon-edit-trackers',
+ handler: this.onEditClick,
+ scope: this,
+ },
+ {
+ text: _('Remove'),
+ iconCls: 'icon-remove',
+ handler: this.onRemoveClick,
+ scope: this,
+ },
+ ],
+ }),
+ });
+ },
+
+ onAddClick: function() {
+ this.addWindow.show();
+ },
+
+ onAddTrackers: function(trackers) {
+ var store = this.list.getStore();
+ Ext.each(
+ trackers,
+ function(tracker) {
+ var duplicate = false,
+ heightestTier = -1;
+ store.each(function(record) {
+ if (record.get('tier') > heightestTier) {
+ heightestTier = record.get('tier');
+ }
+ if (tracker == record.get('tracker')) {
+ duplicate = true;
+ return false;
+ }
+ }, this);
+ if (duplicate) return;
+ store.add(
+ new store.recordType({
+ tier: heightestTier + 1,
+ url: tracker,
+ })
+ );
+ },
+ this
+ );
+ },
+
+ onCancelClick: function() {
+ this.hide();
+ },
+
+ onEditClick: function() {
+ var selected = this.list.getSelectedRecords()[0];
+ if (!selected) return;
+ this.editWindow.show(selected);
+ },
+
+ onHide: function() {
+ this.list.getStore().removeAll();
+ },
+
+ onListNodeDblClicked: function(list, index, node, e) {
+ this.editWindow.show(this.list.getRecord(node));
+ },
+
+ onOkClick: function() {
+ var trackers = [];
+ this.list.getStore().each(function(record) {
+ trackers.push({
+ tier: record.get('tier'),
+ url: record.get('url'),
+ });
+ }, this);
+
+ deluge.client.core.set_torrent_trackers(this.torrentId, trackers, {
+ failure: this.onSaveFail,
+ scope: this,
+ });
+
+ this.hide();
+ },
+
+ onRemoveClick: function() {
+ // Remove from the grid
+ var selected = this.list.getSelectedRecords()[0];
+ if (!selected) return;
+ this.list.getStore().remove(selected);
+ },
+
+ onRequestComplete: function(status) {
+ this.list.getStore().loadData(status);
+ this.list.getStore().sort('tier', 'ASC');
+ },
+
+ onSaveFail: function() {},
+
+ onSelect: function(list) {
+ if (list.getSelectionCount()) {
+ this.panel
+ .getBottomToolbar()
+ .items.get(4)
+ .enable();
+ }
+ },
+
+ onShow: function() {
+ this.panel
+ .getBottomToolbar()
+ .items.get(4)
+ .disable();
+ var r = deluge.torrents.getSelected();
+ this.torrentId = r.id;
+ deluge.client.core.get_torrent_status(r.id, ['trackers'], {
+ success: this.onRequestComplete,
+ scope: this,
+ });
+ },
+
+ onDownClick: function() {
+ var r = this.list.getSelectedRecords()[0];
+ if (!r) return;
+
+ r.set('tier', r.get('tier') + 1);
+ r.store.sort('tier', 'ASC');
+ r.store.commitChanges();
+
+ this.list.select(r.store.indexOf(r));
+ },
+
+ onUpClick: function() {
+ var r = this.list.getSelectedRecords()[0];
+ if (!r) return;
+
+ if (r.get('tier') == 0) return;
+ r.set('tier', r.get('tier') - 1);
+ r.store.sort('tier', 'ASC');
+ r.store.commitChanges();
+
+ this.list.select(r.store.indexOf(r));
+ },
+});
+/**
+ * Deluge.EventsManager.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * @class Deluge.EventsManager
+ * @extends Ext.util.Observable
+ * <p>Deluge.EventsManager is instantated as <tt>deluge.events</tt> and can be used by components of the UI to fire global events</p>
+ * Class for holding global events that occur within the UI.
+ */
+Deluge.EventsManager = Ext.extend(Ext.util.Observable, {
+ constructor: function() {
+ this.toRegister = [];
+ this.on('login', this.onLogin, this);
+ Deluge.EventsManager.superclass.constructor.call(this);
+ },
+
+ /**
+ * Append an event handler to this object.
+ */
+ addListener: function(eventName, fn, scope, o) {
+ this.addEvents(eventName);
+ if (/[A-Z]/.test(eventName.substring(0, 1))) {
+ if (!deluge.client) {
+ this.toRegister.push(eventName);
+ } else {
+ deluge.client.web.register_event_listener(eventName);
+ }
+ }
+ Deluge.EventsManager.superclass.addListener.call(
+ this,
+ eventName,
+ fn,
+ scope,
+ o
+ );
+ },
+
+ getEvents: function() {
+ deluge.client.web.get_events({
+ success: this.onGetEventsSuccess,
+ failure: this.onGetEventsFailure,
+ scope: this,
+ });
+ },
+
+ /**
+ * Starts the EventsManagerManager checking for events.
+ */
+ start: function() {
+ Ext.each(this.toRegister, function(eventName) {
+ deluge.client.web.register_event_listener(eventName);
+ });
+ this.running = true;
+ this.errorCount = 0;
+ this.getEvents();
+ },
+
+ /**
+ * Stops the EventsManagerManager checking for events.
+ */
+ stop: function() {
+ this.running = false;
+ },
+
+ // private
+ onLogin: function() {
+ this.start();
+ },
+
+ onGetEventsSuccess: function(events) {
+ if (!this.running) return;
+ if (events) {
+ Ext.each(
+ events,
+ function(event) {
+ var name = event[0],
+ args = event[1];
+ args.splice(0, 0, name);
+ this.fireEvent.apply(this, args);
+ },
+ this
+ );
+ }
+ this.getEvents();
+ },
+
+ // private
+ onGetEventsFailure: function(result, error) {
+ // the request timed out or we had a communication failure
+ if (!this.running) return;
+ if (!error.isTimeout && this.errorCount++ >= 3) {
+ this.stop();
+ return;
+ }
+ this.getEvents();
+ },
+});
+
+/**
+ * Appends an event handler to this object (shorthand for {@link #addListener})
+ * @method
+ */
+Deluge.EventsManager.prototype.on = Deluge.EventsManager.prototype.addListener;
+
+/**
+ * Fires the specified event with the passed parameters (minus the
+ * event name).
+ * @method
+ */
+Deluge.EventsManager.prototype.fire = Deluge.EventsManager.prototype.fireEvent;
+deluge.events = new Deluge.EventsManager();
+/**
+ * Deluge.FileBrowser.js
+ *
+ * Copyright (c) Damien Churchill 2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.namespace('Deluge');
+Deluge.FileBrowser = Ext.extend(Ext.Window, {
+ title: _('File Browser'),
+
+ width: 500,
+ height: 400,
+
+ initComponent: function() {
+ Deluge.FileBrowser.superclass.initComponent.call(this);
+
+ this.add({
+ xtype: 'toolbar',
+ items: [
+ {
+ text: _('Back'),
+ iconCls: 'icon-back',
+ },
+ {
+ text: _('Forward'),
+ iconCls: 'icon-forward',
+ },
+ {
+ text: _('Up'),
+ iconCls: 'icon-up',
+ },
+ {
+ text: _('Home'),
+ iconCls: 'icon-home',
+ },
+ ],
+ });
+ },
+});
+/**
+ * Deluge.FilterPanel.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.FilterPanel
+ * @extends Ext.list.ListView
+ */
+Deluge.FilterPanel = Ext.extend(Ext.Panel, {
+ autoScroll: true,
+
+ border: false,
+
+ show_zero: null,
+
+ initComponent: function() {
+ Deluge.FilterPanel.superclass.initComponent.call(this);
+ this.filterType = this.initialConfig.filter;
+ var title = '';
+ if (this.filterType == 'state') {
+ title = _('States');
+ } else if (this.filterType == 'tracker_host') {
+ title = _('Trackers');
+ } else if (this.filterType == 'owner') {
+ title = _('Owner');
+ } else if (this.filterType == 'label') {
+ title = _('Labels');
+ } else {
+ (title = this.filterType.replace('_', ' ')),
+ (parts = title.split(' ')),
+ (title = '');
+ Ext.each(parts, function(p) {
+ fl = p.substring(0, 1).toUpperCase();
+ title += fl + p.substring(1) + ' ';
+ });
+ }
+ this.setTitle(_(title));
+
+ if (Deluge.FilterPanel.templates[this.filterType]) {
+ var tpl = Deluge.FilterPanel.templates[this.filterType];
+ } else {
+ var tpl =
+ '<div class="x-deluge-filter x-deluge-{filter:lowercase}">{filter} ({count})</div>';
+ }
+
+ this.list = this.add({
+ xtype: 'listview',
+ singleSelect: true,
+ hideHeaders: true,
+ reserveScrollOffset: true,
+ store: new Ext.data.ArrayStore({
+ idIndex: 0,
+ fields: ['filter', 'count'],
+ }),
+ columns: [
+ {
+ id: 'filter',
+ sortable: false,
+ tpl: tpl,
+ dataIndex: 'filter',
+ },
+ ],
+ });
+ this.relayEvents(this.list, ['selectionchange']);
+ },
+
+ /**
+ * Return the currently selected filter state
+ * @returns {String} the current filter state
+ */
+ getState: function() {
+ if (!this.list.getSelectionCount()) return;
+
+ var state = this.list.getSelectedRecords()[0];
+ if (!state) return;
+ if (state.id == 'All') return;
+ return state.id;
+ },
+
+ /**
+ * Return the current states in the filter
+ */
+ getStates: function() {
+ return this.states;
+ },
+
+ /**
+ * Return the Store for the ListView of the FilterPanel
+ * @returns {Ext.data.Store} the ListView store
+ */
+ getStore: function() {
+ return this.list.getStore();
+ },
+
+ /**
+ * Update the states in the FilterPanel
+ */
+ updateStates: function(states) {
+ this.states = {};
+ Ext.each(
+ states,
+ function(state) {
+ this.states[state[0]] = state[1];
+ },
+ this
+ );
+
+ var show_zero =
+ this.show_zero == null
+ ? deluge.config.sidebar_show_zero
+ : this.show_zero;
+ if (!show_zero) {
+ var newStates = [];
+ Ext.each(states, function(state) {
+ if (state[1] > 0 || state[0] == 'All') {
+ newStates.push(state);
+ }
+ });
+ states = newStates;
+ }
+
+ var store = this.getStore();
+ var filters = {};
+ Ext.each(
+ states,
+ function(s, i) {
+ var record = store.getById(s[0]);
+ if (!record) {
+ record = new store.recordType({
+ filter: s[0],
+ count: s[1],
+ });
+ record.id = s[0];
+ store.insert(i, record);
+ }
+ record.beginEdit();
+ record.set('filter', _(s[0]));
+ record.set('count', s[1]);
+ record.endEdit();
+ filters[s[0]] = true;
+ },
+ this
+ );
+
+ store.each(function(record) {
+ if (filters[record.id]) return;
+ store.remove(record);
+ var selected = this.list.getSelectedRecords()[0];
+ if (!selected) return;
+ if (selected.id == record.id) {
+ this.list.select(0);
+ }
+ }, this);
+
+ store.commitChanges();
+
+ if (!this.list.getSelectionCount()) {
+ this.list.select(0);
+ }
+ },
+});
+
+Deluge.FilterPanel.templates = {
+ tracker_host:
+ '<div class="x-deluge-filter" style="background-image: url(' +
+ deluge.config.base +
+ 'tracker/{filter});">{filter} ({count})</div>',
+};
+/**
+ * Deluge.Formatters.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * A collection of functions for string formatting values.
+ * @class Deluge.Formatters
+ * @author Damien Churchill <damoxc@gmail.com>
+ * @version 1.3
+ * @singleton
+ */
+Deluge.Formatters = {
+ /**
+ * Formats a date string in the date representation of the current locale,
+ * based on the systems timezone.
+ *
+ * @param {Number} timestamp time in seconds since the Epoch.
+ * @return {String} a string in the date representation of the current locale
+ * or "" if seconds < 0.
+ */
+ date: function(timestamp) {
+ function zeroPad(num, count) {
+ var numZeropad = num + '';
+ while (numZeropad.length < count) {
+ numZeropad = '0' + numZeropad;
+ }
+ return numZeropad;
+ }
+ timestamp = timestamp * 1000;
+ var date = new Date(timestamp);
+ return String.format(
+ '{0}/{1}/{2} {3}:{4}:{5}',
+ zeroPad(date.getDate(), 2),
+ zeroPad(date.getMonth() + 1, 2),
+ date.getFullYear(),
+ zeroPad(date.getHours(), 2),
+ zeroPad(date.getMinutes(), 2),
+ zeroPad(date.getSeconds(), 2)
+ );
+ },
+
+ /**
+ * Formats the bytes value into a string with KiB, MiB or GiB units.
+ *
+ * @param {Number} bytes the filesize in bytes
+ * @param {Boolean} showZero pass in true to displays 0 values
+ * @return {String} formatted string with KiB, MiB or GiB units.
+ */
+ size: function(bytes, showZero) {
+ if (!bytes && !showZero) return '';
+ bytes = bytes / 1024.0;
+
+ if (bytes < 1024) {
+ return bytes.toFixed(1) + ' KiB';
+ } else {
+ bytes = bytes / 1024;
+ }
+
+ if (bytes < 1024) {
+ return bytes.toFixed(1) + ' MiB';
+ } else {
+ bytes = bytes / 1024;
+ }
+
+ return bytes.toFixed(1) + ' GiB';
+ },
+
+ /**
+ * Formats the bytes value into a string with K, M or G units.
+ *
+ * @param {Number} bytes the filesize in bytes
+ * @param {Boolean} showZero pass in true to displays 0 values
+ * @return {String} formatted string with K, M or G units.
+ */
+ sizeShort: function(bytes, showZero) {
+ if (!bytes && !showZero) return '';
+ bytes = bytes / 1024.0;
+
+ if (bytes < 1024) {
+ return bytes.toFixed(1) + ' K';
+ } else {
+ bytes = bytes / 1024;
+ }
+
+ if (bytes < 1024) {
+ return bytes.toFixed(1) + ' M';
+ } else {
+ bytes = bytes / 1024;
+ }
+
+ return bytes.toFixed(1) + ' G';
+ },
+
+ /**
+ * Formats a string to display a transfer speed utilizing {@link #size}
+ *
+ * @param {Number} bytes the number of bytes per second
+ * @param {Boolean} showZero pass in true to displays 0 values
+ * @return {String} formatted string with KiB, MiB or GiB units.
+ */
+ speed: function(bytes, showZero) {
+ return !bytes && !showZero ? '' : fsize(bytes, showZero) + '/s';
+ },
+
+ /**
+ * Formats a string to show time in a human readable form.
+ *
+ * @param {Number} time the number of seconds
+ * @return {String} a formatted time string. will return '' if seconds == 0
+ */
+ timeRemaining: function(time) {
+ if (time <= 0) {
+ return '&infin;';
+ }
+ time = time.toFixed(0);
+ if (time < 60) {
+ return time + 's';
+ } else {
+ time = time / 60;
+ }
+
+ if (time < 60) {
+ var minutes = Math.floor(time);
+ var seconds = Math.round(60 * (time - minutes));
+ if (seconds > 0) {
+ return minutes + 'm ' + seconds + 's';
+ } else {
+ return minutes + 'm';
+ }
+ } else {
+ time = time / 60;
+ }
+
+ if (time < 24) {
+ var hours = Math.floor(time);
+ var minutes = Math.round(60 * (time - hours));
+ if (minutes > 0) {
+ return hours + 'h ' + minutes + 'm';
+ } else {
+ return hours + 'h';
+ }
+ } else {
+ time = time / 24;
+ }
+
+ var days = Math.floor(time);
+ var hours = Math.round(24 * (time - days));
+ if (hours > 0) {
+ return days + 'd ' + hours + 'h';
+ } else {
+ return days + 'd';
+ }
+ },
+
+ /**
+ * Simply returns the value untouched, for when no formatting is required.
+ *
+ * @param {Mixed} value the value to be displayed
+ * @return the untouched value.
+ */
+ plain: function(value) {
+ return value;
+ },
+
+ cssClassEscape: function(value) {
+ return value.toLowerCase().replace('.', '_');
+ },
+};
+var fsize = Deluge.Formatters.size;
+var fsize_short = Deluge.Formatters.sizeShort;
+var fspeed = Deluge.Formatters.speed;
+var ftime = Deluge.Formatters.timeRemaining;
+var fdate = Deluge.Formatters.date;
+var fplain = Deluge.Formatters.plain;
+Ext.util.Format.cssClassEscape = Deluge.Formatters.cssClassEscape;
+/**
+ * Deluge.Keys.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * @description The torrent status keys that are commonly used around the UI.
+ * @class Deluge.Keys
+ * @singleton
+ */
+Deluge.Keys = {
+ /**
+ * Keys that are used within the torrent grid.
+ * <pre>['queue', 'name', 'total_wanted', 'state', 'progress', 'num_seeds',
+ * 'total_seeds', 'num_peers', 'total_peers', 'download_payload_rate',
+ * 'upload_payload_rate', 'eta', 'ratio', 'distributed_copies',
+ * 'is_auto_managed', 'time_added', 'tracker_host', 'download_location', 'last_seen_complete',
+ * 'total_done', 'total_uploaded', 'max_download_speed', 'max_upload_speed',
+ * 'seeds_peers_ratio', 'total_remaining', 'completed_time', 'time_since_transfer']</pre>
+ */
+ Grid: [
+ 'queue',
+ 'name',
+ 'total_wanted',
+ 'state',
+ 'progress',
+ 'num_seeds',
+ 'total_seeds',
+ 'num_peers',
+ 'total_peers',
+ 'download_payload_rate',
+ 'upload_payload_rate',
+ 'eta',
+ 'ratio',
+ 'distributed_copies',
+ 'is_auto_managed',
+ 'time_added',
+ 'tracker_host',
+ 'download_location',
+ 'last_seen_complete',
+ 'total_done',
+ 'total_uploaded',
+ 'max_download_speed',
+ 'max_upload_speed',
+ 'seeds_peers_ratio',
+ 'total_remaining',
+ 'completed_time',
+ 'time_since_transfer',
+ ],
+
+ /**
+ * Keys used in the status tab of the statistics panel.
+ * These get updated to include the keys in {@link #Grid}.
+ * <pre>['total_done', 'total_payload_download', 'total_uploaded',
+ * 'total_payload_upload', 'next_announce', 'tracker_status', 'num_pieces',
+ * 'piece_length', 'is_auto_managed', 'active_time', 'seeding_time', 'time_since_transfer',
+ * 'seed_rank', 'last_seen_complete', 'completed_time', 'owner', 'public', 'shared']</pre>
+ */
+ Status: [
+ 'total_done',
+ 'total_payload_download',
+ 'total_uploaded',
+ 'total_payload_upload',
+ 'next_announce',
+ 'tracker_status',
+ 'num_pieces',
+ 'piece_length',
+ 'is_auto_managed',
+ 'active_time',
+ 'seeding_time',
+ 'time_since_transfer',
+ 'seed_rank',
+ 'last_seen_complete',
+ 'completed_time',
+ 'owner',
+ 'public',
+ 'shared',
+ ],
+
+ /**
+ * Keys used in the files tab of the statistics panel.
+ * <pre>['files', 'file_progress', 'file_priorities']</pre>
+ */
+ Files: ['files', 'file_progress', 'file_priorities'],
+
+ /**
+ * Keys used in the peers tab of the statistics panel.
+ * <pre>['peers']</pre>
+ */
+ Peers: ['peers'],
+
+ /**
+ * Keys used in the details tab of the statistics panel.
+ */
+ Details: [
+ 'name',
+ 'download_location',
+ 'total_size',
+ 'num_files',
+ 'message',
+ 'tracker_host',
+ 'comment',
+ 'creator',
+ ],
+
+ /**
+ * Keys used in the options tab of the statistics panel.
+ * <pre>['max_download_speed', 'max_upload_speed', 'max_connections', 'max_upload_slots',
+ * 'is_auto_managed', 'stop_at_ratio', 'stop_ratio', 'remove_at_ratio', 'private',
+ * 'prioritize_first_last']</pre>
+ */
+ Options: [
+ 'max_download_speed',
+ 'max_upload_speed',
+ 'max_connections',
+ 'max_upload_slots',
+ 'is_auto_managed',
+ 'stop_at_ratio',
+ 'stop_ratio',
+ 'remove_at_ratio',
+ 'private',
+ 'prioritize_first_last',
+ 'move_completed',
+ 'move_completed_path',
+ 'super_seeding',
+ ],
+};
+
+// Merge the grid and status keys together as the status keys contain all the
+// grid ones.
+Ext.each(Deluge.Keys.Grid, function(key) {
+ Deluge.Keys.Status.push(key);
+});
+/**
+ * Deluge.LoginWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Deluge.LoginWindow = Ext.extend(Ext.Window, {
+ firstShow: true,
+ bodyStyle: 'padding: 10px 5px;',
+ buttonAlign: 'center',
+ closable: false,
+ closeAction: 'hide',
+ iconCls: 'x-deluge-login-window-icon',
+ layout: 'fit',
+ modal: true,
+ plain: true,
+ resizable: false,
+ title: _('Login'),
+ width: 300,
+ height: 120,
+
+ initComponent: function() {
+ Deluge.LoginWindow.superclass.initComponent.call(this);
+ this.on('show', this.onShow, this);
+
+ this.addButton({
+ text: _('Login'),
+ handler: this.onLogin,
+ scope: this,
+ });
+
+ this.form = this.add({
+ xtype: 'form',
+ baseCls: 'x-plain',
+ labelWidth: 120,
+ labelAlign: 'right',
+ defaults: { width: 110 },
+ defaultType: 'textfield',
+ });
+
+ this.passwordField = this.form.add({
+ xtype: 'textfield',
+ fieldLabel: _('Password:'),
+ labelSeparator: '',
+ grow: true,
+ growMin: '110',
+ growMax: '145',
+ id: '_password',
+ name: 'password',
+ inputType: 'password',
+ });
+ this.passwordField.on('specialkey', this.onSpecialKey, this);
+ },
+
+ logout: function() {
+ deluge.events.fire('logout');
+ deluge.client.auth.delete_session({
+ success: function(result) {
+ this.show(true);
+ },
+ scope: this,
+ });
+ },
+
+ show: function(skipCheck) {
+ if (this.firstShow) {
+ deluge.client.on('error', this.onClientError, this);
+ this.firstShow = false;
+ }
+
+ if (skipCheck) {
+ return Deluge.LoginWindow.superclass.show.call(this);
+ }
+
+ deluge.client.auth.check_session({
+ success: function(result) {
+ if (result) {
+ deluge.events.fire('login');
+ } else {
+ this.show(true);
+ }
+ },
+ failure: function(result) {
+ this.show(true);
+ },
+ scope: this,
+ });
+ },
+
+ onSpecialKey: function(field, e) {
+ if (e.getKey() == 13) this.onLogin();
+ },
+
+ onLogin: function() {
+ var passwordField = this.passwordField;
+ deluge.client.auth.login(passwordField.getValue(), {
+ success: function(result) {
+ if (result) {
+ deluge.events.fire('login');
+ this.hide();
+ passwordField.setRawValue('');
+ } else {
+ Ext.MessageBox.show({
+ title: _('Login Failed'),
+ msg: _('You entered an incorrect password'),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ fn: function() {
+ passwordField.focus(true, 10);
+ },
+ icon: Ext.MessageBox.WARNING,
+ iconCls: 'x-deluge-icon-warning',
+ });
+ }
+ },
+ scope: this,
+ });
+ },
+
+ onClientError: function(errorObj, response, requestOptions) {
+ if (errorObj.error.code == 1) {
+ deluge.events.fire('logout');
+ this.show(true);
+ }
+ },
+
+ onShow: function() {
+ this.passwordField.focus(true, 300);
+ },
+});
+/**
+ * Deluge.Menus.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+deluge.menus = {
+ onTorrentActionSetOpt: function(item, e) {
+ var ids = deluge.torrents.getSelectedIds();
+ var action = item.initialConfig.torrentAction;
+ var opts = {};
+ opts[action[0]] = action[1];
+ deluge.client.core.set_torrent_options(ids, opts);
+ },
+
+ onTorrentActionMethod: function(item, e) {
+ var ids = deluge.torrents.getSelectedIds();
+ var action = item.initialConfig.torrentAction;
+ deluge.client.core[action](ids, {
+ success: function() {
+ deluge.ui.update();
+ },
+ });
+ },
+
+ onTorrentActionShow: function(item, e) {
+ var ids = deluge.torrents.getSelectedIds();
+ var action = item.initialConfig.torrentAction;
+ switch (action) {
+ case 'edit_trackers':
+ deluge.editTrackers.show();
+ break;
+ case 'remove':
+ deluge.removeWindow.show(ids);
+ break;
+ case 'move':
+ deluge.moveStorage.show(ids);
+ break;
+ }
+ },
+};
+
+deluge.menus.torrent = new Ext.menu.Menu({
+ id: 'torrentMenu',
+ items: [
+ {
+ torrentAction: 'pause_torrent',
+ text: _('Pause'),
+ iconCls: 'icon-pause',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: 'resume_torrent',
+ text: _('Resume'),
+ iconCls: 'icon-resume',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ '-',
+ {
+ text: _('Options'),
+ iconCls: 'icon-options',
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ text: _('D/L Speed Limit'),
+ iconCls: 'x-deluge-downloading',
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ torrentAction: ['max_download_speed', 5],
+ text: _('5 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_download_speed', 10],
+ text: _('10 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_download_speed', 30],
+ text: _('30 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_download_speed', 80],
+ text: _('80 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_download_speed', 300],
+ text: _('300 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_download_speed', -1],
+ text: _('Unlimited'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ ],
+ }),
+ },
+ {
+ text: _('U/L Speed Limit'),
+ iconCls: 'x-deluge-seeding',
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ torrentAction: ['max_upload_speed', 5],
+ text: _('5 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_speed', 10],
+ text: _('10 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_speed', 30],
+ text: _('30 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_speed', 80],
+ text: _('80 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_speed', 300],
+ text: _('300 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_speed', -1],
+ text: _('Unlimited'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ ],
+ }),
+ },
+ {
+ text: _('Connection Limit'),
+ iconCls: 'x-deluge-connections',
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ torrentAction: ['max_connections', 50],
+ text: '50',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_connections', 100],
+ text: '100',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_connections', 200],
+ text: '200',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_connections', 300],
+ text: '300',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_connections', 500],
+ text: '500',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_connections', -1],
+ text: _('Unlimited'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ ],
+ }),
+ },
+ {
+ text: _('Upload Slot Limit'),
+ iconCls: 'icon-upload-slots',
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ torrentAction: ['max_upload_slots', 0],
+ text: '0',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_slots', 1],
+ text: '1',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_slots', 2],
+ text: '2',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_slots', 3],
+ text: '3',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_slots', 5],
+ text: '5',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_slots', -1],
+ text: _('Unlimited'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ ],
+ }),
+ },
+ {
+ id: 'auto_managed',
+ text: _('Auto Managed'),
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ torrentAction: ['auto_managed', true],
+ text: _('On'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['auto_managed', false],
+ text: _('Off'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ ],
+ }),
+ },
+ ],
+ }),
+ },
+ '-',
+ {
+ text: _('Queue'),
+ iconCls: 'icon-queue',
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ torrentAction: 'queue_top',
+ text: _('Top'),
+ iconCls: 'icon-top',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: 'queue_up',
+ text: _('Up'),
+ iconCls: 'icon-up',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: 'queue_down',
+ text: _('Down'),
+ iconCls: 'icon-down',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: 'queue_bottom',
+ text: _('Bottom'),
+ iconCls: 'icon-bottom',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ ],
+ }),
+ },
+ '-',
+ {
+ torrentAction: 'force_reannounce',
+ text: _('Update Tracker'),
+ iconCls: 'icon-update-tracker',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: 'edit_trackers',
+ text: _('Edit Trackers'),
+ iconCls: 'icon-edit-trackers',
+ handler: deluge.menus.onTorrentActionShow,
+ scope: deluge.menus,
+ },
+ '-',
+ {
+ torrentAction: 'remove',
+ text: _('Remove Torrent'),
+ iconCls: 'icon-remove',
+ handler: deluge.menus.onTorrentActionShow,
+ scope: deluge.menus,
+ },
+ '-',
+ {
+ torrentAction: 'force_recheck',
+ text: _('Force Recheck'),
+ iconCls: 'icon-recheck',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: 'move',
+ text: _('Move Download Folder'),
+ iconCls: 'icon-move',
+ handler: deluge.menus.onTorrentActionShow,
+ scope: deluge.menus,
+ },
+ ],
+});
+
+deluge.menus.filePriorities = new Ext.menu.Menu({
+ id: 'filePrioritiesMenu',
+ items: [
+ {
+ id: 'expandAll',
+ text: _('Expand All'),
+ iconCls: 'icon-expand-all',
+ },
+ '-',
+ {
+ id: 'skip',
+ text: _('Skip'),
+ iconCls: 'icon-do-not-download',
+ filePriority: FILE_PRIORITY['Skip'],
+ },
+ {
+ id: 'low',
+ text: _('Low'),
+ iconCls: 'icon-low',
+ filePriority: FILE_PRIORITY['Low'],
+ },
+ {
+ id: 'normal',
+ text: _('Normal'),
+ iconCls: 'icon-normal',
+ filePriority: FILE_PRIORITY['Normal'],
+ },
+ {
+ id: 'high',
+ text: _('High'),
+ iconCls: 'icon-high',
+ filePriority: FILE_PRIORITY['High'],
+ },
+ ],
+});
+/**
+ * Deluge.MoveStorage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.namespace('Deluge');
+Deluge.MoveStorage = Ext.extend(Ext.Window, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ title: _('Move Download Folder'),
+ width: 375,
+ height: 110,
+ layout: 'fit',
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ closable: true,
+ iconCls: 'x-deluge-move-storage',
+ plain: true,
+ constrainHeader: true,
+ resizable: false,
+ },
+ config
+ );
+ Deluge.MoveStorage.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.MoveStorage.superclass.initComponent.call(this);
+
+ this.addButton(_('Cancel'), this.onCancel, this);
+ this.addButton(_('Move'), this.onMove, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ border: false,
+ defaultType: 'textfield',
+ width: 300,
+ bodyStyle: 'padding: 5px',
+ });
+
+ this.moveLocation = this.form.add({
+ fieldLabel: _('Download Folder'),
+ name: 'location',
+ width: 240,
+ });
+ //this.form.add({
+ // xtype: 'button',
+ // text: _('Browse'),
+ // handler: function() {
+ // if (!this.fileBrowser) {
+ // this.fileBrowser = new Deluge.FileBrowser();
+ // }
+ // this.fileBrowser.show();
+ // },
+ // scope: this
+ //});
+ },
+
+ hide: function() {
+ Deluge.MoveStorage.superclass.hide.call(this);
+ this.torrentIds = null;
+ },
+
+ show: function(torrentIds) {
+ Deluge.MoveStorage.superclass.show.call(this);
+ this.torrentIds = torrentIds;
+ },
+
+ onCancel: function() {
+ this.hide();
+ },
+
+ onMove: function() {
+ var dest = this.moveLocation.getValue();
+ deluge.client.core.move_storage(this.torrentIds, dest);
+ this.hide();
+ },
+});
+deluge.moveStorage = new Deluge.MoveStorage();
+/**
+ * Deluge.MultiOptionsManager.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * @description A class that can be used to manage options throughout the ui.
+ * @namespace Deluge
+ * @class Deluge.MultiOptionsManager
+ * @extends Deluge.OptionsManager
+ */
+Deluge.MultiOptionsManager = Ext.extend(Deluge.OptionsManager, {
+ constructor: function(config) {
+ this.currentId = null;
+ this.stored = {};
+ Deluge.MultiOptionsManager.superclass.constructor.call(this, config);
+ },
+
+ /**
+ * Changes bound fields to use the specified id.
+ * @param {String} id
+ */
+ changeId: function(id, dontUpdateBinds) {
+ var oldId = this.currentId;
+ this.currentId = id;
+ if (!dontUpdateBinds) {
+ for (var option in this.options) {
+ if (!this.binds[option]) continue;
+ Ext.each(
+ this.binds[option],
+ function(bind) {
+ bind.setValue(this.get(option));
+ },
+ this
+ );
+ }
+ }
+ return oldId;
+ },
+
+ /**
+ * Changes all the changed values to be the default values
+ * @param {String} id
+ */
+ commit: function() {
+ this.stored[this.currentId] = Ext.apply(
+ this.stored[this.currentId],
+ this.changed[this.currentId]
+ );
+ this.reset();
+ },
+
+ /**
+ * Get the value for an option
+ * @param {String/Array} option A single option or an array of options to return.
+ * @returns {Object} the options value.
+ */
+ get: function() {
+ if (arguments.length == 1) {
+ var option = arguments[0];
+ return this.isDirty(option)
+ ? this.changed[this.currentId][option]
+ : this.getDefault(option);
+ } else if (arguments.length == 0) {
+ var options = {};
+ for (var option in this.options) {
+ options[option] = this.isDirty(option)
+ ? this.changed[this.currentId][option]
+ : this.getDefault(option);
+ }
+ return options;
+ } else {
+ var options = {};
+ Ext.each(
+ arguments,
+ function(option) {
+ options[option] = this.isDirty(option)
+ ? this.changed[this.currentId][option]
+ : this.getDefault(option);
+ },
+ this
+ );
+ return options;
+ }
+ },
+
+ /**
+ * Get the default value for an option.
+ * @param {String} option A single option.
+ * @returns {Object} the value of the option
+ */
+ getDefault: function(option) {
+ return this.has(option)
+ ? this.stored[this.currentId][option]
+ : this.options[option];
+ },
+
+ /**
+ * Returns the dirty (changed) values.
+ * @returns {Object} the changed options
+ */
+ getDirty: function() {
+ return this.changed[this.currentId] ? this.changed[this.currentId] : {};
+ },
+
+ /**
+ * Check to see if the option has been changed.
+ * @param {String} option
+ * @returns {Boolean} true if the option has been changed, else false.
+ */
+ isDirty: function(option) {
+ return (
+ this.changed[this.currentId] &&
+ !Ext.isEmpty(this.changed[this.currentId][option])
+ );
+ },
+
+ /**
+ * Check to see if an id has had an option set to something other than the
+ * default value.
+ * @param {String} option
+ * @returns {Boolean} true if the id has an option, else false.
+ */
+ has: function(option) {
+ return (
+ this.stored[this.currentId] &&
+ !Ext.isEmpty(this.stored[this.currentId][option])
+ );
+ },
+
+ /**
+ * Reset the options back to the default values for the specified id.
+ */
+ reset: function() {
+ if (this.changed[this.currentId]) delete this.changed[this.currentId];
+ if (this.stored[this.currentId]) delete this.stored[this.currentId];
+ },
+
+ /**
+ * Reset the options back to their defaults for all ids.
+ */
+ resetAll: function() {
+ this.changed = {};
+ this.stored = {};
+ this.changeId(null);
+ },
+
+ /**
+ * Sets the value of specified option for the passed in id.
+ * @param {String} id
+ * @param {String} option
+ * @param {Object} value The value for the option
+ */
+ setDefault: function(option, value) {
+ if (option === undefined) {
+ return;
+ } else if (value === undefined) {
+ for (var key in option) {
+ this.setDefault(key, option[key]);
+ }
+ } else {
+ var oldValue = this.getDefault(option);
+ value = this.convertValueType(oldValue, value);
+
+ // If the value is the same as the old value there is
+ // no point in setting it again.
+ if (oldValue == value) return;
+
+ // Store the new default
+ if (!this.stored[this.currentId]) this.stored[this.currentId] = {};
+ this.stored[this.currentId][option] = value;
+
+ if (!this.isDirty(option)) {
+ this.fireEvent('changed', option, value, oldValue);
+ }
+ }
+ },
+
+ /**
+ * Update the value for the specified option and id.
+ * @param {String} id
+ * @param {String/Object} option or options to update
+ * @param {Object} [value];
+ */
+ update: function(option, value) {
+ if (option === undefined) {
+ return;
+ } else if (value === undefined) {
+ for (var key in option) {
+ this.update(key, option[key]);
+ }
+ } else {
+ if (!this.changed[this.currentId])
+ this.changed[this.currentId] = {};
+
+ var defaultValue = this.getDefault(option);
+ value = this.convertValueType(defaultValue, value);
+
+ var oldValue = this.get(option);
+ if (oldValue == value) return;
+
+ if (defaultValue == value) {
+ if (this.isDirty(option))
+ delete this.changed[this.currentId][option];
+ this.fireEvent('changed', option, value, oldValue);
+ return;
+ } else {
+ this.changed[this.currentId][option] = value;
+ this.fireEvent('changed', option, value, oldValue);
+ }
+ }
+ },
+});
+/**
+ * Deluge.OtherLimitWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.OtherLimitWindow
+ * @extends Ext.Window
+ */
+Deluge.OtherLimitWindow = Ext.extend(Ext.Window, {
+ layout: 'fit',
+ width: 210,
+ height: 100,
+ constrainHeader: true,
+ closeAction: 'hide',
+
+ initComponent: function() {
+ Deluge.OtherLimitWindow.superclass.initComponent.call(this);
+ this.form = this.add({
+ xtype: 'form',
+ baseCls: 'x-plain',
+ bodyStyle: 'padding: 5px',
+ layout: 'hbox',
+ layoutConfig: {
+ pack: 'start',
+ },
+ items: [
+ {
+ xtype: 'spinnerfield',
+ name: 'limit',
+ },
+ ],
+ });
+ if (this.initialConfig.unit) {
+ this.form.add({
+ border: false,
+ baseCls: 'x-plain',
+ bodyStyle: 'padding: 5px',
+ html: this.initialConfig.unit,
+ });
+ } else {
+ this.setSize(180, 100);
+ }
+
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+ this.addButton(_('OK'), this.onOkClick, this);
+ this.afterMethod('show', this.doFocusField, this);
+ },
+
+ setValue: function(value) {
+ this.form.getForm().setValues({ limit: value });
+ },
+
+ onCancelClick: function() {
+ this.form.getForm().reset();
+ this.hide();
+ },
+
+ onOkClick: function() {
+ var config = {};
+ config[this.group] = this.form.getForm().getValues().limit;
+ deluge.client.core.set_config(config, {
+ success: function() {
+ deluge.ui.update();
+ },
+ });
+ this.hide();
+ },
+
+ doFocusField: function() {
+ this.form
+ .getForm()
+ .findField('limit')
+ .focus(true, 10);
+ },
+});
+/**
+ * Deluge.Plugin.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.Plugin
+ * @extends Ext.util.Observable
+ */
+Deluge.Plugin = Ext.extend(Ext.util.Observable, {
+ /**
+ * The plugins name
+ * @property name
+ * @type {String}
+ */
+ name: null,
+
+ constructor: function(config) {
+ this.isDelugePlugin = true;
+ this.addEvents({
+ /**
+ * @event enabled
+ * @param {Plugin} plugin the plugin instance
+ */
+ enabled: true,
+
+ /**
+ * @event disabled
+ * @param {Plugin} plugin the plugin instance
+ */
+ disabled: true,
+ });
+ Deluge.Plugin.superclass.constructor.call(this, config);
+ },
+
+ /**
+ * Disables the plugin, firing the "{@link #disabled}" event and
+ * then executing the plugins clean up method onDisabled.
+ */
+ disable: function() {
+ this.fireEvent('disabled', this);
+ if (this.onDisable) this.onDisable();
+ },
+
+ /**
+ * Enables the plugin, firing the "{@link #enabled}" event and
+ * then executes the plugins setup method, onEnabled.
+ */
+ enable: function() {
+ deluge.client.reloadMethods();
+ this.fireEvent('enable', this);
+ if (this.onEnable) this.onEnable();
+ },
+
+ registerTorrentStatus: function(key, header, options) {
+ options = options || {};
+ var cc = options.colCfg || {},
+ sc = options.storeCfg || {};
+ sc = Ext.apply(sc, { name: key });
+ deluge.torrents.meta.fields.push(sc);
+ deluge.torrents.getStore().reader.onMetaChange(deluge.torrents.meta);
+
+ cc = Ext.apply(cc, {
+ header: header,
+ dataIndex: key,
+ });
+ var cols = deluge.torrents.columns.slice(0);
+ cols.push(cc);
+ deluge.torrents.colModel.setConfig(cols);
+ deluge.torrents.columns = cols;
+
+ Deluge.Keys.Grid.push(key);
+ deluge.torrents.getView().refresh(true);
+ },
+
+ deregisterTorrentStatus: function(key) {
+ var fields = [];
+ Ext.each(deluge.torrents.meta.fields, function(field) {
+ if (field.name != key) fields.push(field);
+ });
+ deluge.torrents.meta.fields = fields;
+ deluge.torrents.getStore().reader.onMetaChange(deluge.torrents.meta);
+
+ var cols = [];
+ Ext.each(deluge.torrents.columns, function(col) {
+ if (col.dataIndex != key) cols.push(col);
+ });
+ deluge.torrents.colModel.setConfig(cols);
+ deluge.torrents.columns = cols;
+
+ var keys = [];
+ Ext.each(Deluge.Keys.Grid, function(k) {
+ if (k == key) keys.push(k);
+ });
+ Deluge.Keys.Grid = keys;
+ deluge.torrents.getView().refresh(true);
+ },
+});
+
+Ext.ns('Deluge.plugins');
+/**
+ * Deluge.RemoveWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * @class Deluge.RemoveWindow
+ * @extends Ext.Window
+ */
+Deluge.RemoveWindow = Ext.extend(Ext.Window, {
+ title: _('Remove Torrent'),
+ layout: 'fit',
+ width: 350,
+ height: 100,
+ constrainHeader: true,
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ closable: true,
+ iconCls: 'x-deluge-remove-window-icon',
+ plain: true,
+
+ bodyStyle: 'padding: 5px; padding-left: 10px;',
+ html: 'Are you sure you wish to remove the torrent (s)?',
+
+ initComponent: function() {
+ Deluge.RemoveWindow.superclass.initComponent.call(this);
+ this.addButton(_('Cancel'), this.onCancel, this);
+ this.addButton(_('Remove With Data'), this.onRemoveData, this);
+ this.addButton(_('Remove Torrent'), this.onRemove, this);
+ },
+
+ remove: function(removeData) {
+ deluge.client.core.remove_torrents(this.torrentIds, removeData, {
+ success: function(result) {
+ if (result == true) {
+ console.log(
+ 'Error(s) occured when trying to delete torrent(s).'
+ );
+ }
+ this.onRemoved(this.torrentIds);
+ },
+ scope: this,
+ torrentIds: this.torrentIds,
+ });
+ },
+
+ show: function(ids) {
+ Deluge.RemoveWindow.superclass.show.call(this);
+ this.torrentIds = ids;
+ },
+
+ onCancel: function() {
+ this.hide();
+ this.torrentIds = null;
+ },
+
+ onRemove: function() {
+ this.remove(false);
+ },
+
+ onRemoveData: function() {
+ this.remove(true);
+ },
+
+ onRemoved: function(torrentIds) {
+ deluge.events.fire('torrentsRemoved', torrentIds);
+ this.hide();
+ deluge.ui.update();
+ },
+});
+
+deluge.removeWindow = new Deluge.RemoveWindow();
+/**
+ * Deluge.Sidebar.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+// These are just so gen_gettext.py will pick up the strings
+// _('State')
+// _('Tracker Host')
+
+/**
+ * @class Deluge.Sidebar
+ * @author Damien Churchill <damoxc@gmail.com>
+ * @version 1.3
+ */
+Deluge.Sidebar = Ext.extend(Ext.Panel, {
+ // private
+ panels: {},
+
+ // private
+ selected: null,
+
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ id: 'sidebar',
+ region: 'west',
+ cls: 'deluge-sidebar',
+ title: _('Filters'),
+ layout: 'accordion',
+ split: true,
+ width: 200,
+ minSize: 100,
+ collapsible: true,
+ },
+ config
+ );
+ Deluge.Sidebar.superclass.constructor.call(this, config);
+ },
+
+ // private
+ initComponent: function() {
+ Deluge.Sidebar.superclass.initComponent.call(this);
+ deluge.events.on('disconnect', this.onDisconnect, this);
+ },
+
+ createFilter: function(filter, states) {
+ var panel = new Deluge.FilterPanel({
+ filter: filter,
+ });
+ panel.on('selectionchange', function(view, nodes) {
+ deluge.ui.update();
+ });
+ this.add(panel);
+
+ this.doLayout();
+ this.panels[filter] = panel;
+
+ panel.header.on('click', function(header) {
+ if (!deluge.config.sidebar_multiple_filters) {
+ deluge.ui.update();
+ }
+ if (!panel.list.getSelectionCount()) {
+ panel.list.select(0);
+ }
+ });
+ this.fireEvent('filtercreate', this, panel);
+
+ panel.updateStates(states);
+ this.fireEvent('afterfiltercreate', this, panel);
+ },
+
+ getFilter: function(filter) {
+ return this.panels[filter];
+ },
+
+ getFilterStates: function() {
+ var states = {};
+
+ if (deluge.config.sidebar_multiple_filters) {
+ // Grab the filters from each of the filter panels
+ this.items.each(function(panel) {
+ var state = panel.getState();
+ if (state == null) return;
+ states[panel.filterType] = state;
+ }, this);
+ } else {
+ var panel = this.getLayout().activeItem;
+ if (panel) {
+ var state = panel.getState();
+ if (!state == null) return;
+ states[panel.filterType] = state;
+ }
+ }
+
+ return states;
+ },
+
+ hasFilter: function(filter) {
+ return this.panels[filter] ? true : false;
+ },
+
+ // private
+ onDisconnect: function() {
+ for (var filter in this.panels) {
+ this.remove(this.panels[filter]);
+ }
+ this.panels = {};
+ this.selected = null;
+ },
+
+ onFilterSelect: function(selModel, rowIndex, record) {
+ deluge.ui.update();
+ },
+
+ update: function(filters) {
+ for (var filter in filters) {
+ var states = filters[filter];
+ if (Ext.getKeys(this.panels).indexOf(filter) > -1) {
+ this.panels[filter].updateStates(states);
+ } else {
+ this.createFilter(filter, states);
+ }
+ }
+
+ // Perform a cleanup of fitlers that are not enabled any more.
+ Ext.each(
+ Ext.keys(this.panels),
+ function(filter) {
+ if (Ext.keys(filters).indexOf(filter) == -1) {
+ // We need to remove the panel
+ this.remove(this.panels[filter]);
+ this.doLayout();
+ delete this.panels[filter];
+ }
+ },
+ this
+ );
+ },
+});
+/**
+ * Deluge.Statusbar.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge');
+
+Deluge.Statusbar = Ext.extend(Ext.ux.StatusBar, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ id: 'deluge-statusbar',
+ defaultIconCls: 'x-deluge-statusbar x-not-connected',
+ defaultText: _('Not Connected'),
+ },
+ config
+ );
+ Deluge.Statusbar.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.Statusbar.superclass.initComponent.call(this);
+
+ deluge.events.on('connect', this.onConnect, this);
+ deluge.events.on('disconnect', this.onDisconnect, this);
+ },
+
+ createButtons: function() {
+ this.buttons = this.add(
+ {
+ id: 'statusbar-connections',
+ text: ' ',
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-connections',
+ tooltip: _('Connections'),
+ menu: new Deluge.StatusbarMenu({
+ items: [
+ {
+ text: '50',
+ value: '50',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ {
+ text: '100',
+ value: '100',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ {
+ text: '200',
+ value: '200',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ {
+ text: '300',
+ value: '300',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ {
+ text: '500',
+ value: '500',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ {
+ text: _('Unlimited'),
+ value: '-1',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ '-',
+ {
+ text: _('Other'),
+ value: 'other',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ ],
+ otherWin: {
+ title: _('Set Maximum Connections'),
+ },
+ }),
+ },
+ '-',
+ {
+ id: 'statusbar-downspeed',
+ text: ' ',
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-downloading',
+ tooltip: _('Download Speed'),
+ menu: new Deluge.StatusbarMenu({
+ items: [
+ {
+ value: '5',
+ text: _('5 KiB/s'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ {
+ value: '10',
+ text: _('10 KiB/s'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ {
+ value: '30',
+ text: _('30 KiB/s'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ {
+ value: '80',
+ text: _('80 KiB/s'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ {
+ value: '300',
+ text: _('300 KiB/s'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ {
+ value: '-1',
+ text: _('Unlimited'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ '-',
+ {
+ value: 'other',
+ text: _('Other'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ ],
+ otherWin: {
+ title: _('Set Maximum Download Speed'),
+ unit: _('KiB/s'),
+ },
+ }),
+ },
+ '-',
+ {
+ id: 'statusbar-upspeed',
+ text: ' ',
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-seeding',
+ tooltip: _('Upload Speed'),
+ menu: new Deluge.StatusbarMenu({
+ items: [
+ {
+ value: '5',
+ text: _('5 KiB/s'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ {
+ value: '10',
+ text: _('10 KiB/s'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ {
+ value: '30',
+ text: _('30 KiB/s'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ {
+ value: '80',
+ text: _('80 KiB/s'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ {
+ value: '300',
+ text: _('300 KiB/s'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ {
+ value: '-1',
+ text: _('Unlimited'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ '-',
+ {
+ value: 'other',
+ text: _('Other'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ ],
+ otherWin: {
+ title: _('Set Maximum Upload Speed'),
+ unit: _('KiB/s'),
+ },
+ }),
+ },
+ '-',
+ {
+ id: 'statusbar-traffic',
+ text: ' ',
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-traffic',
+ tooltip: _('Protocol Traffic Download/Upload'),
+ handler: function() {
+ deluge.preferences.show();
+ deluge.preferences.selectPage('Network');
+ },
+ },
+ '-',
+ {
+ id: 'statusbar-externalip',
+ text: ' ',
+ cls: 'x-btn-text',
+ tooltip: _('External IP Address'),
+ },
+ '-',
+ {
+ id: 'statusbar-dht',
+ text: ' ',
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-dht',
+ tooltip: _('DHT Nodes'),
+ },
+ '-',
+ {
+ id: 'statusbar-freespace',
+ text: ' ',
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-freespace',
+ tooltip: _('Freespace in download folder'),
+ handler: function() {
+ deluge.preferences.show();
+ deluge.preferences.selectPage('Downloads');
+ },
+ }
+ );
+ this.created = true;
+ },
+
+ onConnect: function() {
+ this.setStatus({
+ iconCls: 'x-connected',
+ text: '',
+ });
+ if (!this.created) {
+ this.createButtons();
+ } else {
+ Ext.each(this.buttons, function(item) {
+ item.show();
+ item.enable();
+ });
+ }
+ this.doLayout();
+ },
+
+ onDisconnect: function() {
+ this.clearStatus({ useDefaults: true });
+ Ext.each(this.buttons, function(item) {
+ item.hide();
+ item.disable();
+ });
+ this.doLayout();
+ },
+
+ update: function(stats) {
+ if (!stats) return;
+
+ function addSpeed(val) {
+ return val + ' KiB/s';
+ }
+
+ var updateStat = function(name, config) {
+ var item = this.items.get('statusbar-' + name);
+ if (config.limit.value > 0) {
+ var value = config.value.formatter
+ ? config.value.formatter(config.value.value, true)
+ : config.value.value;
+ var limit = config.limit.formatter
+ ? config.limit.formatter(config.limit.value, true)
+ : config.limit.value;
+ var str = String.format(config.format, value, limit);
+ } else {
+ var str = config.value.formatter
+ ? config.value.formatter(config.value.value, true)
+ : config.value.value;
+ }
+ item.setText(str);
+
+ if (!item.menu) return;
+ item.menu.setValue(config.limit.value);
+ }.createDelegate(this);
+
+ updateStat('connections', {
+ value: { value: stats.num_connections },
+ limit: { value: stats.max_num_connections },
+ format: '{0} ({1})',
+ });
+
+ updateStat('downspeed', {
+ value: {
+ value: stats.download_rate,
+ formatter: Deluge.Formatters.speed,
+ },
+ limit: {
+ value: stats.max_download,
+ formatter: addSpeed,
+ },
+ format: '{0} ({1})',
+ });
+
+ updateStat('upspeed', {
+ value: {
+ value: stats.upload_rate,
+ formatter: Deluge.Formatters.speed,
+ },
+ limit: {
+ value: stats.max_upload,
+ formatter: addSpeed,
+ },
+ format: '{0} ({1})',
+ });
+
+ updateStat('traffic', {
+ value: {
+ value: stats.download_protocol_rate,
+ formatter: Deluge.Formatters.speed,
+ },
+ limit: {
+ value: stats.upload_protocol_rate,
+ formatter: Deluge.Formatters.speed,
+ },
+ format: '{0}/{1}',
+ });
+
+ this.items.get('statusbar-dht').setText(stats.dht_nodes);
+ this.items
+ .get('statusbar-freespace')
+ .setText(
+ stats.free_space >= 0 ? fsize(stats.free_space) : _('Error')
+ );
+ this.items
+ .get('statusbar-externalip')
+ .setText(
+ String.format(
+ _('<b>IP</b> {0}'),
+ stats.external_ip ? stats.external_ip : _('n/a')
+ )
+ );
+ },
+});
+/**
+ * Deluge.Toolbar.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * An extension of the <tt>Ext.Toolbar</tt> class that provides an extensible toolbar for Deluge.
+ * @class Deluge.Toolbar
+ * @extends Ext.Toolbar
+ */
+Deluge.Toolbar = Ext.extend(Ext.Toolbar, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ items: [
+ {
+ id: 'tbar-deluge-text',
+ text: _('Deluge'),
+ iconCls: 'x-deluge-main-panel',
+ handler: this.onAboutClick,
+ },
+ new Ext.Toolbar.Separator(),
+ {
+ id: 'create',
+ disabled: true,
+ hidden: true,
+ text: _('Create'),
+ iconCls: 'icon-create',
+ handler: this.onTorrentAction,
+ },
+ {
+ id: 'add',
+ disabled: true,
+ text: _('Add'),
+ iconCls: 'icon-add',
+ handler: this.onTorrentAdd,
+ },
+ {
+ id: 'remove',
+ disabled: true,
+ text: _('Remove'),
+ iconCls: 'icon-remove',
+ handler: this.onTorrentAction,
+ },
+ new Ext.Toolbar.Separator(),
+ {
+ id: 'pause',
+ disabled: true,
+ text: _('Pause'),
+ iconCls: 'icon-pause',
+ handler: this.onTorrentAction,
+ },
+ {
+ id: 'resume',
+ disabled: true,
+ text: _('Resume'),
+ iconCls: 'icon-resume',
+ handler: this.onTorrentAction,
+ },
+ new Ext.Toolbar.Separator(),
+ {
+ id: 'up',
+ cls: 'x-btn-text-icon',
+ disabled: true,
+ text: _('Up'),
+ iconCls: 'icon-up',
+ handler: this.onTorrentAction,
+ },
+ {
+ id: 'down',
+ disabled: true,
+ text: _('Down'),
+ iconCls: 'icon-down',
+ handler: this.onTorrentAction,
+ },
+ new Ext.Toolbar.Separator(),
+ {
+ id: 'preferences',
+ text: _('Preferences'),
+ iconCls: 'x-deluge-preferences',
+ handler: this.onPreferencesClick,
+ scope: this,
+ },
+ {
+ id: 'connectionman',
+ text: _('Connection Manager'),
+ iconCls: 'x-deluge-connection-manager',
+ handler: this.onConnectionManagerClick,
+ scope: this,
+ },
+ '->',
+ {
+ id: 'help',
+ iconCls: 'icon-help',
+ text: _('Help'),
+ handler: this.onHelpClick,
+ scope: this,
+ },
+ {
+ id: 'logout',
+ iconCls: 'icon-logout',
+ disabled: true,
+ text: _('Logout'),
+ handler: this.onLogout,
+ scope: this,
+ },
+ ],
+ },
+ config
+ );
+ Deluge.Toolbar.superclass.constructor.call(this, config);
+ },
+
+ connectedButtons: ['add', 'remove', 'pause', 'resume', 'up', 'down'],
+
+ initComponent: function() {
+ Deluge.Toolbar.superclass.initComponent.call(this);
+ deluge.events.on('connect', this.onConnect, this);
+ deluge.events.on('login', this.onLogin, this);
+ },
+
+ onConnect: function() {
+ Ext.each(
+ this.connectedButtons,
+ function(buttonId) {
+ this.items.get(buttonId).enable();
+ },
+ this
+ );
+ },
+
+ onDisconnect: function() {
+ Ext.each(
+ this.connectedButtons,
+ function(buttonId) {
+ this.items.get(buttonId).disable();
+ },
+ this
+ );
+ },
+
+ onLogin: function() {
+ this.items.get('logout').enable();
+ },
+
+ onLogout: function() {
+ this.items.get('logout').disable();
+ deluge.login.logout();
+ },
+
+ onConnectionManagerClick: function() {
+ deluge.connectionManager.show();
+ },
+
+ onHelpClick: function() {
+ window.open('http://dev.deluge-torrent.org/wiki/UserGuide');
+ },
+
+ onAboutClick: function() {
+ var about = new Deluge.about.AboutWindow();
+ about.show();
+ },
+
+ onPreferencesClick: function() {
+ deluge.preferences.show();
+ },
+
+ onTorrentAction: function(item) {
+ var selection = deluge.torrents.getSelections();
+ var ids = [];
+ Ext.each(selection, function(record) {
+ ids.push(record.id);
+ });
+
+ switch (item.id) {
+ case 'remove':
+ deluge.removeWindow.show(ids);
+ break;
+ case 'pause':
+ case 'resume':
+ deluge.client.core[item.id + '_torrent'](ids, {
+ success: function() {
+ deluge.ui.update();
+ },
+ });
+ break;
+ case 'up':
+ case 'down':
+ deluge.client.core['queue_' + item.id](ids, {
+ success: function() {
+ deluge.ui.update();
+ },
+ });
+ break;
+ }
+ },
+
+ onTorrentAdd: function() {
+ deluge.add.show();
+ },
+});
+/**
+ * Deluge.TorrentGrid.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+(function() {
+ /* Renderers for the Torrent Grid */
+ function queueRenderer(value) {
+ return value == -1 ? '' : value + 1;
+ }
+ function torrentNameRenderer(value, p, r) {
+ return String.format(
+ '<div class="torrent-name x-deluge-{0}">{1}</div>',
+ r.data['state'].toLowerCase(),
+ value
+ );
+ }
+ function torrentSpeedRenderer(value) {
+ if (!value) return;
+ return fspeed(value);
+ }
+ function torrentLimitRenderer(value) {
+ if (value == -1) return '';
+ return fspeed(value * 1024.0);
+ }
+ function torrentProgressRenderer(value, p, r) {
+ value = new Number(value);
+ var progress = value;
+ var text = _(r.data['state']) + ' ' + value.toFixed(2) + '%';
+ if (this.style) {
+ var style = this.style;
+ } else {
+ var style = p.style;
+ }
+ var width = new Number(style.match(/\w+:\s*(\d+)\w+/)[1]);
+ return Deluge.progressBar(value, width - 8, text);
+ }
+ function seedsRenderer(value, p, r) {
+ if (r.data['total_seeds'] > -1) {
+ return String.format('{0} ({1})', value, r.data['total_seeds']);
+ } else {
+ return value;
+ }
+ }
+ function peersRenderer(value, p, r) {
+ if (r.data['total_peers'] > -1) {
+ return String.format('{0} ({1})', value, r.data['total_peers']);
+ } else {
+ return value;
+ }
+ }
+ function availRenderer(value, p, r) {
+ return value < 0 ? '&infin;' : parseFloat(new Number(value).toFixed(3));
+ }
+ function trackerRenderer(value, p, r) {
+ return String.format(
+ '<div style="background: url(' +
+ deluge.config.base +
+ 'tracker/{0}) no-repeat; padding-left: 20px;">{0}</div>',
+ value
+ );
+ }
+
+ function etaSorter(eta) {
+ return eta * -1;
+ }
+
+ function dateOrNever(date) {
+ return date > 0.0 ? fdate(date) : _('Never');
+ }
+
+ function timeOrInf(time) {
+ return time < 0 ? '&infin;' : ftime(time);
+ }
+
+ /**
+ * Deluge.TorrentGrid Class
+ *
+ * @author Damien Churchill <damoxc@gmail.com>
+ * @version 1.3
+ *
+ * @class Deluge.TorrentGrid
+ * @extends Ext.grid.GridPanel
+ * @constructor
+ * @param {Object} config Configuration options
+ */
+ Deluge.TorrentGrid = Ext.extend(Ext.grid.GridPanel, {
+ // object to store contained torrent ids
+ torrents: {},
+
+ columns: [
+ {
+ id: 'queue',
+ header: '#',
+ width: 30,
+ sortable: true,
+ renderer: queueRenderer,
+ dataIndex: 'queue',
+ },
+ {
+ id: 'name',
+ header: _('Name'),
+ width: 150,
+ sortable: true,
+ renderer: torrentNameRenderer,
+ dataIndex: 'name',
+ },
+ {
+ header: _('Size'),
+ width: 75,
+ sortable: true,
+ renderer: fsize,
+ dataIndex: 'total_wanted',
+ },
+ {
+ header: _('Progress'),
+ width: 150,
+ sortable: true,
+ renderer: torrentProgressRenderer,
+ dataIndex: 'progress',
+ },
+ {
+ header: _('Seeds'),
+ hidden: true,
+ width: 60,
+ sortable: true,
+ renderer: seedsRenderer,
+ dataIndex: 'num_seeds',
+ },
+ {
+ header: _('Peers'),
+ hidden: true,
+ width: 60,
+ sortable: true,
+ renderer: peersRenderer,
+ dataIndex: 'num_peers',
+ },
+ {
+ header: _('Down Speed'),
+ width: 80,
+ sortable: true,
+ renderer: torrentSpeedRenderer,
+ dataIndex: 'download_payload_rate',
+ },
+ {
+ header: _('Up Speed'),
+ width: 80,
+ sortable: true,
+ renderer: torrentSpeedRenderer,
+ dataIndex: 'upload_payload_rate',
+ },
+ {
+ header: _('ETA'),
+ width: 60,
+ sortable: true,
+ renderer: timeOrInf,
+ dataIndex: 'eta',
+ },
+ {
+ header: _('Ratio'),
+ hidden: true,
+ width: 60,
+ sortable: true,
+ renderer: availRenderer,
+ dataIndex: 'ratio',
+ },
+ {
+ header: _('Avail'),
+ hidden: true,
+ width: 60,
+ sortable: true,
+ renderer: availRenderer,
+ dataIndex: 'distributed_copies',
+ },
+ {
+ header: _('Added'),
+ hidden: true,
+ width: 80,
+ sortable: true,
+ renderer: fdate,
+ dataIndex: 'time_added',
+ },
+ {
+ header: _('Complete Seen'),
+ hidden: true,
+ width: 80,
+ sortable: true,
+ renderer: dateOrNever,
+ dataIndex: 'last_seen_complete',
+ },
+ {
+ header: _('Completed'),
+ hidden: true,
+ width: 80,
+ sortable: true,
+ renderer: dateOrNever,
+ dataIndex: 'completed_time',
+ },
+ {
+ header: _('Tracker'),
+ hidden: true,
+ width: 120,
+ sortable: true,
+ renderer: trackerRenderer,
+ dataIndex: 'tracker_host',
+ },
+ {
+ header: _('Download Folder'),
+ hidden: true,
+ width: 120,
+ sortable: true,
+ renderer: fplain,
+ dataIndex: 'download_location',
+ },
+ {
+ header: _('Owner'),
+ width: 80,
+ sortable: true,
+ renderer: fplain,
+ dataIndex: 'owner',
+ },
+ {
+ header: _('Public'),
+ hidden: true,
+ width: 80,
+ sortable: true,
+ renderer: fplain,
+ dataIndex: 'public',
+ },
+ {
+ header: _('Shared'),
+ hidden: true,
+ width: 80,
+ sortable: true,
+ renderer: fplain,
+ dataIndex: 'shared',
+ },
+ {
+ header: _('Downloaded'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: fsize,
+ dataIndex: 'total_done',
+ },
+ {
+ header: _('Uploaded'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: fsize,
+ dataIndex: 'total_uploaded',
+ },
+ {
+ header: _('Remaining'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: fsize,
+ dataIndex: 'total_remaining',
+ },
+ {
+ header: _('Down Limit'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: torrentLimitRenderer,
+ dataIndex: 'max_download_speed',
+ },
+ {
+ header: _('Up Limit'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: torrentLimitRenderer,
+ dataIndex: 'max_upload_speed',
+ },
+ {
+ header: _('Seeds:Peers'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: availRenderer,
+ dataIndex: 'seeds_peers_ratio',
+ },
+ {
+ header: _('Last Transfer'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: ftime,
+ dataIndex: 'time_since_transfer',
+ },
+ ],
+
+ meta: {
+ root: 'torrents',
+ idProperty: 'id',
+ fields: [
+ {
+ name: 'queue',
+ sortType: Deluge.data.SortTypes.asQueuePosition,
+ },
+ { name: 'name', sortType: Deluge.data.SortTypes.asName },
+ { name: 'total_wanted', type: 'int' },
+ { name: 'state' },
+ { name: 'progress', type: 'float' },
+ { name: 'num_seeds', type: 'int' },
+ { name: 'total_seeds', type: 'int' },
+ { name: 'num_peers', type: 'int' },
+ { name: 'total_peers', type: 'int' },
+ { name: 'download_payload_rate', type: 'int' },
+ { name: 'upload_payload_rate', type: 'int' },
+ { name: 'eta', type: 'int', sortType: etaSorter },
+ { name: 'ratio', type: 'float' },
+ { name: 'distributed_copies', type: 'float' },
+ { name: 'time_added', type: 'int' },
+ { name: 'tracker_host' },
+ { name: 'download_location' },
+ { name: 'total_done', type: 'int' },
+ { name: 'total_uploaded', type: 'int' },
+ { name: 'total_remaining', type: 'int' },
+ { name: 'max_download_speed', type: 'int' },
+ { name: 'max_upload_speed', type: 'int' },
+ { name: 'seeds_peers_ratio', type: 'float' },
+ { name: 'time_since_transfer', type: 'int' },
+ ],
+ },
+
+ keys: [
+ {
+ key: 'a',
+ ctrl: true,
+ stopEvent: true,
+ handler: function() {
+ deluge.torrents.getSelectionModel().selectAll();
+ },
+ },
+ {
+ key: [46],
+ stopEvent: true,
+ handler: function() {
+ ids = deluge.torrents.getSelectedIds();
+ deluge.removeWindow.show(ids);
+ },
+ },
+ ],
+
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ id: 'torrentGrid',
+ store: new Ext.data.JsonStore(this.meta),
+ columns: this.columns,
+ keys: this.keys,
+ region: 'center',
+ cls: 'deluge-torrents',
+ stripeRows: true,
+ autoExpandColumn: 'name',
+ autoExpandMin: 150,
+ deferredRender: false,
+ autoScroll: true,
+ stateful: true,
+ view: new Ext.ux.grid.BufferView({
+ rowHeight: 26,
+ scrollDelay: false,
+ }),
+ },
+ config
+ );
+ Deluge.TorrentGrid.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.TorrentGrid.superclass.initComponent.call(this);
+ deluge.events.on('torrentsRemoved', this.onTorrentsRemoved, this);
+ deluge.events.on('disconnect', this.onDisconnect, this);
+
+ this.on('rowcontextmenu', function(grid, rowIndex, e) {
+ e.stopEvent();
+ var selection = grid.getSelectionModel();
+ if (!selection.isSelected(rowIndex)) {
+ selection.selectRow(rowIndex);
+ }
+ deluge.menus.torrent.showAt(e.getPoint());
+ });
+ },
+
+ /**
+ * Returns the record representing the torrent at the specified index.
+ *
+ * @param index {int} The row index of the torrent you wish to retrieve.
+ * @return {Ext.data.Record} The record representing the torrent.
+ */
+ getTorrent: function(index) {
+ return this.getStore().getAt(index);
+ },
+
+ /**
+ * Returns the currently selected record.
+ * @ return {Array/Ext.data.Record} The record(s) representing the rows
+ */
+ getSelected: function() {
+ return this.getSelectionModel().getSelected();
+ },
+
+ /**
+ * Returns the currently selected records.
+ */
+ getSelections: function() {
+ return this.getSelectionModel().getSelections();
+ },
+
+ /**
+ * Return the currently selected torrent id.
+ * @return {String} The currently selected id.
+ */
+ getSelectedId: function() {
+ return this.getSelectionModel().getSelected().id;
+ },
+
+ /**
+ * Return the currently selected torrent ids.
+ * @return {Array} The currently selected ids.
+ */
+ getSelectedIds: function() {
+ var ids = [];
+ Ext.each(this.getSelectionModel().getSelections(), function(r) {
+ ids.push(r.id);
+ });
+ return ids;
+ },
+
+ update: function(torrents, wipe) {
+ var store = this.getStore();
+
+ // Need to perform a complete reload of the torrent grid.
+ if (wipe) {
+ store.removeAll();
+ this.torrents = {};
+ }
+
+ var newTorrents = [];
+
+ // Update and add any new torrents.
+ for (var t in torrents) {
+ var torrent = torrents[t];
+
+ if (this.torrents[t]) {
+ var record = store.getById(t);
+ record.beginEdit();
+ for (var k in torrent) {
+ if (record.get(k) != torrent[k]) {
+ record.set(k, torrent[k]);
+ }
+ }
+ record.endEdit();
+ } else {
+ var record = new Deluge.data.Torrent(torrent);
+ record.id = t;
+ this.torrents[t] = 1;
+ newTorrents.push(record);
+ }
+ }
+ store.add(newTorrents);
+
+ // Remove any torrents that should not be in the store.
+ store.each(function(record) {
+ if (!torrents[record.id]) {
+ store.remove(record);
+ delete this.torrents[record.id];
+ }
+ }, this);
+ store.commitChanges();
+
+ var sortState = store.getSortState();
+ if (!sortState) return;
+ store.sort(sortState.field, sortState.direction);
+ },
+
+ // private
+ onDisconnect: function() {
+ this.getStore().removeAll();
+ this.torrents = {};
+ },
+
+ // private
+ onTorrentsRemoved: function(torrentIds) {
+ var selModel = this.getSelectionModel();
+ Ext.each(
+ torrentIds,
+ function(torrentId) {
+ var record = this.getStore().getById(torrentId);
+ if (selModel.isSelected(record)) {
+ selModel.deselectRow(this.getStore().indexOf(record));
+ }
+ this.getStore().remove(record);
+ delete this.torrents[torrentId];
+ },
+ this
+ );
+ },
+ });
+ deluge.torrents = new Deluge.TorrentGrid();
+})();
+/**
+ * Deluge.UI.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/** Dummy translation arrays so Torrent states are available for gettext.js and Translators.
+ *
+ * All entries in deluge.common.TORRENT_STATE should be added here.
+ *
+ * No need to import these, just simply use the `_()` function around a status variable.
+ */
+var TORRENT_STATE_TRANSLATION = [
+ _('All'),
+ _('Active'),
+ _('Allocating'),
+ _('Checking'),
+ _('Downloading'),
+ _('Seeding'),
+ _('Paused'),
+ _('Checking'),
+ _('Queued'),
+ _('Error'),
+];
+
+/**
+ * @static
+ * @class Deluge.UI
+ * The controller for the whole interface, that ties all the components
+ * together and handles the 2 second poll.
+ */
+deluge.ui = {
+ errorCount: 0,
+
+ filters: null,
+
+ /**
+ * @description Create all the interface components, the json-rpc client
+ * and set up various events that the UI will utilise.
+ */
+ initialize: function() {
+ deluge.add = new Deluge.add.AddWindow();
+ deluge.details = new Deluge.details.DetailsPanel();
+ deluge.connectionManager = new Deluge.ConnectionManager();
+ deluge.editTrackers = new Deluge.EditTrackersWindow();
+ deluge.login = new Deluge.LoginWindow();
+ deluge.preferences = new Deluge.preferences.PreferencesWindow();
+ deluge.sidebar = new Deluge.Sidebar();
+ deluge.statusbar = new Deluge.Statusbar();
+ deluge.toolbar = new Deluge.Toolbar();
+
+ this.detailsPanel = new Ext.Panel({
+ id: 'detailsPanel',
+ cls: 'detailsPanel',
+ region: 'south',
+ split: true,
+ height: 215,
+ minSize: 100,
+ collapsible: true,
+ layout: 'fit',
+ items: [deluge.details],
+ });
+
+ this.MainPanel = new Ext.Panel({
+ id: 'mainPanel',
+ iconCls: 'x-deluge-main-panel',
+ layout: 'border',
+ border: false,
+ tbar: deluge.toolbar,
+ items: [deluge.sidebar, this.detailsPanel, deluge.torrents],
+ bbar: deluge.statusbar,
+ });
+
+ this.Viewport = new Ext.Viewport({
+ layout: 'fit',
+ items: [this.MainPanel],
+ });
+
+ deluge.events.on('connect', this.onConnect, this);
+ deluge.events.on('disconnect', this.onDisconnect, this);
+ deluge.events.on('PluginDisabledEvent', this.onPluginDisabled, this);
+ deluge.events.on('PluginEnabledEvent', this.onPluginEnabled, this);
+ deluge.client = new Ext.ux.util.RpcClient({
+ url: deluge.config.base + 'json',
+ });
+
+ // enable all the already active plugins
+ for (var plugin in Deluge.pluginStore) {
+ plugin = Deluge.createPlugin(plugin);
+ plugin.enable();
+ deluge.plugins[plugin.name] = plugin;
+ }
+
+ // Initialize quicktips so all the tooltip configs start working.
+ Ext.QuickTips.init();
+
+ deluge.client.on(
+ 'connected',
+ function(e) {
+ deluge.login.show();
+ },
+ this,
+ { single: true }
+ );
+
+ this.update = this.update.createDelegate(this);
+ this.checkConnection = this.checkConnection.createDelegate(this);
+
+ this.originalTitle = document.title;
+ },
+
+ checkConnection: function() {
+ deluge.client.web.connected({
+ success: this.onConnectionSuccess,
+ failure: this.onConnectionError,
+ scope: this,
+ });
+ },
+
+ update: function() {
+ var filters = deluge.sidebar.getFilterStates();
+ this.oldFilters = this.filters;
+ this.filters = filters;
+
+ deluge.client.web.update_ui(Deluge.Keys.Grid, filters, {
+ success: this.onUpdate,
+ failure: this.onUpdateError,
+ scope: this,
+ });
+ deluge.details.update();
+ },
+
+ onConnectionError: function(error) {},
+
+ onConnectionSuccess: function(result) {
+ deluge.statusbar.setStatus({
+ iconCls: 'x-deluge-statusbar icon-ok',
+ text: _('Connection restored'),
+ });
+ clearInterval(this.checking);
+ if (!result) {
+ deluge.connectionManager.show();
+ }
+ },
+
+ onUpdateError: function(error) {
+ if (this.errorCount == 2) {
+ Ext.MessageBox.show({
+ title: _('Lost Connection'),
+ msg: _('The connection to the webserver has been lost!'),
+ buttons: Ext.MessageBox.OK,
+ icon: Ext.MessageBox.ERROR,
+ });
+ deluge.events.fire('disconnect');
+ deluge.statusbar.setStatus({
+ text: _('Lost connection to webserver'),
+ });
+ this.checking = setInterval(this.checkConnection, 2000);
+ }
+ this.errorCount++;
+ },
+
+ /**
+ * @static
+ * @private
+ * Updates the various components in the interface.
+ */
+ onUpdate: function(data) {
+ if (!data['connected']) {
+ deluge.connectionManager.disconnect(true);
+ return;
+ }
+
+ if (deluge.config.show_session_speed) {
+ document.title =
+ 'D: ' +
+ fsize_short(data['stats'].download_rate, true) +
+ ' U: ' +
+ fsize_short(data['stats'].upload_rate, true) +
+ ' - ' +
+ this.originalTitle;
+ }
+ if (Ext.areObjectsEqual(this.filters, this.oldFilters)) {
+ deluge.torrents.update(data['torrents']);
+ } else {
+ deluge.torrents.update(data['torrents'], true);
+ }
+ deluge.statusbar.update(data['stats']);
+ deluge.sidebar.update(data['filters']);
+ this.errorCount = 0;
+ },
+
+ /**
+ * @static
+ * @private
+ * Start the Deluge UI polling the server and update the interface.
+ */
+ onConnect: function() {
+ if (!this.running) {
+ this.running = setInterval(this.update, 2000);
+ this.update();
+ }
+ deluge.client.web.get_plugins({
+ success: this.onGotPlugins,
+ scope: this,
+ });
+ },
+
+ /**
+ * @static
+ * @private
+ */
+ onDisconnect: function() {
+ this.stop();
+ },
+
+ onGotPlugins: function(plugins) {
+ Ext.each(
+ plugins.enabled_plugins,
+ function(plugin) {
+ if (deluge.plugins[plugin]) return;
+ deluge.client.web.get_plugin_resources(plugin, {
+ success: this.onGotPluginResources,
+ scope: this,
+ });
+ },
+ this
+ );
+ },
+
+ onPluginEnabled: function(pluginName) {
+ if (deluge.plugins[pluginName]) {
+ deluge.plugins[pluginName].enable();
+ } else {
+ deluge.client.web.get_plugin_resources(pluginName, {
+ success: this.onGotPluginResources,
+ scope: this,
+ });
+ }
+ },
+
+ onGotPluginResources: function(resources) {
+ var scripts = Deluge.debug
+ ? resources.debug_scripts
+ : resources.scripts;
+ Ext.each(
+ scripts,
+ function(script) {
+ Ext.ux.JSLoader({
+ url: deluge.config.base + script,
+ onLoad: this.onPluginLoaded,
+ pluginName: resources.name,
+ });
+ },
+ this
+ );
+ },
+
+ onPluginDisabled: function(pluginName) {
+ if (deluge.plugins[pluginName]) deluge.plugins[pluginName].disable();
+ },
+
+ onPluginLoaded: function(options) {
+ // This could happen if the plugin has multiple scripts
+ if (!Deluge.hasPlugin(options.pluginName)) return;
+
+ // Enable the plugin
+ plugin = Deluge.createPlugin(options.pluginName);
+ plugin.enable();
+ deluge.plugins[plugin.name] = plugin;
+ },
+
+ /**
+ * @static
+ * Stop the Deluge UI polling the server and clear the interface.
+ */
+ stop: function() {
+ if (this.running) {
+ clearInterval(this.running);
+ this.running = false;
+ deluge.torrents.getStore().removeAll();
+ }
+ },
+};
+
+Ext.onReady(function(e) {
+ deluge.ui.initialize();
+});
diff --git a/deluge/ui/web/js/deluge-all/.order b/deluge/ui/web/js/deluge-all/.order
new file mode 100644
index 0000000..4b6be43
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/.order
@@ -0,0 +1,2 @@
++ OptionsManager.js
++ StatusbarMenu.js
diff --git a/deluge/ui/web/js/deluge-all/AboutWindow.js b/deluge/ui/web/js/deluge-all/AboutWindow.js
new file mode 100644
index 0000000..5376d05
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/AboutWindow.js
@@ -0,0 +1,129 @@
+/**
+ * Deluge.AboutWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.namespace('Deluge.about');
+
+/**
+ * @class Deluge.about.AboutWindow
+ * @extends Ext.Window
+ */
+Deluge.about.AboutWindow = Ext.extend(Ext.Window, {
+ id: 'AboutWindow',
+ title: _('About Deluge'),
+ height: 330,
+ width: 270,
+ iconCls: 'x-deluge-main-panel',
+ resizable: false,
+ plain: true,
+ layout: {
+ type: 'vbox',
+ align: 'center',
+ },
+ buttonAlign: 'center',
+
+ initComponent: function() {
+ Deluge.about.AboutWindow.superclass.initComponent.call(this);
+ this.addEvents({
+ build_ready: true,
+ });
+
+ var self = this;
+ var libtorrent = function() {
+ deluge.client.core.get_libtorrent_version({
+ success: function(lt_version) {
+ comment += '<br/>' + _('libtorrent:') + ' ' + lt_version;
+ Ext.getCmp('about_comment').setText(comment, false);
+ self.fireEvent('build_ready');
+ },
+ });
+ };
+
+ var client_version = deluge.version;
+
+ var comment =
+ _(
+ 'A peer-to-peer file sharing program\nutilizing the BitTorrent protocol.'
+ ).replace('\n', '<br/>') +
+ '<br/><br/>' +
+ _('Client:') +
+ ' ' +
+ client_version +
+ '<br/>';
+ deluge.client.web.connected({
+ success: function(connected) {
+ if (connected) {
+ deluge.client.daemon.get_version({
+ success: function(server_version) {
+ comment +=
+ _('Server:') + ' ' + server_version + '<br/>';
+ libtorrent();
+ },
+ });
+ } else {
+ this.fireEvent('build_ready');
+ }
+ },
+ failure: function() {
+ this.fireEvent('build_ready');
+ },
+ scope: this,
+ });
+
+ this.add([
+ {
+ xtype: 'box',
+ style: 'padding-top: 5px',
+ height: 80,
+ width: 240,
+ cls: 'x-deluge-logo',
+ hideLabel: true,
+ },
+ {
+ xtype: 'label',
+ style: 'padding-top: 10px; font-weight: bold; font-size: 16px;',
+ text: _('Deluge') + ' ' + client_version,
+ },
+ {
+ xtype: 'label',
+ id: 'about_comment',
+ style: 'padding-top: 10px; text-align:center; font-size: 12px;',
+ html: comment,
+ },
+ {
+ xtype: 'label',
+ style: 'padding-top: 10px; font-size: 10px;',
+ text: _('Copyright 2007-2018 Deluge Team'),
+ },
+ {
+ xtype: 'label',
+ style: 'padding-top: 5px; font-size: 12px;',
+ html:
+ '<a href="https://deluge-torrent.org" target="_blank">deluge-torrent.org</a>',
+ },
+ ]);
+ this.addButton(_('Close'), this.onCloseClick, this);
+ },
+
+ show: function() {
+ this.on('build_ready', function() {
+ Deluge.about.AboutWindow.superclass.show.call(this);
+ });
+ },
+
+ onCloseClick: function() {
+ this.close();
+ },
+});
+
+Ext.namespace('Deluge');
+
+Deluge.About = function() {
+ new Deluge.about.AboutWindow().show();
+};
diff --git a/deluge/ui/web/js/deluge-all/AddConnectionWindow.js b/deluge/ui/web/js/deluge-all/AddConnectionWindow.js
new file mode 100644
index 0000000..6d26370
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/AddConnectionWindow.js
@@ -0,0 +1,117 @@
+/**
+ * Deluge.AddConnectionWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.AddConnectionWindow
+ * @extends Ext.Window
+ */
+Deluge.AddConnectionWindow = Ext.extend(Ext.Window, {
+ title: _('Add Connection'),
+ iconCls: 'x-deluge-add-window-icon',
+
+ layout: 'fit',
+ width: 300,
+ height: 195,
+ constrainHeader: true,
+ bodyStyle: 'padding: 10px 5px;',
+ closeAction: 'hide',
+
+ initComponent: function() {
+ Deluge.AddConnectionWindow.superclass.initComponent.call(this);
+
+ this.addEvents('hostadded');
+
+ this.addButton(_('Close'), this.hide, this);
+ this.addButton(_('Add'), this.onAddClick, this);
+
+ this.on('hide', this.onHide, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ defaultType: 'textfield',
+ baseCls: 'x-plain',
+ labelWidth: 60,
+ items: [
+ {
+ fieldLabel: _('Host:'),
+ labelSeparator: '',
+ name: 'host',
+ anchor: '75%',
+ value: '',
+ },
+ {
+ xtype: 'spinnerfield',
+ fieldLabel: _('Port:'),
+ labelSeparator: '',
+ name: 'port',
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 65535,
+ },
+ value: '58846',
+ anchor: '40%',
+ },
+ {
+ fieldLabel: _('Username:'),
+ labelSeparator: '',
+ name: 'username',
+ anchor: '75%',
+ value: '',
+ },
+ {
+ fieldLabel: _('Password:'),
+ labelSeparator: '',
+ anchor: '75%',
+ name: 'password',
+ inputType: 'password',
+ value: '',
+ },
+ ],
+ });
+ },
+
+ onAddClick: function() {
+ var values = this.form.getForm().getValues();
+ deluge.client.web.add_host(
+ values.host,
+ Number(values.port),
+ values.username,
+ values.password,
+ {
+ success: function(result) {
+ if (!result[0]) {
+ Ext.MessageBox.show({
+ title: _('Error'),
+ msg: String.format(
+ _('Unable to add host: {0}'),
+ result[1]
+ ),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ } else {
+ this.fireEvent('hostadded');
+ }
+ this.hide();
+ },
+ scope: this,
+ }
+ );
+ },
+
+ onHide: function() {
+ this.form.getForm().reset();
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/AddTrackerWindow.js b/deluge/ui/web/js/deluge-all/AddTrackerWindow.js
new file mode 100644
index 0000000..c9c835d
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/AddTrackerWindow.js
@@ -0,0 +1,94 @@
+/**
+ * Deluge.AddTrackerWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+// Custom VType validator for tracker urls
+var trackerUrlTest = /(((^https?)|(^udp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
+Ext.apply(Ext.form.VTypes, {
+ trackerUrl: function(val, field) {
+ return trackerUrlTest.test(val);
+ },
+ trackerUrlText: 'Not a valid tracker url',
+});
+
+/**
+ * @class Deluge.AddTrackerWindow
+ * @extends Ext.Window
+ */
+Deluge.AddTrackerWindow = Ext.extend(Ext.Window, {
+ title: _('Add Tracker'),
+ layout: 'fit',
+ width: 375,
+ height: 150,
+ plain: true,
+ closable: true,
+ resizable: false,
+ constrainHeader: true,
+ bodyStyle: 'padding: 5px',
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ iconCls: 'x-deluge-edit-trackers',
+
+ initComponent: function() {
+ Deluge.AddTrackerWindow.superclass.initComponent.call(this);
+
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+ this.addButton(_('Add'), this.onAddClick, this);
+ this.addEvents('add');
+
+ this.form = this.add({
+ xtype: 'form',
+ defaultType: 'textarea',
+ baseCls: 'x-plain',
+ labelWidth: 55,
+ items: [
+ {
+ fieldLabel: _('Trackers:'),
+ labelSeparator: '',
+ name: 'trackers',
+ anchor: '100%',
+ },
+ ],
+ });
+ },
+
+ onAddClick: function() {
+ var trackers = this.form
+ .getForm()
+ .findField('trackers')
+ .getValue();
+ trackers = trackers.split('\n');
+
+ var cleaned = [];
+ Ext.each(
+ trackers,
+ function(tracker) {
+ if (Ext.form.VTypes.trackerUrl(tracker)) {
+ cleaned.push(tracker);
+ }
+ },
+ this
+ );
+ this.fireEvent('add', cleaned);
+ this.hide();
+ this.form
+ .getForm()
+ .findField('trackers')
+ .setValue('');
+ },
+
+ onCancelClick: function() {
+ this.form
+ .getForm()
+ .findField('trackers')
+ .setValue('');
+ this.hide();
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/Client.js b/deluge/ui/web/js/deluge-all/Client.js
new file mode 100644
index 0000000..bcabbae
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/Client.js
@@ -0,0 +1,199 @@
+/**
+ * Deluge.Client.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Ext.ux.util');
+
+/**
+ * A class that connects to a json-rpc resource and adds the available
+ * methods as functions to the class instance.
+ * @class Ext.ux.util.RpcClient
+ * @namespace Ext.ux.util
+ */
+Ext.ux.util.RpcClient = Ext.extend(Ext.util.Observable, {
+ _components: [],
+
+ _methods: [],
+
+ _requests: {},
+
+ _url: null,
+
+ _optionKeys: ['scope', 'success', 'failure'],
+
+ /**
+ * @event connected
+ * Fires when the client has retrieved the list of methods from the server.
+ * @param {Ext.ux.util.RpcClient} this
+ */
+ constructor: function(config) {
+ Ext.ux.util.RpcClient.superclass.constructor.call(this, config);
+ this._url = config.url || null;
+ this._id = 0;
+
+ this.addEvents(
+ // raw events
+ 'connected',
+ 'error'
+ );
+ this.reloadMethods();
+ },
+
+ reloadMethods: function() {
+ this._execute('system.listMethods', {
+ success: this._setMethods,
+ scope: this,
+ });
+ },
+
+ _execute: function(method, options) {
+ options = options || {};
+ options.params = options.params || [];
+ options.id = this._id;
+
+ var request = Ext.encode({
+ method: method,
+ params: options.params,
+ id: options.id,
+ });
+ this._id++;
+
+ return Ext.Ajax.request({
+ url: this._url,
+ method: 'POST',
+ success: this._onSuccess,
+ failure: this._onFailure,
+ scope: this,
+ jsonData: request,
+ options: options,
+ });
+ },
+
+ _onFailure: function(response, requestOptions) {
+ var options = requestOptions.options;
+ errorObj = {
+ id: options.id,
+ result: null,
+ error: {
+ msg: 'HTTP: ' + response.status + ' ' + response.statusText,
+ code: 255,
+ },
+ };
+
+ this.fireEvent('error', errorObj, response, requestOptions);
+
+ if (Ext.type(options.failure) != 'function') return;
+ if (options.scope) {
+ options.failure.call(
+ options.scope,
+ errorObj,
+ response,
+ requestOptions
+ );
+ } else {
+ options.failure(errorObj, response, requestOptions);
+ }
+ },
+
+ _onSuccess: function(response, requestOptions) {
+ var responseObj = Ext.decode(response.responseText);
+ var options = requestOptions.options;
+ if (responseObj.error) {
+ this.fireEvent('error', responseObj, response, requestOptions);
+
+ if (Ext.type(options.failure) != 'function') return;
+ if (options.scope) {
+ options.failure.call(
+ options.scope,
+ responseObj,
+ response,
+ requestOptions
+ );
+ } else {
+ options.failure(responseObj, response, requestOptions);
+ }
+ } else {
+ if (Ext.type(options.success) != 'function') return;
+ if (options.scope) {
+ options.success.call(
+ options.scope,
+ responseObj.result,
+ responseObj,
+ response,
+ requestOptions
+ );
+ } else {
+ options.success(
+ responseObj.result,
+ responseObj,
+ response,
+ requestOptions
+ );
+ }
+ }
+ },
+
+ _parseArgs: function(args) {
+ var params = [];
+ Ext.each(args, function(arg) {
+ params.push(arg);
+ });
+
+ var options = params[params.length - 1];
+ if (Ext.type(options) == 'object') {
+ var keys = Ext.keys(options),
+ isOption = false;
+
+ Ext.each(this._optionKeys, function(key) {
+ if (keys.indexOf(key) > -1) isOption = true;
+ });
+
+ if (isOption) {
+ params.remove(options);
+ } else {
+ options = {};
+ }
+ } else {
+ options = {};
+ }
+ options.params = params;
+ return options;
+ },
+
+ _setMethods: function(methods) {
+ var components = {},
+ self = this;
+
+ Ext.each(methods, function(method) {
+ var parts = method.split('.');
+ var component = components[parts[0]] || {};
+
+ var fn = function() {
+ var options = self._parseArgs(arguments);
+ return self._execute(method, options);
+ };
+ component[parts[1]] = fn;
+ components[parts[0]] = component;
+ });
+
+ for (var name in components) {
+ self[name] = components[name];
+ }
+ Ext.each(
+ this._components,
+ function(component) {
+ if (!component in components) {
+ delete this[component];
+ }
+ },
+ this
+ );
+ this._components = Ext.keys(components);
+ this.fireEvent('connected', this);
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/ConnectionManager.js b/deluge/ui/web/js/deluge-all/ConnectionManager.js
new file mode 100644
index 0000000..001e46b
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/ConnectionManager.js
@@ -0,0 +1,429 @@
+/**
+ * Deluge.ConnectionManager.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Deluge.ConnectionManager = Ext.extend(Ext.Window, {
+ layout: 'fit',
+ width: 300,
+ height: 220,
+ bodyStyle: 'padding: 10px 5px;',
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ closable: true,
+ plain: true,
+ constrainHeader: true,
+ title: _('Connection Manager'),
+ iconCls: 'x-deluge-connect-window-icon',
+
+ initComponent: function() {
+ Deluge.ConnectionManager.superclass.initComponent.call(this);
+ this.on('hide', this.onHide, this);
+ this.on('show', this.onShow, this);
+
+ deluge.events.on('login', this.onLogin, this);
+ deluge.events.on('logout', this.onLogout, this);
+
+ this.addButton(_('Close'), this.onClose, this);
+ this.addButton(_('Connect'), this.onConnect, this);
+
+ this.list = new Ext.list.ListView({
+ store: new Ext.data.ArrayStore({
+ fields: [
+ { name: 'status', mapping: 4 },
+ { name: 'host', mapping: 1 },
+ { name: 'port', mapping: 2 },
+ { name: 'user', mapping: 3 },
+ { name: 'version', mapping: 5 },
+ ],
+ id: 0,
+ }),
+ columns: [
+ {
+ header: _('Status'),
+ width: 0.24,
+ sortable: true,
+ tpl: new Ext.XTemplate(
+ '<tpl if="status == \'Online\'">',
+ _('Online'),
+ '</tpl>',
+ '<tpl if="status == \'Offline\'">',
+ _('Offline'),
+ '</tpl>',
+ '<tpl if="status == \'Connected\'">',
+ _('Connected'),
+ '</tpl>'
+ ),
+ dataIndex: 'status',
+ },
+ {
+ id: 'host',
+ header: _('Host'),
+ width: 0.51,
+ sortable: true,
+ tpl: '{user}@{host}:{port}',
+ dataIndex: 'host',
+ },
+ {
+ header: _('Version'),
+ width: 0.25,
+ sortable: true,
+ tpl: '<tpl if="version">{version}</tpl>',
+ dataIndex: 'version',
+ },
+ ],
+ singleSelect: true,
+ listeners: {
+ selectionchange: { fn: this.onSelectionChanged, scope: this },
+ },
+ });
+
+ this.panel = this.add({
+ autoScroll: true,
+ items: [this.list],
+ bbar: new Ext.Toolbar({
+ buttons: [
+ {
+ id: 'cm-add',
+ cls: 'x-btn-text-icon',
+ text: _('Add'),
+ iconCls: 'icon-add',
+ handler: this.onAddClick,
+ scope: this,
+ },
+ {
+ id: 'cm-edit',
+ cls: 'x-btn-text-icon',
+ text: _('Edit'),
+ iconCls: 'icon-edit',
+ handler: this.onEditClick,
+ scope: this,
+ },
+ {
+ id: 'cm-remove',
+ cls: 'x-btn-text-icon',
+ text: _('Remove'),
+ iconCls: 'icon-remove',
+ handler: this.onRemoveClick,
+ disabled: true,
+ scope: this,
+ },
+ '->',
+ {
+ id: 'cm-stop',
+ cls: 'x-btn-text-icon',
+ text: _('Stop Daemon'),
+ iconCls: 'icon-error',
+ handler: this.onStopClick,
+ disabled: true,
+ scope: this,
+ },
+ ],
+ }),
+ });
+ this.update = this.update.createDelegate(this);
+ },
+
+ /**
+ * Check to see if the the web interface is currently connected
+ * to a Deluge Daemon and show the Connection Manager if not.
+ */
+ checkConnected: function() {
+ deluge.client.web.connected({
+ success: function(connected) {
+ if (connected) {
+ deluge.events.fire('connect');
+ } else {
+ this.show();
+ }
+ },
+ scope: this,
+ });
+ },
+
+ disconnect: function(show) {
+ deluge.events.fire('disconnect');
+ if (show) {
+ if (this.isVisible()) return;
+ this.show();
+ }
+ },
+
+ loadHosts: function() {
+ deluge.client.web.get_hosts({
+ success: this.onGetHosts,
+ scope: this,
+ });
+ },
+
+ update: function() {
+ this.list.getStore().each(function(r) {
+ deluge.client.web.get_host_status(r.id, {
+ success: this.onGetHostStatus,
+ scope: this,
+ });
+ }, this);
+ },
+
+ /**
+ * Updates the buttons in the Connection Manager UI according to the
+ * passed in records host state.
+ * @param {Ext.data.Record} record The hosts record to update the UI for
+ */
+ updateButtons: function(record) {
+ var button = this.buttons[1],
+ status = record.get('status');
+
+ // Update the Connect/Disconnect button
+ button.enable();
+ if (status.toLowerCase() == 'connected') {
+ button.setText(_('Disconnect'));
+ } else {
+ button.setText(_('Connect'));
+ if (status.toLowerCase() != 'online') button.disable();
+ }
+
+ // Update the Stop/Start Daemon button
+ if (
+ status.toLowerCase() == 'connected' ||
+ status.toLowerCase() == 'online'
+ ) {
+ this.stopHostButton.enable();
+ this.stopHostButton.setText(_('Stop Daemon'));
+ } else {
+ if (
+ record.get('host') == '127.0.0.1' ||
+ record.get('host') == 'localhost'
+ ) {
+ this.stopHostButton.enable();
+ this.stopHostButton.setText(_('Start Daemon'));
+ } else {
+ this.stopHostButton.disable();
+ }
+ }
+ },
+
+ // private
+ onAddClick: function(button, e) {
+ if (!this.addWindow) {
+ this.addWindow = new Deluge.AddConnectionWindow();
+ this.addWindow.on('hostadded', this.onHostChange, this);
+ }
+ this.addWindow.show();
+ },
+
+ // private
+ onEditClick: function(button, e) {
+ var connection = this.list.getSelectedRecords()[0];
+ if (!connection) return;
+
+ if (!this.editWindow) {
+ this.editWindow = new Deluge.EditConnectionWindow();
+ this.editWindow.on('hostedited', this.onHostChange, this);
+ }
+ this.editWindow.show(connection);
+ },
+
+ // private
+ onHostChange: function() {
+ this.loadHosts();
+ },
+
+ // private
+ onClose: function(e) {
+ this.hide();
+ },
+
+ // private
+ onConnect: function(e) {
+ var selected = this.list.getSelectedRecords()[0];
+ if (!selected) return;
+
+ var me = this;
+ var disconnect = function() {
+ deluge.client.web.disconnect({
+ success: function(result) {
+ this.update(this);
+ deluge.events.fire('disconnect');
+ },
+ scope: me,
+ });
+ };
+
+ if (selected.get('status').toLowerCase() == 'connected') {
+ disconnect();
+ } else {
+ if (
+ this.list
+ .getStore()
+ .find('status', 'Connected', 0, false, false) > -1
+ ) {
+ disconnect();
+ }
+
+ var id = selected.id;
+ deluge.client.web.connect(id, {
+ success: function(methods) {
+ deluge.client.reloadMethods();
+ deluge.client.on(
+ 'connected',
+ function(e) {
+ deluge.events.fire('connect');
+ },
+ this,
+ { single: true }
+ );
+ },
+ });
+ this.hide();
+ }
+ },
+
+ // private
+ onGetHosts: function(hosts) {
+ this.list.getStore().loadData(hosts);
+ Ext.each(
+ hosts,
+ function(host) {
+ deluge.client.web.get_host_status(host[0], {
+ success: this.onGetHostStatus,
+ scope: this,
+ });
+ },
+ this
+ );
+ },
+
+ // private
+ onGetHostStatus: function(host) {
+ var record = this.list.getStore().getById(host[0]);
+ record.set('status', host[1]);
+ record.set('version', host[2]);
+ record.commit();
+ var selected = this.list.getSelectedRecords()[0];
+ if (!selected) return;
+ if (selected == record) this.updateButtons(record);
+ },
+
+ // private
+ onHide: function() {
+ if (this.running) window.clearInterval(this.running);
+ },
+
+ // private
+ onLogin: function() {
+ if (deluge.config.first_login) {
+ Ext.MessageBox.confirm(
+ _('Change Default Password'),
+ _(
+ 'We recommend changing the default password.<br><br>Would you like to change it now?'
+ ),
+ function(res) {
+ this.checkConnected();
+ if (res == 'yes') {
+ deluge.preferences.show();
+ deluge.preferences.selectPage('Interface');
+ }
+ deluge.client.web.set_config({ first_login: false });
+ },
+ this
+ );
+ } else {
+ this.checkConnected();
+ }
+ },
+
+ // private
+ onLogout: function() {
+ this.disconnect();
+ if (!this.hidden && this.rendered) {
+ this.hide();
+ }
+ },
+
+ // private
+ onRemoveClick: function(button) {
+ var connection = this.list.getSelectedRecords()[0];
+ if (!connection) return;
+
+ deluge.client.web.remove_host(connection.id, {
+ success: function(result) {
+ if (!result) {
+ Ext.MessageBox.show({
+ title: _('Error'),
+ msg: result[1],
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ } else {
+ this.list.getStore().remove(connection);
+ }
+ },
+ scope: this,
+ });
+ },
+
+ // private
+ onSelectionChanged: function(list, selections) {
+ if (selections[0]) {
+ this.editHostButton.enable();
+ this.removeHostButton.enable();
+ this.stopHostButton.enable();
+ this.stopHostButton.setText(_('Stop Daemon'));
+ this.updateButtons(this.list.getRecord(selections[0]));
+ } else {
+ this.editHostButton.disable();
+ this.removeHostButton.disable();
+ this.stopHostButton.disable();
+ }
+ },
+
+ // FIXME: Find out why this is being fired twice
+ // private
+ onShow: function() {
+ if (!this.addHostButton) {
+ var bbar = this.panel.getBottomToolbar();
+ this.addHostButton = bbar.items.get('cm-add');
+ this.editHostButton = bbar.items.get('cm-edit');
+ this.removeHostButton = bbar.items.get('cm-remove');
+ this.stopHostButton = bbar.items.get('cm-stop');
+ }
+ this.loadHosts();
+ if (this.running) return;
+ this.running = window.setInterval(this.update, 2000, this);
+ },
+
+ // private
+ onStopClick: function(button, e) {
+ var connection = this.list.getSelectedRecords()[0];
+ if (!connection) return;
+
+ if (connection.get('status') == 'Offline') {
+ // This means we need to start the daemon
+ deluge.client.web.start_daemon(connection.get('port'));
+ } else {
+ // This means we need to stop the daemon
+ deluge.client.web.stop_daemon(connection.id, {
+ success: function(result) {
+ if (!result[0]) {
+ Ext.MessageBox.show({
+ title: _('Error'),
+ msg: result[1],
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ }
+ },
+ });
+ }
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/Deluge.js b/deluge/ui/web/js/deluge-all/Deluge.js
new file mode 100644
index 0000000..31b9947
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/Deluge.js
@@ -0,0 +1,186 @@
+/**
+ * Deluge.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+// Setup the state manager
+Ext.state.Manager.setProvider(
+ new Ext.state.CookieProvider({
+ /**
+ * By default, cookies will expire after 7 days. Provide
+ * an expiry date 10 years in the future to approximate
+ * a cookie that does not expire.
+ */
+ expires: new Date(
+ new Date().getTime() + 1000 * 60 * 60 * 24 * 365 * 10
+ ),
+ })
+);
+
+// Add some additional functions to ext and setup some of the
+// configurable parameters
+Ext.apply(Ext, {
+ escapeHTML: function(text) {
+ text = String(text)
+ .replace('<', '&lt;')
+ .replace('>', '&gt;');
+ return text.replace('&', '&amp;');
+ },
+
+ isObjectEmpty: function(obj) {
+ for (var i in obj) {
+ return false;
+ }
+ return true;
+ },
+
+ areObjectsEqual: function(obj1, obj2) {
+ var equal = true;
+ if (!obj1 || !obj2) return false;
+ for (var i in obj1) {
+ if (obj1[i] != obj2[i]) {
+ equal = false;
+ }
+ }
+ return equal;
+ },
+
+ keys: function(obj) {
+ var keys = [];
+ for (var i in obj)
+ if (obj.hasOwnProperty(i)) {
+ keys.push(i);
+ }
+ return keys;
+ },
+
+ values: function(obj) {
+ var values = [];
+ for (var i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ values.push(obj[i]);
+ }
+ }
+ return values;
+ },
+
+ splat: function(obj) {
+ var type = Ext.type(obj);
+ return type ? (type != 'array' ? [obj] : obj) : [];
+ },
+});
+Ext.getKeys = Ext.keys;
+Ext.BLANK_IMAGE_URL = deluge.config.base + 'images/s.gif';
+Ext.USE_NATIVE_JSON = true;
+
+// Create the Deluge namespace
+Ext.apply(Deluge, {
+ // private
+ pluginStore: {},
+
+ // private
+ progressTpl:
+ '<div class="x-progress-wrap x-progress-renderered">' +
+ '<div class="x-progress-inner">' +
+ '<div style="width: {2}px" class="x-progress-bar">' +
+ '<div style="z-index: 99; width: {3}px" class="x-progress-text">' +
+ '<div style="width: {1}px;">{0}</div>' +
+ '</div>' +
+ '</div>' +
+ '<div class="x-progress-text x-progress-text-back">' +
+ '<div style="width: {1}px;">{0}</div>' +
+ '</div>' +
+ '</div>' +
+ '</div>',
+
+ /**
+ * A method to create a progress bar that can be used by renderers
+ * to display a bar within a grid or tree.
+ * @param {Number} progress The bars progress
+ * @param {Number} width The width of the bar
+ * @param {String} text The text to display on the bar
+ * @param {Number} modified Amount to subtract from the width allowing for fixes
+ */
+ progressBar: function(progress, width, text, modifier) {
+ modifier = Ext.value(modifier, 10);
+ var progressWidth = ((width / 100.0) * progress).toFixed(0);
+ var barWidth = progressWidth - 1;
+ var textWidth =
+ progressWidth - modifier > 0 ? progressWidth - modifier : 0;
+ return String.format(
+ Deluge.progressTpl,
+ text,
+ width,
+ barWidth,
+ textWidth
+ );
+ },
+
+ /**
+ * Constructs a new instance of the specified plugin.
+ * @param {String} name The plugin name to create
+ */
+ createPlugin: function(name) {
+ return new Deluge.pluginStore[name]();
+ },
+
+ /**
+ * Check to see if a plugin has been registered.
+ * @param {String} name The plugin name to check
+ */
+ hasPlugin: function(name) {
+ return Deluge.pluginStore[name] ? true : false;
+ },
+
+ /**
+ * Register a plugin with the Deluge interface.
+ * @param {String} name The plugin name to register
+ * @param {Plugin} plugin The plugin to register
+ */
+ registerPlugin: function(name, plugin) {
+ Deluge.pluginStore[name] = plugin;
+ },
+});
+
+// Setup a space for plugins to insert themselves
+deluge.plugins = {};
+
+// Hinting for gettext_gen.py
+// _('Skip')
+// _('Low')
+// _('Normal')
+// _('High')
+// _('Mixed')
+FILE_PRIORITY = {
+ 0: 'Skip',
+ 1: 'Low',
+ 2: 'Low',
+ 3: 'Low',
+ 4: 'Normal',
+ 5: 'High',
+ 6: 'High',
+ 7: 'High',
+ 9: 'Mixed',
+ Skip: 0,
+ Low: 1,
+ Normal: 4,
+ High: 7,
+ Mixed: 9,
+};
+
+FILE_PRIORITY_CSS = {
+ 0: 'x-no-download',
+ 1: 'x-low-download',
+ 2: 'x-low-download',
+ 3: 'x-low-download',
+ 4: 'x-normal-download',
+ 5: 'x-high-download',
+ 6: 'x-high-download',
+ 7: 'x-high-download',
+ 9: 'x-mixed-download',
+};
diff --git a/deluge/ui/web/js/deluge-all/EditConnectionWindow.js b/deluge/ui/web/js/deluge-all/EditConnectionWindow.js
new file mode 100644
index 0000000..63bd305
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/EditConnectionWindow.js
@@ -0,0 +1,134 @@
+/**
+ * Deluge.EditConnectionWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.EditConnectionWindow
+ * @extends Ext.Window
+ */
+Deluge.EditConnectionWindow = Ext.extend(Ext.Window, {
+ title: _('Edit Connection'),
+ iconCls: 'x-deluge-add-window-icon',
+
+ layout: 'fit',
+ width: 300,
+ height: 195,
+ constrainHeader: true,
+ bodyStyle: 'padding: 10px 5px;',
+ closeAction: 'hide',
+
+ initComponent: function() {
+ Deluge.EditConnectionWindow.superclass.initComponent.call(this);
+
+ this.addEvents('hostedited');
+
+ this.addButton(_('Close'), this.hide, this);
+ this.addButton(_('Edit'), this.onEditClick, this);
+
+ this.on('hide', this.onHide, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ defaultType: 'textfield',
+ baseCls: 'x-plain',
+ labelWidth: 60,
+ items: [
+ {
+ fieldLabel: _('Host:'),
+ labelSeparator: '',
+ name: 'host',
+ anchor: '75%',
+ value: '',
+ },
+ {
+ xtype: 'spinnerfield',
+ fieldLabel: _('Port:'),
+ labelSeparator: '',
+ name: 'port',
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: 0,
+ maxValue: 65535,
+ },
+ anchor: '40%',
+ value: 58846,
+ },
+ {
+ fieldLabel: _('Username:'),
+ labelSeparator: '',
+ name: 'username',
+ anchor: '75%',
+ value: '',
+ },
+ {
+ fieldLabel: _('Password:'),
+ labelSeparator: '',
+ anchor: '75%',
+ name: 'password',
+ inputType: 'password',
+ value: '',
+ },
+ ],
+ });
+ },
+
+ show: function(connection) {
+ Deluge.EditConnectionWindow.superclass.show.call(this);
+
+ this.form
+ .getForm()
+ .findField('host')
+ .setValue(connection.get('host'));
+ this.form
+ .getForm()
+ .findField('port')
+ .setValue(connection.get('port'));
+ this.form
+ .getForm()
+ .findField('username')
+ .setValue(connection.get('user'));
+ this.host_id = connection.id;
+ },
+
+ onEditClick: function() {
+ var values = this.form.getForm().getValues();
+ deluge.client.web.edit_host(
+ this.host_id,
+ values.host,
+ Number(values.port),
+ values.username,
+ values.password,
+ {
+ success: function(result) {
+ if (!result) {
+ console.log(result);
+ Ext.MessageBox.show({
+ title: _('Error'),
+ msg: String.format(_('Unable to edit host')),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ } else {
+ this.fireEvent('hostedited');
+ }
+ this.hide();
+ },
+ scope: this,
+ }
+ );
+ },
+
+ onHide: function() {
+ this.form.getForm().reset();
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/EditTrackerWindow.js b/deluge/ui/web/js/deluge-all/EditTrackerWindow.js
new file mode 100644
index 0000000..82bc32c
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/EditTrackerWindow.js
@@ -0,0 +1,83 @@
+/**
+ * Deluge.EditTrackerWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.EditTrackerWindow
+ * @extends Ext.Window
+ */
+Deluge.EditTrackerWindow = Ext.extend(Ext.Window, {
+ title: _('Edit Tracker'),
+ layout: 'fit',
+ width: 375,
+ height: 110,
+ plain: true,
+ closable: true,
+ resizable: false,
+ constrainHeader: true,
+ bodyStyle: 'padding: 5px',
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ iconCls: 'x-deluge-edit-trackers',
+
+ initComponent: function() {
+ Deluge.EditTrackerWindow.superclass.initComponent.call(this);
+
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+ this.addButton(_('Save'), this.onSaveClick, this);
+ this.on('hide', this.onHide, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ defaultType: 'textfield',
+ baseCls: 'x-plain',
+ labelWidth: 55,
+ items: [
+ {
+ fieldLabel: _('Tracker:'),
+ labelSeparator: '',
+ name: 'tracker',
+ anchor: '100%',
+ },
+ ],
+ });
+ },
+
+ show: function(record) {
+ Deluge.EditTrackerWindow.superclass.show.call(this);
+
+ this.record = record;
+ this.form
+ .getForm()
+ .findField('tracker')
+ .setValue(record.data['url']);
+ },
+
+ onCancelClick: function() {
+ this.hide();
+ },
+
+ onHide: function() {
+ this.form
+ .getForm()
+ .findField('tracker')
+ .setValue('');
+ },
+
+ onSaveClick: function() {
+ var url = this.form
+ .getForm()
+ .findField('tracker')
+ .getValue();
+ this.record.set('url', url);
+ this.record.commit();
+ this.hide();
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/EditTrackersWindow.js b/deluge/ui/web/js/deluge-all/EditTrackersWindow.js
new file mode 100644
index 0000000..47ffa86
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/EditTrackersWindow.js
@@ -0,0 +1,239 @@
+/**
+ * Deluge.EditTrackers.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.EditTrackerWindow
+ * @extends Ext.Window
+ */
+Deluge.EditTrackersWindow = Ext.extend(Ext.Window, {
+ title: _('Edit Trackers'),
+ layout: 'fit',
+ width: 350,
+ height: 220,
+ plain: true,
+ closable: true,
+ resizable: true,
+ constrainHeader: true,
+
+ bodyStyle: 'padding: 5px',
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ iconCls: 'x-deluge-edit-trackers',
+
+ initComponent: function() {
+ Deluge.EditTrackersWindow.superclass.initComponent.call(this);
+
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+ this.addButton(_('OK'), this.onOkClick, this);
+ this.addEvents('save');
+
+ this.on('show', this.onShow, this);
+ this.on('save', this.onSave, this);
+
+ this.addWindow = new Deluge.AddTrackerWindow();
+ this.addWindow.on('add', this.onAddTrackers, this);
+ this.editWindow = new Deluge.EditTrackerWindow();
+
+ this.list = new Ext.list.ListView({
+ store: new Ext.data.JsonStore({
+ root: 'trackers',
+ fields: ['tier', 'url'],
+ }),
+ columns: [
+ {
+ header: _('Tier'),
+ width: 0.1,
+ dataIndex: 'tier',
+ },
+ {
+ header: _('Tracker'),
+ width: 0.9,
+ dataIndex: 'url',
+ },
+ ],
+ columnSort: {
+ sortClasses: ['', ''],
+ },
+ stripeRows: true,
+ singleSelect: true,
+ listeners: {
+ dblclick: { fn: this.onListNodeDblClicked, scope: this },
+ selectionchange: { fn: this.onSelect, scope: this },
+ },
+ });
+
+ this.panel = this.add({
+ items: [this.list],
+ autoScroll: true,
+ bbar: new Ext.Toolbar({
+ items: [
+ {
+ text: _('Up'),
+ iconCls: 'icon-up',
+ handler: this.onUpClick,
+ scope: this,
+ },
+ {
+ text: _('Down'),
+ iconCls: 'icon-down',
+ handler: this.onDownClick,
+ scope: this,
+ },
+ '->',
+ {
+ text: _('Add'),
+ iconCls: 'icon-add',
+ handler: this.onAddClick,
+ scope: this,
+ },
+ {
+ text: _('Edit'),
+ iconCls: 'icon-edit-trackers',
+ handler: this.onEditClick,
+ scope: this,
+ },
+ {
+ text: _('Remove'),
+ iconCls: 'icon-remove',
+ handler: this.onRemoveClick,
+ scope: this,
+ },
+ ],
+ }),
+ });
+ },
+
+ onAddClick: function() {
+ this.addWindow.show();
+ },
+
+ onAddTrackers: function(trackers) {
+ var store = this.list.getStore();
+ Ext.each(
+ trackers,
+ function(tracker) {
+ var duplicate = false,
+ heightestTier = -1;
+ store.each(function(record) {
+ if (record.get('tier') > heightestTier) {
+ heightestTier = record.get('tier');
+ }
+ if (tracker == record.get('tracker')) {
+ duplicate = true;
+ return false;
+ }
+ }, this);
+ if (duplicate) return;
+ store.add(
+ new store.recordType({
+ tier: heightestTier + 1,
+ url: tracker,
+ })
+ );
+ },
+ this
+ );
+ },
+
+ onCancelClick: function() {
+ this.hide();
+ },
+
+ onEditClick: function() {
+ var selected = this.list.getSelectedRecords()[0];
+ if (!selected) return;
+ this.editWindow.show(selected);
+ },
+
+ onHide: function() {
+ this.list.getStore().removeAll();
+ },
+
+ onListNodeDblClicked: function(list, index, node, e) {
+ this.editWindow.show(this.list.getRecord(node));
+ },
+
+ onOkClick: function() {
+ var trackers = [];
+ this.list.getStore().each(function(record) {
+ trackers.push({
+ tier: record.get('tier'),
+ url: record.get('url'),
+ });
+ }, this);
+
+ deluge.client.core.set_torrent_trackers(this.torrentId, trackers, {
+ failure: this.onSaveFail,
+ scope: this,
+ });
+
+ this.hide();
+ },
+
+ onRemoveClick: function() {
+ // Remove from the grid
+ var selected = this.list.getSelectedRecords()[0];
+ if (!selected) return;
+ this.list.getStore().remove(selected);
+ },
+
+ onRequestComplete: function(status) {
+ this.list.getStore().loadData(status);
+ this.list.getStore().sort('tier', 'ASC');
+ },
+
+ onSaveFail: function() {},
+
+ onSelect: function(list) {
+ if (list.getSelectionCount()) {
+ this.panel
+ .getBottomToolbar()
+ .items.get(4)
+ .enable();
+ }
+ },
+
+ onShow: function() {
+ this.panel
+ .getBottomToolbar()
+ .items.get(4)
+ .disable();
+ var r = deluge.torrents.getSelected();
+ this.torrentId = r.id;
+ deluge.client.core.get_torrent_status(r.id, ['trackers'], {
+ success: this.onRequestComplete,
+ scope: this,
+ });
+ },
+
+ onDownClick: function() {
+ var r = this.list.getSelectedRecords()[0];
+ if (!r) return;
+
+ r.set('tier', r.get('tier') + 1);
+ r.store.sort('tier', 'ASC');
+ r.store.commitChanges();
+
+ this.list.select(r.store.indexOf(r));
+ },
+
+ onUpClick: function() {
+ var r = this.list.getSelectedRecords()[0];
+ if (!r) return;
+
+ if (r.get('tier') == 0) return;
+ r.set('tier', r.get('tier') - 1);
+ r.store.sort('tier', 'ASC');
+ r.store.commitChanges();
+
+ this.list.select(r.store.indexOf(r));
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/EventsManager.js b/deluge/ui/web/js/deluge-all/EventsManager.js
new file mode 100644
index 0000000..1714339
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/EventsManager.js
@@ -0,0 +1,118 @@
+/**
+ * Deluge.EventsManager.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * @class Deluge.EventsManager
+ * @extends Ext.util.Observable
+ * <p>Deluge.EventsManager is instantated as <tt>deluge.events</tt> and can be used by components of the UI to fire global events</p>
+ * Class for holding global events that occur within the UI.
+ */
+Deluge.EventsManager = Ext.extend(Ext.util.Observable, {
+ constructor: function() {
+ this.toRegister = [];
+ this.on('login', this.onLogin, this);
+ Deluge.EventsManager.superclass.constructor.call(this);
+ },
+
+ /**
+ * Append an event handler to this object.
+ */
+ addListener: function(eventName, fn, scope, o) {
+ this.addEvents(eventName);
+ if (/[A-Z]/.test(eventName.substring(0, 1))) {
+ if (!deluge.client) {
+ this.toRegister.push(eventName);
+ } else {
+ deluge.client.web.register_event_listener(eventName);
+ }
+ }
+ Deluge.EventsManager.superclass.addListener.call(
+ this,
+ eventName,
+ fn,
+ scope,
+ o
+ );
+ },
+
+ getEvents: function() {
+ deluge.client.web.get_events({
+ success: this.onGetEventsSuccess,
+ failure: this.onGetEventsFailure,
+ scope: this,
+ });
+ },
+
+ /**
+ * Starts the EventsManagerManager checking for events.
+ */
+ start: function() {
+ Ext.each(this.toRegister, function(eventName) {
+ deluge.client.web.register_event_listener(eventName);
+ });
+ this.running = true;
+ this.errorCount = 0;
+ this.getEvents();
+ },
+
+ /**
+ * Stops the EventsManagerManager checking for events.
+ */
+ stop: function() {
+ this.running = false;
+ },
+
+ // private
+ onLogin: function() {
+ this.start();
+ },
+
+ onGetEventsSuccess: function(events) {
+ if (!this.running) return;
+ if (events) {
+ Ext.each(
+ events,
+ function(event) {
+ var name = event[0],
+ args = event[1];
+ args.splice(0, 0, name);
+ this.fireEvent.apply(this, args);
+ },
+ this
+ );
+ }
+ this.getEvents();
+ },
+
+ // private
+ onGetEventsFailure: function(result, error) {
+ // the request timed out or we had a communication failure
+ if (!this.running) return;
+ if (!error.isTimeout && this.errorCount++ >= 3) {
+ this.stop();
+ return;
+ }
+ this.getEvents();
+ },
+});
+
+/**
+ * Appends an event handler to this object (shorthand for {@link #addListener})
+ * @method
+ */
+Deluge.EventsManager.prototype.on = Deluge.EventsManager.prototype.addListener;
+
+/**
+ * Fires the specified event with the passed parameters (minus the
+ * event name).
+ * @method
+ */
+Deluge.EventsManager.prototype.fire = Deluge.EventsManager.prototype.fireEvent;
+deluge.events = new Deluge.EventsManager();
diff --git a/deluge/ui/web/js/deluge-all/FileBrowser.js b/deluge/ui/web/js/deluge-all/FileBrowser.js
new file mode 100644
index 0000000..72962a6
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/FileBrowser.js
@@ -0,0 +1,43 @@
+/**
+ * Deluge.FileBrowser.js
+ *
+ * Copyright (c) Damien Churchill 2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.namespace('Deluge');
+Deluge.FileBrowser = Ext.extend(Ext.Window, {
+ title: _('File Browser'),
+
+ width: 500,
+ height: 400,
+
+ initComponent: function() {
+ Deluge.FileBrowser.superclass.initComponent.call(this);
+
+ this.add({
+ xtype: 'toolbar',
+ items: [
+ {
+ text: _('Back'),
+ iconCls: 'icon-back',
+ },
+ {
+ text: _('Forward'),
+ iconCls: 'icon-forward',
+ },
+ {
+ text: _('Up'),
+ iconCls: 'icon-up',
+ },
+ {
+ text: _('Home'),
+ iconCls: 'icon-home',
+ },
+ ],
+ });
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/FilterPanel.js b/deluge/ui/web/js/deluge-all/FilterPanel.js
new file mode 100644
index 0000000..2362dbb
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/FilterPanel.js
@@ -0,0 +1,175 @@
+/**
+ * Deluge.FilterPanel.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.FilterPanel
+ * @extends Ext.list.ListView
+ */
+Deluge.FilterPanel = Ext.extend(Ext.Panel, {
+ autoScroll: true,
+
+ border: false,
+
+ show_zero: null,
+
+ initComponent: function() {
+ Deluge.FilterPanel.superclass.initComponent.call(this);
+ this.filterType = this.initialConfig.filter;
+ var title = '';
+ if (this.filterType == 'state') {
+ title = _('States');
+ } else if (this.filterType == 'tracker_host') {
+ title = _('Trackers');
+ } else if (this.filterType == 'owner') {
+ title = _('Owner');
+ } else if (this.filterType == 'label') {
+ title = _('Labels');
+ } else {
+ (title = this.filterType.replace('_', ' ')),
+ (parts = title.split(' ')),
+ (title = '');
+ Ext.each(parts, function(p) {
+ fl = p.substring(0, 1).toUpperCase();
+ title += fl + p.substring(1) + ' ';
+ });
+ }
+ this.setTitle(_(title));
+
+ if (Deluge.FilterPanel.templates[this.filterType]) {
+ var tpl = Deluge.FilterPanel.templates[this.filterType];
+ } else {
+ var tpl =
+ '<div class="x-deluge-filter x-deluge-{filter:lowercase}">{filter} ({count})</div>';
+ }
+
+ this.list = this.add({
+ xtype: 'listview',
+ singleSelect: true,
+ hideHeaders: true,
+ reserveScrollOffset: true,
+ store: new Ext.data.ArrayStore({
+ idIndex: 0,
+ fields: ['filter', 'count'],
+ }),
+ columns: [
+ {
+ id: 'filter',
+ sortable: false,
+ tpl: tpl,
+ dataIndex: 'filter',
+ },
+ ],
+ });
+ this.relayEvents(this.list, ['selectionchange']);
+ },
+
+ /**
+ * Return the currently selected filter state
+ * @returns {String} the current filter state
+ */
+ getState: function() {
+ if (!this.list.getSelectionCount()) return;
+
+ var state = this.list.getSelectedRecords()[0];
+ if (!state) return;
+ if (state.id == 'All') return;
+ return state.id;
+ },
+
+ /**
+ * Return the current states in the filter
+ */
+ getStates: function() {
+ return this.states;
+ },
+
+ /**
+ * Return the Store for the ListView of the FilterPanel
+ * @returns {Ext.data.Store} the ListView store
+ */
+ getStore: function() {
+ return this.list.getStore();
+ },
+
+ /**
+ * Update the states in the FilterPanel
+ */
+ updateStates: function(states) {
+ this.states = {};
+ Ext.each(
+ states,
+ function(state) {
+ this.states[state[0]] = state[1];
+ },
+ this
+ );
+
+ var show_zero =
+ this.show_zero == null
+ ? deluge.config.sidebar_show_zero
+ : this.show_zero;
+ if (!show_zero) {
+ var newStates = [];
+ Ext.each(states, function(state) {
+ if (state[1] > 0 || state[0] == 'All') {
+ newStates.push(state);
+ }
+ });
+ states = newStates;
+ }
+
+ var store = this.getStore();
+ var filters = {};
+ Ext.each(
+ states,
+ function(s, i) {
+ var record = store.getById(s[0]);
+ if (!record) {
+ record = new store.recordType({
+ filter: s[0],
+ count: s[1],
+ });
+ record.id = s[0];
+ store.insert(i, record);
+ }
+ record.beginEdit();
+ record.set('filter', _(s[0]));
+ record.set('count', s[1]);
+ record.endEdit();
+ filters[s[0]] = true;
+ },
+ this
+ );
+
+ store.each(function(record) {
+ if (filters[record.id]) return;
+ store.remove(record);
+ var selected = this.list.getSelectedRecords()[0];
+ if (!selected) return;
+ if (selected.id == record.id) {
+ this.list.select(0);
+ }
+ }, this);
+
+ store.commitChanges();
+
+ if (!this.list.getSelectionCount()) {
+ this.list.select(0);
+ }
+ },
+});
+
+Deluge.FilterPanel.templates = {
+ tracker_host:
+ '<div class="x-deluge-filter" style="background-image: url(' +
+ deluge.config.base +
+ 'tracker/{filter});">{filter} ({count})</div>',
+};
diff --git a/deluge/ui/web/js/deluge-all/Formatters.js b/deluge/ui/web/js/deluge-all/Formatters.js
new file mode 100644
index 0000000..a511f34
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/Formatters.js
@@ -0,0 +1,181 @@
+/**
+ * Deluge.Formatters.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * A collection of functions for string formatting values.
+ * @class Deluge.Formatters
+ * @author Damien Churchill <damoxc@gmail.com>
+ * @version 1.3
+ * @singleton
+ */
+Deluge.Formatters = {
+ /**
+ * Formats a date string in the date representation of the current locale,
+ * based on the systems timezone.
+ *
+ * @param {Number} timestamp time in seconds since the Epoch.
+ * @return {String} a string in the date representation of the current locale
+ * or "" if seconds < 0.
+ */
+ date: function(timestamp) {
+ function zeroPad(num, count) {
+ var numZeropad = num + '';
+ while (numZeropad.length < count) {
+ numZeropad = '0' + numZeropad;
+ }
+ return numZeropad;
+ }
+ timestamp = timestamp * 1000;
+ var date = new Date(timestamp);
+ return String.format(
+ '{0}/{1}/{2} {3}:{4}:{5}',
+ zeroPad(date.getDate(), 2),
+ zeroPad(date.getMonth() + 1, 2),
+ date.getFullYear(),
+ zeroPad(date.getHours(), 2),
+ zeroPad(date.getMinutes(), 2),
+ zeroPad(date.getSeconds(), 2)
+ );
+ },
+
+ /**
+ * Formats the bytes value into a string with KiB, MiB or GiB units.
+ *
+ * @param {Number} bytes the filesize in bytes
+ * @param {Boolean} showZero pass in true to displays 0 values
+ * @return {String} formatted string with KiB, MiB or GiB units.
+ */
+ size: function(bytes, showZero) {
+ if (!bytes && !showZero) return '';
+ bytes = bytes / 1024.0;
+
+ if (bytes < 1024) {
+ return bytes.toFixed(1) + ' KiB';
+ } else {
+ bytes = bytes / 1024;
+ }
+
+ if (bytes < 1024) {
+ return bytes.toFixed(1) + ' MiB';
+ } else {
+ bytes = bytes / 1024;
+ }
+
+ return bytes.toFixed(1) + ' GiB';
+ },
+
+ /**
+ * Formats the bytes value into a string with K, M or G units.
+ *
+ * @param {Number} bytes the filesize in bytes
+ * @param {Boolean} showZero pass in true to displays 0 values
+ * @return {String} formatted string with K, M or G units.
+ */
+ sizeShort: function(bytes, showZero) {
+ if (!bytes && !showZero) return '';
+ bytes = bytes / 1024.0;
+
+ if (bytes < 1024) {
+ return bytes.toFixed(1) + ' K';
+ } else {
+ bytes = bytes / 1024;
+ }
+
+ if (bytes < 1024) {
+ return bytes.toFixed(1) + ' M';
+ } else {
+ bytes = bytes / 1024;
+ }
+
+ return bytes.toFixed(1) + ' G';
+ },
+
+ /**
+ * Formats a string to display a transfer speed utilizing {@link #size}
+ *
+ * @param {Number} bytes the number of bytes per second
+ * @param {Boolean} showZero pass in true to displays 0 values
+ * @return {String} formatted string with KiB, MiB or GiB units.
+ */
+ speed: function(bytes, showZero) {
+ return !bytes && !showZero ? '' : fsize(bytes, showZero) + '/s';
+ },
+
+ /**
+ * Formats a string to show time in a human readable form.
+ *
+ * @param {Number} time the number of seconds
+ * @return {String} a formatted time string. will return '' if seconds == 0
+ */
+ timeRemaining: function(time) {
+ if (time <= 0) {
+ return '&infin;';
+ }
+ time = time.toFixed(0);
+ if (time < 60) {
+ return time + 's';
+ } else {
+ time = time / 60;
+ }
+
+ if (time < 60) {
+ var minutes = Math.floor(time);
+ var seconds = Math.round(60 * (time - minutes));
+ if (seconds > 0) {
+ return minutes + 'm ' + seconds + 's';
+ } else {
+ return minutes + 'm';
+ }
+ } else {
+ time = time / 60;
+ }
+
+ if (time < 24) {
+ var hours = Math.floor(time);
+ var minutes = Math.round(60 * (time - hours));
+ if (minutes > 0) {
+ return hours + 'h ' + minutes + 'm';
+ } else {
+ return hours + 'h';
+ }
+ } else {
+ time = time / 24;
+ }
+
+ var days = Math.floor(time);
+ var hours = Math.round(24 * (time - days));
+ if (hours > 0) {
+ return days + 'd ' + hours + 'h';
+ } else {
+ return days + 'd';
+ }
+ },
+
+ /**
+ * Simply returns the value untouched, for when no formatting is required.
+ *
+ * @param {Mixed} value the value to be displayed
+ * @return the untouched value.
+ */
+ plain: function(value) {
+ return value;
+ },
+
+ cssClassEscape: function(value) {
+ return value.toLowerCase().replace('.', '_');
+ },
+};
+var fsize = Deluge.Formatters.size;
+var fsize_short = Deluge.Formatters.sizeShort;
+var fspeed = Deluge.Formatters.speed;
+var ftime = Deluge.Formatters.timeRemaining;
+var fdate = Deluge.Formatters.date;
+var fplain = Deluge.Formatters.plain;
+Ext.util.Format.cssClassEscape = Deluge.Formatters.cssClassEscape;
diff --git a/deluge/ui/web/js/deluge-all/Keys.js b/deluge/ui/web/js/deluge-all/Keys.js
new file mode 100644
index 0000000..25cf38b
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/Keys.js
@@ -0,0 +1,138 @@
+/**
+ * Deluge.Keys.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * @description The torrent status keys that are commonly used around the UI.
+ * @class Deluge.Keys
+ * @singleton
+ */
+Deluge.Keys = {
+ /**
+ * Keys that are used within the torrent grid.
+ * <pre>['queue', 'name', 'total_wanted', 'state', 'progress', 'num_seeds',
+ * 'total_seeds', 'num_peers', 'total_peers', 'download_payload_rate',
+ * 'upload_payload_rate', 'eta', 'ratio', 'distributed_copies',
+ * 'is_auto_managed', 'time_added', 'tracker_host', 'download_location', 'last_seen_complete',
+ * 'total_done', 'total_uploaded', 'max_download_speed', 'max_upload_speed',
+ * 'seeds_peers_ratio', 'total_remaining', 'completed_time', 'time_since_transfer']</pre>
+ */
+ Grid: [
+ 'queue',
+ 'name',
+ 'total_wanted',
+ 'state',
+ 'progress',
+ 'num_seeds',
+ 'total_seeds',
+ 'num_peers',
+ 'total_peers',
+ 'download_payload_rate',
+ 'upload_payload_rate',
+ 'eta',
+ 'ratio',
+ 'distributed_copies',
+ 'is_auto_managed',
+ 'time_added',
+ 'tracker_host',
+ 'download_location',
+ 'last_seen_complete',
+ 'total_done',
+ 'total_uploaded',
+ 'max_download_speed',
+ 'max_upload_speed',
+ 'seeds_peers_ratio',
+ 'total_remaining',
+ 'completed_time',
+ 'time_since_transfer',
+ ],
+
+ /**
+ * Keys used in the status tab of the statistics panel.
+ * These get updated to include the keys in {@link #Grid}.
+ * <pre>['total_done', 'total_payload_download', 'total_uploaded',
+ * 'total_payload_upload', 'next_announce', 'tracker_status', 'num_pieces',
+ * 'piece_length', 'is_auto_managed', 'active_time', 'seeding_time', 'time_since_transfer',
+ * 'seed_rank', 'last_seen_complete', 'completed_time', 'owner', 'public', 'shared']</pre>
+ */
+ Status: [
+ 'total_done',
+ 'total_payload_download',
+ 'total_uploaded',
+ 'total_payload_upload',
+ 'next_announce',
+ 'tracker_status',
+ 'num_pieces',
+ 'piece_length',
+ 'is_auto_managed',
+ 'active_time',
+ 'seeding_time',
+ 'time_since_transfer',
+ 'seed_rank',
+ 'last_seen_complete',
+ 'completed_time',
+ 'owner',
+ 'public',
+ 'shared',
+ ],
+
+ /**
+ * Keys used in the files tab of the statistics panel.
+ * <pre>['files', 'file_progress', 'file_priorities']</pre>
+ */
+ Files: ['files', 'file_progress', 'file_priorities'],
+
+ /**
+ * Keys used in the peers tab of the statistics panel.
+ * <pre>['peers']</pre>
+ */
+ Peers: ['peers'],
+
+ /**
+ * Keys used in the details tab of the statistics panel.
+ */
+ Details: [
+ 'name',
+ 'download_location',
+ 'total_size',
+ 'num_files',
+ 'message',
+ 'tracker_host',
+ 'comment',
+ 'creator',
+ ],
+
+ /**
+ * Keys used in the options tab of the statistics panel.
+ * <pre>['max_download_speed', 'max_upload_speed', 'max_connections', 'max_upload_slots',
+ * 'is_auto_managed', 'stop_at_ratio', 'stop_ratio', 'remove_at_ratio', 'private',
+ * 'prioritize_first_last']</pre>
+ */
+ Options: [
+ 'max_download_speed',
+ 'max_upload_speed',
+ 'max_connections',
+ 'max_upload_slots',
+ 'is_auto_managed',
+ 'stop_at_ratio',
+ 'stop_ratio',
+ 'remove_at_ratio',
+ 'private',
+ 'prioritize_first_last',
+ 'move_completed',
+ 'move_completed_path',
+ 'super_seeding',
+ ],
+};
+
+// Merge the grid and status keys together as the status keys contain all the
+// grid ones.
+Ext.each(Deluge.Keys.Grid, function(key) {
+ Deluge.Keys.Status.push(key);
+});
diff --git a/deluge/ui/web/js/deluge-all/LoginWindow.js b/deluge/ui/web/js/deluge-all/LoginWindow.js
new file mode 100644
index 0000000..964f5ff
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/LoginWindow.js
@@ -0,0 +1,134 @@
+/**
+ * Deluge.LoginWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Deluge.LoginWindow = Ext.extend(Ext.Window, {
+ firstShow: true,
+ bodyStyle: 'padding: 10px 5px;',
+ buttonAlign: 'center',
+ closable: false,
+ closeAction: 'hide',
+ iconCls: 'x-deluge-login-window-icon',
+ layout: 'fit',
+ modal: true,
+ plain: true,
+ resizable: false,
+ title: _('Login'),
+ width: 300,
+ height: 120,
+
+ initComponent: function() {
+ Deluge.LoginWindow.superclass.initComponent.call(this);
+ this.on('show', this.onShow, this);
+
+ this.addButton({
+ text: _('Login'),
+ handler: this.onLogin,
+ scope: this,
+ });
+
+ this.form = this.add({
+ xtype: 'form',
+ baseCls: 'x-plain',
+ labelWidth: 120,
+ labelAlign: 'right',
+ defaults: { width: 110 },
+ defaultType: 'textfield',
+ });
+
+ this.passwordField = this.form.add({
+ xtype: 'textfield',
+ fieldLabel: _('Password:'),
+ labelSeparator: '',
+ grow: true,
+ growMin: '110',
+ growMax: '145',
+ id: '_password',
+ name: 'password',
+ inputType: 'password',
+ });
+ this.passwordField.on('specialkey', this.onSpecialKey, this);
+ },
+
+ logout: function() {
+ deluge.events.fire('logout');
+ deluge.client.auth.delete_session({
+ success: function(result) {
+ this.show(true);
+ },
+ scope: this,
+ });
+ },
+
+ show: function(skipCheck) {
+ if (this.firstShow) {
+ deluge.client.on('error', this.onClientError, this);
+ this.firstShow = false;
+ }
+
+ if (skipCheck) {
+ return Deluge.LoginWindow.superclass.show.call(this);
+ }
+
+ deluge.client.auth.check_session({
+ success: function(result) {
+ if (result) {
+ deluge.events.fire('login');
+ } else {
+ this.show(true);
+ }
+ },
+ failure: function(result) {
+ this.show(true);
+ },
+ scope: this,
+ });
+ },
+
+ onSpecialKey: function(field, e) {
+ if (e.getKey() == 13) this.onLogin();
+ },
+
+ onLogin: function() {
+ var passwordField = this.passwordField;
+ deluge.client.auth.login(passwordField.getValue(), {
+ success: function(result) {
+ if (result) {
+ deluge.events.fire('login');
+ this.hide();
+ passwordField.setRawValue('');
+ } else {
+ Ext.MessageBox.show({
+ title: _('Login Failed'),
+ msg: _('You entered an incorrect password'),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ fn: function() {
+ passwordField.focus(true, 10);
+ },
+ icon: Ext.MessageBox.WARNING,
+ iconCls: 'x-deluge-icon-warning',
+ });
+ }
+ },
+ scope: this,
+ });
+ },
+
+ onClientError: function(errorObj, response, requestOptions) {
+ if (errorObj.error.code == 1) {
+ deluge.events.fire('logout');
+ this.show(true);
+ }
+ },
+
+ onShow: function() {
+ this.passwordField.focus(true, 300);
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/Menus.js b/deluge/ui/web/js/deluge-all/Menus.js
new file mode 100644
index 0000000..529c6cc
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/Menus.js
@@ -0,0 +1,388 @@
+/**
+ * Deluge.Menus.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+deluge.menus = {
+ onTorrentActionSetOpt: function(item, e) {
+ var ids = deluge.torrents.getSelectedIds();
+ var action = item.initialConfig.torrentAction;
+ var opts = {};
+ opts[action[0]] = action[1];
+ deluge.client.core.set_torrent_options(ids, opts);
+ },
+
+ onTorrentActionMethod: function(item, e) {
+ var ids = deluge.torrents.getSelectedIds();
+ var action = item.initialConfig.torrentAction;
+ deluge.client.core[action](ids, {
+ success: function() {
+ deluge.ui.update();
+ },
+ });
+ },
+
+ onTorrentActionShow: function(item, e) {
+ var ids = deluge.torrents.getSelectedIds();
+ var action = item.initialConfig.torrentAction;
+ switch (action) {
+ case 'edit_trackers':
+ deluge.editTrackers.show();
+ break;
+ case 'remove':
+ deluge.removeWindow.show(ids);
+ break;
+ case 'move':
+ deluge.moveStorage.show(ids);
+ break;
+ }
+ },
+};
+
+deluge.menus.torrent = new Ext.menu.Menu({
+ id: 'torrentMenu',
+ items: [
+ {
+ torrentAction: 'pause_torrent',
+ text: _('Pause'),
+ iconCls: 'icon-pause',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: 'resume_torrent',
+ text: _('Resume'),
+ iconCls: 'icon-resume',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ '-',
+ {
+ text: _('Options'),
+ iconCls: 'icon-options',
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ text: _('D/L Speed Limit'),
+ iconCls: 'x-deluge-downloading',
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ torrentAction: ['max_download_speed', 5],
+ text: _('5 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_download_speed', 10],
+ text: _('10 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_download_speed', 30],
+ text: _('30 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_download_speed', 80],
+ text: _('80 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_download_speed', 300],
+ text: _('300 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_download_speed', -1],
+ text: _('Unlimited'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ ],
+ }),
+ },
+ {
+ text: _('U/L Speed Limit'),
+ iconCls: 'x-deluge-seeding',
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ torrentAction: ['max_upload_speed', 5],
+ text: _('5 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_speed', 10],
+ text: _('10 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_speed', 30],
+ text: _('30 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_speed', 80],
+ text: _('80 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_speed', 300],
+ text: _('300 KiB/s'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_speed', -1],
+ text: _('Unlimited'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ ],
+ }),
+ },
+ {
+ text: _('Connection Limit'),
+ iconCls: 'x-deluge-connections',
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ torrentAction: ['max_connections', 50],
+ text: '50',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_connections', 100],
+ text: '100',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_connections', 200],
+ text: '200',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_connections', 300],
+ text: '300',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_connections', 500],
+ text: '500',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_connections', -1],
+ text: _('Unlimited'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ ],
+ }),
+ },
+ {
+ text: _('Upload Slot Limit'),
+ iconCls: 'icon-upload-slots',
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ torrentAction: ['max_upload_slots', 0],
+ text: '0',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_slots', 1],
+ text: '1',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_slots', 2],
+ text: '2',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_slots', 3],
+ text: '3',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_slots', 5],
+ text: '5',
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['max_upload_slots', -1],
+ text: _('Unlimited'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ ],
+ }),
+ },
+ {
+ id: 'auto_managed',
+ text: _('Auto Managed'),
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ torrentAction: ['auto_managed', true],
+ text: _('On'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: ['auto_managed', false],
+ text: _('Off'),
+ handler: deluge.menus.onTorrentActionSetOpt,
+ scope: deluge.menus,
+ },
+ ],
+ }),
+ },
+ ],
+ }),
+ },
+ '-',
+ {
+ text: _('Queue'),
+ iconCls: 'icon-queue',
+ hideOnClick: false,
+ menu: new Ext.menu.Menu({
+ items: [
+ {
+ torrentAction: 'queue_top',
+ text: _('Top'),
+ iconCls: 'icon-top',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: 'queue_up',
+ text: _('Up'),
+ iconCls: 'icon-up',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: 'queue_down',
+ text: _('Down'),
+ iconCls: 'icon-down',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: 'queue_bottom',
+ text: _('Bottom'),
+ iconCls: 'icon-bottom',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ ],
+ }),
+ },
+ '-',
+ {
+ torrentAction: 'force_reannounce',
+ text: _('Update Tracker'),
+ iconCls: 'icon-update-tracker',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: 'edit_trackers',
+ text: _('Edit Trackers'),
+ iconCls: 'icon-edit-trackers',
+ handler: deluge.menus.onTorrentActionShow,
+ scope: deluge.menus,
+ },
+ '-',
+ {
+ torrentAction: 'remove',
+ text: _('Remove Torrent'),
+ iconCls: 'icon-remove',
+ handler: deluge.menus.onTorrentActionShow,
+ scope: deluge.menus,
+ },
+ '-',
+ {
+ torrentAction: 'force_recheck',
+ text: _('Force Recheck'),
+ iconCls: 'icon-recheck',
+ handler: deluge.menus.onTorrentActionMethod,
+ scope: deluge.menus,
+ },
+ {
+ torrentAction: 'move',
+ text: _('Move Download Folder'),
+ iconCls: 'icon-move',
+ handler: deluge.menus.onTorrentActionShow,
+ scope: deluge.menus,
+ },
+ ],
+});
+
+deluge.menus.filePriorities = new Ext.menu.Menu({
+ id: 'filePrioritiesMenu',
+ items: [
+ {
+ id: 'expandAll',
+ text: _('Expand All'),
+ iconCls: 'icon-expand-all',
+ },
+ '-',
+ {
+ id: 'skip',
+ text: _('Skip'),
+ iconCls: 'icon-do-not-download',
+ filePriority: FILE_PRIORITY['Skip'],
+ },
+ {
+ id: 'low',
+ text: _('Low'),
+ iconCls: 'icon-low',
+ filePriority: FILE_PRIORITY['Low'],
+ },
+ {
+ id: 'normal',
+ text: _('Normal'),
+ iconCls: 'icon-normal',
+ filePriority: FILE_PRIORITY['Normal'],
+ },
+ {
+ id: 'high',
+ text: _('High'),
+ iconCls: 'icon-high',
+ filePriority: FILE_PRIORITY['High'],
+ },
+ ],
+});
diff --git a/deluge/ui/web/js/deluge-all/MoveStorage.js b/deluge/ui/web/js/deluge-all/MoveStorage.js
new file mode 100644
index 0000000..208031f
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/MoveStorage.js
@@ -0,0 +1,85 @@
+/**
+ * Deluge.MoveStorage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.namespace('Deluge');
+Deluge.MoveStorage = Ext.extend(Ext.Window, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ title: _('Move Download Folder'),
+ width: 375,
+ height: 110,
+ layout: 'fit',
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ closable: true,
+ iconCls: 'x-deluge-move-storage',
+ plain: true,
+ constrainHeader: true,
+ resizable: false,
+ },
+ config
+ );
+ Deluge.MoveStorage.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.MoveStorage.superclass.initComponent.call(this);
+
+ this.addButton(_('Cancel'), this.onCancel, this);
+ this.addButton(_('Move'), this.onMove, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ border: false,
+ defaultType: 'textfield',
+ width: 300,
+ bodyStyle: 'padding: 5px',
+ });
+
+ this.moveLocation = this.form.add({
+ fieldLabel: _('Download Folder'),
+ name: 'location',
+ width: 240,
+ });
+ //this.form.add({
+ // xtype: 'button',
+ // text: _('Browse'),
+ // handler: function() {
+ // if (!this.fileBrowser) {
+ // this.fileBrowser = new Deluge.FileBrowser();
+ // }
+ // this.fileBrowser.show();
+ // },
+ // scope: this
+ //});
+ },
+
+ hide: function() {
+ Deluge.MoveStorage.superclass.hide.call(this);
+ this.torrentIds = null;
+ },
+
+ show: function(torrentIds) {
+ Deluge.MoveStorage.superclass.show.call(this);
+ this.torrentIds = torrentIds;
+ },
+
+ onCancel: function() {
+ this.hide();
+ },
+
+ onMove: function() {
+ var dest = this.moveLocation.getValue();
+ deluge.client.core.move_storage(this.torrentIds, dest);
+ this.hide();
+ },
+});
+deluge.moveStorage = new Deluge.MoveStorage();
diff --git a/deluge/ui/web/js/deluge-all/MultiOptionsManager.js b/deluge/ui/web/js/deluge-all/MultiOptionsManager.js
new file mode 100644
index 0000000..1cd7d19
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/MultiOptionsManager.js
@@ -0,0 +1,218 @@
+/**
+ * Deluge.MultiOptionsManager.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * @description A class that can be used to manage options throughout the ui.
+ * @namespace Deluge
+ * @class Deluge.MultiOptionsManager
+ * @extends Deluge.OptionsManager
+ */
+Deluge.MultiOptionsManager = Ext.extend(Deluge.OptionsManager, {
+ constructor: function(config) {
+ this.currentId = null;
+ this.stored = {};
+ Deluge.MultiOptionsManager.superclass.constructor.call(this, config);
+ },
+
+ /**
+ * Changes bound fields to use the specified id.
+ * @param {String} id
+ */
+ changeId: function(id, dontUpdateBinds) {
+ var oldId = this.currentId;
+ this.currentId = id;
+ if (!dontUpdateBinds) {
+ for (var option in this.options) {
+ if (!this.binds[option]) continue;
+ Ext.each(
+ this.binds[option],
+ function(bind) {
+ bind.setValue(this.get(option));
+ },
+ this
+ );
+ }
+ }
+ return oldId;
+ },
+
+ /**
+ * Changes all the changed values to be the default values
+ * @param {String} id
+ */
+ commit: function() {
+ this.stored[this.currentId] = Ext.apply(
+ this.stored[this.currentId],
+ this.changed[this.currentId]
+ );
+ this.reset();
+ },
+
+ /**
+ * Get the value for an option
+ * @param {String/Array} option A single option or an array of options to return.
+ * @returns {Object} the options value.
+ */
+ get: function() {
+ if (arguments.length == 1) {
+ var option = arguments[0];
+ return this.isDirty(option)
+ ? this.changed[this.currentId][option]
+ : this.getDefault(option);
+ } else if (arguments.length == 0) {
+ var options = {};
+ for (var option in this.options) {
+ options[option] = this.isDirty(option)
+ ? this.changed[this.currentId][option]
+ : this.getDefault(option);
+ }
+ return options;
+ } else {
+ var options = {};
+ Ext.each(
+ arguments,
+ function(option) {
+ options[option] = this.isDirty(option)
+ ? this.changed[this.currentId][option]
+ : this.getDefault(option);
+ },
+ this
+ );
+ return options;
+ }
+ },
+
+ /**
+ * Get the default value for an option.
+ * @param {String} option A single option.
+ * @returns {Object} the value of the option
+ */
+ getDefault: function(option) {
+ return this.has(option)
+ ? this.stored[this.currentId][option]
+ : this.options[option];
+ },
+
+ /**
+ * Returns the dirty (changed) values.
+ * @returns {Object} the changed options
+ */
+ getDirty: function() {
+ return this.changed[this.currentId] ? this.changed[this.currentId] : {};
+ },
+
+ /**
+ * Check to see if the option has been changed.
+ * @param {String} option
+ * @returns {Boolean} true if the option has been changed, else false.
+ */
+ isDirty: function(option) {
+ return (
+ this.changed[this.currentId] &&
+ !Ext.isEmpty(this.changed[this.currentId][option])
+ );
+ },
+
+ /**
+ * Check to see if an id has had an option set to something other than the
+ * default value.
+ * @param {String} option
+ * @returns {Boolean} true if the id has an option, else false.
+ */
+ has: function(option) {
+ return (
+ this.stored[this.currentId] &&
+ !Ext.isEmpty(this.stored[this.currentId][option])
+ );
+ },
+
+ /**
+ * Reset the options back to the default values for the specified id.
+ */
+ reset: function() {
+ if (this.changed[this.currentId]) delete this.changed[this.currentId];
+ if (this.stored[this.currentId]) delete this.stored[this.currentId];
+ },
+
+ /**
+ * Reset the options back to their defaults for all ids.
+ */
+ resetAll: function() {
+ this.changed = {};
+ this.stored = {};
+ this.changeId(null);
+ },
+
+ /**
+ * Sets the value of specified option for the passed in id.
+ * @param {String} id
+ * @param {String} option
+ * @param {Object} value The value for the option
+ */
+ setDefault: function(option, value) {
+ if (option === undefined) {
+ return;
+ } else if (value === undefined) {
+ for (var key in option) {
+ this.setDefault(key, option[key]);
+ }
+ } else {
+ var oldValue = this.getDefault(option);
+ value = this.convertValueType(oldValue, value);
+
+ // If the value is the same as the old value there is
+ // no point in setting it again.
+ if (oldValue == value) return;
+
+ // Store the new default
+ if (!this.stored[this.currentId]) this.stored[this.currentId] = {};
+ this.stored[this.currentId][option] = value;
+
+ if (!this.isDirty(option)) {
+ this.fireEvent('changed', option, value, oldValue);
+ }
+ }
+ },
+
+ /**
+ * Update the value for the specified option and id.
+ * @param {String} id
+ * @param {String/Object} option or options to update
+ * @param {Object} [value];
+ */
+ update: function(option, value) {
+ if (option === undefined) {
+ return;
+ } else if (value === undefined) {
+ for (var key in option) {
+ this.update(key, option[key]);
+ }
+ } else {
+ if (!this.changed[this.currentId])
+ this.changed[this.currentId] = {};
+
+ var defaultValue = this.getDefault(option);
+ value = this.convertValueType(defaultValue, value);
+
+ var oldValue = this.get(option);
+ if (oldValue == value) return;
+
+ if (defaultValue == value) {
+ if (this.isDirty(option))
+ delete this.changed[this.currentId][option];
+ this.fireEvent('changed', option, value, oldValue);
+ return;
+ } else {
+ this.changed[this.currentId][option] = value;
+ this.fireEvent('changed', option, value, oldValue);
+ }
+ }
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/OptionsManager.js b/deluge/ui/web/js/deluge-all/OptionsManager.js
new file mode 100644
index 0000000..a1c4e65
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/OptionsManager.js
@@ -0,0 +1,279 @@
+/**
+ * Deluge.OptionsManager.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge');
+
+/**
+ * @class Deluge.OptionsManager
+ * @extends Ext.util.Observable
+ * A class that can be used to manage options throughout the ui.
+ * @constructor
+ * Creates a new OptionsManager
+ * @param {Object} config Configuration options
+ */
+Deluge.OptionsManager = Ext.extend(Ext.util.Observable, {
+ constructor: function(config) {
+ config = config || {};
+ this.binds = {};
+ this.changed = {};
+ this.options = (config && config['options']) || {};
+ this.focused = null;
+
+ this.addEvents({
+ /**
+ * @event add
+ * Fires when an option is added
+ */
+ add: true,
+
+ /**
+ * @event changed
+ * Fires when an option is changed
+ * @param {String} option The changed option
+ * @param {Mixed} value The options new value
+ * @param {Mixed} oldValue The options old value
+ */
+ changed: true,
+
+ /**
+ * @event reset
+ * Fires when the options are reset
+ */
+ reset: true,
+ });
+ this.on('changed', this.onChange, this);
+
+ Deluge.OptionsManager.superclass.constructor.call(this);
+ },
+
+ /**
+ * Add a set of default options and values to the options manager
+ * @param {Object} options The default options.
+ */
+ addOptions: function(options) {
+ this.options = Ext.applyIf(this.options, options);
+ },
+
+ /**
+ * Binds a form field to the specified option.
+ * @param {String} option
+ * @param {Ext.form.Field} field
+ */
+ bind: function(option, field) {
+ this.binds[option] = this.binds[option] || [];
+ this.binds[option].push(field);
+ field._doption = option;
+
+ field.on('focus', this.onFieldFocus, this);
+ field.on('blur', this.onFieldBlur, this);
+ field.on('change', this.onFieldChange, this);
+ field.on('check', this.onFieldChange, this);
+ field.on('spin', this.onFieldChange, this);
+ return field;
+ },
+
+ /**
+ * Changes all the changed values to be the default values
+ */
+ commit: function() {
+ this.options = Ext.apply(this.options, this.changed);
+ this.reset();
+ },
+
+ /**
+ * Converts the value so it matches the originals type
+ * @param {Mixed} oldValue The original value
+ * @param {Mixed} value The new value to convert
+ */
+ convertValueType: function(oldValue, value) {
+ if (Ext.type(oldValue) != Ext.type(value)) {
+ switch (Ext.type(oldValue)) {
+ case 'string':
+ value = String(value);
+ break;
+ case 'number':
+ value = Number(value);
+ break;
+ case 'boolean':
+ if (Ext.type(value) == 'string') {
+ value = value.toLowerCase();
+ value =
+ value == 'true' || value == '1' || value == 'on'
+ ? true
+ : false;
+ } else {
+ value = Boolean(value);
+ }
+ break;
+ }
+ }
+ return value;
+ },
+
+ /**
+ * Get the value for an option or options.
+ * @param {String} [option] A single option or an array of options to return.
+ * @returns {Object} the options value.
+ */
+ get: function() {
+ if (arguments.length == 1) {
+ var option = arguments[0];
+ return this.isDirty(option)
+ ? this.changed[option]
+ : this.options[option];
+ } else {
+ var options = {};
+ Ext.each(
+ arguments,
+ function(option) {
+ if (!this.has(option)) return;
+ options[option] = this.isDirty(option)
+ ? this.changed[option]
+ : this.options[option];
+ },
+ this
+ );
+ return options;
+ }
+ },
+
+ /**
+ * Get the default value for an option or options.
+ * @param {String|Array} [option] A single option or an array of options to return.
+ * @returns {Object} the value of the option
+ */
+ getDefault: function(option) {
+ return this.options[option];
+ },
+
+ /**
+ * Returns the dirty (changed) values.
+ * @returns {Object} the changed options
+ */
+ getDirty: function() {
+ return this.changed;
+ },
+
+ /**
+ * @param {String} [option] The option to check
+ * @returns {Boolean} true if the option has been changed from the default.
+ */
+ isDirty: function(option) {
+ return !Ext.isEmpty(this.changed[option]);
+ },
+
+ /**
+ * Check to see if an option exists in the options manager
+ * @param {String} option
+ * @returns {Boolean} true if the option exists, else false.
+ */
+ has: function(option) {
+ return this.options[option];
+ },
+
+ /**
+ * Reset the options back to the default values.
+ */
+ reset: function() {
+ this.changed = {};
+ },
+
+ /**
+ * Sets the value of specified option(s) for the passed in id.
+ * @param {String} option
+ * @param {Object} value The value for the option
+ */
+ set: function(option, value) {
+ if (option === undefined) {
+ return;
+ } else if (typeof option == 'object') {
+ var options = option;
+ this.options = Ext.apply(this.options, options);
+ for (var option in options) {
+ this.onChange(option, options[option]);
+ }
+ } else {
+ this.options[option] = value;
+ this.onChange(option, value);
+ }
+ },
+
+ /**
+ * Update the value for the specified option and id.
+ * @param {String/Object} option or options to update
+ * @param {Object} [value];
+ */
+ update: function(option, value) {
+ if (option === undefined) {
+ return;
+ } else if (value === undefined) {
+ for (var key in option) {
+ this.update(key, option[key]);
+ }
+ } else {
+ var defaultValue = this.getDefault(option);
+ value = this.convertValueType(defaultValue, value);
+
+ var oldValue = this.get(option);
+ if (oldValue == value) return;
+
+ if (defaultValue == value) {
+ if (this.isDirty(option)) delete this.changed[option];
+ this.fireEvent('changed', option, value, oldValue);
+ return;
+ }
+
+ this.changed[option] = value;
+ this.fireEvent('changed', option, value, oldValue);
+ }
+ },
+
+ /**
+ * Lets the option manager know when a field is blurred so if a value
+ * so value changing operations can continue on that field.
+ */
+ onFieldBlur: function(field, event) {
+ if (this.focused == field) {
+ this.focused = null;
+ }
+ },
+
+ /**
+ * Stops a form fields value from being blocked by the change functions
+ * @param {Ext.form.Field} field
+ * @private
+ */
+ onFieldChange: function(field, event) {
+ if (field.field) field = field.field; // fix for spinners
+ this.update(field._doption, field.getValue());
+ },
+
+ /**
+ * Lets the option manager know when a field is focused so if a value changing
+ * operation is performed it will not change the value of the field.
+ */
+ onFieldFocus: function(field, event) {
+ this.focused = field;
+ },
+
+ onChange: function(option, newValue, oldValue) {
+ // If we don't have a bind there's nothing to do.
+ if (Ext.isEmpty(this.binds[option])) return;
+ Ext.each(
+ this.binds[option],
+ function(bind) {
+ // The field is currently focused so we do not want to change it.
+ if (bind == this.focused) return;
+ // Set the form field to the new value.
+ bind.setValue(newValue);
+ },
+ this
+ );
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/OtherLimitWindow.js b/deluge/ui/web/js/deluge-all/OtherLimitWindow.js
new file mode 100644
index 0000000..3e5880f
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/OtherLimitWindow.js
@@ -0,0 +1,82 @@
+/**
+ * Deluge.OtherLimitWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.OtherLimitWindow
+ * @extends Ext.Window
+ */
+Deluge.OtherLimitWindow = Ext.extend(Ext.Window, {
+ layout: 'fit',
+ width: 210,
+ height: 100,
+ constrainHeader: true,
+ closeAction: 'hide',
+
+ initComponent: function() {
+ Deluge.OtherLimitWindow.superclass.initComponent.call(this);
+ this.form = this.add({
+ xtype: 'form',
+ baseCls: 'x-plain',
+ bodyStyle: 'padding: 5px',
+ layout: 'hbox',
+ layoutConfig: {
+ pack: 'start',
+ },
+ items: [
+ {
+ xtype: 'spinnerfield',
+ name: 'limit',
+ },
+ ],
+ });
+ if (this.initialConfig.unit) {
+ this.form.add({
+ border: false,
+ baseCls: 'x-plain',
+ bodyStyle: 'padding: 5px',
+ html: this.initialConfig.unit,
+ });
+ } else {
+ this.setSize(180, 100);
+ }
+
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+ this.addButton(_('OK'), this.onOkClick, this);
+ this.afterMethod('show', this.doFocusField, this);
+ },
+
+ setValue: function(value) {
+ this.form.getForm().setValues({ limit: value });
+ },
+
+ onCancelClick: function() {
+ this.form.getForm().reset();
+ this.hide();
+ },
+
+ onOkClick: function() {
+ var config = {};
+ config[this.group] = this.form.getForm().getValues().limit;
+ deluge.client.core.set_config(config, {
+ success: function() {
+ deluge.ui.update();
+ },
+ });
+ this.hide();
+ },
+
+ doFocusField: function() {
+ this.form
+ .getForm()
+ .findField('limit')
+ .focus(true, 10);
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/Plugin.js b/deluge/ui/web/js/deluge-all/Plugin.js
new file mode 100644
index 0000000..af2cda4
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/Plugin.js
@@ -0,0 +1,106 @@
+/**
+ * Deluge.Plugin.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * @class Deluge.Plugin
+ * @extends Ext.util.Observable
+ */
+Deluge.Plugin = Ext.extend(Ext.util.Observable, {
+ /**
+ * The plugins name
+ * @property name
+ * @type {String}
+ */
+ name: null,
+
+ constructor: function(config) {
+ this.isDelugePlugin = true;
+ this.addEvents({
+ /**
+ * @event enabled
+ * @param {Plugin} plugin the plugin instance
+ */
+ enabled: true,
+
+ /**
+ * @event disabled
+ * @param {Plugin} plugin the plugin instance
+ */
+ disabled: true,
+ });
+ Deluge.Plugin.superclass.constructor.call(this, config);
+ },
+
+ /**
+ * Disables the plugin, firing the "{@link #disabled}" event and
+ * then executing the plugins clean up method onDisabled.
+ */
+ disable: function() {
+ this.fireEvent('disabled', this);
+ if (this.onDisable) this.onDisable();
+ },
+
+ /**
+ * Enables the plugin, firing the "{@link #enabled}" event and
+ * then executes the plugins setup method, onEnabled.
+ */
+ enable: function() {
+ deluge.client.reloadMethods();
+ this.fireEvent('enable', this);
+ if (this.onEnable) this.onEnable();
+ },
+
+ registerTorrentStatus: function(key, header, options) {
+ options = options || {};
+ var cc = options.colCfg || {},
+ sc = options.storeCfg || {};
+ sc = Ext.apply(sc, { name: key });
+ deluge.torrents.meta.fields.push(sc);
+ deluge.torrents.getStore().reader.onMetaChange(deluge.torrents.meta);
+
+ cc = Ext.apply(cc, {
+ header: header,
+ dataIndex: key,
+ });
+ var cols = deluge.torrents.columns.slice(0);
+ cols.push(cc);
+ deluge.torrents.colModel.setConfig(cols);
+ deluge.torrents.columns = cols;
+
+ Deluge.Keys.Grid.push(key);
+ deluge.torrents.getView().refresh(true);
+ },
+
+ deregisterTorrentStatus: function(key) {
+ var fields = [];
+ Ext.each(deluge.torrents.meta.fields, function(field) {
+ if (field.name != key) fields.push(field);
+ });
+ deluge.torrents.meta.fields = fields;
+ deluge.torrents.getStore().reader.onMetaChange(deluge.torrents.meta);
+
+ var cols = [];
+ Ext.each(deluge.torrents.columns, function(col) {
+ if (col.dataIndex != key) cols.push(col);
+ });
+ deluge.torrents.colModel.setConfig(cols);
+ deluge.torrents.columns = cols;
+
+ var keys = [];
+ Ext.each(Deluge.Keys.Grid, function(k) {
+ if (k == key) keys.push(k);
+ });
+ Deluge.Keys.Grid = keys;
+ deluge.torrents.getView().refresh(true);
+ },
+});
+
+Ext.ns('Deluge.plugins');
diff --git a/deluge/ui/web/js/deluge-all/RemoveWindow.js b/deluge/ui/web/js/deluge-all/RemoveWindow.js
new file mode 100644
index 0000000..a629008
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/RemoveWindow.js
@@ -0,0 +1,77 @@
+/**
+ * Deluge.RemoveWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * @class Deluge.RemoveWindow
+ * @extends Ext.Window
+ */
+Deluge.RemoveWindow = Ext.extend(Ext.Window, {
+ title: _('Remove Torrent'),
+ layout: 'fit',
+ width: 350,
+ height: 100,
+ constrainHeader: true,
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ closable: true,
+ iconCls: 'x-deluge-remove-window-icon',
+ plain: true,
+
+ bodyStyle: 'padding: 5px; padding-left: 10px;',
+ html: 'Are you sure you wish to remove the torrent (s)?',
+
+ initComponent: function() {
+ Deluge.RemoveWindow.superclass.initComponent.call(this);
+ this.addButton(_('Cancel'), this.onCancel, this);
+ this.addButton(_('Remove With Data'), this.onRemoveData, this);
+ this.addButton(_('Remove Torrent'), this.onRemove, this);
+ },
+
+ remove: function(removeData) {
+ deluge.client.core.remove_torrents(this.torrentIds, removeData, {
+ success: function(result) {
+ if (result == true) {
+ console.log(
+ 'Error(s) occured when trying to delete torrent(s).'
+ );
+ }
+ this.onRemoved(this.torrentIds);
+ },
+ scope: this,
+ torrentIds: this.torrentIds,
+ });
+ },
+
+ show: function(ids) {
+ Deluge.RemoveWindow.superclass.show.call(this);
+ this.torrentIds = ids;
+ },
+
+ onCancel: function() {
+ this.hide();
+ this.torrentIds = null;
+ },
+
+ onRemove: function() {
+ this.remove(false);
+ },
+
+ onRemoveData: function() {
+ this.remove(true);
+ },
+
+ onRemoved: function(torrentIds) {
+ deluge.events.fire('torrentsRemoved', torrentIds);
+ this.hide();
+ deluge.ui.update();
+ },
+});
+
+deluge.removeWindow = new Deluge.RemoveWindow();
diff --git a/deluge/ui/web/js/deluge-all/Sidebar.js b/deluge/ui/web/js/deluge-all/Sidebar.js
new file mode 100644
index 0000000..74c3ecb
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/Sidebar.js
@@ -0,0 +1,144 @@
+/**
+ * Deluge.Sidebar.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+// These are just so gen_gettext.py will pick up the strings
+// _('State')
+// _('Tracker Host')
+
+/**
+ * @class Deluge.Sidebar
+ * @author Damien Churchill <damoxc@gmail.com>
+ * @version 1.3
+ */
+Deluge.Sidebar = Ext.extend(Ext.Panel, {
+ // private
+ panels: {},
+
+ // private
+ selected: null,
+
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ id: 'sidebar',
+ region: 'west',
+ cls: 'deluge-sidebar',
+ title: _('Filters'),
+ layout: 'accordion',
+ split: true,
+ width: 200,
+ minSize: 100,
+ collapsible: true,
+ },
+ config
+ );
+ Deluge.Sidebar.superclass.constructor.call(this, config);
+ },
+
+ // private
+ initComponent: function() {
+ Deluge.Sidebar.superclass.initComponent.call(this);
+ deluge.events.on('disconnect', this.onDisconnect, this);
+ },
+
+ createFilter: function(filter, states) {
+ var panel = new Deluge.FilterPanel({
+ filter: filter,
+ });
+ panel.on('selectionchange', function(view, nodes) {
+ deluge.ui.update();
+ });
+ this.add(panel);
+
+ this.doLayout();
+ this.panels[filter] = panel;
+
+ panel.header.on('click', function(header) {
+ if (!deluge.config.sidebar_multiple_filters) {
+ deluge.ui.update();
+ }
+ if (!panel.list.getSelectionCount()) {
+ panel.list.select(0);
+ }
+ });
+ this.fireEvent('filtercreate', this, panel);
+
+ panel.updateStates(states);
+ this.fireEvent('afterfiltercreate', this, panel);
+ },
+
+ getFilter: function(filter) {
+ return this.panels[filter];
+ },
+
+ getFilterStates: function() {
+ var states = {};
+
+ if (deluge.config.sidebar_multiple_filters) {
+ // Grab the filters from each of the filter panels
+ this.items.each(function(panel) {
+ var state = panel.getState();
+ if (state == null) return;
+ states[panel.filterType] = state;
+ }, this);
+ } else {
+ var panel = this.getLayout().activeItem;
+ if (panel) {
+ var state = panel.getState();
+ if (!state == null) return;
+ states[panel.filterType] = state;
+ }
+ }
+
+ return states;
+ },
+
+ hasFilter: function(filter) {
+ return this.panels[filter] ? true : false;
+ },
+
+ // private
+ onDisconnect: function() {
+ for (var filter in this.panels) {
+ this.remove(this.panels[filter]);
+ }
+ this.panels = {};
+ this.selected = null;
+ },
+
+ onFilterSelect: function(selModel, rowIndex, record) {
+ deluge.ui.update();
+ },
+
+ update: function(filters) {
+ for (var filter in filters) {
+ var states = filters[filter];
+ if (Ext.getKeys(this.panels).indexOf(filter) > -1) {
+ this.panels[filter].updateStates(states);
+ } else {
+ this.createFilter(filter, states);
+ }
+ }
+
+ // Perform a cleanup of fitlers that are not enabled any more.
+ Ext.each(
+ Ext.keys(this.panels),
+ function(filter) {
+ if (Ext.keys(filters).indexOf(filter) == -1) {
+ // We need to remove the panel
+ this.remove(this.panels[filter]);
+ this.doLayout();
+ delete this.panels[filter];
+ }
+ },
+ this
+ );
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/Statusbar.js b/deluge/ui/web/js/deluge-all/Statusbar.js
new file mode 100644
index 0000000..c2327be
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/Statusbar.js
@@ -0,0 +1,362 @@
+/**
+ * Deluge.Statusbar.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge');
+
+Deluge.Statusbar = Ext.extend(Ext.ux.StatusBar, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ id: 'deluge-statusbar',
+ defaultIconCls: 'x-deluge-statusbar x-not-connected',
+ defaultText: _('Not Connected'),
+ },
+ config
+ );
+ Deluge.Statusbar.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.Statusbar.superclass.initComponent.call(this);
+
+ deluge.events.on('connect', this.onConnect, this);
+ deluge.events.on('disconnect', this.onDisconnect, this);
+ },
+
+ createButtons: function() {
+ this.buttons = this.add(
+ {
+ id: 'statusbar-connections',
+ text: ' ',
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-connections',
+ tooltip: _('Connections'),
+ menu: new Deluge.StatusbarMenu({
+ items: [
+ {
+ text: '50',
+ value: '50',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ {
+ text: '100',
+ value: '100',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ {
+ text: '200',
+ value: '200',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ {
+ text: '300',
+ value: '300',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ {
+ text: '500',
+ value: '500',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ {
+ text: _('Unlimited'),
+ value: '-1',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ '-',
+ {
+ text: _('Other'),
+ value: 'other',
+ group: 'max_connections_global',
+ checked: false,
+ },
+ ],
+ otherWin: {
+ title: _('Set Maximum Connections'),
+ },
+ }),
+ },
+ '-',
+ {
+ id: 'statusbar-downspeed',
+ text: ' ',
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-downloading',
+ tooltip: _('Download Speed'),
+ menu: new Deluge.StatusbarMenu({
+ items: [
+ {
+ value: '5',
+ text: _('5 KiB/s'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ {
+ value: '10',
+ text: _('10 KiB/s'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ {
+ value: '30',
+ text: _('30 KiB/s'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ {
+ value: '80',
+ text: _('80 KiB/s'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ {
+ value: '300',
+ text: _('300 KiB/s'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ {
+ value: '-1',
+ text: _('Unlimited'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ '-',
+ {
+ value: 'other',
+ text: _('Other'),
+ group: 'max_download_speed',
+ checked: false,
+ },
+ ],
+ otherWin: {
+ title: _('Set Maximum Download Speed'),
+ unit: _('KiB/s'),
+ },
+ }),
+ },
+ '-',
+ {
+ id: 'statusbar-upspeed',
+ text: ' ',
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-seeding',
+ tooltip: _('Upload Speed'),
+ menu: new Deluge.StatusbarMenu({
+ items: [
+ {
+ value: '5',
+ text: _('5 KiB/s'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ {
+ value: '10',
+ text: _('10 KiB/s'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ {
+ value: '30',
+ text: _('30 KiB/s'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ {
+ value: '80',
+ text: _('80 KiB/s'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ {
+ value: '300',
+ text: _('300 KiB/s'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ {
+ value: '-1',
+ text: _('Unlimited'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ '-',
+ {
+ value: 'other',
+ text: _('Other'),
+ group: 'max_upload_speed',
+ checked: false,
+ },
+ ],
+ otherWin: {
+ title: _('Set Maximum Upload Speed'),
+ unit: _('KiB/s'),
+ },
+ }),
+ },
+ '-',
+ {
+ id: 'statusbar-traffic',
+ text: ' ',
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-traffic',
+ tooltip: _('Protocol Traffic Download/Upload'),
+ handler: function() {
+ deluge.preferences.show();
+ deluge.preferences.selectPage('Network');
+ },
+ },
+ '-',
+ {
+ id: 'statusbar-externalip',
+ text: ' ',
+ cls: 'x-btn-text',
+ tooltip: _('External IP Address'),
+ },
+ '-',
+ {
+ id: 'statusbar-dht',
+ text: ' ',
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-dht',
+ tooltip: _('DHT Nodes'),
+ },
+ '-',
+ {
+ id: 'statusbar-freespace',
+ text: ' ',
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-freespace',
+ tooltip: _('Freespace in download folder'),
+ handler: function() {
+ deluge.preferences.show();
+ deluge.preferences.selectPage('Downloads');
+ },
+ }
+ );
+ this.created = true;
+ },
+
+ onConnect: function() {
+ this.setStatus({
+ iconCls: 'x-connected',
+ text: '',
+ });
+ if (!this.created) {
+ this.createButtons();
+ } else {
+ Ext.each(this.buttons, function(item) {
+ item.show();
+ item.enable();
+ });
+ }
+ this.doLayout();
+ },
+
+ onDisconnect: function() {
+ this.clearStatus({ useDefaults: true });
+ Ext.each(this.buttons, function(item) {
+ item.hide();
+ item.disable();
+ });
+ this.doLayout();
+ },
+
+ update: function(stats) {
+ if (!stats) return;
+
+ function addSpeed(val) {
+ return val + ' KiB/s';
+ }
+
+ var updateStat = function(name, config) {
+ var item = this.items.get('statusbar-' + name);
+ if (config.limit.value > 0) {
+ var value = config.value.formatter
+ ? config.value.formatter(config.value.value, true)
+ : config.value.value;
+ var limit = config.limit.formatter
+ ? config.limit.formatter(config.limit.value, true)
+ : config.limit.value;
+ var str = String.format(config.format, value, limit);
+ } else {
+ var str = config.value.formatter
+ ? config.value.formatter(config.value.value, true)
+ : config.value.value;
+ }
+ item.setText(str);
+
+ if (!item.menu) return;
+ item.menu.setValue(config.limit.value);
+ }.createDelegate(this);
+
+ updateStat('connections', {
+ value: { value: stats.num_connections },
+ limit: { value: stats.max_num_connections },
+ format: '{0} ({1})',
+ });
+
+ updateStat('downspeed', {
+ value: {
+ value: stats.download_rate,
+ formatter: Deluge.Formatters.speed,
+ },
+ limit: {
+ value: stats.max_download,
+ formatter: addSpeed,
+ },
+ format: '{0} ({1})',
+ });
+
+ updateStat('upspeed', {
+ value: {
+ value: stats.upload_rate,
+ formatter: Deluge.Formatters.speed,
+ },
+ limit: {
+ value: stats.max_upload,
+ formatter: addSpeed,
+ },
+ format: '{0} ({1})',
+ });
+
+ updateStat('traffic', {
+ value: {
+ value: stats.download_protocol_rate,
+ formatter: Deluge.Formatters.speed,
+ },
+ limit: {
+ value: stats.upload_protocol_rate,
+ formatter: Deluge.Formatters.speed,
+ },
+ format: '{0}/{1}',
+ });
+
+ this.items.get('statusbar-dht').setText(stats.dht_nodes);
+ this.items
+ .get('statusbar-freespace')
+ .setText(
+ stats.free_space >= 0 ? fsize(stats.free_space) : _('Error')
+ );
+ this.items
+ .get('statusbar-externalip')
+ .setText(
+ String.format(
+ _('<b>IP</b> {0}'),
+ stats.external_ip ? stats.external_ip : _('n/a')
+ )
+ );
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/StatusbarMenu.js b/deluge/ui/web/js/deluge-all/StatusbarMenu.js
new file mode 100644
index 0000000..b988253
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/StatusbarMenu.js
@@ -0,0 +1,79 @@
+/**
+ * Deluge.StatusbarMenu.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge');
+
+/**
+ * Menu that handles setting the statusbar limits correctly.
+ * @class Deluge.StatusbarMenu
+ * @extends Ext.menu.Menu
+ */
+Deluge.StatusbarMenu = Ext.extend(Ext.menu.Menu, {
+ initComponent: function() {
+ Deluge.StatusbarMenu.superclass.initComponent.call(this);
+ this.otherWin = new Deluge.OtherLimitWindow(
+ this.initialConfig.otherWin || {}
+ );
+
+ this.items.each(function(item) {
+ if (item.getXType() != 'menucheckitem') return;
+ if (item.value == 'other') {
+ item.on('click', this.onOtherClicked, this);
+ } else {
+ item.on('checkchange', this.onLimitChanged, this);
+ }
+ }, this);
+ },
+
+ setValue: function(value) {
+ var beenSet = false;
+ // set the new value
+ this.value = value = value == 0 ? -1 : value;
+
+ var other = null;
+ // uncheck all items
+ this.items.each(function(item) {
+ if (item.setChecked) {
+ item.suspendEvents();
+ if (item.value == value) {
+ item.setChecked(true);
+ beenSet = true;
+ } else {
+ item.setChecked(false);
+ }
+ item.resumeEvents();
+ }
+
+ if (item.value == 'other') other = item;
+ });
+
+ if (beenSet) return;
+
+ other.suspendEvents();
+ other.setChecked(true);
+ other.resumeEvents();
+ },
+
+ onLimitChanged: function(item, checked) {
+ if (!checked || item.value == 'other') return; // We do not care about unchecked or other.
+ var config = {};
+ config[item.group] = item.value;
+ deluge.client.core.set_config(config, {
+ success: function() {
+ deluge.ui.update();
+ },
+ });
+ },
+
+ onOtherClicked: function(item, e) {
+ this.otherWin.group = item.group;
+ this.otherWin.setValue(this.value);
+ this.otherWin.show();
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/Toolbar.js b/deluge/ui/web/js/deluge-all/Toolbar.js
new file mode 100644
index 0000000..d51818b
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/Toolbar.js
@@ -0,0 +1,206 @@
+/**
+ * Deluge.Toolbar.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * An extension of the <tt>Ext.Toolbar</tt> class that provides an extensible toolbar for Deluge.
+ * @class Deluge.Toolbar
+ * @extends Ext.Toolbar
+ */
+Deluge.Toolbar = Ext.extend(Ext.Toolbar, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ items: [
+ {
+ id: 'tbar-deluge-text',
+ text: _('Deluge'),
+ iconCls: 'x-deluge-main-panel',
+ handler: this.onAboutClick,
+ },
+ new Ext.Toolbar.Separator(),
+ {
+ id: 'create',
+ disabled: true,
+ hidden: true,
+ text: _('Create'),
+ iconCls: 'icon-create',
+ handler: this.onTorrentAction,
+ },
+ {
+ id: 'add',
+ disabled: true,
+ text: _('Add'),
+ iconCls: 'icon-add',
+ handler: this.onTorrentAdd,
+ },
+ {
+ id: 'remove',
+ disabled: true,
+ text: _('Remove'),
+ iconCls: 'icon-remove',
+ handler: this.onTorrentAction,
+ },
+ new Ext.Toolbar.Separator(),
+ {
+ id: 'pause',
+ disabled: true,
+ text: _('Pause'),
+ iconCls: 'icon-pause',
+ handler: this.onTorrentAction,
+ },
+ {
+ id: 'resume',
+ disabled: true,
+ text: _('Resume'),
+ iconCls: 'icon-resume',
+ handler: this.onTorrentAction,
+ },
+ new Ext.Toolbar.Separator(),
+ {
+ id: 'up',
+ cls: 'x-btn-text-icon',
+ disabled: true,
+ text: _('Up'),
+ iconCls: 'icon-up',
+ handler: this.onTorrentAction,
+ },
+ {
+ id: 'down',
+ disabled: true,
+ text: _('Down'),
+ iconCls: 'icon-down',
+ handler: this.onTorrentAction,
+ },
+ new Ext.Toolbar.Separator(),
+ {
+ id: 'preferences',
+ text: _('Preferences'),
+ iconCls: 'x-deluge-preferences',
+ handler: this.onPreferencesClick,
+ scope: this,
+ },
+ {
+ id: 'connectionman',
+ text: _('Connection Manager'),
+ iconCls: 'x-deluge-connection-manager',
+ handler: this.onConnectionManagerClick,
+ scope: this,
+ },
+ '->',
+ {
+ id: 'help',
+ iconCls: 'icon-help',
+ text: _('Help'),
+ handler: this.onHelpClick,
+ scope: this,
+ },
+ {
+ id: 'logout',
+ iconCls: 'icon-logout',
+ disabled: true,
+ text: _('Logout'),
+ handler: this.onLogout,
+ scope: this,
+ },
+ ],
+ },
+ config
+ );
+ Deluge.Toolbar.superclass.constructor.call(this, config);
+ },
+
+ connectedButtons: ['add', 'remove', 'pause', 'resume', 'up', 'down'],
+
+ initComponent: function() {
+ Deluge.Toolbar.superclass.initComponent.call(this);
+ deluge.events.on('connect', this.onConnect, this);
+ deluge.events.on('login', this.onLogin, this);
+ },
+
+ onConnect: function() {
+ Ext.each(
+ this.connectedButtons,
+ function(buttonId) {
+ this.items.get(buttonId).enable();
+ },
+ this
+ );
+ },
+
+ onDisconnect: function() {
+ Ext.each(
+ this.connectedButtons,
+ function(buttonId) {
+ this.items.get(buttonId).disable();
+ },
+ this
+ );
+ },
+
+ onLogin: function() {
+ this.items.get('logout').enable();
+ },
+
+ onLogout: function() {
+ this.items.get('logout').disable();
+ deluge.login.logout();
+ },
+
+ onConnectionManagerClick: function() {
+ deluge.connectionManager.show();
+ },
+
+ onHelpClick: function() {
+ window.open('http://dev.deluge-torrent.org/wiki/UserGuide');
+ },
+
+ onAboutClick: function() {
+ var about = new Deluge.about.AboutWindow();
+ about.show();
+ },
+
+ onPreferencesClick: function() {
+ deluge.preferences.show();
+ },
+
+ onTorrentAction: function(item) {
+ var selection = deluge.torrents.getSelections();
+ var ids = [];
+ Ext.each(selection, function(record) {
+ ids.push(record.id);
+ });
+
+ switch (item.id) {
+ case 'remove':
+ deluge.removeWindow.show(ids);
+ break;
+ case 'pause':
+ case 'resume':
+ deluge.client.core[item.id + '_torrent'](ids, {
+ success: function() {
+ deluge.ui.update();
+ },
+ });
+ break;
+ case 'up':
+ case 'down':
+ deluge.client.core['queue_' + item.id](ids, {
+ success: function() {
+ deluge.ui.update();
+ },
+ });
+ break;
+ }
+ },
+
+ onTorrentAdd: function() {
+ deluge.add.show();
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/TorrentGrid.js b/deluge/ui/web/js/deluge-all/TorrentGrid.js
new file mode 100644
index 0000000..b0e0c5e
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/TorrentGrid.js
@@ -0,0 +1,510 @@
+/**
+ * Deluge.TorrentGrid.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+(function() {
+ /* Renderers for the Torrent Grid */
+ function queueRenderer(value) {
+ return value == -1 ? '' : value + 1;
+ }
+ function torrentNameRenderer(value, p, r) {
+ return String.format(
+ '<div class="torrent-name x-deluge-{0}">{1}</div>',
+ r.data['state'].toLowerCase(),
+ value
+ );
+ }
+ function torrentSpeedRenderer(value) {
+ if (!value) return;
+ return fspeed(value);
+ }
+ function torrentLimitRenderer(value) {
+ if (value == -1) return '';
+ return fspeed(value * 1024.0);
+ }
+ function torrentProgressRenderer(value, p, r) {
+ value = new Number(value);
+ var progress = value;
+ var text = _(r.data['state']) + ' ' + value.toFixed(2) + '%';
+ if (this.style) {
+ var style = this.style;
+ } else {
+ var style = p.style;
+ }
+ var width = new Number(style.match(/\w+:\s*(\d+)\w+/)[1]);
+ return Deluge.progressBar(value, width - 8, text);
+ }
+ function seedsRenderer(value, p, r) {
+ if (r.data['total_seeds'] > -1) {
+ return String.format('{0} ({1})', value, r.data['total_seeds']);
+ } else {
+ return value;
+ }
+ }
+ function peersRenderer(value, p, r) {
+ if (r.data['total_peers'] > -1) {
+ return String.format('{0} ({1})', value, r.data['total_peers']);
+ } else {
+ return value;
+ }
+ }
+ function availRenderer(value, p, r) {
+ return value < 0 ? '&infin;' : parseFloat(new Number(value).toFixed(3));
+ }
+ function trackerRenderer(value, p, r) {
+ return String.format(
+ '<div style="background: url(' +
+ deluge.config.base +
+ 'tracker/{0}) no-repeat; padding-left: 20px;">{0}</div>',
+ value
+ );
+ }
+
+ function etaSorter(eta) {
+ return eta * -1;
+ }
+
+ function dateOrNever(date) {
+ return date > 0.0 ? fdate(date) : _('Never');
+ }
+
+ function timeOrInf(time) {
+ return time < 0 ? '&infin;' : ftime(time);
+ }
+
+ /**
+ * Deluge.TorrentGrid Class
+ *
+ * @author Damien Churchill <damoxc@gmail.com>
+ * @version 1.3
+ *
+ * @class Deluge.TorrentGrid
+ * @extends Ext.grid.GridPanel
+ * @constructor
+ * @param {Object} config Configuration options
+ */
+ Deluge.TorrentGrid = Ext.extend(Ext.grid.GridPanel, {
+ // object to store contained torrent ids
+ torrents: {},
+
+ columns: [
+ {
+ id: 'queue',
+ header: '#',
+ width: 30,
+ sortable: true,
+ renderer: queueRenderer,
+ dataIndex: 'queue',
+ },
+ {
+ id: 'name',
+ header: _('Name'),
+ width: 150,
+ sortable: true,
+ renderer: torrentNameRenderer,
+ dataIndex: 'name',
+ },
+ {
+ header: _('Size'),
+ width: 75,
+ sortable: true,
+ renderer: fsize,
+ dataIndex: 'total_wanted',
+ },
+ {
+ header: _('Progress'),
+ width: 150,
+ sortable: true,
+ renderer: torrentProgressRenderer,
+ dataIndex: 'progress',
+ },
+ {
+ header: _('Seeds'),
+ hidden: true,
+ width: 60,
+ sortable: true,
+ renderer: seedsRenderer,
+ dataIndex: 'num_seeds',
+ },
+ {
+ header: _('Peers'),
+ hidden: true,
+ width: 60,
+ sortable: true,
+ renderer: peersRenderer,
+ dataIndex: 'num_peers',
+ },
+ {
+ header: _('Down Speed'),
+ width: 80,
+ sortable: true,
+ renderer: torrentSpeedRenderer,
+ dataIndex: 'download_payload_rate',
+ },
+ {
+ header: _('Up Speed'),
+ width: 80,
+ sortable: true,
+ renderer: torrentSpeedRenderer,
+ dataIndex: 'upload_payload_rate',
+ },
+ {
+ header: _('ETA'),
+ width: 60,
+ sortable: true,
+ renderer: timeOrInf,
+ dataIndex: 'eta',
+ },
+ {
+ header: _('Ratio'),
+ hidden: true,
+ width: 60,
+ sortable: true,
+ renderer: availRenderer,
+ dataIndex: 'ratio',
+ },
+ {
+ header: _('Avail'),
+ hidden: true,
+ width: 60,
+ sortable: true,
+ renderer: availRenderer,
+ dataIndex: 'distributed_copies',
+ },
+ {
+ header: _('Added'),
+ hidden: true,
+ width: 80,
+ sortable: true,
+ renderer: fdate,
+ dataIndex: 'time_added',
+ },
+ {
+ header: _('Complete Seen'),
+ hidden: true,
+ width: 80,
+ sortable: true,
+ renderer: dateOrNever,
+ dataIndex: 'last_seen_complete',
+ },
+ {
+ header: _('Completed'),
+ hidden: true,
+ width: 80,
+ sortable: true,
+ renderer: dateOrNever,
+ dataIndex: 'completed_time',
+ },
+ {
+ header: _('Tracker'),
+ hidden: true,
+ width: 120,
+ sortable: true,
+ renderer: trackerRenderer,
+ dataIndex: 'tracker_host',
+ },
+ {
+ header: _('Download Folder'),
+ hidden: true,
+ width: 120,
+ sortable: true,
+ renderer: fplain,
+ dataIndex: 'download_location',
+ },
+ {
+ header: _('Owner'),
+ width: 80,
+ sortable: true,
+ renderer: fplain,
+ dataIndex: 'owner',
+ },
+ {
+ header: _('Public'),
+ hidden: true,
+ width: 80,
+ sortable: true,
+ renderer: fplain,
+ dataIndex: 'public',
+ },
+ {
+ header: _('Shared'),
+ hidden: true,
+ width: 80,
+ sortable: true,
+ renderer: fplain,
+ dataIndex: 'shared',
+ },
+ {
+ header: _('Downloaded'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: fsize,
+ dataIndex: 'total_done',
+ },
+ {
+ header: _('Uploaded'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: fsize,
+ dataIndex: 'total_uploaded',
+ },
+ {
+ header: _('Remaining'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: fsize,
+ dataIndex: 'total_remaining',
+ },
+ {
+ header: _('Down Limit'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: torrentLimitRenderer,
+ dataIndex: 'max_download_speed',
+ },
+ {
+ header: _('Up Limit'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: torrentLimitRenderer,
+ dataIndex: 'max_upload_speed',
+ },
+ {
+ header: _('Seeds:Peers'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: availRenderer,
+ dataIndex: 'seeds_peers_ratio',
+ },
+ {
+ header: _('Last Transfer'),
+ hidden: true,
+ width: 75,
+ sortable: true,
+ renderer: ftime,
+ dataIndex: 'time_since_transfer',
+ },
+ ],
+
+ meta: {
+ root: 'torrents',
+ idProperty: 'id',
+ fields: [
+ {
+ name: 'queue',
+ sortType: Deluge.data.SortTypes.asQueuePosition,
+ },
+ { name: 'name', sortType: Deluge.data.SortTypes.asName },
+ { name: 'total_wanted', type: 'int' },
+ { name: 'state' },
+ { name: 'progress', type: 'float' },
+ { name: 'num_seeds', type: 'int' },
+ { name: 'total_seeds', type: 'int' },
+ { name: 'num_peers', type: 'int' },
+ { name: 'total_peers', type: 'int' },
+ { name: 'download_payload_rate', type: 'int' },
+ { name: 'upload_payload_rate', type: 'int' },
+ { name: 'eta', type: 'int', sortType: etaSorter },
+ { name: 'ratio', type: 'float' },
+ { name: 'distributed_copies', type: 'float' },
+ { name: 'time_added', type: 'int' },
+ { name: 'tracker_host' },
+ { name: 'download_location' },
+ { name: 'total_done', type: 'int' },
+ { name: 'total_uploaded', type: 'int' },
+ { name: 'total_remaining', type: 'int' },
+ { name: 'max_download_speed', type: 'int' },
+ { name: 'max_upload_speed', type: 'int' },
+ { name: 'seeds_peers_ratio', type: 'float' },
+ { name: 'time_since_transfer', type: 'int' },
+ ],
+ },
+
+ keys: [
+ {
+ key: 'a',
+ ctrl: true,
+ stopEvent: true,
+ handler: function() {
+ deluge.torrents.getSelectionModel().selectAll();
+ },
+ },
+ {
+ key: [46],
+ stopEvent: true,
+ handler: function() {
+ ids = deluge.torrents.getSelectedIds();
+ deluge.removeWindow.show(ids);
+ },
+ },
+ ],
+
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ id: 'torrentGrid',
+ store: new Ext.data.JsonStore(this.meta),
+ columns: this.columns,
+ keys: this.keys,
+ region: 'center',
+ cls: 'deluge-torrents',
+ stripeRows: true,
+ autoExpandColumn: 'name',
+ autoExpandMin: 150,
+ deferredRender: false,
+ autoScroll: true,
+ stateful: true,
+ view: new Ext.ux.grid.BufferView({
+ rowHeight: 26,
+ scrollDelay: false,
+ }),
+ },
+ config
+ );
+ Deluge.TorrentGrid.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.TorrentGrid.superclass.initComponent.call(this);
+ deluge.events.on('torrentsRemoved', this.onTorrentsRemoved, this);
+ deluge.events.on('disconnect', this.onDisconnect, this);
+
+ this.on('rowcontextmenu', function(grid, rowIndex, e) {
+ e.stopEvent();
+ var selection = grid.getSelectionModel();
+ if (!selection.isSelected(rowIndex)) {
+ selection.selectRow(rowIndex);
+ }
+ deluge.menus.torrent.showAt(e.getPoint());
+ });
+ },
+
+ /**
+ * Returns the record representing the torrent at the specified index.
+ *
+ * @param index {int} The row index of the torrent you wish to retrieve.
+ * @return {Ext.data.Record} The record representing the torrent.
+ */
+ getTorrent: function(index) {
+ return this.getStore().getAt(index);
+ },
+
+ /**
+ * Returns the currently selected record.
+ * @ return {Array/Ext.data.Record} The record(s) representing the rows
+ */
+ getSelected: function() {
+ return this.getSelectionModel().getSelected();
+ },
+
+ /**
+ * Returns the currently selected records.
+ */
+ getSelections: function() {
+ return this.getSelectionModel().getSelections();
+ },
+
+ /**
+ * Return the currently selected torrent id.
+ * @return {String} The currently selected id.
+ */
+ getSelectedId: function() {
+ return this.getSelectionModel().getSelected().id;
+ },
+
+ /**
+ * Return the currently selected torrent ids.
+ * @return {Array} The currently selected ids.
+ */
+ getSelectedIds: function() {
+ var ids = [];
+ Ext.each(this.getSelectionModel().getSelections(), function(r) {
+ ids.push(r.id);
+ });
+ return ids;
+ },
+
+ update: function(torrents, wipe) {
+ var store = this.getStore();
+
+ // Need to perform a complete reload of the torrent grid.
+ if (wipe) {
+ store.removeAll();
+ this.torrents = {};
+ }
+
+ var newTorrents = [];
+
+ // Update and add any new torrents.
+ for (var t in torrents) {
+ var torrent = torrents[t];
+
+ if (this.torrents[t]) {
+ var record = store.getById(t);
+ record.beginEdit();
+ for (var k in torrent) {
+ if (record.get(k) != torrent[k]) {
+ record.set(k, torrent[k]);
+ }
+ }
+ record.endEdit();
+ } else {
+ var record = new Deluge.data.Torrent(torrent);
+ record.id = t;
+ this.torrents[t] = 1;
+ newTorrents.push(record);
+ }
+ }
+ store.add(newTorrents);
+
+ // Remove any torrents that should not be in the store.
+ store.each(function(record) {
+ if (!torrents[record.id]) {
+ store.remove(record);
+ delete this.torrents[record.id];
+ }
+ }, this);
+ store.commitChanges();
+
+ var sortState = store.getSortState();
+ if (!sortState) return;
+ store.sort(sortState.field, sortState.direction);
+ },
+
+ // private
+ onDisconnect: function() {
+ this.getStore().removeAll();
+ this.torrents = {};
+ },
+
+ // private
+ onTorrentsRemoved: function(torrentIds) {
+ var selModel = this.getSelectionModel();
+ Ext.each(
+ torrentIds,
+ function(torrentId) {
+ var record = this.getStore().getById(torrentId);
+ if (selModel.isSelected(record)) {
+ selModel.deselectRow(this.getStore().indexOf(record));
+ }
+ this.getStore().remove(record);
+ delete this.torrents[torrentId];
+ },
+ this
+ );
+ },
+ });
+ deluge.torrents = new Deluge.TorrentGrid();
+})();
diff --git a/deluge/ui/web/js/deluge-all/UI.js b/deluge/ui/web/js/deluge-all/UI.js
new file mode 100644
index 0000000..dec4850
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/UI.js
@@ -0,0 +1,292 @@
+/**
+ * Deluge.UI.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/** Dummy translation arrays so Torrent states are available for gettext.js and Translators.
+ *
+ * All entries in deluge.common.TORRENT_STATE should be added here.
+ *
+ * No need to import these, just simply use the `_()` function around a status variable.
+ */
+var TORRENT_STATE_TRANSLATION = [
+ _('All'),
+ _('Active'),
+ _('Allocating'),
+ _('Checking'),
+ _('Downloading'),
+ _('Seeding'),
+ _('Paused'),
+ _('Checking'),
+ _('Queued'),
+ _('Error'),
+];
+
+/**
+ * @static
+ * @class Deluge.UI
+ * The controller for the whole interface, that ties all the components
+ * together and handles the 2 second poll.
+ */
+deluge.ui = {
+ errorCount: 0,
+
+ filters: null,
+
+ /**
+ * @description Create all the interface components, the json-rpc client
+ * and set up various events that the UI will utilise.
+ */
+ initialize: function() {
+ deluge.add = new Deluge.add.AddWindow();
+ deluge.details = new Deluge.details.DetailsPanel();
+ deluge.connectionManager = new Deluge.ConnectionManager();
+ deluge.editTrackers = new Deluge.EditTrackersWindow();
+ deluge.login = new Deluge.LoginWindow();
+ deluge.preferences = new Deluge.preferences.PreferencesWindow();
+ deluge.sidebar = new Deluge.Sidebar();
+ deluge.statusbar = new Deluge.Statusbar();
+ deluge.toolbar = new Deluge.Toolbar();
+
+ this.detailsPanel = new Ext.Panel({
+ id: 'detailsPanel',
+ cls: 'detailsPanel',
+ region: 'south',
+ split: true,
+ height: 215,
+ minSize: 100,
+ collapsible: true,
+ layout: 'fit',
+ items: [deluge.details],
+ });
+
+ this.MainPanel = new Ext.Panel({
+ id: 'mainPanel',
+ iconCls: 'x-deluge-main-panel',
+ layout: 'border',
+ border: false,
+ tbar: deluge.toolbar,
+ items: [deluge.sidebar, this.detailsPanel, deluge.torrents],
+ bbar: deluge.statusbar,
+ });
+
+ this.Viewport = new Ext.Viewport({
+ layout: 'fit',
+ items: [this.MainPanel],
+ });
+
+ deluge.events.on('connect', this.onConnect, this);
+ deluge.events.on('disconnect', this.onDisconnect, this);
+ deluge.events.on('PluginDisabledEvent', this.onPluginDisabled, this);
+ deluge.events.on('PluginEnabledEvent', this.onPluginEnabled, this);
+ deluge.client = new Ext.ux.util.RpcClient({
+ url: deluge.config.base + 'json',
+ });
+
+ // enable all the already active plugins
+ for (var plugin in Deluge.pluginStore) {
+ plugin = Deluge.createPlugin(plugin);
+ plugin.enable();
+ deluge.plugins[plugin.name] = plugin;
+ }
+
+ // Initialize quicktips so all the tooltip configs start working.
+ Ext.QuickTips.init();
+
+ deluge.client.on(
+ 'connected',
+ function(e) {
+ deluge.login.show();
+ },
+ this,
+ { single: true }
+ );
+
+ this.update = this.update.createDelegate(this);
+ this.checkConnection = this.checkConnection.createDelegate(this);
+
+ this.originalTitle = document.title;
+ },
+
+ checkConnection: function() {
+ deluge.client.web.connected({
+ success: this.onConnectionSuccess,
+ failure: this.onConnectionError,
+ scope: this,
+ });
+ },
+
+ update: function() {
+ var filters = deluge.sidebar.getFilterStates();
+ this.oldFilters = this.filters;
+ this.filters = filters;
+
+ deluge.client.web.update_ui(Deluge.Keys.Grid, filters, {
+ success: this.onUpdate,
+ failure: this.onUpdateError,
+ scope: this,
+ });
+ deluge.details.update();
+ },
+
+ onConnectionError: function(error) {},
+
+ onConnectionSuccess: function(result) {
+ deluge.statusbar.setStatus({
+ iconCls: 'x-deluge-statusbar icon-ok',
+ text: _('Connection restored'),
+ });
+ clearInterval(this.checking);
+ if (!result) {
+ deluge.connectionManager.show();
+ }
+ },
+
+ onUpdateError: function(error) {
+ if (this.errorCount == 2) {
+ Ext.MessageBox.show({
+ title: _('Lost Connection'),
+ msg: _('The connection to the webserver has been lost!'),
+ buttons: Ext.MessageBox.OK,
+ icon: Ext.MessageBox.ERROR,
+ });
+ deluge.events.fire('disconnect');
+ deluge.statusbar.setStatus({
+ text: _('Lost connection to webserver'),
+ });
+ this.checking = setInterval(this.checkConnection, 2000);
+ }
+ this.errorCount++;
+ },
+
+ /**
+ * @static
+ * @private
+ * Updates the various components in the interface.
+ */
+ onUpdate: function(data) {
+ if (!data['connected']) {
+ deluge.connectionManager.disconnect(true);
+ return;
+ }
+
+ if (deluge.config.show_session_speed) {
+ document.title =
+ 'D: ' +
+ fsize_short(data['stats'].download_rate, true) +
+ ' U: ' +
+ fsize_short(data['stats'].upload_rate, true) +
+ ' - ' +
+ this.originalTitle;
+ }
+ if (Ext.areObjectsEqual(this.filters, this.oldFilters)) {
+ deluge.torrents.update(data['torrents']);
+ } else {
+ deluge.torrents.update(data['torrents'], true);
+ }
+ deluge.statusbar.update(data['stats']);
+ deluge.sidebar.update(data['filters']);
+ this.errorCount = 0;
+ },
+
+ /**
+ * @static
+ * @private
+ * Start the Deluge UI polling the server and update the interface.
+ */
+ onConnect: function() {
+ if (!this.running) {
+ this.running = setInterval(this.update, 2000);
+ this.update();
+ }
+ deluge.client.web.get_plugins({
+ success: this.onGotPlugins,
+ scope: this,
+ });
+ },
+
+ /**
+ * @static
+ * @private
+ */
+ onDisconnect: function() {
+ this.stop();
+ },
+
+ onGotPlugins: function(plugins) {
+ Ext.each(
+ plugins.enabled_plugins,
+ function(plugin) {
+ if (deluge.plugins[plugin]) return;
+ deluge.client.web.get_plugin_resources(plugin, {
+ success: this.onGotPluginResources,
+ scope: this,
+ });
+ },
+ this
+ );
+ },
+
+ onPluginEnabled: function(pluginName) {
+ if (deluge.plugins[pluginName]) {
+ deluge.plugins[pluginName].enable();
+ } else {
+ deluge.client.web.get_plugin_resources(pluginName, {
+ success: this.onGotPluginResources,
+ scope: this,
+ });
+ }
+ },
+
+ onGotPluginResources: function(resources) {
+ var scripts = Deluge.debug
+ ? resources.debug_scripts
+ : resources.scripts;
+ Ext.each(
+ scripts,
+ function(script) {
+ Ext.ux.JSLoader({
+ url: deluge.config.base + script,
+ onLoad: this.onPluginLoaded,
+ pluginName: resources.name,
+ });
+ },
+ this
+ );
+ },
+
+ onPluginDisabled: function(pluginName) {
+ if (deluge.plugins[pluginName]) deluge.plugins[pluginName].disable();
+ },
+
+ onPluginLoaded: function(options) {
+ // This could happen if the plugin has multiple scripts
+ if (!Deluge.hasPlugin(options.pluginName)) return;
+
+ // Enable the plugin
+ plugin = Deluge.createPlugin(options.pluginName);
+ plugin.enable();
+ deluge.plugins[plugin.name] = plugin;
+ },
+
+ /**
+ * @static
+ * Stop the Deluge UI polling the server and clear the interface.
+ */
+ stop: function() {
+ if (this.running) {
+ clearInterval(this.running);
+ this.running = false;
+ deluge.torrents.getStore().removeAll();
+ }
+ },
+};
+
+Ext.onReady(function(e) {
+ deluge.ui.initialize();
+});
diff --git a/deluge/ui/web/js/deluge-all/add/.order b/deluge/ui/web/js/deluge-all/add/.order
new file mode 100644
index 0000000..dbd1ab9
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/add/.order
@@ -0,0 +1 @@
++ Window.js
diff --git a/deluge/ui/web/js/deluge-all/add/AddWindow.js b/deluge/ui/web/js/deluge-all/add/AddWindow.js
new file mode 100644
index 0000000..89803f3
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/add/AddWindow.js
@@ -0,0 +1,321 @@
+/**
+ * Deluge.add.AddWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.namespace('Deluge.add');
+
+// This override allows file upload buttons to contain icons
+Ext.override(Ext.ux.form.FileUploadField, {
+ onRender: function(ct, position) {
+ Ext.ux.form.FileUploadField.superclass.onRender.call(
+ this,
+ ct,
+ position
+ );
+
+ this.wrap = this.el.wrap({ cls: 'x-form-field-wrap x-form-file-wrap' });
+ this.el.addClass('x-form-file-text');
+ this.el.dom.removeAttribute('name');
+ this.createFileInput();
+
+ var btnCfg = Ext.applyIf(this.buttonCfg || {}, {
+ text: this.buttonText,
+ });
+ this.button = new Ext.Button(
+ Ext.apply(btnCfg, {
+ renderTo: this.wrap,
+ cls:
+ 'x-form-file-btn' +
+ (btnCfg.iconCls ? ' x-btn-text-icon' : ''),
+ })
+ );
+
+ if (this.buttonOnly) {
+ this.el.hide();
+ this.wrap.setWidth(this.button.getEl().getWidth());
+ }
+
+ this.bindListeners();
+ this.resizeEl = this.positionEl = this.wrap;
+ },
+});
+
+Deluge.add.AddWindow = Ext.extend(Deluge.add.Window, {
+ title: _('Add Torrents'),
+ layout: 'border',
+ width: 470,
+ height: 450,
+ bodyStyle: 'padding: 10px 5px;',
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ closable: true,
+ plain: true,
+ iconCls: 'x-deluge-add-window-icon',
+
+ initComponent: function() {
+ Deluge.add.AddWindow.superclass.initComponent.call(this);
+
+ this.addButton(_('Cancel'), this.onCancelClick, this);
+ this.addButton(_('Add'), this.onAddClick, this);
+
+ function torrentRenderer(value, p, r) {
+ if (r.data['info_hash']) {
+ return String.format(
+ '<div class="x-deluge-add-torrent-name">{0}</div>',
+ value
+ );
+ } else {
+ return String.format(
+ '<div class="x-deluge-add-torrent-name-loading">{0}</div>',
+ value
+ );
+ }
+ }
+
+ this.list = new Ext.list.ListView({
+ store: new Ext.data.SimpleStore({
+ fields: [
+ { name: 'info_hash', mapping: 1 },
+ { name: 'text', mapping: 2 },
+ ],
+ id: 0,
+ }),
+ columns: [
+ {
+ id: 'torrent',
+ width: 150,
+ sortable: true,
+ renderer: torrentRenderer,
+ dataIndex: 'text',
+ },
+ ],
+ stripeRows: true,
+ singleSelect: true,
+ listeners: {
+ selectionchange: {
+ fn: this.onSelect,
+ scope: this,
+ },
+ },
+ hideHeaders: true,
+ autoExpandColumn: 'torrent',
+ height: '100%',
+ autoScroll: true,
+ });
+
+ this.add({
+ region: 'center',
+ items: [this.list],
+ border: false,
+ bbar: new Ext.Toolbar({
+ items: [
+ {
+ id: 'fileUploadForm',
+ xtype: 'form',
+ layout: 'fit',
+ baseCls: 'x-plain',
+ fileUpload: true,
+ items: [
+ {
+ buttonOnly: true,
+ xtype: 'fileuploadfield',
+ id: 'torrentFile',
+ name: 'file',
+ multiple: true,
+ buttonCfg: {
+ iconCls: 'x-deluge-add-file',
+ text: _('File'),
+ },
+ listeners: {
+ scope: this,
+ fileselected: this.onFileSelected,
+ },
+ },
+ ],
+ },
+ {
+ text: _('Url'),
+ iconCls: 'icon-add-url',
+ handler: this.onUrl,
+ scope: this,
+ },
+ {
+ text: _('Infohash'),
+ iconCls: 'icon-add-magnet',
+ hidden: true,
+ disabled: true,
+ },
+ '->',
+ {
+ text: _('Remove'),
+ iconCls: 'icon-remove',
+ handler: this.onRemove,
+ scope: this,
+ },
+ ],
+ }),
+ });
+
+ this.fileUploadForm = Ext.getCmp('fileUploadForm').getForm();
+ this.optionsPanel = this.add(new Deluge.add.OptionsPanel());
+ this.on('hide', this.onHide, this);
+ this.on('show', this.onShow, this);
+ },
+
+ clear: function() {
+ this.list.getStore().removeAll();
+ this.optionsPanel.clear();
+ // Reset upload form so handler fires when a canceled file is reselected
+ this.fileUploadForm.reset();
+ },
+
+ onAddClick: function() {
+ var torrents = [];
+ if (!this.list) return;
+ this.list.getStore().each(function(r) {
+ var id = r.get('info_hash');
+ torrents.push({
+ path: this.optionsPanel.getFilename(id),
+ options: this.optionsPanel.getOptions(id),
+ });
+ }, this);
+
+ deluge.client.web.add_torrents(torrents, {
+ success: function(result) {},
+ });
+ this.clear();
+ this.hide();
+ },
+
+ onCancelClick: function() {
+ this.clear();
+ this.hide();
+ },
+
+ onFile: function() {
+ if (!this.file) this.file = new Deluge.add.FileWindow();
+ this.file.show();
+ },
+
+ onHide: function() {
+ this.optionsPanel.setActiveTab(0);
+ this.optionsPanel.files.setDisabled(true);
+ this.optionsPanel.form.setDisabled(true);
+ },
+
+ onRemove: function() {
+ if (!this.list.getSelectionCount()) return;
+ var torrent = this.list.getSelectedRecords()[0];
+ if (!torrent) return;
+ this.list.getStore().remove(torrent);
+ this.optionsPanel.clear();
+
+ if (this.torrents && this.torrents[torrent.id])
+ delete this.torrents[torrent.id];
+ },
+
+ onSelect: function(list, selections) {
+ if (selections.length) {
+ var record = this.list.getRecord(selections[0]);
+ this.optionsPanel.setTorrent(record.get('info_hash'));
+ } else {
+ this.optionsPanel.files.setDisabled(true);
+ this.optionsPanel.form.setDisabled(true);
+ }
+ },
+
+ onShow: function() {
+ if (!this.url) {
+ this.url = new Deluge.add.UrlWindow();
+ this.url.on('beforeadd', this.onTorrentBeforeAdd, this);
+ this.url.on('add', this.onTorrentAdd, this);
+ }
+
+ this.optionsPanel.form.getDefaults();
+ },
+
+ onFileSelected: function() {
+ if (this.fileUploadForm.isValid()) {
+ var torrentIds = [];
+ var files = this.fileUploadForm.findField('torrentFile').value;
+ var randomId = this.createTorrentId();
+ Array.prototype.forEach.call(
+ files,
+ function(file, i) {
+ // Append index for batch of unique torrentIds.
+ var torrentId = randomId + i.toString();
+ torrentIds.push(torrentId);
+ this.onTorrentBeforeAdd(torrentId, file.name);
+ }.bind(this)
+ );
+ this.fileUploadForm.submit({
+ url: deluge.config.base + 'upload',
+ waitMsg: _('Uploading your torrent...'),
+ success: this.onUploadSuccess,
+ scope: this,
+ torrentIds: torrentIds,
+ });
+ }
+ },
+
+ onUploadSuccess: function(fp, upload) {
+ if (!upload.result.success) {
+ this.clear();
+ return;
+ }
+
+ upload.result.files.forEach(
+ function(filename, i) {
+ deluge.client.web.get_torrent_info(filename, {
+ success: this.onGotInfo,
+ scope: this,
+ filename: filename,
+ torrentId: upload.options.torrentIds[i],
+ });
+ }.bind(this)
+ );
+ this.fileUploadForm.reset();
+ },
+
+ onGotInfo: function(info, obj, response, request) {
+ info.filename = request.options.filename;
+ torrentId = request.options.torrentId;
+ this.onTorrentAdd(torrentId, info);
+ },
+
+ onTorrentBeforeAdd: function(torrentId, text) {
+ var store = this.list.getStore();
+ store.loadData([[torrentId, null, text]], true);
+ },
+
+ onTorrentAdd: function(torrentId, info) {
+ var r = this.list.getStore().getById(torrentId);
+ if (!info) {
+ Ext.MessageBox.show({
+ title: _('Error'),
+ msg: _('Not a valid torrent'),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ this.list.getStore().remove(r);
+ } else {
+ r.set('info_hash', info['info_hash']);
+ r.set('text', info['name']);
+ this.list.getStore().commitChanges();
+ this.optionsPanel.addTorrent(info);
+ this.list.select(r);
+ }
+ },
+
+ onUrl: function(button, event) {
+ this.url.show();
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/add/FilesTab.js b/deluge/ui/web/js/deluge-all/add/FilesTab.js
new file mode 100644
index 0000000..a433ad6
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/add/FilesTab.js
@@ -0,0 +1,99 @@
+/**
+ * Deluge.add.FilesTab.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge.add');
+
+/**
+ * @class Deluge.add.FilesTab
+ * @extends Ext.ux.tree.TreeGrid
+ */
+Deluge.add.FilesTab = Ext.extend(Ext.ux.tree.TreeGrid, {
+ layout: 'fit',
+ title: _('Files'),
+
+ autoScroll: false,
+ animate: false,
+ border: false,
+ disabled: true,
+ rootVisible: false,
+
+ columns: [
+ {
+ header: _('Filename'),
+ width: 295,
+ dataIndex: 'filename',
+ },
+ {
+ header: _('Size'),
+ width: 60,
+ dataIndex: 'size',
+ tpl: new Ext.XTemplate('{size:this.fsize}', {
+ fsize: function(v) {
+ return fsize(v);
+ },
+ }),
+ },
+ {
+ header: _('Download'),
+ width: 65,
+ dataIndex: 'download',
+ tpl: new Ext.XTemplate('{download:this.format}', {
+ format: function(v) {
+ return (
+ '<div rel="chkbox" class="x-grid3-check-col' +
+ (v ? '-on' : '') +
+ '"> </div>'
+ );
+ },
+ }),
+ },
+ ],
+
+ initComponent: function() {
+ Deluge.add.FilesTab.superclass.initComponent.call(this);
+ this.on('click', this.onNodeClick, this);
+ },
+
+ clearFiles: function() {
+ var root = this.getRootNode();
+ if (!root.hasChildNodes()) return;
+ root.cascade(function(node) {
+ if (!node.parentNode || !node.getOwnerTree()) return;
+ node.remove();
+ });
+ },
+
+ setDownload: function(node, value, suppress) {
+ node.attributes.download = value;
+ node.ui.updateColumns();
+
+ if (node.isLeaf()) {
+ if (!suppress) {
+ return this.fireEvent('fileschecked', [node], value, !value);
+ }
+ } else {
+ var nodes = [node];
+ node.cascade(function(n) {
+ n.attributes.download = value;
+ n.ui.updateColumns();
+ nodes.push(n);
+ }, this);
+ if (!suppress) {
+ return this.fireEvent('fileschecked', nodes, value, !value);
+ }
+ }
+ },
+
+ onNodeClick: function(node, e) {
+ var el = new Ext.Element(e.target);
+ if (el.getAttribute('rel') == 'chkbox') {
+ this.setDownload(node, !node.attributes.download);
+ }
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/add/Infohash.js b/deluge/ui/web/js/deluge-all/add/Infohash.js
new file mode 100644
index 0000000..0105e02
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/add/Infohash.js
@@ -0,0 +1,10 @@
+/**
+ * Deluge.add.Infohash.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Ext.deluge.add');
diff --git a/deluge/ui/web/js/deluge-all/add/OptionsPanel.js b/deluge/ui/web/js/deluge-all/add/OptionsPanel.js
new file mode 100644
index 0000000..3dfb6f8
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/add/OptionsPanel.js
@@ -0,0 +1,146 @@
+/**
+ * Deluge.add.OptionsPanel.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge.add');
+
+Deluge.add.OptionsPanel = Ext.extend(Ext.TabPanel, {
+ torrents: {},
+
+ // layout options
+ region: 'south',
+ border: false,
+ activeTab: 0,
+ height: 265,
+
+ initComponent: function() {
+ Deluge.add.OptionsPanel.superclass.initComponent.call(this);
+ this.files = this.add(new Deluge.add.FilesTab());
+ this.form = this.add(new Deluge.add.OptionsTab());
+
+ this.files.on('fileschecked', this.onFilesChecked, this);
+ },
+
+ addTorrent: function(torrent) {
+ this.torrents[torrent['info_hash']] = torrent;
+ var fileIndexes = {};
+ this.walkFileTree(
+ torrent['files_tree'],
+ function(filename, type, entry, parent) {
+ if (type != 'file') return;
+ fileIndexes[entry.index] = entry.download;
+ },
+ this
+ );
+
+ var priorities = [];
+ Ext.each(Ext.keys(fileIndexes), function(index) {
+ priorities[index] = fileIndexes[index];
+ });
+
+ var oldId = this.form.optionsManager.changeId(
+ torrent['info_hash'],
+ true
+ );
+ this.form.optionsManager.setDefault('file_priorities', priorities);
+ this.form.optionsManager.changeId(oldId, true);
+ },
+
+ clear: function() {
+ this.files.clearFiles();
+ this.form.optionsManager.resetAll();
+ },
+
+ getFilename: function(torrentId) {
+ return this.torrents[torrentId]['filename'];
+ },
+
+ getOptions: function(torrentId) {
+ var oldId = this.form.optionsManager.changeId(torrentId, true);
+ var options = this.form.optionsManager.get();
+ this.form.optionsManager.changeId(oldId, true);
+ Ext.each(options['file_priorities'], function(priority, index) {
+ options['file_priorities'][index] = priority ? 1 : 0;
+ });
+ return options;
+ },
+
+ setTorrent: function(torrentId) {
+ if (!torrentId) return;
+
+ this.torrentId = torrentId;
+ this.form.optionsManager.changeId(torrentId);
+
+ this.files.clearFiles();
+ var root = this.files.getRootNode();
+ var priorities = this.form.optionsManager.get('file_priorities');
+
+ this.form.setDisabled(false);
+
+ if (this.torrents[torrentId]['files_tree']) {
+ this.walkFileTree(
+ this.torrents[torrentId]['files_tree'],
+ function(filename, type, entry, parentNode) {
+ var node = new Ext.tree.TreeNode({
+ download: entry.index ? priorities[entry.index] : true,
+ filename: filename,
+ fileindex: entry.index,
+ leaf: type != 'dir',
+ size: entry.length,
+ });
+ parentNode.appendChild(node);
+ if (type == 'dir') return node;
+ },
+ this,
+ root
+ );
+ root.firstChild.expand();
+ this.files.setDisabled(false);
+ this.files.show();
+ } else {
+ // Files tab is empty so show options tab
+ this.form.show();
+ this.files.setDisabled(true);
+ }
+ },
+
+ walkFileTree: function(files, callback, scope, parentNode) {
+ for (var filename in files.contents) {
+ var entry = files.contents[filename];
+ var type = entry.type;
+
+ if (scope) {
+ var ret = callback.apply(scope, [
+ filename,
+ type,
+ entry,
+ parentNode,
+ ]);
+ } else {
+ var ret = callback(filename, type, entry, parentNode);
+ }
+
+ if (type == 'dir') this.walkFileTree(entry, callback, scope, ret);
+ }
+ },
+
+ onFilesChecked: function(nodes, newValue, oldValue) {
+ Ext.each(
+ nodes,
+ function(node) {
+ if (node.attributes.fileindex < 0) return;
+ var priorities = this.form.optionsManager.get(
+ 'file_priorities'
+ );
+ priorities[node.attributes.fileindex] = newValue;
+ this.form.optionsManager.update('file_priorities', priorities);
+ },
+ this
+ );
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/add/OptionsTab.js b/deluge/ui/web/js/deluge-all/add/OptionsTab.js
new file mode 100644
index 0000000..e897b17
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/add/OptionsTab.js
@@ -0,0 +1,217 @@
+/**
+ * Deluge.add.OptionsPanel.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge.add');
+
+/**
+ * @class Deluge.add.OptionsTab
+ * @extends Ext.form.FormPanel
+ */
+Deluge.add.OptionsTab = Ext.extend(Ext.form.FormPanel, {
+ title: _('Options'),
+ height: 170,
+ border: false,
+ bodyStyle: 'padding: 5px',
+ disabled: true,
+ labelWidth: 1,
+
+ initComponent: function() {
+ Deluge.add.OptionsTab.superclass.initComponent.call(this);
+
+ this.optionsManager = new Deluge.MultiOptionsManager();
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ title: _('Download Folder'),
+ border: false,
+ autoHeight: true,
+ defaultType: 'textfield',
+ labelWidth: 1,
+ fieldLabel: '',
+ style: 'padding: 5px 0; margin-bottom: 0;',
+ });
+ this.optionsManager.bind(
+ 'download_location',
+ fieldset.add({
+ fieldLabel: '',
+ name: 'download_location',
+ anchor: '95%',
+ labelSeparator: '',
+ })
+ );
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ title: _('Move Completed Folder'),
+ border: false,
+ autoHeight: true,
+ defaultType: 'togglefield',
+ labelWidth: 1,
+ fieldLabel: '',
+ style: 'padding: 5px 0; margin-bottom: 0;',
+ });
+ var field = fieldset.add({
+ fieldLabel: '',
+ name: 'move_completed_path',
+ anchor: '98%',
+ });
+ this.optionsManager.bind('move_completed', field.toggle);
+ this.optionsManager.bind('move_completed_path', field.input);
+
+ var panel = this.add({
+ border: false,
+ layout: 'column',
+ defaultType: 'fieldset',
+ });
+
+ fieldset = panel.add({
+ title: _('Bandwidth'),
+ border: false,
+ autoHeight: true,
+ bodyStyle: 'padding: 2px 5px',
+ labelWidth: 105,
+ width: 200,
+ defaultType: 'spinnerfield',
+ style: 'padding-right: 10px;',
+ });
+ this.optionsManager.bind(
+ 'max_download_speed',
+ fieldset.add({
+ fieldLabel: _('Max Down Speed'),
+ name: 'max_download_speed',
+ width: 60,
+ })
+ );
+ this.optionsManager.bind(
+ 'max_upload_speed',
+ fieldset.add({
+ fieldLabel: _('Max Up Speed'),
+ name: 'max_upload_speed',
+ width: 60,
+ })
+ );
+ this.optionsManager.bind(
+ 'max_connections',
+ fieldset.add({
+ fieldLabel: _('Max Connections'),
+ name: 'max_connections',
+ width: 60,
+ })
+ );
+ this.optionsManager.bind(
+ 'max_upload_slots',
+ fieldset.add({
+ fieldLabel: _('Max Upload Slots'),
+ name: 'max_upload_slots',
+ width: 60,
+ })
+ );
+
+ fieldset = panel.add({
+ // title: _('General'),
+ border: false,
+ autoHeight: true,
+ defaultType: 'checkbox',
+ });
+ this.optionsManager.bind(
+ 'add_paused',
+ fieldset.add({
+ name: 'add_paused',
+ boxLabel: _('Add In Paused State'),
+ fieldLabel: '',
+ labelSeparator: '',
+ })
+ );
+ this.optionsManager.bind(
+ 'prioritize_first_last_pieces',
+ fieldset.add({
+ name: 'prioritize_first_last_pieces',
+ boxLabel: _('Prioritize First/Last Pieces'),
+ fieldLabel: '',
+ labelSeparator: '',
+ })
+ );
+ this.optionsManager.bind(
+ 'sequential_download',
+ fieldset.add({
+ name: 'sequential_download',
+ boxLabel: _('Sequential Download'),
+ fieldLabel: '',
+ labelSeparator: '',
+ })
+ );
+ this.optionsManager.bind(
+ 'seed_mode',
+ fieldset.add({
+ name: 'seed_mode',
+ boxLabel: _('Skip File Hash Check'),
+ fieldLabel: '',
+ labelSeparator: '',
+ })
+ );
+ this.optionsManager.bind(
+ 'super_seeding',
+ fieldset.add({
+ name: 'super_seeding',
+ boxLabel: _('Super Seed'),
+ fieldLabel: '',
+ labelSeparator: '',
+ })
+ );
+ this.optionsManager.bind(
+ 'pre_allocate_storage',
+ fieldset.add({
+ name: 'pre_allocate_storage',
+ boxLabel: _('Preallocate Disk Space'),
+ fieldLabel: '',
+ labelSeparator: '',
+ })
+ );
+ },
+
+ getDefaults: function() {
+ var keys = [
+ 'add_paused',
+ 'pre_allocate_storage',
+ 'download_location',
+ 'max_connections_per_torrent',
+ 'max_download_speed_per_torrent',
+ 'move_completed',
+ 'move_completed_path',
+ 'max_upload_slots_per_torrent',
+ 'max_upload_speed_per_torrent',
+ 'prioritize_first_last_pieces',
+ 'sequential_download',
+ ];
+
+ deluge.client.core.get_config_values(keys, {
+ success: function(config) {
+ var options = {
+ file_priorities: [],
+ add_paused: config.add_paused,
+ sequential_download: config.sequential_download,
+ pre_allocate_storage: config.pre_allocate_storage,
+ download_location: config.download_location,
+ move_completed: config.move_completed,
+ move_completed_path: config.move_completed_path,
+ max_connections: config.max_connections_per_torrent,
+ max_download_speed: config.max_download_speed_per_torrent,
+ max_upload_slots: config.max_upload_slots_per_torrent,
+ max_upload_speed: config.max_upload_speed_per_torrent,
+ prioritize_first_last_pieces:
+ config.prioritize_first_last_pieces,
+ seed_mode: false,
+ super_seeding: false,
+ };
+ this.optionsManager.options = options;
+ this.optionsManager.resetAll();
+ },
+ scope: this,
+ });
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/add/UrlWindow.js b/deluge/ui/web/js/deluge-all/add/UrlWindow.js
new file mode 100644
index 0000000..d3a9a69
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/add/UrlWindow.js
@@ -0,0 +1,98 @@
+/**
+ * Deluge.add.UrlWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.namespace('Deluge.add');
+Deluge.add.UrlWindow = Ext.extend(Deluge.add.Window, {
+ title: _('Add from Url'),
+ modal: true,
+ plain: true,
+ layout: 'fit',
+ width: 350,
+ height: 155,
+
+ buttonAlign: 'center',
+ closeAction: 'hide',
+ bodyStyle: 'padding: 10px 5px;',
+ iconCls: 'x-deluge-add-url-window-icon',
+
+ initComponent: function() {
+ Deluge.add.UrlWindow.superclass.initComponent.call(this);
+ this.addButton(_('Add'), this.onAddClick, this);
+
+ var form = this.add({
+ xtype: 'form',
+ defaultType: 'textfield',
+ baseCls: 'x-plain',
+ labelWidth: 55,
+ });
+
+ this.urlField = form.add({
+ fieldLabel: _('Url'),
+ id: 'url',
+ name: 'url',
+ width: '97%',
+ });
+ this.urlField.on('specialkey', this.onAdd, this);
+
+ this.cookieField = form.add({
+ fieldLabel: _('Cookies'),
+ id: 'cookies',
+ name: 'cookies',
+ width: '97%',
+ });
+ this.cookieField.on('specialkey', this.onAdd, this);
+ },
+
+ onAddClick: function(field, e) {
+ if (
+ (field.id == 'url' || field.id == 'cookies') &&
+ e.getKey() != e.ENTER
+ )
+ return;
+
+ var field = this.urlField;
+ var url = field.getValue();
+ var cookies = this.cookieField.getValue();
+ var torrentId = this.createTorrentId();
+
+ if (url.indexOf('magnet:?') == 0 && url.indexOf('xt=urn:btih') > -1) {
+ deluge.client.web.get_magnet_info(url, {
+ success: this.onGotInfo,
+ scope: this,
+ filename: url,
+ torrentId: torrentId,
+ });
+ } else {
+ deluge.client.web.download_torrent_from_url(url, cookies, {
+ success: this.onDownload,
+ scope: this,
+ torrentId: torrentId,
+ });
+ }
+
+ this.hide();
+ this.urlField.setValue('');
+ this.fireEvent('beforeadd', torrentId, url);
+ },
+
+ onDownload: function(filename, obj, resp, req) {
+ deluge.client.web.get_torrent_info(filename, {
+ success: this.onGotInfo,
+ scope: this,
+ filename: filename,
+ torrentId: req.options.torrentId,
+ });
+ },
+
+ onGotInfo: function(info, obj, response, request) {
+ info['filename'] = request.options.filename;
+ this.fireEvent('add', request.options.torrentId, info);
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/add/Window.js b/deluge/ui/web/js/deluge-all/add/Window.js
new file mode 100644
index 0000000..206b3ee
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/add/Window.js
@@ -0,0 +1,29 @@
+/**
+ * Deluge.add.Window.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge.add');
+
+/**
+ * @class Deluge.add.Window
+ * @extends Ext.Window
+ * Base class for an add Window
+ */
+Deluge.add.Window = Ext.extend(Ext.Window, {
+ initComponent: function() {
+ Deluge.add.Window.superclass.initComponent.call(this);
+ this.addEvents('beforeadd', 'add');
+ },
+
+ /**
+ * Create an id for the torrent before we have any info about it.
+ */
+ createTorrentId: function() {
+ return new Date().getTime().toString();
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/data/.order b/deluge/ui/web/js/deluge-all/data/.order
new file mode 100644
index 0000000..f9befc4
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/data/.order
@@ -0,0 +1 @@
++ SortTypes.js
diff --git a/deluge/ui/web/js/deluge-all/data/PeerRecord.js b/deluge/ui/web/js/deluge-all/data/PeerRecord.js
new file mode 100644
index 0000000..7f33769
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/data/PeerRecord.js
@@ -0,0 +1,53 @@
+/**
+ * Deluge.data.PeerRecord.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.data');
+
+/**
+ * Deluge.data.Peer record
+ *
+ * @author Damien Churchill <damoxc@gmail.com>
+ * @version 1.3
+ *
+ * @class Deluge.data.Peer
+ * @extends Ext.data.Record
+ * @constructor
+ * @param {Object} data The peer data
+ */
+Deluge.data.Peer = Ext.data.Record.create([
+ {
+ name: 'country',
+ type: 'string',
+ },
+ {
+ name: 'ip',
+ type: 'string',
+ sortType: Deluge.data.SortTypes.asIPAddress,
+ },
+ {
+ name: 'client',
+ type: 'string',
+ },
+ {
+ name: 'progress',
+ type: 'float',
+ },
+ {
+ name: 'down_speed',
+ type: 'int',
+ },
+ {
+ name: 'up_speed',
+ type: 'int',
+ },
+ {
+ name: 'seed',
+ type: 'int',
+ },
+]);
diff --git a/deluge/ui/web/js/deluge-all/data/SortTypes.js b/deluge/ui/web/js/deluge-all/data/SortTypes.js
new file mode 100644
index 0000000..199f895
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/data/SortTypes.js
@@ -0,0 +1,37 @@
+/**
+ * Deluge.data.SortTypes.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.data');
+
+/**
+ * Common sort functions that can be used for data Stores.
+ *
+ * @author Damien Churchill <damoxc@gmail.com>
+ * @version 1.3
+ *
+ * @class Deluge.data.SortTypes
+ * @singleton
+ */
+Deluge.data.SortTypes = {
+ // prettier-ignore
+ asIPAddress: function(value) {
+ var d = value.match(
+ /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\:(\d+)/
+ );
+ return ((+d[1] * 256 + (+d[2])) * 256 + (+d[3])) * 256 + (+d[4]);
+ },
+
+ asQueuePosition: function(value) {
+ return value > -1 ? value : Number.MAX_VALUE;
+ },
+
+ asName: function(value) {
+ return String(value).toLowerCase();
+ },
+};
diff --git a/deluge/ui/web/js/deluge-all/data/TorrentRecord.js b/deluge/ui/web/js/deluge-all/data/TorrentRecord.js
new file mode 100644
index 0000000..e510234
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/data/TorrentRecord.js
@@ -0,0 +1,121 @@
+/**
+ * Deluge.data.TorrentRecord.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.data');
+
+/**
+ * Deluge.data.Torrent record
+ *
+ * @author Damien Churchill <damoxc@gmail.com>
+ * @version 1.3
+ *
+ * @class Deluge.data.Torrent
+ * @extends Ext.data.Record
+ * @constructor
+ * @param {Object} data The torrents data
+ */
+Deluge.data.Torrent = Ext.data.Record.create([
+ {
+ name: 'queue',
+ type: 'int',
+ },
+ {
+ name: 'name',
+ type: 'string',
+ sortType: Deluge.data.SortTypes.asName,
+ },
+ {
+ name: 'total_wanted',
+ type: 'int',
+ },
+ {
+ name: 'state',
+ type: 'string',
+ },
+ {
+ name: 'progress',
+ type: 'int',
+ },
+ {
+ name: 'num_seeds',
+ type: 'int',
+ },
+ {
+ name: 'total_seeds',
+ type: 'int',
+ },
+ {
+ name: 'num_peers',
+ type: 'int',
+ },
+ {
+ name: 'total_peers',
+ type: 'int',
+ },
+ {
+ name: 'download_payload_rate',
+ type: 'int',
+ },
+ {
+ name: 'upload_payload_rate',
+ type: 'int',
+ },
+ {
+ name: 'eta',
+ type: 'int',
+ },
+ {
+ name: 'ratio',
+ type: 'float',
+ },
+ {
+ name: 'distributed_copies',
+ type: 'float',
+ },
+ {
+ name: 'time_added',
+ type: 'int',
+ },
+ {
+ name: 'tracker_host',
+ type: 'string',
+ },
+ {
+ name: 'save_path',
+ type: 'string',
+ },
+ {
+ name: 'total_done',
+ type: 'int',
+ },
+ {
+ name: 'total_uploaded',
+ type: 'int',
+ },
+ {
+ name: 'total_remaining',
+ type: 'int',
+ },
+ {
+ name: 'max_download_speed',
+ type: 'int',
+ },
+ {
+ name: 'max_upload_speed',
+ type: 'int',
+ },
+ {
+ name: 'seeds_peers_ratio',
+ type: 'float',
+ },
+ {
+ name: 'time_since_transfer',
+ type: 'int',
+ },
+]);
diff --git a/deluge/ui/web/js/deluge-all/details/DetailsPanel.js b/deluge/ui/web/js/deluge-all/details/DetailsPanel.js
new file mode 100644
index 0000000..1c51de4
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/details/DetailsPanel.js
@@ -0,0 +1,81 @@
+/**
+ * Deluge.details.DetailsPanel.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.details');
+
+/**
+ * @class Deluge.details.DetailsPanel
+ */
+Deluge.details.DetailsPanel = Ext.extend(Ext.TabPanel, {
+ id: 'torrentDetails',
+ activeTab: 0,
+
+ initComponent: function() {
+ Deluge.details.DetailsPanel.superclass.initComponent.call(this);
+ this.add(new Deluge.details.StatusTab());
+ this.add(new Deluge.details.DetailsTab());
+ this.add(new Deluge.details.FilesTab());
+ this.add(new Deluge.details.PeersTab());
+ this.add(new Deluge.details.OptionsTab());
+ },
+
+ clear: function() {
+ this.items.each(function(panel) {
+ if (panel.clear) {
+ panel.clear.defer(100, panel);
+ panel.disable();
+ }
+ });
+ },
+
+ update: function(tab) {
+ var torrent = deluge.torrents.getSelected();
+ if (!torrent) {
+ this.clear();
+ return;
+ }
+
+ this.items.each(function(tab) {
+ if (tab.disabled) tab.enable();
+ });
+
+ tab = tab || this.getActiveTab();
+ if (tab.update) tab.update(torrent.id);
+ },
+
+ /* Event Handlers */
+
+ // We need to add the events in onRender since Deluge.Torrents has not been created yet.
+ onRender: function(ct, position) {
+ Deluge.details.DetailsPanel.superclass.onRender.call(
+ this,
+ ct,
+ position
+ );
+ deluge.events.on('disconnect', this.clear, this);
+ deluge.torrents.on('rowclick', this.onTorrentsClick, this);
+ this.on('tabchange', this.onTabChange, this);
+
+ deluge.torrents.getSelectionModel().on(
+ 'selectionchange',
+ function(selModel) {
+ if (!selModel.hasSelection()) this.clear();
+ },
+ this
+ );
+ },
+
+ onTabChange: function(panel, tab) {
+ this.update(tab);
+ },
+
+ onTorrentsClick: function(grid, rowIndex, e) {
+ this.update();
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/details/DetailsTab.js b/deluge/ui/web/js/deluge-all/details/DetailsTab.js
new file mode 100644
index 0000000..84929ae
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/details/DetailsTab.js
@@ -0,0 +1,98 @@
+/**
+ * Deluge.Details.Details.js
+ * The details tab displayed in the details panel.
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Deluge.details.DetailsTab = Ext.extend(Ext.Panel, {
+ title: _('Details'),
+
+ fields: {},
+ autoScroll: true,
+ queuedItems: {},
+
+ oldData: {},
+
+ initComponent: function() {
+ Deluge.details.DetailsTab.superclass.initComponent.call(this);
+ this.addItem('torrent_name', _('Name:'));
+ this.addItem('hash', _('Hash:'));
+ this.addItem('path', _('Download Folder:'));
+ this.addItem('size', _('Total Size:'));
+ this.addItem('files', _('Total Files:'));
+ this.addItem('comment', _('Comment:'));
+ this.addItem('status', _('Status:'));
+ this.addItem('tracker', _('Tracker:'));
+ this.addItem('creator', _('Created By:'));
+ },
+
+ onRender: function(ct, position) {
+ Deluge.details.DetailsTab.superclass.onRender.call(this, ct, position);
+ this.body.setStyle('padding', '10px');
+ this.dl = Ext.DomHelper.append(this.body, { tag: 'dl' }, true);
+
+ for (var id in this.queuedItems) {
+ this.doAddItem(id, this.queuedItems[id]);
+ }
+ },
+
+ addItem: function(id, label) {
+ if (!this.rendered) {
+ this.queuedItems[id] = label;
+ } else {
+ this.doAddItem(id, label);
+ }
+ },
+
+ // private
+ doAddItem: function(id, label) {
+ Ext.DomHelper.append(this.dl, { tag: 'dt', cls: id, html: label });
+ this.fields[id] = Ext.DomHelper.append(
+ this.dl,
+ { tag: 'dd', cls: id, html: '' },
+ true
+ );
+ },
+
+ clear: function() {
+ if (!this.fields) return;
+ for (var k in this.fields) {
+ this.fields[k].dom.innerHTML = '';
+ }
+ this.oldData = {};
+ },
+
+ update: function(torrentId) {
+ deluge.client.web.get_torrent_status(torrentId, Deluge.Keys.Details, {
+ success: this.onRequestComplete,
+ scope: this,
+ torrentId: torrentId,
+ });
+ },
+
+ onRequestComplete: function(torrent, request, response, options) {
+ var data = {
+ torrent_name: torrent.name,
+ hash: options.options.torrentId,
+ path: torrent.download_location,
+ size: fsize(torrent.total_size),
+ files: torrent.num_files,
+ status: torrent.message,
+ tracker: torrent.tracker_host,
+ comment: torrent.comment,
+ creator: torrent.creator,
+ };
+
+ for (var field in this.fields) {
+ if (!Ext.isDefined(data[field])) continue; // This is a field we are not responsible for.
+ if (data[field] == this.oldData[field]) continue;
+ this.fields[field].dom.innerHTML = Ext.escapeHTML(data[field]);
+ }
+ this.oldData = data;
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/details/FilesTab.js b/deluge/ui/web/js/deluge-all/details/FilesTab.js
new file mode 100644
index 0000000..3a212fa
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/details/FilesTab.js
@@ -0,0 +1,233 @@
+/**
+ * Deluge.details.FilesTab.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Deluge.details.FilesTab = Ext.extend(Ext.ux.tree.TreeGrid, {
+ title: _('Files'),
+
+ rootVisible: false,
+
+ columns: [
+ {
+ header: _('Filename'),
+ width: 330,
+ dataIndex: 'filename',
+ },
+ {
+ header: _('Size'),
+ width: 150,
+ dataIndex: 'size',
+ tpl: new Ext.XTemplate('{size:this.fsize}', {
+ fsize: function(v) {
+ return fsize(v);
+ },
+ }),
+ },
+ {
+ xtype: 'tgrendercolumn',
+ header: _('Progress'),
+ width: 150,
+ dataIndex: 'progress',
+ renderer: function(v) {
+ var progress = v * 100;
+ return Deluge.progressBar(
+ progress,
+ this.col.width,
+ progress.toFixed(2) + '%',
+ 0
+ );
+ },
+ },
+ {
+ header: _('Priority'),
+ width: 150,
+ dataIndex: 'priority',
+ tpl: new Ext.XTemplate(
+ '<tpl if="!isNaN(priority)">' +
+ '<div class="{priority:this.getClass}">' +
+ '{priority:this.getName}' +
+ '</div></tpl>',
+ {
+ getClass: function(v) {
+ return FILE_PRIORITY_CSS[v];
+ },
+
+ getName: function(v) {
+ return _(FILE_PRIORITY[v]);
+ },
+ }
+ ),
+ },
+ ],
+
+ selModel: new Ext.tree.MultiSelectionModel(),
+
+ initComponent: function() {
+ Deluge.details.FilesTab.superclass.initComponent.call(this);
+ this.setRootNode(new Ext.tree.TreeNode({ text: _('Files') }));
+ },
+
+ clear: function() {
+ var root = this.getRootNode();
+ if (!root.hasChildNodes()) return;
+ root.cascade(function(node) {
+ var parentNode = node.parentNode;
+ if (!parentNode) return;
+ if (!parentNode.ownerTree) return;
+ parentNode.removeChild(node);
+ });
+ },
+
+ createFileTree: function(files) {
+ function walk(files, parentNode) {
+ for (var file in files.contents) {
+ var item = files.contents[file];
+ if (item.type == 'dir') {
+ walk(
+ item,
+ parentNode.appendChild(
+ new Ext.tree.TreeNode({
+ text: file,
+ filename: file,
+ size: item.size,
+ progress: item.progress,
+ priority: item.priority,
+ })
+ )
+ );
+ } else {
+ parentNode.appendChild(
+ new Ext.tree.TreeNode({
+ text: file,
+ filename: file,
+ fileIndex: item.index,
+ size: item.size,
+ progress: item.progress,
+ priority: item.priority,
+ leaf: true,
+ iconCls: 'x-deluge-file',
+ uiProvider: Ext.ux.tree.TreeGridNodeUI,
+ })
+ );
+ }
+ }
+ }
+ var root = this.getRootNode();
+ walk(files, root);
+ root.firstChild.expand();
+ },
+
+ update: function(torrentId) {
+ if (this.torrentId != torrentId) {
+ this.clear();
+ this.torrentId = torrentId;
+ }
+
+ deluge.client.web.get_torrent_files(torrentId, {
+ success: this.onRequestComplete,
+ scope: this,
+ torrentId: torrentId,
+ });
+ },
+
+ updateFileTree: function(files) {
+ function walk(files, parentNode) {
+ for (var file in files.contents) {
+ var item = files.contents[file];
+ var node = parentNode.findChild('filename', file);
+ node.attributes.size = item.size;
+ node.attributes.progress = item.progress;
+ node.attributes.priority = item.priority;
+ node.ui.updateColumns();
+ if (item.type == 'dir') {
+ walk(item, node);
+ }
+ }
+ }
+ walk(files, this.getRootNode());
+ },
+
+ onRender: function(ct, position) {
+ Deluge.details.FilesTab.superclass.onRender.call(this, ct, position);
+ deluge.menus.filePriorities.on('itemclick', this.onItemClick, this);
+ this.on('contextmenu', this.onContextMenu, this);
+ this.sorter = new Ext.tree.TreeSorter(this, {
+ folderSort: true,
+ });
+ },
+
+ onContextMenu: function(node, e) {
+ e.stopEvent();
+ var selModel = this.getSelectionModel();
+ if (selModel.getSelectedNodes().length < 2) {
+ selModel.clearSelections();
+ node.select();
+ }
+ deluge.menus.filePriorities.showAt(e.getPoint());
+ },
+
+ onItemClick: function(baseItem, e) {
+ switch (baseItem.id) {
+ case 'expandAll':
+ this.expandAll();
+ break;
+ default:
+ var indexes = {};
+ var walk = function(node) {
+ if (Ext.isEmpty(node.attributes.fileIndex)) return;
+ indexes[node.attributes.fileIndex] =
+ node.attributes.priority;
+ };
+ this.getRootNode().cascade(walk);
+
+ var nodes = this.getSelectionModel().getSelectedNodes();
+ Ext.each(nodes, function(node) {
+ if (!node.isLeaf()) {
+ var setPriorities = function(node) {
+ if (Ext.isEmpty(node.attributes.fileIndex)) return;
+ indexes[node.attributes.fileIndex] =
+ baseItem.filePriority;
+ };
+ node.cascade(setPriorities);
+ } else if (!Ext.isEmpty(node.attributes.fileIndex)) {
+ indexes[node.attributes.fileIndex] =
+ baseItem.filePriority;
+ return;
+ }
+ });
+
+ var priorities = new Array(Ext.keys(indexes).length);
+ for (var index in indexes) {
+ priorities[index] = indexes[index];
+ }
+
+ deluge.client.core.set_torrent_options(
+ [this.torrentId],
+ { file_priorities: priorities },
+ {
+ success: function() {
+ Ext.each(nodes, function(node) {
+ node.setColumnValue(3, baseItem.filePriority);
+ });
+ },
+ scope: this,
+ }
+ );
+ break;
+ }
+ },
+
+ onRequestComplete: function(files, options) {
+ if (!this.getRootNode().hasChildNodes()) {
+ this.createFileTree(files);
+ } else {
+ this.updateFileTree(files);
+ }
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/details/OptionsTab.js b/deluge/ui/web/js/deluge-all/details/OptionsTab.js
new file mode 100644
index 0000000..b11486b
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/details/OptionsTab.js
@@ -0,0 +1,417 @@
+/**
+ * Deluge.details.OptionsTab.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ autoScroll: true,
+ bodyStyle: 'padding: 5px;',
+ border: false,
+ cls: 'x-deluge-options',
+ defaults: {
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ },
+ deferredRender: false,
+ layout: 'column',
+ title: _('Options'),
+ },
+ config
+ );
+ Deluge.details.OptionsTab.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.details.OptionsTab.superclass.initComponent.call(this);
+
+ (this.fieldsets = {}), (this.fields = {});
+ this.optionsManager = new Deluge.MultiOptionsManager({
+ options: {
+ max_download_speed: -1,
+ max_upload_speed: -1,
+ max_connections: -1,
+ max_upload_slots: -1,
+ auto_managed: false,
+ stop_at_ratio: false,
+ stop_ratio: 2.0,
+ remove_at_ratio: false,
+ move_completed: false,
+ move_completed_path: '',
+ private: false,
+ prioritize_first_last: false,
+ super_seeding: false,
+ },
+ });
+
+ /*
+ * Bandwidth Options
+ */
+ this.fieldsets.bandwidth = this.add({
+ xtype: 'fieldset',
+ defaultType: 'spinnerfield',
+ bodyStyle: 'padding: 5px',
+
+ layout: 'table',
+ layoutConfig: { columns: 3 },
+ labelWidth: 150,
+
+ style: 'margin-left: 10px; margin-right: 5px; padding: 5px',
+ title: _('Bandwidth'),
+ width: 250,
+ });
+
+ /*
+ * Max Download Speed
+ */
+ this.fieldsets.bandwidth.add({
+ xtype: 'label',
+ text: _('Max Download Speed:'),
+ forId: 'max_download_speed',
+ cls: 'x-deluge-options-label',
+ });
+ this.fields.max_download_speed = this.fieldsets.bandwidth.add({
+ id: 'max_download_speed',
+ name: 'max_download_speed',
+ width: 70,
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 1,
+ minValue: -1,
+ maxValue: 99999,
+ },
+ });
+ this.fieldsets.bandwidth.add({
+ xtype: 'label',
+ text: _('KiB/s'),
+ style: 'margin-left: 10px',
+ });
+
+ /*
+ * Max Upload Speed
+ */
+ this.fieldsets.bandwidth.add({
+ xtype: 'label',
+ text: _('Max Upload Speed:'),
+ forId: 'max_upload_speed',
+ cls: 'x-deluge-options-label',
+ });
+ this.fields.max_upload_speed = this.fieldsets.bandwidth.add({
+ id: 'max_upload_speed',
+ name: 'max_upload_speed',
+ width: 70,
+ value: -1,
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 1,
+ minValue: -1,
+ maxValue: 99999,
+ },
+ });
+ this.fieldsets.bandwidth.add({
+ xtype: 'label',
+ text: _('KiB/s'),
+ style: 'margin-left: 10px',
+ });
+
+ /*
+ * Max Connections
+ */
+ this.fieldsets.bandwidth.add({
+ xtype: 'label',
+ text: _('Max Connections:'),
+ forId: 'max_connections',
+ cls: 'x-deluge-options-label',
+ });
+ this.fields.max_connections = this.fieldsets.bandwidth.add({
+ id: 'max_connections',
+ name: 'max_connections',
+ width: 70,
+ value: -1,
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ },
+ colspan: 2,
+ });
+
+ /*
+ * Max Upload Slots
+ */
+ this.fieldsets.bandwidth.add({
+ xtype: 'label',
+ text: _('Max Upload Slots:'),
+ forId: 'max_upload_slots',
+ cls: 'x-deluge-options-label',
+ });
+ this.fields.max_upload_slots = this.fieldsets.bandwidth.add({
+ id: 'max_upload_slots',
+ name: 'max_upload_slots',
+ width: 70,
+ value: -1,
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ },
+ colspan: 2,
+ });
+
+ /*
+ * Queue Options
+ */
+ this.fieldsets.queue = this.add({
+ xtype: 'fieldset',
+ title: _('Queue'),
+ style: 'margin-left: 5px; margin-right: 5px; padding: 5px',
+ width: 210,
+
+ layout: 'table',
+ layoutConfig: { columns: 2 },
+ labelWidth: 0,
+
+ defaults: {
+ fieldLabel: '',
+ labelSeparator: '',
+ },
+ });
+
+ this.fields.auto_managed = this.fieldsets.queue.add({
+ xtype: 'checkbox',
+ fieldLabel: '',
+ labelSeparator: '',
+ name: 'is_auto_managed',
+ boxLabel: _('Auto Managed'),
+ width: 200,
+ colspan: 2,
+ });
+
+ this.fields.stop_at_ratio = this.fieldsets.queue.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ id: 'stop_at_ratio',
+ width: 120,
+ boxLabel: _('Stop seed at ratio:'),
+ handler: this.onStopRatioChecked,
+ scope: this,
+ });
+
+ this.fields.stop_ratio = this.fieldsets.queue.add({
+ xtype: 'spinnerfield',
+ id: 'stop_ratio',
+ name: 'stop_ratio',
+ disabled: true,
+ width: 50,
+ value: 2.0,
+ strategy: {
+ xtype: 'number',
+ minValue: -1,
+ maxValue: 99999,
+ incrementValue: 0.1,
+ alternateIncrementValue: 1,
+ decimalPrecision: 1,
+ },
+ });
+
+ this.fields.remove_at_ratio = this.fieldsets.queue.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ id: 'remove_at_ratio',
+ ctCls: 'x-deluge-indent-checkbox',
+ bodyStyle: 'padding-left: 10px',
+ boxLabel: _('Remove at ratio'),
+ disabled: true,
+ colspan: 2,
+ });
+
+ this.fields.move_completed = this.fieldsets.queue.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ id: 'move_completed',
+ boxLabel: _('Move Completed:'),
+ colspan: 2,
+ handler: this.onMoveCompletedChecked,
+ scope: this,
+ });
+
+ this.fields.move_completed_path = this.fieldsets.queue.add({
+ xtype: 'textfield',
+ fieldLabel: '',
+ id: 'move_completed_path',
+ colspan: 3,
+ bodyStyle: 'margin-left: 20px',
+ width: 180,
+ disabled: true,
+ });
+
+ /*
+ * General Options
+ */
+ this.rightColumn = this.add({
+ border: false,
+ autoHeight: true,
+ style: 'margin-left: 5px',
+ width: 210,
+ });
+
+ this.fieldsets.general = this.rightColumn.add({
+ xtype: 'fieldset',
+ autoHeight: true,
+ defaultType: 'checkbox',
+ title: _('General'),
+ layout: 'form',
+ });
+
+ this.fields['private'] = this.fieldsets.general.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Private'),
+ id: 'private',
+ disabled: true,
+ });
+
+ this.fields.prioritize_first_last = this.fieldsets.general.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Prioritize First/Last'),
+ id: 'prioritize_first_last',
+ });
+
+ this.fields.super_seeding = this.fieldsets.general.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Super Seeding'),
+ id: 'super_seeding',
+ });
+
+ // Bind the fields so the options manager can manage them.
+ for (var id in this.fields) {
+ this.optionsManager.bind(id, this.fields[id]);
+ }
+
+ /*
+ * Buttons
+ */
+ this.buttonPanel = this.rightColumn.add({
+ layout: 'hbox',
+ xtype: 'panel',
+ border: false,
+ });
+
+ /*
+ * Edit Trackers button
+ */
+ this.buttonPanel.add({
+ id: 'edit_trackers',
+ xtype: 'button',
+ text: _('Edit Trackers'),
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-edit-trackers',
+ border: false,
+ width: 100,
+ handler: this.onEditTrackers,
+ scope: this,
+ });
+
+ /*
+ * Apply button
+ */
+ this.buttonPanel.add({
+ id: 'apply',
+ xtype: 'button',
+ text: _('Apply'),
+ style: 'margin-left: 10px;',
+ border: false,
+ width: 100,
+ handler: this.onApply,
+ scope: this,
+ });
+ },
+
+ onRender: function(ct, position) {
+ Deluge.details.OptionsTab.superclass.onRender.call(this, ct, position);
+
+ // This is another hack I think, so keep an eye out here when upgrading.
+ this.layout = new Ext.layout.ColumnLayout();
+ this.layout.setContainer(this);
+ this.doLayout();
+ },
+
+ clear: function() {
+ if (this.torrentId == null) return;
+ this.torrentId = null;
+ this.optionsManager.changeId(null);
+ },
+
+ reset: function() {
+ if (this.torrentId) this.optionsManager.reset();
+ },
+
+ update: function(torrentId) {
+ if (this.torrentId && !torrentId) this.clear(); // we want to clear the pane if we get a null torrent torrentIds
+
+ if (!torrentId) return; // We do not care about null torrentIds.
+
+ if (this.torrentId != torrentId) {
+ this.torrentId = torrentId;
+ this.optionsManager.changeId(torrentId);
+ }
+ deluge.client.web.get_torrent_status(torrentId, Deluge.Keys.Options, {
+ success: this.onRequestComplete,
+ scope: this,
+ });
+ },
+
+ onApply: function() {
+ var changed = this.optionsManager.getDirty();
+ deluge.client.core.set_torrent_options([this.torrentId], changed, {
+ success: function() {
+ this.optionsManager.commit();
+ },
+ scope: this,
+ });
+ },
+
+ onEditTrackers: function() {
+ deluge.editTrackers.show();
+ },
+
+ onMoveCompletedChecked: function(checkbox, checked) {
+ this.fields.move_completed_path.setDisabled(!checked);
+
+ if (!checked) return;
+ this.fields.move_completed_path.focus();
+ },
+
+ onStopRatioChecked: function(checkbox, checked) {
+ this.fields.remove_at_ratio.setDisabled(!checked);
+ this.fields.stop_ratio.setDisabled(!checked);
+ },
+
+ onRequestComplete: function(torrent, options) {
+ this.fields['private'].setValue(torrent['private']);
+ this.fields['private'].setDisabled(true);
+ delete torrent['private'];
+ torrent['auto_managed'] = torrent['is_auto_managed'];
+ torrent['prioritize_first_last_pieces'] =
+ torrent['prioritize_first_last'];
+ this.optionsManager.setDefault(torrent);
+ var stop_at_ratio = this.optionsManager.get('stop_at_ratio');
+ this.fields.remove_at_ratio.setDisabled(!stop_at_ratio);
+ this.fields.stop_ratio.setDisabled(!stop_at_ratio);
+ this.fields.move_completed_path.setDisabled(
+ !this.optionsManager.get('move_completed')
+ );
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/details/PeersTab.js b/deluge/ui/web/js/deluge-all/details/PeersTab.js
new file mode 100644
index 0000000..515e533
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/details/PeersTab.js
@@ -0,0 +1,166 @@
+/**
+ * Deluge.details.PeersTab.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+(function() {
+ function flagRenderer(value) {
+ if (!value.replace(' ', '').replace(' ', '')) {
+ return '';
+ }
+ return String.format(
+ '<img src="{0}flag/{1}" />',
+ deluge.config.base,
+ value
+ );
+ }
+ function peerAddressRenderer(value, p, record) {
+ var seed =
+ record.data['seed'] == 1024 ? 'x-deluge-seed' : 'x-deluge-peer';
+ // Modify display of IPv6 to include brackets
+ var peer_ip = value.split(':');
+ if (peer_ip.length > 2) {
+ var port = peer_ip.pop();
+ var ip = peer_ip.join(':');
+ value = '[' + ip + ']:' + port;
+ }
+ return String.format('<div class="{0}">{1}</div>', seed, value);
+ }
+ function peerProgressRenderer(value) {
+ var progress = (value * 100).toFixed(0);
+ return Deluge.progressBar(progress, this.width - 8, progress + '%');
+ }
+
+ Deluge.details.PeersTab = Ext.extend(Ext.grid.GridPanel, {
+ // fast way to figure out if we have a peer already.
+ peers: {},
+
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ title: _('Peers'),
+ cls: 'x-deluge-peers',
+ store: new Ext.data.Store({
+ reader: new Ext.data.JsonReader(
+ {
+ idProperty: 'ip',
+ root: 'peers',
+ },
+ Deluge.data.Peer
+ ),
+ }),
+ columns: [
+ {
+ header: '&nbsp;',
+ width: 30,
+ sortable: true,
+ renderer: flagRenderer,
+ dataIndex: 'country',
+ },
+ {
+ header: _('Address'),
+ width: 125,
+ sortable: true,
+ renderer: peerAddressRenderer,
+ dataIndex: 'ip',
+ },
+ {
+ header: _('Client'),
+ width: 125,
+ sortable: true,
+ renderer: fplain,
+ dataIndex: 'client',
+ },
+ {
+ header: _('Progress'),
+ width: 150,
+ sortable: true,
+ renderer: peerProgressRenderer,
+ dataIndex: 'progress',
+ },
+ {
+ header: _('Down Speed'),
+ width: 100,
+ sortable: true,
+ renderer: fspeed,
+ dataIndex: 'down_speed',
+ },
+ {
+ header: _('Up Speed'),
+ width: 100,
+ sortable: true,
+ renderer: fspeed,
+ dataIndex: 'up_speed',
+ },
+ ],
+ stripeRows: true,
+ deferredRender: false,
+ autoScroll: true,
+ },
+ config
+ );
+ Deluge.details.PeersTab.superclass.constructor.call(this, config);
+ },
+
+ clear: function() {
+ this.getStore().removeAll();
+ this.peers = {};
+ },
+
+ update: function(torrentId) {
+ deluge.client.web.get_torrent_status(torrentId, Deluge.Keys.Peers, {
+ success: this.onRequestComplete,
+ scope: this,
+ });
+ },
+
+ onRequestComplete: function(torrent, options) {
+ if (!torrent) return;
+
+ var store = this.getStore();
+ var newPeers = [];
+ var addresses = {};
+
+ // Go through the peers updating and creating peer records
+ Ext.each(
+ torrent.peers,
+ function(peer) {
+ if (this.peers[peer.ip]) {
+ var record = store.getById(peer.ip);
+ record.beginEdit();
+ for (var k in peer) {
+ if (record.get(k) != peer[k]) {
+ record.set(k, peer[k]);
+ }
+ }
+ record.endEdit();
+ } else {
+ this.peers[peer.ip] = 1;
+ newPeers.push(new Deluge.data.Peer(peer, peer.ip));
+ }
+ addresses[peer.ip] = 1;
+ },
+ this
+ );
+ store.add(newPeers);
+
+ // Remove any peers that should not be left in the store.
+ store.each(function(record) {
+ if (!addresses[record.id]) {
+ store.remove(record);
+ delete this.peers[record.id];
+ }
+ }, this);
+ store.commitChanges();
+
+ var sortState = store.getSortState();
+ if (!sortState) return;
+ store.sort(sortState.field, sortState.direction);
+ },
+ });
+})();
diff --git a/deluge/ui/web/js/deluge-all/details/StatusTab.js b/deluge/ui/web/js/deluge-all/details/StatusTab.js
new file mode 100644
index 0000000..a8753bb
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/details/StatusTab.js
@@ -0,0 +1,155 @@
+/**
+ * Deluge.details.StatusTab.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge.details');
+
+/**
+ * @class Deluge.details.StatusTab
+ * @extends Ext.Panel
+ */
+Deluge.details.StatusTab = Ext.extend(Ext.Panel, {
+ title: _('Status'),
+ autoScroll: true,
+
+ onRender: function(ct, position) {
+ Deluge.details.StatusTab.superclass.onRender.call(this, ct, position);
+
+ this.progressBar = this.add({
+ xtype: 'progress',
+ cls: 'x-deluge-status-progressbar',
+ });
+
+ this.status = this.add({
+ cls: 'x-deluge-status',
+ id: 'deluge-details-status',
+
+ border: false,
+ width: 1000,
+ listeners: {
+ render: {
+ fn: function(panel) {
+ panel.load({
+ url: deluge.config.base + 'render/tab_status.html',
+ text: _('Loading') + '...',
+ });
+ panel
+ .getUpdater()
+ .on('update', this.onPanelUpdate, this);
+ },
+ scope: this,
+ },
+ },
+ });
+ },
+
+ clear: function() {
+ this.progressBar.updateProgress(0, ' ');
+ for (var k in this.fields) {
+ this.fields[k].innerHTML = '';
+ }
+ },
+
+ update: function(torrentId) {
+ if (!this.fields) this.getFields();
+ deluge.client.web.get_torrent_status(torrentId, Deluge.Keys.Status, {
+ success: this.onRequestComplete,
+ scope: this,
+ });
+ },
+
+ onPanelUpdate: function(el, response) {
+ this.fields = {};
+ Ext.each(
+ Ext.query('dd', this.status.body.dom),
+ function(field) {
+ this.fields[field.className] = field;
+ },
+ this
+ );
+ },
+
+ onRequestComplete: function(status) {
+ seeds =
+ status.total_seeds > -1
+ ? status.num_seeds + ' (' + status.total_seeds + ')'
+ : status.num_seeds;
+ peers =
+ status.total_peers > -1
+ ? status.num_peers + ' (' + status.total_peers + ')'
+ : status.num_peers;
+ last_seen_complete =
+ status.last_seen_complete > 0.0
+ ? fdate(status.last_seen_complete)
+ : 'Never';
+ completed_time =
+ status.completed_time > 0.0 ? fdate(status.completed_time) : '';
+
+ var data = {
+ downloaded: fsize(status.total_done, true),
+ uploaded: fsize(status.total_uploaded, true),
+ share: status.ratio == -1 ? '&infin;' : status.ratio.toFixed(3),
+ announce: ftime(status.next_announce),
+ tracker_status: status.tracker_status,
+ downspeed: status.download_payload_rate
+ ? fspeed(status.download_payload_rate)
+ : '0.0 KiB/s',
+ upspeed: status.upload_payload_rate
+ ? fspeed(status.upload_payload_rate)
+ : '0.0 KiB/s',
+ eta: status.eta < 0 ? '&infin;' : ftime(status.eta),
+ pieces: status.num_pieces + ' (' + fsize(status.piece_length) + ')',
+ seeds: seeds,
+ peers: peers,
+ avail: status.distributed_copies.toFixed(3),
+ active_time: ftime(status.active_time),
+ seeding_time: ftime(status.seeding_time),
+ seed_rank: status.seed_rank,
+ time_added: fdate(status.time_added),
+ last_seen_complete: last_seen_complete,
+ completed_time: completed_time,
+ time_since_transfer: ftime(status.time_since_transfer),
+ };
+ data.auto_managed = _(status.is_auto_managed ? 'True' : 'False');
+
+ var translate_tracker_status = {
+ Error: _('Error'),
+ Warning: _('Warning'),
+ 'Announce OK': _('Announce OK'),
+ 'Announce Sent': _('Announce Sent'),
+ };
+ for (var key in translate_tracker_status) {
+ if (data.tracker_status.indexOf(key) != -1) {
+ data.tracker_status = data.tracker_status.replace(
+ key,
+ translate_tracker_status[key]
+ );
+ break;
+ }
+ }
+
+ data.downloaded +=
+ ' (' +
+ (status.total_payload_download
+ ? fsize(status.total_payload_download)
+ : '0.0 KiB') +
+ ')';
+ data.uploaded +=
+ ' (' +
+ (status.total_payload_upload
+ ? fsize(status.total_payload_upload)
+ : '0.0 KiB') +
+ ')';
+
+ for (var field in this.fields) {
+ this.fields[field].innerHTML = data[field];
+ }
+ var text = status.state + ' ' + status.progress.toFixed(2) + '%';
+ this.progressBar.updateProgress(status.progress / 100.0, text);
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js b/deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js
new file mode 100644
index 0000000..031104c
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js
@@ -0,0 +1,203 @@
+/**
+ * Deluge.preferences.BandwidthPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Bandwidth
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Bandwidth = Ext.extend(Ext.form.FormPanel, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ border: false,
+ title: _('Bandwidth'),
+ header: false,
+ layout: 'form',
+ labelWidth: 10,
+ },
+ config
+ );
+ Deluge.preferences.Bandwidth.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.preferences.Bandwidth.superclass.initComponent.call(this);
+
+ var om = deluge.preferences.getOptionsManager();
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Global Bandwidth Usage'),
+ labelWidth: 200,
+ defaultType: 'spinnerfield',
+ defaults: {
+ minValue: -1,
+ maxValue: 99999,
+ },
+ style: 'margin-bottom: 0px; padding-bottom: 0px;',
+ autoHeight: true,
+ });
+ om.bind(
+ 'max_connections_global',
+ fieldset.add({
+ name: 'max_connections_global',
+ fieldLabel: _('Maximum Connections:'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ om.bind(
+ 'max_upload_slots_global',
+ fieldset.add({
+ name: 'max_upload_slots_global',
+ fieldLabel: _('Maximum Upload Slots'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ om.bind(
+ 'max_download_speed',
+ fieldset.add({
+ name: 'max_download_speed',
+ fieldLabel: _('Maximum Download Speed (KiB/s):'),
+ labelSeparator: '',
+ width: 80,
+ value: -1.0,
+ decimalPrecision: 1,
+ })
+ );
+ om.bind(
+ 'max_upload_speed',
+ fieldset.add({
+ name: 'max_upload_speed',
+ fieldLabel: _('Maximum Upload Speed (KiB/s):'),
+ labelSeparator: '',
+ width: 80,
+ value: -1.0,
+ decimalPrecision: 1,
+ })
+ );
+ om.bind(
+ 'max_half_open_connections',
+ fieldset.add({
+ name: 'max_half_open_connections',
+ fieldLabel: _('Maximum Half-Open Connections:'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ om.bind(
+ 'max_connections_per_second',
+ fieldset.add({
+ name: 'max_connections_per_second',
+ fieldLabel: _('Maximum Connection Attempts per Second:'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: '',
+ defaultType: 'checkbox',
+ style:
+ 'padding-top: 0px; padding-bottom: 5px; margin-top: 0px; margin-bottom: 0px;',
+ autoHeight: true,
+ });
+ om.bind(
+ 'ignore_limits_on_local_network',
+ fieldset.add({
+ name: 'ignore_limits_on_local_network',
+ height: 22,
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Ignore limits on local network'),
+ })
+ );
+ om.bind(
+ 'rate_limit_ip_overhead',
+ fieldset.add({
+ name: 'rate_limit_ip_overhead',
+ height: 22,
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Rate limit IP overhead'),
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Per Torrent Bandwidth Usage'),
+ style: 'margin-bottom: 0px; padding-bottom: 0px;',
+ defaultType: 'spinnerfield',
+ labelWidth: 200,
+ defaults: {
+ minValue: -1,
+ maxValue: 99999,
+ },
+ autoHeight: true,
+ });
+ om.bind(
+ 'max_connections_per_torrent',
+ fieldset.add({
+ name: 'max_connections_per_torrent',
+ fieldLabel: _('Maximum Connections:'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ om.bind(
+ 'max_upload_slots_per_torrent',
+ fieldset.add({
+ name: 'max_upload_slots_per_torrent',
+ fieldLabel: _('Maximum Upload Slots:'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ om.bind(
+ 'max_download_speed_per_torrent',
+ fieldset.add({
+ name: 'max_download_speed_per_torrent',
+ fieldLabel: _('Maximum Download Speed (KiB/s):'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ om.bind(
+ 'max_upload_speed_per_torrent',
+ fieldset.add({
+ name: 'max_upload_speed_per_torrent',
+ fieldLabel: _('Maximum Upload Speed (KiB/s):'),
+ labelSeparator: '',
+ width: 80,
+ value: -1,
+ decimalPrecision: 0,
+ })
+ );
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/CachePage.js b/deluge/ui/web/js/deluge-all/preferences/CachePage.js
new file mode 100644
index 0000000..2c84c7b
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/CachePage.js
@@ -0,0 +1,61 @@
+/**
+ * Deluge.preferences.CachePage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Cache
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Cache = Ext.extend(Ext.form.FormPanel, {
+ border: false,
+ title: _('Cache'),
+ header: false,
+ layout: 'form',
+
+ initComponent: function() {
+ Deluge.preferences.Cache.superclass.initComponent.call(this);
+
+ var om = deluge.preferences.getOptionsManager();
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Settings'),
+ autoHeight: true,
+ labelWidth: 180,
+ defaultType: 'spinnerfield',
+ defaults: {
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 999999,
+ },
+ });
+ om.bind(
+ 'cache_size',
+ fieldset.add({
+ fieldLabel: _('Cache Size (16 KiB Blocks):'),
+ labelSeparator: '',
+ name: 'cache_size',
+ width: 60,
+ value: 512,
+ })
+ );
+ om.bind(
+ 'cache_expiry',
+ fieldset.add({
+ fieldLabel: _('Cache Expiry (seconds):'),
+ labelSeparator: '',
+ name: 'cache_expiry',
+ width: 60,
+ value: 60,
+ })
+ );
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/DaemonPage.js b/deluge/ui/web/js/deluge-all/preferences/DaemonPage.js
new file mode 100644
index 0000000..38f5750
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/DaemonPage.js
@@ -0,0 +1,85 @@
+/**
+ * Deluge.preferences.DaemonPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Daemon
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Daemon = Ext.extend(Ext.form.FormPanel, {
+ border: false,
+ title: _('Daemon'),
+ header: false,
+ layout: 'form',
+
+ initComponent: function() {
+ Deluge.preferences.Daemon.superclass.initComponent.call(this);
+
+ var om = deluge.preferences.getOptionsManager();
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Port'),
+ autoHeight: true,
+ defaultType: 'spinnerfield',
+ });
+ om.bind(
+ 'daemon_port',
+ fieldset.add({
+ fieldLabel: _('Daemon port:'),
+ labelSeparator: '',
+ name: 'daemon_port',
+ value: 58846,
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Connections'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ om.bind(
+ 'allow_remote',
+ fieldset.add({
+ fieldLabel: '',
+ height: 22,
+ labelSeparator: '',
+ boxLabel: _('Allow Remote Connections'),
+ name: 'allow_remote',
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Other'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ om.bind(
+ 'new_release_check',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ height: 40,
+ boxLabel: _('Periodically check the website for new releases'),
+ id: 'new_release_check',
+ })
+ );
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js b/deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js
new file mode 100644
index 0000000..bba5e47
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js
@@ -0,0 +1,124 @@
+/**
+ * Deluge.preferences.DownloadsPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Downloads
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Downloads = Ext.extend(Ext.FormPanel, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ border: false,
+ title: _('Downloads'),
+ header: false,
+ layout: 'form',
+ autoHeight: true,
+ width: 320,
+ },
+ config
+ );
+ Deluge.preferences.Downloads.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.preferences.Downloads.superclass.initComponent.call(this);
+
+ var optMan = deluge.preferences.getOptionsManager();
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Folders'),
+ labelWidth: 150,
+ defaultType: 'togglefield',
+ autoHeight: true,
+ labelAlign: 'top',
+ width: 300,
+ style: 'margin-bottom: 5px; padding-bottom: 5px;',
+ });
+
+ optMan.bind(
+ 'download_location',
+ fieldset.add({
+ xtype: 'textfield',
+ name: 'download_location',
+ fieldLabel: _('Download to:'),
+ labelSeparator: '',
+ width: 280,
+ })
+ );
+
+ var field = fieldset.add({
+ name: 'move_completed_path',
+ fieldLabel: _('Move completed to:'),
+ labelSeparator: '',
+ width: 280,
+ });
+ optMan.bind('move_completed', field.toggle);
+ optMan.bind('move_completed_path', field.input);
+
+ field = fieldset.add({
+ name: 'torrentfiles_location',
+ fieldLabel: _('Copy of .torrent files to:'),
+ labelSeparator: '',
+ width: 280,
+ });
+ optMan.bind('copy_torrent_file', field.toggle);
+ optMan.bind('torrentfiles_location', field.input);
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Options'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ style: 'margin-bottom: 0; padding-bottom: 0;',
+ width: 280,
+ });
+ optMan.bind(
+ 'prioritize_first_last_pieces',
+ fieldset.add({
+ name: 'prioritize_first_last_pieces',
+ labelSeparator: '',
+ height: 22,
+ boxLabel: _('Prioritize first and last pieces of torrent'),
+ })
+ );
+ optMan.bind(
+ 'sequential_download',
+ fieldset.add({
+ name: 'sequential_download',
+ labelSeparator: '',
+ height: 22,
+ boxLabel: _('Sequential download'),
+ })
+ );
+ optMan.bind(
+ 'add_paused',
+ fieldset.add({
+ name: 'add_paused',
+ labelSeparator: '',
+ height: 22,
+ boxLabel: _('Add torrents in Paused state'),
+ })
+ );
+ optMan.bind(
+ 'pre_allocate_storage',
+ fieldset.add({
+ name: 'pre_allocate_storage',
+ labelSeparator: '',
+ height: 22,
+ boxLabel: _('Pre-allocate disk space'),
+ })
+ );
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js b/deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js
new file mode 100644
index 0000000..af5ad51
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js
@@ -0,0 +1,99 @@
+/**
+ * Deluge.preferences.EncryptionPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Encryption
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Encryption = Ext.extend(Ext.form.FormPanel, {
+ border: false,
+ title: _('Encryption'),
+ header: false,
+
+ initComponent: function() {
+ Deluge.preferences.Encryption.superclass.initComponent.call(this);
+
+ var optMan = deluge.preferences.getOptionsManager();
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Settings'),
+ header: false,
+ autoHeight: true,
+ defaultType: 'combo',
+ width: 300,
+ });
+ optMan.bind(
+ 'enc_in_policy',
+ fieldset.add({
+ fieldLabel: _('Incoming:'),
+ labelSeparator: '',
+ mode: 'local',
+ width: 150,
+ store: new Ext.data.ArrayStore({
+ fields: ['id', 'text'],
+ data: [
+ [0, _('Forced')],
+ [1, _('Enabled')],
+ [2, _('Disabled')],
+ ],
+ }),
+ editable: false,
+ triggerAction: 'all',
+ valueField: 'id',
+ displayField: 'text',
+ })
+ );
+ optMan.bind(
+ 'enc_out_policy',
+ fieldset.add({
+ fieldLabel: _('Outgoing:'),
+ labelSeparator: '',
+ mode: 'local',
+ width: 150,
+ store: new Ext.data.SimpleStore({
+ fields: ['id', 'text'],
+ data: [
+ [0, _('Forced')],
+ [1, _('Enabled')],
+ [2, _('Disabled')],
+ ],
+ }),
+ editable: false,
+ triggerAction: 'all',
+ valueField: 'id',
+ displayField: 'text',
+ })
+ );
+ optMan.bind(
+ 'enc_level',
+ fieldset.add({
+ fieldLabel: _('Level:'),
+ labelSeparator: '',
+ mode: 'local',
+ width: 150,
+ store: new Ext.data.SimpleStore({
+ fields: ['id', 'text'],
+ data: [
+ [0, _('Handshake')],
+ [1, _('Full Stream')],
+ [2, _('Either')],
+ ],
+ }),
+ editable: false,
+ triggerAction: 'all',
+ valueField: 'id',
+ displayField: 'text',
+ })
+ );
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js b/deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js
new file mode 100644
index 0000000..c394664
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js
@@ -0,0 +1,83 @@
+/**
+ * Deluge.preferences.InstallPluginWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.InstallPluginWindow
+ * @extends Ext.Window
+ */
+Deluge.preferences.InstallPluginWindow = Ext.extend(Ext.Window, {
+ title: _('Install Plugin'),
+ layout: 'fit',
+ height: 115,
+ width: 350,
+ constrainHeader: true,
+ bodyStyle: 'padding: 10px 5px;',
+ buttonAlign: 'center',
+ closeAction: 'hide',
+ iconCls: 'x-deluge-install-plugin',
+ modal: true,
+ plain: true,
+
+ initComponent: function() {
+ Deluge.preferences.InstallPluginWindow.superclass.initComponent.call(
+ this
+ );
+ this.addButton(_('Install'), this.onInstall, this);
+
+ this.form = this.add({
+ xtype: 'form',
+ baseCls: 'x-plain',
+ labelWidth: 70,
+ autoHeight: true,
+ fileUpload: true,
+ items: [
+ {
+ xtype: 'fileuploadfield',
+ width: 240,
+ emptyText: _('Select an egg'),
+ fieldLabel: _('Plugin Egg'),
+ name: 'file',
+ buttonCfg: {
+ text: _('Browse...'),
+ },
+ },
+ ],
+ });
+ },
+
+ onInstall: function(field, e) {
+ this.form.getForm().submit({
+ url: deluge.config.base + 'upload',
+ waitMsg: _('Uploading your plugin...'),
+ success: this.onUploadSuccess,
+ scope: this,
+ });
+ },
+
+ onUploadPlugin: function(info, obj, response, request) {
+ this.fireEvent('pluginadded');
+ },
+
+ onUploadSuccess: function(fp, upload) {
+ this.hide();
+ if (upload.result.success) {
+ var filename = this.form.getForm().getFieldValues().file;
+ filename = filename.split('\\').slice(-1)[0];
+ var path = upload.result.files[0];
+ this.form.getForm().setValues({ file: '' });
+ deluge.client.web.upload_plugin(filename, path, {
+ success: this.onUploadPlugin,
+ scope: this,
+ filename: filename,
+ });
+ }
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/InterfacePage.js b/deluge/ui/web/js/deluge-all/preferences/InterfacePage.js
new file mode 100644
index 0000000..f5b0290
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/InterfacePage.js
@@ -0,0 +1,304 @@
+/**
+ * Deluge.preferences.InterfacePage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Interface
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Interface = Ext.extend(Ext.form.FormPanel, {
+ border: false,
+ title: _('Interface'),
+ header: false,
+ layout: 'form',
+
+ initComponent: function() {
+ Deluge.preferences.Interface.superclass.initComponent.call(this);
+
+ var om = (this.optionsManager = new Deluge.OptionsManager());
+ this.on('show', this.onPageShow, this);
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Interface'),
+ style: 'margin-bottom: 0px; padding-bottom: 5px; padding-top: 5px',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ defaults: {
+ height: 17,
+ fieldLabel: '',
+ labelSeparator: '',
+ },
+ });
+ om.bind(
+ 'show_session_speed',
+ fieldset.add({
+ name: 'show_session_speed',
+ boxLabel: _('Show session speed in titlebar'),
+ })
+ );
+ om.bind(
+ 'sidebar_show_zero',
+ fieldset.add({
+ name: 'sidebar_show_zero',
+ boxLabel: _('Show filters with zero torrents'),
+ })
+ );
+ om.bind(
+ 'sidebar_multiple_filters',
+ fieldset.add({
+ name: 'sidebar_multiple_filters',
+ boxLabel: _('Allow the use of multiple filters at once'),
+ })
+ );
+
+ var languagePanel = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Language'),
+ style: 'margin-bottom: 0px; padding-bottom: 5px; padding-top: 5px',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ this.language = om.bind(
+ 'language',
+ languagePanel.add({
+ xtype: 'combo',
+ labelSeparator: '',
+ name: 'language',
+ mode: 'local',
+ width: 200,
+ store: new Ext.data.ArrayStore({
+ fields: ['id', 'text'],
+ }),
+ editable: false,
+ triggerAction: 'all',
+ valueField: 'id',
+ displayField: 'text',
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('WebUI Password'),
+ style: 'margin-bottom: 0px; padding-bottom: 5px; padding-top: 5px',
+ autoHeight: true,
+ labelWidth: 100,
+ defaultType: 'textfield',
+ defaults: {
+ width: 100,
+ inputType: 'password',
+ labelStyle: 'padding-left: 5px',
+ height: 20,
+ labelSeparator: '',
+ },
+ });
+
+ this.oldPassword = fieldset.add({
+ name: 'old_password',
+ fieldLabel: _('Old:'),
+ });
+ this.newPassword = fieldset.add({
+ name: 'new_password',
+ fieldLabel: _('New:'),
+ });
+ this.confirmPassword = fieldset.add({
+ name: 'confirm_password',
+ fieldLabel: _('Confirm:'),
+ });
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Server'),
+ style: 'padding-top: 5px; margin-bottom: 0px; padding-bottom: 5px',
+ autoHeight: true,
+ labelWidth: 100,
+ defaultType: 'spinnerfield',
+ defaults: {
+ labelSeparator: '',
+ labelStyle: 'padding-left: 5px',
+ height: 20,
+ width: 80,
+ },
+ });
+ om.bind(
+ 'session_timeout',
+ fieldset.add({
+ name: 'session_timeout',
+ fieldLabel: _('Session Timeout:'),
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ })
+ );
+ om.bind(
+ 'port',
+ fieldset.add({
+ name: 'port',
+ fieldLabel: _('Port:'),
+ decimalPrecision: 0,
+ minValue: 1,
+ maxValue: 65535,
+ })
+ );
+ this.httpsField = om.bind(
+ 'https',
+ fieldset.add({
+ xtype: 'checkbox',
+ name: 'https',
+ hideLabel: true,
+ width: 300,
+ style: 'margin-left: 5px',
+ boxLabel: _(
+ 'Enable SSL (paths relative to Deluge config folder)'
+ ),
+ })
+ );
+ this.httpsField.on('check', this.onSSLCheck, this);
+ this.pkeyField = om.bind(
+ 'pkey',
+ fieldset.add({
+ xtype: 'textfield',
+ disabled: true,
+ name: 'pkey',
+ width: 180,
+ fieldLabel: _('Private Key:'),
+ })
+ );
+ this.certField = om.bind(
+ 'cert',
+ fieldset.add({
+ xtype: 'textfield',
+ disabled: true,
+ name: 'cert',
+ width: 180,
+ fieldLabel: _('Certificate:'),
+ })
+ );
+ },
+
+ onApply: function() {
+ var changed = this.optionsManager.getDirty();
+ if (!Ext.isObjectEmpty(changed)) {
+ deluge.client.web.set_config(changed, {
+ success: this.onSetConfig,
+ scope: this,
+ });
+
+ for (var key in deluge.config) {
+ deluge.config[key] = this.optionsManager.get(key);
+ }
+ if ('language' in changed) {
+ Ext.Msg.show({
+ title: _('WebUI Language Changed'),
+ msg: _(
+ 'Do you want to refresh the page now to use the new language?'
+ ),
+ buttons: {
+ yes: _('Refresh'),
+ no: _('Close'),
+ },
+ multiline: false,
+ fn: function(btnText) {
+ if (btnText === 'yes') location.reload();
+ },
+ icon: Ext.MessageBox.QUESTION,
+ });
+ }
+ }
+ if (this.oldPassword.getValue() || this.newPassword.getValue()) {
+ this.onPasswordChange();
+ }
+ },
+
+ onOk: function() {
+ this.onApply();
+ },
+
+ onGotConfig: function(config) {
+ this.optionsManager.set(config);
+ },
+
+ onGotLanguages: function(info, obj, response, request) {
+ info.unshift(['', _('System Default')]);
+ this.language.store.loadData(info);
+ this.language.setValue(this.optionsManager.get('language'));
+ },
+
+ onPasswordChange: function() {
+ var newPassword = this.newPassword.getValue();
+ if (newPassword != this.confirmPassword.getValue()) {
+ Ext.MessageBox.show({
+ title: _('Invalid Password'),
+ msg: _("Your passwords don't match!"),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ return;
+ }
+
+ var oldPassword = this.oldPassword.getValue();
+ deluge.client.auth.change_password(oldPassword, newPassword, {
+ success: function(result) {
+ if (!result) {
+ Ext.MessageBox.show({
+ title: _('Password'),
+ msg: _('Your old password was incorrect!'),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.ERROR,
+ iconCls: 'x-deluge-icon-error',
+ });
+ this.oldPassword.setValue('');
+ } else {
+ Ext.MessageBox.show({
+ title: _('Change Successful'),
+ msg: _('Your password was successfully changed!'),
+ buttons: Ext.MessageBox.OK,
+ modal: false,
+ icon: Ext.MessageBox.INFO,
+ iconCls: 'x-deluge-icon-info',
+ });
+ this.oldPassword.setValue('');
+ this.newPassword.setValue('');
+ this.confirmPassword.setValue('');
+ }
+ },
+ scope: this,
+ });
+ },
+
+ onSetConfig: function() {
+ this.optionsManager.commit();
+ },
+
+ onPageShow: function() {
+ deluge.client.web.get_config({
+ success: this.onGotConfig,
+ scope: this,
+ });
+ deluge.client.webutils.get_languages({
+ success: this.onGotLanguages,
+ scope: this,
+ });
+ },
+
+ onSSLCheck: function(e, checked) {
+ this.pkeyField.setDisabled(!checked);
+ this.certField.setDisabled(!checked);
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/NetworkPage.js b/deluge/ui/web/js/deluge-all/preferences/NetworkPage.js
new file mode 100644
index 0000000..651ba4f
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/NetworkPage.js
@@ -0,0 +1,257 @@
+/**
+ * Deluge.preferences.NetworkPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+// custom Vtype for vtype:'IPAddress'
+Ext.apply(Ext.form.VTypes, {
+ IPAddress: function(v) {
+ return /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(v);
+ },
+ IPAddressText: 'Must be a numeric IP address',
+ IPAddressMask: /[\d\.]/i,
+});
+
+/**
+ * @class Deluge.preferences.Network
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Network = Ext.extend(Ext.form.FormPanel, {
+ border: false,
+ layout: 'form',
+ title: _('Network'),
+ header: false,
+
+ initComponent: function() {
+ Deluge.preferences.Network.superclass.initComponent.call(this);
+ var optMan = deluge.preferences.getOptionsManager();
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Incoming Address'),
+ style: 'margin-bottom: 5px; padding-bottom: 0px;',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'textfield',
+ });
+ optMan.bind(
+ 'listen_interface',
+ fieldset.add({
+ name: 'listen_interface',
+ fieldLabel: '',
+ labelSeparator: '',
+ width: 200,
+ vtype: 'IPAddress',
+ })
+ );
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Incoming Port'),
+ style: 'margin-bottom: 5px; padding-bottom: 0px;',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ optMan.bind(
+ 'random_port',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Use Random Port'),
+ name: 'random_port',
+ height: 22,
+ listeners: {
+ check: {
+ fn: function(e, checked) {
+ this.listenPort.setDisabled(checked);
+ },
+ scope: this,
+ },
+ },
+ })
+ );
+
+ this.listenPort = fieldset.add({
+ xtype: 'spinnerfield',
+ name: 'listen_port',
+ fieldLabel: '',
+ labelSeparator: '',
+ width: 75,
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: 0,
+ maxValue: 65535,
+ },
+ });
+ optMan.bind('listen_ports', this.listenPort);
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Outgoing Interface'),
+ style: 'margin-bottom: 5px; padding-bottom: 0px;',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'textfield',
+ });
+ optMan.bind(
+ 'outgoing_interface',
+ fieldset.add({
+ name: 'outgoing_interface',
+ fieldLabel: '',
+ labelSeparator: '',
+ width: 40,
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Outgoing Ports'),
+ style: 'margin-bottom: 5px; padding-bottom: 0px;',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ optMan.bind(
+ 'random_outgoing_ports',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Use Random Ports'),
+ name: 'random_outgoing_ports',
+ height: 22,
+ listeners: {
+ check: {
+ fn: function(e, checked) {
+ this.outgoingPorts.setDisabled(checked);
+ },
+ scope: this,
+ },
+ },
+ })
+ );
+ this.outgoingPorts = fieldset.add({
+ xtype: 'spinnergroup',
+ name: 'outgoing_ports',
+ fieldLabel: '',
+ labelSeparator: '',
+ colCfg: {
+ labelWidth: 40,
+ style: 'margin-right: 10px;',
+ },
+ items: [
+ {
+ fieldLabel: _('From:'),
+ labelSeparator: '',
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: 0,
+ maxValue: 65535,
+ },
+ },
+ {
+ fieldLabel: _('To:'),
+ labelSeparator: '',
+ strategy: {
+ xtype: 'number',
+ decimalPrecision: 0,
+ minValue: 0,
+ maxValue: 65535,
+ },
+ },
+ ],
+ });
+ optMan.bind('outgoing_ports', this.outgoingPorts);
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Network Extras'),
+ autoHeight: true,
+ layout: 'table',
+ layoutConfig: {
+ columns: 3,
+ },
+ defaultType: 'checkbox',
+ });
+ optMan.bind(
+ 'upnp',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('UPnP'),
+ name: 'upnp',
+ })
+ );
+ optMan.bind(
+ 'natpmp',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('NAT-PMP'),
+ ctCls: 'x-deluge-indent-checkbox',
+ name: 'natpmp',
+ })
+ );
+ optMan.bind(
+ 'utpex',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('Peer Exchange'),
+ ctCls: 'x-deluge-indent-checkbox',
+ name: 'utpex',
+ })
+ );
+ optMan.bind(
+ 'lsd',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('LSD'),
+ name: 'lsd',
+ })
+ );
+ optMan.bind(
+ 'dht',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ boxLabel: _('DHT'),
+ ctCls: 'x-deluge-indent-checkbox',
+ name: 'dht',
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Type Of Service'),
+ style: 'margin-bottom: 5px; padding-bottom: 0px;',
+ bodyStyle: 'margin: 0px; padding: 0px',
+ autoHeight: true,
+ defaultType: 'textfield',
+ });
+ optMan.bind(
+ 'peer_tos',
+ fieldset.add({
+ name: 'peer_tos',
+ fieldLabel: _('Peer TOS Byte:'),
+ labelSeparator: '',
+ width: 40,
+ })
+ );
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/OtherPage.js b/deluge/ui/web/js/deluge-all/preferences/OtherPage.js
new file mode 100644
index 0000000..1538203
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/OtherPage.js
@@ -0,0 +1,100 @@
+/**
+ * Deluge.preferences.OtherPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Other
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Other = Ext.extend(Ext.form.FormPanel, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ border: false,
+ title: _('Other'),
+ header: false,
+ layout: 'form',
+ },
+ config
+ );
+ Deluge.preferences.Other.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.preferences.Other.superclass.initComponent.call(this);
+
+ var optMan = deluge.preferences.getOptionsManager();
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Updates'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ optMan.bind(
+ 'new_release_check',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ height: 22,
+ name: 'new_release_check',
+ boxLabel: _('Be alerted about new releases'),
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('System Information'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ fieldset.add({
+ xtype: 'panel',
+ border: false,
+ bodyCfg: {
+ html: _(
+ 'Help us improve Deluge by sending us your Python version, PyGTK version, OS and processor types. Absolutely no other information is sent.'
+ ),
+ },
+ });
+ optMan.bind(
+ 'send_info',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ height: 22,
+ boxLabel: _('Yes, please send anonymous statistics'),
+ name: 'send_info',
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('GeoIP Database'),
+ autoHeight: true,
+ labelWidth: 80,
+ defaultType: 'textfield',
+ });
+ optMan.bind(
+ 'geoip_db_location',
+ fieldset.add({
+ name: 'geoip_db_location',
+ fieldLabel: _('Path:'),
+ labelSeparator: '',
+ width: 200,
+ })
+ );
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/PluginsPage.js b/deluge/ui/web/js/deluge-all/preferences/PluginsPage.js
new file mode 100644
index 0000000..e22fc7f
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/PluginsPage.js
@@ -0,0 +1,277 @@
+/**
+ * Deluge.preferences.PluginsPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Plugins
+ * @extends Ext.Panel
+ */
+Deluge.preferences.Plugins = Ext.extend(Ext.Panel, {
+ layout: 'border',
+ title: _('Plugins'),
+ header: false,
+ border: false,
+ cls: 'x-deluge-plugins',
+
+ pluginTemplate: new Ext.Template(
+ '<dl class="singleline">' +
+ '<dt>' +
+ _('Author:') +
+ '</dt><dd>{author}</dd>' +
+ '<dt>' +
+ _('Version:') +
+ '</dt><dd>{version}</dd>' +
+ '<dt>' +
+ _('Author Email:') +
+ '</dt><dd>{email}</dd>' +
+ '<dt>' +
+ _('Homepage:') +
+ '</dt><dd>{homepage}</dd>' +
+ '<dt>' +
+ _('Details:') +
+ '</dt><dd style="white-space:normal">{details}</dd>' +
+ '</dl>'
+ ),
+
+ initComponent: function() {
+ Deluge.preferences.Plugins.superclass.initComponent.call(this);
+ this.defaultValues = {
+ version: '',
+ email: '',
+ homepage: '',
+ details: '',
+ };
+ this.pluginTemplate.compile();
+
+ var checkboxRenderer = function(v, p, record) {
+ p.css += ' x-grid3-check-col-td';
+ return (
+ '<div class="x-grid3-check-col' + (v ? '-on' : '') + '"> </div>'
+ );
+ };
+
+ this.list = this.add({
+ xtype: 'listview',
+ store: new Ext.data.ArrayStore({
+ fields: [
+ { name: 'enabled', mapping: 0 },
+ { name: 'plugin', mapping: 1, sortType: 'asUCString' },
+ ],
+ }),
+ columns: [
+ {
+ id: 'enabled',
+ header: _('Enabled'),
+ width: 0.2,
+ sortable: true,
+ tpl: new Ext.XTemplate('{enabled:this.getCheckbox}', {
+ getCheckbox: function(v) {
+ return (
+ '<div class="x-grid3-check-col' +
+ (v ? '-on' : '') +
+ '" rel="chkbox"> </div>'
+ );
+ },
+ }),
+ dataIndex: 'enabled',
+ },
+ {
+ id: 'plugin',
+ header: _('Plugin'),
+ width: 0.8,
+ sortable: true,
+ dataIndex: 'plugin',
+ },
+ ],
+ singleSelect: true,
+ autoExpandColumn: 'plugin',
+ listeners: {
+ selectionchange: { fn: this.onPluginSelect, scope: this },
+ },
+ });
+
+ this.panel = this.add({
+ region: 'center',
+ autoScroll: true,
+ items: [this.list],
+ bbar: new Ext.Toolbar({
+ items: [
+ {
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-install-plugin',
+ text: _('Install'),
+ handler: this.onInstallPluginWindow,
+ scope: this,
+ },
+ '->',
+ {
+ cls: 'x-btn-text-icon',
+ text: _('Find More'),
+ iconCls: 'x-deluge-find-more',
+ handler: this.onFindMorePlugins,
+ scope: this,
+ },
+ ],
+ }),
+ });
+
+ var pp = (this.pluginInfo = this.add({
+ xtype: 'panel',
+ border: false,
+ height: 100,
+ region: 'south',
+ padding: '5',
+ autoScroll: true,
+ bodyCfg: {
+ style: 'white-space: nowrap',
+ },
+ }));
+
+ this.pluginInfo.on('render', this.onPluginInfoRender, this);
+ this.list.on('click', this.onNodeClick, this);
+ deluge.preferences.on('show', this.onPreferencesShow, this);
+ deluge.events.on('PluginDisabledEvent', this.onPluginDisabled, this);
+ deluge.events.on('PluginEnabledEvent', this.onPluginEnabled, this);
+ },
+
+ disablePlugin: function(plugin) {
+ deluge.client.core.disable_plugin(plugin);
+ },
+
+ enablePlugin: function(plugin) {
+ deluge.client.core.enable_plugin(plugin);
+ },
+
+ setInfo: function(plugin) {
+ if (!this.pluginInfo.rendered) return;
+ var values = plugin || this.defaultValues;
+ this.pluginInfo.body.dom.innerHTML = this.pluginTemplate.apply(values);
+ },
+
+ updatePlugins: function() {
+ var onGotAvailablePlugins = function(plugins) {
+ this.availablePlugins = plugins.sort(function(a, b) {
+ return a.toLowerCase().localeCompare(b.toLowerCase());
+ });
+
+ deluge.client.core.get_enabled_plugins({
+ success: onGotEnabledPlugins,
+ scope: this,
+ });
+ };
+
+ var onGotEnabledPlugins = function(plugins) {
+ this.enabledPlugins = plugins;
+ this.onGotPlugins();
+ };
+
+ deluge.client.core.get_available_plugins({
+ success: onGotAvailablePlugins,
+ scope: this,
+ });
+ },
+
+ updatePluginsGrid: function() {
+ var plugins = [];
+ Ext.each(
+ this.availablePlugins,
+ function(plugin) {
+ if (this.enabledPlugins.indexOf(plugin) > -1) {
+ plugins.push([true, plugin]);
+ } else {
+ plugins.push([false, plugin]);
+ }
+ },
+ this
+ );
+ this.list.getStore().loadData(plugins);
+ },
+
+ onNodeClick: function(dv, index, node, e) {
+ var el = new Ext.Element(e.target);
+ if (el.getAttribute('rel') != 'chkbox') return;
+
+ var r = dv.getStore().getAt(index);
+ if (r.get('plugin') == 'WebUi') return;
+ r.set('enabled', !r.get('enabled'));
+ r.commit();
+ if (r.get('enabled')) {
+ this.enablePlugin(r.get('plugin'));
+ } else {
+ this.disablePlugin(r.get('plugin'));
+ }
+ },
+
+ onFindMorePlugins: function() {
+ window.open('http://dev.deluge-torrent.org/wiki/Plugins');
+ },
+
+ onGotPlugins: function() {
+ this.setInfo();
+ this.updatePluginsGrid();
+ },
+
+ onGotPluginInfo: function(info) {
+ var values = {
+ author: info['Author'],
+ version: info['Version'],
+ email: info['Author-email'],
+ homepage: info['Home-page'],
+ details: info['Description'],
+ };
+ this.setInfo(values);
+ delete info;
+ },
+
+ onInstallPluginWindow: function() {
+ if (!this.installWindow) {
+ this.installWindow = new Deluge.preferences.InstallPluginWindow();
+ this.installWindow.on('pluginadded', this.onPluginInstall, this);
+ }
+ this.installWindow.show();
+ },
+
+ onPluginEnabled: function(pluginName) {
+ var index = this.list.getStore().find('plugin', pluginName);
+ if (index == -1) return;
+ var plugin = this.list.getStore().getAt(index);
+ plugin.set('enabled', true);
+ plugin.commit();
+ },
+
+ onPluginDisabled: function(pluginName) {
+ var index = this.list.getStore().find('plugin', pluginName);
+ if (index == -1) return;
+ var plugin = this.list.getStore().getAt(index);
+ plugin.set('enabled', false);
+ plugin.commit();
+ },
+
+ onPluginInstall: function() {
+ this.updatePlugins();
+ },
+
+ onPluginSelect: function(dv, selections) {
+ if (selections.length == 0) return;
+ var r = dv.getRecords(selections)[0];
+ deluge.client.web.get_plugin_info(r.get('plugin'), {
+ success: this.onGotPluginInfo,
+ scope: this,
+ });
+ },
+
+ onPreferencesShow: function() {
+ this.updatePlugins();
+ },
+
+ onPluginInfoRender: function(ct, position) {
+ this.setInfo();
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js b/deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js
new file mode 100644
index 0000000..1bc98a8
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/PreferencesWindow.js
@@ -0,0 +1,246 @@
+/**
+ * Deluge.preferences.PreferencesWindow.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+PreferencesRecord = Ext.data.Record.create([{ name: 'name', type: 'string' }]);
+
+/**
+ * @class Deluge.preferences.PreferencesWindow
+ * @extends Ext.Window
+ */
+Deluge.preferences.PreferencesWindow = Ext.extend(Ext.Window, {
+ /**
+ * @property {String} currentPage The currently selected page.
+ */
+ currentPage: null,
+
+ title: _('Preferences'),
+ layout: 'border',
+ width: 485,
+ height: 500,
+ border: false,
+ constrainHeader: true,
+ buttonAlign: 'right',
+ closeAction: 'hide',
+ closable: true,
+ iconCls: 'x-deluge-preferences',
+ plain: true,
+ resizable: false,
+
+ pages: {},
+
+ initComponent: function() {
+ Deluge.preferences.PreferencesWindow.superclass.initComponent.call(
+ this
+ );
+
+ this.list = new Ext.list.ListView({
+ store: new Ext.data.Store(),
+ columns: [
+ {
+ id: 'name',
+ renderer: fplain,
+ dataIndex: 'name',
+ },
+ ],
+ singleSelect: true,
+ listeners: {
+ selectionchange: {
+ fn: this.onPageSelect,
+ scope: this,
+ },
+ },
+ hideHeaders: true,
+ autoExpandColumn: 'name',
+ deferredRender: false,
+ autoScroll: true,
+ collapsible: true,
+ });
+ this.add({
+ region: 'west',
+ items: [this.list],
+ width: 120,
+ margins: '0 5 0 0',
+ cmargins: '0 5 0 0',
+ });
+
+ this.configPanel = this.add({
+ type: 'container',
+ autoDestroy: false,
+ region: 'center',
+ layout: 'card',
+ layoutConfig: {
+ deferredRender: true,
+ },
+ autoScroll: true,
+ width: 300,
+ });
+
+ this.addButton(_('Close'), this.onClose, this);
+ this.addButton(_('Apply'), this.onApply, this);
+ this.addButton(_('OK'), this.onOk, this);
+
+ this.optionsManager = new Deluge.OptionsManager();
+ this.on('afterrender', this.onAfterRender, this);
+ this.on('show', this.onShow, this);
+
+ this.initPages();
+ },
+
+ initPages: function() {
+ deluge.preferences = this;
+ this.addPage(new Deluge.preferences.Downloads());
+ this.addPage(new Deluge.preferences.Network());
+ this.addPage(new Deluge.preferences.Encryption());
+ this.addPage(new Deluge.preferences.Bandwidth());
+ this.addPage(new Deluge.preferences.Interface());
+ this.addPage(new Deluge.preferences.Other());
+ this.addPage(new Deluge.preferences.Daemon());
+ this.addPage(new Deluge.preferences.Queue());
+ this.addPage(new Deluge.preferences.Proxy());
+ this.addPage(new Deluge.preferences.Cache());
+ this.addPage(new Deluge.preferences.Plugins());
+ },
+
+ onApply: function(e) {
+ var changed = this.optionsManager.getDirty();
+ if (!Ext.isObjectEmpty(changed)) {
+ // Workaround for only displaying single listen port but still pass array to core.
+ if ('listen_ports' in changed) {
+ changed.listen_ports = [
+ changed.listen_ports,
+ changed.listen_ports,
+ ];
+ }
+ deluge.client.core.set_config(changed, {
+ success: this.onSetConfig,
+ scope: this,
+ });
+ }
+
+ for (var page in this.pages) {
+ if (this.pages[page].onApply) this.pages[page].onApply();
+ }
+ },
+
+ /**
+ * Return the options manager for the preferences window.
+ * @returns {Deluge.OptionsManager} the options manager
+ */
+ getOptionsManager: function() {
+ return this.optionsManager;
+ },
+
+ /**
+ * Adds a page to the preferences window.
+ * @param {Mixed} page
+ */
+ addPage: function(page) {
+ var store = this.list.getStore();
+ var name = page.title;
+ store.add([new PreferencesRecord({ name: name })]);
+ page['bodyStyle'] = 'padding: 5px';
+ page.preferences = this;
+ this.pages[name] = this.configPanel.add(page);
+ this.pages[name].index = -1;
+ return this.pages[name];
+ },
+
+ /**
+ * Removes a preferences page from the window.
+ * @param {mixed} name
+ */
+ removePage: function(page) {
+ var name = page.title;
+ var store = this.list.getStore();
+ store.removeAt(store.find('name', name));
+ this.configPanel.remove(page);
+ delete this.pages[page.title];
+ },
+
+ /**
+ * Select which preferences page is displayed.
+ * @param {String} page The page name to change to
+ */
+ selectPage: function(page) {
+ if (this.pages[page].index < 0) {
+ this.pages[page].index = this.configPanel.items.indexOf(
+ this.pages[page]
+ );
+ }
+ this.list.select(this.pages[page].index);
+ },
+
+ // private
+ doSelectPage: function(page) {
+ if (this.pages[page].index < 0) {
+ this.pages[page].index = this.configPanel.items.indexOf(
+ this.pages[page]
+ );
+ }
+ this.configPanel.getLayout().setActiveItem(this.pages[page].index);
+ this.currentPage = page;
+ },
+
+ // private
+ onGotConfig: function(config) {
+ this.getOptionsManager().set(config);
+ },
+
+ // private
+ onPageSelect: function(list, selections) {
+ var r = list.getRecord(selections[0]);
+ this.doSelectPage(r.get('name'));
+ },
+
+ // private
+ onSetConfig: function() {
+ this.getOptionsManager().commit();
+ },
+
+ // private
+ onAfterRender: function() {
+ if (!this.list.getSelectionCount()) {
+ this.list.select(0);
+ }
+ this.configPanel.getLayout().setActiveItem(0);
+ },
+
+ // private
+ onShow: function() {
+ if (!deluge.client.core) return;
+ deluge.client.core.get_config({
+ success: this.onGotConfig,
+ scope: this,
+ });
+ },
+
+ // private
+ onClose: function() {
+ this.hide();
+ },
+
+ // private
+ onOk: function() {
+ var changed = this.optionsManager.getDirty();
+ if (!Ext.isObjectEmpty(changed)) {
+ deluge.client.core.set_config(changed, {
+ success: this.onSetConfig,
+ scope: this,
+ });
+ }
+
+ for (var page in this.pages) {
+ if (this.pages[page].onOk) this.pages[page].onOk();
+ }
+
+ this.hide();
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/ProxyField.js b/deluge/ui/web/js/deluge-all/preferences/ProxyField.js
new file mode 100644
index 0000000..6d500ba
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/ProxyField.js
@@ -0,0 +1,225 @@
+/**
+ * Deluge.preferences.ProxyField.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.ProxyField
+ * @extends Ext.form.FieldSet
+ */
+Deluge.preferences.ProxyField = Ext.extend(Ext.form.FieldSet, {
+ border: false,
+ autoHeight: true,
+ labelWidth: 70,
+
+ initComponent: function() {
+ Deluge.preferences.ProxyField.superclass.initComponent.call(this);
+ this.proxyType = this.add({
+ xtype: 'combo',
+ fieldLabel: _('Type:'),
+ labelSeparator: '',
+ name: 'proxytype',
+ mode: 'local',
+ width: 150,
+ store: new Ext.data.ArrayStore({
+ fields: ['id', 'text'],
+ data: [
+ [0, _('None')],
+ [1, _('Socks4')],
+ [2, _('Socks5')],
+ [3, _('Socks5 Auth')],
+ [4, _('HTTP')],
+ [5, _('HTTP Auth')],
+ [6, _('I2P')],
+ ],
+ }),
+ editable: false,
+ triggerAction: 'all',
+ valueField: 'id',
+ displayField: 'text',
+ });
+ this.proxyType.on('change', this.onFieldChange, this);
+ this.proxyType.on('select', this.onTypeSelect, this);
+
+ this.hostname = this.add({
+ xtype: 'textfield',
+ name: 'hostname',
+ fieldLabel: _('Host:'),
+ labelSeparator: '',
+ width: 220,
+ });
+ this.hostname.on('change', this.onFieldChange, this);
+
+ this.port = this.add({
+ xtype: 'spinnerfield',
+ name: 'port',
+ fieldLabel: _('Port:'),
+ labelSeparator: '',
+ width: 80,
+ decimalPrecision: 0,
+ minValue: 0,
+ maxValue: 65535,
+ });
+ this.port.on('change', this.onFieldChange, this);
+
+ this.username = this.add({
+ xtype: 'textfield',
+ name: 'username',
+ fieldLabel: _('Username:'),
+ labelSeparator: '',
+ width: 220,
+ });
+ this.username.on('change', this.onFieldChange, this);
+
+ this.password = this.add({
+ xtype: 'textfield',
+ name: 'password',
+ fieldLabel: _('Password:'),
+ labelSeparator: '',
+ inputType: 'password',
+ width: 220,
+ });
+ this.password.on('change', this.onFieldChange, this);
+
+ this.proxy_host_resolve = this.add({
+ xtype: 'checkbox',
+ name: 'proxy_host_resolve',
+ fieldLabel: '',
+ boxLabel: _('Proxy Hostnames'),
+ width: 220,
+ });
+ this.proxy_host_resolve.on('change', this.onFieldChange, this);
+
+ this.proxy_peer_conn = this.add({
+ xtype: 'checkbox',
+ name: 'proxy_peer_conn',
+ fieldLabel: '',
+ boxLabel: _('Proxy Peers'),
+ width: 220,
+ });
+ this.proxy_peer_conn.on('change', this.onFieldChange, this);
+
+ this.proxy_tracker_conn = this.add({
+ xtype: 'checkbox',
+ name: 'proxy_tracker_conn',
+ fieldLabel: '',
+ boxLabel: _('Proxy Trackers'),
+ width: 220,
+ });
+ this.proxy_tracker_conn.on('change', this.onFieldChange, this);
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Force Proxy'),
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ style: 'padding-left: 0px; margin-top: 10px',
+ });
+
+ this.force_proxy = fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ height: 20,
+ name: 'force_proxy',
+ boxLabel: _('Force Use of Proxy'),
+ });
+ this.force_proxy.on('change', this.onFieldChange, this);
+
+ this.anonymous_mode = fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ height: 20,
+ name: 'anonymous_mode',
+ boxLabel: _('Hide Client Identity'),
+ });
+ this.anonymous_mode.on('change', this.onFieldChange, this);
+
+ this.setting = false;
+ },
+
+ getName: function() {
+ return this.initialConfig.name;
+ },
+
+ getValue: function() {
+ return {
+ type: this.proxyType.getValue(),
+ hostname: this.hostname.getValue(),
+ port: Number(this.port.getValue()),
+ username: this.username.getValue(),
+ password: this.password.getValue(),
+ proxy_hostnames: this.proxy_host_resolve.getValue(),
+ proxy_peer_connections: this.proxy_peer_conn.getValue(),
+ proxy_tracker_connections: this.proxy_tracker_conn.getValue(),
+ force_proxy: this.force_proxy.getValue(),
+ anonymous_mode: this.anonymous_mode.getValue(),
+ };
+ },
+
+ // Set the values of the proxies
+ setValue: function(value) {
+ this.setting = true;
+ this.proxyType.setValue(value['type']);
+ var index = this.proxyType.getStore().find('id', value['type']);
+ var record = this.proxyType.getStore().getAt(index);
+
+ this.hostname.setValue(value['hostname']);
+ this.port.setValue(value['port']);
+ this.username.setValue(value['username']);
+ this.password.setValue(value['password']);
+ this.proxy_host_resolve.setValue(value['proxy_hostnames']);
+ this.proxy_peer_conn.setValue(value['proxy_peer_connections']);
+ this.proxy_tracker_conn.setValue(value['proxy_tracker_connections']);
+ this.force_proxy.setValue(value['force_proxy']);
+ this.anonymous_mode.setValue(value['anonymous_mode']);
+
+ this.onTypeSelect(this.type, record, index);
+ this.setting = false;
+ },
+
+ onFieldChange: function(field, newValue, oldValue) {
+ if (this.setting) return;
+ var newValues = this.getValue();
+ var oldValues = Ext.apply({}, newValues);
+ oldValues[field.getName()] = oldValue;
+
+ this.fireEvent('change', this, newValues, oldValues);
+ },
+
+ onTypeSelect: function(combo, record, index) {
+ var typeId = record.get('id');
+ if (typeId > 0) {
+ this.hostname.show();
+ this.port.show();
+ this.proxy_peer_conn.show();
+ this.proxy_tracker_conn.show();
+ if (typeId > 1 && typeId < 6) {
+ this.proxy_host_resolve.show();
+ } else {
+ this.proxy_host_resolve.hide();
+ }
+ } else {
+ this.hostname.hide();
+ this.port.hide();
+ this.proxy_host_resolve.hide();
+ this.proxy_peer_conn.hide();
+ this.proxy_tracker_conn.hide();
+ }
+
+ if (typeId == 3 || typeId == 5) {
+ this.username.show();
+ this.password.show();
+ } else {
+ this.username.hide();
+ this.password.hide();
+ }
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/ProxyPage.js b/deluge/ui/web/js/deluge-all/preferences/ProxyPage.js
new file mode 100644
index 0000000..4d3c402
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/ProxyPage.js
@@ -0,0 +1,62 @@
+/**
+ * Deluge.preferences.ProxyPage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Proxy
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Proxy = Ext.extend(Ext.form.FormPanel, {
+ constructor: function(config) {
+ config = Ext.apply(
+ {
+ border: false,
+ title: _('Proxy'),
+ header: false,
+ layout: 'form',
+ autoScroll: true,
+ },
+ config
+ );
+ Deluge.preferences.Proxy.superclass.constructor.call(this, config);
+ },
+
+ initComponent: function() {
+ Deluge.preferences.Proxy.superclass.initComponent.call(this);
+ this.proxy = this.add(
+ new Deluge.preferences.ProxyField({
+ title: _('Proxy'),
+ name: 'proxy',
+ })
+ );
+ this.proxy.on('change', this.onProxyChange, this);
+ deluge.preferences.getOptionsManager().bind('proxy', this.proxy);
+ },
+
+ getValue: function() {
+ return {
+ proxy: this.proxy.getValue(),
+ };
+ },
+
+ setValue: function(value) {
+ for (var proxy in value) {
+ this[proxy].setValue(value[proxy]);
+ }
+ },
+
+ onProxyChange: function(field, newValue, oldValue) {
+ var newValues = this.getValue();
+ var oldValues = Ext.apply({}, newValues);
+ oldValues[field.getName()] = oldValue;
+
+ this.fireEvent('change', this, newValues, oldValues);
+ },
+});
diff --git a/deluge/ui/web/js/deluge-all/preferences/QueuePage.js b/deluge/ui/web/js/deluge-all/preferences/QueuePage.js
new file mode 100644
index 0000000..db2da7c
--- /dev/null
+++ b/deluge/ui/web/js/deluge-all/preferences/QueuePage.js
@@ -0,0 +1,234 @@
+/**
+ * Deluge.preferences.QueuePage.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Deluge.preferences');
+
+/**
+ * @class Deluge.preferences.Queue
+ * @extends Ext.form.FormPanel
+ */
+Deluge.preferences.Queue = Ext.extend(Ext.form.FormPanel, {
+ border: false,
+ title: _('Queue'),
+ header: false,
+ layout: 'form',
+
+ initComponent: function() {
+ Deluge.preferences.Queue.superclass.initComponent.call(this);
+
+ var om = deluge.preferences.getOptionsManager();
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('New Torrents'),
+ style: 'padding-top: 5px; margin-bottom: 0px;',
+ autoHeight: true,
+ labelWidth: 1,
+ defaultType: 'checkbox',
+ });
+ om.bind(
+ 'queue_new_to_top',
+ fieldset.add({
+ fieldLabel: '',
+ labelSeparator: '',
+ height: 22,
+ boxLabel: _('Queue to top'),
+ name: 'queue_new_to_top',
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Active Torrents'),
+ autoHeight: true,
+ labelWidth: 150,
+ defaultType: 'spinnerfield',
+ style: 'padding-top: 5px; margin-bottom: 0px',
+ });
+ om.bind(
+ 'max_active_limit',
+ fieldset.add({
+ fieldLabel: _('Total:'),
+ labelSeparator: '',
+ name: 'max_active_limit',
+ value: 8,
+ width: 80,
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ })
+ );
+ om.bind(
+ 'max_active_downloading',
+ fieldset.add({
+ fieldLabel: _('Downloading:'),
+ labelSeparator: '',
+ name: 'max_active_downloading',
+ value: 3,
+ width: 80,
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ })
+ );
+ om.bind(
+ 'max_active_seeding',
+ fieldset.add({
+ fieldLabel: _('Seeding:'),
+ labelSeparator: '',
+ name: 'max_active_seeding',
+ value: 5,
+ width: 80,
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ })
+ );
+ om.bind(
+ 'dont_count_slow_torrents',
+ fieldset.add({
+ xtype: 'checkbox',
+ name: 'dont_count_slow_torrents',
+ height: 22,
+ hideLabel: true,
+ boxLabel: _('Ignore slow torrents'),
+ })
+ );
+ om.bind(
+ 'auto_manage_prefer_seeds',
+ fieldset.add({
+ xtype: 'checkbox',
+ name: 'auto_manage_prefer_seeds',
+ hideLabel: true,
+ boxLabel: _('Prefer seeding torrents'),
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ title: _('Seeding Rotation'),
+ autoHeight: true,
+ labelWidth: 150,
+ defaultType: 'spinnerfield',
+ style: 'padding-top: 5px; margin-bottom: 0px',
+ });
+ om.bind(
+ 'share_ratio_limit',
+ fieldset.add({
+ fieldLabel: _('Share Ratio:'),
+ labelSeparator: '',
+ name: 'share_ratio_limit',
+ value: 8,
+ width: 80,
+ incrementValue: 0.1,
+ minValue: -1,
+ maxValue: 99999,
+ alternateIncrementValue: 1,
+ decimalPrecision: 2,
+ })
+ );
+ om.bind(
+ 'seed_time_ratio_limit',
+ fieldset.add({
+ fieldLabel: _('Time Ratio:'),
+ labelSeparator: '',
+ name: 'seed_time_ratio_limit',
+ value: 3,
+ width: 80,
+ incrementValue: 0.1,
+ minValue: -1,
+ maxValue: 99999,
+ alternateIncrementValue: 1,
+ decimalPrecision: 2,
+ })
+ );
+ om.bind(
+ 'seed_time_limit',
+ fieldset.add({
+ fieldLabel: _('Time (m):'),
+ labelSeparator: '',
+ name: 'seed_time_limit',
+ value: 5,
+ width: 80,
+ decimalPrecision: 0,
+ minValue: -1,
+ maxValue: 99999,
+ })
+ );
+
+ fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ autoHeight: true,
+ style: 'padding-top: 5px; margin-bottom: 0px',
+ title: _('Share Ratio Reached'),
+
+ layout: 'table',
+ layoutConfig: { columns: 2 },
+ labelWidth: 0,
+ defaultType: 'checkbox',
+
+ defaults: {
+ fieldLabel: '',
+ labelSeparator: '',
+ },
+ });
+ this.stopAtRatio = fieldset.add({
+ name: 'stop_seed_at_ratio',
+ boxLabel: _('Share Ratio:'),
+ });
+ this.stopAtRatio.on('check', this.onStopRatioCheck, this);
+ om.bind('stop_seed_at_ratio', this.stopAtRatio);
+
+ this.stopRatio = fieldset.add({
+ xtype: 'spinnerfield',
+ name: 'stop_seed_ratio',
+ ctCls: 'x-deluge-indent-checkbox',
+ disabled: true,
+ value: '2.0',
+ width: 60,
+ incrementValue: 0.1,
+ minValue: -1,
+ maxValue: 99999,
+ alternateIncrementValue: 1,
+ decimalPrecision: 2,
+ });
+ om.bind('stop_seed_ratio', this.stopRatio);
+
+ this.removeAtRatio = fieldset.add({
+ xtype: 'radiogroup',
+ columns: 1,
+ colspan: 2,
+ disabled: true,
+ style: 'margin-left: 10px',
+ items: [
+ {
+ boxLabel: _('Pause torrent'),
+ name: 'at_ratio',
+ inputValue: false,
+ checked: true,
+ },
+ {
+ boxLabel: _('Remove torrent'),
+ name: 'at_ratio',
+ inputValue: true,
+ },
+ ],
+ });
+ om.bind('remove_seed_at_ratio', this.removeAtRatio);
+ },
+
+ onStopRatioCheck: function(e, checked) {
+ this.stopRatio.setDisabled(!checked);
+ this.removeAtRatio.setDisabled(!checked);
+ },
+});
diff --git a/deluge/ui/web/js/extjs/ext-all-debug.js b/deluge/ui/web/js/extjs/ext-all-debug.js
new file mode 100644
index 0000000..0b15e6e
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-all-debug.js
@@ -0,0 +1,52270 @@
+/*
+This file is part of Ext JS 3.4
+
+Copyright (c) 2011-2013 Sencha Inc
+
+Contact: http://www.sencha.com/contact
+
+GNU General Public License Usage
+This file may be used under the terms of the GNU General Public License version 3.0 as
+published by the Free Software Foundation and appearing in the file LICENSE included in the
+packaging of this file.
+
+Please review the following information to ensure the GNU General Public License version 3.0
+requirements will be met: http://www.gnu.org/copyleft/gpl.html.
+
+If you are unsure which license is appropriate for your use, please contact the sales department
+at http://www.sencha.com/contact.
+
+Build date: 2013-04-03 15:07:25
+*/
+(function(){
+
+var EXTUTIL = Ext.util,
+ EACH = Ext.each,
+ TRUE = true,
+ FALSE = false;
+
+EXTUTIL.Observable = function(){
+
+ var me = this, e = me.events;
+ if(me.listeners){
+ me.on(me.listeners);
+ delete me.listeners;
+ }
+ me.events = e || {};
+};
+
+EXTUTIL.Observable.prototype = {
+
+ filterOptRe : /^(?:scope|delay|buffer|single)$/,
+
+
+ fireEvent : function(){
+ var a = Array.prototype.slice.call(arguments, 0),
+ ename = a[0].toLowerCase(),
+ me = this,
+ ret = TRUE,
+ ce = me.events[ename],
+ cc,
+ q,
+ c;
+ if (me.eventsSuspended === TRUE) {
+ if (q = me.eventQueue) {
+ q.push(a);
+ }
+ }
+ else if(typeof ce == 'object') {
+ if (ce.bubble){
+ if(ce.fire.apply(ce, a.slice(1)) === FALSE) {
+ return FALSE;
+ }
+ c = me.getBubbleTarget && me.getBubbleTarget();
+ if(c && c.enableBubble) {
+ cc = c.events[ename];
+ if(!cc || typeof cc != 'object' || !cc.bubble) {
+ c.enableBubble(ename);
+ }
+ return c.fireEvent.apply(c, a);
+ }
+ }
+ else {
+ a.shift();
+ ret = ce.fire.apply(ce, a);
+ }
+ }
+ return ret;
+ },
+
+
+ addListener : function(eventName, fn, scope, o){
+ var me = this,
+ e,
+ oe,
+ ce;
+
+ if (typeof eventName == 'object') {
+ o = eventName;
+ for (e in o) {
+ oe = o[e];
+ if (!me.filterOptRe.test(e)) {
+ me.addListener(e, oe.fn || oe, oe.scope || o.scope, oe.fn ? oe : o);
+ }
+ }
+ } else {
+ eventName = eventName.toLowerCase();
+ ce = me.events[eventName] || TRUE;
+ if (typeof ce == 'boolean') {
+ me.events[eventName] = ce = new EXTUTIL.Event(me, eventName);
+ }
+ ce.addListener(fn, scope, typeof o == 'object' ? o : {});
+ }
+ },
+
+
+ removeListener : function(eventName, fn, scope){
+ var ce = this.events[eventName.toLowerCase()];
+ if (typeof ce == 'object') {
+ ce.removeListener(fn, scope);
+ }
+ },
+
+
+ purgeListeners : function(){
+ var events = this.events,
+ evt,
+ key;
+ for(key in events){
+ evt = events[key];
+ if(typeof evt == 'object'){
+ evt.clearListeners();
+ }
+ }
+ },
+
+
+ addEvents : function(o){
+ var me = this;
+ me.events = me.events || {};
+ if (typeof o == 'string') {
+ var a = arguments,
+ i = a.length;
+ while(i--) {
+ me.events[a[i]] = me.events[a[i]] || TRUE;
+ }
+ } else {
+ Ext.applyIf(me.events, o);
+ }
+ },
+
+
+ hasListener : function(eventName){
+ var e = this.events[eventName.toLowerCase()];
+ return typeof e == 'object' && e.listeners.length > 0;
+ },
+
+
+ suspendEvents : function(queueSuspended){
+ this.eventsSuspended = TRUE;
+ if(queueSuspended && !this.eventQueue){
+ this.eventQueue = [];
+ }
+ },
+
+
+ resumeEvents : function(){
+ var me = this,
+ queued = me.eventQueue || [];
+ me.eventsSuspended = FALSE;
+ delete me.eventQueue;
+ EACH(queued, function(e) {
+ me.fireEvent.apply(me, e);
+ });
+ }
+};
+
+var OBSERVABLE = EXTUTIL.Observable.prototype;
+
+OBSERVABLE.on = OBSERVABLE.addListener;
+
+OBSERVABLE.un = OBSERVABLE.removeListener;
+
+
+EXTUTIL.Observable.releaseCapture = function(o){
+ o.fireEvent = OBSERVABLE.fireEvent;
+};
+
+function createTargeted(h, o, scope){
+ return function(){
+ if(o.target == arguments[0]){
+ h.apply(scope, Array.prototype.slice.call(arguments, 0));
+ }
+ };
+};
+
+function createBuffered(h, o, l, scope){
+ l.task = new EXTUTIL.DelayedTask();
+ return function(){
+ l.task.delay(o.buffer, h, scope, Array.prototype.slice.call(arguments, 0));
+ };
+};
+
+function createSingle(h, e, fn, scope){
+ return function(){
+ e.removeListener(fn, scope);
+ return h.apply(scope, arguments);
+ };
+};
+
+function createDelayed(h, o, l, scope){
+ return function(){
+ var task = new EXTUTIL.DelayedTask(),
+ args = Array.prototype.slice.call(arguments, 0);
+ if(!l.tasks) {
+ l.tasks = [];
+ }
+ l.tasks.push(task);
+ task.delay(o.delay || 10, function(){
+ l.tasks.remove(task);
+ h.apply(scope, args);
+ }, scope);
+ };
+};
+
+EXTUTIL.Event = function(obj, name){
+ this.name = name;
+ this.obj = obj;
+ this.listeners = [];
+};
+
+EXTUTIL.Event.prototype = {
+ addListener : function(fn, scope, options){
+ var me = this,
+ l;
+ scope = scope || me.obj;
+ if(!me.isListening(fn, scope)){
+ l = me.createListener(fn, scope, options);
+ if(me.firing){
+ me.listeners = me.listeners.slice(0);
+ }
+ me.listeners.push(l);
+ }
+ },
+
+ createListener: function(fn, scope, o){
+ o = o || {};
+ scope = scope || this.obj;
+ var l = {
+ fn: fn,
+ scope: scope,
+ options: o
+ }, h = fn;
+ if(o.target){
+ h = createTargeted(h, o, scope);
+ }
+ if(o.delay){
+ h = createDelayed(h, o, l, scope);
+ }
+ if(o.single){
+ h = createSingle(h, this, fn, scope);
+ }
+ if(o.buffer){
+ h = createBuffered(h, o, l, scope);
+ }
+ l.fireFn = h;
+ return l;
+ },
+
+ findListener : function(fn, scope){
+ var list = this.listeners,
+ i = list.length,
+ l;
+
+ scope = scope || this.obj;
+ while(i--){
+ l = list[i];
+ if(l){
+ if(l.fn == fn && l.scope == scope){
+ return i;
+ }
+ }
+ }
+ return -1;
+ },
+
+ isListening : function(fn, scope){
+ return this.findListener(fn, scope) != -1;
+ },
+
+ removeListener : function(fn, scope){
+ var index,
+ l,
+ k,
+ me = this,
+ ret = FALSE;
+ if((index = me.findListener(fn, scope)) != -1){
+ if (me.firing) {
+ me.listeners = me.listeners.slice(0);
+ }
+ l = me.listeners[index];
+ if(l.task) {
+ l.task.cancel();
+ delete l.task;
+ }
+ k = l.tasks && l.tasks.length;
+ if(k) {
+ while(k--) {
+ l.tasks[k].cancel();
+ }
+ delete l.tasks;
+ }
+ me.listeners.splice(index, 1);
+ ret = TRUE;
+ }
+ return ret;
+ },
+
+
+ clearListeners : function(){
+ var me = this,
+ l = me.listeners,
+ i = l.length;
+ while(i--) {
+ me.removeListener(l[i].fn, l[i].scope);
+ }
+ },
+
+ fire : function(){
+ var me = this,
+ listeners = me.listeners,
+ len = listeners.length,
+ i = 0,
+ l;
+
+ if(len > 0){
+ me.firing = TRUE;
+ var args = Array.prototype.slice.call(arguments, 0);
+ for (; i < len; i++) {
+ l = listeners[i];
+ if(l && l.fireFn.apply(l.scope || me.obj || window, args) === FALSE) {
+ return (me.firing = FALSE);
+ }
+ }
+ }
+ me.firing = FALSE;
+ return TRUE;
+ }
+
+};
+})();
+
+Ext.DomHelper = function(){
+ var tempTableEl = null,
+ emptyTags = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i,
+ tableRe = /^table|tbody|tr|td$/i,
+ confRe = /tag|children|cn|html$/i,
+ tableElRe = /td|tr|tbody/i,
+ cssRe = /([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,
+ endRe = /end/i,
+ pub,
+
+ afterbegin = 'afterbegin',
+ afterend = 'afterend',
+ beforebegin = 'beforebegin',
+ beforeend = 'beforeend',
+ ts = '<table>',
+ te = '</table>',
+ tbs = ts+'<tbody>',
+ tbe = '</tbody>'+te,
+ trs = tbs + '<tr>',
+ tre = '</tr>'+tbe;
+
+
+ function doInsert(el, o, returnElement, pos, sibling, append){
+ var newNode = pub.insertHtml(pos, Ext.getDom(el), createHtml(o));
+ return returnElement ? Ext.get(newNode, true) : newNode;
+ }
+
+
+ function createHtml(o){
+ var b = '',
+ attr,
+ val,
+ key,
+ cn;
+
+ if(typeof o == "string"){
+ b = o;
+ } else if (Ext.isArray(o)) {
+ for (var i=0; i < o.length; i++) {
+ if(o[i]) {
+ b += createHtml(o[i]);
+ }
+ };
+ } else {
+ b += '<' + (o.tag = o.tag || 'div');
+ for (attr in o) {
+ val = o[attr];
+ if(!confRe.test(attr)){
+ if (typeof val == "object") {
+ b += ' ' + attr + '="';
+ for (key in val) {
+ b += key + ':' + val[key] + ';';
+ };
+ b += '"';
+ }else{
+ b += ' ' + ({cls : 'class', htmlFor : 'for'}[attr] || attr) + '="' + val + '"';
+ }
+ }
+ };
+
+ if (emptyTags.test(o.tag)) {
+ b += '/>';
+ } else {
+ b += '>';
+ if ((cn = o.children || o.cn)) {
+ b += createHtml(cn);
+ } else if(o.html){
+ b += o.html;
+ }
+ b += '</' + o.tag + '>';
+ }
+ }
+ return b;
+ }
+
+ function ieTable(depth, s, h, e){
+ tempTableEl.innerHTML = [s, h, e].join('');
+ var i = -1,
+ el = tempTableEl,
+ ns;
+ while(++i < depth){
+ el = el.firstChild;
+ }
+
+ if(ns = el.nextSibling){
+ var df = document.createDocumentFragment();
+ while(el){
+ ns = el.nextSibling;
+ df.appendChild(el);
+ el = ns;
+ }
+ el = df;
+ }
+ return el;
+ }
+
+
+ function insertIntoTable(tag, where, el, html) {
+ var node,
+ before;
+
+ tempTableEl = tempTableEl || document.createElement('div');
+
+ if(tag == 'td' && (where == afterbegin || where == beforeend) ||
+ !tableElRe.test(tag) && (where == beforebegin || where == afterend)) {
+ return;
+ }
+ before = where == beforebegin ? el :
+ where == afterend ? el.nextSibling :
+ where == afterbegin ? el.firstChild : null;
+
+ if (where == beforebegin || where == afterend) {
+ el = el.parentNode;
+ }
+
+ if (tag == 'td' || (tag == 'tr' && (where == beforeend || where == afterbegin))) {
+ node = ieTable(4, trs, html, tre);
+ } else if ((tag == 'tbody' && (where == beforeend || where == afterbegin)) ||
+ (tag == 'tr' && (where == beforebegin || where == afterend))) {
+ node = ieTable(3, tbs, html, tbe);
+ } else {
+ node = ieTable(2, ts, html, te);
+ }
+ el.insertBefore(node, before);
+ return node;
+ }
+
+
+ function createContextualFragment(html){
+ var div = document.createElement("div"),
+ fragment = document.createDocumentFragment(),
+ i = 0,
+ length, childNodes;
+
+ div.innerHTML = html;
+ childNodes = div.childNodes;
+ length = childNodes.length;
+
+ for (; i < length; i++) {
+ fragment.appendChild(childNodes[i].cloneNode(true));
+ }
+
+ return fragment;
+ }
+
+ pub = {
+
+ markup : function(o){
+ return createHtml(o);
+ },
+
+
+ applyStyles : function(el, styles){
+ if (styles) {
+ var matches;
+
+ el = Ext.fly(el);
+ if (typeof styles == "function") {
+ styles = styles.call();
+ }
+ if (typeof styles == "string") {
+
+ cssRe.lastIndex = 0;
+ while ((matches = cssRe.exec(styles))) {
+ el.setStyle(matches[1], matches[2]);
+ }
+ } else if (typeof styles == "object") {
+ el.setStyle(styles);
+ }
+ }
+ },
+
+ insertHtml : function(where, el, html){
+ var hash = {},
+ hashVal,
+ range,
+ rangeEl,
+ setStart,
+ frag,
+ rs;
+
+ where = where.toLowerCase();
+
+ hash[beforebegin] = ['BeforeBegin', 'previousSibling'];
+ hash[afterend] = ['AfterEnd', 'nextSibling'];
+
+ if (el.insertAdjacentHTML) {
+ if(tableRe.test(el.tagName) && (rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html))){
+ return rs;
+ }
+
+ hash[afterbegin] = ['AfterBegin', 'firstChild'];
+ hash[beforeend] = ['BeforeEnd', 'lastChild'];
+ if ((hashVal = hash[where])) {
+ el.insertAdjacentHTML(hashVal[0], html);
+ return el[hashVal[1]];
+ }
+ } else {
+ range = el.ownerDocument.createRange();
+ setStart = 'setStart' + (endRe.test(where) ? 'After' : 'Before');
+ if (hash[where]) {
+ range[setStart](el);
+ if (!range.createContextualFragment) {
+ frag = createContextualFragment(html);
+ }
+ else {
+ frag = range.createContextualFragment(html);
+ }
+ el.parentNode.insertBefore(frag, where == beforebegin ? el : el.nextSibling);
+ return el[(where == beforebegin ? 'previous' : 'next') + 'Sibling'];
+ } else {
+ rangeEl = (where == afterbegin ? 'first' : 'last') + 'Child';
+ if (el.firstChild) {
+ range[setStart](el[rangeEl]);
+ if (!range.createContextualFragment) {
+ frag = createContextualFragment(html);
+ }
+ else {
+ frag = range.createContextualFragment(html);
+ }
+ if(where == afterbegin){
+ el.insertBefore(frag, el.firstChild);
+ }else{
+ el.appendChild(frag);
+ }
+ } else {
+ el.innerHTML = html;
+ }
+ return el[rangeEl];
+ }
+ }
+ throw 'Illegal insertion point -> "' + where + '"';
+ },
+
+
+ insertBefore : function(el, o, returnElement){
+ return doInsert(el, o, returnElement, beforebegin);
+ },
+
+
+ insertAfter : function(el, o, returnElement){
+ return doInsert(el, o, returnElement, afterend, 'nextSibling');
+ },
+
+
+ insertFirst : function(el, o, returnElement){
+ return doInsert(el, o, returnElement, afterbegin, 'firstChild');
+ },
+
+
+ append : function(el, o, returnElement){
+ return doInsert(el, o, returnElement, beforeend, '', true);
+ },
+
+
+ overwrite : function(el, o, returnElement){
+ el = Ext.getDom(el);
+ el.innerHTML = createHtml(o);
+ return returnElement ? Ext.get(el.firstChild) : el.firstChild;
+ },
+
+ createHtml : createHtml
+ };
+ return pub;
+}();
+
+Ext.Template = function(html){
+ var me = this,
+ a = arguments,
+ buf = [],
+ v;
+
+ if (Ext.isArray(html)) {
+ html = html.join("");
+ } else if (a.length > 1) {
+ for(var i = 0, len = a.length; i < len; i++){
+ v = a[i];
+ if(typeof v == 'object'){
+ Ext.apply(me, v);
+ } else {
+ buf.push(v);
+ }
+ };
+ html = buf.join('');
+ }
+
+
+ me.html = html;
+
+ if (me.compiled) {
+ me.compile();
+ }
+};
+Ext.Template.prototype = {
+
+ re : /\{([\w\-]+)\}/g,
+
+
+
+ applyTemplate : function(values){
+ var me = this;
+
+ return me.compiled ?
+ me.compiled(values) :
+ me.html.replace(me.re, function(m, name){
+ return values[name] !== undefined ? values[name] : "";
+ });
+ },
+
+
+ set : function(html, compile){
+ var me = this;
+ me.html = html;
+ me.compiled = null;
+ return compile ? me.compile() : me;
+ },
+
+
+ compile : function(){
+ var me = this,
+ sep = Ext.isGecko ? "+" : ",";
+
+ function fn(m, name){
+ name = "values['" + name + "']";
+ return "'"+ sep + '(' + name + " == undefined ? '' : " + name + ')' + sep + "'";
+ }
+
+ eval("this.compiled = function(values){ return " + (Ext.isGecko ? "'" : "['") +
+ me.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn) +
+ (Ext.isGecko ? "';};" : "'].join('');};"));
+ return me;
+ },
+
+
+ insertFirst: function(el, values, returnElement){
+ return this.doInsert('afterBegin', el, values, returnElement);
+ },
+
+
+ insertBefore: function(el, values, returnElement){
+ return this.doInsert('beforeBegin', el, values, returnElement);
+ },
+
+
+ insertAfter : function(el, values, returnElement){
+ return this.doInsert('afterEnd', el, values, returnElement);
+ },
+
+
+ append : function(el, values, returnElement){
+ return this.doInsert('beforeEnd', el, values, returnElement);
+ },
+
+ doInsert : function(where, el, values, returnEl){
+ el = Ext.getDom(el);
+ var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));
+ return returnEl ? Ext.get(newNode, true) : newNode;
+ },
+
+
+ overwrite : function(el, values, returnElement){
+ el = Ext.getDom(el);
+ el.innerHTML = this.applyTemplate(values);
+ return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
+ }
+};
+
+Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
+
+
+Ext.Template.from = function(el, config){
+ el = Ext.getDom(el);
+ return new Ext.Template(el.value || el.innerHTML, config || '');
+};
+
+
+Ext.DomQuery = function(){
+ var cache = {},
+ simpleCache = {},
+ valueCache = {},
+ nonSpace = /\S/,
+ trimRe = /^\s+|\s+$/g,
+ tplRe = /\{(\d+)\}/g,
+ modeRe = /^(\s?[\/>+~]\s?|\s|$)/,
+ tagTokenRe = /^(#)?([\w\-\*]+)/,
+ nthRe = /(\d*)n\+?(\d*)/,
+ nthRe2 = /\D/,
+
+
+
+ isIE = window.ActiveXObject ? true : false,
+ key = 30803;
+
+
+
+ eval("var batch = 30803;");
+
+
+
+ function child(parent, index){
+ var i = 0,
+ n = parent.firstChild;
+ while(n){
+ if(n.nodeType == 1){
+ if(++i == index){
+ return n;
+ }
+ }
+ n = n.nextSibling;
+ }
+ return null;
+ }
+
+
+ function next(n){
+ while((n = n.nextSibling) && n.nodeType != 1);
+ return n;
+ }
+
+
+ function prev(n){
+ while((n = n.previousSibling) && n.nodeType != 1);
+ return n;
+ }
+
+
+
+ function children(parent){
+ var n = parent.firstChild,
+ nodeIndex = -1,
+ nextNode;
+ while(n){
+ nextNode = n.nextSibling;
+
+ if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){
+ parent.removeChild(n);
+ }else{
+
+ n.nodeIndex = ++nodeIndex;
+ }
+ n = nextNode;
+ }
+ return this;
+ }
+
+
+
+
+ function byClassName(nodeSet, cls){
+ if(!cls){
+ return nodeSet;
+ }
+ var result = [], ri = -1;
+ for(var i = 0, ci; ci = nodeSet[i]; i++){
+ if((' '+ci.className+' ').indexOf(cls) != -1){
+ result[++ri] = ci;
+ }
+ }
+ return result;
+ };
+
+ function attrValue(n, attr){
+
+ if(!n.tagName && typeof n.length != "undefined"){
+ n = n[0];
+ }
+ if(!n){
+ return null;
+ }
+
+ if(attr == "for"){
+ return n.htmlFor;
+ }
+ if(attr == "class" || attr == "className"){
+ return n.className;
+ }
+ return n.getAttribute(attr) || n[attr];
+
+ };
+
+
+
+
+
+ function getNodes(ns, mode, tagName){
+ var result = [], ri = -1, cs;
+ if(!ns){
+ return result;
+ }
+ tagName = tagName || "*";
+
+ if(typeof ns.getElementsByTagName != "undefined"){
+ ns = [ns];
+ }
+
+
+
+ if(!mode){
+ for(var i = 0, ni; ni = ns[i]; i++){
+ cs = ni.getElementsByTagName(tagName);
+ for(var j = 0, ci; ci = cs[j]; j++){
+ result[++ri] = ci;
+ }
+ }
+
+
+ } else if(mode == "/" || mode == ">"){
+ var utag = tagName.toUpperCase();
+ for(var i = 0, ni, cn; ni = ns[i]; i++){
+ cn = ni.childNodes;
+ for(var j = 0, cj; cj = cn[j]; j++){
+ if(cj.nodeName == utag || cj.nodeName == tagName || tagName == '*'){
+ result[++ri] = cj;
+ }
+ }
+ }
+
+
+ }else if(mode == "+"){
+ var utag = tagName.toUpperCase();
+ for(var i = 0, n; n = ns[i]; i++){
+ while((n = n.nextSibling) && n.nodeType != 1);
+ if(n && (n.nodeName == utag || n.nodeName == tagName || tagName == '*')){
+ result[++ri] = n;
+ }
+ }
+
+
+ }else if(mode == "~"){
+ var utag = tagName.toUpperCase();
+ for(var i = 0, n; n = ns[i]; i++){
+ while((n = n.nextSibling)){
+ if (n.nodeName == utag || n.nodeName == tagName || tagName == '*'){
+ result[++ri] = n;
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ function concat(a, b){
+ if(b.slice){
+ return a.concat(b);
+ }
+ for(var i = 0, l = b.length; i < l; i++){
+ a[a.length] = b[i];
+ }
+ return a;
+ }
+
+ function byTag(cs, tagName){
+ if(cs.tagName || cs == document){
+ cs = [cs];
+ }
+ if(!tagName){
+ return cs;
+ }
+ var result = [], ri = -1;
+ tagName = tagName.toLowerCase();
+ for(var i = 0, ci; ci = cs[i]; i++){
+ if(ci.nodeType == 1 && ci.tagName.toLowerCase() == tagName){
+ result[++ri] = ci;
+ }
+ }
+ return result;
+ }
+
+ function byId(cs, id){
+ if(cs.tagName || cs == document){
+ cs = [cs];
+ }
+ if(!id){
+ return cs;
+ }
+ var result = [], ri = -1;
+ for(var i = 0, ci; ci = cs[i]; i++){
+ if(ci && ci.id == id){
+ result[++ri] = ci;
+ return result;
+ }
+ }
+ return result;
+ }
+
+
+
+ function byAttribute(cs, attr, value, op, custom){
+ var result = [],
+ ri = -1,
+ useGetStyle = custom == "{",
+ fn = Ext.DomQuery.operators[op],
+ a,
+ xml,
+ hasXml;
+
+ for(var i = 0, ci; ci = cs[i]; i++){
+
+ if(ci.nodeType != 1){
+ continue;
+ }
+
+ if(!hasXml){
+ xml = Ext.DomQuery.isXml(ci);
+ hasXml = true;
+ }
+
+
+ if(!xml){
+ if(useGetStyle){
+ a = Ext.DomQuery.getStyle(ci, attr);
+ } else if (attr == "class" || attr == "className"){
+ a = ci.className;
+ } else if (attr == "for"){
+ a = ci.htmlFor;
+ } else if (attr == "href"){
+
+
+ a = ci.getAttribute("href", 2);
+ } else{
+ a = ci.getAttribute(attr);
+ }
+ }else{
+ a = ci.getAttribute(attr);
+ }
+ if((fn && fn(a, value)) || (!fn && a)){
+ result[++ri] = ci;
+ }
+ }
+ return result;
+ }
+
+ function byPseudo(cs, name, value){
+ return Ext.DomQuery.pseudos[name](cs, value);
+ }
+
+ function nodupIEXml(cs){
+ var d = ++key,
+ r;
+ cs[0].setAttribute("_nodup", d);
+ r = [cs[0]];
+ for(var i = 1, len = cs.length; i < len; i++){
+ var c = cs[i];
+ if(!c.getAttribute("_nodup") != d){
+ c.setAttribute("_nodup", d);
+ r[r.length] = c;
+ }
+ }
+ for(var i = 0, len = cs.length; i < len; i++){
+ cs[i].removeAttribute("_nodup");
+ }
+ return r;
+ }
+
+ function nodup(cs){
+ if(!cs){
+ return [];
+ }
+ var len = cs.length, c, i, r = cs, cj, ri = -1;
+ if(!len || typeof cs.nodeType != "undefined" || len == 1){
+ return cs;
+ }
+ if(isIE && typeof cs[0].selectSingleNode != "undefined"){
+ return nodupIEXml(cs);
+ }
+ var d = ++key;
+ cs[0]._nodup = d;
+ for(i = 1; c = cs[i]; i++){
+ if(c._nodup != d){
+ c._nodup = d;
+ }else{
+ r = [];
+ for(var j = 0; j < i; j++){
+ r[++ri] = cs[j];
+ }
+ for(j = i+1; cj = cs[j]; j++){
+ if(cj._nodup != d){
+ cj._nodup = d;
+ r[++ri] = cj;
+ }
+ }
+ return r;
+ }
+ }
+ return r;
+ }
+
+ function quickDiffIEXml(c1, c2){
+ var d = ++key,
+ r = [];
+ for(var i = 0, len = c1.length; i < len; i++){
+ c1[i].setAttribute("_qdiff", d);
+ }
+ for(var i = 0, len = c2.length; i < len; i++){
+ if(c2[i].getAttribute("_qdiff") != d){
+ r[r.length] = c2[i];
+ }
+ }
+ for(var i = 0, len = c1.length; i < len; i++){
+ c1[i].removeAttribute("_qdiff");
+ }
+ return r;
+ }
+
+ function quickDiff(c1, c2){
+ var len1 = c1.length,
+ d = ++key,
+ r = [];
+ if(!len1){
+ return c2;
+ }
+ if(isIE && typeof c1[0].selectSingleNode != "undefined"){
+ return quickDiffIEXml(c1, c2);
+ }
+ for(var i = 0; i < len1; i++){
+ c1[i]._qdiff = d;
+ }
+ for(var i = 0, len = c2.length; i < len; i++){
+ if(c2[i]._qdiff != d){
+ r[r.length] = c2[i];
+ }
+ }
+ return r;
+ }
+
+ function quickId(ns, mode, root, id){
+ if(ns == root){
+ var d = root.ownerDocument || root;
+ return d.getElementById(id);
+ }
+ ns = getNodes(ns, mode, "*");
+ return byId(ns, id);
+ }
+
+ return {
+ getStyle : function(el, name){
+ return Ext.fly(el).getStyle(name);
+ },
+
+ compile : function(path, type){
+ type = type || "select";
+
+
+ var fn = ["var f = function(root){\n var mode; ++batch; var n = root || document;\n"],
+ mode,
+ lastPath,
+ matchers = Ext.DomQuery.matchers,
+ matchersLn = matchers.length,
+ modeMatch,
+
+ lmode = path.match(modeRe);
+
+ if(lmode && lmode[1]){
+ fn[fn.length] = 'mode="'+lmode[1].replace(trimRe, "")+'";';
+ path = path.replace(lmode[1], "");
+ }
+
+
+ while(path.substr(0, 1)=="/"){
+ path = path.substr(1);
+ }
+
+ while(path && lastPath != path){
+ lastPath = path;
+ var tokenMatch = path.match(tagTokenRe);
+ if(type == "select"){
+ if(tokenMatch){
+
+ if(tokenMatch[1] == "#"){
+ fn[fn.length] = 'n = quickId(n, mode, root, "'+tokenMatch[2]+'");';
+ }else{
+ fn[fn.length] = 'n = getNodes(n, mode, "'+tokenMatch[2]+'");';
+ }
+ path = path.replace(tokenMatch[0], "");
+ }else if(path.substr(0, 1) != '@'){
+ fn[fn.length] = 'n = getNodes(n, mode, "*");';
+ }
+
+ }else{
+ if(tokenMatch){
+ if(tokenMatch[1] == "#"){
+ fn[fn.length] = 'n = byId(n, "'+tokenMatch[2]+'");';
+ }else{
+ fn[fn.length] = 'n = byTag(n, "'+tokenMatch[2]+'");';
+ }
+ path = path.replace(tokenMatch[0], "");
+ }
+ }
+ while(!(modeMatch = path.match(modeRe))){
+ var matched = false;
+ for(var j = 0; j < matchersLn; j++){
+ var t = matchers[j];
+ var m = path.match(t.re);
+ if(m){
+ fn[fn.length] = t.select.replace(tplRe, function(x, i){
+ return m[i];
+ });
+ path = path.replace(m[0], "");
+ matched = true;
+ break;
+ }
+ }
+
+ if(!matched){
+ throw 'Error parsing selector, parsing failed at "' + path + '"';
+ }
+ }
+ if(modeMatch[1]){
+ fn[fn.length] = 'mode="'+modeMatch[1].replace(trimRe, "")+'";';
+ path = path.replace(modeMatch[1], "");
+ }
+ }
+
+ fn[fn.length] = "return nodup(n);\n}";
+
+
+ eval(fn.join(""));
+ return f;
+ },
+
+
+ jsSelect: function(path, root, type){
+
+ root = root || document;
+
+ if(typeof root == "string"){
+ root = document.getElementById(root);
+ }
+ var paths = path.split(","),
+ results = [];
+
+
+ for(var i = 0, len = paths.length; i < len; i++){
+ var subPath = paths[i].replace(trimRe, "");
+
+ if(!cache[subPath]){
+ cache[subPath] = Ext.DomQuery.compile(subPath);
+ if(!cache[subPath]){
+ throw subPath + " is not a valid selector";
+ }
+ }
+ var result = cache[subPath](root);
+ if(result && result != document){
+ results = results.concat(result);
+ }
+ }
+
+
+
+ if(paths.length > 1){
+ return nodup(results);
+ }
+ return results;
+ },
+ isXml: function(el) {
+ var docEl = (el ? el.ownerDocument || el : 0).documentElement;
+ return docEl ? docEl.nodeName !== "HTML" : false;
+ },
+ select : document.querySelectorAll ? function(path, root, type) {
+ root = root || document;
+ if (!Ext.DomQuery.isXml(root)) {
+ try {
+ var cs = root.querySelectorAll(path);
+ return Ext.toArray(cs);
+ }
+ catch (ex) {}
+ }
+ return Ext.DomQuery.jsSelect.call(this, path, root, type);
+ } : function(path, root, type) {
+ return Ext.DomQuery.jsSelect.call(this, path, root, type);
+ },
+
+
+ selectNode : function(path, root){
+ return Ext.DomQuery.select(path, root)[0];
+ },
+
+
+ selectValue : function(path, root, defaultValue){
+ path = path.replace(trimRe, "");
+ if(!valueCache[path]){
+ valueCache[path] = Ext.DomQuery.compile(path, "select");
+ }
+ var n = valueCache[path](root), v;
+ n = n[0] ? n[0] : n;
+
+
+
+
+
+ if (typeof n.normalize == 'function') n.normalize();
+
+ v = (n && n.firstChild ? n.firstChild.nodeValue : null);
+ return ((v === null||v === undefined||v==='') ? defaultValue : v);
+ },
+
+
+ selectNumber : function(path, root, defaultValue){
+ var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0);
+ return parseFloat(v);
+ },
+
+
+ is : function(el, ss){
+ if(typeof el == "string"){
+ el = document.getElementById(el);
+ }
+ var isArray = Ext.isArray(el),
+ result = Ext.DomQuery.filter(isArray ? el : [el], ss);
+ return isArray ? (result.length == el.length) : (result.length > 0);
+ },
+
+
+ filter : function(els, ss, nonMatches){
+ ss = ss.replace(trimRe, "");
+ if(!simpleCache[ss]){
+ simpleCache[ss] = Ext.DomQuery.compile(ss, "simple");
+ }
+ var result = simpleCache[ss](els);
+ return nonMatches ? quickDiff(result, els) : result;
+ },
+
+
+ matchers : [{
+ re: /^\.([\w\-]+)/,
+ select: 'n = byClassName(n, " {1} ");'
+ }, {
+ re: /^\:([\w\-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,
+ select: 'n = byPseudo(n, "{1}", "{2}");'
+ },{
+ re: /^(?:([\[\{])(?:@)?([\w\-]+)\s?(?:(=|.=)\s?(["']?)(.*?)\4)?[\]\}])/,
+ select: 'n = byAttribute(n, "{2}", "{5}", "{3}", "{1}");'
+ }, {
+ re: /^#([\w\-]+)/,
+ select: 'n = byId(n, "{1}");'
+ },{
+ re: /^@([\w\-]+)/,
+ select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'
+ }
+ ],
+
+ /**
+ * Collection of operator comparison functions. The default operators are =, !=, ^=, $=, *=, %=, |= and ~=.
+ * New operators can be added as long as the match the format <i>c</i>= where <i>c</i> is any character other than space, &gt; &lt;.
+ */
+ operators : {
+ "=" : function(a, v){
+ return a == v;
+ },
+ "!=" : function(a, v){
+ return a != v;
+ },
+ "^=" : function(a, v){
+ return a && a.substr(0, v.length) == v;
+ },
+ "$=" : function(a, v){
+ return a && a.substr(a.length-v.length) == v;
+ },
+ "*=" : function(a, v){
+ return a && a.indexOf(v) !== -1;
+ },
+ "%=" : function(a, v){
+ return (a % v) == 0;
+ },
+ "|=" : function(a, v){
+ return a && (a == v || a.substr(0, v.length+1) == v+'-');
+ },
+ "~=" : function(a, v){
+ return a && (' '+a+' ').indexOf(' '+v+' ') != -1;
+ }
+ },
+
+ /**
+ * <p>Object hash of "pseudo class" filter functions which are used when filtering selections. Each function is passed
+ * two parameters:</p><div class="mdetail-params"><ul>
+ * <li><b>c</b> : Array<div class="sub-desc">An Array of DOM elements to filter.</div></li>
+ * <li><b>v</b> : String<div class="sub-desc">The argument (if any) supplied in the selector.</div></li>
+ * </ul></div>
+ * <p>A filter function returns an Array of DOM elements which conform to the pseudo class.</p>
+ * <p>In addition to the provided pseudo classes listed above such as <code>first-child</code> and <code>nth-child</code>,
+ * developers may add additional, custom psuedo class filters to select elements according to application-specific requirements.</p>
+ * <p>For example, to filter <code>&lt;a></code> elements to only return links to <i>external</i> resources:</p>
+ * <code><pre>
+Ext.DomQuery.pseudos.external = function(c, v){
+ var r = [], ri = -1;
+ for(var i = 0, ci; ci = c[i]; i++){
+// Include in result set only if it's a link to an external resource
+ if(ci.hostname != location.hostname){
+ r[++ri] = ci;
+ }
+ }
+ return r;
+};</pre></code>
+ * Then external links could be gathered with the following statement:<code><pre>
+var externalLinks = Ext.select("a:external");
+</code></pre>
+ */
+ pseudos : {
+ "first-child" : function(c){
+ var r = [], ri = -1, n;
+ for(var i = 0, ci; ci = n = c[i]; i++){
+ while((n = n.previousSibling) && n.nodeType != 1);
+ if(!n){
+ r[++ri] = ci;
+ }
+ }
+ return r;
+ },
+
+ "last-child" : function(c){
+ var r = [], ri = -1, n;
+ for(var i = 0, ci; ci = n = c[i]; i++){
+ while((n = n.nextSibling) && n.nodeType != 1);
+ if(!n){
+ r[++ri] = ci;
+ }
+ }
+ return r;
+ },
+
+ "nth-child" : function(c, a) {
+ var r = [], ri = -1,
+ m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a),
+ f = (m[1] || 1) - 0, l = m[2] - 0;
+ for(var i = 0, n; n = c[i]; i++){
+ var pn = n.parentNode;
+ if (batch != pn._batch) {
+ var j = 0;
+ for(var cn = pn.firstChild; cn; cn = cn.nextSibling){
+ if(cn.nodeType == 1){
+ cn.nodeIndex = ++j;
+ }
+ }
+ pn._batch = batch;
+ }
+ if (f == 1) {
+ if (l == 0 || n.nodeIndex == l){
+ r[++ri] = n;
+ }
+ } else if ((n.nodeIndex + l) % f == 0){
+ r[++ri] = n;
+ }
+ }
+
+ return r;
+ },
+
+ "only-child" : function(c){
+ var r = [], ri = -1;;
+ for(var i = 0, ci; ci = c[i]; i++){
+ if(!prev(ci) && !next(ci)){
+ r[++ri] = ci;
+ }
+ }
+ return r;
+ },
+
+ "empty" : function(c){
+ var r = [], ri = -1;
+ for(var i = 0, ci; ci = c[i]; i++){
+ var cns = ci.childNodes, j = 0, cn, empty = true;
+ while(cn = cns[j]){
+ ++j;
+ if(cn.nodeType == 1 || cn.nodeType == 3){
+ empty = false;
+ break;
+ }
+ }
+ if(empty){
+ r[++ri] = ci;
+ }
+ }
+ return r;
+ },
+
+ "contains" : function(c, v){
+ var r = [], ri = -1;
+ for(var i = 0, ci; ci = c[i]; i++){
+ if((ci.textContent||ci.innerText||'').indexOf(v) != -1){
+ r[++ri] = ci;
+ }
+ }
+ return r;
+ },
+
+ "nodeValue" : function(c, v){
+ var r = [], ri = -1;
+ for(var i = 0, ci; ci = c[i]; i++){
+ if(ci.firstChild && ci.firstChild.nodeValue == v){
+ r[++ri] = ci;
+ }
+ }
+ return r;
+ },
+
+ "checked" : function(c){
+ var r = [], ri = -1;
+ for(var i = 0, ci; ci = c[i]; i++){
+ if(ci.checked == true){
+ r[++ri] = ci;
+ }
+ }
+ return r;
+ },
+
+ "not" : function(c, ss){
+ return Ext.DomQuery.filter(c, ss, true);
+ },
+
+ "any" : function(c, selectors){
+ var ss = selectors.split('|'),
+ r = [], ri = -1, s;
+ for(var i = 0, ci; ci = c[i]; i++){
+ for(var j = 0; s = ss[j]; j++){
+ if(Ext.DomQuery.is(ci, s)){
+ r[++ri] = ci;
+ break;
+ }
+ }
+ }
+ return r;
+ },
+
+ "odd" : function(c){
+ return this["nth-child"](c, "odd");
+ },
+
+ "even" : function(c){
+ return this["nth-child"](c, "even");
+ },
+
+ "nth" : function(c, a){
+ return c[a-1] || [];
+ },
+
+ "first" : function(c){
+ return c[0] || [];
+ },
+
+ "last" : function(c){
+ return c[c.length-1] || [];
+ },
+
+ "has" : function(c, ss){
+ var s = Ext.DomQuery.select,
+ r = [], ri = -1;
+ for(var i = 0, ci; ci = c[i]; i++){
+ if(s(ss, ci).length > 0){
+ r[++ri] = ci;
+ }
+ }
+ return r;
+ },
+
+ "next" : function(c, ss){
+ var is = Ext.DomQuery.is,
+ r = [], ri = -1;
+ for(var i = 0, ci; ci = c[i]; i++){
+ var n = next(ci);
+ if(n && is(n, ss)){
+ r[++ri] = ci;
+ }
+ }
+ return r;
+ },
+
+ "prev" : function(c, ss){
+ var is = Ext.DomQuery.is,
+ r = [], ri = -1;
+ for(var i = 0, ci; ci = c[i]; i++){
+ var n = prev(ci);
+ if(n && is(n, ss)){
+ r[++ri] = ci;
+ }
+ }
+ return r;
+ }
+ }
+ };
+}();
+
+/**
+ * Selects an array of DOM nodes by CSS/XPath selector. Shorthand of {@link Ext.DomQuery#select}
+ * @param {String} path The selector/xpath query
+ * @param {Node} root (optional) The start of the query (defaults to document).
+ * @return {Array}
+ * @member Ext
+ * @method query
+ */
+Ext.query = Ext.DomQuery.select;
+/**
+ * @class Ext.util.DelayedTask
+ * <p> The DelayedTask class provides a convenient way to "buffer" the execution of a method,
+ * performing setTimeout where a new timeout cancels the old timeout. When called, the
+ * task will wait the specified time period before executing. If durng that time period,
+ * the task is called again, the original call will be cancelled. This continues so that
+ * the function is only called a single time for each iteration.</p>
+ * <p>This method is especially useful for things like detecting whether a user has finished
+ * typing in a text field. An example would be performing validation on a keypress. You can
+ * use this class to buffer the keypress events for a certain number of milliseconds, and
+ * perform only if they stop for that amount of time. Usage:</p><pre><code>
+var task = new Ext.util.DelayedTask(function(){
+ alert(Ext.getDom('myInputField').value.length);
+});
+// Wait 500ms before calling our function. If the user presses another key
+// during that 500ms, it will be cancelled and we'll wait another 500ms.
+Ext.get('myInputField').on('keypress', function(){
+ task.{@link #delay}(500);
+});
+ * </code></pre>
+ * <p>Note that we are using a DelayedTask here to illustrate a point. The configuration
+ * option <tt>buffer</tt> for {@link Ext.util.Observable#addListener addListener/on} will
+ * also setup a delayed task for you to buffer events.</p>
+ * @constructor The parameters to this constructor serve as defaults and are not required.
+ * @param {Function} fn (optional) The default function to call.
+ * @param {Object} scope (optional) The default scope (The <code><b>this</b></code> reference) in which the
+ * function is called. If not specified, <code>this</code> will refer to the browser window.
+ * @param {Array} args (optional) The default Array of arguments.
+ */
+Ext.util.DelayedTask = function(fn, scope, args){
+ var me = this,
+ id,
+ call = function(){
+ clearInterval(id);
+ id = null;
+ fn.apply(scope, args || []);
+ };
+
+ /**
+ * Cancels any pending timeout and queues a new one
+ * @param {Number} delay The milliseconds to delay
+ * @param {Function} newFn (optional) Overrides function passed to constructor
+ * @param {Object} newScope (optional) Overrides scope passed to constructor. Remember that if no scope
+ * is specified, <code>this</code> will refer to the browser window.
+ * @param {Array} newArgs (optional) Overrides args passed to constructor
+ */
+ me.delay = function(delay, newFn, newScope, newArgs){
+ me.cancel();
+ fn = newFn || fn;
+ scope = newScope || scope;
+ args = newArgs || args;
+ id = setInterval(call, delay);
+ };
+
+ /**
+ * Cancel the last queued timeout
+ */
+ me.cancel = function(){
+ if(id){
+ clearInterval(id);
+ id = null;
+ }
+ };
+};/**
+ * @class Ext.Element
+ * <p>Encapsulates a DOM element, adding simple DOM manipulation facilities, normalizing for browser differences.</p>
+ * <p>All instances of this class inherit the methods of {@link Ext.Fx} making visual effects easily available to all DOM elements.</p>
+ * <p>Note that the events documented in this class are not Ext events, they encapsulate browser events. To
+ * access the underlying browser event, see {@link Ext.EventObject#browserEvent}. Some older
+ * browsers may not support the full range of events. Which events are supported is beyond the control of ExtJs.</p>
+ * Usage:<br>
+<pre><code>
+// by id
+var el = Ext.get("my-div");
+
+// by DOM element reference
+var el = Ext.get(myDivElement);
+</code></pre>
+ * <b>Animations</b><br />
+ * <p>When an element is manipulated, by default there is no animation.</p>
+ * <pre><code>
+var el = Ext.get("my-div");
+
+// no animation
+el.setWidth(100);
+ * </code></pre>
+ * <p>Many of the functions for manipulating an element have an optional "animate" parameter. This
+ * parameter can be specified as boolean (<tt>true</tt>) for default animation effects.</p>
+ * <pre><code>
+// default animation
+el.setWidth(100, true);
+ * </code></pre>
+ *
+ * <p>To configure the effects, an object literal with animation options to use as the Element animation
+ * configuration object can also be specified. Note that the supported Element animation configuration
+ * options are a subset of the {@link Ext.Fx} animation options specific to Fx effects. The supported
+ * Element animation configuration options are:</p>
+<pre>
+Option Default Description
+--------- -------- ---------------------------------------------
+{@link Ext.Fx#duration duration} .35 The duration of the animation in seconds
+{@link Ext.Fx#easing easing} easeOut The easing method
+{@link Ext.Fx#callback callback} none A function to execute when the anim completes
+{@link Ext.Fx#scope scope} this The scope (this) of the callback function
+</pre>
+ *
+ * <pre><code>
+// Element animation options object
+var opt = {
+ {@link Ext.Fx#duration duration}: 1,
+ {@link Ext.Fx#easing easing}: 'elasticIn',
+ {@link Ext.Fx#callback callback}: this.foo,
+ {@link Ext.Fx#scope scope}: this
+};
+// animation with some options set
+el.setWidth(100, opt);
+ * </code></pre>
+ * <p>The Element animation object being used for the animation will be set on the options
+ * object as "anim", which allows you to stop or manipulate the animation. Here is an example:</p>
+ * <pre><code>
+// using the "anim" property to get the Anim object
+if(opt.anim.isAnimated()){
+ opt.anim.stop();
+}
+ * </code></pre>
+ * <p>Also see the <tt>{@link #animate}</tt> method for another animation technique.</p>
+ * <p><b> Composite (Collections of) Elements</b></p>
+ * <p>For working with collections of Elements, see {@link Ext.CompositeElement}</p>
+ * @constructor Create a new Element directly.
+ * @param {String/HTMLElement} element
+ * @param {Boolean} forceNew (optional) By default the constructor checks to see if there is already an instance of this element in the cache and if there is it returns the same instance. This will skip that check (useful for extending this class).
+ */
+(function(){
+var DOC = document;
+
+Ext.Element = function(element, forceNew){
+ var dom = typeof element == "string" ?
+ DOC.getElementById(element) : element,
+ id;
+
+ if(!dom) return null;
+
+ id = dom.id;
+
+ if(!forceNew && id && Ext.elCache[id]){ // element object already exists
+ return Ext.elCache[id].el;
+ }
+
+ /**
+ * The DOM element
+ * @type HTMLElement
+ */
+ this.dom = dom;
+
+ /**
+ * The DOM element ID
+ * @type String
+ */
+ this.id = id || Ext.id(dom);
+};
+
+var DH = Ext.DomHelper,
+ El = Ext.Element,
+ EC = Ext.elCache;
+
+El.prototype = {
+ /**
+ * Sets the passed attributes as attributes of this element (a style attribute can be a string, object or function)
+ * @param {Object} o The object with the attributes
+ * @param {Boolean} useSet (optional) false to override the default setAttribute to use expandos.
+ * @return {Ext.Element} this
+ */
+ set : function(o, useSet){
+ var el = this.dom,
+ attr,
+ val,
+ useSet = (useSet !== false) && !!el.setAttribute;
+
+ for (attr in o) {
+ if (o.hasOwnProperty(attr)) {
+ val = o[attr];
+ if (attr == 'style') {
+ DH.applyStyles(el, val);
+ } else if (attr == 'cls') {
+ el.className = val;
+ } else if (useSet) {
+ el.setAttribute(attr, val);
+ } else {
+ el[attr] = val;
+ }
+ }
+ }
+ return this;
+ },
+
+// Mouse events
+ /**
+ * @event click
+ * Fires when a mouse click is detected within the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event contextmenu
+ * Fires when a right click is detected within the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event dblclick
+ * Fires when a mouse double click is detected within the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event mousedown
+ * Fires when a mousedown is detected within the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event mouseup
+ * Fires when a mouseup is detected within the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event mouseover
+ * Fires when a mouseover is detected within the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event mousemove
+ * Fires when a mousemove is detected with the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event mouseout
+ * Fires when a mouseout is detected with the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event mouseenter
+ * Fires when the mouse enters the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event mouseleave
+ * Fires when the mouse leaves the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+
+// Keyboard events
+ /**
+ * @event keypress
+ * Fires when a keypress is detected within the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event keydown
+ * Fires when a keydown is detected within the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event keyup
+ * Fires when a keyup is detected within the element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+
+
+// HTML frame/object events
+ /**
+ * @event load
+ * Fires when the user agent finishes loading all content within the element. Only supported by window, frames, objects and images.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event unload
+ * Fires when the user agent removes all content from a window or frame. For elements, it fires when the target element or any of its content has been removed.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event abort
+ * Fires when an object/image is stopped from loading before completely loaded.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event error
+ * Fires when an object/image/frame cannot be loaded properly.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event resize
+ * Fires when a document view is resized.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event scroll
+ * Fires when a document view is scrolled.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+
+// Form events
+ /**
+ * @event select
+ * Fires when a user selects some text in a text field, including input and textarea.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event change
+ * Fires when a control loses the input focus and its value has been modified since gaining focus.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event submit
+ * Fires when a form is submitted.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event reset
+ * Fires when a form is reset.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event focus
+ * Fires when an element receives focus either via the pointing device or by tab navigation.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event blur
+ * Fires when an element loses focus either via the pointing device or by tabbing navigation.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+
+// User Interface events
+ /**
+ * @event DOMFocusIn
+ * Where supported. Similar to HTML focus event, but can be applied to any focusable element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event DOMFocusOut
+ * Where supported. Similar to HTML blur event, but can be applied to any focusable element.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event DOMActivate
+ * Where supported. Fires when an element is activated, for instance, through a mouse click or a keypress.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+
+// DOM Mutation events
+ /**
+ * @event DOMSubtreeModified
+ * Where supported. Fires when the subtree is modified.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event DOMNodeInserted
+ * Where supported. Fires when a node has been added as a child of another node.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event DOMNodeRemoved
+ * Where supported. Fires when a descendant node of the element is removed.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event DOMNodeRemovedFromDocument
+ * Where supported. Fires when a node is being removed from a document.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event DOMNodeInsertedIntoDocument
+ * Where supported. Fires when a node is being inserted into a document.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event DOMAttrModified
+ * Where supported. Fires when an attribute has been modified.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+ /**
+ * @event DOMCharacterDataModified
+ * Where supported. Fires when the character data has been modified.
+ * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event.
+ * @param {HtmlElement} t The target of the event.
+ * @param {Object} o The options configuration passed to the {@link #addListener} call.
+ */
+
+ /**
+ * The default unit to append to CSS values where a unit isn't provided (defaults to px).
+ * @type String
+ */
+ defaultUnit : "px",
+
+ /**
+ * Returns true if this element matches the passed simple selector (e.g. div.some-class or span:first-child)
+ * @param {String} selector The simple selector to test
+ * @return {Boolean} True if this element matches the selector, else false
+ */
+ is : function(simpleSelector){
+ return Ext.DomQuery.is(this.dom, simpleSelector);
+ },
+
+ /**
+ * Tries to focus the element. Any exceptions are caught and ignored.
+ * @param {Number} defer (optional) Milliseconds to defer the focus
+ * @return {Ext.Element} this
+ */
+ focus : function(defer, /* private */ dom) {
+ var me = this,
+ dom = dom || me.dom;
+ try{
+ if(Number(defer)){
+ me.focus.defer(defer, null, [null, dom]);
+ }else{
+ dom.focus();
+ }
+ }catch(e){}
+ return me;
+ },
+
+ /**
+ * Tries to blur the element. Any exceptions are caught and ignored.
+ * @return {Ext.Element} this
+ */
+ blur : function() {
+ try{
+ this.dom.blur();
+ }catch(e){}
+ return this;
+ },
+
+ /**
+ * Returns the value of the "value" attribute
+ * @param {Boolean} asNumber true to parse the value as a number
+ * @return {String/Number}
+ */
+ getValue : function(asNumber){
+ var val = this.dom.value;
+ return asNumber ? parseInt(val, 10) : val;
+ },
+
+ /**
+ * Appends an event handler to this element. The shorthand version {@link #on} is equivalent.
+ * @param {String} eventName The name of event to handle.
+ * @param {Function} fn The handler function the event invokes. This function is passed
+ * the following parameters:<ul>
+ * <li><b>evt</b> : EventObject<div class="sub-desc">The {@link Ext.EventObject EventObject} describing the event.</div></li>
+ * <li><b>el</b> : HtmlElement<div class="sub-desc">The DOM element which was the target of the event.
+ * Note that this may be filtered by using the <tt>delegate</tt> option.</div></li>
+ * <li><b>o</b> : Object<div class="sub-desc">The options object from the addListener call.</div></li>
+ * </ul>
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the handler function is executed.
+ * <b>If omitted, defaults to this Element.</b>.
+ * @param {Object} options (optional) An object containing handler configuration properties.
+ * This may contain any of the following properties:<ul>
+ * <li><b>scope</b> Object : <div class="sub-desc">The scope (<code><b>this</b></code> reference) in which the handler function is executed.
+ * <b>If omitted, defaults to this Element.</b></div></li>
+ * <li><b>delegate</b> String: <div class="sub-desc">A simple selector to filter the target or look for a descendant of the target. See below for additional details.</div></li>
+ * <li><b>stopEvent</b> Boolean: <div class="sub-desc">True to stop the event. That is stop propagation, and prevent the default action.</div></li>
+ * <li><b>preventDefault</b> Boolean: <div class="sub-desc">True to prevent the default action</div></li>
+ * <li><b>stopPropagation</b> Boolean: <div class="sub-desc">True to prevent event propagation</div></li>
+ * <li><b>normalized</b> Boolean: <div class="sub-desc">False to pass a browser event to the handler function instead of an Ext.EventObject</div></li>
+ * <li><b>target</b> Ext.Element: <div class="sub-desc">Only call the handler if the event was fired on the target Element, <i>not</i> if the event was bubbled up from a child node.</div></li>
+ * <li><b>delay</b> Number: <div class="sub-desc">The number of milliseconds to delay the invocation of the handler after the event fires.</div></li>
+ * <li><b>single</b> Boolean: <div class="sub-desc">True to add a handler to handle just the next firing of the event, and then remove itself.</div></li>
+ * <li><b>buffer</b> Number: <div class="sub-desc">Causes the handler to be scheduled to run in an {@link Ext.util.DelayedTask} delayed
+ * by the specified number of milliseconds. If the event fires again within that time, the original
+ * handler is <em>not</em> invoked, but the new handler is scheduled in its place.</div></li>
+ * </ul><br>
+ * <p>
+ * <b>Combining Options</b><br>
+ * In the following examples, the shorthand form {@link #on} is used rather than the more verbose
+ * addListener. The two are equivalent. Using the options argument, it is possible to combine different
+ * types of listeners:<br>
+ * <br>
+ * A delayed, one-time listener that auto stops the event and adds a custom argument (forumId) to the
+ * options object. The options object is available as the third parameter in the handler function.<div style="margin: 5px 20px 20px;">
+ * Code:<pre><code>
+el.on('click', this.onClick, this, {
+ single: true,
+ delay: 100,
+ stopEvent : true,
+ forumId: 4
+});</code></pre></p>
+ * <p>
+ * <b>Attaching multiple handlers in 1 call</b><br>
+ * The method also allows for a single argument to be passed which is a config object containing properties
+ * which specify multiple handlers.</p>
+ * <p>
+ * Code:<pre><code>
+el.on({
+ 'click' : {
+ fn: this.onClick,
+ scope: this,
+ delay: 100
+ },
+ 'mouseover' : {
+ fn: this.onMouseOver,
+ scope: this
+ },
+ 'mouseout' : {
+ fn: this.onMouseOut,
+ scope: this
+ }
+});</code></pre>
+ * <p>
+ * Or a shorthand syntax:<br>
+ * Code:<pre><code></p>
+el.on({
+ 'click' : this.onClick,
+ 'mouseover' : this.onMouseOver,
+ 'mouseout' : this.onMouseOut,
+ scope: this
+});
+ * </code></pre></p>
+ * <p><b>delegate</b></p>
+ * <p>This is a configuration option that you can pass along when registering a handler for
+ * an event to assist with event delegation. Event delegation is a technique that is used to
+ * reduce memory consumption and prevent exposure to memory-leaks. By registering an event
+ * for a container element as opposed to each element within a container. By setting this
+ * configuration option to a simple selector, the target element will be filtered to look for
+ * a descendant of the target.
+ * For example:<pre><code>
+// using this markup:
+&lt;div id='elId'>
+ &lt;p id='p1'>paragraph one&lt;/p>
+ &lt;p id='p2' class='clickable'>paragraph two&lt;/p>
+ &lt;p id='p3'>paragraph three&lt;/p>
+&lt;/div>
+// utilize event delegation to registering just one handler on the container element:
+el = Ext.get('elId');
+el.on(
+ 'click',
+ function(e,t) {
+ // handle click
+ console.info(t.id); // 'p2'
+ },
+ this,
+ {
+ // filter the target element to be a descendant with the class 'clickable'
+ delegate: '.clickable'
+ }
+);
+ * </code></pre></p>
+ * @return {Ext.Element} this
+ */
+ addListener : function(eventName, fn, scope, options){
+ Ext.EventManager.on(this.dom, eventName, fn, scope || this, options);
+ return this;
+ },
+
+ /**
+ * Removes an event handler from this element. The shorthand version {@link #un} is equivalent.
+ * <b>Note</b>: if a <i>scope</i> was explicitly specified when {@link #addListener adding} the
+ * listener, the same scope must be specified here.
+ * Example:
+ * <pre><code>
+el.removeListener('click', this.handlerFn);
+// or
+el.un('click', this.handlerFn);
+</code></pre>
+ * @param {String} eventName The name of the event from which to remove the handler.
+ * @param {Function} fn The handler function to remove. <b>This must be a reference to the function passed into the {@link #addListener} call.</b>
+ * @param {Object} scope If a scope (<b><code>this</code></b> reference) was specified when the listener was added,
+ * then this must refer to the same object.
+ * @return {Ext.Element} this
+ */
+ removeListener : function(eventName, fn, scope){
+ Ext.EventManager.removeListener(this.dom, eventName, fn, scope || this);
+ return this;
+ },
+
+ /**
+ * Removes all previous added listeners from this element
+ * @return {Ext.Element} this
+ */
+ removeAllListeners : function(){
+ Ext.EventManager.removeAll(this.dom);
+ return this;
+ },
+
+ /**
+ * Recursively removes all previous added listeners from this element and its children
+ * @return {Ext.Element} this
+ */
+ purgeAllListeners : function() {
+ Ext.EventManager.purgeElement(this, true);
+ return this;
+ },
+ /**
+ * @private Test if size has a unit, otherwise appends the default
+ */
+ addUnits : function(size){
+ if(size === "" || size == "auto" || size === undefined){
+ size = size || '';
+ } else if(!isNaN(size) || !unitPattern.test(size)){
+ size = size + (this.defaultUnit || 'px');
+ }
+ return size;
+ },
+
+ /**
+ * <p>Updates the <a href="http:
+ * from a specified URL. Note that this is subject to the <a href="http://en.wikipedia.org/wiki/Same_origin_policy">Same Origin Policy</a></p>
+ * <p>Updating innerHTML of an element will <b>not</b> execute embedded <tt>&lt;script></tt> elements. This is a browser restriction.</p>
+ * @param {Mixed} options. Either a sring containing the URL from which to load the HTML, or an {@link Ext.Ajax#request} options object specifying
+ * exactly how to request the HTML.
+ * @return {Ext.Element} this
+ */
+ load : function(url, params, cb){
+ Ext.Ajax.request(Ext.apply({
+ params: params,
+ url: url.url || url,
+ callback: cb,
+ el: this.dom,
+ indicatorText: url.indicatorText || ''
+ }, Ext.isObject(url) ? url : {}));
+ return this;
+ },
+
+
+ isBorderBox : function(){
+ return Ext.isBorderBox || Ext.isForcedBorderBox || noBoxAdjust[(this.dom.tagName || "").toLowerCase()];
+ },
+
+
+ remove : function(){
+ var me = this,
+ dom = me.dom;
+
+ if (dom) {
+ delete me.dom;
+ Ext.removeNode(dom);
+ }
+ },
+
+
+ hover : function(overFn, outFn, scope, options){
+ var me = this;
+ me.on('mouseenter', overFn, scope || me.dom, options);
+ me.on('mouseleave', outFn, scope || me.dom, options);
+ return me;
+ },
+
+
+ contains : function(el){
+ return !el ? false : Ext.lib.Dom.isAncestor(this.dom, el.dom ? el.dom : el);
+ },
+
+
+ getAttributeNS : function(ns, name){
+ return this.getAttribute(name, ns);
+ },
+
+
+ getAttribute: (function(){
+ var test = document.createElement('table'),
+ isBrokenOnTable = false,
+ hasGetAttribute = 'getAttribute' in test,
+ unknownRe = /undefined|unknown/;
+
+ if (hasGetAttribute) {
+
+ try {
+ test.getAttribute('ext:qtip');
+ } catch (e) {
+ isBrokenOnTable = true;
+ }
+
+ return function(name, ns) {
+ var el = this.dom,
+ value;
+
+ if (el.getAttributeNS) {
+ value = el.getAttributeNS(ns, name) || null;
+ }
+
+ if (value == null) {
+ if (ns) {
+ if (isBrokenOnTable && el.tagName.toUpperCase() == 'TABLE') {
+ try {
+ value = el.getAttribute(ns + ':' + name);
+ } catch (e) {
+ value = '';
+ }
+ } else {
+ value = el.getAttribute(ns + ':' + name);
+ }
+ } else {
+ value = el.getAttribute(name) || el[name];
+ }
+ }
+ return value || '';
+ };
+ } else {
+ return function(name, ns) {
+ var el = this.om,
+ value,
+ attribute;
+
+ if (ns) {
+ attribute = el[ns + ':' + name];
+ value = unknownRe.test(typeof attribute) ? undefined : attribute;
+ } else {
+ value = el[name];
+ }
+ return value || '';
+ };
+ }
+ test = null;
+ })(),
+
+
+ update : function(html) {
+ if (this.dom) {
+ this.dom.innerHTML = html;
+ }
+ return this;
+ }
+};
+
+var ep = El.prototype;
+
+El.addMethods = function(o){
+ Ext.apply(ep, o);
+};
+
+
+ep.on = ep.addListener;
+
+
+ep.un = ep.removeListener;
+
+
+ep.autoBoxAdjust = true;
+
+
+var unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,
+ docEl;
+
+
+El.get = function(el){
+ var ex,
+ elm,
+ id;
+ if(!el){ return null; }
+ if (typeof el == "string") {
+ if (!(elm = DOC.getElementById(el))) {
+ return null;
+ }
+ if (EC[el] && EC[el].el) {
+ ex = EC[el].el;
+ ex.dom = elm;
+ } else {
+ ex = El.addToCache(new El(elm));
+ }
+ return ex;
+ } else if (el.tagName) {
+ if(!(id = el.id)){
+ id = Ext.id(el);
+ }
+ if (EC[id] && EC[id].el) {
+ ex = EC[id].el;
+ ex.dom = el;
+ } else {
+ ex = El.addToCache(new El(el));
+ }
+ return ex;
+ } else if (el instanceof El) {
+ if(el != docEl){
+
+
+
+
+ if (Ext.isIE && (el.id == undefined || el.id == '')) {
+ el.dom = el.dom;
+ } else {
+ el.dom = DOC.getElementById(el.id) || el.dom;
+ }
+ }
+ return el;
+ } else if(el.isComposite) {
+ return el;
+ } else if(Ext.isArray(el)) {
+ return El.select(el);
+ } else if(el == DOC) {
+
+ if(!docEl){
+ var f = function(){};
+ f.prototype = El.prototype;
+ docEl = new f();
+ docEl.dom = DOC;
+ }
+ return docEl;
+ }
+ return null;
+};
+
+El.addToCache = function(el, id){
+ id = id || el.id;
+ EC[id] = {
+ el: el,
+ data: {},
+ events: {}
+ };
+ return el;
+};
+
+
+El.data = function(el, key, value){
+ el = El.get(el);
+ if (!el) {
+ return null;
+ }
+ var c = EC[el.id].data;
+ if(arguments.length == 2){
+ return c[key];
+ }else{
+ return (c[key] = value);
+ }
+};
+
+
+
+
+function garbageCollect(){
+ if(!Ext.enableGarbageCollector){
+ clearInterval(El.collectorThreadId);
+ } else {
+ var eid,
+ el,
+ d,
+ o;
+
+ for(eid in EC){
+ o = EC[eid];
+ if(o.skipGC){
+ Ext.EventManager.removeFromSpecialCache(o.el);
+ continue;
+ }
+ el = o.el;
+ d = el.dom;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if(!d || !d.parentNode || (!d.offsetParent && !DOC.getElementById(eid))){
+ if(Ext.enableListenerCollection){
+ Ext.EventManager.removeAll(d);
+ }
+ delete EC[eid];
+ }
+ }
+
+ if (Ext.isIE) {
+ var t = {};
+ for (eid in EC) {
+ t[eid] = EC[eid];
+ }
+ EC = Ext.elCache = t;
+ }
+ }
+}
+El.collectorThreadId = setInterval(garbageCollect, 30000);
+
+var flyFn = function(){};
+flyFn.prototype = El.prototype;
+
+
+El.Flyweight = function(dom){
+ this.dom = dom;
+};
+
+El.Flyweight.prototype = new flyFn();
+El.Flyweight.prototype.isFlyweight = true;
+El._flyweights = {};
+
+
+El.fly = function(el, named){
+ var ret = null;
+ named = named || '_global';
+
+ if (el = Ext.getDom(el)) {
+ (El._flyweights[named] = El._flyweights[named] || new El.Flyweight()).dom = el;
+ ret = El._flyweights[named];
+ }
+ return ret;
+};
+
+
+Ext.get = El.get;
+
+
+Ext.fly = El.fly;
+
+
+var noBoxAdjust = Ext.isStrict ? {
+ select:1
+} : {
+ input:1, select:1, textarea:1
+};
+if(Ext.isIE || Ext.isGecko){
+ noBoxAdjust['button'] = 1;
+}
+
+})();
+
+Ext.Element.addMethods(function(){
+ var PARENTNODE = 'parentNode',
+ NEXTSIBLING = 'nextSibling',
+ PREVIOUSSIBLING = 'previousSibling',
+ DQ = Ext.DomQuery,
+ GET = Ext.get;
+
+ return {
+
+ findParent : function(simpleSelector, maxDepth, returnEl){
+ var p = this.dom,
+ b = document.body,
+ depth = 0,
+ stopEl;
+ if(Ext.isGecko && Object.prototype.toString.call(p) == '[object XULElement]') {
+ return null;
+ }
+ maxDepth = maxDepth || 50;
+ if (isNaN(maxDepth)) {
+ stopEl = Ext.getDom(maxDepth);
+ maxDepth = Number.MAX_VALUE;
+ }
+ while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){
+ if(DQ.is(p, simpleSelector)){
+ return returnEl ? GET(p) : p;
+ }
+ depth++;
+ p = p.parentNode;
+ }
+ return null;
+ },
+
+
+ findParentNode : function(simpleSelector, maxDepth, returnEl){
+ var p = Ext.fly(this.dom.parentNode, '_internal');
+ return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null;
+ },
+
+
+ up : function(simpleSelector, maxDepth){
+ return this.findParentNode(simpleSelector, maxDepth, true);
+ },
+
+
+ select : function(selector){
+ return Ext.Element.select(selector, this.dom);
+ },
+
+
+ query : function(selector){
+ return DQ.select(selector, this.dom);
+ },
+
+
+ child : function(selector, returnDom){
+ var n = DQ.selectNode(selector, this.dom);
+ return returnDom ? n : GET(n);
+ },
+
+
+ down : function(selector, returnDom){
+ var n = DQ.selectNode(" > " + selector, this.dom);
+ return returnDom ? n : GET(n);
+ },
+
+
+ parent : function(selector, returnDom){
+ return this.matchNode(PARENTNODE, PARENTNODE, selector, returnDom);
+ },
+
+
+ next : function(selector, returnDom){
+ return this.matchNode(NEXTSIBLING, NEXTSIBLING, selector, returnDom);
+ },
+
+
+ prev : function(selector, returnDom){
+ return this.matchNode(PREVIOUSSIBLING, PREVIOUSSIBLING, selector, returnDom);
+ },
+
+
+
+ first : function(selector, returnDom){
+ return this.matchNode(NEXTSIBLING, 'firstChild', selector, returnDom);
+ },
+
+
+ last : function(selector, returnDom){
+ return this.matchNode(PREVIOUSSIBLING, 'lastChild', selector, returnDom);
+ },
+
+ matchNode : function(dir, start, selector, returnDom){
+ var n = this.dom[start];
+ while(n){
+ if(n.nodeType == 1 && (!selector || DQ.is(n, selector))){
+ return !returnDom ? GET(n) : n;
+ }
+ n = n[dir];
+ }
+ return null;
+ }
+ };
+}());
+Ext.Element.addMethods(
+function() {
+ var GETDOM = Ext.getDom,
+ GET = Ext.get,
+ DH = Ext.DomHelper;
+
+ return {
+
+ appendChild: function(el){
+ return GET(el).appendTo(this);
+ },
+
+
+ appendTo: function(el){
+ GETDOM(el).appendChild(this.dom);
+ return this;
+ },
+
+
+ insertBefore: function(el){
+ (el = GETDOM(el)).parentNode.insertBefore(this.dom, el);
+ return this;
+ },
+
+
+ insertAfter: function(el){
+ (el = GETDOM(el)).parentNode.insertBefore(this.dom, el.nextSibling);
+ return this;
+ },
+
+
+ insertFirst: function(el, returnDom){
+ el = el || {};
+ if(el.nodeType || el.dom || typeof el == 'string'){
+ el = GETDOM(el);
+ this.dom.insertBefore(el, this.dom.firstChild);
+ return !returnDom ? GET(el) : el;
+ }else{
+ return this.createChild(el, this.dom.firstChild, returnDom);
+ }
+ },
+
+
+ replace: function(el){
+ el = GET(el);
+ this.insertBefore(el);
+ el.remove();
+ return this;
+ },
+
+
+ replaceWith: function(el){
+ var me = this;
+
+ if(el.nodeType || el.dom || typeof el == 'string'){
+ el = GETDOM(el);
+ me.dom.parentNode.insertBefore(el, me.dom);
+ }else{
+ el = DH.insertBefore(me.dom, el);
+ }
+
+ delete Ext.elCache[me.id];
+ Ext.removeNode(me.dom);
+ me.id = Ext.id(me.dom = el);
+ Ext.Element.addToCache(me.isFlyweight ? new Ext.Element(me.dom) : me);
+ return me;
+ },
+
+
+ createChild: function(config, insertBefore, returnDom){
+ config = config || {tag:'div'};
+ return insertBefore ?
+ DH.insertBefore(insertBefore, config, returnDom !== true) :
+ DH[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config, returnDom !== true);
+ },
+
+
+ wrap: function(config, returnDom){
+ var newEl = DH.insertBefore(this.dom, config || {tag: "div"}, !returnDom);
+ newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom);
+ return newEl;
+ },
+
+
+ insertHtml : function(where, html, returnEl){
+ var el = DH.insertHtml(where, this.dom, html);
+ return returnEl ? Ext.get(el) : el;
+ }
+ };
+}());
+Ext.Element.addMethods(function(){
+
+ var supports = Ext.supports,
+ propCache = {},
+ camelRe = /(-[a-z])/gi,
+ view = document.defaultView,
+ opacityRe = /alpha\(opacity=(.*)\)/i,
+ trimRe = /^\s+|\s+$/g,
+ EL = Ext.Element,
+ spacesRe = /\s+/,
+ wordsRe = /\w/g,
+ PADDING = "padding",
+ MARGIN = "margin",
+ BORDER = "border",
+ LEFT = "-left",
+ RIGHT = "-right",
+ TOP = "-top",
+ BOTTOM = "-bottom",
+ WIDTH = "-width",
+ MATH = Math,
+ HIDDEN = 'hidden',
+ ISCLIPPED = 'isClipped',
+ OVERFLOW = 'overflow',
+ OVERFLOWX = 'overflow-x',
+ OVERFLOWY = 'overflow-y',
+ ORIGINALCLIP = 'originalClip',
+
+ borders = {l: BORDER + LEFT + WIDTH, r: BORDER + RIGHT + WIDTH, t: BORDER + TOP + WIDTH, b: BORDER + BOTTOM + WIDTH},
+ paddings = {l: PADDING + LEFT, r: PADDING + RIGHT, t: PADDING + TOP, b: PADDING + BOTTOM},
+ margins = {l: MARGIN + LEFT, r: MARGIN + RIGHT, t: MARGIN + TOP, b: MARGIN + BOTTOM},
+ data = Ext.Element.data;
+
+
+
+ function camelFn(m, a) {
+ return a.charAt(1).toUpperCase();
+ }
+
+ function chkCache(prop) {
+ return propCache[prop] || (propCache[prop] = prop == 'float' ? (supports.cssFloat ? 'cssFloat' : 'styleFloat') : prop.replace(camelRe, camelFn));
+ }
+
+ return {
+
+ adjustWidth : function(width) {
+ var me = this;
+ var isNum = (typeof width == "number");
+ if(isNum && me.autoBoxAdjust && !me.isBorderBox()){
+ width -= (me.getBorderWidth("lr") + me.getPadding("lr"));
+ }
+ return (isNum && width < 0) ? 0 : width;
+ },
+
+
+ adjustHeight : function(height) {
+ var me = this;
+ var isNum = (typeof height == "number");
+ if(isNum && me.autoBoxAdjust && !me.isBorderBox()){
+ height -= (me.getBorderWidth("tb") + me.getPadding("tb"));
+ }
+ return (isNum && height < 0) ? 0 : height;
+ },
+
+
+
+ addClass : function(className){
+ var me = this,
+ i,
+ len,
+ v,
+ cls = [];
+
+ if (!Ext.isArray(className)) {
+ if (typeof className == 'string' && !this.hasClass(className)) {
+ me.dom.className += " " + className;
+ }
+ }
+ else {
+ for (i = 0, len = className.length; i < len; i++) {
+ v = className[i];
+ if (typeof v == 'string' && (' ' + me.dom.className + ' ').indexOf(' ' + v + ' ') == -1) {
+ cls.push(v);
+ }
+ }
+ if (cls.length) {
+ me.dom.className += " " + cls.join(" ");
+ }
+ }
+ return me;
+ },
+
+
+ removeClass : function(className){
+ var me = this,
+ i,
+ idx,
+ len,
+ cls,
+ elClasses;
+ if (!Ext.isArray(className)){
+ className = [className];
+ }
+ if (me.dom && me.dom.className) {
+ elClasses = me.dom.className.replace(trimRe, '').split(spacesRe);
+ for (i = 0, len = className.length; i < len; i++) {
+ cls = className[i];
+ if (typeof cls == 'string') {
+ cls = cls.replace(trimRe, '');
+ idx = elClasses.indexOf(cls);
+ if (idx != -1) {
+ elClasses.splice(idx, 1);
+ }
+ }
+ }
+ me.dom.className = elClasses.join(" ");
+ }
+ return me;
+ },
+
+
+ radioClass : function(className){
+ var cn = this.dom.parentNode.childNodes,
+ v,
+ i,
+ len;
+ className = Ext.isArray(className) ? className : [className];
+ for (i = 0, len = cn.length; i < len; i++) {
+ v = cn[i];
+ if (v && v.nodeType == 1) {
+ Ext.fly(v, '_internal').removeClass(className);
+ }
+ };
+ return this.addClass(className);
+ },
+
+
+ toggleClass : function(className){
+ return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
+ },
+
+
+ hasClass : function(className){
+ return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1;
+ },
+
+
+ replaceClass : function(oldClassName, newClassName){
+ return this.removeClass(oldClassName).addClass(newClassName);
+ },
+
+ isStyle : function(style, val) {
+ return this.getStyle(style) == val;
+ },
+
+
+ getStyle : function(){
+ return view && view.getComputedStyle ?
+ function(prop){
+ var el = this.dom,
+ v,
+ cs,
+ out,
+ display;
+
+ if(el == document){
+ return null;
+ }
+ prop = chkCache(prop);
+ out = (v = el.style[prop]) ? v :
+ (cs = view.getComputedStyle(el, "")) ? cs[prop] : null;
+
+
+
+ if(prop == 'marginRight' && out != '0px' && !supports.correctRightMargin){
+ display = el.style.display;
+ el.style.display = 'inline-block';
+ out = view.getComputedStyle(el, '').marginRight;
+ el.style.display = display;
+ }
+
+ if(prop == 'backgroundColor' && out == 'rgba(0, 0, 0, 0)' && !supports.correctTransparentColor){
+ out = 'transparent';
+ }
+ return out;
+ } :
+ function(prop){
+ var el = this.dom,
+ m,
+ cs;
+
+ if(el == document) return null;
+ if (prop == 'opacity') {
+ if (el.style.filter.match) {
+ if(m = el.style.filter.match(opacityRe)){
+ var fv = parseFloat(m[1]);
+ if(!isNaN(fv)){
+ return fv ? fv / 100 : 0;
+ }
+ }
+ }
+ return 1;
+ }
+ prop = chkCache(prop);
+ return el.style[prop] || ((cs = el.currentStyle) ? cs[prop] : null);
+ };
+ }(),
+
+
+ getColor : function(attr, defaultValue, prefix){
+ var v = this.getStyle(attr),
+ color = (typeof prefix != 'undefined') ? prefix : '#',
+ h;
+
+ if(!v || (/transparent|inherit/.test(v))) {
+ return defaultValue;
+ }
+ if(/^r/.test(v)){
+ Ext.each(v.slice(4, v.length -1).split(','), function(s){
+ h = parseInt(s, 10);
+ color += (h < 16 ? '0' : '') + h.toString(16);
+ });
+ }else{
+ v = v.replace('#', '');
+ color += v.length == 3 ? v.replace(/^(\w)(\w)(\w)$/, '$1$1$2$2$3$3') : v;
+ }
+ return(color.length > 5 ? color.toLowerCase() : defaultValue);
+ },
+
+
+ setStyle : function(prop, value){
+ var tmp, style;
+
+ if (typeof prop != 'object') {
+ tmp = {};
+ tmp[prop] = value;
+ prop = tmp;
+ }
+ for (style in prop) {
+ value = prop[style];
+ style == 'opacity' ?
+ this.setOpacity(value) :
+ this.dom.style[chkCache(style)] = value;
+ }
+ return this;
+ },
+
+
+ setOpacity : function(opacity, animate){
+ var me = this,
+ s = me.dom.style;
+
+ if(!animate || !me.anim){
+ if(Ext.isIE9m){
+ var opac = opacity < 1 ? 'alpha(opacity=' + opacity * 100 + ')' : '',
+ val = s.filter.replace(opacityRe, '').replace(trimRe, '');
+
+ s.zoom = 1;
+ s.filter = val + (val.length > 0 ? ' ' : '') + opac;
+ }else{
+ s.opacity = opacity;
+ }
+ }else{
+ me.anim({opacity: {to: opacity}}, me.preanim(arguments, 1), null, .35, 'easeIn');
+ }
+ return me;
+ },
+
+
+ clearOpacity : function(){
+ var style = this.dom.style;
+ if(Ext.isIE9m){
+ if(!Ext.isEmpty(style.filter)){
+ style.filter = style.filter.replace(opacityRe, '').replace(trimRe, '');
+ }
+ }else{
+ style.opacity = style['-moz-opacity'] = style['-khtml-opacity'] = '';
+ }
+ return this;
+ },
+
+
+ getHeight : function(contentHeight){
+ var me = this,
+ dom = me.dom,
+ hidden = Ext.isIE9m && me.isStyle('display', 'none'),
+ h = MATH.max(dom.offsetHeight, hidden ? 0 : dom.clientHeight) || 0;
+
+ h = !contentHeight ? h : h - me.getBorderWidth("tb") - me.getPadding("tb");
+ return h < 0 ? 0 : h;
+ },
+
+
+ getWidth : function(contentWidth){
+ var me = this,
+ dom = me.dom,
+ hidden = Ext.isIE9m && me.isStyle('display', 'none'),
+ w = MATH.max(dom.offsetWidth, hidden ? 0 : dom.clientWidth) || 0;
+ w = !contentWidth ? w : w - me.getBorderWidth("lr") - me.getPadding("lr");
+ return w < 0 ? 0 : w;
+ },
+
+
+ setWidth : function(width, animate){
+ var me = this;
+ width = me.adjustWidth(width);
+ !animate || !me.anim ?
+ me.dom.style.width = me.addUnits(width) :
+ me.anim({width : {to : width}}, me.preanim(arguments, 1));
+ return me;
+ },
+
+
+ setHeight : function(height, animate){
+ var me = this;
+ height = me.adjustHeight(height);
+ !animate || !me.anim ?
+ me.dom.style.height = me.addUnits(height) :
+ me.anim({height : {to : height}}, me.preanim(arguments, 1));
+ return me;
+ },
+
+
+ getBorderWidth : function(side){
+ return this.addStyles(side, borders);
+ },
+
+
+ getPadding : function(side){
+ return this.addStyles(side, paddings);
+ },
+
+
+ clip : function(){
+ var me = this,
+ dom = me.dom;
+
+ if(!data(dom, ISCLIPPED)){
+ data(dom, ISCLIPPED, true);
+ data(dom, ORIGINALCLIP, {
+ o: me.getStyle(OVERFLOW),
+ x: me.getStyle(OVERFLOWX),
+ y: me.getStyle(OVERFLOWY)
+ });
+ me.setStyle(OVERFLOW, HIDDEN);
+ me.setStyle(OVERFLOWX, HIDDEN);
+ me.setStyle(OVERFLOWY, HIDDEN);
+ }
+ return me;
+ },
+
+
+ unclip : function(){
+ var me = this,
+ dom = me.dom;
+
+ if(data(dom, ISCLIPPED)){
+ data(dom, ISCLIPPED, false);
+ var o = data(dom, ORIGINALCLIP);
+ if(o.o){
+ me.setStyle(OVERFLOW, o.o);
+ }
+ if(o.x){
+ me.setStyle(OVERFLOWX, o.x);
+ }
+ if(o.y){
+ me.setStyle(OVERFLOWY, o.y);
+ }
+ }
+ return me;
+ },
+
+
+ addStyles : function(sides, styles){
+ var ttlSize = 0,
+ sidesArr = sides.match(wordsRe),
+ side,
+ size,
+ i,
+ len = sidesArr.length;
+ for (i = 0; i < len; i++) {
+ side = sidesArr[i];
+ size = side && parseInt(this.getStyle(styles[side]), 10);
+ if (size) {
+ ttlSize += MATH.abs(size);
+ }
+ }
+ return ttlSize;
+ },
+
+ margins : margins
+ };
+}()
+);
+
+(function(){
+var D = Ext.lib.Dom,
+ LEFT = "left",
+ RIGHT = "right",
+ TOP = "top",
+ BOTTOM = "bottom",
+ POSITION = "position",
+ STATIC = "static",
+ RELATIVE = "relative",
+ AUTO = "auto",
+ ZINDEX = "z-index";
+
+Ext.Element.addMethods({
+
+ getX : function(){
+ return D.getX(this.dom);
+ },
+
+
+ getY : function(){
+ return D.getY(this.dom);
+ },
+
+
+ getXY : function(){
+ return D.getXY(this.dom);
+ },
+
+
+ getOffsetsTo : function(el){
+ var o = this.getXY(),
+ e = Ext.fly(el, '_internal').getXY();
+ return [o[0]-e[0],o[1]-e[1]];
+ },
+
+
+ setX : function(x, animate){
+ return this.setXY([x, this.getY()], this.animTest(arguments, animate, 1));
+ },
+
+
+ setY : function(y, animate){
+ return this.setXY([this.getX(), y], this.animTest(arguments, animate, 1));
+ },
+
+
+ setLeft : function(left){
+ this.setStyle(LEFT, this.addUnits(left));
+ return this;
+ },
+
+
+ setTop : function(top){
+ this.setStyle(TOP, this.addUnits(top));
+ return this;
+ },
+
+
+ setRight : function(right){
+ this.setStyle(RIGHT, this.addUnits(right));
+ return this;
+ },
+
+
+ setBottom : function(bottom){
+ this.setStyle(BOTTOM, this.addUnits(bottom));
+ return this;
+ },
+
+
+ setXY : function(pos, animate){
+ var me = this;
+ if(!animate || !me.anim){
+ D.setXY(me.dom, pos);
+ }else{
+ me.anim({points: {to: pos}}, me.preanim(arguments, 1), 'motion');
+ }
+ return me;
+ },
+
+
+ setLocation : function(x, y, animate){
+ return this.setXY([x, y], this.animTest(arguments, animate, 2));
+ },
+
+
+ moveTo : function(x, y, animate){
+ return this.setXY([x, y], this.animTest(arguments, animate, 2));
+ },
+
+
+ getLeft : function(local){
+ return !local ? this.getX() : parseInt(this.getStyle(LEFT), 10) || 0;
+ },
+
+
+ getRight : function(local){
+ var me = this;
+ return !local ? me.getX() + me.getWidth() : (me.getLeft(true) + me.getWidth()) || 0;
+ },
+
+
+ getTop : function(local) {
+ return !local ? this.getY() : parseInt(this.getStyle(TOP), 10) || 0;
+ },
+
+
+ getBottom : function(local){
+ var me = this;
+ return !local ? me.getY() + me.getHeight() : (me.getTop(true) + me.getHeight()) || 0;
+ },
+
+
+ position : function(pos, zIndex, x, y){
+ var me = this;
+
+ if(!pos && me.isStyle(POSITION, STATIC)){
+ me.setStyle(POSITION, RELATIVE);
+ } else if(pos) {
+ me.setStyle(POSITION, pos);
+ }
+ if(zIndex){
+ me.setStyle(ZINDEX, zIndex);
+ }
+ if(x || y) me.setXY([x || false, y || false]);
+ },
+
+
+ clearPositioning : function(value){
+ value = value || '';
+ this.setStyle({
+ left : value,
+ right : value,
+ top : value,
+ bottom : value,
+ "z-index" : "",
+ position : STATIC
+ });
+ return this;
+ },
+
+
+ getPositioning : function(){
+ var l = this.getStyle(LEFT);
+ var t = this.getStyle(TOP);
+ return {
+ "position" : this.getStyle(POSITION),
+ "left" : l,
+ "right" : l ? "" : this.getStyle(RIGHT),
+ "top" : t,
+ "bottom" : t ? "" : this.getStyle(BOTTOM),
+ "z-index" : this.getStyle(ZINDEX)
+ };
+ },
+
+
+ setPositioning : function(pc){
+ var me = this,
+ style = me.dom.style;
+
+ me.setStyle(pc);
+
+ if(pc.right == AUTO){
+ style.right = "";
+ }
+ if(pc.bottom == AUTO){
+ style.bottom = "";
+ }
+
+ return me;
+ },
+
+
+ translatePoints : function(x, y){
+ y = isNaN(x[1]) ? y : x[1];
+ x = isNaN(x[0]) ? x : x[0];
+ var me = this,
+ relative = me.isStyle(POSITION, RELATIVE),
+ o = me.getXY(),
+ l = parseInt(me.getStyle(LEFT), 10),
+ t = parseInt(me.getStyle(TOP), 10);
+
+ l = !isNaN(l) ? l : (relative ? 0 : me.dom.offsetLeft);
+ t = !isNaN(t) ? t : (relative ? 0 : me.dom.offsetTop);
+
+ return {left: (x - o[0] + l), top: (y - o[1] + t)};
+ },
+
+ animTest : function(args, animate, i) {
+ return !!animate && this.preanim ? this.preanim(args, i) : false;
+ }
+});
+})();
+Ext.Element.addMethods({
+
+ isScrollable : function(){
+ var dom = this.dom;
+ return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth;
+ },
+
+
+ scrollTo : function(side, value){
+ this.dom["scroll" + (/top/i.test(side) ? "Top" : "Left")] = value;
+ return this;
+ },
+
+
+ getScroll : function(){
+ var d = this.dom,
+ doc = document,
+ body = doc.body,
+ docElement = doc.documentElement,
+ l,
+ t,
+ ret;
+
+ if(d == doc || d == body){
+ if(Ext.isIE && Ext.isStrict){
+ l = docElement.scrollLeft;
+ t = docElement.scrollTop;
+ }else{
+ l = window.pageXOffset;
+ t = window.pageYOffset;
+ }
+ ret = {left: l || (body ? body.scrollLeft : 0), top: t || (body ? body.scrollTop : 0)};
+ }else{
+ ret = {left: d.scrollLeft, top: d.scrollTop};
+ }
+ return ret;
+ }
+});
+
+Ext.Element.VISIBILITY = 1;
+
+Ext.Element.DISPLAY = 2;
+
+
+Ext.Element.OFFSETS = 3;
+
+
+Ext.Element.ASCLASS = 4;
+
+
+Ext.Element.visibilityCls = 'x-hide-nosize';
+
+Ext.Element.addMethods(function(){
+ var El = Ext.Element,
+ OPACITY = "opacity",
+ VISIBILITY = "visibility",
+ DISPLAY = "display",
+ HIDDEN = "hidden",
+ OFFSETS = "offsets",
+ ASCLASS = "asclass",
+ NONE = "none",
+ NOSIZE = 'nosize',
+ ORIGINALDISPLAY = 'originalDisplay',
+ VISMODE = 'visibilityMode',
+ ISVISIBLE = 'isVisible',
+ data = El.data,
+ getDisplay = function(dom){
+ var d = data(dom, ORIGINALDISPLAY);
+ if(d === undefined){
+ data(dom, ORIGINALDISPLAY, d = '');
+ }
+ return d;
+ },
+ getVisMode = function(dom){
+ var m = data(dom, VISMODE);
+ if(m === undefined){
+ data(dom, VISMODE, m = 1);
+ }
+ return m;
+ };
+
+ return {
+
+ originalDisplay : "",
+ visibilityMode : 1,
+
+
+ setVisibilityMode : function(visMode){
+ data(this.dom, VISMODE, visMode);
+ return this;
+ },
+
+
+ animate : function(args, duration, onComplete, easing, animType){
+ this.anim(args, {duration: duration, callback: onComplete, easing: easing}, animType);
+ return this;
+ },
+
+
+ anim : function(args, opt, animType, defaultDur, defaultEase, cb){
+ animType = animType || 'run';
+ opt = opt || {};
+ var me = this,
+ anim = Ext.lib.Anim[animType](
+ me.dom,
+ args,
+ (opt.duration || defaultDur) || .35,
+ (opt.easing || defaultEase) || 'easeOut',
+ function(){
+ if(cb) cb.call(me);
+ if(opt.callback) opt.callback.call(opt.scope || me, me, opt);
+ },
+ me
+ );
+ opt.anim = anim;
+ return anim;
+ },
+
+
+ preanim : function(a, i){
+ return !a[i] ? false : (typeof a[i] == 'object' ? a[i]: {duration: a[i+1], callback: a[i+2], easing: a[i+3]});
+ },
+
+
+ isVisible : function() {
+ var me = this,
+ dom = me.dom,
+ visible = data(dom, ISVISIBLE);
+
+ if(typeof visible == 'boolean'){
+ return visible;
+ }
+
+ visible = !me.isStyle(VISIBILITY, HIDDEN) &&
+ !me.isStyle(DISPLAY, NONE) &&
+ !((getVisMode(dom) == El.ASCLASS) && me.hasClass(me.visibilityCls || El.visibilityCls));
+
+ data(dom, ISVISIBLE, visible);
+ return visible;
+ },
+
+
+ setVisible : function(visible, animate){
+ var me = this, isDisplay, isVisibility, isOffsets, isNosize,
+ dom = me.dom,
+ visMode = getVisMode(dom);
+
+
+
+ if (typeof animate == 'string'){
+ switch (animate) {
+ case DISPLAY:
+ visMode = El.DISPLAY;
+ break;
+ case VISIBILITY:
+ visMode = El.VISIBILITY;
+ break;
+ case OFFSETS:
+ visMode = El.OFFSETS;
+ break;
+ case NOSIZE:
+ case ASCLASS:
+ visMode = El.ASCLASS;
+ break;
+ }
+ me.setVisibilityMode(visMode);
+ animate = false;
+ }
+
+ if (!animate || !me.anim) {
+ if(visMode == El.ASCLASS ){
+
+ me[visible?'removeClass':'addClass'](me.visibilityCls || El.visibilityCls);
+
+ } else if (visMode == El.DISPLAY){
+
+ return me.setDisplayed(visible);
+
+ } else if (visMode == El.OFFSETS){
+
+ if (!visible){
+ me.hideModeStyles = {
+ position: me.getStyle('position'),
+ top: me.getStyle('top'),
+ left: me.getStyle('left')
+ };
+ me.applyStyles({position: 'absolute', top: '-10000px', left: '-10000px'});
+ } else {
+ me.applyStyles(me.hideModeStyles || {position: '', top: '', left: ''});
+ delete me.hideModeStyles;
+ }
+
+ }else{
+ me.fixDisplay();
+ dom.style.visibility = visible ? "visible" : HIDDEN;
+ }
+ }else{
+
+ if(visible){
+ me.setOpacity(.01);
+ me.setVisible(true);
+ }
+ me.anim({opacity: { to: (visible?1:0) }},
+ me.preanim(arguments, 1),
+ null,
+ .35,
+ 'easeIn',
+ function(){
+ visible || me.setVisible(false).setOpacity(1);
+ });
+ }
+ data(dom, ISVISIBLE, visible);
+ return me;
+ },
+
+
+
+ hasMetrics : function(){
+ var dom = this.dom;
+ return this.isVisible() || (getVisMode(dom) == El.VISIBILITY);
+ },
+
+
+ toggle : function(animate){
+ var me = this;
+ me.setVisible(!me.isVisible(), me.preanim(arguments, 0));
+ return me;
+ },
+
+
+ setDisplayed : function(value) {
+ if(typeof value == "boolean"){
+ value = value ? getDisplay(this.dom) : NONE;
+ }
+ this.setStyle(DISPLAY, value);
+ return this;
+ },
+
+
+ fixDisplay : function(){
+ var me = this;
+ if(me.isStyle(DISPLAY, NONE)){
+ me.setStyle(VISIBILITY, HIDDEN);
+ me.setStyle(DISPLAY, getDisplay(this.dom));
+ if(me.isStyle(DISPLAY, NONE)){
+ me.setStyle(DISPLAY, "block");
+ }
+ }
+ },
+
+
+ hide : function(animate){
+
+ if (typeof animate == 'string'){
+ this.setVisible(false, animate);
+ return this;
+ }
+ this.setVisible(false, this.preanim(arguments, 0));
+ return this;
+ },
+
+
+ show : function(animate){
+
+ if (typeof animate == 'string'){
+ this.setVisible(true, animate);
+ return this;
+ }
+ this.setVisible(true, this.preanim(arguments, 0));
+ return this;
+ }
+ };
+}());(function(){
+
+ var NULL = null,
+ UNDEFINED = undefined,
+ TRUE = true,
+ FALSE = false,
+ SETX = "setX",
+ SETY = "setY",
+ SETXY = "setXY",
+ LEFT = "left",
+ BOTTOM = "bottom",
+ TOP = "top",
+ RIGHT = "right",
+ HEIGHT = "height",
+ WIDTH = "width",
+ POINTS = "points",
+ HIDDEN = "hidden",
+ ABSOLUTE = "absolute",
+ VISIBLE = "visible",
+ MOTION = "motion",
+ POSITION = "position",
+ EASEOUT = "easeOut",
+
+ flyEl = new Ext.Element.Flyweight(),
+ queues = {},
+ getObject = function(o){
+ return o || {};
+ },
+ fly = function(dom){
+ flyEl.dom = dom;
+ flyEl.id = Ext.id(dom);
+ return flyEl;
+ },
+
+ getQueue = function(id){
+ if(!queues[id]){
+ queues[id] = [];
+ }
+ return queues[id];
+ },
+ setQueue = function(id, value){
+ queues[id] = value;
+ };
+
+
+Ext.enableFx = TRUE;
+
+
+Ext.Fx = {
+
+
+
+ switchStatements : function(key, fn, argHash){
+ return fn.apply(this, argHash[key]);
+ },
+
+
+ slideIn : function(anchor, o){
+ o = getObject(o);
+ var me = this,
+ dom = me.dom,
+ st = dom.style,
+ xy,
+ r,
+ b,
+ wrap,
+ after,
+ st,
+ args,
+ pt,
+ bw,
+ bh;
+
+ anchor = anchor || "t";
+
+ me.queueFx(o, function(){
+ xy = fly(dom).getXY();
+
+ fly(dom).fixDisplay();
+
+
+ r = fly(dom).getFxRestore();
+ b = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: dom.offsetWidth, height: dom.offsetHeight};
+ b.right = b.x + b.width;
+ b.bottom = b.y + b.height;
+
+
+ fly(dom).setWidth(b.width).setHeight(b.height);
+
+
+ wrap = fly(dom).fxWrap(r.pos, o, HIDDEN);
+
+ st.visibility = VISIBLE;
+ st.position = ABSOLUTE;
+
+
+ function after(){
+ fly(dom).fxUnwrap(wrap, r.pos, o);
+ st.width = r.width;
+ st.height = r.height;
+ fly(dom).afterFx(o);
+ }
+
+
+ pt = {to: [b.x, b.y]};
+ bw = {to: b.width};
+ bh = {to: b.height};
+
+ function argCalc(wrap, style, ww, wh, sXY, sXYval, s1, s2, w, h, p){
+ var ret = {};
+ fly(wrap).setWidth(ww).setHeight(wh);
+ if(fly(wrap)[sXY]){
+ fly(wrap)[sXY](sXYval);
+ }
+ style[s1] = style[s2] = "0";
+ if(w){
+ ret.width = w;
+ }
+ if(h){
+ ret.height = h;
+ }
+ if(p){
+ ret.points = p;
+ }
+ return ret;
+ };
+
+ args = fly(dom).switchStatements(anchor.toLowerCase(), argCalc, {
+ t : [wrap, st, b.width, 0, NULL, NULL, LEFT, BOTTOM, NULL, bh, NULL],
+ l : [wrap, st, 0, b.height, NULL, NULL, RIGHT, TOP, bw, NULL, NULL],
+ r : [wrap, st, b.width, b.height, SETX, b.right, LEFT, TOP, NULL, NULL, pt],
+ b : [wrap, st, b.width, b.height, SETY, b.bottom, LEFT, TOP, NULL, bh, pt],
+ tl : [wrap, st, 0, 0, NULL, NULL, RIGHT, BOTTOM, bw, bh, pt],
+ bl : [wrap, st, 0, 0, SETY, b.y + b.height, RIGHT, TOP, bw, bh, pt],
+ br : [wrap, st, 0, 0, SETXY, [b.right, b.bottom], LEFT, TOP, bw, bh, pt],
+ tr : [wrap, st, 0, 0, SETX, b.x + b.width, LEFT, BOTTOM, bw, bh, pt]
+ });
+
+ st.visibility = VISIBLE;
+ fly(wrap).show();
+
+ arguments.callee.anim = fly(wrap).fxanim(args,
+ o,
+ MOTION,
+ .5,
+ EASEOUT,
+ after);
+ });
+ return me;
+ },
+
+
+ slideOut : function(anchor, o){
+ o = getObject(o);
+ var me = this,
+ dom = me.dom,
+ st = dom.style,
+ xy = me.getXY(),
+ wrap,
+ r,
+ b,
+ a,
+ zero = {to: 0};
+
+ anchor = anchor || "t";
+
+ me.queueFx(o, function(){
+
+
+ r = fly(dom).getFxRestore();
+ b = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: dom.offsetWidth, height: dom.offsetHeight};
+ b.right = b.x + b.width;
+ b.bottom = b.y + b.height;
+
+
+ fly(dom).setWidth(b.width).setHeight(b.height);
+
+
+ wrap = fly(dom).fxWrap(r.pos, o, VISIBLE);
+
+ st.visibility = VISIBLE;
+ st.position = ABSOLUTE;
+ fly(wrap).setWidth(b.width).setHeight(b.height);
+
+ function after(){
+ o.useDisplay ? fly(dom).setDisplayed(FALSE) : fly(dom).hide();
+ fly(dom).fxUnwrap(wrap, r.pos, o);
+ st.width = r.width;
+ st.height = r.height;
+ fly(dom).afterFx(o);
+ }
+
+ function argCalc(style, s1, s2, p1, v1, p2, v2, p3, v3){
+ var ret = {};
+
+ style[s1] = style[s2] = "0";
+ ret[p1] = v1;
+ if(p2){
+ ret[p2] = v2;
+ }
+ if(p3){
+ ret[p3] = v3;
+ }
+
+ return ret;
+ };
+
+ a = fly(dom).switchStatements(anchor.toLowerCase(), argCalc, {
+ t : [st, LEFT, BOTTOM, HEIGHT, zero],
+ l : [st, RIGHT, TOP, WIDTH, zero],
+ r : [st, LEFT, TOP, WIDTH, zero, POINTS, {to : [b.right, b.y]}],
+ b : [st, LEFT, TOP, HEIGHT, zero, POINTS, {to : [b.x, b.bottom]}],
+ tl : [st, RIGHT, BOTTOM, WIDTH, zero, HEIGHT, zero],
+ bl : [st, RIGHT, TOP, WIDTH, zero, HEIGHT, zero, POINTS, {to : [b.x, b.bottom]}],
+ br : [st, LEFT, TOP, WIDTH, zero, HEIGHT, zero, POINTS, {to : [b.x + b.width, b.bottom]}],
+ tr : [st, LEFT, BOTTOM, WIDTH, zero, HEIGHT, zero, POINTS, {to : [b.right, b.y]}]
+ });
+
+ arguments.callee.anim = fly(wrap).fxanim(a,
+ o,
+ MOTION,
+ .5,
+ EASEOUT,
+ after);
+ });
+ return me;
+ },
+
+
+ puff : function(o){
+ o = getObject(o);
+ var me = this,
+ dom = me.dom,
+ st = dom.style,
+ width,
+ height,
+ r;
+
+ me.queueFx(o, function(){
+ width = fly(dom).getWidth();
+ height = fly(dom).getHeight();
+ fly(dom).clearOpacity();
+ fly(dom).show();
+
+
+ r = fly(dom).getFxRestore();
+
+ function after(){
+ o.useDisplay ? fly(dom).setDisplayed(FALSE) : fly(dom).hide();
+ fly(dom).clearOpacity();
+ fly(dom).setPositioning(r.pos);
+ st.width = r.width;
+ st.height = r.height;
+ st.fontSize = '';
+ fly(dom).afterFx(o);
+ }
+
+ arguments.callee.anim = fly(dom).fxanim({
+ width : {to : fly(dom).adjustWidth(width * 2)},
+ height : {to : fly(dom).adjustHeight(height * 2)},
+ points : {by : [-width * .5, -height * .5]},
+ opacity : {to : 0},
+ fontSize: {to : 200, unit: "%"}
+ },
+ o,
+ MOTION,
+ .5,
+ EASEOUT,
+ after);
+ });
+ return me;
+ },
+
+
+ switchOff : function(o){
+ o = getObject(o);
+ var me = this,
+ dom = me.dom,
+ st = dom.style,
+ r;
+
+ me.queueFx(o, function(){
+ fly(dom).clearOpacity();
+ fly(dom).clip();
+
+
+ r = fly(dom).getFxRestore();
+
+ function after(){
+ o.useDisplay ? fly(dom).setDisplayed(FALSE) : fly(dom).hide();
+ fly(dom).clearOpacity();
+ fly(dom).setPositioning(r.pos);
+ st.width = r.width;
+ st.height = r.height;
+ fly(dom).afterFx(o);
+ };
+
+ fly(dom).fxanim({opacity : {to : 0.3}},
+ NULL,
+ NULL,
+ .1,
+ NULL,
+ function(){
+ fly(dom).clearOpacity();
+ (function(){
+ fly(dom).fxanim({
+ height : {to : 1},
+ points : {by : [0, fly(dom).getHeight() * .5]}
+ },
+ o,
+ MOTION,
+ 0.3,
+ 'easeIn',
+ after);
+ }).defer(100);
+ });
+ });
+ return me;
+ },
+
+
+ highlight : function(color, o){
+ o = getObject(o);
+ var me = this,
+ dom = me.dom,
+ attr = o.attr || "backgroundColor",
+ a = {},
+ restore;
+
+ me.queueFx(o, function(){
+ fly(dom).clearOpacity();
+ fly(dom).show();
+
+ function after(){
+ dom.style[attr] = restore;
+ fly(dom).afterFx(o);
+ }
+ restore = dom.style[attr];
+ a[attr] = {from: color || "ffff9c", to: o.endColor || fly(dom).getColor(attr) || "ffffff"};
+ arguments.callee.anim = fly(dom).fxanim(a,
+ o,
+ 'color',
+ 1,
+ 'easeIn',
+ after);
+ });
+ return me;
+ },
+
+
+ frame : function(color, count, o){
+ o = getObject(o);
+ var me = this,
+ dom = me.dom,
+ proxy,
+ active;
+
+ me.queueFx(o, function(){
+ color = color || '#C3DAF9';
+ if(color.length == 6){
+ color = '#' + color;
+ }
+ count = count || 1;
+ fly(dom).show();
+
+ var xy = fly(dom).getXY(),
+ b = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: dom.offsetWidth, height: dom.offsetHeight},
+ queue = function(){
+ proxy = fly(document.body || document.documentElement).createChild({
+ style:{
+ position : ABSOLUTE,
+ 'z-index': 35000,
+ border : '0px solid ' + color
+ }
+ });
+ return proxy.queueFx({}, animFn);
+ };
+
+
+ arguments.callee.anim = {
+ isAnimated: true,
+ stop: function() {
+ count = 0;
+ proxy.stopFx();
+ }
+ };
+
+ function animFn(){
+ var scale = Ext.isBorderBox ? 2 : 1;
+ active = proxy.anim({
+ top : {from : b.y, to : b.y - 20},
+ left : {from : b.x, to : b.x - 20},
+ borderWidth : {from : 0, to : 10},
+ opacity : {from : 1, to : 0},
+ height : {from : b.height, to : b.height + 20 * scale},
+ width : {from : b.width, to : b.width + 20 * scale}
+ },{
+ duration: o.duration || 1,
+ callback: function() {
+ proxy.remove();
+ --count > 0 ? queue() : fly(dom).afterFx(o);
+ }
+ });
+ arguments.callee.anim = {
+ isAnimated: true,
+ stop: function(){
+ active.stop();
+ }
+ };
+ };
+ queue();
+ });
+ return me;
+ },
+
+
+ pause : function(seconds){
+ var dom = this.dom,
+ t;
+
+ this.queueFx({}, function(){
+ t = setTimeout(function(){
+ fly(dom).afterFx({});
+ }, seconds * 1000);
+ arguments.callee.anim = {
+ isAnimated: true,
+ stop: function(){
+ clearTimeout(t);
+ fly(dom).afterFx({});
+ }
+ };
+ });
+ return this;
+ },
+
+
+ fadeIn : function(o){
+ o = getObject(o);
+ var me = this,
+ dom = me.dom,
+ to = o.endOpacity || 1;
+
+ me.queueFx(o, function(){
+ fly(dom).setOpacity(0);
+ fly(dom).fixDisplay();
+ dom.style.visibility = VISIBLE;
+ arguments.callee.anim = fly(dom).fxanim({opacity:{to:to}},
+ o, NULL, .5, EASEOUT, function(){
+ if(to == 1){
+ fly(dom).clearOpacity();
+ }
+ fly(dom).afterFx(o);
+ });
+ });
+ return me;
+ },
+
+
+ fadeOut : function(o){
+ o = getObject(o);
+ var me = this,
+ dom = me.dom,
+ style = dom.style,
+ to = o.endOpacity || 0;
+
+ me.queueFx(o, function(){
+ arguments.callee.anim = fly(dom).fxanim({
+ opacity : {to : to}},
+ o,
+ NULL,
+ .5,
+ EASEOUT,
+ function(){
+ if(to == 0){
+ Ext.Element.data(dom, 'visibilityMode') == Ext.Element.DISPLAY || o.useDisplay ?
+ style.display = "none" :
+ style.visibility = HIDDEN;
+
+ fly(dom).clearOpacity();
+ }
+ fly(dom).afterFx(o);
+ });
+ });
+ return me;
+ },
+
+
+ scale : function(w, h, o){
+ this.shift(Ext.apply({}, o, {
+ width: w,
+ height: h
+ }));
+ return this;
+ },
+
+
+ shift : function(o){
+ o = getObject(o);
+ var dom = this.dom,
+ a = {};
+
+ this.queueFx(o, function(){
+ for (var prop in o) {
+ if (o[prop] != UNDEFINED) {
+ a[prop] = {to : o[prop]};
+ }
+ }
+
+ a.width ? a.width.to = fly(dom).adjustWidth(o.width) : a;
+ a.height ? a.height.to = fly(dom).adjustWidth(o.height) : a;
+
+ if (a.x || a.y || a.xy) {
+ a.points = a.xy ||
+ {to : [ a.x ? a.x.to : fly(dom).getX(),
+ a.y ? a.y.to : fly(dom).getY()]};
+ }
+
+ arguments.callee.anim = fly(dom).fxanim(a,
+ o,
+ MOTION,
+ .35,
+ EASEOUT,
+ function(){
+ fly(dom).afterFx(o);
+ });
+ });
+ return this;
+ },
+
+
+ ghost : function(anchor, o){
+ o = getObject(o);
+ var me = this,
+ dom = me.dom,
+ st = dom.style,
+ a = {opacity: {to: 0}, points: {}},
+ pt = a.points,
+ r,
+ w,
+ h;
+
+ anchor = anchor || "b";
+
+ me.queueFx(o, function(){
+
+ r = fly(dom).getFxRestore();
+ w = fly(dom).getWidth();
+ h = fly(dom).getHeight();
+
+ function after(){
+ o.useDisplay ? fly(dom).setDisplayed(FALSE) : fly(dom).hide();
+ fly(dom).clearOpacity();
+ fly(dom).setPositioning(r.pos);
+ st.width = r.width;
+ st.height = r.height;
+ fly(dom).afterFx(o);
+ }
+
+ pt.by = fly(dom).switchStatements(anchor.toLowerCase(), function(v1,v2){ return [v1, v2];}, {
+ t : [0, -h],
+ l : [-w, 0],
+ r : [w, 0],
+ b : [0, h],
+ tl : [-w, -h],
+ bl : [-w, h],
+ br : [w, h],
+ tr : [w, -h]
+ });
+
+ arguments.callee.anim = fly(dom).fxanim(a,
+ o,
+ MOTION,
+ .5,
+ EASEOUT, after);
+ });
+ return me;
+ },
+
+
+ syncFx : function(){
+ var me = this;
+ me.fxDefaults = Ext.apply(me.fxDefaults || {}, {
+ block : FALSE,
+ concurrent : TRUE,
+ stopFx : FALSE
+ });
+ return me;
+ },
+
+
+ sequenceFx : function(){
+ var me = this;
+ me.fxDefaults = Ext.apply(me.fxDefaults || {}, {
+ block : FALSE,
+ concurrent : FALSE,
+ stopFx : FALSE
+ });
+ return me;
+ },
+
+
+ nextFx : function(){
+ var ef = getQueue(this.dom.id)[0];
+ if(ef){
+ ef.call(this);
+ }
+ },
+
+
+ hasActiveFx : function(){
+ return getQueue(this.dom.id)[0];
+ },
+
+
+ stopFx : function(finish){
+ var me = this,
+ id = me.dom.id;
+ if(me.hasActiveFx()){
+ var cur = getQueue(id)[0];
+ if(cur && cur.anim){
+ if(cur.anim.isAnimated){
+ setQueue(id, [cur]);
+ cur.anim.stop(finish !== undefined ? finish : TRUE);
+ }else{
+ setQueue(id, []);
+ }
+ }
+ }
+ return me;
+ },
+
+
+ beforeFx : function(o){
+ if(this.hasActiveFx() && !o.concurrent){
+ if(o.stopFx){
+ this.stopFx();
+ return TRUE;
+ }
+ return FALSE;
+ }
+ return TRUE;
+ },
+
+
+ hasFxBlock : function(){
+ var q = getQueue(this.dom.id);
+ return q && q[0] && q[0].block;
+ },
+
+
+ queueFx : function(o, fn){
+ var me = fly(this.dom);
+ if(!me.hasFxBlock()){
+ Ext.applyIf(o, me.fxDefaults);
+ if(!o.concurrent){
+ var run = me.beforeFx(o);
+ fn.block = o.block;
+ getQueue(me.dom.id).push(fn);
+ if(run){
+ me.nextFx();
+ }
+ }else{
+ fn.call(me);
+ }
+ }
+ return me;
+ },
+
+
+ fxWrap : function(pos, o, vis){
+ var dom = this.dom,
+ wrap,
+ wrapXY;
+ if(!o.wrap || !(wrap = Ext.getDom(o.wrap))){
+ if(o.fixPosition){
+ wrapXY = fly(dom).getXY();
+ }
+ var div = document.createElement("div");
+ div.style.visibility = vis;
+ wrap = dom.parentNode.insertBefore(div, dom);
+ fly(wrap).setPositioning(pos);
+ if(fly(wrap).isStyle(POSITION, "static")){
+ fly(wrap).position("relative");
+ }
+ fly(dom).clearPositioning('auto');
+ fly(wrap).clip();
+ wrap.appendChild(dom);
+ if(wrapXY){
+ fly(wrap).setXY(wrapXY);
+ }
+ }
+ return wrap;
+ },
+
+
+ fxUnwrap : function(wrap, pos, o){
+ var dom = this.dom;
+ fly(dom).clearPositioning();
+ fly(dom).setPositioning(pos);
+ if(!o.wrap){
+ var pn = fly(wrap).dom.parentNode;
+ pn.insertBefore(dom, wrap);
+ fly(wrap).remove();
+ }
+ },
+
+
+ getFxRestore : function(){
+ var st = this.dom.style;
+ return {pos: this.getPositioning(), width: st.width, height : st.height};
+ },
+
+
+ afterFx : function(o){
+ var dom = this.dom,
+ id = dom.id;
+ if(o.afterStyle){
+ fly(dom).setStyle(o.afterStyle);
+ }
+ if(o.afterCls){
+ fly(dom).addClass(o.afterCls);
+ }
+ if(o.remove == TRUE){
+ fly(dom).remove();
+ }
+ if(o.callback){
+ o.callback.call(o.scope, fly(dom));
+ }
+ if(!o.concurrent){
+ getQueue(id).shift();
+ fly(dom).nextFx();
+ }
+ },
+
+
+ fxanim : function(args, opt, animType, defaultDur, defaultEase, cb){
+ animType = animType || 'run';
+ opt = opt || {};
+ var anim = Ext.lib.Anim[animType](
+ this.dom,
+ args,
+ (opt.duration || defaultDur) || .35,
+ (opt.easing || defaultEase) || EASEOUT,
+ cb,
+ this
+ );
+ opt.anim = anim;
+ return anim;
+ }
+};
+
+
+Ext.Fx.resize = Ext.Fx.scale;
+
+
+
+Ext.Element.addMethods(Ext.Fx);
+})();
+
+Ext.CompositeElementLite = function(els, root){
+
+ this.elements = [];
+ this.add(els, root);
+ this.el = new Ext.Element.Flyweight();
+};
+
+Ext.CompositeElementLite.prototype = {
+ isComposite: true,
+
+
+ getElement : function(el){
+
+ var e = this.el;
+ e.dom = el;
+ e.id = el.id;
+ return e;
+ },
+
+
+ transformElement : function(el){
+ return Ext.getDom(el);
+ },
+
+
+ getCount : function(){
+ return this.elements.length;
+ },
+
+ add : function(els, root){
+ var me = this,
+ elements = me.elements;
+ if(!els){
+ return this;
+ }
+ if(typeof els == "string"){
+ els = Ext.Element.selectorFunction(els, root);
+ }else if(els.isComposite){
+ els = els.elements;
+ }else if(!Ext.isIterable(els)){
+ els = [els];
+ }
+
+ for(var i = 0, len = els.length; i < len; ++i){
+ elements.push(me.transformElement(els[i]));
+ }
+ return me;
+ },
+
+ invoke : function(fn, args){
+ var me = this,
+ els = me.elements,
+ len = els.length,
+ e,
+ i;
+
+ for(i = 0; i < len; i++) {
+ e = els[i];
+ if(e){
+ Ext.Element.prototype[fn].apply(me.getElement(e), args);
+ }
+ }
+ return me;
+ },
+
+ item : function(index){
+ var me = this,
+ el = me.elements[index],
+ out = null;
+
+ if(el){
+ out = me.getElement(el);
+ }
+ return out;
+ },
+
+
+ addListener : function(eventName, handler, scope, opt){
+ var els = this.elements,
+ len = els.length,
+ i, e;
+
+ for(i = 0; i<len; i++) {
+ e = els[i];
+ if(e) {
+ Ext.EventManager.on(e, eventName, handler, scope || e, opt);
+ }
+ }
+ return this;
+ },
+
+ each : function(fn, scope){
+ var me = this,
+ els = me.elements,
+ len = els.length,
+ i, e;
+
+ for(i = 0; i<len; i++) {
+ e = els[i];
+ if(e){
+ e = this.getElement(e);
+ if(fn.call(scope || e, e, me, i) === false){
+ break;
+ }
+ }
+ }
+ return me;
+ },
+
+
+ fill : function(els){
+ var me = this;
+ me.elements = [];
+ me.add(els);
+ return me;
+ },
+
+
+ filter : function(selector){
+ var els = [],
+ me = this,
+ fn = Ext.isFunction(selector) ? selector
+ : function(el){
+ return el.is(selector);
+ };
+
+ me.each(function(el, self, i) {
+ if (fn(el, i) !== false) {
+ els[els.length] = me.transformElement(el);
+ }
+ });
+
+ me.elements = els;
+ return me;
+ },
+
+
+ indexOf : function(el){
+ return this.elements.indexOf(this.transformElement(el));
+ },
+
+
+ replaceElement : function(el, replacement, domReplace){
+ var index = !isNaN(el) ? el : this.indexOf(el),
+ d;
+ if(index > -1){
+ replacement = Ext.getDom(replacement);
+ if(domReplace){
+ d = this.elements[index];
+ d.parentNode.insertBefore(replacement, d);
+ Ext.removeNode(d);
+ }
+ this.elements.splice(index, 1, replacement);
+ }
+ return this;
+ },
+
+
+ clear : function(){
+ this.elements = [];
+ }
+};
+
+Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener;
+
+
+Ext.CompositeElementLite.importElementMethods = function() {
+ var fnName,
+ ElProto = Ext.Element.prototype,
+ CelProto = Ext.CompositeElementLite.prototype;
+
+ for (fnName in ElProto) {
+ if (typeof ElProto[fnName] == 'function'){
+ (function(fnName) {
+ CelProto[fnName] = CelProto[fnName] || function() {
+ return this.invoke(fnName, arguments);
+ };
+ }).call(CelProto, fnName);
+
+ }
+ }
+};
+
+Ext.CompositeElementLite.importElementMethods();
+
+if(Ext.DomQuery){
+ Ext.Element.selectorFunction = Ext.DomQuery.select;
+}
+
+
+Ext.Element.select = function(selector, root){
+ var els;
+ if(typeof selector == "string"){
+ els = Ext.Element.selectorFunction(selector, root);
+ }else if(selector.length !== undefined){
+ els = selector;
+ }else{
+ throw "Invalid selector";
+ }
+ return new Ext.CompositeElementLite(els);
+};
+
+Ext.select = Ext.Element.select;
+(function(){
+ var BEFOREREQUEST = "beforerequest",
+ REQUESTCOMPLETE = "requestcomplete",
+ REQUESTEXCEPTION = "requestexception",
+ UNDEFINED = undefined,
+ LOAD = 'load',
+ POST = 'POST',
+ GET = 'GET',
+ WINDOW = window;
+
+
+ Ext.data.Connection = function(config){
+ Ext.apply(this, config);
+ this.addEvents(
+
+ BEFOREREQUEST,
+
+ REQUESTCOMPLETE,
+
+ REQUESTEXCEPTION
+ );
+ Ext.data.Connection.superclass.constructor.call(this);
+ };
+
+ Ext.extend(Ext.data.Connection, Ext.util.Observable, {
+
+
+
+
+
+ timeout : 30000,
+
+ autoAbort:false,
+
+
+ disableCaching: true,
+
+
+ disableCachingParam: '_dc',
+
+
+ request : function(o){
+ var me = this;
+ if(me.fireEvent(BEFOREREQUEST, me, o)){
+ if (o.el) {
+ if(!Ext.isEmpty(o.indicatorText)){
+ me.indicatorText = '<div class="loading-indicator">'+o.indicatorText+"</div>";
+ }
+ if(me.indicatorText) {
+ Ext.getDom(o.el).innerHTML = me.indicatorText;
+ }
+ o.success = (Ext.isFunction(o.success) ? o.success : function(){}).createInterceptor(function(response) {
+ Ext.getDom(o.el).innerHTML = response.responseText;
+ });
+ }
+
+ var p = o.params,
+ url = o.url || me.url,
+ method,
+ cb = {success: me.handleResponse,
+ failure: me.handleFailure,
+ scope: me,
+ argument: {options: o},
+ timeout : Ext.num(o.timeout, me.timeout)
+ },
+ form,
+ serForm;
+
+
+ if (Ext.isFunction(p)) {
+ p = p.call(o.scope||WINDOW, o);
+ }
+
+ p = Ext.urlEncode(me.extraParams, Ext.isObject(p) ? Ext.urlEncode(p) : p);
+
+ if (Ext.isFunction(url)) {
+ url = url.call(o.scope || WINDOW, o);
+ }
+
+ if((form = Ext.getDom(o.form))){
+ url = url || form.action;
+ if(o.isUpload || (/multipart\/form-data/i.test(form.getAttribute("enctype")))) {
+ return me.doFormUpload.call(me, o, p, url);
+ }
+ serForm = Ext.lib.Ajax.serializeForm(form);
+ p = p ? (p + '&' + serForm) : serForm;
+ }
+
+ method = o.method || me.method || ((p || o.xmlData || o.jsonData) ? POST : GET);
+
+ if(method === GET && (me.disableCaching && o.disableCaching !== false) || o.disableCaching === true){
+ var dcp = o.disableCachingParam || me.disableCachingParam;
+ url = Ext.urlAppend(url, dcp + '=' + (new Date().getTime()));
+ }
+
+ o.headers = Ext.applyIf(o.headers || {}, me.defaultHeaders || {});
+
+ if(o.autoAbort === true || me.autoAbort) {
+ me.abort();
+ }
+
+ if((method == GET || o.xmlData || o.jsonData) && p){
+ url = Ext.urlAppend(url, p);
+ p = '';
+ }
+ return (me.transId = Ext.lib.Ajax.request(method, url, cb, p, o));
+ }else{
+ return o.callback ? o.callback.apply(o.scope, [o,UNDEFINED,UNDEFINED]) : null;
+ }
+ },
+
+
+ isLoading : function(transId){
+ return transId ? Ext.lib.Ajax.isCallInProgress(transId) : !! this.transId;
+ },
+
+
+ abort : function(transId){
+ if(transId || this.isLoading()){
+ Ext.lib.Ajax.abort(transId || this.transId);
+ }
+ },
+
+
+ handleResponse : function(response){
+ this.transId = false;
+ var options = response.argument.options;
+ response.argument = options ? options.argument : null;
+ this.fireEvent(REQUESTCOMPLETE, this, response, options);
+ if(options.success){
+ options.success.call(options.scope, response, options);
+ }
+ if(options.callback){
+ options.callback.call(options.scope, options, true, response);
+ }
+ },
+
+
+ handleFailure : function(response, e){
+ this.transId = false;
+ var options = response.argument.options;
+ response.argument = options ? options.argument : null;
+ this.fireEvent(REQUESTEXCEPTION, this, response, options, e);
+ if(options.failure){
+ options.failure.call(options.scope, response, options);
+ }
+ if(options.callback){
+ options.callback.call(options.scope, options, false, response);
+ }
+ },
+
+
+ doFormUpload : function(o, ps, url){
+ var id = Ext.id(),
+ doc = document,
+ frame = doc.createElement('iframe'),
+ form = Ext.getDom(o.form),
+ hiddens = [],
+ hd,
+ encoding = 'multipart/form-data',
+ buf = {
+ target: form.target,
+ method: form.method,
+ encoding: form.encoding,
+ enctype: form.enctype,
+ action: form.action
+ };
+
+
+ Ext.fly(frame).set({
+ id: id,
+ name: id,
+ cls: 'x-hidden',
+ src: Ext.SSL_SECURE_URL
+ });
+
+ doc.body.appendChild(frame);
+
+
+ if(Ext.isIE){
+ document.frames[id].name = id;
+ }
+
+
+ Ext.fly(form).set({
+ target: id,
+ method: POST,
+ enctype: encoding,
+ encoding: encoding,
+ action: url || buf.action
+ });
+
+
+ Ext.iterate(Ext.urlDecode(ps, false), function(k, v){
+ hd = doc.createElement('input');
+ Ext.fly(hd).set({
+ type: 'hidden',
+ value: v,
+ name: k
+ });
+ form.appendChild(hd);
+ hiddens.push(hd);
+ });
+
+ function cb(){
+ var me = this,
+
+ r = {responseText : '',
+ responseXML : null,
+ argument : o.argument},
+ doc,
+ firstChild;
+
+ try{
+ doc = frame.contentWindow.document || frame.contentDocument || WINDOW.frames[id].document;
+ if(doc){
+ if(doc.body){
+ if(/textarea/i.test((firstChild = doc.body.firstChild || {}).tagName)){
+ r.responseText = firstChild.value;
+ }else{
+ r.responseText = doc.body.innerHTML;
+ }
+ }
+
+ r.responseXML = doc.XMLDocument || doc;
+ }
+ }
+ catch(e) {}
+
+ Ext.EventManager.removeListener(frame, LOAD, cb, me);
+
+ me.fireEvent(REQUESTCOMPLETE, me, r, o);
+
+ function runCallback(fn, scope, args){
+ if(Ext.isFunction(fn)){
+ fn.apply(scope, args);
+ }
+ }
+
+ runCallback(o.success, o.scope, [r, o]);
+ runCallback(o.callback, o.scope, [o, true, r]);
+
+ if(!me.debugUploads){
+ setTimeout(function(){Ext.removeNode(frame);}, 100);
+ }
+ }
+
+ Ext.EventManager.on(frame, LOAD, cb, this);
+ form.submit();
+
+ Ext.fly(form).set(buf);
+ Ext.each(hiddens, function(h) {
+ Ext.removeNode(h);
+ });
+ }
+ });
+})();
+
+
+Ext.Ajax = new Ext.data.Connection({
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ autoAbort : false,
+
+
+ serializeForm : function(form){
+ return Ext.lib.Ajax.serializeForm(form);
+ }
+});
+
+Ext.util.JSON = new (function(){
+ var useHasOwn = !!{}.hasOwnProperty,
+ isNative = function() {
+ var useNative = null;
+
+ return function() {
+ if (useNative === null) {
+ useNative = Ext.USE_NATIVE_JSON && window.JSON && JSON.toString() == '[object JSON]';
+ }
+
+ return useNative;
+ };
+ }(),
+ pad = function(n) {
+ return n < 10 ? "0" + n : n;
+ },
+ doDecode = function(json){
+ return json ? eval("(" + json + ")") : "";
+ },
+ doEncode = function(o){
+ if(!Ext.isDefined(o) || o === null){
+ return "null";
+ }else if(Ext.isArray(o)){
+ return encodeArray(o);
+ }else if(Ext.isDate(o)){
+ return Ext.util.JSON.encodeDate(o);
+ }else if(Ext.isString(o)){
+ return encodeString(o);
+ }else if(typeof o == "number"){
+
+ return isFinite(o) ? String(o) : "null";
+ }else if(Ext.isBoolean(o)){
+ return String(o);
+ }else {
+ var a = ["{"], b, i, v;
+ for (i in o) {
+
+ if(!o.getElementsByTagName){
+ if(!useHasOwn || o.hasOwnProperty(i)) {
+ v = o[i];
+ switch (typeof v) {
+ case "undefined":
+ case "function":
+ case "unknown":
+ break;
+ default:
+ if(b){
+ a.push(',');
+ }
+ a.push(doEncode(i), ":",
+ v === null ? "null" : doEncode(v));
+ b = true;
+ }
+ }
+ }
+ }
+ a.push("}");
+ return a.join("");
+ }
+ },
+ m = {
+ "\b": '\\b',
+ "\t": '\\t',
+ "\n": '\\n',
+ "\f": '\\f',
+ "\r": '\\r',
+ '"' : '\\"',
+ "\\": '\\\\'
+ },
+ encodeString = function(s){
+ if (/["\\\x00-\x1f]/.test(s)) {
+ return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) {
+ var c = m[b];
+ if(c){
+ return c;
+ }
+ c = b.charCodeAt();
+ return "\\u00" +
+ Math.floor(c / 16).toString(16) +
+ (c % 16).toString(16);
+ }) + '"';
+ }
+ return '"' + s + '"';
+ },
+ encodeArray = function(o){
+ var a = ["["], b, i, l = o.length, v;
+ for (i = 0; i < l; i += 1) {
+ v = o[i];
+ switch (typeof v) {
+ case "undefined":
+ case "function":
+ case "unknown":
+ break;
+ default:
+ if (b) {
+ a.push(',');
+ }
+ a.push(v === null ? "null" : Ext.util.JSON.encode(v));
+ b = true;
+ }
+ }
+ a.push("]");
+ return a.join("");
+ };
+
+
+ this.encodeDate = function(o){
+ return '"' + o.getFullYear() + "-" +
+ pad(o.getMonth() + 1) + "-" +
+ pad(o.getDate()) + "T" +
+ pad(o.getHours()) + ":" +
+ pad(o.getMinutes()) + ":" +
+ pad(o.getSeconds()) + '"';
+ };
+
+
+ this.encode = function() {
+ var ec;
+ return function(o) {
+ if (!ec) {
+
+ ec = isNative() ? JSON.stringify : doEncode;
+ }
+ return ec(o);
+ };
+ }();
+
+
+
+ this.decode = function() {
+ var dc;
+ return function(json) {
+ if (!dc) {
+
+ dc = isNative() ? JSON.parse : doDecode;
+ }
+ return dc(json);
+ };
+ }();
+
+})();
+
+Ext.encode = Ext.util.JSON.encode;
+
+Ext.decode = Ext.util.JSON.decode;
+
+Ext.EventManager = function(){
+ var docReadyEvent,
+ docReadyProcId,
+ docReadyState = false,
+ DETECT_NATIVE = Ext.isGecko || Ext.isWebKit || Ext.isSafari || Ext.isIE10p,
+ E = Ext.lib.Event,
+ D = Ext.lib.Dom,
+ DOC = document,
+ WINDOW = window,
+ DOMCONTENTLOADED = "DOMContentLoaded",
+ COMPLETE = 'complete',
+ propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,
+
+ specialElCache = [];
+
+ function getId(el){
+ var id = false,
+ i = 0,
+ len = specialElCache.length,
+ skip = false,
+ o;
+
+ if (el) {
+ if (el.getElementById || el.navigator) {
+
+ for(; i < len; ++i){
+ o = specialElCache[i];
+ if(o.el === el){
+ id = o.id;
+ break;
+ }
+ }
+ if(!id){
+
+ id = Ext.id(el);
+ specialElCache.push({
+ id: id,
+ el: el
+ });
+ skip = true;
+ }
+ }else{
+ id = Ext.id(el);
+ }
+ if(!Ext.elCache[id]){
+ Ext.Element.addToCache(new Ext.Element(el), id);
+ if(skip){
+ Ext.elCache[id].skipGC = true;
+ }
+ }
+ }
+ return id;
+ }
+
+
+ function addListener(el, ename, fn, task, wrap, scope){
+ el = Ext.getDom(el);
+ var id = getId(el),
+ es = Ext.elCache[id].events,
+ wfn;
+
+ wfn = E.on(el, ename, wrap);
+ es[ename] = es[ename] || [];
+
+
+ es[ename].push([fn, wrap, scope, wfn, task]);
+
+
+
+
+
+ if(el.addEventListener && ename == "mousewheel"){
+ var args = ["DOMMouseScroll", wrap, false];
+ el.addEventListener.apply(el, args);
+ Ext.EventManager.addListener(WINDOW, 'unload', function(){
+ el.removeEventListener.apply(el, args);
+ });
+ }
+
+
+ if(el == DOC && ename == "mousedown"){
+ Ext.EventManager.stoppedMouseDownEvent.addListener(wrap);
+ }
+ }
+
+ function doScrollChk(){
+
+ if(window != top){
+ return false;
+ }
+
+ try{
+ DOC.documentElement.doScroll('left');
+ }catch(e){
+ return false;
+ }
+
+ fireDocReady();
+ return true;
+ }
+
+ function checkReadyState(e){
+
+ if(Ext.isIE9m && doScrollChk()){
+ return true;
+ }
+ if(DOC.readyState == COMPLETE){
+ fireDocReady();
+ return true;
+ }
+ docReadyState || (docReadyProcId = setTimeout(arguments.callee, 2));
+ return false;
+ }
+
+ var styles;
+ function checkStyleSheets(e){
+ styles || (styles = Ext.query('style, link[rel=stylesheet]'));
+ if(styles.length == DOC.styleSheets.length){
+ fireDocReady();
+ return true;
+ }
+ docReadyState || (docReadyProcId = setTimeout(arguments.callee, 2));
+ return false;
+ }
+
+ function OperaDOMContentLoaded(e){
+ DOC.removeEventListener(DOMCONTENTLOADED, arguments.callee, false);
+ checkStyleSheets();
+ }
+
+ function fireDocReady(e){
+ if(!docReadyState){
+ docReadyState = true;
+
+ if(docReadyProcId){
+ clearTimeout(docReadyProcId);
+ }
+ if(DETECT_NATIVE) {
+ DOC.removeEventListener(DOMCONTENTLOADED, fireDocReady, false);
+ }
+ if(Ext.isIE9m && checkReadyState.bindIE){
+ DOC.detachEvent('onreadystatechange', checkReadyState);
+ }
+ E.un(WINDOW, "load", arguments.callee);
+ }
+ if(docReadyEvent && !Ext.isReady){
+ Ext.isReady = true;
+ docReadyEvent.fire();
+ docReadyEvent.listeners = [];
+ }
+
+ }
+
+ function initDocReady(){
+ docReadyEvent || (docReadyEvent = new Ext.util.Event());
+ if (DETECT_NATIVE) {
+ DOC.addEventListener(DOMCONTENTLOADED, fireDocReady, false);
+ }
+
+ if (Ext.isIE9m){
+
+
+ if(!checkReadyState()){
+ checkReadyState.bindIE = true;
+ DOC.attachEvent('onreadystatechange', checkReadyState);
+ }
+
+ }else if(Ext.isOpera ){
+
+
+
+ (DOC.readyState == COMPLETE && checkStyleSheets()) ||
+ DOC.addEventListener(DOMCONTENTLOADED, OperaDOMContentLoaded, false);
+
+ }else if (Ext.isWebKit){
+
+ checkReadyState();
+ }
+
+ E.on(WINDOW, "load", fireDocReady);
+ }
+
+ function createTargeted(h, o){
+ return function(){
+ var args = Ext.toArray(arguments);
+ if(o.target == Ext.EventObject.setEvent(args[0]).target){
+ h.apply(this, args);
+ }
+ };
+ }
+
+ function createBuffered(h, o, task){
+ return function(e){
+
+ task.delay(o.buffer, h, null, [new Ext.EventObjectImpl(e)]);
+ };
+ }
+
+ function createSingle(h, el, ename, fn, scope){
+ return function(e){
+ Ext.EventManager.removeListener(el, ename, fn, scope);
+ h(e);
+ };
+ }
+
+ function createDelayed(h, o, fn){
+ return function(e){
+ var task = new Ext.util.DelayedTask(h);
+ if(!fn.tasks) {
+ fn.tasks = [];
+ }
+ fn.tasks.push(task);
+ task.delay(o.delay || 10, h, null, [new Ext.EventObjectImpl(e)]);
+ };
+ }
+
+ function listen(element, ename, opt, fn, scope){
+ var o = (!opt || typeof opt == "boolean") ? {} : opt,
+ el = Ext.getDom(element), task;
+
+ fn = fn || o.fn;
+ scope = scope || o.scope;
+
+ if(!el){
+ throw "Error listening for \"" + ename + '\". Element "' + element + '" doesn\'t exist.';
+ }
+ function h(e){
+
+ if(!Ext){
+ return;
+ }
+ e = Ext.EventObject.setEvent(e);
+ var t;
+ if (o.delegate) {
+ if(!(t = e.getTarget(o.delegate, el))){
+ return;
+ }
+ } else {
+ t = e.target;
+ }
+ if (o.stopEvent) {
+ e.stopEvent();
+ }
+ if (o.preventDefault) {
+ e.preventDefault();
+ }
+ if (o.stopPropagation) {
+ e.stopPropagation();
+ }
+ if (o.normalized === false) {
+ e = e.browserEvent;
+ }
+
+ fn.call(scope || el, e, t, o);
+ }
+ if(o.target){
+ h = createTargeted(h, o);
+ }
+ if(o.delay){
+ h = createDelayed(h, o, fn);
+ }
+ if(o.single){
+ h = createSingle(h, el, ename, fn, scope);
+ }
+ if(o.buffer){
+ task = new Ext.util.DelayedTask(h);
+ h = createBuffered(h, o, task);
+ }
+
+ addListener(el, ename, fn, task, h, scope);
+ return h;
+ }
+
+ var pub = {
+
+ addListener : function(element, eventName, fn, scope, options){
+ if(typeof eventName == 'object'){
+ var o = eventName, e, val;
+ for(e in o){
+ val = o[e];
+ if(!propRe.test(e)){
+ if(Ext.isFunction(val)){
+
+ listen(element, e, o, val, o.scope);
+ }else{
+
+ listen(element, e, val);
+ }
+ }
+ }
+ } else {
+ listen(element, eventName, options, fn, scope);
+ }
+ },
+
+
+ removeListener : function(el, eventName, fn, scope){
+ el = Ext.getDom(el);
+ var id = getId(el),
+ f = el && (Ext.elCache[id].events)[eventName] || [],
+ wrap, i, l, k, len, fnc;
+
+ for (i = 0, len = f.length; i < len; i++) {
+
+
+ if (Ext.isArray(fnc = f[i]) && fnc[0] == fn && (!scope || fnc[2] == scope)) {
+ if(fnc[4]) {
+ fnc[4].cancel();
+ }
+ k = fn.tasks && fn.tasks.length;
+ if(k) {
+ while(k--) {
+ fn.tasks[k].cancel();
+ }
+ delete fn.tasks;
+ }
+ wrap = fnc[1];
+ E.un(el, eventName, E.extAdapter ? fnc[3] : wrap);
+
+
+ if(wrap && el.addEventListener && eventName == "mousewheel"){
+ el.removeEventListener("DOMMouseScroll", wrap, false);
+ }
+
+
+ if(wrap && el == DOC && eventName == "mousedown"){
+ Ext.EventManager.stoppedMouseDownEvent.removeListener(wrap);
+ }
+
+ f.splice(i, 1);
+ if (f.length === 0) {
+ delete Ext.elCache[id].events[eventName];
+ }
+ for (k in Ext.elCache[id].events) {
+ return false;
+ }
+ Ext.elCache[id].events = {};
+ return false;
+ }
+ }
+ },
+
+
+ removeAll : function(el){
+ el = Ext.getDom(el);
+ var id = getId(el),
+ ec = Ext.elCache[id] || {},
+ es = ec.events || {},
+ f, i, len, ename, fn, k, wrap;
+
+ for(ename in es){
+ if(es.hasOwnProperty(ename)){
+ f = es[ename];
+
+ for (i = 0, len = f.length; i < len; i++) {
+ fn = f[i];
+ if(fn[4]) {
+ fn[4].cancel();
+ }
+ if(fn[0].tasks && (k = fn[0].tasks.length)) {
+ while(k--) {
+ fn[0].tasks[k].cancel();
+ }
+ delete fn.tasks;
+ }
+ wrap = fn[1];
+ E.un(el, ename, E.extAdapter ? fn[3] : wrap);
+
+
+ if(el.addEventListener && wrap && ename == "mousewheel"){
+ el.removeEventListener("DOMMouseScroll", wrap, false);
+ }
+
+
+ if(wrap && el == DOC && ename == "mousedown"){
+ Ext.EventManager.stoppedMouseDownEvent.removeListener(wrap);
+ }
+ }
+ }
+ }
+ if (Ext.elCache[id]) {
+ Ext.elCache[id].events = {};
+ }
+ },
+
+ getListeners : function(el, eventName) {
+ el = Ext.getDom(el);
+ var id = getId(el),
+ ec = Ext.elCache[id] || {},
+ es = ec.events || {},
+ results = [];
+ if (es && es[eventName]) {
+ return es[eventName];
+ } else {
+ return null;
+ }
+ },
+
+ removeFromSpecialCache: function(o) {
+ var i = 0,
+ len = specialElCache.length;
+
+ for (; i < len; ++i) {
+ if (specialElCache[i].el == o) {
+ specialElCache.splice(i, 1);
+ }
+ }
+ },
+
+ purgeElement : function(el, recurse, eventName) {
+ el = Ext.getDom(el);
+ var id = getId(el),
+ ec = Ext.elCache[id] || {},
+ es = ec.events || {},
+ i, f, len;
+ if (eventName) {
+ if (es && es.hasOwnProperty(eventName)) {
+ f = es[eventName];
+ for (i = 0, len = f.length; i < len; i++) {
+ Ext.EventManager.removeListener(el, eventName, f[i][0]);
+ }
+ }
+ } else {
+ Ext.EventManager.removeAll(el);
+ }
+ if (recurse && el && el.childNodes) {
+ for (i = 0, len = el.childNodes.length; i < len; i++) {
+ Ext.EventManager.purgeElement(el.childNodes[i], recurse, eventName);
+ }
+ }
+ },
+
+ _unload : function() {
+ var el;
+ for (el in Ext.elCache) {
+ Ext.EventManager.removeAll(el);
+ }
+ delete Ext.elCache;
+ delete Ext.Element._flyweights;
+
+
+ var c,
+ conn,
+ tid,
+ ajax = Ext.lib.Ajax;
+ (typeof ajax.conn == 'object') ? conn = ajax.conn : conn = {};
+ for (tid in conn) {
+ c = conn[tid];
+ if (c) {
+ ajax.abort({conn: c, tId: tid});
+ }
+ }
+ },
+
+ onDocumentReady : function(fn, scope, options){
+ if (Ext.isReady) {
+ docReadyEvent || (docReadyEvent = new Ext.util.Event());
+ docReadyEvent.addListener(fn, scope, options);
+ docReadyEvent.fire();
+ docReadyEvent.listeners = [];
+ } else {
+ if (!docReadyEvent) {
+ initDocReady();
+ }
+ options = options || {};
+ options.delay = options.delay || 1;
+ docReadyEvent.addListener(fn, scope, options);
+ }
+ },
+
+
+ fireDocReady : fireDocReady
+ };
+
+ pub.on = pub.addListener;
+
+ pub.un = pub.removeListener;
+
+ pub.stoppedMouseDownEvent = new Ext.util.Event();
+ return pub;
+}();
+
+Ext.onReady = Ext.EventManager.onDocumentReady;
+
+
+
+(function(){
+ var initExtCss = function() {
+
+ var bd = document.body || document.getElementsByTagName('body')[0];
+ if (!bd) {
+ return false;
+ }
+
+ var cls = [];
+
+ if (Ext.isIE) {
+
+ if (!Ext.isIE10p) {
+ cls.push('ext-ie');
+ }
+ if (Ext.isIE6) {
+ cls.push('ext-ie6');
+ } else if (Ext.isIE7) {
+ cls.push('ext-ie7', 'ext-ie7m');
+ } else if (Ext.isIE8) {
+ cls.push('ext-ie8', 'ext-ie8m');
+ } else if (Ext.isIE9) {
+ cls.push('ext-ie9', 'ext-ie9m');
+ } else if (Ext.isIE10) {
+ cls.push('ext-ie10');
+ }
+ }
+
+ if (Ext.isGecko) {
+ if (Ext.isGecko2) {
+ cls.push('ext-gecko2');
+ } else {
+ cls.push('ext-gecko3');
+ }
+ }
+
+ if (Ext.isOpera) {
+ cls.push('ext-opera');
+ }
+
+ if (Ext.isWebKit) {
+ cls.push('ext-webkit');
+ }
+
+ if (Ext.isSafari) {
+ cls.push("ext-safari " + (Ext.isSafari2 ? 'ext-safari2' : (Ext.isSafari3 ? 'ext-safari3' : 'ext-safari4')));
+ } else if(Ext.isChrome) {
+ cls.push("ext-chrome");
+ }
+
+ if (Ext.isMac) {
+ cls.push("ext-mac");
+ }
+ if (Ext.isLinux) {
+ cls.push("ext-linux");
+ }
+
+
+ if (Ext.isStrict || Ext.isBorderBox) {
+ var p = bd.parentNode;
+ if (p) {
+ if (!Ext.isStrict) {
+ Ext.fly(p, '_internal').addClass('x-quirks');
+ if (Ext.isIE9m && !Ext.isStrict) {
+ Ext.isIEQuirks = true;
+ }
+ }
+ Ext.fly(p, '_internal').addClass(((Ext.isStrict && Ext.isIE ) || (!Ext.enableForcedBoxModel && !Ext.isIE)) ? ' ext-strict' : ' ext-border-box');
+ }
+ }
+
+
+ if (Ext.enableForcedBoxModel && !Ext.isIE) {
+ Ext.isForcedBorderBox = true;
+ cls.push("ext-forced-border-box");
+ }
+
+ Ext.fly(bd, '_internal').addClass(cls);
+ return true;
+ };
+
+ if (!initExtCss()) {
+ Ext.onReady(initExtCss);
+ }
+})();
+
+
+(function(){
+
+ var supports = Ext.apply(Ext.supports, {
+
+ correctRightMargin: true,
+
+
+ correctTransparentColor: true,
+
+
+ cssFloat: true
+ });
+
+ var supportTests = function(){
+ var div = document.createElement('div'),
+ doc = document,
+ view,
+ last;
+
+ div.innerHTML = '<div style="height:30px;width:50px;"><div style="height:20px;width:20px;"></div></div><div style="float:left;background-color:transparent;">';
+ doc.body.appendChild(div);
+ last = div.lastChild;
+
+ if((view = doc.defaultView)){
+ if(view.getComputedStyle(div.firstChild.firstChild, null).marginRight != '0px'){
+ supports.correctRightMargin = false;
+ }
+ if(view.getComputedStyle(last, null).backgroundColor != 'transparent'){
+ supports.correctTransparentColor = false;
+ }
+ }
+ supports.cssFloat = !!last.style.cssFloat;
+ doc.body.removeChild(div);
+ };
+
+ if (Ext.isReady) {
+ supportTests();
+ } else {
+ Ext.onReady(supportTests);
+ }
+})();
+
+
+
+Ext.EventObject = function(){
+ var E = Ext.lib.Event,
+ clickRe = /(dbl)?click/,
+
+ safariKeys = {
+ 3 : 13,
+ 63234 : 37,
+ 63235 : 39,
+ 63232 : 38,
+ 63233 : 40,
+ 63276 : 33,
+ 63277 : 34,
+ 63272 : 46,
+ 63273 : 36,
+ 63275 : 35
+ },
+
+ btnMap = Ext.isIE ? {1:0,4:1,2:2} : {0:0,1:1,2:2};
+
+ Ext.EventObjectImpl = function(e){
+ if(e){
+ this.setEvent(e.browserEvent || e);
+ }
+ };
+
+ Ext.EventObjectImpl.prototype = {
+
+ setEvent : function(e){
+ var me = this;
+ if(e == me || (e && e.browserEvent)){
+ return e;
+ }
+ me.browserEvent = e;
+ if(e){
+
+ me.button = e.button ? btnMap[e.button] : (e.which ? e.which - 1 : -1);
+ if(clickRe.test(e.type) && me.button == -1){
+ me.button = 0;
+ }
+ me.type = e.type;
+ me.shiftKey = e.shiftKey;
+
+ me.ctrlKey = e.ctrlKey || e.metaKey || false;
+ me.altKey = e.altKey;
+
+ me.keyCode = e.keyCode;
+ me.charCode = e.charCode;
+
+ me.target = E.getTarget(e);
+
+ me.xy = E.getXY(e);
+ }else{
+ me.button = -1;
+ me.shiftKey = false;
+ me.ctrlKey = false;
+ me.altKey = false;
+ me.keyCode = 0;
+ me.charCode = 0;
+ me.target = null;
+ me.xy = [0, 0];
+ }
+ return me;
+ },
+
+
+ stopEvent : function(){
+ var me = this;
+ if(me.browserEvent){
+ if(me.browserEvent.type == 'mousedown'){
+ Ext.EventManager.stoppedMouseDownEvent.fire(me);
+ }
+ E.stopEvent(me.browserEvent);
+ }
+ },
+
+
+ preventDefault : function(){
+ if(this.browserEvent){
+ E.preventDefault(this.browserEvent);
+ }
+ },
+
+
+ stopPropagation : function(){
+ var me = this;
+ if(me.browserEvent){
+ if(me.browserEvent.type == 'mousedown'){
+ Ext.EventManager.stoppedMouseDownEvent.fire(me);
+ }
+ E.stopPropagation(me.browserEvent);
+ }
+ },
+
+
+ getCharCode : function(){
+ return this.charCode || this.keyCode;
+ },
+
+
+ getKey : function(){
+ return this.normalizeKey(this.keyCode || this.charCode);
+ },
+
+
+ normalizeKey: function(k){
+ return Ext.isSafari ? (safariKeys[k] || k) : k;
+ },
+
+
+ getPageX : function(){
+ return this.xy[0];
+ },
+
+
+ getPageY : function(){
+ return this.xy[1];
+ },
+
+
+ getXY : function(){
+ return this.xy;
+ },
+
+
+ getTarget : function(selector, maxDepth, returnEl){
+ return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : (returnEl ? Ext.get(this.target) : this.target);
+ },
+
+
+ getRelatedTarget : function(){
+ return this.browserEvent ? E.getRelatedTarget(this.browserEvent) : null;
+ },
+
+
+ getWheelDelta : function(){
+ var e = this.browserEvent;
+ var delta = 0;
+ if(e.wheelDelta){
+ delta = e.wheelDelta/120;
+ }else if(e.detail){
+ delta = -e.detail/3;
+ }
+ return delta;
+ },
+
+
+ within : function(el, related, allowEl){
+ if(el){
+ var t = this[related ? "getRelatedTarget" : "getTarget"]();
+ return t && ((allowEl ? (t == Ext.getDom(el)) : false) || Ext.fly(el).contains(t));
+ }
+ return false;
+ }
+ };
+
+ return new Ext.EventObjectImpl();
+}();
+Ext.Loader = Ext.apply({}, {
+
+ load: function(fileList, callback, scope, preserveOrder) {
+ var scope = scope || this,
+ head = document.getElementsByTagName("head")[0],
+ fragment = document.createDocumentFragment(),
+ numFiles = fileList.length,
+ loadedFiles = 0,
+ me = this;
+
+
+ var loadFileIndex = function(index) {
+ head.appendChild(
+ me.buildScriptTag(fileList[index], onFileLoaded)
+ );
+ };
+
+
+ var onFileLoaded = function() {
+ loadedFiles ++;
+
+
+ if (numFiles == loadedFiles && typeof callback == 'function') {
+ callback.call(scope);
+ } else {
+ if (preserveOrder === true) {
+ loadFileIndex(loadedFiles);
+ }
+ }
+ };
+
+ if (preserveOrder === true) {
+ loadFileIndex.call(this, 0);
+ } else {
+
+ Ext.each(fileList, function(file, index) {
+ fragment.appendChild(
+ this.buildScriptTag(file, onFileLoaded)
+ );
+ }, this);
+
+ head.appendChild(fragment);
+ }
+ },
+
+
+ buildScriptTag: function(filename, callback) {
+ var script = document.createElement('script');
+ script.type = "text/javascript";
+ script.src = filename;
+
+
+ if (script.readyState) {
+ script.onreadystatechange = function() {
+ if (script.readyState == "loaded" || script.readyState == "complete") {
+ script.onreadystatechange = null;
+ callback();
+ }
+ };
+ } else {
+ script.onload = callback;
+ }
+
+ return script;
+ }
+});
+
+
+Ext.ns("Ext.grid", "Ext.list", "Ext.dd", "Ext.tree", "Ext.form", "Ext.menu",
+ "Ext.state", "Ext.layout.boxOverflow", "Ext.app", "Ext.ux", "Ext.chart", "Ext.direct", "Ext.slider");
+
+
+Ext.apply(Ext, function(){
+ var E = Ext,
+ idSeed = 0,
+ scrollWidth = null;
+
+ return {
+
+ emptyFn : function(){},
+
+
+ BLANK_IMAGE_URL : Ext.isIE6 || Ext.isIE7 || Ext.isAir ?
+ 'http:/' + '/www.extjs.com/s.gif' :
+ 'data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',
+
+ extendX : function(supr, fn){
+ return Ext.extend(supr, fn(supr.prototype));
+ },
+
+
+ getDoc : function(){
+ return Ext.get(document);
+ },
+
+
+ num : function(v, defaultValue){
+ v = Number(Ext.isEmpty(v) || Ext.isArray(v) || typeof v == 'boolean' || (typeof v == 'string' && v.trim().length == 0) ? NaN : v);
+ return isNaN(v) ? defaultValue : v;
+ },
+
+
+ value : function(v, defaultValue, allowBlank){
+ return Ext.isEmpty(v, allowBlank) ? defaultValue : v;
+ },
+
+
+ escapeRe : function(s) {
+ return s.replace(/([-.*+?^${}()|[\]\/\\])/g, "\\$1");
+ },
+
+ sequence : function(o, name, fn, scope){
+ o[name] = o[name].createSequence(fn, scope);
+ },
+
+
+ addBehaviors : function(o){
+ if(!Ext.isReady){
+ Ext.onReady(function(){
+ Ext.addBehaviors(o);
+ });
+ } else {
+ var cache = {},
+ parts,
+ b,
+ s;
+ for (b in o) {
+ if ((parts = b.split('@'))[1]) {
+ s = parts[0];
+ if(!cache[s]){
+ cache[s] = Ext.select(s);
+ }
+ cache[s].on(parts[1], o[b]);
+ }
+ }
+ cache = null;
+ }
+ },
+
+
+ getScrollBarWidth: function(force){
+ if(!Ext.isReady){
+ return 0;
+ }
+
+ if(force === true || scrollWidth === null){
+
+ var div = Ext.getBody().createChild('<div class="x-hide-offsets" style="width:100px;height:50px;overflow:hidden;"><div style="height:200px;"></div></div>'),
+ child = div.child('div', true);
+ var w1 = child.offsetWidth;
+ div.setStyle('overflow', (Ext.isWebKit || Ext.isGecko) ? 'auto' : 'scroll');
+ var w2 = child.offsetWidth;
+ div.remove();
+
+ scrollWidth = w1 - w2 + 2;
+ }
+ return scrollWidth;
+ },
+
+
+
+ combine : function(){
+ var as = arguments, l = as.length, r = [];
+ for(var i = 0; i < l; i++){
+ var a = as[i];
+ if(Ext.isArray(a)){
+ r = r.concat(a);
+ }else if(a.length !== undefined && !a.substr){
+ r = r.concat(Array.prototype.slice.call(a, 0));
+ }else{
+ r.push(a);
+ }
+ }
+ return r;
+ },
+
+
+ copyTo : function(dest, source, names){
+ if(typeof names == 'string'){
+ names = names.split(/[,;\s]/);
+ }
+ Ext.each(names, function(name){
+ if(source.hasOwnProperty(name)){
+ dest[name] = source[name];
+ }
+ }, this);
+ return dest;
+ },
+
+
+ destroy : function(){
+ Ext.each(arguments, function(arg){
+ if(arg){
+ if(Ext.isArray(arg)){
+ this.destroy.apply(this, arg);
+ }else if(typeof arg.destroy == 'function'){
+ arg.destroy();
+ }else if(arg.dom){
+ arg.remove();
+ }
+ }
+ }, this);
+ },
+
+
+ destroyMembers : function(o, arg1, arg2, etc){
+ for(var i = 1, a = arguments, len = a.length; i < len; i++) {
+ Ext.destroy(o[a[i]]);
+ delete o[a[i]];
+ }
+ },
+
+
+ clean : function(arr){
+ var ret = [];
+ Ext.each(arr, function(v){
+ if(!!v){
+ ret.push(v);
+ }
+ });
+ return ret;
+ },
+
+
+ unique : function(arr){
+ var ret = [],
+ collect = {};
+
+ Ext.each(arr, function(v) {
+ if(!collect[v]){
+ ret.push(v);
+ }
+ collect[v] = true;
+ });
+ return ret;
+ },
+
+
+ flatten : function(arr){
+ var worker = [];
+ function rFlatten(a) {
+ Ext.each(a, function(v) {
+ if(Ext.isArray(v)){
+ rFlatten(v);
+ }else{
+ worker.push(v);
+ }
+ });
+ return worker;
+ }
+ return rFlatten(arr);
+ },
+
+
+ min : function(arr, comp){
+ var ret = arr[0];
+ comp = comp || function(a,b){ return a < b ? -1 : 1; };
+ Ext.each(arr, function(v) {
+ ret = comp(ret, v) == -1 ? ret : v;
+ });
+ return ret;
+ },
+
+
+ max : function(arr, comp){
+ var ret = arr[0];
+ comp = comp || function(a,b){ return a > b ? 1 : -1; };
+ Ext.each(arr, function(v) {
+ ret = comp(ret, v) == 1 ? ret : v;
+ });
+ return ret;
+ },
+
+
+ mean : function(arr){
+ return arr.length > 0 ? Ext.sum(arr) / arr.length : undefined;
+ },
+
+
+ sum : function(arr){
+ var ret = 0;
+ Ext.each(arr, function(v) {
+ ret += v;
+ });
+ return ret;
+ },
+
+
+ partition : function(arr, truth){
+ var ret = [[],[]];
+ Ext.each(arr, function(v, i, a) {
+ ret[ (truth && truth(v, i, a)) || (!truth && v) ? 0 : 1].push(v);
+ });
+ return ret;
+ },
+
+
+ invoke : function(arr, methodName){
+ var ret = [],
+ args = Array.prototype.slice.call(arguments, 2);
+ Ext.each(arr, function(v,i) {
+ if (v && typeof v[methodName] == 'function') {
+ ret.push(v[methodName].apply(v, args));
+ } else {
+ ret.push(undefined);
+ }
+ });
+ return ret;
+ },
+
+
+ pluck : function(arr, prop){
+ var ret = [];
+ Ext.each(arr, function(v) {
+ ret.push( v[prop] );
+ });
+ return ret;
+ },
+
+
+ zip : function(){
+ var parts = Ext.partition(arguments, function( val ){ return typeof val != 'function'; }),
+ arrs = parts[0],
+ fn = parts[1][0],
+ len = Ext.max(Ext.pluck(arrs, "length")),
+ ret = [];
+
+ for (var i = 0; i < len; i++) {
+ ret[i] = [];
+ if(fn){
+ ret[i] = fn.apply(fn, Ext.pluck(arrs, i));
+ }else{
+ for (var j = 0, aLen = arrs.length; j < aLen; j++){
+ ret[i].push( arrs[j][i] );
+ }
+ }
+ }
+ return ret;
+ },
+
+
+ getCmp : function(id){
+ return Ext.ComponentMgr.get(id);
+ },
+
+
+ useShims: E.isIE6 || (E.isMac && E.isGecko2),
+
+
+
+ type : function(o){
+ if(o === undefined || o === null){
+ return false;
+ }
+ if(o.htmlElement){
+ return 'element';
+ }
+ var t = typeof o;
+ if(t == 'object' && o.nodeName) {
+ switch(o.nodeType) {
+ case 1: return 'element';
+ case 3: return (/\S/).test(o.nodeValue) ? 'textnode' : 'whitespace';
+ }
+ }
+ if(t == 'object' || t == 'function') {
+ switch(o.constructor) {
+ case Array: return 'array';
+ case RegExp: return 'regexp';
+ case Date: return 'date';
+ }
+ if(typeof o.length == 'number' && typeof o.item == 'function') {
+ return 'nodelist';
+ }
+ }
+ return t;
+ },
+
+ intercept : function(o, name, fn, scope){
+ o[name] = o[name].createInterceptor(fn, scope);
+ },
+
+
+ callback : function(cb, scope, args, delay){
+ if(typeof cb == 'function'){
+ if(delay){
+ cb.defer(delay, scope, args || []);
+ }else{
+ cb.apply(scope, args || []);
+ }
+ }
+ }
+ };
+}());
+
+
+Ext.apply(Function.prototype, {
+
+ createSequence : function(fcn, scope){
+ var method = this;
+ return (typeof fcn != 'function') ?
+ this :
+ function(){
+ var retval = method.apply(this || window, arguments);
+ fcn.apply(scope || this || window, arguments);
+ return retval;
+ };
+ }
+});
+
+
+
+Ext.applyIf(String, {
+
+
+ escape : function(string) {
+ return string.replace(/('|\\)/g, "\\$1");
+ },
+
+
+ leftPad : function (val, size, ch) {
+ var result = String(val);
+ if(!ch) {
+ ch = " ";
+ }
+ while (result.length < size) {
+ result = ch + result;
+ }
+ return result;
+ }
+});
+
+
+String.prototype.toggle = function(value, other){
+ return this == value ? other : value;
+};
+
+
+String.prototype.trim = function(){
+ var re = /^\s+|\s+$/g;
+ return function(){ return this.replace(re, ""); };
+}();
+
+
+
+Date.prototype.getElapsed = function(date) {
+ return Math.abs((date || new Date()).getTime()-this.getTime());
+};
+
+
+
+Ext.applyIf(Number.prototype, {
+
+ constrain : function(min, max){
+ return Math.min(Math.max(this, min), max);
+ }
+});
+Ext.lib.Dom.getRegion = function(el) {
+ return Ext.lib.Region.getRegion(el);
+}; Ext.lib.Region = function(t, r, b, l) {
+ var me = this;
+ me.top = t;
+ me[1] = t;
+ me.right = r;
+ me.bottom = b;
+ me.left = l;
+ me[0] = l;
+ };
+
+ Ext.lib.Region.prototype = {
+ contains : function(region) {
+ var me = this;
+ return ( region.left >= me.left &&
+ region.right <= me.right &&
+ region.top >= me.top &&
+ region.bottom <= me.bottom );
+
+ },
+
+ getArea : function() {
+ var me = this;
+ return ( (me.bottom - me.top) * (me.right - me.left) );
+ },
+
+ intersect : function(region) {
+ var me = this,
+ t = Math.max(me.top, region.top),
+ r = Math.min(me.right, region.right),
+ b = Math.min(me.bottom, region.bottom),
+ l = Math.max(me.left, region.left);
+
+ if (b >= t && r >= l) {
+ return new Ext.lib.Region(t, r, b, l);
+ }
+ },
+
+ union : function(region) {
+ var me = this,
+ t = Math.min(me.top, region.top),
+ r = Math.max(me.right, region.right),
+ b = Math.max(me.bottom, region.bottom),
+ l = Math.min(me.left, region.left);
+
+ return new Ext.lib.Region(t, r, b, l);
+ },
+
+ constrainTo : function(r) {
+ var me = this;
+ me.top = me.top.constrain(r.top, r.bottom);
+ me.bottom = me.bottom.constrain(r.top, r.bottom);
+ me.left = me.left.constrain(r.left, r.right);
+ me.right = me.right.constrain(r.left, r.right);
+ return me;
+ },
+
+ adjust : function(t, l, b, r) {
+ var me = this;
+ me.top += t;
+ me.left += l;
+ me.right += r;
+ me.bottom += b;
+ return me;
+ }
+ };
+
+ Ext.lib.Region.getRegion = function(el) {
+ var p = Ext.lib.Dom.getXY(el),
+ t = p[1],
+ r = p[0] + el.offsetWidth,
+ b = p[1] + el.offsetHeight,
+ l = p[0];
+
+ return new Ext.lib.Region(t, r, b, l);
+ }; Ext.lib.Point = function(x, y) {
+ if (Ext.isArray(x)) {
+ y = x[1];
+ x = x[0];
+ }
+ var me = this;
+ me.x = me.right = me.left = me[0] = x;
+ me.y = me.top = me.bottom = me[1] = y;
+ };
+
+ Ext.lib.Point.prototype = new Ext.lib.Region();
+
+Ext.apply(Ext.DomHelper,
+function(){
+ var pub,
+ afterbegin = 'afterbegin',
+ afterend = 'afterend',
+ beforebegin = 'beforebegin',
+ beforeend = 'beforeend',
+ confRe = /tag|children|cn|html$/i;
+
+
+ function doInsert(el, o, returnElement, pos, sibling, append){
+ el = Ext.getDom(el);
+ var newNode;
+ if (pub.useDom) {
+ newNode = createDom(o, null);
+ if (append) {
+ el.appendChild(newNode);
+ } else {
+ (sibling == 'firstChild' ? el : el.parentNode).insertBefore(newNode, el[sibling] || el);
+ }
+ } else {
+ newNode = Ext.DomHelper.insertHtml(pos, el, Ext.DomHelper.createHtml(o));
+ }
+ return returnElement ? Ext.get(newNode, true) : newNode;
+ }
+
+
+
+ function createDom(o, parentNode){
+ var el,
+ doc = document,
+ useSet,
+ attr,
+ val,
+ cn;
+
+ if (Ext.isArray(o)) {
+ el = doc.createDocumentFragment();
+ for (var i = 0, l = o.length; i < l; i++) {
+ createDom(o[i], el);
+ }
+ } else if (typeof o == 'string') {
+ el = doc.createTextNode(o);
+ } else {
+ el = doc.createElement( o.tag || 'div' );
+ useSet = !!el.setAttribute;
+ for (var attr in o) {
+ if(!confRe.test(attr)){
+ val = o[attr];
+ if(attr == 'cls'){
+ el.className = val;
+ }else{
+ if(useSet){
+ el.setAttribute(attr, val);
+ }else{
+ el[attr] = val;
+ }
+ }
+ }
+ }
+ Ext.DomHelper.applyStyles(el, o.style);
+
+ if ((cn = o.children || o.cn)) {
+ createDom(cn, el);
+ } else if (o.html) {
+ el.innerHTML = o.html;
+ }
+ }
+ if(parentNode){
+ parentNode.appendChild(el);
+ }
+ return el;
+ }
+
+ pub = {
+
+ createTemplate : function(o){
+ var html = Ext.DomHelper.createHtml(o);
+ return new Ext.Template(html);
+ },
+
+
+ useDom : false,
+
+
+ insertBefore : function(el, o, returnElement){
+ return doInsert(el, o, returnElement, beforebegin);
+ },
+
+
+ insertAfter : function(el, o, returnElement){
+ return doInsert(el, o, returnElement, afterend, 'nextSibling');
+ },
+
+
+ insertFirst : function(el, o, returnElement){
+ return doInsert(el, o, returnElement, afterbegin, 'firstChild');
+ },
+
+
+ append: function(el, o, returnElement){
+ return doInsert(el, o, returnElement, beforeend, '', true);
+ },
+
+
+ createDom: createDom
+ };
+ return pub;
+}());
+
+Ext.apply(Ext.Template.prototype, {
+
+ disableFormats : false,
+
+
+
+ re : /\{([\w\-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,
+ argsRe : /^\s*['"](.*)["']\s*$/,
+ compileARe : /\\/g,
+ compileBRe : /(\r\n|\n)/g,
+ compileCRe : /'/g,
+
+ /**
+ * Returns an HTML fragment of this template with the specified values applied.
+ * @param {Object/Array} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+ * @return {String} The HTML fragment
+ * @hide repeat doc
+ */
+ applyTemplate : function(values){
+ var me = this,
+ useF = me.disableFormats !== true,
+ fm = Ext.util.Format,
+ tpl = me;
+
+ if(me.compiled){
+ return me.compiled(values);
+ }
+ function fn(m, name, format, args){
+ if (format && useF) {
+ if (format.substr(0, 5) == "this.") {
+ return tpl.call(format.substr(5), values[name], values);
+ } else {
+ if (args) {
+ // quoted values are required for strings in compiled templates,
+ // but for non compiled we need to strip them
+ // quoted reversed for jsmin
+ var re = me.argsRe;
+ args = args.split(',');
+ for(var i = 0, len = args.length; i < len; i++){
+ args[i] = args[i].replace(re, "$1");
+ }
+ args = [values[name]].concat(args);
+ } else {
+ args = [values[name]];
+ }
+ return fm[format].apply(fm, args);
+ }
+ } else {
+ return values[name] !== undefined ? values[name] : "";
+ }
+ }
+ return me.html.replace(me.re, fn);
+ },
+
+ /**
+ * Compiles the template into an internal function, eliminating the RegEx overhead.
+ * @return {Ext.Template} this
+ * @hide repeat doc
+ */
+ compile : function(){
+ var me = this,
+ fm = Ext.util.Format,
+ useF = me.disableFormats !== true,
+ sep = Ext.isGecko ? "+" : ",",
+ body;
+
+ function fn(m, name, format, args){
+ if(format && useF){
+ args = args ? ',' + args : "";
+ if(format.substr(0, 5) != "this."){
+ format = "fm." + format + '(';
+ }else{
+ format = 'this.call("'+ format.substr(5) + '", ';
+ args = ", values";
+ }
+ }else{
+ args= ''; format = "(values['" + name + "'] == undefined ? '' : ";
+ }
+ return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'";
+ }
+
+ // branched to use + in gecko and [].join() in others
+ if(Ext.isGecko){
+ body = "this.compiled = function(values){ return '" +
+ me.html.replace(me.compileARe, '\\\\').replace(me.compileBRe, '\\n').replace(me.compileCRe, "\\'").replace(me.re, fn) +
+ "';};";
+ }else{
+ body = ["this.compiled = function(values){ return ['"];
+ body.push(me.html.replace(me.compileARe, '\\\\').replace(me.compileBRe, '\\n').replace(me.compileCRe, "\\'").replace(me.re, fn));
+ body.push("'].join('');};");
+ body = body.join('');
+ }
+ eval(body);
+ return me;
+ },
+
+ // private function used to call members
+ call : function(fnName, value, allValues){
+ return this[fnName](value, allValues);
+ }
+});
+Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
+/**
+ * @class Ext.util.Functions
+ * @singleton
+ */
+Ext.util.Functions = {
+ /**
+ * Creates an interceptor function. The passed function is called before the original one. If it returns false,
+ * the original one is not called. The resulting function returns the results of the original function.
+ * The passed function is called with the parameters of the original function. Example usage:
+ * <pre><code>
+var sayHi = function(name){
+ alert('Hi, ' + name);
+}
+
+sayHi('Fred'); // alerts "Hi, Fred"
+
+// create a new function that validates input without
+// directly modifying the original function:
+var sayHiToFriend = Ext.createInterceptor(sayHi, function(name){
+ return name == 'Brian';
+});
+
+sayHiToFriend('Fred'); // no alert
+sayHiToFriend('Brian'); // alerts "Hi, Brian"
+ </code></pre>
+ * @param {Function} origFn The original function.
+ * @param {Function} newFn The function to call before the original
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the passed function is executed.
+ * <b>If omitted, defaults to the scope in which the original function is called or the browser window.</b>
+ * @return {Function} The new function
+ */
+ createInterceptor: function(origFn, newFn, scope) {
+ var method = origFn;
+ if (!Ext.isFunction(newFn)) {
+ return origFn;
+ }
+ else {
+ return function() {
+ var me = this,
+ args = arguments;
+ newFn.target = me;
+ newFn.method = origFn;
+ return (newFn.apply(scope || me || window, args) !== false) ?
+ origFn.apply(me || window, args) :
+ null;
+ };
+ }
+ },
+
+ /**
+ * Creates a delegate (callback) that sets the scope to obj.
+ * Call directly on any function. Example: <code>Ext.createDelegate(this.myFunction, this, [arg1, arg2])</code>
+ * Will create a function that is automatically scoped to obj so that the <tt>this</tt> variable inside the
+ * callback points to obj. Example usage:
+ * <pre><code>
+var sayHi = function(name){
+ // Note this use of "this.text" here. This function expects to
+ // execute within a scope that contains a text property. In this
+ // example, the "this" variable is pointing to the btn object that
+ // was passed in createDelegate below.
+ alert('Hi, ' + name + '. You clicked the "' + this.text + '" button.');
+}
+
+var btn = new Ext.Button({
+ text: 'Say Hi',
+ renderTo: Ext.getBody()
+});
+
+// This callback will execute in the scope of the
+// button instance. Clicking the button alerts
+// "Hi, Fred. You clicked the "Say Hi" button."
+btn.on('click', Ext.createDelegate(sayHi, btn, ['Fred']));
+ </code></pre>
+ * @param {Function} fn The function to delegate.
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
+ * <b>If omitted, defaults to the browser window.</b>
+ * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
+ * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
+ * if a number the args are inserted at the specified position
+ * @return {Function} The new function
+ */
+ createDelegate: function(fn, obj, args, appendArgs) {
+ if (!Ext.isFunction(fn)) {
+ return fn;
+ }
+ return function() {
+ var callArgs = args || arguments;
+ if (appendArgs === true) {
+ callArgs = Array.prototype.slice.call(arguments, 0);
+ callArgs = callArgs.concat(args);
+ }
+ else if (Ext.isNumber(appendArgs)) {
+ callArgs = Array.prototype.slice.call(arguments, 0);
+ // copy arguments first
+ var applyArgs = [appendArgs, 0].concat(args);
+ // create method call params
+ Array.prototype.splice.apply(callArgs, applyArgs);
+ // splice them in
+ }
+ return fn.apply(obj || window, callArgs);
+ };
+ },
+
+ /**
+ * Calls this function after the number of millseconds specified, optionally in a specific scope. Example usage:
+ * <pre><code>
+var sayHi = function(name){
+ alert('Hi, ' + name);
+}
+
+// executes immediately:
+sayHi('Fred');
+
+// executes after 2 seconds:
+Ext.defer(sayHi, 2000, this, ['Fred']);
+
+// this syntax is sometimes useful for deferring
+// execution of an anonymous function:
+Ext.defer(function(){
+ alert('Anonymous');
+}, 100);
+ </code></pre>
+ * @param {Function} fn The function to defer.
+ * @param {Number} millis The number of milliseconds for the setTimeout call (if less than or equal to 0 the function is executed immediately)
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
+ * <b>If omitted, defaults to the browser window.</b>
+ * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
+ * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
+ * if a number the args are inserted at the specified position
+ * @return {Number} The timeout id that can be used with clearTimeout
+ */
+ defer: function(fn, millis, obj, args, appendArgs) {
+ fn = Ext.util.Functions.createDelegate(fn, obj, args, appendArgs);
+ if (millis > 0) {
+ return setTimeout(fn, millis);
+ }
+ fn();
+ return 0;
+ },
+
+
+ /**
+ * Create a combined function call sequence of the original function + the passed function.
+ * The resulting function returns the results of the original function.
+ * The passed fcn is called with the parameters of the original function. Example usage:
+ *
+
+var sayHi = function(name){
+ alert('Hi, ' + name);
+}
+
+sayHi('Fred'); // alerts "Hi, Fred"
+
+var sayGoodbye = Ext.createSequence(sayHi, function(name){
+ alert('Bye, ' + name);
+});
+
+sayGoodbye('Fred'); // both alerts show
+
+ * @param {Function} origFn The original function.
+ * @param {Function} newFn The function to sequence
+ * @param {Object} scope (optional) The scope (this reference) in which the passed function is executed.
+ * If omitted, defaults to the scope in which the original function is called or the browser window.
+ * @return {Function} The new function
+ */
+ createSequence: function(origFn, newFn, scope) {
+ if (!Ext.isFunction(newFn)) {
+ return origFn;
+ }
+ else {
+ return function() {
+ var retval = origFn.apply(this || window, arguments);
+ newFn.apply(scope || this || window, arguments);
+ return retval;
+ };
+ }
+ }
+};
+
+/**
+ * Shorthand for {@link Ext.util.Functions#defer}
+ * @param {Function} fn The function to defer.
+ * @param {Number} millis The number of milliseconds for the setTimeout call (if less than or equal to 0 the function is executed immediately)
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
+ * <b>If omitted, defaults to the browser window.</b>
+ * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
+ * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
+ * if a number the args are inserted at the specified position
+ * @return {Number} The timeout id that can be used with clearTimeout
+ * @member Ext
+ * @method defer
+ */
+
+Ext.defer = Ext.util.Functions.defer;
+
+/**
+ * Shorthand for {@link Ext.util.Functions#createInterceptor}
+ * @param {Function} origFn The original function.
+ * @param {Function} newFn The function to call before the original
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the passed function is executed.
+ * <b>If omitted, defaults to the scope in which the original function is called or the browser window.</b>
+ * @return {Function} The new function
+ * @member Ext
+ * @method createInterceptor
+ */
+
+Ext.createInterceptor = Ext.util.Functions.createInterceptor;
+
+/**
+ * Shorthand for {@link Ext.util.Functions#createSequence}
+ * @param {Function} origFn The original function.
+ * @param {Function} newFn The function to sequence
+ * @param {Object} scope (optional) The scope (this reference) in which the passed function is executed.
+ * If omitted, defaults to the scope in which the original function is called or the browser window.
+ * @return {Function} The new function
+ * @member Ext
+ * @method createSequence
+ */
+
+Ext.createSequence = Ext.util.Functions.createSequence;
+
+/**
+ * Shorthand for {@link Ext.util.Functions#createDelegate}
+ * @param {Function} fn The function to delegate.
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
+ * <b>If omitted, defaults to the browser window.</b>
+ * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
+ * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
+ * if a number the args are inserted at the specified position
+ * @return {Function} The new function
+ * @member Ext
+ * @method createDelegate
+ */
+Ext.createDelegate = Ext.util.Functions.createDelegate;
+/**
+ * @class Ext.util.Observable
+ */
+Ext.apply(Ext.util.Observable.prototype, function(){
+ // this is considered experimental (along with beforeMethod, afterMethod, removeMethodListener?)
+ // allows for easier interceptor and sequences, including cancelling and overwriting the return value of the call
+ // private
+ function getMethodEvent(method){
+ var e = (this.methodEvents = this.methodEvents ||
+ {})[method], returnValue, v, cancel, obj = this;
+
+ if (!e) {
+ this.methodEvents[method] = e = {};
+ e.originalFn = this[method];
+ e.methodName = method;
+ e.before = [];
+ e.after = [];
+
+ var makeCall = function(fn, scope, args){
+ if((v = fn.apply(scope || obj, args)) !== undefined){
+ if (typeof v == 'object') {
+ if(v.returnValue !== undefined){
+ returnValue = v.returnValue;
+ }else{
+ returnValue = v;
+ }
+ cancel = !!v.cancel;
+ }
+ else
+ if (v === false) {
+ cancel = true;
+ }
+ else {
+ returnValue = v;
+ }
+ }
+ };
+
+ this[method] = function(){
+ var args = Array.prototype.slice.call(arguments, 0),
+ b;
+ returnValue = v = undefined;
+ cancel = false;
+
+ for(var i = 0, len = e.before.length; i < len; i++){
+ b = e.before[i];
+ makeCall(b.fn, b.scope, args);
+ if (cancel) {
+ return returnValue;
+ }
+ }
+
+ if((v = e.originalFn.apply(obj, args)) !== undefined){
+ returnValue = v;
+ }
+
+ for(var i = 0, len = e.after.length; i < len; i++){
+ b = e.after[i];
+ makeCall(b.fn, b.scope, args);
+ if (cancel) {
+ return returnValue;
+ }
+ }
+ return returnValue;
+ };
+ }
+ return e;
+ }
+
+ return {
+ // these are considered experimental
+ // allows for easier interceptor and sequences, including cancelling and overwriting the return value of the call
+ // adds an 'interceptor' called before the original method
+ beforeMethod : function(method, fn, scope){
+ getMethodEvent.call(this, method).before.push({
+ fn: fn,
+ scope: scope
+ });
+ },
+
+ // adds a 'sequence' called after the original method
+ afterMethod : function(method, fn, scope){
+ getMethodEvent.call(this, method).after.push({
+ fn: fn,
+ scope: scope
+ });
+ },
+
+ removeMethodListener: function(method, fn, scope){
+ var e = this.getMethodEvent(method);
+ for(var i = 0, len = e.before.length; i < len; i++){
+ if(e.before[i].fn == fn && e.before[i].scope == scope){
+ e.before.splice(i, 1);
+ return;
+ }
+ }
+ for(var i = 0, len = e.after.length; i < len; i++){
+ if(e.after[i].fn == fn && e.after[i].scope == scope){
+ e.after.splice(i, 1);
+ return;
+ }
+ }
+ },
+
+ /**
+ * Relays selected events from the specified Observable as if the events were fired by <tt><b>this</b></tt>.
+ * @param {Object} o The Observable whose events this object is to relay.
+ * @param {Array} events Array of event names to relay.
+ */
+ relayEvents : function(o, events){
+ var me = this;
+ function createHandler(ename){
+ return function(){
+ return me.fireEvent.apply(me, [ename].concat(Array.prototype.slice.call(arguments, 0)));
+ };
+ }
+ for(var i = 0, len = events.length; i < len; i++){
+ var ename = events[i];
+ me.events[ename] = me.events[ename] || true;
+ o.on(ename, createHandler(ename), me);
+ }
+ },
+
+ /**
+ * <p>Enables events fired by this Observable to bubble up an owner hierarchy by calling
+ * <code>this.getBubbleTarget()</code> if present. There is no implementation in the Observable base class.</p>
+ * <p>This is commonly used by Ext.Components to bubble events to owner Containers. See {@link Ext.Component.getBubbleTarget}. The default
+ * implementation in Ext.Component returns the Component's immediate owner. But if a known target is required, this can be overridden to
+ * access the required target more quickly.</p>
+ * <p>Example:</p><pre><code>
+Ext.override(Ext.form.Field, {
+
+ initComponent : Ext.form.Field.prototype.initComponent.createSequence(function() {
+ this.enableBubble('change');
+ }),
+
+
+ getBubbleTarget : function() {
+ if (!this.formPanel) {
+ this.formPanel = this.findParentByType('form');
+ }
+ return this.formPanel;
+ }
+});
+
+var myForm = new Ext.formPanel({
+ title: 'User Details',
+ items: [{
+ ...
+ }],
+ listeners: {
+ change: function() {
+
+ myForm.header.setStyle('color', 'red');
+ }
+ }
+});
+</code></pre>
+ * @param {String/Array} events The event name to bubble, or an Array of event names.
+ */
+ enableBubble : function(events){
+ var me = this;
+ if(!Ext.isEmpty(events)){
+ events = Ext.isArray(events) ? events : Array.prototype.slice.call(arguments, 0);
+ for(var i = 0, len = events.length; i < len; i++){
+ var ename = events[i];
+ ename = ename.toLowerCase();
+ var ce = me.events[ename] || true;
+ if (typeof ce == 'boolean') {
+ ce = new Ext.util.Event(me, ename);
+ me.events[ename] = ce;
+ }
+ ce.bubble = true;
+ }
+ }
+ }
+ };
+}());
+
+
+
+Ext.util.Observable.capture = function(o, fn, scope){
+ o.fireEvent = o.fireEvent.createInterceptor(fn, scope);
+};
+
+
+
+Ext.util.Observable.observeClass = function(c, listeners){
+ if(c){
+ if(!c.fireEvent){
+ Ext.apply(c, new Ext.util.Observable());
+ Ext.util.Observable.capture(c.prototype, c.fireEvent, c);
+ }
+ if(typeof listeners == 'object'){
+ c.on(listeners);
+ }
+ return c;
+ }
+};
+
+Ext.apply(Ext.EventManager, function(){
+ var resizeEvent,
+ resizeTask,
+ textEvent,
+ textSize,
+ D = Ext.lib.Dom,
+ propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,
+ unload = Ext.EventManager._unload,
+ curWidth = 0,
+ curHeight = 0,
+
+
+
+ useKeydown = Ext.isWebKit ?
+ Ext.num(navigator.userAgent.match(/AppleWebKit\/(\d+)/)[1]) >= 525 :
+ !((Ext.isGecko && !Ext.isWindows) || Ext.isOpera);
+
+ return {
+ _unload: function(){
+ Ext.EventManager.un(window, "resize", this.fireWindowResize, this);
+ unload.call(Ext.EventManager);
+ },
+
+
+ doResizeEvent: function(){
+ var h = D.getViewHeight(),
+ w = D.getViewWidth();
+
+
+ if(curHeight != h || curWidth != w){
+ resizeEvent.fire(curWidth = w, curHeight = h);
+ }
+ },
+
+
+ onWindowResize : function(fn, scope, options){
+ if(!resizeEvent){
+ resizeEvent = new Ext.util.Event();
+ resizeTask = new Ext.util.DelayedTask(this.doResizeEvent);
+ Ext.EventManager.on(window, "resize", this.fireWindowResize, this);
+ }
+ resizeEvent.addListener(fn, scope, options);
+ },
+
+
+ fireWindowResize : function(){
+ if(resizeEvent){
+ resizeTask.delay(100);
+ }
+ },
+
+
+ onTextResize : function(fn, scope, options){
+ if(!textEvent){
+ textEvent = new Ext.util.Event();
+ var textEl = new Ext.Element(document.createElement('div'));
+ textEl.dom.className = 'x-text-resize';
+ textEl.dom.innerHTML = 'X';
+ textEl.appendTo(document.body);
+ textSize = textEl.dom.offsetHeight;
+ setInterval(function(){
+ if(textEl.dom.offsetHeight != textSize){
+ textEvent.fire(textSize, textSize = textEl.dom.offsetHeight);
+ }
+ }, this.textResizeInterval);
+ }
+ textEvent.addListener(fn, scope, options);
+ },
+
+
+ removeResizeListener : function(fn, scope){
+ if(resizeEvent){
+ resizeEvent.removeListener(fn, scope);
+ }
+ },
+
+
+ fireResize : function(){
+ if(resizeEvent){
+ resizeEvent.fire(D.getViewWidth(), D.getViewHeight());
+ }
+ },
+
+
+ textResizeInterval : 50,
+
+
+ ieDeferSrc : false,
+
+
+ getKeyEvent : function(){
+ return useKeydown ? 'keydown' : 'keypress';
+ },
+
+
+
+ useKeydown: useKeydown
+ };
+}());
+
+Ext.EventManager.on = Ext.EventManager.addListener;
+
+
+Ext.apply(Ext.EventObjectImpl.prototype, {
+
+ BACKSPACE: 8,
+
+ TAB: 9,
+
+ NUM_CENTER: 12,
+
+ ENTER: 13,
+
+ RETURN: 13,
+
+ SHIFT: 16,
+
+ CTRL: 17,
+ CONTROL : 17,
+
+ ALT: 18,
+
+ PAUSE: 19,
+
+ CAPS_LOCK: 20,
+
+ ESC: 27,
+
+ SPACE: 32,
+
+ PAGE_UP: 33,
+ PAGEUP : 33,
+
+ PAGE_DOWN: 34,
+ PAGEDOWN : 34,
+
+ END: 35,
+
+ HOME: 36,
+
+ LEFT: 37,
+
+ UP: 38,
+
+ RIGHT: 39,
+
+ DOWN: 40,
+
+ PRINT_SCREEN: 44,
+
+ INSERT: 45,
+
+ DELETE: 46,
+
+ ZERO: 48,
+
+ ONE: 49,
+
+ TWO: 50,
+
+ THREE: 51,
+
+ FOUR: 52,
+
+ FIVE: 53,
+
+ SIX: 54,
+
+ SEVEN: 55,
+
+ EIGHT: 56,
+
+ NINE: 57,
+
+ A: 65,
+
+ B: 66,
+
+ C: 67,
+
+ D: 68,
+
+ E: 69,
+
+ F: 70,
+
+ G: 71,
+
+ H: 72,
+
+ I: 73,
+
+ J: 74,
+
+ K: 75,
+
+ L: 76,
+
+ M: 77,
+
+ N: 78,
+
+ O: 79,
+
+ P: 80,
+
+ Q: 81,
+
+ R: 82,
+
+ S: 83,
+
+ T: 84,
+
+ U: 85,
+
+ V: 86,
+
+ W: 87,
+
+ X: 88,
+
+ Y: 89,
+
+ Z: 90,
+
+ CONTEXT_MENU: 93,
+
+ NUM_ZERO: 96,
+
+ NUM_ONE: 97,
+
+ NUM_TWO: 98,
+
+ NUM_THREE: 99,
+
+ NUM_FOUR: 100,
+
+ NUM_FIVE: 101,
+
+ NUM_SIX: 102,
+
+ NUM_SEVEN: 103,
+
+ NUM_EIGHT: 104,
+
+ NUM_NINE: 105,
+
+ NUM_MULTIPLY: 106,
+
+ NUM_PLUS: 107,
+
+ NUM_MINUS: 109,
+
+ NUM_PERIOD: 110,
+
+ NUM_DIVISION: 111,
+
+ F1: 112,
+
+ F2: 113,
+
+ F3: 114,
+
+ F4: 115,
+
+ F5: 116,
+
+ F6: 117,
+
+ F7: 118,
+
+ F8: 119,
+
+ F9: 120,
+
+ F10: 121,
+
+ F11: 122,
+
+ F12: 123,
+
+
+ isNavKeyPress : function(){
+ var me = this,
+ k = this.normalizeKey(me.keyCode);
+ return (k >= 33 && k <= 40) ||
+ k == me.RETURN ||
+ k == me.TAB ||
+ k == me.ESC;
+ },
+
+ isSpecialKey : function(){
+ var k = this.normalizeKey(this.keyCode);
+ return (this.type == 'keypress' && this.ctrlKey) ||
+ this.isNavKeyPress() ||
+ (k == this.BACKSPACE) ||
+ (k >= 16 && k <= 20) ||
+ (k >= 44 && k <= 46);
+ },
+
+ getPoint : function(){
+ return new Ext.lib.Point(this.xy[0], this.xy[1]);
+ },
+
+
+ hasModifier : function(){
+ return ((this.ctrlKey || this.altKey) || this.shiftKey);
+ }
+});
+Ext.Element.addMethods({
+
+ swallowEvent : function(eventName, preventDefault) {
+ var me = this;
+ function fn(e) {
+ e.stopPropagation();
+ if (preventDefault) {
+ e.preventDefault();
+ }
+ }
+
+ if (Ext.isArray(eventName)) {
+ Ext.each(eventName, function(e) {
+ me.on(e, fn);
+ });
+ return me;
+ }
+ me.on(eventName, fn);
+ return me;
+ },
+
+
+ relayEvent : function(eventName, observable) {
+ this.on(eventName, function(e) {
+ observable.fireEvent(eventName, e);
+ });
+ },
+
+
+ clean : function(forceReclean) {
+ var me = this,
+ dom = me.dom,
+ n = dom.firstChild,
+ ni = -1;
+
+ if (Ext.Element.data(dom, 'isCleaned') && forceReclean !== true) {
+ return me;
+ }
+
+ while (n) {
+ var nx = n.nextSibling;
+ if (n.nodeType == 3 && !(/\S/.test(n.nodeValue))) {
+ dom.removeChild(n);
+ } else {
+ n.nodeIndex = ++ni;
+ }
+ n = nx;
+ }
+
+ Ext.Element.data(dom, 'isCleaned', true);
+ return me;
+ },
+
+
+ load : function() {
+ var updateManager = this.getUpdater();
+ updateManager.update.apply(updateManager, arguments);
+
+ return this;
+ },
+
+
+ getUpdater : function() {
+ return this.updateManager || (this.updateManager = new Ext.Updater(this));
+ },
+
+
+ update : function(html, loadScripts, callback) {
+ if (!this.dom) {
+ return this;
+ }
+ html = html || "";
+
+ if (loadScripts !== true) {
+ this.dom.innerHTML = html;
+ if (typeof callback == 'function') {
+ callback();
+ }
+ return this;
+ }
+
+ var id = Ext.id(),
+ dom = this.dom;
+
+ html += '<span id="' + id + '"></span>';
+
+ Ext.lib.Event.onAvailable(id, function() {
+ var DOC = document,
+ hd = DOC.getElementsByTagName("head")[0],
+ re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig,
+ srcRe = /\ssrc=([\'\"])(.*?)\1/i,
+ typeRe = /\stype=([\'\"])(.*?)\1/i,
+ match,
+ attrs,
+ srcMatch,
+ typeMatch,
+ el,
+ s;
+
+ while ((match = re.exec(html))) {
+ attrs = match[1];
+ srcMatch = attrs ? attrs.match(srcRe) : false;
+ if (srcMatch && srcMatch[2]) {
+ s = DOC.createElement("script");
+ s.src = srcMatch[2];
+ typeMatch = attrs.match(typeRe);
+ if (typeMatch && typeMatch[2]) {
+ s.type = typeMatch[2];
+ }
+ hd.appendChild(s);
+ } else if (match[2] && match[2].length > 0) {
+ if (window.execScript) {
+ window.execScript(match[2]);
+ } else {
+ window.eval(match[2]);
+ }
+ }
+ }
+
+ el = DOC.getElementById(id);
+ if (el) {
+ Ext.removeNode(el);
+ }
+
+ if (typeof callback == 'function') {
+ callback();
+ }
+ });
+ dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, "");
+ return this;
+ },
+
+
+ removeAllListeners : function() {
+ this.removeAnchor();
+ Ext.EventManager.removeAll(this.dom);
+ return this;
+ },
+
+
+ createProxy : function(config, renderTo, matchBox) {
+ config = (typeof config == 'object') ? config : {tag : "div", cls: config};
+
+ var me = this,
+ proxy = renderTo ? Ext.DomHelper.append(renderTo, config, true) :
+ Ext.DomHelper.insertBefore(me.dom, config, true);
+
+ if (matchBox && me.setBox && me.getBox) {
+ proxy.setBox(me.getBox());
+ }
+ return proxy;
+ }
+});
+
+Ext.Element.prototype.getUpdateManager = Ext.Element.prototype.getUpdater;
+
+Ext.Element.addMethods({
+
+ getAnchorXY : function(anchor, local, s){
+
+
+ anchor = (anchor || "tl").toLowerCase();
+ s = s || {};
+
+ var me = this,
+ vp = me.dom == document.body || me.dom == document,
+ w = s.width || vp ? Ext.lib.Dom.getViewWidth() : me.getWidth(),
+ h = s.height || vp ? Ext.lib.Dom.getViewHeight() : me.getHeight(),
+ xy,
+ r = Math.round,
+ o = me.getXY(),
+ scroll = me.getScroll(),
+ extraX = vp ? scroll.left : !local ? o[0] : 0,
+ extraY = vp ? scroll.top : !local ? o[1] : 0,
+ hash = {
+ c : [r(w * 0.5), r(h * 0.5)],
+ t : [r(w * 0.5), 0],
+ l : [0, r(h * 0.5)],
+ r : [w, r(h * 0.5)],
+ b : [r(w * 0.5), h],
+ tl : [0, 0],
+ bl : [0, h],
+ br : [w, h],
+ tr : [w, 0]
+ };
+
+ xy = hash[anchor];
+ return [xy[0] + extraX, xy[1] + extraY];
+ },
+
+
+ anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){
+ var me = this,
+ dom = me.dom,
+ scroll = !Ext.isEmpty(monitorScroll),
+ action = function(){
+ Ext.fly(dom).alignTo(el, alignment, offsets, animate);
+ Ext.callback(callback, Ext.fly(dom));
+ },
+ anchor = this.getAnchor();
+
+
+ this.removeAnchor();
+ Ext.apply(anchor, {
+ fn: action,
+ scroll: scroll
+ });
+
+ Ext.EventManager.onWindowResize(action, null);
+
+ if(scroll){
+ Ext.EventManager.on(window, 'scroll', action, null,
+ {buffer: !isNaN(monitorScroll) ? monitorScroll : 50});
+ }
+ action.call(me);
+ return me;
+ },
+
+
+ removeAnchor : function(){
+ var me = this,
+ anchor = this.getAnchor();
+
+ if(anchor && anchor.fn){
+ Ext.EventManager.removeResizeListener(anchor.fn);
+ if(anchor.scroll){
+ Ext.EventManager.un(window, 'scroll', anchor.fn);
+ }
+ delete anchor.fn;
+ }
+ return me;
+ },
+
+
+ getAnchor : function(){
+ var data = Ext.Element.data,
+ dom = this.dom;
+ if (!dom) {
+ return;
+ }
+ var anchor = data(dom, '_anchor');
+
+ if(!anchor){
+ anchor = data(dom, '_anchor', {});
+ }
+ return anchor;
+ },
+
+
+ getAlignToXY : function(el, p, o){
+ el = Ext.get(el);
+
+ if(!el || !el.dom){
+ throw "Element.alignToXY with an element that doesn't exist";
+ }
+
+ o = o || [0,0];
+ p = (!p || p == "?" ? "tl-bl?" : (!(/-/).test(p) && p !== "" ? "tl-" + p : p || "tl-bl")).toLowerCase();
+
+ var me = this,
+ d = me.dom,
+ a1,
+ a2,
+ x,
+ y,
+
+ w,
+ h,
+ r,
+ dw = Ext.lib.Dom.getViewWidth() -10,
+ dh = Ext.lib.Dom.getViewHeight()-10,
+ p1y,
+ p1x,
+ p2y,
+ p2x,
+ swapY,
+ swapX,
+ doc = document,
+ docElement = doc.documentElement,
+ docBody = doc.body,
+ scrollX = (docElement.scrollLeft || docBody.scrollLeft || 0)+5,
+ scrollY = (docElement.scrollTop || docBody.scrollTop || 0)+5,
+ c = false,
+ p1 = "",
+ p2 = "",
+ m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/);
+
+ if(!m){
+ throw "Element.alignTo with an invalid alignment " + p;
+ }
+
+ p1 = m[1];
+ p2 = m[2];
+ c = !!m[3];
+
+
+
+ a1 = me.getAnchorXY(p1, true);
+ a2 = el.getAnchorXY(p2, false);
+
+ x = a2[0] - a1[0] + o[0];
+ y = a2[1] - a1[1] + o[1];
+
+ if(c){
+ w = me.getWidth();
+ h = me.getHeight();
+ r = el.getRegion();
+
+
+
+ p1y = p1.charAt(0);
+ p1x = p1.charAt(p1.length-1);
+ p2y = p2.charAt(0);
+ p2x = p2.charAt(p2.length-1);
+ swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t"));
+ swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r"));
+
+
+ if (x + w > dw + scrollX) {
+ x = swapX ? r.left-w : dw+scrollX-w;
+ }
+ if (x < scrollX) {
+ x = swapX ? r.right : scrollX;
+ }
+ if (y + h > dh + scrollY) {
+ y = swapY ? r.top-h : dh+scrollY-h;
+ }
+ if (y < scrollY){
+ y = swapY ? r.bottom : scrollY;
+ }
+ }
+ return [x,y];
+ },
+
+
+ alignTo : function(element, position, offsets, animate){
+ var me = this;
+ return me.setXY(me.getAlignToXY(element, position, offsets),
+ me.preanim && !!animate ? me.preanim(arguments, 3) : false);
+ },
+
+
+ adjustForConstraints : function(xy, parent, offsets){
+ return this.getConstrainToXY(parent || document, false, offsets, xy) || xy;
+ },
+
+
+ getConstrainToXY : function(el, local, offsets, proposedXY){
+ var os = {top:0, left:0, bottom:0, right: 0};
+
+ return function(el, local, offsets, proposedXY){
+ el = Ext.get(el);
+ offsets = offsets ? Ext.applyIf(offsets, os) : os;
+
+ var vw, vh, vx = 0, vy = 0;
+ if(el.dom == document.body || el.dom == document){
+ vw =Ext.lib.Dom.getViewWidth();
+ vh = Ext.lib.Dom.getViewHeight();
+ }else{
+ vw = el.dom.clientWidth;
+ vh = el.dom.clientHeight;
+ if(!local){
+ var vxy = el.getXY();
+ vx = vxy[0];
+ vy = vxy[1];
+ }
+ }
+
+ var s = el.getScroll();
+
+ vx += offsets.left + s.left;
+ vy += offsets.top + s.top;
+
+ vw -= offsets.right;
+ vh -= offsets.bottom;
+
+ var vr = vx + vw,
+ vb = vy + vh,
+ xy = proposedXY || (!local ? this.getXY() : [this.getLeft(true), this.getTop(true)]),
+ x = xy[0], y = xy[1],
+ offset = this.getConstrainOffset(),
+ w = this.dom.offsetWidth + offset,
+ h = this.dom.offsetHeight + offset;
+
+
+ var moved = false;
+
+
+ if((x + w) > vr){
+ x = vr - w;
+ moved = true;
+ }
+ if((y + h) > vb){
+ y = vb - h;
+ moved = true;
+ }
+
+ if(x < vx){
+ x = vx;
+ moved = true;
+ }
+ if(y < vy){
+ y = vy;
+ moved = true;
+ }
+ return moved ? [x, y] : false;
+ };
+ }(),
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ getConstrainOffset : function(){
+ return 0;
+ },
+
+
+ getCenterXY : function(){
+ return this.getAlignToXY(document, 'c-c');
+ },
+
+
+ center : function(centerIn){
+ return this.alignTo(centerIn || document, 'c-c');
+ }
+});
+
+Ext.Element.addMethods({
+
+ select : function(selector, unique){
+ return Ext.Element.select(selector, unique, this.dom);
+ }
+});
+Ext.apply(Ext.Element.prototype, function() {
+ var GETDOM = Ext.getDom,
+ GET = Ext.get,
+ DH = Ext.DomHelper;
+
+ return {
+
+ insertSibling: function(el, where, returnDom){
+ var me = this,
+ rt,
+ isAfter = (where || 'before').toLowerCase() == 'after',
+ insertEl;
+
+ if(Ext.isArray(el)){
+ insertEl = me;
+ Ext.each(el, function(e) {
+ rt = Ext.fly(insertEl, '_internal').insertSibling(e, where, returnDom);
+ if(isAfter){
+ insertEl = rt;
+ }
+ });
+ return rt;
+ }
+
+ el = el || {};
+
+ if(el.nodeType || el.dom){
+ rt = me.dom.parentNode.insertBefore(GETDOM(el), isAfter ? me.dom.nextSibling : me.dom);
+ if (!returnDom) {
+ rt = GET(rt);
+ }
+ }else{
+ if (isAfter && !me.dom.nextSibling) {
+ rt = DH.append(me.dom.parentNode, el, !returnDom);
+ } else {
+ rt = DH[isAfter ? 'insertAfter' : 'insertBefore'](me.dom, el, !returnDom);
+ }
+ }
+ return rt;
+ }
+ };
+}());
+
+
+Ext.Element.boxMarkup = '<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>';
+
+Ext.Element.addMethods(function(){
+ var INTERNAL = "_internal",
+ pxMatch = /(\d+\.?\d+)px/;
+ return {
+
+ applyStyles : function(style){
+ Ext.DomHelper.applyStyles(this.dom, style);
+ return this;
+ },
+
+
+ getStyles : function(){
+ var ret = {};
+ Ext.each(arguments, function(v) {
+ ret[v] = this.getStyle(v);
+ },
+ this);
+ return ret;
+ },
+
+
+ setOverflow : function(v){
+ var dom = this.dom;
+ if(v=='auto' && Ext.isMac && Ext.isGecko2){
+ dom.style.overflow = 'hidden';
+ (function(){dom.style.overflow = 'auto';}).defer(1);
+ }else{
+ dom.style.overflow = v;
+ }
+ },
+
+
+ boxWrap : function(cls){
+ cls = cls || 'x-box';
+ var el = Ext.get(this.insertHtml("beforeBegin", "<div class='" + cls + "'>" + String.format(Ext.Element.boxMarkup, cls) + "</div>"));
+ Ext.DomQuery.selectNode('.' + cls + '-mc', el.dom).appendChild(this.dom);
+ return el;
+ },
+
+
+ setSize : function(width, height, animate){
+ var me = this;
+ if(typeof width == 'object'){
+ height = width.height;
+ width = width.width;
+ }
+ width = me.adjustWidth(width);
+ height = me.adjustHeight(height);
+ if(!animate || !me.anim){
+ me.dom.style.width = me.addUnits(width);
+ me.dom.style.height = me.addUnits(height);
+ }else{
+ me.anim({width: {to: width}, height: {to: height}}, me.preanim(arguments, 2));
+ }
+ return me;
+ },
+
+
+ getComputedHeight : function(){
+ var me = this,
+ h = Math.max(me.dom.offsetHeight, me.dom.clientHeight);
+ if(!h){
+ h = parseFloat(me.getStyle('height')) || 0;
+ if(!me.isBorderBox()){
+ h += me.getFrameWidth('tb');
+ }
+ }
+ return h;
+ },
+
+
+ getComputedWidth : function(){
+ var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);
+ if(!w){
+ w = parseFloat(this.getStyle('width')) || 0;
+ if(!this.isBorderBox()){
+ w += this.getFrameWidth('lr');
+ }
+ }
+ return w;
+ },
+
+
+ getFrameWidth : function(sides, onlyContentBox){
+ return onlyContentBox && this.isBorderBox() ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides));
+ },
+
+
+ addClassOnOver : function(className){
+ this.hover(
+ function(){
+ Ext.fly(this, INTERNAL).addClass(className);
+ },
+ function(){
+ Ext.fly(this, INTERNAL).removeClass(className);
+ }
+ );
+ return this;
+ },
+
+
+ addClassOnFocus : function(className){
+ this.on("focus", function(){
+ Ext.fly(this, INTERNAL).addClass(className);
+ }, this.dom);
+ this.on("blur", function(){
+ Ext.fly(this, INTERNAL).removeClass(className);
+ }, this.dom);
+ return this;
+ },
+
+
+ addClassOnClick : function(className){
+ var dom = this.dom;
+ this.on("mousedown", function(){
+ Ext.fly(dom, INTERNAL).addClass(className);
+ var d = Ext.getDoc(),
+ fn = function(){
+ Ext.fly(dom, INTERNAL).removeClass(className);
+ d.removeListener("mouseup", fn);
+ };
+ d.on("mouseup", fn);
+ });
+ return this;
+ },
+
+
+
+ getViewSize : function(){
+ var doc = document,
+ d = this.dom,
+ isDoc = (d == doc || d == doc.body);
+
+
+ if (isDoc) {
+ var extdom = Ext.lib.Dom;
+ return {
+ width : extdom.getViewWidth(),
+ height : extdom.getViewHeight()
+ };
+
+
+ } else {
+ return {
+ width : d.clientWidth,
+ height : d.clientHeight
+ };
+ }
+ },
+
+
+
+ getStyleSize : function(){
+ var me = this,
+ w, h,
+ doc = document,
+ d = this.dom,
+ isDoc = (d == doc || d == doc.body),
+ s = d.style;
+
+
+ if (isDoc) {
+ var extdom = Ext.lib.Dom;
+ return {
+ width : extdom.getViewWidth(),
+ height : extdom.getViewHeight()
+ };
+ }
+
+ if(s.width && s.width != 'auto'){
+ w = parseFloat(s.width);
+ if(me.isBorderBox()){
+ w -= me.getFrameWidth('lr');
+ }
+ }
+
+ if(s.height && s.height != 'auto'){
+ h = parseFloat(s.height);
+ if(me.isBorderBox()){
+ h -= me.getFrameWidth('tb');
+ }
+ }
+
+ return {width: w || me.getWidth(true), height: h || me.getHeight(true)};
+ },
+
+
+ getSize : function(contentSize){
+ return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)};
+ },
+
+
+ repaint : function(){
+ var dom = this.dom;
+ this.addClass("x-repaint");
+ setTimeout(function(){
+ Ext.fly(dom).removeClass("x-repaint");
+ }, 1);
+ return this;
+ },
+
+
+ unselectable : function(){
+ this.dom.unselectable = "on";
+ return this.swallowEvent("selectstart", true).
+ addClass("x-unselectable");
+ },
+
+
+ getMargins : function(side){
+ var me = this,
+ key,
+ hash = {t:"top", l:"left", r:"right", b: "bottom"},
+ o = {};
+
+ if (!side) {
+ for (key in me.margins){
+ o[hash[key]] = parseFloat(me.getStyle(me.margins[key])) || 0;
+ }
+ return o;
+ } else {
+ return me.addStyles.call(me, side, me.margins);
+ }
+ }
+ };
+}());
+
+Ext.Element.addMethods({
+
+ setBox : function(box, adjust, animate){
+ var me = this,
+ w = box.width,
+ h = box.height;
+ if((adjust && !me.autoBoxAdjust) && !me.isBorderBox()){
+ w -= (me.getBorderWidth("lr") + me.getPadding("lr"));
+ h -= (me.getBorderWidth("tb") + me.getPadding("tb"));
+ }
+ me.setBounds(box.x, box.y, w, h, me.animTest.call(me, arguments, animate, 2));
+ return me;
+ },
+
+
+ getBox : function(contentBox, local) {
+ var me = this,
+ xy,
+ left,
+ top,
+ getBorderWidth = me.getBorderWidth,
+ getPadding = me.getPadding,
+ l,
+ r,
+ t,
+ b;
+ if(!local){
+ xy = me.getXY();
+ }else{
+ left = parseInt(me.getStyle("left"), 10) || 0;
+ top = parseInt(me.getStyle("top"), 10) || 0;
+ xy = [left, top];
+ }
+ var el = me.dom, w = el.offsetWidth, h = el.offsetHeight, bx;
+ if(!contentBox){
+ bx = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: w, height: h};
+ }else{
+ l = getBorderWidth.call(me, "l") + getPadding.call(me, "l");
+ r = getBorderWidth.call(me, "r") + getPadding.call(me, "r");
+ t = getBorderWidth.call(me, "t") + getPadding.call(me, "t");
+ b = getBorderWidth.call(me, "b") + getPadding.call(me, "b");
+ bx = {x: xy[0]+l, y: xy[1]+t, 0: xy[0]+l, 1: xy[1]+t, width: w-(l+r), height: h-(t+b)};
+ }
+ bx.right = bx.x + bx.width;
+ bx.bottom = bx.y + bx.height;
+ return bx;
+ },
+
+
+ move : function(direction, distance, animate){
+ var me = this,
+ xy = me.getXY(),
+ x = xy[0],
+ y = xy[1],
+ left = [x - distance, y],
+ right = [x + distance, y],
+ top = [x, y - distance],
+ bottom = [x, y + distance],
+ hash = {
+ l : left,
+ left : left,
+ r : right,
+ right : right,
+ t : top,
+ top : top,
+ up : top,
+ b : bottom,
+ bottom : bottom,
+ down : bottom
+ };
+
+ direction = direction.toLowerCase();
+ me.moveTo(hash[direction][0], hash[direction][1], me.animTest.call(me, arguments, animate, 2));
+ },
+
+
+ setLeftTop : function(left, top){
+ var me = this,
+ style = me.dom.style;
+ style.left = me.addUnits(left);
+ style.top = me.addUnits(top);
+ return me;
+ },
+
+
+ getRegion : function(){
+ return Ext.lib.Dom.getRegion(this.dom);
+ },
+
+
+ setBounds : function(x, y, width, height, animate){
+ var me = this;
+ if (!animate || !me.anim) {
+ me.setSize(width, height);
+ me.setLocation(x, y);
+ } else {
+ me.anim({points: {to: [x, y]},
+ width: {to: me.adjustWidth(width)},
+ height: {to: me.adjustHeight(height)}},
+ me.preanim(arguments, 4),
+ 'motion');
+ }
+ return me;
+ },
+
+
+ setRegion : function(region, animate) {
+ return this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.animTest.call(this, arguments, animate, 1));
+ }
+});
+Ext.Element.addMethods({
+
+ scrollTo : function(side, value, animate) {
+
+ var top = /top/i.test(side),
+ me = this,
+ dom = me.dom,
+ prop;
+ if (!animate || !me.anim) {
+
+ prop = 'scroll' + (top ? 'Top' : 'Left');
+ dom[prop] = value;
+ }
+ else {
+
+ prop = 'scroll' + (top ? 'Left' : 'Top');
+ me.anim({scroll: {to: top ? [dom[prop], value] : [value, dom[prop]]}}, me.preanim(arguments, 2), 'scroll');
+ }
+ return me;
+ },
+
+
+ scrollIntoView : function(container, hscroll) {
+ var c = Ext.getDom(container) || Ext.getBody().dom,
+ el = this.dom,
+ o = this.getOffsetsTo(c),
+ l = o[0] + c.scrollLeft,
+ t = o[1] + c.scrollTop,
+ b = t + el.offsetHeight,
+ r = l + el.offsetWidth,
+ ch = c.clientHeight,
+ ct = parseInt(c.scrollTop, 10),
+ cl = parseInt(c.scrollLeft, 10),
+ cb = ct + ch,
+ cr = cl + c.clientWidth;
+
+ if (el.offsetHeight > ch || t < ct) {
+ c.scrollTop = t;
+ }
+ else if (b > cb) {
+ c.scrollTop = b-ch;
+ }
+
+ c.scrollTop = c.scrollTop;
+
+ if (hscroll !== false) {
+ if (el.offsetWidth > c.clientWidth || l < cl) {
+ c.scrollLeft = l;
+ }
+ else if (r > cr) {
+ c.scrollLeft = r - c.clientWidth;
+ }
+ c.scrollLeft = c.scrollLeft;
+ }
+ return this;
+ },
+
+
+ scrollChildIntoView : function(child, hscroll) {
+ Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll);
+ },
+
+
+ scroll : function(direction, distance, animate) {
+ if (!this.isScrollable()) {
+ return false;
+ }
+ var el = this.dom,
+ l = el.scrollLeft, t = el.scrollTop,
+ w = el.scrollWidth, h = el.scrollHeight,
+ cw = el.clientWidth, ch = el.clientHeight,
+ scrolled = false, v,
+ hash = {
+ l: Math.min(l + distance, w-cw),
+ r: v = Math.max(l - distance, 0),
+ t: Math.max(t - distance, 0),
+ b: Math.min(t + distance, h-ch)
+ };
+ hash.d = hash.b;
+ hash.u = hash.t;
+
+ direction = direction.substr(0, 1);
+ if ((v = hash[direction]) > -1) {
+ scrolled = true;
+ this.scrollTo(direction == 'l' || direction == 'r' ? 'left' : 'top', v, this.preanim(arguments, 2));
+ }
+ return scrolled;
+ }
+});
+Ext.Element.addMethods(
+ function() {
+ var VISIBILITY = "visibility",
+ DISPLAY = "display",
+ HIDDEN = "hidden",
+ NONE = "none",
+ XMASKED = "x-masked",
+ XMASKEDRELATIVE = "x-masked-relative",
+ data = Ext.Element.data;
+
+ return {
+
+ isVisible : function(deep) {
+ var vis = !this.isStyle(VISIBILITY, HIDDEN) && !this.isStyle(DISPLAY, NONE),
+ p = this.dom.parentNode;
+
+ if (deep !== true || !vis) {
+ return vis;
+ }
+
+ while (p && !(/^body/i.test(p.tagName))) {
+ if (!Ext.fly(p, '_isVisible').isVisible()) {
+ return false;
+ }
+ p = p.parentNode;
+ }
+ return true;
+ },
+
+
+ isDisplayed : function() {
+ return !this.isStyle(DISPLAY, NONE);
+ },
+
+
+ enableDisplayMode : function(display) {
+ this.setVisibilityMode(Ext.Element.DISPLAY);
+
+ if (!Ext.isEmpty(display)) {
+ data(this.dom, 'originalDisplay', display);
+ }
+
+ return this;
+ },
+
+
+ mask : function(msg, msgCls) {
+ var me = this,
+ dom = me.dom,
+ dh = Ext.DomHelper,
+ EXTELMASKMSG = "ext-el-mask-msg",
+ el,
+ mask;
+
+ if (!/^body/i.test(dom.tagName) && me.getStyle('position') == 'static') {
+ me.addClass(XMASKEDRELATIVE);
+ }
+ if (el = data(dom, 'maskMsg')) {
+ el.remove();
+ }
+ if (el = data(dom, 'mask')) {
+ el.remove();
+ }
+
+ mask = dh.append(dom, {cls : "ext-el-mask"}, true);
+ data(dom, 'mask', mask);
+
+ me.addClass(XMASKED);
+ mask.setDisplayed(true);
+
+ if (typeof msg == 'string') {
+ var mm = dh.append(dom, {cls : EXTELMASKMSG, cn:{tag:'div'}}, true);
+ data(dom, 'maskMsg', mm);
+ mm.dom.className = msgCls ? EXTELMASKMSG + " " + msgCls : EXTELMASKMSG;
+ mm.dom.firstChild.innerHTML = msg;
+ mm.setDisplayed(true);
+ mm.center(me);
+ }
+
+
+ if (Ext.isIE && !(Ext.isIE7 && Ext.isStrict) && me.getStyle('height') == 'auto') {
+ mask.setSize(undefined, me.getHeight());
+ }
+
+ return mask;
+ },
+
+
+ unmask : function() {
+ var me = this,
+ dom = me.dom,
+ mask = data(dom, 'mask'),
+ maskMsg = data(dom, 'maskMsg');
+
+ if (mask) {
+ if (maskMsg) {
+ maskMsg.remove();
+ data(dom, 'maskMsg', undefined);
+ }
+
+ mask.remove();
+ data(dom, 'mask', undefined);
+ me.removeClass([XMASKED, XMASKEDRELATIVE]);
+ }
+ },
+
+
+ isMasked : function() {
+ var m = data(this.dom, 'mask');
+ return m && m.isVisible();
+ },
+
+
+ createShim : function() {
+ var el = document.createElement('iframe'),
+ shim;
+
+ el.frameBorder = '0';
+ el.className = 'ext-shim';
+ el.src = Ext.SSL_SECURE_URL;
+ shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom));
+ shim.autoBoxAdjust = false;
+ return shim;
+ }
+ };
+ }()
+);
+Ext.Element.addMethods({
+
+ addKeyListener : function(key, fn, scope){
+ var config;
+ if(typeof key != 'object' || Ext.isArray(key)){
+ config = {
+ key: key,
+ fn: fn,
+ scope: scope
+ };
+ }else{
+ config = {
+ key : key.key,
+ shift : key.shift,
+ ctrl : key.ctrl,
+ alt : key.alt,
+ fn: fn,
+ scope: scope
+ };
+ }
+ return new Ext.KeyMap(this, config);
+ },
+
+
+ addKeyMap : function(config){
+ return new Ext.KeyMap(this, config);
+ }
+});
+
+
+
+Ext.CompositeElementLite.importElementMethods();
+Ext.apply(Ext.CompositeElementLite.prototype, {
+ addElements : function(els, root){
+ if(!els){
+ return this;
+ }
+ if(typeof els == "string"){
+ els = Ext.Element.selectorFunction(els, root);
+ }
+ var yels = this.elements;
+ Ext.each(els, function(e) {
+ yels.push(Ext.get(e));
+ });
+ return this;
+ },
+
+
+ first : function(){
+ return this.item(0);
+ },
+
+
+ last : function(){
+ return this.item(this.getCount()-1);
+ },
+
+
+ contains : function(el){
+ return this.indexOf(el) != -1;
+ },
+
+
+ removeElement : function(keys, removeDom){
+ var me = this,
+ els = this.elements,
+ el;
+ Ext.each(keys, function(val){
+ if ((el = (els[val] || els[val = me.indexOf(val)]))) {
+ if(removeDom){
+ if(el.dom){
+ el.remove();
+ }else{
+ Ext.removeNode(el);
+ }
+ }
+ els.splice(val, 1);
+ }
+ });
+ return this;
+ }
+});
+
+Ext.CompositeElement = Ext.extend(Ext.CompositeElementLite, {
+
+ constructor : function(els, root){
+ this.elements = [];
+ this.add(els, root);
+ },
+
+
+ getElement : function(el){
+
+ return el;
+ },
+
+
+ transformElement : function(el){
+ return Ext.get(el);
+ }
+
+
+
+
+
+
+});
+
+
+Ext.Element.select = function(selector, unique, root){
+ var els;
+ if(typeof selector == "string"){
+ els = Ext.Element.selectorFunction(selector, root);
+ }else if(selector.length !== undefined){
+ els = selector;
+ }else{
+ throw "Invalid selector";
+ }
+
+ return (unique === true) ? new Ext.CompositeElement(els) : new Ext.CompositeElementLite(els);
+};
+
+
+Ext.select = Ext.Element.select;
+Ext.UpdateManager = Ext.Updater = Ext.extend(Ext.util.Observable,
+function() {
+ var BEFOREUPDATE = "beforeupdate",
+ UPDATE = "update",
+ FAILURE = "failure";
+
+
+ function processSuccess(response){
+ var me = this;
+ me.transaction = null;
+ if (response.argument.form && response.argument.reset) {
+ try {
+ response.argument.form.reset();
+ } catch(e){}
+ }
+ if (me.loadScripts) {
+ me.renderer.render(me.el, response, me,
+ updateComplete.createDelegate(me, [response]));
+ } else {
+ me.renderer.render(me.el, response, me);
+ updateComplete.call(me, response);
+ }
+ }
+
+
+ function updateComplete(response, type, success){
+ this.fireEvent(type || UPDATE, this.el, response);
+ if(Ext.isFunction(response.argument.callback)){
+ response.argument.callback.call(response.argument.scope, this.el, Ext.isEmpty(success) ? true : false, response, response.argument.options);
+ }
+ }
+
+
+ function processFailure(response){
+ updateComplete.call(this, response, FAILURE, !!(this.transaction = null));
+ }
+
+ return {
+ constructor: function(el, forceNew){
+ var me = this;
+ el = Ext.get(el);
+ if(!forceNew && el.updateManager){
+ return el.updateManager;
+ }
+
+ me.el = el;
+
+ me.defaultUrl = null;
+
+ me.addEvents(
+
+ BEFOREUPDATE,
+
+ UPDATE,
+
+ FAILURE
+ );
+
+ Ext.apply(me, Ext.Updater.defaults);
+
+
+
+
+
+
+
+
+ me.transaction = null;
+
+ me.refreshDelegate = me.refresh.createDelegate(me);
+
+ me.updateDelegate = me.update.createDelegate(me);
+
+ me.formUpdateDelegate = (me.formUpdate || function(){}).createDelegate(me);
+
+
+ me.renderer = me.renderer || me.getDefaultRenderer();
+
+ Ext.Updater.superclass.constructor.call(me);
+ },
+
+
+ setRenderer : function(renderer){
+ this.renderer = renderer;
+ },
+
+
+ getRenderer : function(){
+ return this.renderer;
+ },
+
+
+ getDefaultRenderer: function() {
+ return new Ext.Updater.BasicRenderer();
+ },
+
+
+ setDefaultUrl : function(defaultUrl){
+ this.defaultUrl = defaultUrl;
+ },
+
+
+ getEl : function(){
+ return this.el;
+ },
+
+
+ update : function(url, params, callback, discardUrl){
+ var me = this,
+ cfg,
+ callerScope;
+
+ if(me.fireEvent(BEFOREUPDATE, me.el, url, params) !== false){
+ if(Ext.isObject(url)){
+ cfg = url;
+ url = cfg.url;
+ params = params || cfg.params;
+ callback = callback || cfg.callback;
+ discardUrl = discardUrl || cfg.discardUrl;
+ callerScope = cfg.scope;
+ if(!Ext.isEmpty(cfg.nocache)){me.disableCaching = cfg.nocache;};
+ if(!Ext.isEmpty(cfg.text)){me.indicatorText = '<div class="loading-indicator">'+cfg.text+"</div>";};
+ if(!Ext.isEmpty(cfg.scripts)){me.loadScripts = cfg.scripts;};
+ if(!Ext.isEmpty(cfg.timeout)){me.timeout = cfg.timeout;};
+ }
+ me.showLoading();
+
+ if(!discardUrl){
+ me.defaultUrl = url;
+ }
+ if(Ext.isFunction(url)){
+ url = url.call(me);
+ }
+
+ var o = Ext.apply({}, {
+ url : url,
+ params: (Ext.isFunction(params) && callerScope) ? params.createDelegate(callerScope) : params,
+ success: processSuccess,
+ failure: processFailure,
+ scope: me,
+ callback: undefined,
+ timeout: (me.timeout*1000),
+ disableCaching: me.disableCaching,
+ argument: {
+ "options": cfg,
+ "url": url,
+ "form": null,
+ "callback": callback,
+ "scope": callerScope || window,
+ "params": params
+ }
+ }, cfg);
+
+ me.transaction = Ext.Ajax.request(o);
+ }
+ },
+
+
+ formUpdate : function(form, url, reset, callback){
+ var me = this;
+ if(me.fireEvent(BEFOREUPDATE, me.el, form, url) !== false){
+ if(Ext.isFunction(url)){
+ url = url.call(me);
+ }
+ form = Ext.getDom(form);
+ me.transaction = Ext.Ajax.request({
+ form: form,
+ url:url,
+ success: processSuccess,
+ failure: processFailure,
+ scope: me,
+ timeout: (me.timeout*1000),
+ argument: {
+ "url": url,
+ "form": form,
+ "callback": callback,
+ "reset": reset
+ }
+ });
+ me.showLoading.defer(1, me);
+ }
+ },
+
+
+ startAutoRefresh : function(interval, url, params, callback, refreshNow){
+ var me = this;
+ if(refreshNow){
+ me.update(url || me.defaultUrl, params, callback, true);
+ }
+ if(me.autoRefreshProcId){
+ clearInterval(me.autoRefreshProcId);
+ }
+ me.autoRefreshProcId = setInterval(me.update.createDelegate(me, [url || me.defaultUrl, params, callback, true]), interval * 1000);
+ },
+
+
+ stopAutoRefresh : function(){
+ if(this.autoRefreshProcId){
+ clearInterval(this.autoRefreshProcId);
+ delete this.autoRefreshProcId;
+ }
+ },
+
+
+ isAutoRefreshing : function(){
+ return !!this.autoRefreshProcId;
+ },
+
+
+ showLoading : function(){
+ if(this.showLoadIndicator){
+ this.el.dom.innerHTML = this.indicatorText;
+ }
+ },
+
+
+ abort : function(){
+ if(this.transaction){
+ Ext.Ajax.abort(this.transaction);
+ }
+ },
+
+
+ isUpdating : function(){
+ return this.transaction ? Ext.Ajax.isLoading(this.transaction) : false;
+ },
+
+
+ refresh : function(callback){
+ if(this.defaultUrl){
+ this.update(this.defaultUrl, null, callback, true);
+ }
+ }
+ };
+}());
+
+
+Ext.Updater.defaults = {
+
+ timeout : 30,
+
+ disableCaching : false,
+
+ showLoadIndicator : true,
+
+ indicatorText : '<div class="loading-indicator">Loading...</div>',
+
+ loadScripts : false,
+
+ sslBlankUrl : Ext.SSL_SECURE_URL
+};
+
+
+
+Ext.Updater.updateElement = function(el, url, params, options){
+ var um = Ext.get(el).getUpdater();
+ Ext.apply(um, options);
+ um.update(url, params, options ? options.callback : null);
+};
+
+
+Ext.Updater.BasicRenderer = function(){};
+
+Ext.Updater.BasicRenderer.prototype = {
+
+ render : function(el, response, updateManager, callback){
+ el.update(response.responseText, updateManager.loadScripts, callback);
+ }
+};
+
+
+
+(function() {
+
+
+Date.useStrict = false;
+
+
+
+
+
+function xf(format) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ return format.replace(/\{(\d+)\}/g, function(m, i) {
+ return args[i];
+ });
+}
+
+
+
+Date.formatCodeToRegex = function(character, currentGroup) {
+
+ var p = Date.parseCodes[character];
+
+ if (p) {
+ p = typeof p == 'function'? p() : p;
+ Date.parseCodes[character] = p;
+ }
+
+ return p ? Ext.applyIf({
+ c: p.c ? xf(p.c, currentGroup || "{0}") : p.c
+ }, p) : {
+ g:0,
+ c:null,
+ s:Ext.escapeRe(character)
+ };
+};
+
+
+var $f = Date.formatCodeToRegex;
+
+Ext.apply(Date, {
+
+ parseFunctions: {
+ "M$": function(input, strict) {
+
+
+ var re = new RegExp('\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/');
+ var r = (input || '').match(re);
+ return r? new Date(((r[1] || '') + r[2]) * 1) : null;
+ }
+ },
+ parseRegexes: [],
+
+
+ formatFunctions: {
+ "M$": function() {
+
+ return '\\/Date(' + this.getTime() + ')\\/';
+ }
+ },
+
+ y2kYear : 50,
+
+
+ MILLI : "ms",
+
+
+ SECOND : "s",
+
+
+ MINUTE : "mi",
+
+
+ HOUR : "h",
+
+
+ DAY : "d",
+
+
+ MONTH : "mo",
+
+
+ YEAR : "y",
+
+
+ defaults: {},
+
+
+ dayNames : [
+ "Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday"
+ ],
+
+
+ monthNames : [
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December"
+ ],
+
+
+ monthNumbers : {
+ Jan:0,
+ Feb:1,
+ Mar:2,
+ Apr:3,
+ May:4,
+ Jun:5,
+ Jul:6,
+ Aug:7,
+ Sep:8,
+ Oct:9,
+ Nov:10,
+ Dec:11
+ },
+
+
+ getShortMonthName : function(month) {
+ return Date.monthNames[month].substring(0, 3);
+ },
+
+
+ getShortDayName : function(day) {
+ return Date.dayNames[day].substring(0, 3);
+ },
+
+
+ getMonthNumber : function(name) {
+
+ return Date.monthNumbers[name.substring(0, 1).toUpperCase() + name.substring(1, 3).toLowerCase()];
+ },
+
+
+ formatContainsHourInfo : (function(){
+ var stripEscapeRe = /(\\.)/g,
+ hourInfoRe = /([gGhHisucUOPZ]|M\$)/;
+ return function(format){
+ return hourInfoRe.test(format.replace(stripEscapeRe, ''));
+ };
+ })(),
+
+
+ formatCodes : {
+ d: "String.leftPad(this.getDate(), 2, '0')",
+ D: "Date.getShortDayName(this.getDay())",
+ j: "this.getDate()",
+ l: "Date.dayNames[this.getDay()]",
+ N: "(this.getDay() ? this.getDay() : 7)",
+ S: "this.getSuffix()",
+ w: "this.getDay()",
+ z: "this.getDayOfYear()",
+ W: "String.leftPad(this.getWeekOfYear(), 2, '0')",
+ F: "Date.monthNames[this.getMonth()]",
+ m: "String.leftPad(this.getMonth() + 1, 2, '0')",
+ M: "Date.getShortMonthName(this.getMonth())",
+ n: "(this.getMonth() + 1)",
+ t: "this.getDaysInMonth()",
+ L: "(this.isLeapYear() ? 1 : 0)",
+ o: "(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))",
+ Y: "String.leftPad(this.getFullYear(), 4, '0')",
+ y: "('' + this.getFullYear()).substring(2, 4)",
+ a: "(this.getHours() < 12 ? 'am' : 'pm')",
+ A: "(this.getHours() < 12 ? 'AM' : 'PM')",
+ g: "((this.getHours() % 12) ? this.getHours() % 12 : 12)",
+ G: "this.getHours()",
+ h: "String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",
+ H: "String.leftPad(this.getHours(), 2, '0')",
+ i: "String.leftPad(this.getMinutes(), 2, '0')",
+ s: "String.leftPad(this.getSeconds(), 2, '0')",
+ u: "String.leftPad(this.getMilliseconds(), 3, '0')",
+ O: "this.getGMTOffset()",
+ P: "this.getGMTOffset(true)",
+ T: "this.getTimezone()",
+ Z: "(this.getTimezoneOffset() * -60)",
+
+ c: function() {
+ for (var c = "Y-m-dTH:i:sP", code = [], i = 0, l = c.length; i < l; ++i) {
+ var e = c.charAt(i);
+ code.push(e == "T" ? "'T'" : Date.getFormatCode(e));
+ }
+ return code.join(" + ");
+ },
+
+
+ U: "Math.round(this.getTime() / 1000)"
+ },
+
+
+ isValid : function(y, m, d, h, i, s, ms) {
+
+ h = h || 0;
+ i = i || 0;
+ s = s || 0;
+ ms = ms || 0;
+
+
+ var dt = new Date(y < 100 ? 100 : y, m - 1, d, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);
+
+ return y == dt.getFullYear() &&
+ m == dt.getMonth() + 1 &&
+ d == dt.getDate() &&
+ h == dt.getHours() &&
+ i == dt.getMinutes() &&
+ s == dt.getSeconds() &&
+ ms == dt.getMilliseconds();
+ },
+
+
+ parseDate : function(input, format, strict) {
+ var p = Date.parseFunctions;
+ if (p[format] == null) {
+ Date.createParser(format);
+ }
+ return p[format](input, Ext.isDefined(strict) ? strict : Date.useStrict);
+ },
+
+
+ getFormatCode : function(character) {
+ var f = Date.formatCodes[character];
+
+ if (f) {
+ f = typeof f == 'function'? f() : f;
+ Date.formatCodes[character] = f;
+ }
+
+
+ return f || ("'" + String.escape(character) + "'");
+ },
+
+
+ createFormat : function(format) {
+ var code = [],
+ special = false,
+ ch = '';
+
+ for (var i = 0; i < format.length; ++i) {
+ ch = format.charAt(i);
+ if (!special && ch == "\\") {
+ special = true;
+ } else if (special) {
+ special = false;
+ code.push("'" + String.escape(ch) + "'");
+ } else {
+ code.push(Date.getFormatCode(ch));
+ }
+ }
+ Date.formatFunctions[format] = new Function("return " + code.join('+'));
+ },
+
+
+ createParser : function() {
+ var code = [
+ "var dt, y, m, d, h, i, s, ms, o, z, zz, u, v,",
+ "def = Date.defaults,",
+ "results = String(input).match(Date.parseRegexes[{0}]);",
+
+ "if(results){",
+ "{1}",
+
+ "if(u != null){",
+ "v = new Date(u * 1000);",
+ "}else{",
+
+
+
+ "dt = (new Date()).clearTime();",
+
+
+ "y = Ext.num(y, Ext.num(def.y, dt.getFullYear()));",
+ "m = Ext.num(m, Ext.num(def.m - 1, dt.getMonth()));",
+ "d = Ext.num(d, Ext.num(def.d, dt.getDate()));",
+
+
+ "h = Ext.num(h, Ext.num(def.h, dt.getHours()));",
+ "i = Ext.num(i, Ext.num(def.i, dt.getMinutes()));",
+ "s = Ext.num(s, Ext.num(def.s, dt.getSeconds()));",
+ "ms = Ext.num(ms, Ext.num(def.ms, dt.getMilliseconds()));",
+
+ "if(z >= 0 && y >= 0){",
+
+
+
+
+
+ "v = new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);",
+
+
+ "v = !strict? v : (strict === true && (z <= 364 || (v.isLeapYear() && z <= 365))? v.add(Date.DAY, z) : null);",
+ "}else if(strict === true && !Date.isValid(y, m + 1, d, h, i, s, ms)){",
+ "v = null;",
+ "}else{",
+
+
+ "v = new Date(y < 100 ? 100 : y, m, d, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);",
+ "}",
+ "}",
+ "}",
+
+ "if(v){",
+
+ "if(zz != null){",
+
+ "v = v.add(Date.SECOND, -v.getTimezoneOffset() * 60 - zz);",
+ "}else if(o){",
+
+ "v = v.add(Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));",
+ "}",
+ "}",
+
+ "return v;"
+ ].join('\n');
+
+ return function(format) {
+ var regexNum = Date.parseRegexes.length,
+ currentGroup = 1,
+ calc = [],
+ regex = [],
+ special = false,
+ ch = "",
+ i = 0,
+ obj,
+ last;
+
+ for (; i < format.length; ++i) {
+ ch = format.charAt(i);
+ if (!special && ch == "\\") {
+ special = true;
+ } else if (special) {
+ special = false;
+ regex.push(String.escape(ch));
+ } else {
+ obj = $f(ch, currentGroup);
+ currentGroup += obj.g;
+ regex.push(obj.s);
+ if (obj.g && obj.c) {
+ if (obj.calcLast) {
+ last = obj.c;
+ } else {
+ calc.push(obj.c);
+ }
+ }
+ }
+ }
+
+ if (last) {
+ calc.push(last);
+ }
+
+ Date.parseRegexes[regexNum] = new RegExp("^" + regex.join('') + "$", 'i');
+ Date.parseFunctions[format] = new Function("input", "strict", xf(code, regexNum, calc.join('')));
+ };
+ }(),
+
+
+ parseCodes : {
+
+ d: {
+ g:1,
+ c:"d = parseInt(results[{0}], 10);\n",
+ s:"(\\d{2})"
+ },
+ j: {
+ g:1,
+ c:"d = parseInt(results[{0}], 10);\n",
+ s:"(\\d{1,2})"
+ },
+ D: function() {
+ for (var a = [], i = 0; i < 7; a.push(Date.getShortDayName(i)), ++i);
+ return {
+ g:0,
+ c:null,
+ s:"(?:" + a.join("|") +")"
+ };
+ },
+ l: function() {
+ return {
+ g:0,
+ c:null,
+ s:"(?:" + Date.dayNames.join("|") + ")"
+ };
+ },
+ N: {
+ g:0,
+ c:null,
+ s:"[1-7]"
+ },
+ S: {
+ g:0,
+ c:null,
+ s:"(?:st|nd|rd|th)"
+ },
+ w: {
+ g:0,
+ c:null,
+ s:"[0-6]"
+ },
+ z: {
+ g:1,
+ c:"z = parseInt(results[{0}], 10);\n",
+ s:"(\\d{1,3})"
+ },
+ W: {
+ g:0,
+ c:null,
+ s:"(?:\\d{2})"
+ },
+ F: function() {
+ return {
+ g:1,
+ c:"m = parseInt(Date.getMonthNumber(results[{0}]), 10);\n",
+ s:"(" + Date.monthNames.join("|") + ")"
+ };
+ },
+ M: function() {
+ for (var a = [], i = 0; i < 12; a.push(Date.getShortMonthName(i)), ++i);
+ return Ext.applyIf({
+ s:"(" + a.join("|") + ")"
+ }, $f("F"));
+ },
+ m: {
+ g:1,
+ c:"m = parseInt(results[{0}], 10) - 1;\n",
+ s:"(\\d{2})"
+ },
+ n: {
+ g:1,
+ c:"m = parseInt(results[{0}], 10) - 1;\n",
+ s:"(\\d{1,2})"
+ },
+ t: {
+ g:0,
+ c:null,
+ s:"(?:\\d{2})"
+ },
+ L: {
+ g:0,
+ c:null,
+ s:"(?:1|0)"
+ },
+ o: function() {
+ return $f("Y");
+ },
+ Y: {
+ g:1,
+ c:"y = parseInt(results[{0}], 10);\n",
+ s:"(\\d{4})"
+ },
+ y: {
+ g:1,
+ c:"var ty = parseInt(results[{0}], 10);\n"
+ + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
+ s:"(\\d{1,2})"
+ },
+
+ a: function(){
+ return $f("A");
+ },
+ A: {
+
+ calcLast: true,
+ g:1,
+ c:"if (/(am)/i.test(results[{0}])) {\n"
+ + "if (!h || h == 12) { h = 0; }\n"
+ + "} else { if (!h || h < 12) { h = (h || 0) + 12; }}",
+ s:"(AM|PM|am|pm)"
+ },
+ g: function() {
+ return $f("G");
+ },
+ G: {
+ g:1,
+ c:"h = parseInt(results[{0}], 10);\n",
+ s:"(\\d{1,2})"
+ },
+ h: function() {
+ return $f("H");
+ },
+ H: {
+ g:1,
+ c:"h = parseInt(results[{0}], 10);\n",
+ s:"(\\d{2})"
+ },
+ i: {
+ g:1,
+ c:"i = parseInt(results[{0}], 10);\n",
+ s:"(\\d{2})"
+ },
+ s: {
+ g:1,
+ c:"s = parseInt(results[{0}], 10);\n",
+ s:"(\\d{2})"
+ },
+ u: {
+ g:1,
+ c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",
+ s:"(\\d+)"
+ },
+ O: {
+ g:1,
+ c:[
+ "o = results[{0}];",
+ "var sn = o.substring(0,1),",
+ "hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),",
+ "mn = o.substring(3,5) % 60;",
+ "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"
+ ].join("\n"),
+ s: "([+\-]\\d{4})"
+ },
+ P: {
+ g:1,
+ c:[
+ "o = results[{0}];",
+ "var sn = o.substring(0,1),",
+ "hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),",
+ "mn = o.substring(4,6) % 60;",
+ "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"
+ ].join("\n"),
+ s: "([+\-]\\d{2}:\\d{2})"
+ },
+ T: {
+ g:0,
+ c:null,
+ s:"[A-Z]{1,4}"
+ },
+ Z: {
+ g:1,
+ c:"zz = results[{0}] * 1;\n"
+ + "zz = (-43200 <= zz && zz <= 50400)? zz : null;\n",
+ s:"([+\-]?\\d{1,5})"
+ },
+ c: function() {
+ var calc = [],
+ arr = [
+ $f("Y", 1),
+ $f("m", 2),
+ $f("d", 3),
+ $f("h", 4),
+ $f("i", 5),
+ $f("s", 6),
+ {c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},
+ {c:[
+ "if(results[8]) {",
+ "if(results[8] == 'Z'){",
+ "zz = 0;",
+ "}else if (results[8].indexOf(':') > -1){",
+ $f("P", 8).c,
+ "}else{",
+ $f("O", 8).c,
+ "}",
+ "}"
+ ].join('\n')}
+ ];
+
+ for (var i = 0, l = arr.length; i < l; ++i) {
+ calc.push(arr[i].c);
+ }
+
+ return {
+ g:1,
+ c:calc.join(""),
+ s:[
+ arr[0].s,
+ "(?:", "-", arr[1].s,
+ "(?:", "-", arr[2].s,
+ "(?:",
+ "(?:T| )?",
+ arr[3].s, ":", arr[4].s,
+ "(?::", arr[5].s, ")?",
+ "(?:(?:\\.|,)(\\d+))?",
+ "(Z|(?:[-+]\\d{2}(?::)?\\d{2}))?",
+ ")?",
+ ")?",
+ ")?"
+ ].join("")
+ };
+ },
+ U: {
+ g:1,
+ c:"u = parseInt(results[{0}], 10);\n",
+ s:"(-?\\d+)"
+ }
+ }
+});
+
+}());
+
+Ext.apply(Date.prototype, {
+
+ dateFormat : function(format) {
+ if (Date.formatFunctions[format] == null) {
+ Date.createFormat(format);
+ }
+ return Date.formatFunctions[format].call(this);
+ },
+
+
+ getTimezone : function() {
+
+
+
+
+
+
+
+
+
+
+
+
+ return this.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "");
+ },
+
+
+ getGMTOffset : function(colon) {
+ return (this.getTimezoneOffset() > 0 ? "-" : "+")
+ + String.leftPad(Math.floor(Math.abs(this.getTimezoneOffset()) / 60), 2, "0")
+ + (colon ? ":" : "")
+ + String.leftPad(Math.abs(this.getTimezoneOffset() % 60), 2, "0");
+ },
+
+
+ getDayOfYear: function() {
+ var num = 0,
+ d = this.clone(),
+ m = this.getMonth(),
+ i;
+
+ for (i = 0, d.setDate(1), d.setMonth(0); i < m; d.setMonth(++i)) {
+ num += d.getDaysInMonth();
+ }
+ return num + this.getDate() - 1;
+ },
+
+
+ getWeekOfYear : function() {
+
+ var ms1d = 864e5,
+ ms7d = 7 * ms1d;
+
+ return function() {
+ var DC3 = Date.UTC(this.getFullYear(), this.getMonth(), this.getDate() + 3) / ms1d,
+ AWN = Math.floor(DC3 / 7),
+ Wyr = new Date(AWN * ms7d).getUTCFullYear();
+
+ return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;
+ };
+ }(),
+
+
+ isLeapYear : function() {
+ var year = this.getFullYear();
+ return !!((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
+ },
+
+
+ getFirstDayOfMonth : function() {
+ var day = (this.getDay() - (this.getDate() - 1)) % 7;
+ return (day < 0) ? (day + 7) : day;
+ },
+
+
+ getLastDayOfMonth : function() {
+ return this.getLastDateOfMonth().getDay();
+ },
+
+
+
+ getFirstDateOfMonth : function() {
+ return new Date(this.getFullYear(), this.getMonth(), 1);
+ },
+
+
+ getLastDateOfMonth : function() {
+ return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth());
+ },
+
+
+ getDaysInMonth: function() {
+ var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+
+ return function() {
+ var m = this.getMonth();
+
+ return m == 1 && this.isLeapYear() ? 29 : daysInMonth[m];
+ };
+ }(),
+
+
+ getSuffix : function() {
+ switch (this.getDate()) {
+ case 1:
+ case 21:
+ case 31:
+ return "st";
+ case 2:
+ case 22:
+ return "nd";
+ case 3:
+ case 23:
+ return "rd";
+ default:
+ return "th";
+ }
+ },
+
+
+ clone : function() {
+ return new Date(this.getTime());
+ },
+
+
+ isDST : function() {
+
+
+ return new Date(this.getFullYear(), 0, 1).getTimezoneOffset() != this.getTimezoneOffset();
+ },
+
+
+ clearTime : function(clone) {
+ if (clone) {
+ return this.clone().clearTime();
+ }
+
+
+ var d = this.getDate();
+
+
+ this.setHours(0);
+ this.setMinutes(0);
+ this.setSeconds(0);
+ this.setMilliseconds(0);
+
+ if (this.getDate() != d) {
+
+
+
+
+ for (var hr = 1, c = this.add(Date.HOUR, hr); c.getDate() != d; hr++, c = this.add(Date.HOUR, hr));
+
+ this.setDate(d);
+ this.setHours(c.getHours());
+ }
+
+ return this;
+ },
+
+
+ add : function(interval, value) {
+ var d = this.clone();
+ if (!interval || value === 0) return d;
+
+ switch(interval.toLowerCase()) {
+ case Date.MILLI:
+ d.setMilliseconds(this.getMilliseconds() + value);
+ break;
+ case Date.SECOND:
+ d.setSeconds(this.getSeconds() + value);
+ break;
+ case Date.MINUTE:
+ d.setMinutes(this.getMinutes() + value);
+ break;
+ case Date.HOUR:
+ d.setHours(this.getHours() + value);
+ break;
+ case Date.DAY:
+ d.setDate(this.getDate() + value);
+ break;
+ case Date.MONTH:
+ var day = this.getDate();
+ if (day > 28) {
+ day = Math.min(day, this.getFirstDateOfMonth().add('mo', value).getLastDateOfMonth().getDate());
+ }
+ d.setDate(day);
+ d.setMonth(this.getMonth() + value);
+ break;
+ case Date.YEAR:
+ d.setFullYear(this.getFullYear() + value);
+ break;
+ }
+ return d;
+ },
+
+
+ between : function(start, end) {
+ var t = this.getTime();
+ return start.getTime() <= t && t <= end.getTime();
+ }
+});
+
+
+
+Date.prototype.format = Date.prototype.dateFormat;
+
+
+
+if (Ext.isSafari && (navigator.userAgent.match(/WebKit\/(\d+)/)[1] || NaN) < 420) {
+ Ext.apply(Date.prototype, {
+ _xMonth : Date.prototype.setMonth,
+ _xDate : Date.prototype.setDate,
+
+
+
+ setMonth : function(num) {
+ if (num <= -1) {
+ var n = Math.ceil(-num),
+ back_year = Math.ceil(n / 12),
+ month = (n % 12) ? 12 - n % 12 : 0;
+
+ this.setFullYear(this.getFullYear() - back_year);
+
+ return this._xMonth(month);
+ } else {
+ return this._xMonth(num);
+ }
+ },
+
+
+
+
+ setDate : function(d) {
+
+
+ return this.setTime(this.getTime() - (this.getDate() - d) * 864e5);
+ }
+ });
+}
+
+
+
+
+
+Ext.util.MixedCollection = function(allowFunctions, keyFn){
+ this.items = [];
+ this.map = {};
+ this.keys = [];
+ this.length = 0;
+ this.addEvents(
+
+ 'clear',
+
+ 'add',
+
+ 'replace',
+
+ 'remove',
+ 'sort'
+ );
+ this.allowFunctions = allowFunctions === true;
+ if(keyFn){
+ this.getKey = keyFn;
+ }
+ Ext.util.MixedCollection.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.util.MixedCollection, Ext.util.Observable, {
+
+
+ allowFunctions : false,
+
+
+ add : function(key, o){
+ if(arguments.length == 1){
+ o = arguments[0];
+ key = this.getKey(o);
+ }
+ if(typeof key != 'undefined' && key !== null){
+ var old = this.map[key];
+ if(typeof old != 'undefined'){
+ return this.replace(key, o);
+ }
+ this.map[key] = o;
+ }
+ this.length++;
+ this.items.push(o);
+ this.keys.push(key);
+ this.fireEvent('add', this.length-1, o, key);
+ return o;
+ },
+
+
+ getKey : function(o){
+ return o.id;
+ },
+
+
+ replace : function(key, o){
+ if(arguments.length == 1){
+ o = arguments[0];
+ key = this.getKey(o);
+ }
+ var old = this.map[key];
+ if(typeof key == 'undefined' || key === null || typeof old == 'undefined'){
+ return this.add(key, o);
+ }
+ var index = this.indexOfKey(key);
+ this.items[index] = o;
+ this.map[key] = o;
+ this.fireEvent('replace', key, old, o);
+ return o;
+ },
+
+
+ addAll : function(objs){
+ if(arguments.length > 1 || Ext.isArray(objs)){
+ var args = arguments.length > 1 ? arguments : objs;
+ for(var i = 0, len = args.length; i < len; i++){
+ this.add(args[i]);
+ }
+ }else{
+ for(var key in objs){
+ if(this.allowFunctions || typeof objs[key] != 'function'){
+ this.add(key, objs[key]);
+ }
+ }
+ }
+ },
+
+
+ each : function(fn, scope){
+ var items = [].concat(this.items);
+ for(var i = 0, len = items.length; i < len; i++){
+ if(fn.call(scope || items[i], items[i], i, len) === false){
+ break;
+ }
+ }
+ },
+
+
+ eachKey : function(fn, scope){
+ for(var i = 0, len = this.keys.length; i < len; i++){
+ fn.call(scope || window, this.keys[i], this.items[i], i, len);
+ }
+ },
+
+
+ find : function(fn, scope){
+ for(var i = 0, len = this.items.length; i < len; i++){
+ if(fn.call(scope || window, this.items[i], this.keys[i])){
+ return this.items[i];
+ }
+ }
+ return null;
+ },
+
+
+ insert : function(index, key, o){
+ if(arguments.length == 2){
+ o = arguments[1];
+ key = this.getKey(o);
+ }
+ if(this.containsKey(key)){
+ this.suspendEvents();
+ this.removeKey(key);
+ this.resumeEvents();
+ }
+ if(index >= this.length){
+ return this.add(key, o);
+ }
+ this.length++;
+ this.items.splice(index, 0, o);
+ if(typeof key != 'undefined' && key !== null){
+ this.map[key] = o;
+ }
+ this.keys.splice(index, 0, key);
+ this.fireEvent('add', index, o, key);
+ return o;
+ },
+
+
+ remove : function(o){
+ return this.removeAt(this.indexOf(o));
+ },
+
+
+ removeAt : function(index){
+ if(index < this.length && index >= 0){
+ this.length--;
+ var o = this.items[index];
+ this.items.splice(index, 1);
+ var key = this.keys[index];
+ if(typeof key != 'undefined'){
+ delete this.map[key];
+ }
+ this.keys.splice(index, 1);
+ this.fireEvent('remove', o, key);
+ return o;
+ }
+ return false;
+ },
+
+
+ removeKey : function(key){
+ return this.removeAt(this.indexOfKey(key));
+ },
+
+
+ getCount : function(){
+ return this.length;
+ },
+
+
+ indexOf : function(o){
+ return this.items.indexOf(o);
+ },
+
+
+ indexOfKey : function(key){
+ return this.keys.indexOf(key);
+ },
+
+
+ item : function(key){
+ var mk = this.map[key],
+ item = mk !== undefined ? mk : (typeof key == 'number') ? this.items[key] : undefined;
+ return typeof item != 'function' || this.allowFunctions ? item : null;
+ },
+
+
+ itemAt : function(index){
+ return this.items[index];
+ },
+
+
+ key : function(key){
+ return this.map[key];
+ },
+
+
+ contains : function(o){
+ return this.indexOf(o) != -1;
+ },
+
+
+ containsKey : function(key){
+ return typeof this.map[key] != 'undefined';
+ },
+
+
+ clear : function(){
+ this.length = 0;
+ this.items = [];
+ this.keys = [];
+ this.map = {};
+ this.fireEvent('clear');
+ },
+
+
+ first : function(){
+ return this.items[0];
+ },
+
+
+ last : function(){
+ return this.items[this.length-1];
+ },
+
+
+ _sort : function(property, dir, fn){
+ var i, len,
+ dsc = String(dir).toUpperCase() == 'DESC' ? -1 : 1,
+
+
+ c = [],
+ keys = this.keys,
+ items = this.items;
+
+
+ fn = fn || function(a, b) {
+ return a - b;
+ };
+
+
+ for(i = 0, len = items.length; i < len; i++){
+ c[c.length] = {
+ key : keys[i],
+ value: items[i],
+ index: i
+ };
+ }
+
+
+ c.sort(function(a, b){
+ var v = fn(a[property], b[property]) * dsc;
+ if(v === 0){
+ v = (a.index < b.index ? -1 : 1);
+ }
+ return v;
+ });
+
+
+ for(i = 0, len = c.length; i < len; i++){
+ items[i] = c[i].value;
+ keys[i] = c[i].key;
+ }
+
+ this.fireEvent('sort', this);
+ },
+
+
+ sort : function(dir, fn){
+ this._sort('value', dir, fn);
+ },
+
+
+ reorder: function(mapping) {
+ this.suspendEvents();
+
+ var items = this.items,
+ index = 0,
+ length = items.length,
+ order = [],
+ remaining = [],
+ oldIndex;
+
+
+ for (oldIndex in mapping) {
+ order[mapping[oldIndex]] = items[oldIndex];
+ }
+
+ for (index = 0; index < length; index++) {
+ if (mapping[index] == undefined) {
+ remaining.push(items[index]);
+ }
+ }
+
+ for (index = 0; index < length; index++) {
+ if (order[index] == undefined) {
+ order[index] = remaining.shift();
+ }
+ }
+
+ this.clear();
+ this.addAll(order);
+
+ this.resumeEvents();
+ this.fireEvent('sort', this);
+ },
+
+
+ keySort : function(dir, fn){
+ this._sort('key', dir, fn || function(a, b){
+ var v1 = String(a).toUpperCase(), v2 = String(b).toUpperCase();
+ return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
+ });
+ },
+
+
+ getRange : function(start, end){
+ var items = this.items;
+ if(items.length < 1){
+ return [];
+ }
+ start = start || 0;
+ end = Math.min(typeof end == 'undefined' ? this.length-1 : end, this.length-1);
+ var i, r = [];
+ if(start <= end){
+ for(i = start; i <= end; i++) {
+ r[r.length] = items[i];
+ }
+ }else{
+ for(i = start; i >= end; i--) {
+ r[r.length] = items[i];
+ }
+ }
+ return r;
+ },
+
+
+ filter : function(property, value, anyMatch, caseSensitive){
+ if(Ext.isEmpty(value, false)){
+ return this.clone();
+ }
+ value = this.createValueMatcher(value, anyMatch, caseSensitive);
+ return this.filterBy(function(o){
+ return o && value.test(o[property]);
+ });
+ },
+
+
+ filterBy : function(fn, scope){
+ var r = new Ext.util.MixedCollection();
+ r.getKey = this.getKey;
+ var k = this.keys, it = this.items;
+ for(var i = 0, len = it.length; i < len; i++){
+ if(fn.call(scope||this, it[i], k[i])){
+ r.add(k[i], it[i]);
+ }
+ }
+ return r;
+ },
+
+
+ findIndex : function(property, value, start, anyMatch, caseSensitive){
+ if(Ext.isEmpty(value, false)){
+ return -1;
+ }
+ value = this.createValueMatcher(value, anyMatch, caseSensitive);
+ return this.findIndexBy(function(o){
+ return o && value.test(o[property]);
+ }, null, start);
+ },
+
+
+ findIndexBy : function(fn, scope, start){
+ var k = this.keys, it = this.items;
+ for(var i = (start||0), len = it.length; i < len; i++){
+ if(fn.call(scope||this, it[i], k[i])){
+ return i;
+ }
+ }
+ return -1;
+ },
+
+
+ createValueMatcher : function(value, anyMatch, caseSensitive, exactMatch) {
+ if (!value.exec) {
+ var er = Ext.escapeRe;
+ value = String(value);
+
+ if (anyMatch === true) {
+ value = er(value);
+ } else {
+ value = '^' + er(value);
+ if (exactMatch === true) {
+ value += '$';
+ }
+ }
+ value = new RegExp(value, caseSensitive ? '' : 'i');
+ }
+ return value;
+ },
+
+
+ clone : function(){
+ var r = new Ext.util.MixedCollection();
+ var k = this.keys, it = this.items;
+ for(var i = 0, len = it.length; i < len; i++){
+ r.add(k[i], it[i]);
+ }
+ r.getKey = this.getKey;
+ return r;
+ }
+});
+
+Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item;
+
+Ext.AbstractManager = Ext.extend(Object, {
+ typeName: 'type',
+
+ constructor: function(config) {
+ Ext.apply(this, config || {});
+
+
+ this.all = new Ext.util.MixedCollection();
+
+ this.types = {};
+ },
+
+
+ get : function(id){
+ return this.all.get(id);
+ },
+
+
+ register: function(item) {
+ this.all.add(item);
+ },
+
+
+ unregister: function(item) {
+ this.all.remove(item);
+ },
+
+
+ registerType : function(type, cls){
+ this.types[type] = cls;
+ cls[this.typeName] = type;
+ },
+
+
+ isRegistered : function(type){
+ return this.types[type] !== undefined;
+ },
+
+
+ create: function(config, defaultType) {
+ var type = config[this.typeName] || config.type || defaultType,
+ Constructor = this.types[type];
+
+ if (Constructor == undefined) {
+ throw new Error(String.format("The '{0}' type has not been registered with this manager", type));
+ }
+
+ return new Constructor(config);
+ },
+
+
+ onAvailable : function(id, fn, scope){
+ var all = this.all;
+
+ all.on("add", function(index, o){
+ if (o.id == id) {
+ fn.call(scope || o, o);
+ all.un("add", fn, scope);
+ }
+ });
+ }
+});
+Ext.util.Format = function() {
+ var trimRe = /^\s+|\s+$/g,
+ stripTagsRE = /<\/?[^>]+>/gi,
+ stripScriptsRe = /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,
+ nl2brRe = /\r?\n/g;
+
+ return {
+
+ ellipsis : function(value, len, word) {
+ if (value && value.length > len) {
+ if (word) {
+ var vs = value.substr(0, len - 2),
+ index = Math.max(vs.lastIndexOf(' '), vs.lastIndexOf('.'), vs.lastIndexOf('!'), vs.lastIndexOf('?'));
+ if (index == -1 || index < (len - 15)) {
+ return value.substr(0, len - 3) + "...";
+ } else {
+ return vs.substr(0, index) + "...";
+ }
+ } else {
+ return value.substr(0, len - 3) + "...";
+ }
+ }
+ return value;
+ },
+
+
+ undef : function(value) {
+ return value !== undefined ? value : "";
+ },
+
+
+ defaultValue : function(value, defaultValue) {
+ if (!defaultValue && defaultValue !== 0) {
+ defaultValue = '';
+ }
+ return value !== undefined && value !== '' ? value : defaultValue;
+ },
+
+
+ htmlEncode : function(value) {
+ return !value ? value : String(value).replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
+ },
+
+
+ htmlDecode : function(value) {
+ return !value ? value : String(value).replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, '"').replace(/&amp;/g, "&");
+ },
+
+
+ trim : function(value) {
+ return String(value).replace(trimRe, "");
+ },
+
+
+ substr : function(value, start, length) {
+ return String(value).substr(start, length);
+ },
+
+
+ lowercase : function(value) {
+ return String(value).toLowerCase();
+ },
+
+
+ uppercase : function(value) {
+ return String(value).toUpperCase();
+ },
+
+
+ capitalize : function(value) {
+ return !value ? value : value.charAt(0).toUpperCase() + value.substr(1).toLowerCase();
+ },
+
+
+ call : function(value, fn) {
+ if (arguments.length > 2) {
+ var args = Array.prototype.slice.call(arguments, 2);
+ args.unshift(value);
+ return eval(fn).apply(window, args);
+ } else {
+ return eval(fn).call(window, value);
+ }
+ },
+
+
+ usMoney : function(v) {
+ v = (Math.round((v-0)*100))/100;
+ v = (v == Math.floor(v)) ? v + ".00" : ((v*10 == Math.floor(v*10)) ? v + "0" : v);
+ v = String(v);
+ var ps = v.split('.'),
+ whole = ps[0],
+ sub = ps[1] ? '.'+ ps[1] : '.00',
+ r = /(\d+)(\d{3})/;
+ while (r.test(whole)) {
+ whole = whole.replace(r, '$1' + ',' + '$2');
+ }
+ v = whole + sub;
+ if (v.charAt(0) == '-') {
+ return '-$' + v.substr(1);
+ }
+ return "$" + v;
+ },
+
+
+ date : function(v, format) {
+ if (!v) {
+ return "";
+ }
+ if (!Ext.isDate(v)) {
+ v = new Date(Date.parse(v));
+ }
+ return v.dateFormat(format || "m/d/Y");
+ },
+
+
+ dateRenderer : function(format) {
+ return function(v) {
+ return Ext.util.Format.date(v, format);
+ };
+ },
+
+
+ stripTags : function(v) {
+ return !v ? v : String(v).replace(stripTagsRE, "");
+ },
+
+
+ stripScripts : function(v) {
+ return !v ? v : String(v).replace(stripScriptsRe, "");
+ },
+
+
+ fileSize : function(size) {
+ if (size < 1024) {
+ return size + " bytes";
+ } else if (size < 1048576) {
+ return (Math.round(((size*10) / 1024))/10) + " KB";
+ } else {
+ return (Math.round(((size*10) / 1048576))/10) + " MB";
+ }
+ },
+
+
+ math : function(){
+ var fns = {};
+
+ return function(v, a){
+ if (!fns[a]) {
+ fns[a] = new Function('v', 'return v ' + a + ';');
+ }
+ return fns[a](v);
+ };
+ }(),
+
+
+ round : function(value, precision) {
+ var result = Number(value);
+ if (typeof precision == 'number') {
+ precision = Math.pow(10, precision);
+ result = Math.round(value * precision) / precision;
+ }
+ return result;
+ },
+
+
+ number: function(v, format) {
+ if (!format) {
+ return v;
+ }
+ v = Ext.num(v, NaN);
+ if (isNaN(v)) {
+ return '';
+ }
+ var comma = ',',
+ dec = '.',
+ i18n = false,
+ neg = v < 0;
+
+ v = Math.abs(v);
+ if (format.substr(format.length - 2) == '/i') {
+ format = format.substr(0, format.length - 2);
+ i18n = true;
+ comma = '.';
+ dec = ',';
+ }
+
+ var hasComma = format.indexOf(comma) != -1,
+ psplit = (i18n ? format.replace(/[^\d\,]/g, '') : format.replace(/[^\d\.]/g, '')).split(dec);
+
+ if (1 < psplit.length) {
+ v = v.toFixed(psplit[1].length);
+ } else if(2 < psplit.length) {
+ throw ('NumberFormatException: invalid format, formats should have no more than 1 period: ' + format);
+ } else {
+ v = v.toFixed(0);
+ }
+
+ var fnum = v.toString();
+
+ psplit = fnum.split('.');
+
+ if (hasComma) {
+ var cnum = psplit[0],
+ parr = [],
+ j = cnum.length,
+ m = Math.floor(j / 3),
+ n = cnum.length % 3 || 3,
+ i;
+
+ for (i = 0; i < j; i += n) {
+ if (i != 0) {
+ n = 3;
+ }
+
+ parr[parr.length] = cnum.substr(i, n);
+ m -= 1;
+ }
+ fnum = parr.join(comma);
+ if (psplit[1]) {
+ fnum += dec + psplit[1];
+ }
+ } else {
+ if (psplit[1]) {
+ fnum = psplit[0] + dec + psplit[1];
+ }
+ }
+
+ return (neg ? '-' : '') + format.replace(/[\d,?\.?]+/, fnum);
+ },
+
+
+ numberRenderer : function(format) {
+ return function(v) {
+ return Ext.util.Format.number(v, format);
+ };
+ },
+
+
+ plural : function(v, s, p) {
+ return v +' ' + (v == 1 ? s : (p ? p : s+'s'));
+ },
+
+
+ nl2br : function(v) {
+ return Ext.isEmpty(v) ? '' : v.replace(nl2brRe, '<br/>');
+ }
+ };
+}();
+
+Ext.XTemplate = function(){
+ Ext.XTemplate.superclass.constructor.apply(this, arguments);
+
+ var me = this,
+ s = me.html,
+ re = /<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/,
+ nameRe = /^<tpl\b[^>]*?for="(.*?)"/,
+ ifRe = /^<tpl\b[^>]*?if="(.*?)"/,
+ execRe = /^<tpl\b[^>]*?exec="(.*?)"/,
+ m,
+ id = 0,
+ tpls = [],
+ VALUES = 'values',
+ PARENT = 'parent',
+ XINDEX = 'xindex',
+ XCOUNT = 'xcount',
+ RETURN = 'return ',
+ WITHVALUES = 'with(values){ ';
+
+ s = ['<tpl>', s, '</tpl>'].join('');
+
+ while((m = s.match(re))){
+ var m2 = m[0].match(nameRe),
+ m3 = m[0].match(ifRe),
+ m4 = m[0].match(execRe),
+ exp = null,
+ fn = null,
+ exec = null,
+ name = m2 && m2[1] ? m2[1] : '';
+
+ if (m3) {
+ exp = m3 && m3[1] ? m3[1] : null;
+ if(exp){
+ fn = new Function(VALUES, PARENT, XINDEX, XCOUNT, WITHVALUES + RETURN +(Ext.util.Format.htmlDecode(exp))+'; }');
+ }
+ }
+ if (m4) {
+ exp = m4 && m4[1] ? m4[1] : null;
+ if(exp){
+ exec = new Function(VALUES, PARENT, XINDEX, XCOUNT, WITHVALUES +(Ext.util.Format.htmlDecode(exp))+'; }');
+ }
+ }
+ if(name){
+ switch(name){
+ case '.': name = new Function(VALUES, PARENT, WITHVALUES + RETURN + VALUES + '; }'); break;
+ case '..': name = new Function(VALUES, PARENT, WITHVALUES + RETURN + PARENT + '; }'); break;
+ default: name = new Function(VALUES, PARENT, WITHVALUES + RETURN + name + '; }');
+ }
+ }
+ tpls.push({
+ id: id,
+ target: name,
+ exec: exec,
+ test: fn,
+ body: m[1]||''
+ });
+ s = s.replace(m[0], '{xtpl'+ id + '}');
+ ++id;
+ }
+ for(var i = tpls.length-1; i >= 0; --i){
+ me.compileTpl(tpls[i]);
+ }
+ me.master = tpls[tpls.length-1];
+ me.tpls = tpls;
+};
+Ext.extend(Ext.XTemplate, Ext.Template, {
+
+ re : /\{([\w\-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,
+
+ codeRe : /\{\[((?:\\\]|.|\n)*?)\]\}/g,
+
+
+ applySubTemplate : function(id, values, parent, xindex, xcount){
+ var me = this,
+ len,
+ t = me.tpls[id],
+ vs,
+ buf = [];
+ if ((t.test && !t.test.call(me, values, parent, xindex, xcount)) ||
+ (t.exec && t.exec.call(me, values, parent, xindex, xcount))) {
+ return '';
+ }
+ vs = t.target ? t.target.call(me, values, parent) : values;
+ len = vs.length;
+ parent = t.target ? values : parent;
+ if(t.target && Ext.isArray(vs)){
+ for(var i = 0, len = vs.length; i < len; i++){
+ buf[buf.length] = t.compiled.call(me, vs[i], parent, i+1, len);
+ }
+ return buf.join('');
+ }
+ return t.compiled.call(me, vs, parent, xindex, xcount);
+ },
+
+
+ compileTpl : function(tpl){
+ var fm = Ext.util.Format,
+ useF = this.disableFormats !== true,
+ sep = Ext.isGecko ? "+" : ",",
+ body;
+
+ function fn(m, name, format, args, math){
+ if(name.substr(0, 4) == 'xtpl'){
+ return "'"+ sep +'this.applySubTemplate('+name.substr(4)+', values, parent, xindex, xcount)'+sep+"'";
+ }
+ var v;
+ if(name === '.'){
+ v = 'values';
+ }else if(name === '#'){
+ v = 'xindex';
+ }else if(name.indexOf('.') != -1){
+ v = name;
+ }else{
+ v = "values['" + name + "']";
+ }
+ if(math){
+ v = '(' + v + math + ')';
+ }
+ if (format && useF) {
+ args = args ? ',' + args : "";
+ if(format.substr(0, 5) != "this."){
+ format = "fm." + format + '(';
+ }else{
+ format = 'this.call("'+ format.substr(5) + '", ';
+ args = ", values";
+ }
+ } else {
+ args= ''; format = "("+v+" === undefined ? '' : ";
+ }
+ return "'"+ sep + format + v + args + ")"+sep+"'";
+ }
+
+ function codeFn(m, code){
+
+ return "'" + sep + '(' + code.replace(/\\'/g, "'") + ')' + sep + "'";
+ }
+
+
+ if(Ext.isGecko){
+ body = "tpl.compiled = function(values, parent, xindex, xcount){ return '" +
+ tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn) +
+ "';};";
+ }else{
+ body = ["tpl.compiled = function(values, parent, xindex, xcount){ return ['"];
+ body.push(tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn));
+ body.push("'].join('');};");
+ body = body.join('');
+ }
+ eval(body);
+ return this;
+ },
+
+
+ applyTemplate : function(values){
+ return this.master.compiled.call(this, values, {}, 1, 1);
+ },
+
+
+ compile : function(){return this;}
+
+
+
+
+
+});
+
+Ext.XTemplate.prototype.apply = Ext.XTemplate.prototype.applyTemplate;
+
+
+Ext.XTemplate.from = function(el){
+ el = Ext.getDom(el);
+ return new Ext.XTemplate(el.value || el.innerHTML);
+};
+
+Ext.util.CSS = function(){
+ var rules = null;
+ var doc = document;
+
+ var camelRe = /(-[a-z])/gi;
+ var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };
+
+ return {
+
+ createStyleSheet : function(cssText, id){
+ var ss;
+ var head = doc.getElementsByTagName("head")[0];
+ var rules = doc.createElement("style");
+ rules.setAttribute("type", "text/css");
+ if(id){
+ rules.setAttribute("id", id);
+ }
+ if(Ext.isIE){
+ head.appendChild(rules);
+ ss = rules.styleSheet;
+ ss.cssText = cssText;
+ }else{
+ try{
+ rules.appendChild(doc.createTextNode(cssText));
+ }catch(e){
+ rules.cssText = cssText;
+ }
+ head.appendChild(rules);
+ ss = rules.styleSheet ? rules.styleSheet : (rules.sheet || doc.styleSheets[doc.styleSheets.length-1]);
+ }
+ this.cacheStyleSheet(ss);
+ return ss;
+ },
+
+
+ removeStyleSheet : function(id){
+ var existing = doc.getElementById(id);
+ if(existing){
+ existing.parentNode.removeChild(existing);
+ }
+ },
+
+
+ swapStyleSheet : function(id, url){
+ this.removeStyleSheet(id);
+ var ss = doc.createElement("link");
+ ss.setAttribute("rel", "stylesheet");
+ ss.setAttribute("type", "text/css");
+ ss.setAttribute("id", id);
+ ss.setAttribute("href", url);
+ doc.getElementsByTagName("head")[0].appendChild(ss);
+ },
+
+
+ refreshCache : function(){
+ return this.getRules(true);
+ },
+
+
+ cacheStyleSheet : function(ss){
+ if(!rules){
+ rules = {};
+ }
+ try{
+ var ssRules = ss.cssRules || ss.rules;
+ for(var j = ssRules.length-1; j >= 0; --j){
+ rules[ssRules[j].selectorText.toLowerCase()] = ssRules[j];
+ }
+ }catch(e){}
+ },
+
+
+ getRules : function(refreshCache){
+ if(rules === null || refreshCache){
+ rules = {};
+ var ds = doc.styleSheets;
+ for(var i =0, len = ds.length; i < len; i++){
+ try{
+ this.cacheStyleSheet(ds[i]);
+ }catch(e){}
+ }
+ }
+ return rules;
+ },
+
+
+ getRule : function(selector, refreshCache){
+ var rs = this.getRules(refreshCache);
+ if(!Ext.isArray(selector)){
+ return rs[selector.toLowerCase()];
+ }
+ for(var i = 0; i < selector.length; i++){
+ if(rs[selector[i]]){
+ return rs[selector[i].toLowerCase()];
+ }
+ }
+ return null;
+ },
+
+
+
+ updateRule : function(selector, property, value){
+ if(!Ext.isArray(selector)){
+ var rule = this.getRule(selector);
+ if(rule){
+ rule.style[property.replace(camelRe, camelFn)] = value;
+ return true;
+ }
+ }else{
+ for(var i = 0; i < selector.length; i++){
+ if(this.updateRule(selector[i], property, value)){
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ };
+}();
+Ext.util.ClickRepeater = Ext.extend(Ext.util.Observable, {
+
+ constructor : function(el, config){
+ this.el = Ext.get(el);
+ this.el.unselectable();
+
+ Ext.apply(this, config);
+
+ this.addEvents(
+
+ "mousedown",
+
+ "click",
+
+ "mouseup"
+ );
+
+ if(!this.disabled){
+ this.disabled = true;
+ this.enable();
+ }
+
+
+ if(this.handler){
+ this.on("click", this.handler, this.scope || this);
+ }
+
+ Ext.util.ClickRepeater.superclass.constructor.call(this);
+ },
+
+ interval : 20,
+ delay: 250,
+ preventDefault : true,
+ stopDefault : false,
+ timer : 0,
+
+
+ enable: function(){
+ if(this.disabled){
+ this.el.on('mousedown', this.handleMouseDown, this);
+ if (Ext.isIE){
+ this.el.on('dblclick', this.handleDblClick, this);
+ }
+ if(this.preventDefault || this.stopDefault){
+ this.el.on('click', this.eventOptions, this);
+ }
+ }
+ this.disabled = false;
+ },
+
+
+ disable: function( force){
+ if(force || !this.disabled){
+ clearTimeout(this.timer);
+ if(this.pressClass){
+ this.el.removeClass(this.pressClass);
+ }
+ Ext.getDoc().un('mouseup', this.handleMouseUp, this);
+ this.el.removeAllListeners();
+ }
+ this.disabled = true;
+ },
+
+
+ setDisabled: function(disabled){
+ this[disabled ? 'disable' : 'enable']();
+ },
+
+ eventOptions: function(e){
+ if(this.preventDefault){
+ e.preventDefault();
+ }
+ if(this.stopDefault){
+ e.stopEvent();
+ }
+ },
+
+
+ destroy : function() {
+ this.disable(true);
+ Ext.destroy(this.el);
+ this.purgeListeners();
+ },
+
+ handleDblClick : function(e){
+ clearTimeout(this.timer);
+ this.el.blur();
+
+ this.fireEvent("mousedown", this, e);
+ this.fireEvent("click", this, e);
+ },
+
+
+ handleMouseDown : function(e){
+ clearTimeout(this.timer);
+ this.el.blur();
+ if(this.pressClass){
+ this.el.addClass(this.pressClass);
+ }
+ this.mousedownTime = new Date();
+
+ Ext.getDoc().on("mouseup", this.handleMouseUp, this);
+ this.el.on("mouseout", this.handleMouseOut, this);
+
+ this.fireEvent("mousedown", this, e);
+ this.fireEvent("click", this, e);
+
+
+ if (this.accelerate) {
+ this.delay = 400;
+ }
+ this.timer = this.click.defer(this.delay || this.interval, this, [e]);
+ },
+
+
+ click : function(e){
+ this.fireEvent("click", this, e);
+ this.timer = this.click.defer(this.accelerate ?
+ this.easeOutExpo(this.mousedownTime.getElapsed(),
+ 400,
+ -390,
+ 12000) :
+ this.interval, this, [e]);
+ },
+
+ easeOutExpo : function (t, b, c, d) {
+ return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+ },
+
+
+ handleMouseOut : function(){
+ clearTimeout(this.timer);
+ if(this.pressClass){
+ this.el.removeClass(this.pressClass);
+ }
+ this.el.on("mouseover", this.handleMouseReturn, this);
+ },
+
+
+ handleMouseReturn : function(){
+ this.el.un("mouseover", this.handleMouseReturn, this);
+ if(this.pressClass){
+ this.el.addClass(this.pressClass);
+ }
+ this.click();
+ },
+
+
+ handleMouseUp : function(e){
+ clearTimeout(this.timer);
+ this.el.un("mouseover", this.handleMouseReturn, this);
+ this.el.un("mouseout", this.handleMouseOut, this);
+ Ext.getDoc().un("mouseup", this.handleMouseUp, this);
+ this.el.removeClass(this.pressClass);
+ this.fireEvent("mouseup", this, e);
+ }
+});
+Ext.KeyNav = function(el, config){
+ this.el = Ext.get(el);
+ Ext.apply(this, config);
+ if(!this.disabled){
+ this.disabled = true;
+ this.enable();
+ }
+};
+
+Ext.KeyNav.prototype = {
+
+ disabled : false,
+
+ defaultEventAction: "stopEvent",
+
+ forceKeyDown : false,
+
+
+ relay : function(e){
+ var k = e.getKey(),
+ h = this.keyToHandler[k];
+ if(h && this[h]){
+ if(this.doRelay(e, this[h], h) !== true){
+ e[this.defaultEventAction]();
+ }
+ }
+ },
+
+
+ doRelay : function(e, h, hname){
+ return h.call(this.scope || this, e, hname);
+ },
+
+
+ enter : false,
+ left : false,
+ right : false,
+ up : false,
+ down : false,
+ tab : false,
+ esc : false,
+ pageUp : false,
+ pageDown : false,
+ del : false,
+ home : false,
+ end : false,
+ space : false,
+
+
+ keyToHandler : {
+ 37 : "left",
+ 39 : "right",
+ 38 : "up",
+ 40 : "down",
+ 33 : "pageUp",
+ 34 : "pageDown",
+ 46 : "del",
+ 36 : "home",
+ 35 : "end",
+ 13 : "enter",
+ 27 : "esc",
+ 9 : "tab",
+ 32 : "space"
+ },
+
+ stopKeyUp: function(e) {
+ var k = e.getKey();
+
+ if (k >= 37 && k <= 40) {
+
+
+ e.stopEvent();
+ }
+ },
+
+
+ destroy: function(){
+ this.disable();
+ },
+
+
+ enable: function() {
+ if (this.disabled) {
+ if (Ext.isSafari2) {
+
+ this.el.on('keyup', this.stopKeyUp, this);
+ }
+
+ this.el.on(this.isKeydown()? 'keydown' : 'keypress', this.relay, this);
+ this.disabled = false;
+ }
+ },
+
+
+ disable: function() {
+ if (!this.disabled) {
+ if (Ext.isSafari2) {
+
+ this.el.un('keyup', this.stopKeyUp, this);
+ }
+
+ this.el.un(this.isKeydown()? 'keydown' : 'keypress', this.relay, this);
+ this.disabled = true;
+ }
+ },
+
+
+ setDisabled : function(disabled){
+ this[disabled ? "disable" : "enable"]();
+ },
+
+
+ isKeydown: function(){
+ return this.forceKeyDown || Ext.EventManager.useKeydown;
+ }
+};
+
+Ext.KeyMap = function(el, config, eventName){
+ this.el = Ext.get(el);
+ this.eventName = eventName || "keydown";
+ this.bindings = [];
+ if(config){
+ this.addBinding(config);
+ }
+ this.enable();
+};
+
+Ext.KeyMap.prototype = {
+
+ stopEvent : false,
+
+
+ addBinding : function(config){
+ if(Ext.isArray(config)){
+ Ext.each(config, function(c){
+ this.addBinding(c);
+ }, this);
+ return;
+ }
+ var keyCode = config.key,
+ fn = config.fn || config.handler,
+ scope = config.scope;
+
+ if (config.stopEvent) {
+ this.stopEvent = config.stopEvent;
+ }
+
+ if(typeof keyCode == "string"){
+ var ks = [];
+ var keyString = keyCode.toUpperCase();
+ for(var j = 0, len = keyString.length; j < len; j++){
+ ks.push(keyString.charCodeAt(j));
+ }
+ keyCode = ks;
+ }
+ var keyArray = Ext.isArray(keyCode);
+
+ var handler = function(e){
+ if(this.checkModifiers(config, e)){
+ var k = e.getKey();
+ if(keyArray){
+ for(var i = 0, len = keyCode.length; i < len; i++){
+ if(keyCode[i] == k){
+ if(this.stopEvent){
+ e.stopEvent();
+ }
+ fn.call(scope || window, k, e);
+ return;
+ }
+ }
+ }else{
+ if(k == keyCode){
+ if(this.stopEvent){
+ e.stopEvent();
+ }
+ fn.call(scope || window, k, e);
+ }
+ }
+ }
+ };
+ this.bindings.push(handler);
+ },
+
+
+ checkModifiers: function(config, e){
+ var val, key, keys = ['shift', 'ctrl', 'alt'];
+ for (var i = 0, len = keys.length; i < len; ++i){
+ key = keys[i];
+ val = config[key];
+ if(!(val === undefined || (val === e[key + 'Key']))){
+ return false;
+ }
+ }
+ return true;
+ },
+
+
+ on : function(key, fn, scope){
+ var keyCode, shift, ctrl, alt;
+ if(typeof key == "object" && !Ext.isArray(key)){
+ keyCode = key.key;
+ shift = key.shift;
+ ctrl = key.ctrl;
+ alt = key.alt;
+ }else{
+ keyCode = key;
+ }
+ this.addBinding({
+ key: keyCode,
+ shift: shift,
+ ctrl: ctrl,
+ alt: alt,
+ fn: fn,
+ scope: scope
+ });
+ },
+
+
+ handleKeyDown : function(e){
+ if(this.enabled){
+ var b = this.bindings;
+ for(var i = 0, len = b.length; i < len; i++){
+ b[i].call(this, e);
+ }
+ }
+ },
+
+
+ isEnabled : function(){
+ return this.enabled;
+ },
+
+
+ enable: function(){
+ if(!this.enabled){
+ this.el.on(this.eventName, this.handleKeyDown, this);
+ this.enabled = true;
+ }
+ },
+
+
+ disable: function(){
+ if(this.enabled){
+ this.el.removeListener(this.eventName, this.handleKeyDown, this);
+ this.enabled = false;
+ }
+ },
+
+
+ setDisabled : function(disabled){
+ this[disabled ? "disable" : "enable"]();
+ }
+};
+Ext.util.TextMetrics = function(){
+ var shared;
+ return {
+
+ measure : function(el, text, fixedWidth){
+ if(!shared){
+ shared = Ext.util.TextMetrics.Instance(el, fixedWidth);
+ }
+ shared.bind(el);
+ shared.setFixedWidth(fixedWidth || 'auto');
+ return shared.getSize(text);
+ },
+
+
+ createInstance : function(el, fixedWidth){
+ return Ext.util.TextMetrics.Instance(el, fixedWidth);
+ }
+ };
+}();
+
+Ext.util.TextMetrics.Instance = function(bindTo, fixedWidth){
+ var ml = new Ext.Element(document.createElement('div'));
+ document.body.appendChild(ml.dom);
+ ml.position('absolute');
+ ml.setLeftTop(-1000, -1000);
+ ml.hide();
+
+ if(fixedWidth){
+ ml.setWidth(fixedWidth);
+ }
+
+ var instance = {
+
+ getSize : function(text){
+ ml.update(text);
+ var s = ml.getSize();
+ ml.update('');
+ return s;
+ },
+
+
+ bind : function(el){
+ ml.setStyle(
+ Ext.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing')
+ );
+ },
+
+
+ setFixedWidth : function(width){
+ ml.setWidth(width);
+ },
+
+
+ getWidth : function(text){
+ ml.dom.style.width = 'auto';
+ return this.getSize(text).width;
+ },
+
+
+ getHeight : function(text){
+ return this.getSize(text).height;
+ }
+ };
+
+ instance.bind(bindTo);
+
+ return instance;
+};
+
+Ext.Element.addMethods({
+
+ getTextWidth : function(text, min, max){
+ return (Ext.util.TextMetrics.measure(this.dom, Ext.value(text, this.dom.innerHTML, true)).width).constrain(min || 0, max || 1000000);
+ }
+});
+
+Ext.util.Cookies = {
+
+ set : function(name, value){
+ var argv = arguments;
+ var argc = arguments.length;
+ var expires = (argc > 2) ? argv[2] : null;
+ var path = (argc > 3) ? argv[3] : '/';
+ var domain = (argc > 4) ? argv[4] : null;
+ var secure = (argc > 5) ? argv[5] : false;
+ document.cookie = name + "=" + escape(value) + ((expires === null) ? "" : ("; expires=" + expires.toGMTString())) + ((path === null) ? "" : ("; path=" + path)) + ((domain === null) ? "" : ("; domain=" + domain)) + ((secure === true) ? "; secure" : "");
+ },
+
+
+ get : function(name){
+ var arg = name + "=";
+ var alen = arg.length;
+ var clen = document.cookie.length;
+ var i = 0;
+ var j = 0;
+ while(i < clen){
+ j = i + alen;
+ if(document.cookie.substring(i, j) == arg){
+ return Ext.util.Cookies.getCookieVal(j);
+ }
+ i = document.cookie.indexOf(" ", i) + 1;
+ if(i === 0){
+ break;
+ }
+ }
+ return null;
+ },
+
+
+ clear : function(name){
+ if(Ext.util.Cookies.get(name)){
+ document.cookie = name + "=" + "; expires=Thu, 01-Jan-70 00:00:01 GMT";
+ }
+ },
+
+ getCookieVal : function(offset){
+ var endstr = document.cookie.indexOf(";", offset);
+ if(endstr == -1){
+ endstr = document.cookie.length;
+ }
+ return unescape(document.cookie.substring(offset, endstr));
+ }
+};
+Ext.handleError = function(e) {
+ throw e;
+};
+
+
+Ext.Error = function(message) {
+
+ this.message = (this.lang[message]) ? this.lang[message] : message;
+};
+
+Ext.Error.prototype = new Error();
+Ext.apply(Ext.Error.prototype, {
+
+ lang: {},
+
+ name: 'Ext.Error',
+
+ getName : function() {
+ return this.name;
+ },
+
+ getMessage : function() {
+ return this.message;
+ },
+
+ toJson : function() {
+ return Ext.encode(this);
+ }
+});
+
+Ext.ComponentMgr = function(){
+ var all = new Ext.util.MixedCollection();
+ var types = {};
+ var ptypes = {};
+
+ return {
+
+ register : function(c){
+ all.add(c);
+ },
+
+
+ unregister : function(c){
+ all.remove(c);
+ },
+
+
+ get : function(id){
+ return all.get(id);
+ },
+
+
+ onAvailable : function(id, fn, scope){
+ all.on("add", function(index, o){
+ if(o.id == id){
+ fn.call(scope || o, o);
+ all.un("add", fn, scope);
+ }
+ });
+ },
+
+
+ all : all,
+
+
+ types : types,
+
+
+ ptypes: ptypes,
+
+
+ isRegistered : function(xtype){
+ return types[xtype] !== undefined;
+ },
+
+
+ isPluginRegistered : function(ptype){
+ return ptypes[ptype] !== undefined;
+ },
+
+
+ registerType : function(xtype, cls){
+ types[xtype] = cls;
+ cls.xtype = xtype;
+ },
+
+
+ create : function(config, defaultType){
+ return config.render ? config : new types[config.xtype || defaultType](config);
+ },
+
+
+ registerPlugin : function(ptype, cls){
+ ptypes[ptype] = cls;
+ cls.ptype = ptype;
+ },
+
+
+ createPlugin : function(config, defaultType){
+ var PluginCls = ptypes[config.ptype || defaultType];
+ if (PluginCls.init) {
+ return PluginCls;
+ } else {
+ return new PluginCls(config);
+ }
+ }
+ };
+}();
+
+
+Ext.reg = Ext.ComponentMgr.registerType;
+
+Ext.preg = Ext.ComponentMgr.registerPlugin;
+
+Ext.create = Ext.ComponentMgr.create;
+Ext.Component = function(config){
+ config = config || {};
+ if(config.initialConfig){
+ if(config.isAction){
+ this.baseAction = config;
+ }
+ config = config.initialConfig;
+ }else if(config.tagName || config.dom || Ext.isString(config)){
+ config = {applyTo: config, id: config.id || config};
+ }
+
+
+ this.initialConfig = config;
+
+ Ext.apply(this, config);
+ this.addEvents(
+
+ 'added',
+
+ 'disable',
+
+ 'enable',
+
+ 'beforeshow',
+
+ 'show',
+
+ 'beforehide',
+
+ 'hide',
+
+ 'removed',
+
+ 'beforerender',
+
+ 'render',
+
+ 'afterrender',
+
+ 'beforedestroy',
+
+ 'destroy',
+
+ 'beforestaterestore',
+
+ 'staterestore',
+
+ 'beforestatesave',
+
+ 'statesave'
+ );
+ this.getId();
+ Ext.ComponentMgr.register(this);
+ Ext.Component.superclass.constructor.call(this);
+
+ if(this.baseAction){
+ this.baseAction.addComponent(this);
+ }
+
+ this.initComponent();
+
+ if(this.plugins){
+ if(Ext.isArray(this.plugins)){
+ for(var i = 0, len = this.plugins.length; i < len; i++){
+ this.plugins[i] = this.initPlugin(this.plugins[i]);
+ }
+ }else{
+ this.plugins = this.initPlugin(this.plugins);
+ }
+ }
+
+ if(this.stateful !== false){
+ this.initState();
+ }
+
+ if(this.applyTo){
+ this.applyToMarkup(this.applyTo);
+ delete this.applyTo;
+ }else if(this.renderTo){
+ this.render(this.renderTo);
+ delete this.renderTo;
+ }
+};
+
+
+Ext.Component.AUTO_ID = 1000;
+
+Ext.extend(Ext.Component, Ext.util.Observable, {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ disabled : false,
+
+ hidden : false,
+
+
+
+
+
+
+
+ autoEl : 'div',
+
+
+ disabledClass : 'x-item-disabled',
+
+ allowDomMove : true,
+
+ autoShow : false,
+
+ hideMode : 'display',
+
+ hideParent : false,
+
+
+
+
+
+ rendered : false,
+
+
+
+
+
+
+
+ tplWriteMode : 'overwrite',
+
+
+
+
+ bubbleEvents: [],
+
+
+
+ ctype : 'Ext.Component',
+
+
+ actionMode : 'el',
+
+
+ getActionEl : function(){
+ return this[this.actionMode];
+ },
+
+ initPlugin : function(p){
+ if(p.ptype && !Ext.isFunction(p.init)){
+ p = Ext.ComponentMgr.createPlugin(p);
+ }else if(Ext.isString(p)){
+ p = Ext.ComponentMgr.createPlugin({
+ ptype: p
+ });
+ }
+ p.init(this);
+ return p;
+ },
+
+
+ initComponent : function(){
+
+ if(this.listeners){
+ this.on(this.listeners);
+ delete this.listeners;
+ }
+ this.enableBubble(this.bubbleEvents);
+ },
+
+
+ render : function(container, position){
+ if(!this.rendered && this.fireEvent('beforerender', this) !== false){
+ if(!container && this.el){
+ this.el = Ext.get(this.el);
+ container = this.el.dom.parentNode;
+ this.allowDomMove = false;
+ }
+ this.container = Ext.get(container);
+ if(this.ctCls){
+ this.container.addClass(this.ctCls);
+ }
+ this.rendered = true;
+ if(position !== undefined){
+ if(Ext.isNumber(position)){
+ position = this.container.dom.childNodes[position];
+ }else{
+ position = Ext.getDom(position);
+ }
+ }
+ this.onRender(this.container, position || null);
+ if(this.autoShow){
+ this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]);
+ }
+ if(this.cls){
+ this.el.addClass(this.cls);
+ delete this.cls;
+ }
+ if(this.style){
+ this.el.applyStyles(this.style);
+ delete this.style;
+ }
+ if(this.overCls){
+ this.el.addClassOnOver(this.overCls);
+ }
+ this.fireEvent('render', this);
+
+
+
+
+ var contentTarget = this.getContentTarget();
+ if (this.html){
+ contentTarget.update(Ext.DomHelper.markup(this.html));
+ delete this.html;
+ }
+ if (this.contentEl){
+ var ce = Ext.getDom(this.contentEl);
+ Ext.fly(ce).removeClass(['x-hidden', 'x-hide-display']);
+ contentTarget.appendChild(ce);
+ }
+ if (this.tpl) {
+ if (!this.tpl.compile) {
+ this.tpl = new Ext.XTemplate(this.tpl);
+ }
+ if (this.data) {
+ this.tpl[this.tplWriteMode](contentTarget, this.data);
+ delete this.data;
+ }
+ }
+ this.afterRender(this.container);
+
+
+ if(this.hidden){
+
+ this.doHide();
+ }
+ if(this.disabled){
+
+ this.disable(true);
+ }
+
+ if(this.stateful !== false){
+ this.initStateEvents();
+ }
+ this.fireEvent('afterrender', this);
+ }
+ return this;
+ },
+
+
+
+ update: function(htmlOrData, loadScripts, cb) {
+ var contentTarget = this.getContentTarget();
+ if (this.tpl && typeof htmlOrData !== "string") {
+ this.tpl[this.tplWriteMode](contentTarget, htmlOrData || {});
+ } else {
+ var html = Ext.isObject(htmlOrData) ? Ext.DomHelper.markup(htmlOrData) : htmlOrData;
+ contentTarget.update(html, loadScripts, cb);
+ }
+ },
+
+
+
+ onAdded : function(container, pos) {
+ this.ownerCt = container;
+ this.initRef();
+ this.fireEvent('added', this, container, pos);
+ },
+
+
+ onRemoved : function() {
+ this.removeRef();
+ this.fireEvent('removed', this, this.ownerCt);
+ delete this.ownerCt;
+ },
+
+
+ initRef : function() {
+
+ if(this.ref && !this.refOwner){
+ var levels = this.ref.split('/'),
+ last = levels.length,
+ i = 0,
+ t = this;
+
+ while(t && i < last){
+ t = t.ownerCt;
+ ++i;
+ }
+ if(t){
+ t[this.refName = levels[--i]] = this;
+
+ this.refOwner = t;
+ }
+ }
+ },
+
+ removeRef : function() {
+ if (this.refOwner && this.refName) {
+ delete this.refOwner[this.refName];
+ delete this.refOwner;
+ }
+ },
+
+
+ initState : function(){
+ if(Ext.state.Manager){
+ var id = this.getStateId();
+ if(id){
+ var state = Ext.state.Manager.get(id);
+ if(state){
+ if(this.fireEvent('beforestaterestore', this, state) !== false){
+ this.applyState(Ext.apply({}, state));
+ this.fireEvent('staterestore', this, state);
+ }
+ }
+ }
+ }
+ },
+
+
+ getStateId : function(){
+ return this.stateId || ((/^(ext-comp-|ext-gen)/).test(String(this.id)) ? null : this.id);
+ },
+
+
+ initStateEvents : function(){
+ if(this.stateEvents){
+ for(var i = 0, e; e = this.stateEvents[i]; i++){
+ this.on(e, this.saveState, this, {delay:100});
+ }
+ }
+ },
+
+
+ applyState : function(state){
+ if(state){
+ Ext.apply(this, state);
+ }
+ },
+
+
+ getState : function(){
+ return null;
+ },
+
+
+ saveState : function(){
+ if(Ext.state.Manager && this.stateful !== false){
+ var id = this.getStateId();
+ if(id){
+ var state = this.getState();
+ if(this.fireEvent('beforestatesave', this, state) !== false){
+ Ext.state.Manager.set(id, state);
+ this.fireEvent('statesave', this, state);
+ }
+ }
+ }
+ },
+
+
+ applyToMarkup : function(el){
+ this.allowDomMove = false;
+ this.el = Ext.get(el);
+ this.render(this.el.dom.parentNode);
+ },
+
+
+ addClass : function(cls){
+ if(this.el){
+ this.el.addClass(cls);
+ }else{
+ this.cls = this.cls ? this.cls + ' ' + cls : cls;
+ }
+ return this;
+ },
+
+
+ removeClass : function(cls){
+ if(this.el){
+ this.el.removeClass(cls);
+ }else if(this.cls){
+ this.cls = this.cls.split(' ').remove(cls).join(' ');
+ }
+ return this;
+ },
+
+
+
+ onRender : function(ct, position){
+ if(!this.el && this.autoEl){
+ if(Ext.isString(this.autoEl)){
+ this.el = document.createElement(this.autoEl);
+ }else{
+ var div = document.createElement('div');
+ Ext.DomHelper.overwrite(div, this.autoEl);
+ this.el = div.firstChild;
+ }
+ if (!this.el.id) {
+ this.el.id = this.getId();
+ }
+ }
+ if(this.el){
+ this.el = Ext.get(this.el);
+ if(this.allowDomMove !== false){
+ ct.dom.insertBefore(this.el.dom, position);
+ if (div) {
+ Ext.removeNode(div);
+ div = null;
+ }
+ }
+ }
+ },
+
+
+ getAutoCreate : function(){
+ var cfg = Ext.isObject(this.autoCreate) ?
+ this.autoCreate : Ext.apply({}, this.defaultAutoCreate);
+ if(this.id && !cfg.id){
+ cfg.id = this.id;
+ }
+ return cfg;
+ },
+
+
+ afterRender : Ext.emptyFn,
+
+
+ destroy : function(){
+ if(!this.isDestroyed){
+ if(this.fireEvent('beforedestroy', this) !== false){
+ this.destroying = true;
+ this.beforeDestroy();
+ if(this.ownerCt && this.ownerCt.remove){
+ this.ownerCt.remove(this, false);
+ }
+ if(this.rendered){
+ this.el.remove();
+ if(this.actionMode == 'container' || this.removeMode == 'container'){
+ this.container.remove();
+ }
+ }
+
+ if(this.focusTask && this.focusTask.cancel){
+ this.focusTask.cancel();
+ }
+ this.onDestroy();
+ Ext.ComponentMgr.unregister(this);
+ this.fireEvent('destroy', this);
+ this.purgeListeners();
+ this.destroying = false;
+ this.isDestroyed = true;
+ }
+ }
+ },
+
+ deleteMembers : function(){
+ var args = arguments;
+ for(var i = 0, len = args.length; i < len; ++i){
+ delete this[args[i]];
+ }
+ },
+
+
+ beforeDestroy : Ext.emptyFn,
+
+
+ onDestroy : Ext.emptyFn,
+
+
+ getEl : function(){
+ return this.el;
+ },
+
+
+ getContentTarget : function(){
+ return this.el;
+ },
+
+
+ getId : function(){
+ return this.id || (this.id = 'ext-comp-' + (++Ext.Component.AUTO_ID));
+ },
+
+
+ getItemId : function(){
+ return this.itemId || this.getId();
+ },
+
+
+ focus : function(selectText, delay){
+ if(delay){
+ this.focusTask = new Ext.util.DelayedTask(this.focus, this, [selectText, false]);
+ this.focusTask.delay(Ext.isNumber(delay) ? delay : 10);
+ return this;
+ }
+ if(this.rendered && !this.isDestroyed){
+ this.el.focus();
+ if(selectText === true){
+ this.el.dom.select();
+ }
+ }
+ return this;
+ },
+
+
+ blur : function(){
+ if(this.rendered){
+ this.el.blur();
+ }
+ return this;
+ },
+
+
+ disable : function( silent){
+ if(this.rendered){
+ this.onDisable();
+ }
+ this.disabled = true;
+ if(silent !== true){
+ this.fireEvent('disable', this);
+ }
+ return this;
+ },
+
+
+ onDisable : function(){
+ this.getActionEl().addClass(this.disabledClass);
+ this.el.dom.disabled = true;
+ },
+
+
+ enable : function(){
+ if(this.rendered){
+ this.onEnable();
+ }
+ this.disabled = false;
+ this.fireEvent('enable', this);
+ return this;
+ },
+
+
+ onEnable : function(){
+ this.getActionEl().removeClass(this.disabledClass);
+ this.el.dom.disabled = false;
+ },
+
+
+ setDisabled : function(disabled){
+ return this[disabled ? 'disable' : 'enable']();
+ },
+
+
+ show : function(){
+ if(this.fireEvent('beforeshow', this) !== false){
+ this.hidden = false;
+ if(this.autoRender){
+ this.render(Ext.isBoolean(this.autoRender) ? Ext.getBody() : this.autoRender);
+ }
+ if(this.rendered){
+ this.onShow();
+ }
+ this.fireEvent('show', this);
+ }
+ return this;
+ },
+
+
+ onShow : function(){
+ this.getVisibilityEl().removeClass('x-hide-' + this.hideMode);
+ },
+
+
+ hide : function(){
+ if(this.fireEvent('beforehide', this) !== false){
+ this.doHide();
+ this.fireEvent('hide', this);
+ }
+ return this;
+ },
+
+
+ doHide: function(){
+ this.hidden = true;
+ if(this.rendered){
+ this.onHide();
+ }
+ },
+
+
+ onHide : function(){
+ this.getVisibilityEl().addClass('x-hide-' + this.hideMode);
+ },
+
+
+ getVisibilityEl : function(){
+ return this.hideParent ? this.container : this.getActionEl();
+ },
+
+
+ setVisible : function(visible){
+ return this[visible ? 'show' : 'hide']();
+ },
+
+
+ isVisible : function(){
+ return this.rendered && this.getVisibilityEl().isVisible();
+ },
+
+
+ cloneConfig : function(overrides){
+ overrides = overrides || {};
+ var id = overrides.id || Ext.id();
+ var cfg = Ext.applyIf(overrides, this.initialConfig);
+ cfg.id = id;
+ return new this.constructor(cfg);
+ },
+
+
+ getXType : function(){
+ return this.constructor.xtype;
+ },
+
+
+ isXType : function(xtype, shallow){
+
+ if (Ext.isFunction(xtype)){
+ xtype = xtype.xtype;
+ }else if (Ext.isObject(xtype)){
+ xtype = xtype.constructor.xtype;
+ }
+
+ return !shallow ? ('/' + this.getXTypes() + '/').indexOf('/' + xtype + '/') != -1 : this.constructor.xtype == xtype;
+ },
+
+
+ getXTypes : function(){
+ var tc = this.constructor;
+ if(!tc.xtypes){
+ var c = [], sc = this;
+ while(sc && sc.constructor.xtype){
+ c.unshift(sc.constructor.xtype);
+ sc = sc.constructor.superclass;
+ }
+ tc.xtypeChain = c;
+ tc.xtypes = c.join('/');
+ }
+ return tc.xtypes;
+ },
+
+
+ findParentBy : function(fn) {
+ for (var p = this.ownerCt; (p != null) && !fn(p, this); p = p.ownerCt);
+ return p || null;
+ },
+
+
+ findParentByType : function(xtype, shallow){
+ return this.findParentBy(function(c){
+ return c.isXType(xtype, shallow);
+ });
+ },
+
+
+ bubble : function(fn, scope, args){
+ var p = this;
+ while(p){
+ if(fn.apply(scope || p, args || [p]) === false){
+ break;
+ }
+ p = p.ownerCt;
+ }
+ return this;
+ },
+
+
+ getPositionEl : function(){
+ return this.positionEl || this.el;
+ },
+
+
+ purgeListeners : function(){
+ Ext.Component.superclass.purgeListeners.call(this);
+ if(this.mons){
+ this.on('beforedestroy', this.clearMons, this, {single: true});
+ }
+ },
+
+
+ clearMons : function(){
+ Ext.each(this.mons, function(m){
+ m.item.un(m.ename, m.fn, m.scope);
+ }, this);
+ this.mons = [];
+ },
+
+
+ createMons: function(){
+ if(!this.mons){
+ this.mons = [];
+ this.on('beforedestroy', this.clearMons, this, {single: true});
+ }
+ },
+
+
+ mon : function(item, ename, fn, scope, opt){
+ this.createMons();
+ if(Ext.isObject(ename)){
+ var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;
+
+ var o = ename;
+ for(var e in o){
+ if(propRe.test(e)){
+ continue;
+ }
+ if(Ext.isFunction(o[e])){
+
+ this.mons.push({
+ item: item, ename: e, fn: o[e], scope: o.scope
+ });
+ item.on(e, o[e], o.scope, o);
+ }else{
+
+ this.mons.push({
+ item: item, ename: e, fn: o[e], scope: o.scope
+ });
+ item.on(e, o[e]);
+ }
+ }
+ return;
+ }
+
+ this.mons.push({
+ item: item, ename: ename, fn: fn, scope: scope
+ });
+ item.on(ename, fn, scope, opt);
+ },
+
+
+ mun : function(item, ename, fn, scope){
+ var found, mon;
+ this.createMons();
+ for(var i = 0, len = this.mons.length; i < len; ++i){
+ mon = this.mons[i];
+ if(item === mon.item && ename == mon.ename && fn === mon.fn && scope === mon.scope){
+ this.mons.splice(i, 1);
+ item.un(ename, fn, scope);
+ found = true;
+ break;
+ }
+ }
+ return found;
+ },
+
+
+ nextSibling : function(){
+ if(this.ownerCt){
+ var index = this.ownerCt.items.indexOf(this);
+ if(index != -1 && index+1 < this.ownerCt.items.getCount()){
+ return this.ownerCt.items.itemAt(index+1);
+ }
+ }
+ return null;
+ },
+
+
+ previousSibling : function(){
+ if(this.ownerCt){
+ var index = this.ownerCt.items.indexOf(this);
+ if(index > 0){
+ return this.ownerCt.items.itemAt(index-1);
+ }
+ }
+ return null;
+ },
+
+
+ getBubbleTarget : function(){
+ return this.ownerCt;
+ }
+});
+
+Ext.reg('component', Ext.Component);
+
+Ext.Action = Ext.extend(Object, {
+
+
+
+
+
+
+
+
+ constructor : function(config){
+ this.initialConfig = config;
+ this.itemId = config.itemId = (config.itemId || config.id || Ext.id());
+ this.items = [];
+ },
+
+
+ isAction : true,
+
+
+ setText : function(text){
+ this.initialConfig.text = text;
+ this.callEach('setText', [text]);
+ },
+
+
+ getText : function(){
+ return this.initialConfig.text;
+ },
+
+
+ setIconClass : function(cls){
+ this.initialConfig.iconCls = cls;
+ this.callEach('setIconClass', [cls]);
+ },
+
+
+ getIconClass : function(){
+ return this.initialConfig.iconCls;
+ },
+
+
+ setDisabled : function(v){
+ this.initialConfig.disabled = v;
+ this.callEach('setDisabled', [v]);
+ },
+
+
+ enable : function(){
+ this.setDisabled(false);
+ },
+
+
+ disable : function(){
+ this.setDisabled(true);
+ },
+
+
+ isDisabled : function(){
+ return this.initialConfig.disabled;
+ },
+
+
+ setHidden : function(v){
+ this.initialConfig.hidden = v;
+ this.callEach('setVisible', [!v]);
+ },
+
+
+ show : function(){
+ this.setHidden(false);
+ },
+
+
+ hide : function(){
+ this.setHidden(true);
+ },
+
+
+ isHidden : function(){
+ return this.initialConfig.hidden;
+ },
+
+
+ setHandler : function(fn, scope){
+ this.initialConfig.handler = fn;
+ this.initialConfig.scope = scope;
+ this.callEach('setHandler', [fn, scope]);
+ },
+
+
+ each : function(fn, scope){
+ Ext.each(this.items, fn, scope);
+ },
+
+
+ callEach : function(fnName, args){
+ var cs = this.items;
+ for(var i = 0, len = cs.length; i < len; i++){
+ cs[i][fnName].apply(cs[i], args);
+ }
+ },
+
+
+ addComponent : function(comp){
+ this.items.push(comp);
+ comp.on('destroy', this.removeComponent, this);
+ },
+
+
+ removeComponent : function(comp){
+ this.items.remove(comp);
+ },
+
+
+ execute : function(){
+ this.initialConfig.handler.apply(this.initialConfig.scope || window, arguments);
+ }
+});
+
+(function(){
+Ext.Layer = function(config, existingEl){
+ config = config || {};
+ var dh = Ext.DomHelper,
+ cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body;
+
+ if (existingEl) {
+ this.dom = Ext.getDom(existingEl);
+ }
+ if(!this.dom){
+ var o = config.dh || {tag: 'div', cls: 'x-layer'};
+ this.dom = dh.append(pel, o);
+ }
+ if(config.cls){
+ this.addClass(config.cls);
+ }
+ this.constrain = config.constrain !== false;
+ this.setVisibilityMode(Ext.Element.VISIBILITY);
+ if(config.id){
+ this.id = this.dom.id = config.id;
+ }else{
+ this.id = Ext.id(this.dom);
+ }
+ this.zindex = config.zindex || this.getZIndex();
+ this.position('absolute', this.zindex);
+ if(config.shadow){
+ this.shadowOffset = config.shadowOffset || 4;
+ this.shadow = new Ext.Shadow({
+ offset : this.shadowOffset,
+ mode : config.shadow
+ });
+ }else{
+ this.shadowOffset = 0;
+ }
+ this.useShim = config.shim !== false && Ext.useShims;
+ this.useDisplay = config.useDisplay;
+ this.hide();
+};
+
+var supr = Ext.Element.prototype;
+
+
+var shims = [];
+
+Ext.extend(Ext.Layer, Ext.Element, {
+
+ getZIndex : function(){
+ return this.zindex || parseInt((this.getShim() || this).getStyle('z-index'), 10) || 11000;
+ },
+
+ getShim : function(){
+ if(!this.useShim){
+ return null;
+ }
+ if(this.shim){
+ return this.shim;
+ }
+ var shim = shims.shift();
+ if(!shim){
+ shim = this.createShim();
+ shim.enableDisplayMode('block');
+ shim.dom.style.display = 'none';
+ shim.dom.style.visibility = 'visible';
+ }
+ var pn = this.dom.parentNode;
+ if(shim.dom.parentNode != pn){
+ pn.insertBefore(shim.dom, this.dom);
+ }
+ shim.setStyle('z-index', this.getZIndex()-2);
+ this.shim = shim;
+ return shim;
+ },
+
+ hideShim : function(){
+ if(this.shim){
+ this.shim.setDisplayed(false);
+ shims.push(this.shim);
+ delete this.shim;
+ }
+ },
+
+ disableShadow : function(){
+ if(this.shadow){
+ this.shadowDisabled = true;
+ this.shadow.hide();
+ this.lastShadowOffset = this.shadowOffset;
+ this.shadowOffset = 0;
+ }
+ },
+
+ enableShadow : function(show){
+ if(this.shadow){
+ this.shadowDisabled = false;
+ if(Ext.isDefined(this.lastShadowOffset)) {
+ this.shadowOffset = this.lastShadowOffset;
+ delete this.lastShadowOffset;
+ }
+ if(show){
+ this.sync(true);
+ }
+ }
+ },
+
+
+
+
+ sync : function(doShow){
+ var shadow = this.shadow;
+ if(!this.updating && this.isVisible() && (shadow || this.useShim)){
+ var shim = this.getShim(),
+ w = this.getWidth(),
+ h = this.getHeight(),
+ l = this.getLeft(true),
+ t = this.getTop(true);
+
+ if(shadow && !this.shadowDisabled){
+ if(doShow && !shadow.isVisible()){
+ shadow.show(this);
+ }else{
+ shadow.realign(l, t, w, h);
+ }
+ if(shim){
+ if(doShow){
+ shim.show();
+ }
+
+ var shadowAdj = shadow.el.getXY(), shimStyle = shim.dom.style,
+ shadowSize = shadow.el.getSize();
+ shimStyle.left = (shadowAdj[0])+'px';
+ shimStyle.top = (shadowAdj[1])+'px';
+ shimStyle.width = (shadowSize.width)+'px';
+ shimStyle.height = (shadowSize.height)+'px';
+ }
+ }else if(shim){
+ if(doShow){
+ shim.show();
+ }
+ shim.setSize(w, h);
+ shim.setLeftTop(l, t);
+ }
+ }
+ },
+
+
+ destroy : function(){
+ this.hideShim();
+ if(this.shadow){
+ this.shadow.hide();
+ }
+ this.removeAllListeners();
+ Ext.removeNode(this.dom);
+ delete this.dom;
+ },
+
+ remove : function(){
+ this.destroy();
+ },
+
+
+ beginUpdate : function(){
+ this.updating = true;
+ },
+
+
+ endUpdate : function(){
+ this.updating = false;
+ this.sync(true);
+ },
+
+
+ hideUnders : function(negOffset){
+ if(this.shadow){
+ this.shadow.hide();
+ }
+ this.hideShim();
+ },
+
+
+ constrainXY : function(){
+ if(this.constrain){
+ var vw = Ext.lib.Dom.getViewWidth(),
+ vh = Ext.lib.Dom.getViewHeight();
+ var s = Ext.getDoc().getScroll();
+
+ var xy = this.getXY();
+ var x = xy[0], y = xy[1];
+ var so = this.shadowOffset;
+ var w = this.dom.offsetWidth+so, h = this.dom.offsetHeight+so;
+
+ var moved = false;
+
+ if((x + w) > vw+s.left){
+ x = vw - w - so;
+ moved = true;
+ }
+ if((y + h) > vh+s.top){
+ y = vh - h - so;
+ moved = true;
+ }
+
+ if(x < s.left){
+ x = s.left;
+ moved = true;
+ }
+ if(y < s.top){
+ y = s.top;
+ moved = true;
+ }
+ if(moved){
+ if(this.avoidY){
+ var ay = this.avoidY;
+ if(y <= ay && (y+h) >= ay){
+ y = ay-h-5;
+ }
+ }
+ xy = [x, y];
+ this.storeXY(xy);
+ supr.setXY.call(this, xy);
+ this.sync();
+ }
+ }
+ return this;
+ },
+
+ getConstrainOffset : function(){
+ return this.shadowOffset;
+ },
+
+ isVisible : function(){
+ return this.visible;
+ },
+
+
+ showAction : function(){
+ this.visible = true;
+ if(this.useDisplay === true){
+ this.setDisplayed('');
+ }else if(this.lastXY){
+ supr.setXY.call(this, this.lastXY);
+ }else if(this.lastLT){
+ supr.setLeftTop.call(this, this.lastLT[0], this.lastLT[1]);
+ }
+ },
+
+
+ hideAction : function(){
+ this.visible = false;
+ if(this.useDisplay === true){
+ this.setDisplayed(false);
+ }else{
+ this.setLeftTop(-10000,-10000);
+ }
+ },
+
+
+ setVisible : function(v, a, d, c, e){
+ if(v){
+ this.showAction();
+ }
+ if(a && v){
+ var cb = function(){
+ this.sync(true);
+ if(c){
+ c();
+ }
+ }.createDelegate(this);
+ supr.setVisible.call(this, true, true, d, cb, e);
+ }else{
+ if(!v){
+ this.hideUnders(true);
+ }
+ var cb = c;
+ if(a){
+ cb = function(){
+ this.hideAction();
+ if(c){
+ c();
+ }
+ }.createDelegate(this);
+ }
+ supr.setVisible.call(this, v, a, d, cb, e);
+ if(v){
+ this.sync(true);
+ }else if(!a){
+ this.hideAction();
+ }
+ }
+ return this;
+ },
+
+ storeXY : function(xy){
+ delete this.lastLT;
+ this.lastXY = xy;
+ },
+
+ storeLeftTop : function(left, top){
+ delete this.lastXY;
+ this.lastLT = [left, top];
+ },
+
+
+ beforeFx : function(){
+ this.beforeAction();
+ return Ext.Layer.superclass.beforeFx.apply(this, arguments);
+ },
+
+
+ afterFx : function(){
+ Ext.Layer.superclass.afterFx.apply(this, arguments);
+ this.sync(this.isVisible());
+ },
+
+
+ beforeAction : function(){
+ if(!this.updating && this.shadow){
+ this.shadow.hide();
+ }
+ },
+
+
+ setLeft : function(left){
+ this.storeLeftTop(left, this.getTop(true));
+ supr.setLeft.apply(this, arguments);
+ this.sync();
+ return this;
+ },
+
+ setTop : function(top){
+ this.storeLeftTop(this.getLeft(true), top);
+ supr.setTop.apply(this, arguments);
+ this.sync();
+ return this;
+ },
+
+ setLeftTop : function(left, top){
+ this.storeLeftTop(left, top);
+ supr.setLeftTop.apply(this, arguments);
+ this.sync();
+ return this;
+ },
+
+ setXY : function(xy, a, d, c, e){
+ this.fixDisplay();
+ this.beforeAction();
+ this.storeXY(xy);
+ var cb = this.createCB(c);
+ supr.setXY.call(this, xy, a, d, cb, e);
+ if(!a){
+ cb();
+ }
+ return this;
+ },
+
+
+ createCB : function(c){
+ var el = this;
+ return function(){
+ el.constrainXY();
+ el.sync(true);
+ if(c){
+ c();
+ }
+ };
+ },
+
+
+ setX : function(x, a, d, c, e){
+ this.setXY([x, this.getY()], a, d, c, e);
+ return this;
+ },
+
+
+ setY : function(y, a, d, c, e){
+ this.setXY([this.getX(), y], a, d, c, e);
+ return this;
+ },
+
+
+ setSize : function(w, h, a, d, c, e){
+ this.beforeAction();
+ var cb = this.createCB(c);
+ supr.setSize.call(this, w, h, a, d, cb, e);
+ if(!a){
+ cb();
+ }
+ return this;
+ },
+
+
+ setWidth : function(w, a, d, c, e){
+ this.beforeAction();
+ var cb = this.createCB(c);
+ supr.setWidth.call(this, w, a, d, cb, e);
+ if(!a){
+ cb();
+ }
+ return this;
+ },
+
+
+ setHeight : function(h, a, d, c, e){
+ this.beforeAction();
+ var cb = this.createCB(c);
+ supr.setHeight.call(this, h, a, d, cb, e);
+ if(!a){
+ cb();
+ }
+ return this;
+ },
+
+
+ setBounds : function(x, y, w, h, a, d, c, e){
+ this.beforeAction();
+ var cb = this.createCB(c);
+ if(!a){
+ this.storeXY([x, y]);
+ supr.setXY.call(this, [x, y]);
+ supr.setSize.call(this, w, h, a, d, cb, e);
+ cb();
+ }else{
+ supr.setBounds.call(this, x, y, w, h, a, d, cb, e);
+ }
+ return this;
+ },
+
+
+ setZIndex : function(zindex){
+ this.zindex = zindex;
+ this.setStyle('z-index', zindex + 2);
+ if(this.shadow){
+ this.shadow.setZIndex(zindex + 1);
+ }
+ if(this.shim){
+ this.shim.setStyle('z-index', zindex);
+ }
+ return this;
+ }
+});
+})();
+
+Ext.Shadow = function(config) {
+ Ext.apply(this, config);
+ if (typeof this.mode != "string") {
+ this.mode = this.defaultMode;
+ }
+ var o = this.offset,
+ a = {
+ h: 0
+ },
+ rad = Math.floor(this.offset / 2);
+ switch (this.mode.toLowerCase()) {
+
+ case "drop":
+ a.w = 0;
+ a.l = a.t = o;
+ a.t -= 1;
+ if (Ext.isIE9m) {
+ a.l -= this.offset + rad;
+ a.t -= this.offset + rad;
+ a.w -= rad;
+ a.h -= rad;
+ a.t += 1;
+ }
+ break;
+ case "sides":
+ a.w = (o * 2);
+ a.l = -o;
+ a.t = o - 1;
+ if (Ext.isIE9m) {
+ a.l -= (this.offset - rad);
+ a.t -= this.offset + rad;
+ a.l += 1;
+ a.w -= (this.offset - rad) * 2;
+ a.w -= rad + 1;
+ a.h -= 1;
+ }
+ break;
+ case "frame":
+ a.w = a.h = (o * 2);
+ a.l = a.t = -o;
+ a.t += 1;
+ a.h -= 2;
+ if (Ext.isIE9m) {
+ a.l -= (this.offset - rad);
+ a.t -= (this.offset - rad);
+ a.l += 1;
+ a.w -= (this.offset + rad + 1);
+ a.h -= (this.offset + rad);
+ a.h += 1;
+ }
+ break;
+ };
+
+ this.adjusts = a;
+};
+
+Ext.Shadow.prototype = {
+
+
+ offset: 4,
+
+
+ defaultMode: "drop",
+
+
+ show: function(target) {
+ target = Ext.get(target);
+ if (!this.el) {
+ this.el = Ext.Shadow.Pool.pull();
+ if (this.el.dom.nextSibling != target.dom) {
+ this.el.insertBefore(target);
+ }
+ }
+ this.el.setStyle("z-index", this.zIndex || parseInt(target.getStyle("z-index"), 10) - 1);
+ if (Ext.isIE9m) {
+ this.el.dom.style.filter = "progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius=" + (this.offset) + ")";
+ }
+ this.realign(
+ target.getLeft(true),
+ target.getTop(true),
+ target.getWidth(),
+ target.getHeight()
+ );
+ this.el.dom.style.display = "block";
+ },
+
+
+ isVisible: function() {
+ return this.el ? true: false;
+ },
+
+
+ realign: function(l, t, w, h) {
+ if (!this.el) {
+ return;
+ }
+ var a = this.adjusts,
+ d = this.el.dom,
+ s = d.style,
+ iea = 0,
+ sw = (w + a.w),
+ sh = (h + a.h),
+ sws = sw + "px",
+ shs = sh + "px",
+ cn,
+ sww;
+ s.left = (l + a.l) + "px";
+ s.top = (t + a.t) + "px";
+ if (s.width != sws || s.height != shs) {
+ s.width = sws;
+ s.height = shs;
+ if (!Ext.isIE9m) {
+ cn = d.childNodes;
+ sww = Math.max(0, (sw - 12)) + "px";
+ cn[0].childNodes[1].style.width = sww;
+ cn[1].childNodes[1].style.width = sww;
+ cn[2].childNodes[1].style.width = sww;
+ cn[1].style.height = Math.max(0, (sh - 12)) + "px";
+ }
+ }
+ },
+
+
+ hide: function() {
+ if (this.el) {
+ this.el.dom.style.display = "none";
+ Ext.Shadow.Pool.push(this.el);
+ delete this.el;
+ }
+ },
+
+
+ setZIndex: function(z) {
+ this.zIndex = z;
+ if (this.el) {
+ this.el.setStyle("z-index", z);
+ }
+ }
+};
+
+
+Ext.Shadow.Pool = function() {
+ var p = [],
+ markup = Ext.isIE9m ?
+ '<div class="x-ie-shadow"></div>':
+ '<div class="x-shadow"><div class="xst"><div class="xstl"></div><div class="xstc"></div><div class="xstr"></div></div><div class="xsc"><div class="xsml"></div><div class="xsmc"></div><div class="xsmr"></div></div><div class="xsb"><div class="xsbl"></div><div class="xsbc"></div><div class="xsbr"></div></div></div>';
+ return {
+ pull: function() {
+ var sh = p.shift();
+ if (!sh) {
+ sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, markup));
+ sh.autoBoxAdjust = false;
+ }
+ return sh;
+ },
+
+ push: function(sh) {
+ p.push(sh);
+ }
+ };
+}();
+Ext.BoxComponent = Ext.extend(Ext.Component, {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ initComponent : function(){
+ Ext.BoxComponent.superclass.initComponent.call(this);
+ this.addEvents(
+
+ 'resize',
+
+ 'move'
+ );
+ },
+
+
+ boxReady : false,
+
+ deferHeight: false,
+
+
+ setSize : function(w, h){
+
+
+ if(typeof w == 'object'){
+ h = w.height;
+ w = w.width;
+ }
+ if (Ext.isDefined(w) && Ext.isDefined(this.boxMinWidth) && (w < this.boxMinWidth)) {
+ w = this.boxMinWidth;
+ }
+ if (Ext.isDefined(h) && Ext.isDefined(this.boxMinHeight) && (h < this.boxMinHeight)) {
+ h = this.boxMinHeight;
+ }
+ if (Ext.isDefined(w) && Ext.isDefined(this.boxMaxWidth) && (w > this.boxMaxWidth)) {
+ w = this.boxMaxWidth;
+ }
+ if (Ext.isDefined(h) && Ext.isDefined(this.boxMaxHeight) && (h > this.boxMaxHeight)) {
+ h = this.boxMaxHeight;
+ }
+
+ if(!this.boxReady){
+ this.width = w;
+ this.height = h;
+ return this;
+ }
+
+
+ if(this.cacheSizes !== false && this.lastSize && this.lastSize.width == w && this.lastSize.height == h){
+ return this;
+ }
+ this.lastSize = {width: w, height: h};
+ var adj = this.adjustSize(w, h),
+ aw = adj.width,
+ ah = adj.height,
+ rz;
+ if(aw !== undefined || ah !== undefined){
+ rz = this.getResizeEl();
+ if(!this.deferHeight && aw !== undefined && ah !== undefined){
+ rz.setSize(aw, ah);
+ }else if(!this.deferHeight && ah !== undefined){
+ rz.setHeight(ah);
+ }else if(aw !== undefined){
+ rz.setWidth(aw);
+ }
+ this.onResize(aw, ah, w, h);
+ this.fireEvent('resize', this, aw, ah, w, h);
+ }
+ return this;
+ },
+
+
+ setWidth : function(width){
+ return this.setSize(width);
+ },
+
+
+ setHeight : function(height){
+ return this.setSize(undefined, height);
+ },
+
+
+ getSize : function(){
+ return this.getResizeEl().getSize();
+ },
+
+
+ getWidth : function(){
+ return this.getResizeEl().getWidth();
+ },
+
+
+ getHeight : function(){
+ return this.getResizeEl().getHeight();
+ },
+
+
+ getOuterSize : function(){
+ var el = this.getResizeEl();
+ return {width: el.getWidth() + el.getMargins('lr'),
+ height: el.getHeight() + el.getMargins('tb')};
+ },
+
+
+ getPosition : function(local){
+ var el = this.getPositionEl();
+ if(local === true){
+ return [el.getLeft(true), el.getTop(true)];
+ }
+ return this.xy || el.getXY();
+ },
+
+
+ getBox : function(local){
+ var pos = this.getPosition(local);
+ var s = this.getSize();
+ s.x = pos[0];
+ s.y = pos[1];
+ return s;
+ },
+
+
+ updateBox : function(box){
+ this.setSize(box.width, box.height);
+ this.setPagePosition(box.x, box.y);
+ return this;
+ },
+
+
+ getResizeEl : function(){
+ return this.resizeEl || this.el;
+ },
+
+
+ setAutoScroll : function(scroll){
+ if(this.rendered){
+ this.getContentTarget().setOverflow(scroll ? 'auto' : '');
+ }
+ this.autoScroll = scroll;
+ return this;
+ },
+
+
+ setPosition : function(x, y){
+ if(x && typeof x[1] == 'number'){
+ y = x[1];
+ x = x[0];
+ }
+ this.x = x;
+ this.y = y;
+ if(!this.boxReady){
+ return this;
+ }
+ var adj = this.adjustPosition(x, y);
+ var ax = adj.x, ay = adj.y;
+
+ var el = this.getPositionEl();
+ if(ax !== undefined || ay !== undefined){
+ if(ax !== undefined && ay !== undefined){
+ el.setLeftTop(ax, ay);
+ }else if(ax !== undefined){
+ el.setLeft(ax);
+ }else if(ay !== undefined){
+ el.setTop(ay);
+ }
+ this.onPosition(ax, ay);
+ this.fireEvent('move', this, ax, ay);
+ }
+ return this;
+ },
+
+
+ setPagePosition : function(x, y){
+ if(x && typeof x[1] == 'number'){
+ y = x[1];
+ x = x[0];
+ }
+ this.pageX = x;
+ this.pageY = y;
+ if(!this.boxReady){
+ return;
+ }
+ if(x === undefined || y === undefined){
+ return;
+ }
+ var p = this.getPositionEl().translatePoints(x, y);
+ this.setPosition(p.left, p.top);
+ return this;
+ },
+
+
+ afterRender : function(){
+ Ext.BoxComponent.superclass.afterRender.call(this);
+ if(this.resizeEl){
+ this.resizeEl = Ext.get(this.resizeEl);
+ }
+ if(this.positionEl){
+ this.positionEl = Ext.get(this.positionEl);
+ }
+ this.boxReady = true;
+ Ext.isDefined(this.autoScroll) && this.setAutoScroll(this.autoScroll);
+ this.setSize(this.width, this.height);
+ if(this.x || this.y){
+ this.setPosition(this.x, this.y);
+ }else if(this.pageX || this.pageY){
+ this.setPagePosition(this.pageX, this.pageY);
+ }
+ },
+
+
+ syncSize : function(){
+ delete this.lastSize;
+ this.setSize(this.autoWidth ? undefined : this.getResizeEl().getWidth(), this.autoHeight ? undefined : this.getResizeEl().getHeight());
+ return this;
+ },
+
+
+ onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){
+ },
+
+
+ onPosition : function(x, y){
+
+ },
+
+
+ adjustSize : function(w, h){
+ if(this.autoWidth){
+ w = 'auto';
+ }
+ if(this.autoHeight){
+ h = 'auto';
+ }
+ return {width : w, height: h};
+ },
+
+
+ adjustPosition : function(x, y){
+ return {x : x, y: y};
+ }
+});
+Ext.reg('box', Ext.BoxComponent);
+
+
+
+Ext.Spacer = Ext.extend(Ext.BoxComponent, {
+ autoEl:'div'
+});
+Ext.reg('spacer', Ext.Spacer);
+Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){
+
+
+ this.el = Ext.get(dragElement, true);
+ this.el.unselectable();
+
+ this.resizingEl = Ext.get(resizingElement, true);
+
+
+ this.orientation = orientation || Ext.SplitBar.HORIZONTAL;
+
+
+
+ this.minSize = 0;
+
+
+ this.maxSize = 2000;
+
+
+ this.animate = false;
+
+
+ this.useShim = false;
+
+
+ this.shim = null;
+
+ if(!existingProxy){
+
+ this.proxy = Ext.SplitBar.createProxy(this.orientation);
+ }else{
+ this.proxy = Ext.get(existingProxy).dom;
+ }
+
+ this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {dragElId : this.proxy.id});
+
+
+ this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this);
+
+
+ this.dd.endDrag = this.onEndProxyDrag.createDelegate(this);
+
+
+ this.dragSpecs = {};
+
+
+ this.adapter = new Ext.SplitBar.BasicLayoutAdapter();
+ this.adapter.init(this);
+
+ if(this.orientation == Ext.SplitBar.HORIZONTAL){
+
+ this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT);
+ this.el.addClass("x-splitbar-h");
+ }else{
+
+ this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM);
+ this.el.addClass("x-splitbar-v");
+ }
+
+ this.addEvents(
+
+ "resize",
+
+ "moved",
+
+ "beforeresize",
+
+ "beforeapply"
+ );
+
+ Ext.SplitBar.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.SplitBar, Ext.util.Observable, {
+ onStartProxyDrag : function(x, y){
+ this.fireEvent("beforeresize", this);
+ this.overlay = Ext.DomHelper.append(document.body, {cls: "x-drag-overlay", html: "&#160;"}, true);
+ this.overlay.unselectable();
+ this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
+ this.overlay.show();
+ Ext.get(this.proxy).setDisplayed("block");
+ var size = this.adapter.getElementSize(this);
+ this.activeMinSize = this.getMinimumSize();
+ this.activeMaxSize = this.getMaximumSize();
+ var c1 = size - this.activeMinSize;
+ var c2 = Math.max(this.activeMaxSize - size, 0);
+ if(this.orientation == Ext.SplitBar.HORIZONTAL){
+ this.dd.resetConstraints();
+ this.dd.setXConstraint(
+ this.placement == Ext.SplitBar.LEFT ? c1 : c2,
+ this.placement == Ext.SplitBar.LEFT ? c2 : c1,
+ this.tickSize
+ );
+ this.dd.setYConstraint(0, 0);
+ }else{
+ this.dd.resetConstraints();
+ this.dd.setXConstraint(0, 0);
+ this.dd.setYConstraint(
+ this.placement == Ext.SplitBar.TOP ? c1 : c2,
+ this.placement == Ext.SplitBar.TOP ? c2 : c1,
+ this.tickSize
+ );
+ }
+ this.dragSpecs.startSize = size;
+ this.dragSpecs.startPoint = [x, y];
+ Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y);
+ },
+
+
+ onEndProxyDrag : function(e){
+ Ext.get(this.proxy).setDisplayed(false);
+ var endPoint = Ext.lib.Event.getXY(e);
+ if(this.overlay){
+ Ext.destroy(this.overlay);
+ delete this.overlay;
+ }
+ var newSize;
+ if(this.orientation == Ext.SplitBar.HORIZONTAL){
+ newSize = this.dragSpecs.startSize +
+ (this.placement == Ext.SplitBar.LEFT ?
+ endPoint[0] - this.dragSpecs.startPoint[0] :
+ this.dragSpecs.startPoint[0] - endPoint[0]
+ );
+ }else{
+ newSize = this.dragSpecs.startSize +
+ (this.placement == Ext.SplitBar.TOP ?
+ endPoint[1] - this.dragSpecs.startPoint[1] :
+ this.dragSpecs.startPoint[1] - endPoint[1]
+ );
+ }
+ newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize);
+ if(newSize != this.dragSpecs.startSize){
+ if(this.fireEvent('beforeapply', this, newSize) !== false){
+ this.adapter.setElementSize(this, newSize);
+ this.fireEvent("moved", this, newSize);
+ this.fireEvent("resize", this, newSize);
+ }
+ }
+ },
+
+
+ getAdapter : function(){
+ return this.adapter;
+ },
+
+
+ setAdapter : function(adapter){
+ this.adapter = adapter;
+ this.adapter.init(this);
+ },
+
+
+ getMinimumSize : function(){
+ return this.minSize;
+ },
+
+
+ setMinimumSize : function(minSize){
+ this.minSize = minSize;
+ },
+
+
+ getMaximumSize : function(){
+ return this.maxSize;
+ },
+
+
+ setMaximumSize : function(maxSize){
+ this.maxSize = maxSize;
+ },
+
+
+ setCurrentSize : function(size){
+ var oldAnimate = this.animate;
+ this.animate = false;
+ this.adapter.setElementSize(this, size);
+ this.animate = oldAnimate;
+ },
+
+
+ destroy : function(removeEl){
+ Ext.destroy(this.shim, Ext.get(this.proxy));
+ this.dd.unreg();
+ if(removeEl){
+ this.el.remove();
+ }
+ this.purgeListeners();
+ }
+});
+
+
+Ext.SplitBar.createProxy = function(dir){
+ var proxy = new Ext.Element(document.createElement("div"));
+ document.body.appendChild(proxy.dom);
+ proxy.unselectable();
+ var cls = 'x-splitbar-proxy';
+ proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v'));
+ return proxy.dom;
+};
+
+
+Ext.SplitBar.BasicLayoutAdapter = function(){
+};
+
+Ext.SplitBar.BasicLayoutAdapter.prototype = {
+
+ init : function(s){
+
+ },
+
+ getElementSize : function(s){
+ if(s.orientation == Ext.SplitBar.HORIZONTAL){
+ return s.resizingEl.getWidth();
+ }else{
+ return s.resizingEl.getHeight();
+ }
+ },
+
+
+ setElementSize : function(s, newSize, onComplete){
+ if(s.orientation == Ext.SplitBar.HORIZONTAL){
+ if(!s.animate){
+ s.resizingEl.setWidth(newSize);
+ if(onComplete){
+ onComplete(s, newSize);
+ }
+ }else{
+ s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut');
+ }
+ }else{
+
+ if(!s.animate){
+ s.resizingEl.setHeight(newSize);
+ if(onComplete){
+ onComplete(s, newSize);
+ }
+ }else{
+ s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut');
+ }
+ }
+ }
+};
+
+
+Ext.SplitBar.AbsoluteLayoutAdapter = function(container){
+ this.basic = new Ext.SplitBar.BasicLayoutAdapter();
+ this.container = Ext.get(container);
+};
+
+Ext.SplitBar.AbsoluteLayoutAdapter.prototype = {
+ init : function(s){
+ this.basic.init(s);
+ },
+
+ getElementSize : function(s){
+ return this.basic.getElementSize(s);
+ },
+
+ setElementSize : function(s, newSize, onComplete){
+ this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s]));
+ },
+
+ moveSplitter : function(s){
+ var yes = Ext.SplitBar;
+ switch(s.placement){
+ case yes.LEFT:
+ s.el.setX(s.resizingEl.getRight());
+ break;
+ case yes.RIGHT:
+ s.el.setStyle("right", (this.container.getWidth() - s.resizingEl.getLeft()) + "px");
+ break;
+ case yes.TOP:
+ s.el.setY(s.resizingEl.getBottom());
+ break;
+ case yes.BOTTOM:
+ s.el.setY(s.resizingEl.getTop() - s.el.getHeight());
+ break;
+ }
+ }
+};
+
+
+Ext.SplitBar.VERTICAL = 1;
+
+
+Ext.SplitBar.HORIZONTAL = 2;
+
+
+Ext.SplitBar.LEFT = 1;
+
+
+Ext.SplitBar.RIGHT = 2;
+
+
+Ext.SplitBar.TOP = 3;
+
+
+Ext.SplitBar.BOTTOM = 4;
+
+Ext.Container = Ext.extend(Ext.BoxComponent, {
+
+
+
+
+ bufferResize: 50,
+
+
+
+
+
+
+
+ autoDestroy : true,
+
+
+ forceLayout: false,
+
+
+
+ defaultType : 'panel',
+
+
+ resizeEvent: 'resize',
+
+
+ bubbleEvents: ['add', 'remove'],
+
+
+ initComponent : function(){
+ Ext.Container.superclass.initComponent.call(this);
+
+ this.addEvents(
+
+ 'afterlayout',
+
+ 'beforeadd',
+
+ 'beforeremove',
+
+ 'add',
+
+ 'remove'
+ );
+
+
+ var items = this.items;
+ if(items){
+ delete this.items;
+ this.add(items);
+ }
+ },
+
+
+ initItems : function(){
+ if(!this.items){
+ this.items = new Ext.util.MixedCollection(false, this.getComponentId);
+ this.getLayout();
+ }
+ },
+
+
+ setLayout : function(layout){
+ if(this.layout && this.layout != layout){
+ this.layout.setContainer(null);
+ }
+ this.layout = layout;
+ this.initItems();
+ layout.setContainer(this);
+ },
+
+ afterRender: function(){
+
+
+ Ext.Container.superclass.afterRender.call(this);
+ if(!this.layout){
+ this.layout = 'auto';
+ }
+ if(Ext.isObject(this.layout) && !this.layout.layout){
+ this.layoutConfig = this.layout;
+ this.layout = this.layoutConfig.type;
+ }
+ if(Ext.isString(this.layout)){
+ this.layout = new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig);
+ }
+ this.setLayout(this.layout);
+
+
+ if(this.activeItem !== undefined && this.layout.setActiveItem){
+ var item = this.activeItem;
+ delete this.activeItem;
+ this.layout.setActiveItem(item);
+ }
+
+
+ if(!this.ownerCt){
+ this.doLayout(false, true);
+ }
+
+
+
+ if(this.monitorResize === true){
+ Ext.EventManager.onWindowResize(this.doLayout, this, [false]);
+ }
+ },
+
+
+ getLayoutTarget : function(){
+ return this.el;
+ },
+
+
+ getComponentId : function(comp){
+ return comp.getItemId();
+ },
+
+
+ add : function(comp){
+ this.initItems();
+ var args = arguments.length > 1;
+ if(args || Ext.isArray(comp)){
+ var result = [];
+ Ext.each(args ? arguments : comp, function(c){
+ result.push(this.add(c));
+ }, this);
+ return result;
+ }
+ var c = this.lookupComponent(this.applyDefaults(comp));
+ var index = this.items.length;
+ if(this.fireEvent('beforeadd', this, c, index) !== false && this.onBeforeAdd(c) !== false){
+ this.items.add(c);
+
+ c.onAdded(this, index);
+ this.onAdd(c);
+ this.fireEvent('add', this, c, index);
+ }
+ return c;
+ },
+
+ onAdd : function(c){
+
+ },
+
+
+ onAdded : function(container, pos) {
+
+ this.ownerCt = container;
+ this.initRef();
+
+ this.cascade(function(c){
+ c.initRef();
+ });
+ this.fireEvent('added', this, container, pos);
+ },
+
+
+ insert : function(index, comp) {
+ var args = arguments,
+ length = args.length,
+ result = [],
+ i, c;
+
+ this.initItems();
+
+ if (length > 2) {
+ for (i = length - 1; i >= 1; --i) {
+ result.push(this.insert(index, args[i]));
+ }
+ return result;
+ }
+
+ c = this.lookupComponent(this.applyDefaults(comp));
+ index = Math.min(index, this.items.length);
+
+ if (this.fireEvent('beforeadd', this, c, index) !== false && this.onBeforeAdd(c) !== false) {
+ if (c.ownerCt == this) {
+ this.items.remove(c);
+ }
+ this.items.insert(index, c);
+ c.onAdded(this, index);
+ this.onAdd(c);
+ this.fireEvent('add', this, c, index);
+ }
+
+ return c;
+ },
+
+
+ applyDefaults : function(c){
+ var d = this.defaults;
+ if(d){
+ if(Ext.isFunction(d)){
+ d = d.call(this, c);
+ }
+ if(Ext.isString(c)){
+ c = Ext.ComponentMgr.get(c);
+ Ext.apply(c, d);
+ }else if(!c.events){
+ Ext.applyIf(c.isAction ? c.initialConfig : c, d);
+ }else{
+ Ext.apply(c, d);
+ }
+ }
+ return c;
+ },
+
+
+ onBeforeAdd : function(item){
+ if(item.ownerCt){
+ item.ownerCt.remove(item, false);
+ }
+ if(this.hideBorders === true){
+ item.border = (item.border === true);
+ }
+ },
+
+
+ remove : function(comp, autoDestroy){
+ this.initItems();
+ var c = this.getComponent(comp);
+ if(c && this.fireEvent('beforeremove', this, c) !== false){
+ this.doRemove(c, autoDestroy);
+ this.fireEvent('remove', this, c);
+ }
+ return c;
+ },
+
+ onRemove: function(c){
+
+ },
+
+
+ doRemove: function(c, autoDestroy){
+ var l = this.layout,
+ hasLayout = l && this.rendered;
+
+ if(hasLayout){
+ l.onRemove(c);
+ }
+ this.items.remove(c);
+ c.onRemoved();
+ this.onRemove(c);
+ if(autoDestroy === true || (autoDestroy !== false && this.autoDestroy)){
+ c.destroy();
+ }
+ if(hasLayout){
+ l.afterRemove(c);
+ }
+ },
+
+
+ removeAll: function(autoDestroy){
+ this.initItems();
+ var item, rem = [], items = [];
+ this.items.each(function(i){
+ rem.push(i);
+ });
+ for (var i = 0, len = rem.length; i < len; ++i){
+ item = rem[i];
+ this.remove(item, autoDestroy);
+ if(item.ownerCt !== this){
+ items.push(item);
+ }
+ }
+ return items;
+ },
+
+
+ getComponent : function(comp){
+ if(Ext.isObject(comp)){
+ comp = comp.getItemId();
+ }
+ return this.items.get(comp);
+ },
+
+
+ lookupComponent : function(comp){
+ if(Ext.isString(comp)){
+ return Ext.ComponentMgr.get(comp);
+ }else if(!comp.events){
+ return this.createComponent(comp);
+ }
+ return comp;
+ },
+
+
+ createComponent : function(config, defaultType){
+ if (config.render) {
+ return config;
+ }
+
+
+ var c = Ext.create(Ext.apply({
+ ownerCt: this
+ }, config), defaultType || this.defaultType);
+ delete c.initialConfig.ownerCt;
+ delete c.ownerCt;
+ return c;
+ },
+
+
+ canLayout : function() {
+ var el = this.getVisibilityEl();
+ return el && el.dom && !el.isStyle("display", "none");
+ },
+
+
+
+ doLayout : function(shallow, force){
+ var rendered = this.rendered,
+ forceLayout = force || this.forceLayout;
+
+ if(this.collapsed || !this.canLayout()){
+ this.deferLayout = this.deferLayout || !shallow;
+ if(!forceLayout){
+ return;
+ }
+ shallow = shallow && !this.deferLayout;
+ } else {
+ delete this.deferLayout;
+ }
+ if(rendered && this.layout){
+ this.layout.layout();
+ }
+ if(shallow !== true && this.items){
+ var cs = this.items.items;
+ for(var i = 0, len = cs.length; i < len; i++){
+ var c = cs[i];
+ if(c.doLayout){
+ c.doLayout(false, forceLayout);
+ }
+ }
+ }
+ if(rendered){
+ this.onLayout(shallow, forceLayout);
+ }
+
+ this.hasLayout = true;
+ delete this.forceLayout;
+ },
+
+ onLayout : Ext.emptyFn,
+
+
+ shouldBufferLayout: function(){
+
+ var hl = this.hasLayout;
+ if(this.ownerCt){
+
+ return hl ? !this.hasLayoutPending() : false;
+ }
+
+ return hl;
+ },
+
+
+ hasLayoutPending: function(){
+
+ var pending = false;
+ this.ownerCt.bubble(function(c){
+ if(c.layoutPending){
+ pending = true;
+ return false;
+ }
+ });
+ return pending;
+ },
+
+ onShow : function(){
+
+ Ext.Container.superclass.onShow.call(this);
+
+ if(Ext.isDefined(this.deferLayout)){
+ delete this.deferLayout;
+ this.doLayout(true);
+ }
+ },
+
+
+ getLayout : function(){
+ if(!this.layout){
+ var layout = new Ext.layout.AutoLayout(this.layoutConfig);
+ this.setLayout(layout);
+ }
+ return this.layout;
+ },
+
+
+ beforeDestroy : function(){
+ var c;
+ if(this.items){
+ while(c = this.items.first()){
+ this.doRemove(c, true);
+ }
+ }
+ if(this.monitorResize){
+ Ext.EventManager.removeResizeListener(this.doLayout, this);
+ }
+ Ext.destroy(this.layout);
+ Ext.Container.superclass.beforeDestroy.call(this);
+ },
+
+
+ cascade : function(fn, scope, args){
+ if(fn.apply(scope || this, args || [this]) !== false){
+ if(this.items){
+ var cs = this.items.items;
+ for(var i = 0, len = cs.length; i < len; i++){
+ if(cs[i].cascade){
+ cs[i].cascade(fn, scope, args);
+ }else{
+ fn.apply(scope || cs[i], args || [cs[i]]);
+ }
+ }
+ }
+ }
+ return this;
+ },
+
+
+ findById : function(id){
+ var m = null,
+ ct = this;
+ this.cascade(function(c){
+ if(ct != c && c.id === id){
+ m = c;
+ return false;
+ }
+ });
+ return m;
+ },
+
+
+ findByType : function(xtype, shallow){
+ return this.findBy(function(c){
+ return c.isXType(xtype, shallow);
+ });
+ },
+
+
+ find : function(prop, value){
+ return this.findBy(function(c){
+ return c[prop] === value;
+ });
+ },
+
+
+ findBy : function(fn, scope){
+ var m = [], ct = this;
+ this.cascade(function(c){
+ if(ct != c && fn.call(scope || c, c, ct) === true){
+ m.push(c);
+ }
+ });
+ return m;
+ },
+
+
+ get : function(key){
+ return this.getComponent(key);
+ }
+});
+
+Ext.Container.LAYOUTS = {};
+Ext.reg('container', Ext.Container);
+
+Ext.layout.ContainerLayout = Ext.extend(Object, {
+
+
+
+
+
+
+ monitorResize:false,
+
+ activeItem : null,
+
+ constructor : function(config){
+ this.id = Ext.id(null, 'ext-layout-');
+ Ext.apply(this, config);
+ },
+
+ type: 'container',
+
+
+ IEMeasureHack : function(target, viewFlag) {
+ var tChildren = target.dom.childNodes, tLen = tChildren.length, c, d = [], e, i, ret;
+ for (i = 0 ; i < tLen ; i++) {
+ c = tChildren[i];
+ e = Ext.get(c);
+ if (e) {
+ d[i] = e.getStyle('display');
+ e.setStyle({display: 'none'});
+ }
+ }
+ ret = target ? target.getViewSize(viewFlag) : {};
+ for (i = 0 ; i < tLen ; i++) {
+ c = tChildren[i];
+ e = Ext.get(c);
+ if (e) {
+ e.setStyle({display: d[i]});
+ }
+ }
+ return ret;
+ },
+
+
+ getLayoutTargetSize : Ext.EmptyFn,
+
+
+ layout : function(){
+ var ct = this.container, target = ct.getLayoutTarget();
+ if(!(this.hasLayout || Ext.isEmpty(this.targetCls))){
+ target.addClass(this.targetCls);
+ }
+ this.onLayout(ct, target);
+ ct.fireEvent('afterlayout', ct, this);
+ },
+
+
+ onLayout : function(ct, target){
+ this.renderAll(ct, target);
+ },
+
+
+ isValidParent : function(c, target){
+ return target && c.getPositionEl().dom.parentNode == (target.dom || target);
+ },
+
+
+ renderAll : function(ct, target){
+ var items = ct.items.items, i, c, len = items.length;
+ for(i = 0; i < len; i++) {
+ c = items[i];
+ if(c && (!c.rendered || !this.isValidParent(c, target))){
+ this.renderItem(c, i, target);
+ }
+ }
+ },
+
+
+ renderItem : function(c, position, target){
+ if (c) {
+ if (!c.rendered) {
+ c.render(target, position);
+ this.configureItem(c);
+ } else if (!this.isValidParent(c, target)) {
+ if (Ext.isNumber(position)) {
+ position = target.dom.childNodes[position];
+ }
+
+ target.dom.insertBefore(c.getPositionEl().dom, position || null);
+ c.container = target;
+ this.configureItem(c);
+ }
+ }
+ },
+
+
+
+ getRenderedItems: function(ct){
+ var t = ct.getLayoutTarget(), cti = ct.items.items, len = cti.length, i, c, items = [];
+ for (i = 0; i < len; i++) {
+ if((c = cti[i]).rendered && this.isValidParent(c, t) && c.shouldLayout !== false){
+ items.push(c);
+ }
+ };
+ return items;
+ },
+
+
+ configureItem: function(c){
+ if (this.extraCls) {
+ var t = c.getPositionEl ? c.getPositionEl() : c;
+ t.addClass(this.extraCls);
+ }
+
+
+ if (c.doLayout && this.forceLayout) {
+ c.doLayout();
+ }
+ if (this.renderHidden && c != this.activeItem) {
+ c.hide();
+ }
+ },
+
+ onRemove: function(c){
+ if(this.activeItem == c){
+ delete this.activeItem;
+ }
+ if(c.rendered && this.extraCls){
+ var t = c.getPositionEl ? c.getPositionEl() : c;
+ t.removeClass(this.extraCls);
+ }
+ },
+
+ afterRemove: function(c){
+ if(c.removeRestore){
+ c.removeMode = 'container';
+ delete c.removeRestore;
+ }
+ },
+
+
+ onResize: function(){
+ var ct = this.container,
+ b;
+ if(ct.collapsed){
+ return;
+ }
+ if(b = ct.bufferResize && ct.shouldBufferLayout()){
+ if(!this.resizeTask){
+ this.resizeTask = new Ext.util.DelayedTask(this.runLayout, this);
+ this.resizeBuffer = Ext.isNumber(b) ? b : 50;
+ }
+ ct.layoutPending = true;
+ this.resizeTask.delay(this.resizeBuffer);
+ }else{
+ this.runLayout();
+ }
+ },
+
+ runLayout: function(){
+ var ct = this.container;
+ this.layout();
+ ct.onLayout();
+ delete ct.layoutPending;
+ },
+
+
+ setContainer : function(ct){
+
+ if(this.monitorResize && ct != this.container){
+ var old = this.container;
+ if(old){
+ old.un(old.resizeEvent, this.onResize, this);
+ }
+ if(ct){
+ ct.on(ct.resizeEvent, this.onResize, this);
+ }
+ }
+ this.container = ct;
+ },
+
+
+ parseMargins : function(v){
+ if (Ext.isNumber(v)) {
+ v = v.toString();
+ }
+ var ms = v.split(' '),
+ len = ms.length;
+
+ if (len == 1) {
+ ms[1] = ms[2] = ms[3] = ms[0];
+ } else if(len == 2) {
+ ms[2] = ms[0];
+ ms[3] = ms[1];
+ } else if(len == 3) {
+ ms[3] = ms[1];
+ }
+
+ return {
+ top :parseInt(ms[0], 10) || 0,
+ right :parseInt(ms[1], 10) || 0,
+ bottom:parseInt(ms[2], 10) || 0,
+ left :parseInt(ms[3], 10) || 0
+ };
+ },
+
+
+ fieldTpl: (function() {
+ var t = new Ext.Template(
+ '<div class="x-form-item {itemCls}" tabIndex="-1">',
+ '<label for="{id}" style="{labelStyle}" class="x-form-item-label">{label}{labelSeparator}</label>',
+ '<div class="x-form-element" id="x-form-el-{id}" style="{elementStyle}">',
+ '</div><div class="{clearCls}"></div>',
+ '</div>'
+ );
+ t.disableFormats = true;
+ return t.compile();
+ })(),
+
+
+ destroy : function(){
+
+ if(this.resizeTask && this.resizeTask.cancel){
+ this.resizeTask.cancel();
+ }
+ if(this.container) {
+ this.container.un(this.container.resizeEvent, this.onResize, this);
+ }
+ if(!Ext.isEmpty(this.targetCls)){
+ var target = this.container.getLayoutTarget();
+ if(target){
+ target.removeClass(this.targetCls);
+ }
+ }
+ }
+});
+Ext.layout.AutoLayout = Ext.extend(Ext.layout.ContainerLayout, {
+ type: 'auto',
+
+ monitorResize: true,
+
+ onLayout : function(ct, target){
+ Ext.layout.AutoLayout.superclass.onLayout.call(this, ct, target);
+ var cs = this.getRenderedItems(ct), len = cs.length, i, c;
+ for(i = 0; i < len; i++){
+ c = cs[i];
+ if (c.doLayout){
+
+ c.doLayout(true);
+ }
+ }
+ }
+});
+
+Ext.Container.LAYOUTS['auto'] = Ext.layout.AutoLayout;
+
+Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, {
+
+ monitorResize:true,
+
+ type: 'fit',
+
+ getLayoutTargetSize : function() {
+ var target = this.container.getLayoutTarget();
+ if (!target) {
+ return {};
+ }
+
+ return target.getStyleSize();
+ },
+
+
+ onLayout : function(ct, target){
+ Ext.layout.FitLayout.superclass.onLayout.call(this, ct, target);
+ if(!ct.collapsed){
+ this.setItemSize(this.activeItem || ct.items.itemAt(0), this.getLayoutTargetSize());
+ }
+ },
+
+
+ setItemSize : function(item, size){
+ if(item && size.height > 0){
+ item.setSize(size);
+ }
+ }
+});
+Ext.Container.LAYOUTS['fit'] = Ext.layout.FitLayout;
+Ext.layout.CardLayout = Ext.extend(Ext.layout.FitLayout, {
+
+ deferredRender : false,
+
+
+ layoutOnCardChange : false,
+
+
+
+ renderHidden : true,
+
+ type: 'card',
+
+
+ setActiveItem : function(item){
+ var ai = this.activeItem,
+ ct = this.container;
+ item = ct.getComponent(item);
+
+
+ if(item && ai != item){
+
+
+ if(ai){
+ ai.hide();
+ if (ai.hidden !== true) {
+ return false;
+ }
+ ai.fireEvent('deactivate', ai);
+ }
+
+ var layout = item.doLayout && (this.layoutOnCardChange || !item.rendered);
+
+
+ this.activeItem = item;
+
+
+
+ delete item.deferLayout;
+
+
+ item.show();
+
+ this.layout();
+
+ if(layout){
+ item.doLayout();
+ }
+ item.fireEvent('activate', item);
+ }
+ },
+
+
+ renderAll : function(ct, target){
+ if(this.deferredRender){
+ this.renderItem(this.activeItem, undefined, target);
+ }else{
+ Ext.layout.CardLayout.superclass.renderAll.call(this, ct, target);
+ }
+ }
+});
+Ext.Container.LAYOUTS['card'] = Ext.layout.CardLayout;
+
+Ext.layout.AnchorLayout = Ext.extend(Ext.layout.ContainerLayout, {
+
+
+
+ monitorResize : true,
+
+ type : 'anchor',
+
+
+ defaultAnchor : '100%',
+
+ parseAnchorRE : /^(r|right|b|bottom)$/i,
+
+
+ getLayoutTargetSize : function() {
+ var target = this.container.getLayoutTarget(), ret = {};
+ if (target) {
+ ret = target.getViewSize();
+
+
+
+
+ if (Ext.isIE9m && Ext.isStrict && ret.width == 0){
+ ret = target.getStyleSize();
+ }
+ ret.width -= target.getPadding('lr');
+ ret.height -= target.getPadding('tb');
+ }
+ return ret;
+ },
+
+
+ onLayout : function(container, target) {
+ Ext.layout.AnchorLayout.superclass.onLayout.call(this, container, target);
+
+ var size = this.getLayoutTargetSize(),
+ containerWidth = size.width,
+ containerHeight = size.height,
+ overflow = target.getStyle('overflow'),
+ components = this.getRenderedItems(container),
+ len = components.length,
+ boxes = [],
+ box,
+ anchorWidth,
+ anchorHeight,
+ component,
+ anchorSpec,
+ calcWidth,
+ calcHeight,
+ anchorsArray,
+ totalHeight = 0,
+ i,
+ el;
+
+ if(containerWidth < 20 && containerHeight < 20){
+ return;
+ }
+
+
+ if(container.anchorSize) {
+ if(typeof container.anchorSize == 'number') {
+ anchorWidth = container.anchorSize;
+ } else {
+ anchorWidth = container.anchorSize.width;
+ anchorHeight = container.anchorSize.height;
+ }
+ } else {
+ anchorWidth = container.initialConfig.width;
+ anchorHeight = container.initialConfig.height;
+ }
+
+ for(i = 0; i < len; i++) {
+ component = components[i];
+ el = component.getPositionEl();
+
+
+ if (!component.anchor && component.items && !Ext.isNumber(component.width) && !(Ext.isIE6 && Ext.isStrict)){
+ component.anchor = this.defaultAnchor;
+ }
+
+ if(component.anchor) {
+ anchorSpec = component.anchorSpec;
+
+ if(!anchorSpec){
+ anchorsArray = component.anchor.split(' ');
+ component.anchorSpec = anchorSpec = {
+ right: this.parseAnchor(anchorsArray[0], component.initialConfig.width, anchorWidth),
+ bottom: this.parseAnchor(anchorsArray[1], component.initialConfig.height, anchorHeight)
+ };
+ }
+ calcWidth = anchorSpec.right ? this.adjustWidthAnchor(anchorSpec.right(containerWidth) - el.getMargins('lr'), component) : undefined;
+ calcHeight = anchorSpec.bottom ? this.adjustHeightAnchor(anchorSpec.bottom(containerHeight) - el.getMargins('tb'), component) : undefined;
+
+ if(calcWidth || calcHeight) {
+ boxes.push({
+ component: component,
+ width: calcWidth || undefined,
+ height: calcHeight || undefined
+ });
+ }
+ }
+ }
+ for (i = 0, len = boxes.length; i < len; i++) {
+ box = boxes[i];
+ box.component.setSize(box.width, box.height);
+ }
+
+ if (overflow && overflow != 'hidden' && !this.adjustmentPass) {
+ var newTargetSize = this.getLayoutTargetSize();
+ if (newTargetSize.width != size.width || newTargetSize.height != size.height){
+ this.adjustmentPass = true;
+ this.onLayout(container, target);
+ }
+ }
+
+ delete this.adjustmentPass;
+ },
+
+
+ parseAnchor : function(a, start, cstart) {
+ if (a && a != 'none') {
+ var last;
+
+ if (this.parseAnchorRE.test(a)) {
+ var diff = cstart - start;
+ return function(v){
+ if(v !== last){
+ last = v;
+ return v - diff;
+ }
+ };
+
+ } else if(a.indexOf('%') != -1) {
+ var ratio = parseFloat(a.replace('%', ''))*.01;
+ return function(v){
+ if(v !== last){
+ last = v;
+ return Math.floor(v*ratio);
+ }
+ };
+
+ } else {
+ a = parseInt(a, 10);
+ if (!isNaN(a)) {
+ return function(v) {
+ if (v !== last) {
+ last = v;
+ return v + a;
+ }
+ };
+ }
+ }
+ }
+ return false;
+ },
+
+
+ adjustWidthAnchor : function(value, comp){
+ return value;
+ },
+
+
+ adjustHeightAnchor : function(value, comp){
+ return value;
+ }
+
+
+});
+Ext.Container.LAYOUTS['anchor'] = Ext.layout.AnchorLayout;
+
+Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, {
+
+ monitorResize:true,
+
+ type: 'column',
+
+ extraCls: 'x-column',
+
+ scrollOffset : 0,
+
+
+
+ targetCls: 'x-column-layout-ct',
+
+ isValidParent : function(c, target){
+ return this.innerCt && c.getPositionEl().dom.parentNode == this.innerCt.dom;
+ },
+
+ getLayoutTargetSize : function() {
+ var target = this.container.getLayoutTarget(), ret;
+ if (target) {
+ ret = target.getViewSize();
+
+
+
+
+ if (Ext.isIE9m && Ext.isStrict && ret.width == 0){
+ ret = target.getStyleSize();
+ }
+
+ ret.width -= target.getPadding('lr');
+ ret.height -= target.getPadding('tb');
+ }
+ return ret;
+ },
+
+ renderAll : function(ct, target) {
+ if(!this.innerCt){
+
+
+ this.innerCt = target.createChild({cls:'x-column-inner'});
+ this.innerCt.createChild({cls:'x-clear'});
+ }
+ Ext.layout.ColumnLayout.superclass.renderAll.call(this, ct, this.innerCt);
+ },
+
+
+ onLayout : function(ct, target){
+ var cs = ct.items.items,
+ len = cs.length,
+ c,
+ i,
+ m,
+ margins = [];
+
+ this.renderAll(ct, target);
+
+ var size = this.getLayoutTargetSize();
+
+ if (Ext.isIE9m && (size.width < 1 && size.height < 1)) {
+ return;
+ }
+
+ var w = size.width - this.scrollOffset,
+ h = size.height,
+ pw = w;
+
+ this.innerCt.setWidth(w);
+
+
+
+
+ for(i = 0; i < len; i++){
+ c = cs[i];
+ m = c.getPositionEl().getMargins('lr');
+ margins[i] = m;
+ if(!c.columnWidth){
+ pw -= (c.getWidth() + m);
+ }
+ }
+
+ pw = pw < 0 ? 0 : pw;
+
+ for(i = 0; i < len; i++){
+ c = cs[i];
+ m = margins[i];
+ if(c.columnWidth){
+ c.setSize(Math.floor(c.columnWidth * pw) - m);
+ }
+ }
+
+
+
+ if (Ext.isIE9m) {
+ if (i = target.getStyle('overflow') && i != 'hidden' && !this.adjustmentPass) {
+ var ts = this.getLayoutTargetSize();
+ if (ts.width != size.width){
+ this.adjustmentPass = true;
+ this.onLayout(ct, target);
+ }
+ }
+ }
+ delete this.adjustmentPass;
+ }
+
+
+});
+
+Ext.Container.LAYOUTS['column'] = Ext.layout.ColumnLayout;
+
+Ext.layout.BorderLayout = Ext.extend(Ext.layout.ContainerLayout, {
+
+ monitorResize:true,
+
+ rendered : false,
+
+ type: 'border',
+
+ targetCls: 'x-border-layout-ct',
+
+ getLayoutTargetSize : function() {
+ var target = this.container.getLayoutTarget();
+ return target ? target.getViewSize() : {};
+ },
+
+
+ onLayout : function(ct, target){
+ var collapsed, i, c, pos, items = ct.items.items, len = items.length;
+ if(!this.rendered){
+ collapsed = [];
+ for(i = 0; i < len; i++) {
+ c = items[i];
+ pos = c.region;
+ if(c.collapsed){
+ collapsed.push(c);
+ }
+ c.collapsed = false;
+ if(!c.rendered){
+ c.render(target, i);
+ c.getPositionEl().addClass('x-border-panel');
+ }
+ this[pos] = pos != 'center' && c.split ?
+ new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) :
+ new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos);
+ this[pos].render(target, c);
+ }
+ this.rendered = true;
+ }
+
+ var size = this.getLayoutTargetSize();
+ if(size.width < 20 || size.height < 20){
+ if(collapsed){
+ this.restoreCollapsed = collapsed;
+ }
+ return;
+ }else if(this.restoreCollapsed){
+ collapsed = this.restoreCollapsed;
+ delete this.restoreCollapsed;
+ }
+
+ var w = size.width, h = size.height,
+ centerW = w, centerH = h, centerY = 0, centerX = 0,
+ n = this.north, s = this.south, west = this.west, e = this.east, c = this.center,
+ b, m, totalWidth, totalHeight;
+ if(!c && Ext.layout.BorderLayout.WARN !== false){
+ throw 'No center region defined in BorderLayout ' + ct.id;
+ }
+
+ if(n && n.isVisible()){
+ b = n.getSize();
+ m = n.getMargins();
+ b.width = w - (m.left+m.right);
+ b.x = m.left;
+ b.y = m.top;
+ centerY = b.height + b.y + m.bottom;
+ centerH -= centerY;
+ n.applyLayout(b);
+ }
+ if(s && s.isVisible()){
+ b = s.getSize();
+ m = s.getMargins();
+ b.width = w - (m.left+m.right);
+ b.x = m.left;
+ totalHeight = (b.height + m.top + m.bottom);
+ b.y = h - totalHeight + m.top;
+ centerH -= totalHeight;
+ s.applyLayout(b);
+ }
+ if(west && west.isVisible()){
+ b = west.getSize();
+ m = west.getMargins();
+ b.height = centerH - (m.top+m.bottom);
+ b.x = m.left;
+ b.y = centerY + m.top;
+ totalWidth = (b.width + m.left + m.right);
+ centerX += totalWidth;
+ centerW -= totalWidth;
+ west.applyLayout(b);
+ }
+ if(e && e.isVisible()){
+ b = e.getSize();
+ m = e.getMargins();
+ b.height = centerH - (m.top+m.bottom);
+ totalWidth = (b.width + m.left + m.right);
+ b.x = w - totalWidth + m.left;
+ b.y = centerY + m.top;
+ centerW -= totalWidth;
+ e.applyLayout(b);
+ }
+ if(c){
+ m = c.getMargins();
+ var centerBox = {
+ x: centerX + m.left,
+ y: centerY + m.top,
+ width: centerW - (m.left+m.right),
+ height: centerH - (m.top+m.bottom)
+ };
+ c.applyLayout(centerBox);
+ }
+ if(collapsed){
+ for(i = 0, len = collapsed.length; i < len; i++){
+ collapsed[i].collapse(false);
+ }
+ }
+ if(Ext.isIE9m && Ext.isStrict){
+ target.repaint();
+ }
+
+ if (i = target.getStyle('overflow') && i != 'hidden' && !this.adjustmentPass) {
+ var ts = this.getLayoutTargetSize();
+ if (ts.width != size.width || ts.height != size.height){
+ this.adjustmentPass = true;
+ this.onLayout(ct, target);
+ }
+ }
+ delete this.adjustmentPass;
+ },
+
+ destroy: function() {
+ var r = ['north', 'south', 'east', 'west'], i, region;
+ for (i = 0; i < r.length; i++) {
+ region = this[r[i]];
+ if(region){
+ if(region.destroy){
+ region.destroy();
+ }else if (region.split){
+ region.split.destroy(true);
+ }
+ }
+ }
+ Ext.layout.BorderLayout.superclass.destroy.call(this);
+ }
+
+
+});
+
+
+Ext.layout.BorderLayout.Region = function(layout, config, pos){
+ Ext.apply(this, config);
+ this.layout = layout;
+ this.position = pos;
+ this.state = {};
+ if(typeof this.margins == 'string'){
+ this.margins = this.layout.parseMargins(this.margins);
+ }
+ this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins);
+ if(this.collapsible){
+ if(typeof this.cmargins == 'string'){
+ this.cmargins = this.layout.parseMargins(this.cmargins);
+ }
+ if(this.collapseMode == 'mini' && !this.cmargins){
+ this.cmargins = {left:0,top:0,right:0,bottom:0};
+ }else{
+ this.cmargins = Ext.applyIf(this.cmargins || {},
+ pos == 'north' || pos == 'south' ? this.defaultNSCMargins : this.defaultEWCMargins);
+ }
+ }
+};
+
+Ext.layout.BorderLayout.Region.prototype = {
+
+
+
+
+
+
+ collapsible : false,
+
+ split:false,
+
+ floatable: true,
+
+ minWidth:50,
+
+ minHeight:50,
+
+
+ defaultMargins : {left:0,top:0,right:0,bottom:0},
+
+ defaultNSCMargins : {left:5,top:5,right:5,bottom:5},
+
+ defaultEWCMargins : {left:5,top:0,right:5,bottom:0},
+ floatingZIndex: 100,
+
+
+ isCollapsed : false,
+
+
+
+
+
+
+ render : function(ct, p){
+ this.panel = p;
+ p.el.enableDisplayMode();
+ this.targetEl = ct;
+ this.el = p.el;
+
+ var gs = p.getState, ps = this.position;
+ p.getState = function(){
+ return Ext.apply(gs.call(p) || {}, this.state);
+ }.createDelegate(this);
+
+ if(ps != 'center'){
+ p.allowQueuedExpand = false;
+ p.on({
+ beforecollapse: this.beforeCollapse,
+ collapse: this.onCollapse,
+ beforeexpand: this.beforeExpand,
+ expand: this.onExpand,
+ hide: this.onHide,
+ show: this.onShow,
+ scope: this
+ });
+ if(this.collapsible || this.floatable){
+ p.collapseEl = 'el';
+ p.slideAnchor = this.getSlideAnchor();
+ }
+ if(p.tools && p.tools.toggle){
+ p.tools.toggle.addClass('x-tool-collapse-'+ps);
+ p.tools.toggle.addClassOnOver('x-tool-collapse-'+ps+'-over');
+ }
+ }
+ },
+
+
+ getCollapsedEl : function(){
+ if(!this.collapsedEl){
+ if(!this.toolTemplate){
+ var tt = new Ext.Template(
+ '<div class="x-tool x-tool-{id}">&#160;</div>'
+ );
+ tt.disableFormats = true;
+ tt.compile();
+ Ext.layout.BorderLayout.Region.prototype.toolTemplate = tt;
+ }
+ this.collapsedEl = this.targetEl.createChild({
+ cls: "x-layout-collapsed x-layout-collapsed-"+this.position,
+ id: this.panel.id + '-xcollapsed'
+ });
+ this.collapsedEl.enableDisplayMode('block');
+
+ if(this.collapseMode == 'mini'){
+ this.collapsedEl.addClass('x-layout-cmini-'+this.position);
+ this.miniCollapsedEl = this.collapsedEl.createChild({
+ cls: "x-layout-mini x-layout-mini-"+this.position, html: "&#160;"
+ });
+ this.miniCollapsedEl.addClassOnOver('x-layout-mini-over');
+ this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
+ this.collapsedEl.on('click', this.onExpandClick, this, {stopEvent:true});
+ }else {
+ if(this.collapsible !== false && !this.hideCollapseTool) {
+ var t = this.expandToolEl = this.toolTemplate.append(
+ this.collapsedEl.dom,
+ {id:'expand-'+this.position}, true);
+ t.addClassOnOver('x-tool-expand-'+this.position+'-over');
+ t.on('click', this.onExpandClick, this, {stopEvent:true});
+ }
+ if(this.floatable !== false || this.titleCollapse){
+ this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
+ this.collapsedEl.on("click", this[this.floatable ? 'collapseClick' : 'onExpandClick'], this);
+ }
+ }
+ }
+ return this.collapsedEl;
+ },
+
+
+ onExpandClick : function(e){
+ if(this.isSlid){
+ this.panel.expand(false);
+ }else{
+ this.panel.expand();
+ }
+ },
+
+
+ onCollapseClick : function(e){
+ this.panel.collapse();
+ },
+
+
+ beforeCollapse : function(p, animate){
+ this.lastAnim = animate;
+ if(this.splitEl){
+ this.splitEl.hide();
+ }
+ this.getCollapsedEl().show();
+ var el = this.panel.getEl();
+ this.originalZIndex = el.getStyle('z-index');
+ el.setStyle('z-index', 100);
+ this.isCollapsed = true;
+ this.layout.layout();
+ },
+
+
+ onCollapse : function(animate){
+ this.panel.el.setStyle('z-index', 1);
+ if(this.lastAnim === false || this.panel.animCollapse === false){
+ this.getCollapsedEl().dom.style.visibility = 'visible';
+ }else{
+ this.getCollapsedEl().slideIn(this.panel.slideAnchor, {duration:.2});
+ }
+ this.state.collapsed = true;
+ this.panel.saveState();
+ },
+
+
+ beforeExpand : function(animate){
+ if(this.isSlid){
+ this.afterSlideIn();
+ }
+ var c = this.getCollapsedEl();
+ this.el.show();
+ if(this.position == 'east' || this.position == 'west'){
+ this.panel.setSize(undefined, c.getHeight());
+ }else{
+ this.panel.setSize(c.getWidth(), undefined);
+ }
+ c.hide();
+ c.dom.style.visibility = 'hidden';
+ this.panel.el.setStyle('z-index', this.floatingZIndex);
+ },
+
+
+ onExpand : function(){
+ this.isCollapsed = false;
+ if(this.splitEl){
+ this.splitEl.show();
+ }
+ this.layout.layout();
+ this.panel.el.setStyle('z-index', this.originalZIndex);
+ this.state.collapsed = false;
+ this.panel.saveState();
+ },
+
+
+ collapseClick : function(e){
+ if(this.isSlid){
+ e.stopPropagation();
+ this.slideIn();
+ }else{
+ e.stopPropagation();
+ this.slideOut();
+ }
+ },
+
+
+ onHide : function(){
+ if(this.isCollapsed){
+ this.getCollapsedEl().hide();
+ }else if(this.splitEl){
+ this.splitEl.hide();
+ }
+ },
+
+
+ onShow : function(){
+ if(this.isCollapsed){
+ this.getCollapsedEl().show();
+ }else if(this.splitEl){
+ this.splitEl.show();
+ }
+ },
+
+
+ isVisible : function(){
+ return !this.panel.hidden;
+ },
+
+
+ getMargins : function(){
+ return this.isCollapsed && this.cmargins ? this.cmargins : this.margins;
+ },
+
+
+ getSize : function(){
+ return this.isCollapsed ? this.getCollapsedEl().getSize() : this.panel.getSize();
+ },
+
+
+ setPanel : function(panel){
+ this.panel = panel;
+ },
+
+
+ getMinWidth: function(){
+ return this.minWidth;
+ },
+
+
+ getMinHeight: function(){
+ return this.minHeight;
+ },
+
+
+ applyLayoutCollapsed : function(box){
+ var ce = this.getCollapsedEl();
+ ce.setLeftTop(box.x, box.y);
+ ce.setSize(box.width, box.height);
+ },
+
+
+ applyLayout : function(box){
+ if(this.isCollapsed){
+ this.applyLayoutCollapsed(box);
+ }else{
+ this.panel.setPosition(box.x, box.y);
+ this.panel.setSize(box.width, box.height);
+ }
+ },
+
+
+ beforeSlide: function(){
+ this.panel.beforeEffect();
+ },
+
+
+ afterSlide : function(){
+ this.panel.afterEffect();
+ },
+
+
+ initAutoHide : function(){
+ if(this.autoHide !== false){
+ if(!this.autoHideHd){
+ this.autoHideSlideTask = new Ext.util.DelayedTask(this.slideIn, this);
+ this.autoHideHd = {
+ "mouseout": function(e){
+ if(!e.within(this.el, true)){
+ this.autoHideSlideTask.delay(500);
+ }
+ },
+ "mouseover" : function(e){
+ this.autoHideSlideTask.cancel();
+ },
+ scope : this
+ };
+ }
+ this.el.on(this.autoHideHd);
+ this.collapsedEl.on(this.autoHideHd);
+ }
+ },
+
+
+ clearAutoHide : function(){
+ if(this.autoHide !== false){
+ this.el.un("mouseout", this.autoHideHd.mouseout);
+ this.el.un("mouseover", this.autoHideHd.mouseover);
+ this.collapsedEl.un("mouseout", this.autoHideHd.mouseout);
+ this.collapsedEl.un("mouseover", this.autoHideHd.mouseover);
+ }
+ },
+
+
+ clearMonitor : function(){
+ Ext.getDoc().un("click", this.slideInIf, this);
+ },
+
+
+ slideOut : function(){
+ if(this.isSlid || this.el.hasActiveFx()){
+ return;
+ }
+ this.isSlid = true;
+ var ts = this.panel.tools, dh, pc;
+ if(ts && ts.toggle){
+ ts.toggle.hide();
+ }
+ this.el.show();
+
+
+ pc = this.panel.collapsed;
+ this.panel.collapsed = false;
+
+ if(this.position == 'east' || this.position == 'west'){
+
+ dh = this.panel.deferHeight;
+ this.panel.deferHeight = false;
+
+ this.panel.setSize(undefined, this.collapsedEl.getHeight());
+
+
+ this.panel.deferHeight = dh;
+ }else{
+ this.panel.setSize(this.collapsedEl.getWidth(), undefined);
+ }
+
+
+ this.panel.collapsed = pc;
+
+ this.restoreLT = [this.el.dom.style.left, this.el.dom.style.top];
+ this.el.alignTo(this.collapsedEl, this.getCollapseAnchor());
+ this.el.setStyle("z-index", this.floatingZIndex+2);
+ this.panel.el.replaceClass('x-panel-collapsed', 'x-panel-floating');
+ if(this.animFloat !== false){
+ this.beforeSlide();
+ this.el.slideIn(this.getSlideAnchor(), {
+ callback: function(){
+ this.afterSlide();
+ this.initAutoHide();
+ Ext.getDoc().on("click", this.slideInIf, this);
+ },
+ scope: this,
+ block: true
+ });
+ }else{
+ this.initAutoHide();
+ Ext.getDoc().on("click", this.slideInIf, this);
+ }
+ },
+
+
+ afterSlideIn : function(){
+ this.clearAutoHide();
+ this.isSlid = false;
+ this.clearMonitor();
+ this.el.setStyle("z-index", "");
+ this.panel.el.replaceClass('x-panel-floating', 'x-panel-collapsed');
+ this.el.dom.style.left = this.restoreLT[0];
+ this.el.dom.style.top = this.restoreLT[1];
+
+ var ts = this.panel.tools;
+ if(ts && ts.toggle){
+ ts.toggle.show();
+ }
+ },
+
+
+ slideIn : function(cb){
+ if(!this.isSlid || this.el.hasActiveFx()){
+ Ext.callback(cb);
+ return;
+ }
+ this.isSlid = false;
+ if(this.animFloat !== false){
+ this.beforeSlide();
+ this.el.slideOut(this.getSlideAnchor(), {
+ callback: function(){
+ this.el.hide();
+ this.afterSlide();
+ this.afterSlideIn();
+ Ext.callback(cb);
+ },
+ scope: this,
+ block: true
+ });
+ }else{
+ this.el.hide();
+ this.afterSlideIn();
+ }
+ },
+
+
+ slideInIf : function(e){
+ if(!e.within(this.el)){
+ this.slideIn();
+ }
+ },
+
+
+ anchors : {
+ "west" : "left",
+ "east" : "right",
+ "north" : "top",
+ "south" : "bottom"
+ },
+
+
+ sanchors : {
+ "west" : "l",
+ "east" : "r",
+ "north" : "t",
+ "south" : "b"
+ },
+
+
+ canchors : {
+ "west" : "tl-tr",
+ "east" : "tr-tl",
+ "north" : "tl-bl",
+ "south" : "bl-tl"
+ },
+
+
+ getAnchor : function(){
+ return this.anchors[this.position];
+ },
+
+
+ getCollapseAnchor : function(){
+ return this.canchors[this.position];
+ },
+
+
+ getSlideAnchor : function(){
+ return this.sanchors[this.position];
+ },
+
+
+ getAlignAdj : function(){
+ var cm = this.cmargins;
+ switch(this.position){
+ case "west":
+ return [0, 0];
+ break;
+ case "east":
+ return [0, 0];
+ break;
+ case "north":
+ return [0, 0];
+ break;
+ case "south":
+ return [0, 0];
+ break;
+ }
+ },
+
+
+ getExpandAdj : function(){
+ var c = this.collapsedEl, cm = this.cmargins;
+ switch(this.position){
+ case "west":
+ return [-(cm.right+c.getWidth()+cm.left), 0];
+ break;
+ case "east":
+ return [cm.right+c.getWidth()+cm.left, 0];
+ break;
+ case "north":
+ return [0, -(cm.top+cm.bottom+c.getHeight())];
+ break;
+ case "south":
+ return [0, cm.top+cm.bottom+c.getHeight()];
+ break;
+ }
+ },
+
+ destroy : function(){
+ if (this.autoHideSlideTask && this.autoHideSlideTask.cancel){
+ this.autoHideSlideTask.cancel();
+ }
+ Ext.destroyMembers(this, 'miniCollapsedEl', 'collapsedEl', 'expandToolEl');
+ }
+};
+
+
+Ext.layout.BorderLayout.SplitRegion = function(layout, config, pos){
+ Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, layout, config, pos);
+
+ this.applyLayout = this.applyFns[pos];
+};
+
+Ext.extend(Ext.layout.BorderLayout.SplitRegion, Ext.layout.BorderLayout.Region, {
+
+
+ splitTip : "Drag to resize.",
+
+ collapsibleSplitTip : "Drag to resize. Double click to hide.",
+
+ useSplitTips : false,
+
+
+ splitSettings : {
+ north : {
+ orientation: Ext.SplitBar.VERTICAL,
+ placement: Ext.SplitBar.TOP,
+ maxFn : 'getVMaxSize',
+ minProp: 'minHeight',
+ maxProp: 'maxHeight'
+ },
+ south : {
+ orientation: Ext.SplitBar.VERTICAL,
+ placement: Ext.SplitBar.BOTTOM,
+ maxFn : 'getVMaxSize',
+ minProp: 'minHeight',
+ maxProp: 'maxHeight'
+ },
+ east : {
+ orientation: Ext.SplitBar.HORIZONTAL,
+ placement: Ext.SplitBar.RIGHT,
+ maxFn : 'getHMaxSize',
+ minProp: 'minWidth',
+ maxProp: 'maxWidth'
+ },
+ west : {
+ orientation: Ext.SplitBar.HORIZONTAL,
+ placement: Ext.SplitBar.LEFT,
+ maxFn : 'getHMaxSize',
+ minProp: 'minWidth',
+ maxProp: 'maxWidth'
+ }
+ },
+
+
+ applyFns : {
+ west : function(box){
+ if(this.isCollapsed){
+ return this.applyLayoutCollapsed(box);
+ }
+ var sd = this.splitEl.dom, s = sd.style;
+ this.panel.setPosition(box.x, box.y);
+ var sw = sd.offsetWidth;
+ s.left = (box.x+box.width-sw)+'px';
+ s.top = (box.y)+'px';
+ s.height = Math.max(0, box.height)+'px';
+ this.panel.setSize(box.width-sw, box.height);
+ },
+ east : function(box){
+ if(this.isCollapsed){
+ return this.applyLayoutCollapsed(box);
+ }
+ var sd = this.splitEl.dom, s = sd.style;
+ var sw = sd.offsetWidth;
+ this.panel.setPosition(box.x+sw, box.y);
+ s.left = (box.x)+'px';
+ s.top = (box.y)+'px';
+ s.height = Math.max(0, box.height)+'px';
+ this.panel.setSize(box.width-sw, box.height);
+ },
+ north : function(box){
+ if(this.isCollapsed){
+ return this.applyLayoutCollapsed(box);
+ }
+ var sd = this.splitEl.dom, s = sd.style;
+ var sh = sd.offsetHeight;
+ this.panel.setPosition(box.x, box.y);
+ s.left = (box.x)+'px';
+ s.top = (box.y+box.height-sh)+'px';
+ s.width = Math.max(0, box.width)+'px';
+ this.panel.setSize(box.width, box.height-sh);
+ },
+ south : function(box){
+ if(this.isCollapsed){
+ return this.applyLayoutCollapsed(box);
+ }
+ var sd = this.splitEl.dom, s = sd.style;
+ var sh = sd.offsetHeight;
+ this.panel.setPosition(box.x, box.y+sh);
+ s.left = (box.x)+'px';
+ s.top = (box.y)+'px';
+ s.width = Math.max(0, box.width)+'px';
+ this.panel.setSize(box.width, box.height-sh);
+ }
+ },
+
+
+ render : function(ct, p){
+ Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, ct, p);
+
+ var ps = this.position;
+
+ this.splitEl = ct.createChild({
+ cls: "x-layout-split x-layout-split-"+ps, html: "&#160;",
+ id: this.panel.id + '-xsplit'
+ });
+
+ if(this.collapseMode == 'mini'){
+ this.miniSplitEl = this.splitEl.createChild({
+ cls: "x-layout-mini x-layout-mini-"+ps, html: "&#160;"
+ });
+ this.miniSplitEl.addClassOnOver('x-layout-mini-over');
+ this.miniSplitEl.on('click', this.onCollapseClick, this, {stopEvent:true});
+ }
+
+ var s = this.splitSettings[ps];
+
+ this.split = new Ext.SplitBar(this.splitEl.dom, p.el, s.orientation);
+ this.split.tickSize = this.tickSize;
+ this.split.placement = s.placement;
+ this.split.getMaximumSize = this[s.maxFn].createDelegate(this);
+ this.split.minSize = this.minSize || this[s.minProp];
+ this.split.on("beforeapply", this.onSplitMove, this);
+ this.split.useShim = this.useShim === true;
+ this.maxSize = this.maxSize || this[s.maxProp];
+
+ if(p.hidden){
+ this.splitEl.hide();
+ }
+
+ if(this.useSplitTips){
+ this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip : this.splitTip;
+ }
+ if(this.collapsible){
+ this.splitEl.on("dblclick", this.onCollapseClick, this);
+ }
+ },
+
+
+ getSize : function(){
+ if(this.isCollapsed){
+ return this.collapsedEl.getSize();
+ }
+ var s = this.panel.getSize();
+ if(this.position == 'north' || this.position == 'south'){
+ s.height += this.splitEl.dom.offsetHeight;
+ }else{
+ s.width += this.splitEl.dom.offsetWidth;
+ }
+ return s;
+ },
+
+
+ getHMaxSize : function(){
+ var cmax = this.maxSize || 10000;
+ var center = this.layout.center;
+ return Math.min(cmax, (this.el.getWidth()+center.el.getWidth())-center.getMinWidth());
+ },
+
+
+ getVMaxSize : function(){
+ var cmax = this.maxSize || 10000;
+ var center = this.layout.center;
+ return Math.min(cmax, (this.el.getHeight()+center.el.getHeight())-center.getMinHeight());
+ },
+
+
+ onSplitMove : function(split, newSize){
+ var s = this.panel.getSize();
+ this.lastSplitSize = newSize;
+ if(this.position == 'north' || this.position == 'south'){
+ this.panel.setSize(s.width, newSize);
+ this.state.height = newSize;
+ }else{
+ this.panel.setSize(newSize, s.height);
+ this.state.width = newSize;
+ }
+ this.layout.layout();
+ this.panel.saveState();
+ return false;
+ },
+
+
+ getSplitBar : function(){
+ return this.split;
+ },
+
+
+ destroy : function() {
+ Ext.destroy(this.miniSplitEl, this.split, this.splitEl);
+ Ext.layout.BorderLayout.SplitRegion.superclass.destroy.call(this);
+ }
+});
+
+Ext.Container.LAYOUTS['border'] = Ext.layout.BorderLayout;
+
+Ext.layout.FormLayout = Ext.extend(Ext.layout.AnchorLayout, {
+
+
+ labelSeparator : ':',
+
+
+
+
+ trackLabels: true,
+
+ type: 'form',
+
+ onRemove: function(c){
+ Ext.layout.FormLayout.superclass.onRemove.call(this, c);
+ if(this.trackLabels){
+ c.un('show', this.onFieldShow, this);
+ c.un('hide', this.onFieldHide, this);
+ }
+
+ var el = c.getPositionEl(),
+ ct = c.getItemCt && c.getItemCt();
+ if (c.rendered && ct) {
+ if (el && el.dom) {
+ el.insertAfter(ct);
+ }
+ Ext.destroy(ct);
+ Ext.destroyMembers(c, 'label', 'itemCt');
+ if (c.customItemCt) {
+ Ext.destroyMembers(c, 'getItemCt', 'customItemCt');
+ }
+ }
+ },
+
+
+ setContainer : function(ct){
+ Ext.layout.FormLayout.superclass.setContainer.call(this, ct);
+ ct.labelAlign = ct.labelAlign || this.labelAlign;
+ if (ct.labelAlign) {
+ ct.addClass('x-form-label-' + ct.labelAlign);
+ }
+
+ if (ct.hideLabels || this.hideLabels) {
+ Ext.apply(this, {
+ labelStyle: 'display:none',
+ elementStyle: 'padding-left:0;',
+ labelAdjust: 0
+ });
+ } else {
+ this.labelSeparator = Ext.isDefined(ct.labelSeparator) ? ct.labelSeparator : this.labelSeparator;
+ ct.labelWidth = ct.labelWidth || this.labelWidth || 100;
+ if(Ext.isNumber(ct.labelWidth)){
+ var pad = ct.labelPad || this.labelPad;
+ pad = Ext.isNumber(pad) ? pad : 5;
+ Ext.apply(this, {
+ labelAdjust: ct.labelWidth + pad,
+ labelStyle: 'width:' + ct.labelWidth + 'px;',
+ elementStyle: 'padding-left:' + (ct.labelWidth + pad) + 'px'
+ });
+ }
+ if(ct.labelAlign == 'top'){
+ Ext.apply(this, {
+ labelStyle: 'width:auto;',
+ labelAdjust: 0,
+ elementStyle: 'padding-left:0;'
+ });
+ }
+ }
+ },
+
+
+ isHide: function(c){
+ return c.hideLabel || this.container.hideLabels;
+ },
+
+ onFieldShow: function(c){
+ c.getItemCt().removeClass('x-hide-' + c.hideMode);
+
+
+ if (c.isComposite) {
+ c.doLayout();
+ }
+ },
+
+ onFieldHide: function(c){
+ c.getItemCt().addClass('x-hide-' + c.hideMode);
+ },
+
+
+ getLabelStyle: function(s){
+ var ls = '', items = [this.labelStyle, s];
+ for (var i = 0, len = items.length; i < len; ++i){
+ if (items[i]){
+ ls += items[i];
+ if (ls.substr(-1, 1) != ';'){
+ ls += ';';
+ }
+ }
+ }
+ return ls;
+ },
+
+
+
+
+ renderItem : function(c, position, target){
+ if(c && (c.isFormField || c.fieldLabel) && c.inputType != 'hidden'){
+ var args = this.getTemplateArgs(c);
+ if(Ext.isNumber(position)){
+ position = target.dom.childNodes[position] || null;
+ }
+ if(position){
+ c.itemCt = this.fieldTpl.insertBefore(position, args, true);
+ }else{
+ c.itemCt = this.fieldTpl.append(target, args, true);
+ }
+ if(!c.getItemCt){
+
+
+ Ext.apply(c, {
+ getItemCt: function(){
+ return c.itemCt;
+ },
+ customItemCt: true
+ });
+ }
+ c.label = c.getItemCt().child('label.x-form-item-label');
+ if(!c.rendered){
+ c.render('x-form-el-' + c.id);
+ }else if(!this.isValidParent(c, target)){
+ Ext.fly('x-form-el-' + c.id).appendChild(c.getPositionEl());
+ }
+ if(this.trackLabels){
+ if(c.hidden){
+ this.onFieldHide(c);
+ }
+ c.on({
+ scope: this,
+ show: this.onFieldShow,
+ hide: this.onFieldHide
+ });
+ }
+ this.configureItem(c);
+ }else {
+ Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments);
+ }
+ },
+
+
+ getTemplateArgs: function(field) {
+ var noLabelSep = !field.fieldLabel || field.hideLabel,
+ itemCls = (field.itemCls || this.container.itemCls || '') + (field.hideLabel ? ' x-hide-label' : '');
+
+
+ if (Ext.isIE9 && Ext.isIEQuirks && field instanceof Ext.form.TextField) {
+ itemCls += ' x-input-wrapper';
+ }
+
+ return {
+ id : field.id,
+ label : field.fieldLabel,
+ itemCls : itemCls,
+ clearCls : field.clearCls || 'x-form-clear-left',
+ labelStyle : this.getLabelStyle(field.labelStyle),
+ elementStyle : this.elementStyle || '',
+ labelSeparator: noLabelSep ? '' : (Ext.isDefined(field.labelSeparator) ? field.labelSeparator : this.labelSeparator)
+ };
+ },
+
+
+ adjustWidthAnchor: function(value, c){
+ if(c.label && !this.isHide(c) && (this.container.labelAlign != 'top')){
+ var adjust = Ext.isIE6 || Ext.isIEQuirks;
+ return value - this.labelAdjust + (adjust ? -3 : 0);
+ }
+ return value;
+ },
+
+ adjustHeightAnchor : function(value, c){
+ if(c.label && !this.isHide(c) && (this.container.labelAlign == 'top')){
+ return value - c.label.getHeight();
+ }
+ return value;
+ },
+
+
+ isValidParent : function(c, target){
+ return target && this.container.getEl().contains(c.getPositionEl());
+ }
+
+
+});
+
+Ext.Container.LAYOUTS['form'] = Ext.layout.FormLayout;
+
+Ext.layout.AccordionLayout = Ext.extend(Ext.layout.FitLayout, {
+
+ fill : true,
+
+ autoWidth : true,
+
+ titleCollapse : true,
+
+ hideCollapseTool : false,
+
+ collapseFirst : false,
+
+ animate : false,
+
+ sequence : false,
+
+ activeOnTop : false,
+
+ type: 'accordion',
+
+ renderItem : function(c){
+ if(this.animate === false){
+ c.animCollapse = false;
+ }
+ c.collapsible = true;
+ if(this.autoWidth){
+ c.autoWidth = true;
+ }
+ if(this.titleCollapse){
+ c.titleCollapse = true;
+ }
+ if(this.hideCollapseTool){
+ c.hideCollapseTool = true;
+ }
+ if(this.collapseFirst !== undefined){
+ c.collapseFirst = this.collapseFirst;
+ }
+ if(!this.activeItem && !c.collapsed){
+ this.setActiveItem(c, true);
+ }else if(this.activeItem && this.activeItem != c){
+ c.collapsed = true;
+ }
+ Ext.layout.AccordionLayout.superclass.renderItem.apply(this, arguments);
+ c.header.addClass('x-accordion-hd');
+ c.on('beforeexpand', this.beforeExpand, this);
+ },
+
+ onRemove: function(c){
+ Ext.layout.AccordionLayout.superclass.onRemove.call(this, c);
+ if(c.rendered){
+ c.header.removeClass('x-accordion-hd');
+ }
+ c.un('beforeexpand', this.beforeExpand, this);
+ },
+
+
+ beforeExpand : function(p, anim){
+ var ai = this.activeItem;
+ if(ai){
+ if(this.sequence){
+ delete this.activeItem;
+ if (!ai.collapsed){
+ ai.collapse({callback:function(){
+ p.expand(anim || true);
+ }, scope: this});
+ return false;
+ }
+ }else{
+ ai.collapse(this.animate);
+ }
+ }
+ this.setActive(p);
+ if(this.activeOnTop){
+ p.el.dom.parentNode.insertBefore(p.el.dom, p.el.dom.parentNode.firstChild);
+ }
+
+ this.layout();
+ },
+
+
+ setItemSize : function(item, size){
+ if(this.fill && item){
+ var hh = 0, i, ct = this.getRenderedItems(this.container), len = ct.length, p;
+
+ for (i = 0; i < len; i++) {
+ if((p = ct[i]) != item && !p.hidden){
+ hh += p.header.getHeight();
+ }
+ };
+
+ size.height -= hh;
+
+
+ item.setSize(size);
+ }
+ },
+
+
+ setActiveItem : function(item){
+ this.setActive(item, true);
+ },
+
+
+ setActive : function(item, expand){
+ var ai = this.activeItem;
+ item = this.container.getComponent(item);
+ if(ai != item){
+ if(item.rendered && item.collapsed && expand){
+ item.expand();
+ }else{
+ if(ai){
+ ai.fireEvent('deactivate', ai);
+ }
+ this.activeItem = item;
+ item.fireEvent('activate', item);
+ }
+ }
+ }
+});
+Ext.Container.LAYOUTS.accordion = Ext.layout.AccordionLayout;
+
+
+Ext.layout.Accordion = Ext.layout.AccordionLayout;
+Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, {
+
+
+
+ monitorResize:false,
+
+ type: 'table',
+
+ targetCls: 'x-table-layout-ct',
+
+
+ tableAttrs:null,
+
+
+ setContainer : function(ct){
+ Ext.layout.TableLayout.superclass.setContainer.call(this, ct);
+
+ this.currentRow = 0;
+ this.currentColumn = 0;
+ this.cells = [];
+ },
+
+
+ onLayout : function(ct, target){
+ var cs = ct.items.items, len = cs.length, c, i;
+
+ if(!this.table){
+ target.addClass('x-table-layout-ct');
+
+ this.table = target.createChild(
+ Ext.apply({tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, this.tableAttrs), null, true);
+ }
+ this.renderAll(ct, target);
+ },
+
+
+ getRow : function(index){
+ var row = this.table.tBodies[0].childNodes[index];
+ if(!row){
+ row = document.createElement('tr');
+ this.table.tBodies[0].appendChild(row);
+ }
+ return row;
+ },
+
+
+ getNextCell : function(c){
+ var cell = this.getNextNonSpan(this.currentColumn, this.currentRow);
+ var curCol = this.currentColumn = cell[0], curRow = this.currentRow = cell[1];
+ for(var rowIndex = curRow; rowIndex < curRow + (c.rowspan || 1); rowIndex++){
+ if(!this.cells[rowIndex]){
+ this.cells[rowIndex] = [];
+ }
+ for(var colIndex = curCol; colIndex < curCol + (c.colspan || 1); colIndex++){
+ this.cells[rowIndex][colIndex] = true;
+ }
+ }
+ var td = document.createElement('td');
+ if(c.cellId){
+ td.id = c.cellId;
+ }
+ var cls = 'x-table-layout-cell';
+ if(c.cellCls){
+ cls += ' ' + c.cellCls;
+ }
+ td.className = cls;
+ if(c.colspan){
+ td.colSpan = c.colspan;
+ }
+ if(c.rowspan){
+ td.rowSpan = c.rowspan;
+ }
+ this.getRow(curRow).appendChild(td);
+ return td;
+ },
+
+
+ getNextNonSpan: function(colIndex, rowIndex){
+ var cols = this.columns;
+ while((cols && colIndex >= cols) || (this.cells[rowIndex] && this.cells[rowIndex][colIndex])) {
+ if(cols && colIndex >= cols){
+ rowIndex++;
+ colIndex = 0;
+ }else{
+ colIndex++;
+ }
+ }
+ return [colIndex, rowIndex];
+ },
+
+
+ renderItem : function(c, position, target){
+
+ if(!this.table){
+ this.table = target.createChild(
+ Ext.apply({tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, this.tableAttrs), null, true);
+ }
+ if(c && !c.rendered){
+ c.render(this.getNextCell(c));
+ this.configureItem(c);
+ }else if(c && !this.isValidParent(c, target)){
+ var container = this.getNextCell(c);
+ container.insertBefore(c.getPositionEl().dom, null);
+ c.container = Ext.get(container);
+ this.configureItem(c);
+ }
+ },
+
+
+ isValidParent : function(c, target){
+ return c.getPositionEl().up('table', 5).dom.parentNode === (target.dom || target);
+ },
+
+ destroy: function(){
+ delete this.table;
+ Ext.layout.TableLayout.superclass.destroy.call(this);
+ }
+
+
+});
+
+Ext.Container.LAYOUTS['table'] = Ext.layout.TableLayout;
+Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, {
+
+ extraCls: 'x-abs-layout-item',
+
+ type: 'absolute',
+
+ onLayout : function(ct, target){
+ target.position();
+ this.paddingLeft = target.getPadding('l');
+ this.paddingTop = target.getPadding('t');
+ Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, ct, target);
+ },
+
+
+ adjustWidthAnchor : function(value, comp){
+ return value ? value - comp.getPosition(true)[0] + this.paddingLeft : value;
+ },
+
+
+ adjustHeightAnchor : function(value, comp){
+ return value ? value - comp.getPosition(true)[1] + this.paddingTop : value;
+ }
+
+});
+Ext.Container.LAYOUTS['absolute'] = Ext.layout.AbsoluteLayout;
+
+Ext.layout.BoxLayout = Ext.extend(Ext.layout.ContainerLayout, {
+
+ defaultMargins : {left:0,top:0,right:0,bottom:0},
+
+ padding : '0',
+
+ pack : 'start',
+
+
+ monitorResize : true,
+ type: 'box',
+ scrollOffset : 0,
+ extraCls : 'x-box-item',
+ targetCls : 'x-box-layout-ct',
+ innerCls : 'x-box-inner',
+
+ constructor : function(config){
+ Ext.layout.BoxLayout.superclass.constructor.call(this, config);
+
+ if (Ext.isString(this.defaultMargins)) {
+ this.defaultMargins = this.parseMargins(this.defaultMargins);
+ }
+
+ var handler = this.overflowHandler;
+
+ if (typeof handler == 'string') {
+ handler = {
+ type: handler
+ };
+ }
+
+ var handlerType = 'none';
+ if (handler && handler.type != undefined) {
+ handlerType = handler.type;
+ }
+
+ var constructor = Ext.layout.boxOverflow[handlerType];
+ if (constructor[this.type]) {
+ constructor = constructor[this.type];
+ }
+
+ this.overflowHandler = new constructor(this, handler);
+ },
+
+
+ onLayout: function(container, target) {
+ Ext.layout.BoxLayout.superclass.onLayout.call(this, container, target);
+
+ var tSize = this.getLayoutTargetSize(),
+ items = this.getVisibleItems(container),
+ calcs = this.calculateChildBoxes(items, tSize),
+ boxes = calcs.boxes,
+ meta = calcs.meta;
+
+
+ if (tSize.width > 0) {
+ var handler = this.overflowHandler,
+ method = meta.tooNarrow ? 'handleOverflow' : 'clearOverflow';
+
+ var results = handler[method](calcs, tSize);
+
+ if (results) {
+ if (results.targetSize) {
+ tSize = results.targetSize;
+ }
+
+ if (results.recalculate) {
+ items = this.getVisibleItems(container);
+ calcs = this.calculateChildBoxes(items, tSize);
+ boxes = calcs.boxes;
+ }
+ }
+ }
+
+
+ this.layoutTargetLastSize = tSize;
+
+
+ this.childBoxCache = calcs;
+
+ this.updateInnerCtSize(tSize, calcs);
+ this.updateChildBoxes(boxes);
+
+
+ this.handleTargetOverflow(tSize, container, target);
+ },
+
+
+ updateChildBoxes: function(boxes) {
+ for (var i = 0, length = boxes.length; i < length; i++) {
+ var box = boxes[i],
+ comp = box.component;
+
+ if (box.dirtySize) {
+ comp.setSize(box.width, box.height);
+ }
+
+ if (isNaN(box.left) || isNaN(box.top)) {
+ continue;
+ }
+
+ comp.setPosition(box.left, box.top);
+ }
+ },
+
+
+ updateInnerCtSize: function(tSize, calcs) {
+ var align = this.align,
+ padding = this.padding,
+ width = tSize.width,
+ height = tSize.height;
+
+ if (this.type == 'hbox') {
+ var innerCtWidth = width,
+ innerCtHeight = calcs.meta.maxHeight + padding.top + padding.bottom;
+
+ if (align == 'stretch') {
+ innerCtHeight = height;
+ } else if (align == 'middle') {
+ innerCtHeight = Math.max(height, innerCtHeight);
+ }
+ } else {
+ var innerCtHeight = height,
+ innerCtWidth = calcs.meta.maxWidth + padding.left + padding.right;
+
+ if (align == 'stretch') {
+ innerCtWidth = width;
+ } else if (align == 'center') {
+ innerCtWidth = Math.max(width, innerCtWidth);
+ }
+ }
+
+ this.innerCt.setSize(innerCtWidth || undefined, innerCtHeight || undefined);
+ },
+
+
+ handleTargetOverflow: function(previousTargetSize, container, target) {
+ var overflow = target.getStyle('overflow');
+
+ if (overflow && overflow != 'hidden' &&!this.adjustmentPass) {
+ var newTargetSize = this.getLayoutTargetSize();
+ if (newTargetSize.width != previousTargetSize.width || newTargetSize.height != previousTargetSize.height){
+ this.adjustmentPass = true;
+ this.onLayout(container, target);
+ }
+ }
+
+ delete this.adjustmentPass;
+ },
+
+
+ isValidParent : function(c, target) {
+ return this.innerCt && c.getPositionEl().dom.parentNode == this.innerCt.dom;
+ },
+
+
+ getVisibleItems: function(ct) {
+ var ct = ct || this.container,
+ t = ct.getLayoutTarget(),
+ cti = ct.items.items,
+ len = cti.length,
+
+ i, c, items = [];
+
+ for (i = 0; i < len; i++) {
+ if((c = cti[i]).rendered && this.isValidParent(c, t) && c.hidden !== true && c.collapsed !== true && c.shouldLayout !== false){
+ items.push(c);
+ }
+ }
+
+ return items;
+ },
+
+
+ renderAll : function(ct, target) {
+ if (!this.innerCt) {
+
+ this.innerCt = target.createChild({cls:this.innerCls});
+ this.padding = this.parseMargins(this.padding);
+ }
+ Ext.layout.BoxLayout.superclass.renderAll.call(this, ct, this.innerCt);
+ },
+
+ getLayoutTargetSize : function() {
+ var target = this.container.getLayoutTarget(), ret;
+
+ if (target) {
+ ret = target.getViewSize();
+
+
+
+
+ if (Ext.isIE9m && Ext.isStrict && ret.width == 0){
+ ret = target.getStyleSize();
+ }
+
+ ret.width -= target.getPadding('lr');
+ ret.height -= target.getPadding('tb');
+ }
+
+ return ret;
+ },
+
+
+ renderItem : function(c) {
+ if(Ext.isString(c.margins)){
+ c.margins = this.parseMargins(c.margins);
+ }else if(!c.margins){
+ c.margins = this.defaultMargins;
+ }
+ Ext.layout.BoxLayout.superclass.renderItem.apply(this, arguments);
+ },
+
+
+ destroy: function() {
+ Ext.destroy(this.overflowHandler);
+
+ Ext.layout.BoxLayout.superclass.destroy.apply(this, arguments);
+ }
+});
+
+
+
+Ext.layout.boxOverflow.None = Ext.extend(Object, {
+ constructor: function(layout, config) {
+ this.layout = layout;
+
+ Ext.apply(this, config || {});
+ },
+
+ handleOverflow: Ext.emptyFn,
+
+ clearOverflow: Ext.emptyFn
+});
+
+
+Ext.layout.boxOverflow.none = Ext.layout.boxOverflow.None;
+
+Ext.layout.boxOverflow.Menu = Ext.extend(Ext.layout.boxOverflow.None, {
+
+ afterCls: 'x-strip-right',
+
+
+ noItemsMenuText : '<div class="x-toolbar-no-items">(None)</div>',
+
+ constructor: function(layout) {
+ Ext.layout.boxOverflow.Menu.superclass.constructor.apply(this, arguments);
+
+
+ this.menuItems = [];
+ },
+
+
+ createInnerElements: function() {
+ if (!this.afterCt) {
+ this.afterCt = this.layout.innerCt.insertSibling({cls: this.afterCls}, 'before');
+ }
+ },
+
+
+ clearOverflow: function(calculations, targetSize) {
+ var newWidth = targetSize.width + (this.afterCt ? this.afterCt.getWidth() : 0),
+ items = this.menuItems;
+
+ this.hideTrigger();
+
+ for (var index = 0, length = items.length; index < length; index++) {
+ items.pop().component.show();
+ }
+
+ return {
+ targetSize: {
+ height: targetSize.height,
+ width : newWidth
+ }
+ };
+ },
+
+
+ showTrigger: function() {
+ this.createMenu();
+ this.menuTrigger.show();
+ },
+
+
+ hideTrigger: function() {
+ if (this.menuTrigger != undefined) {
+ this.menuTrigger.hide();
+ }
+ },
+
+
+ beforeMenuShow: function(menu) {
+ var items = this.menuItems,
+ len = items.length,
+ item,
+ prev;
+
+ var needsSep = function(group, item){
+ return group.isXType('buttongroup') && !(item instanceof Ext.Toolbar.Separator);
+ };
+
+ this.clearMenu();
+ menu.removeAll();
+
+ for (var i = 0; i < len; i++) {
+ item = items[i].component;
+
+ if (prev && (needsSep(item, prev) || needsSep(prev, item))) {
+ menu.add('-');
+ }
+
+ this.addComponentToMenu(menu, item);
+ prev = item;
+ }
+
+
+ if (menu.items.length < 1) {
+ menu.add(this.noItemsMenuText);
+ }
+ },
+
+
+ createMenuConfig : function(component, hideOnClick){
+ var config = Ext.apply({}, component.initialConfig),
+ group = component.toggleGroup;
+
+ Ext.copyTo(config, component, [
+ 'iconCls', 'icon', 'itemId', 'disabled', 'handler', 'scope', 'menu'
+ ]);
+
+ Ext.apply(config, {
+ text : component.overflowText || component.text,
+ hideOnClick: hideOnClick
+ });
+
+ if (group || component.enableToggle) {
+ Ext.apply(config, {
+ group : group,
+ checked: component.pressed,
+ listeners: {
+ checkchange: function(item, checked){
+ component.toggle(checked);
+ }
+ }
+ });
+ }
+
+ delete config.ownerCt;
+ delete config.xtype;
+ delete config.id;
+
+ return config;
+ },
+
+
+ addComponentToMenu : function(menu, component) {
+ if (component instanceof Ext.Toolbar.Separator) {
+ menu.add('-');
+
+ } else if (Ext.isFunction(component.isXType)) {
+ if (component.isXType('splitbutton')) {
+ menu.add(this.createMenuConfig(component, true));
+
+ } else if (component.isXType('button')) {
+ menu.add(this.createMenuConfig(component, !component.menu));
+
+ } else if (component.isXType('buttongroup')) {
+ component.items.each(function(item){
+ this.addComponentToMenu(menu, item);
+ }, this);
+ }
+ }
+ },
+
+
+ clearMenu : function(){
+ var menu = this.moreMenu;
+ if (menu && menu.items) {
+ menu.items.each(function(item){
+ delete item.menu;
+ });
+ }
+ },
+
+
+ createMenu: function() {
+ if (!this.menuTrigger) {
+ this.createInnerElements();
+
+
+ this.menu = new Ext.menu.Menu({
+ ownerCt : this.layout.container,
+ listeners: {
+ scope: this,
+ beforeshow: this.beforeMenuShow
+ }
+ });
+
+
+ this.menuTrigger = new Ext.Button({
+ iconCls : 'x-toolbar-more-icon',
+ cls : 'x-toolbar-more',
+ menu : this.menu,
+ renderTo: this.afterCt
+ });
+ }
+ },
+
+
+ destroy: function() {
+ Ext.destroy(this.menu, this.menuTrigger);
+ }
+});
+
+Ext.layout.boxOverflow.menu = Ext.layout.boxOverflow.Menu;
+
+
+
+Ext.layout.boxOverflow.HorizontalMenu = Ext.extend(Ext.layout.boxOverflow.Menu, {
+
+ constructor: function() {
+ Ext.layout.boxOverflow.HorizontalMenu.superclass.constructor.apply(this, arguments);
+
+ var me = this,
+ layout = me.layout,
+ origFunction = layout.calculateChildBoxes;
+
+ layout.calculateChildBoxes = function(visibleItems, targetSize) {
+ var calcs = origFunction.apply(layout, arguments),
+ meta = calcs.meta,
+ items = me.menuItems;
+
+
+
+ var hiddenWidth = 0;
+ for (var index = 0, length = items.length; index < length; index++) {
+ hiddenWidth += items[index].width;
+ }
+
+ meta.minimumWidth += hiddenWidth;
+ meta.tooNarrow = meta.minimumWidth > targetSize.width;
+
+ return calcs;
+ };
+ },
+
+ handleOverflow: function(calculations, targetSize) {
+ this.showTrigger();
+
+ var newWidth = targetSize.width - this.afterCt.getWidth(),
+ boxes = calculations.boxes,
+ usedWidth = 0,
+ recalculate = false;
+
+
+ for (var index = 0, length = boxes.length; index < length; index++) {
+ usedWidth += boxes[index].width;
+ }
+
+ var spareWidth = newWidth - usedWidth,
+ showCount = 0;
+
+
+ for (var index = 0, length = this.menuItems.length; index < length; index++) {
+ var hidden = this.menuItems[index],
+ comp = hidden.component,
+ width = hidden.width;
+
+ if (width < spareWidth) {
+ comp.show();
+
+ spareWidth -= width;
+ showCount ++;
+ recalculate = true;
+ } else {
+ break;
+ }
+ }
+
+ if (recalculate) {
+ this.menuItems = this.menuItems.slice(showCount);
+ } else {
+ for (var i = boxes.length - 1; i >= 0; i--) {
+ var item = boxes[i].component,
+ right = boxes[i].left + boxes[i].width;
+
+ if (right >= newWidth) {
+ this.menuItems.unshift({
+ component: item,
+ width : boxes[i].width
+ });
+
+ item.hide();
+ } else {
+ break;
+ }
+ }
+ }
+
+ if (this.menuItems.length == 0) {
+ this.hideTrigger();
+ }
+
+ return {
+ targetSize: {
+ height: targetSize.height,
+ width : newWidth
+ },
+ recalculate: recalculate
+ };
+ }
+});
+
+Ext.layout.boxOverflow.menu.hbox = Ext.layout.boxOverflow.HorizontalMenu;
+Ext.layout.boxOverflow.Scroller = Ext.extend(Ext.layout.boxOverflow.None, {
+
+ animateScroll: true,
+
+
+ scrollIncrement: 100,
+
+
+ wheelIncrement: 3,
+
+
+ scrollRepeatInterval: 400,
+
+
+ scrollDuration: 0.4,
+
+
+ beforeCls: 'x-strip-left',
+
+
+ afterCls: 'x-strip-right',
+
+
+ scrollerCls: 'x-strip-scroller',
+
+
+ beforeScrollerCls: 'x-strip-scroller-left',
+
+
+ afterScrollerCls: 'x-strip-scroller-right',
+
+
+ createWheelListener: function() {
+ this.layout.innerCt.on({
+ scope : this,
+ mousewheel: function(e) {
+ e.stopEvent();
+
+ this.scrollBy(e.getWheelDelta() * this.wheelIncrement * -1, false);
+ }
+ });
+ },
+
+
+ handleOverflow: function(calculations, targetSize) {
+ this.createInnerElements();
+ this.showScrollers();
+ },
+
+
+ clearOverflow: function() {
+ this.hideScrollers();
+ },
+
+
+ showScrollers: function() {
+ this.createScrollers();
+
+ this.beforeScroller.show();
+ this.afterScroller.show();
+
+ this.updateScrollButtons();
+ },
+
+
+ hideScrollers: function() {
+ if (this.beforeScroller != undefined) {
+ this.beforeScroller.hide();
+ this.afterScroller.hide();
+ }
+ },
+
+
+ createScrollers: function() {
+ if (!this.beforeScroller && !this.afterScroller) {
+ var before = this.beforeCt.createChild({
+ cls: String.format("{0} {1} ", this.scrollerCls, this.beforeScrollerCls)
+ });
+
+ var after = this.afterCt.createChild({
+ cls: String.format("{0} {1}", this.scrollerCls, this.afterScrollerCls)
+ });
+
+ before.addClassOnOver(this.beforeScrollerCls + '-hover');
+ after.addClassOnOver(this.afterScrollerCls + '-hover');
+
+ before.setVisibilityMode(Ext.Element.DISPLAY);
+ after.setVisibilityMode(Ext.Element.DISPLAY);
+
+ this.beforeRepeater = new Ext.util.ClickRepeater(before, {
+ interval: this.scrollRepeatInterval,
+ handler : this.scrollLeft,
+ scope : this
+ });
+
+ this.afterRepeater = new Ext.util.ClickRepeater(after, {
+ interval: this.scrollRepeatInterval,
+ handler : this.scrollRight,
+ scope : this
+ });
+
+
+ this.beforeScroller = before;
+
+
+ this.afterScroller = after;
+ }
+ },
+
+
+ destroy: function() {
+ Ext.destroy(this.beforeScroller, this.afterScroller, this.beforeRepeater, this.afterRepeater, this.beforeCt, this.afterCt);
+ },
+
+
+ scrollBy: function(delta, animate) {
+ this.scrollTo(this.getScrollPosition() + delta, animate);
+ },
+
+
+ getItem: function(item) {
+ if (Ext.isString(item)) {
+ item = Ext.getCmp(item);
+ } else if (Ext.isNumber(item)) {
+ item = this.items[item];
+ }
+
+ return item;
+ },
+
+
+ getScrollAnim: function() {
+ return {
+ duration: this.scrollDuration,
+ callback: this.updateScrollButtons,
+ scope : this
+ };
+ },
+
+
+ updateScrollButtons: function() {
+ if (this.beforeScroller == undefined || this.afterScroller == undefined) {
+ return;
+ }
+
+ var beforeMeth = this.atExtremeBefore() ? 'addClass' : 'removeClass',
+ afterMeth = this.atExtremeAfter() ? 'addClass' : 'removeClass',
+ beforeCls = this.beforeScrollerCls + '-disabled',
+ afterCls = this.afterScrollerCls + '-disabled';
+
+ this.beforeScroller[beforeMeth](beforeCls);
+ this.afterScroller[afterMeth](afterCls);
+ this.scrolling = false;
+ },
+
+
+ atExtremeBefore: function() {
+ return this.getScrollPosition() === 0;
+ },
+
+
+ scrollLeft: function(animate) {
+ this.scrollBy(-this.scrollIncrement, animate);
+ },
+
+
+ scrollRight: function(animate) {
+ this.scrollBy(this.scrollIncrement, animate);
+ },
+
+
+ scrollToItem: function(item, animate) {
+ item = this.getItem(item);
+
+ if (item != undefined) {
+ var visibility = this.getItemVisibility(item);
+
+ if (!visibility.fullyVisible) {
+ var box = item.getBox(true, true),
+ newX = box.x;
+
+ if (visibility.hiddenRight) {
+ newX -= (this.layout.innerCt.getWidth() - box.width);
+ }
+
+ this.scrollTo(newX, animate);
+ }
+ }
+ },
+
+
+ getItemVisibility: function(item) {
+ var box = this.getItem(item).getBox(true, true),
+ itemLeft = box.x,
+ itemRight = box.x + box.width,
+ scrollLeft = this.getScrollPosition(),
+ scrollRight = this.layout.innerCt.getWidth() + scrollLeft;
+
+ return {
+ hiddenLeft : itemLeft < scrollLeft,
+ hiddenRight : itemRight > scrollRight,
+ fullyVisible: itemLeft > scrollLeft && itemRight < scrollRight
+ };
+ }
+});
+
+Ext.layout.boxOverflow.scroller = Ext.layout.boxOverflow.Scroller;
+
+
+
+Ext.layout.boxOverflow.VerticalScroller = Ext.extend(Ext.layout.boxOverflow.Scroller, {
+ scrollIncrement: 75,
+ wheelIncrement : 2,
+
+ handleOverflow: function(calculations, targetSize) {
+ Ext.layout.boxOverflow.VerticalScroller.superclass.handleOverflow.apply(this, arguments);
+
+ return {
+ targetSize: {
+ height: targetSize.height - (this.beforeCt.getHeight() + this.afterCt.getHeight()),
+ width : targetSize.width
+ }
+ };
+ },
+
+
+ createInnerElements: function() {
+ var target = this.layout.innerCt;
+
+
+
+ if (!this.beforeCt) {
+ this.beforeCt = target.insertSibling({cls: this.beforeCls}, 'before');
+ this.afterCt = target.insertSibling({cls: this.afterCls}, 'after');
+
+ this.createWheelListener();
+ }
+ },
+
+
+ scrollTo: function(position, animate) {
+ var oldPosition = this.getScrollPosition(),
+ newPosition = position.constrain(0, this.getMaxScrollBottom());
+
+ if (newPosition != oldPosition && !this.scrolling) {
+ if (animate == undefined) {
+ animate = this.animateScroll;
+ }
+
+ this.layout.innerCt.scrollTo('top', newPosition, animate ? this.getScrollAnim() : false);
+
+ if (animate) {
+ this.scrolling = true;
+ } else {
+ this.scrolling = false;
+ this.updateScrollButtons();
+ }
+ }
+ },
+
+
+ getScrollPosition: function(){
+ return parseInt(this.layout.innerCt.dom.scrollTop, 10) || 0;
+ },
+
+
+ getMaxScrollBottom: function() {
+ return this.layout.innerCt.dom.scrollHeight - this.layout.innerCt.getHeight();
+ },
+
+
+ atExtremeAfter: function() {
+ return this.getScrollPosition() >= this.getMaxScrollBottom();
+ }
+});
+
+Ext.layout.boxOverflow.scroller.vbox = Ext.layout.boxOverflow.VerticalScroller;
+
+
+
+Ext.layout.boxOverflow.HorizontalScroller = Ext.extend(Ext.layout.boxOverflow.Scroller, {
+ handleOverflow: function(calculations, targetSize) {
+ Ext.layout.boxOverflow.HorizontalScroller.superclass.handleOverflow.apply(this, arguments);
+
+ return {
+ targetSize: {
+ height: targetSize.height,
+ width : targetSize.width - (this.beforeCt.getWidth() + this.afterCt.getWidth())
+ }
+ };
+ },
+
+
+ createInnerElements: function() {
+ var target = this.layout.innerCt;
+
+
+
+ if (!this.beforeCt) {
+ this.afterCt = target.insertSibling({cls: this.afterCls}, 'before');
+ this.beforeCt = target.insertSibling({cls: this.beforeCls}, 'before');
+
+ this.createWheelListener();
+ }
+ },
+
+
+ scrollTo: function(position, animate) {
+ var oldPosition = this.getScrollPosition(),
+ newPosition = position.constrain(0, this.getMaxScrollRight());
+
+ if (newPosition != oldPosition && !this.scrolling) {
+ if (animate == undefined) {
+ animate = this.animateScroll;
+ }
+
+ this.layout.innerCt.scrollTo('left', newPosition, animate ? this.getScrollAnim() : false);
+
+ if (animate) {
+ this.scrolling = true;
+ } else {
+ this.scrolling = false;
+ this.updateScrollButtons();
+ }
+ }
+ },
+
+
+ getScrollPosition: function(){
+ return parseInt(this.layout.innerCt.dom.scrollLeft, 10) || 0;
+ },
+
+
+ getMaxScrollRight: function() {
+ return this.layout.innerCt.dom.scrollWidth - this.layout.innerCt.getWidth();
+ },
+
+
+ atExtremeAfter: function() {
+ return this.getScrollPosition() >= this.getMaxScrollRight();
+ }
+});
+
+Ext.layout.boxOverflow.scroller.hbox = Ext.layout.boxOverflow.HorizontalScroller;
+Ext.layout.HBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
+
+ align: 'top',
+
+ type : 'hbox',
+
+
+
+
+
+ calculateChildBoxes: function(visibleItems, targetSize) {
+ var visibleCount = visibleItems.length,
+
+ padding = this.padding,
+ topOffset = padding.top,
+ leftOffset = padding.left,
+ paddingVert = topOffset + padding.bottom,
+ paddingHoriz = leftOffset + padding.right,
+
+ width = targetSize.width - this.scrollOffset,
+ height = targetSize.height,
+ availHeight = Math.max(0, height - paddingVert),
+
+ isStart = this.pack == 'start',
+ isCenter = this.pack == 'center',
+ isEnd = this.pack == 'end',
+
+ nonFlexWidth = 0,
+ maxHeight = 0,
+ totalFlex = 0,
+ desiredWidth = 0,
+ minimumWidth = 0,
+
+
+ boxes = [],
+
+
+ child, childWidth, childHeight, childSize, childMargins, canLayout, i, calcs, flexedWidth,
+ horizMargins, vertMargins, stretchHeight;
+
+
+ for (i = 0; i < visibleCount; i++) {
+ child = visibleItems[i];
+ childHeight = child.height;
+ childWidth = child.width;
+ canLayout = !child.hasLayout && typeof child.doLayout == 'function';
+
+
+ if (typeof childWidth != 'number') {
+
+
+ if (child.flex && !childWidth) {
+ totalFlex += child.flex;
+
+
+ } else {
+
+
+ if (!childWidth && canLayout) {
+ child.doLayout();
+ }
+
+ childSize = child.getSize();
+ childWidth = childSize.width;
+ childHeight = childSize.height;
+ }
+ }
+
+ childMargins = child.margins;
+ horizMargins = childMargins.left + childMargins.right;
+
+ nonFlexWidth += horizMargins + (childWidth || 0);
+ desiredWidth += horizMargins + (child.flex ? child.minWidth || 0 : childWidth);
+ minimumWidth += horizMargins + (child.minWidth || childWidth || 0);
+
+
+ if (typeof childHeight != 'number') {
+ if (canLayout) {
+ child.doLayout();
+ }
+ childHeight = child.getHeight();
+ }
+
+ maxHeight = Math.max(maxHeight, childHeight + childMargins.top + childMargins.bottom);
+
+
+ boxes.push({
+ component: child,
+ height : childHeight || undefined,
+ width : childWidth || undefined
+ });
+ }
+
+ var shortfall = desiredWidth - width,
+ tooNarrow = minimumWidth > width;
+
+
+ var availableWidth = Math.max(0, width - nonFlexWidth - paddingHoriz);
+
+ if (tooNarrow) {
+ for (i = 0; i < visibleCount; i++) {
+ boxes[i].width = visibleItems[i].minWidth || visibleItems[i].width || boxes[i].width;
+ }
+ } else {
+
+
+ if (shortfall > 0) {
+ var minWidths = [];
+
+
+
+
+ for (var index = 0, length = visibleCount; index < length; index++) {
+ var item = visibleItems[index],
+ minWidth = item.minWidth || 0;
+
+
+
+ if (item.flex) {
+ boxes[index].width = minWidth;
+ } else {
+ minWidths.push({
+ minWidth : minWidth,
+ available: boxes[index].width - minWidth,
+ index : index
+ });
+ }
+ }
+
+
+ minWidths.sort(function(a, b) {
+ return a.available > b.available ? 1 : -1;
+ });
+
+
+ for (var i = 0, length = minWidths.length; i < length; i++) {
+ var itemIndex = minWidths[i].index;
+
+ if (itemIndex == undefined) {
+ continue;
+ }
+
+ var item = visibleItems[itemIndex],
+ box = boxes[itemIndex],
+ oldWidth = box.width,
+ minWidth = item.minWidth,
+ newWidth = Math.max(minWidth, oldWidth - Math.ceil(shortfall / (length - i))),
+ reduction = oldWidth - newWidth;
+
+ boxes[itemIndex].width = newWidth;
+ shortfall -= reduction;
+ }
+ } else {
+
+ var remainingWidth = availableWidth,
+ remainingFlex = totalFlex;
+
+
+ for (i = 0; i < visibleCount; i++) {
+ child = visibleItems[i];
+ calcs = boxes[i];
+
+ childMargins = child.margins;
+ vertMargins = childMargins.top + childMargins.bottom;
+
+ if (isStart && child.flex && !child.width) {
+ flexedWidth = Math.ceil((child.flex / remainingFlex) * remainingWidth);
+ remainingWidth -= flexedWidth;
+ remainingFlex -= child.flex;
+
+ calcs.width = flexedWidth;
+ calcs.dirtySize = true;
+ }
+ }
+ }
+ }
+
+ if (isCenter) {
+ leftOffset += availableWidth / 2;
+ } else if (isEnd) {
+ leftOffset += availableWidth;
+ }
+
+
+ for (i = 0; i < visibleCount; i++) {
+ child = visibleItems[i];
+ calcs = boxes[i];
+
+ childMargins = child.margins;
+ leftOffset += childMargins.left;
+ vertMargins = childMargins.top + childMargins.bottom;
+
+ calcs.left = leftOffset;
+ calcs.top = topOffset + childMargins.top;
+
+ switch (this.align) {
+ case 'stretch':
+ stretchHeight = availHeight - vertMargins;
+ calcs.height = stretchHeight.constrain(child.minHeight || 0, child.maxHeight || 1000000);
+ calcs.dirtySize = true;
+ break;
+ case 'stretchmax':
+ stretchHeight = maxHeight - vertMargins;
+ calcs.height = stretchHeight.constrain(child.minHeight || 0, child.maxHeight || 1000000);
+ calcs.dirtySize = true;
+ break;
+ case 'middle':
+ var diff = availHeight - calcs.height - vertMargins;
+ if (diff > 0) {
+ calcs.top = topOffset + vertMargins + (diff / 2);
+ }
+ }
+
+ leftOffset += calcs.width + childMargins.right;
+ }
+
+ return {
+ boxes: boxes,
+ meta : {
+ maxHeight : maxHeight,
+ nonFlexWidth: nonFlexWidth,
+ desiredWidth: desiredWidth,
+ minimumWidth: minimumWidth,
+ shortfall : desiredWidth - width,
+ tooNarrow : tooNarrow
+ }
+ };
+ }
+});
+
+Ext.Container.LAYOUTS.hbox = Ext.layout.HBoxLayout;
+Ext.layout.VBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
+
+ align : 'left',
+ type: 'vbox',
+
+
+
+
+
+
+ calculateChildBoxes: function(visibleItems, targetSize) {
+ var visibleCount = visibleItems.length,
+
+ padding = this.padding,
+ topOffset = padding.top,
+ leftOffset = padding.left,
+ paddingVert = topOffset + padding.bottom,
+ paddingHoriz = leftOffset + padding.right,
+
+ width = targetSize.width - this.scrollOffset,
+ height = targetSize.height,
+ availWidth = Math.max(0, width - paddingHoriz),
+
+ isStart = this.pack == 'start',
+ isCenter = this.pack == 'center',
+ isEnd = this.pack == 'end',
+
+ nonFlexHeight= 0,
+ maxWidth = 0,
+ totalFlex = 0,
+ desiredHeight= 0,
+ minimumHeight= 0,
+
+
+ boxes = [],
+
+
+ child, childWidth, childHeight, childSize, childMargins, canLayout, i, calcs, flexedHeight,
+ horizMargins, vertMargins, stretchWidth, length;
+
+
+ for (i = 0; i < visibleCount; i++) {
+ child = visibleItems[i];
+ childHeight = child.height;
+ childWidth = child.width;
+ canLayout = !child.hasLayout && typeof child.doLayout == 'function';
+
+
+ if (typeof childHeight != 'number') {
+
+
+ if (child.flex && !childHeight) {
+ totalFlex += child.flex;
+
+
+ } else {
+
+
+ if (!childHeight && canLayout) {
+ child.doLayout();
+ }
+
+ childSize = child.getSize();
+ childWidth = childSize.width;
+ childHeight = childSize.height;
+ }
+ }
+
+ childMargins = child.margins;
+ vertMargins = childMargins.top + childMargins.bottom;
+
+ nonFlexHeight += vertMargins + (childHeight || 0);
+ desiredHeight += vertMargins + (child.flex ? child.minHeight || 0 : childHeight);
+ minimumHeight += vertMargins + (child.minHeight || childHeight || 0);
+
+
+ if (typeof childWidth != 'number') {
+ if (canLayout) {
+ child.doLayout();
+ }
+ childWidth = child.getWidth();
+ }
+
+ maxWidth = Math.max(maxWidth, childWidth + childMargins.left + childMargins.right);
+
+
+ boxes.push({
+ component: child,
+ height : childHeight || undefined,
+ width : childWidth || undefined
+ });
+ }
+
+ var shortfall = desiredHeight - height,
+ tooNarrow = minimumHeight > height;
+
+
+ var availableHeight = Math.max(0, (height - nonFlexHeight - paddingVert));
+
+ if (tooNarrow) {
+ for (i = 0, length = visibleCount; i < length; i++) {
+ boxes[i].height = visibleItems[i].minHeight || visibleItems[i].height || boxes[i].height;
+ }
+ } else {
+
+
+ if (shortfall > 0) {
+ var minHeights = [];
+
+
+
+
+ for (var index = 0, length = visibleCount; index < length; index++) {
+ var item = visibleItems[index],
+ minHeight = item.minHeight || 0;
+
+
+
+ if (item.flex) {
+ boxes[index].height = minHeight;
+ } else {
+ minHeights.push({
+ minHeight: minHeight,
+ available: boxes[index].height - minHeight,
+ index : index
+ });
+ }
+ }
+
+
+ minHeights.sort(function(a, b) {
+ return a.available > b.available ? 1 : -1;
+ });
+
+
+ for (var i = 0, length = minHeights.length; i < length; i++) {
+ var itemIndex = minHeights[i].index;
+
+ if (itemIndex == undefined) {
+ continue;
+ }
+
+ var item = visibleItems[itemIndex],
+ box = boxes[itemIndex],
+ oldHeight = box.height,
+ minHeight = item.minHeight,
+ newHeight = Math.max(minHeight, oldHeight - Math.ceil(shortfall / (length - i))),
+ reduction = oldHeight - newHeight;
+
+ boxes[itemIndex].height = newHeight;
+ shortfall -= reduction;
+ }
+ } else {
+
+ var remainingHeight = availableHeight,
+ remainingFlex = totalFlex;
+
+
+ for (i = 0; i < visibleCount; i++) {
+ child = visibleItems[i];
+ calcs = boxes[i];
+
+ childMargins = child.margins;
+ horizMargins = childMargins.left + childMargins.right;
+
+ if (isStart && child.flex && !child.height) {
+ flexedHeight = Math.ceil((child.flex / remainingFlex) * remainingHeight);
+ remainingHeight -= flexedHeight;
+ remainingFlex -= child.flex;
+
+ calcs.height = flexedHeight;
+ calcs.dirtySize = true;
+ }
+ }
+ }
+ }
+
+ if (isCenter) {
+ topOffset += availableHeight / 2;
+ } else if (isEnd) {
+ topOffset += availableHeight;
+ }
+
+
+ for (i = 0; i < visibleCount; i++) {
+ child = visibleItems[i];
+ calcs = boxes[i];
+
+ childMargins = child.margins;
+ topOffset += childMargins.top;
+ horizMargins = childMargins.left + childMargins.right;
+
+
+ calcs.left = leftOffset + childMargins.left;
+ calcs.top = topOffset;
+
+ switch (this.align) {
+ case 'stretch':
+ stretchWidth = availWidth - horizMargins;
+ calcs.width = stretchWidth.constrain(child.minWidth || 0, child.maxWidth || 1000000);
+ calcs.dirtySize = true;
+ break;
+ case 'stretchmax':
+ stretchWidth = maxWidth - horizMargins;
+ calcs.width = stretchWidth.constrain(child.minWidth || 0, child.maxWidth || 1000000);
+ calcs.dirtySize = true;
+ break;
+ case 'center':
+ var diff = availWidth - calcs.width - horizMargins;
+ if (diff > 0) {
+ calcs.left = leftOffset + horizMargins + (diff / 2);
+ }
+ }
+
+ topOffset += calcs.height + childMargins.bottom;
+ }
+
+ return {
+ boxes: boxes,
+ meta : {
+ maxWidth : maxWidth,
+ nonFlexHeight: nonFlexHeight,
+ desiredHeight: desiredHeight,
+ minimumHeight: minimumHeight,
+ shortfall : desiredHeight - height,
+ tooNarrow : tooNarrow
+ }
+ };
+ }
+});
+
+Ext.Container.LAYOUTS.vbox = Ext.layout.VBoxLayout;
+
+Ext.layout.ToolbarLayout = Ext.extend(Ext.layout.ContainerLayout, {
+ monitorResize : true,
+
+ type: 'toolbar',
+
+
+ triggerWidth: 18,
+
+
+ noItemsMenuText : '<div class="x-toolbar-no-items">(None)</div>',
+
+
+ lastOverflow: false,
+
+
+ tableHTML: [
+ '<table cellspacing="0" class="x-toolbar-ct">',
+ '<tbody>',
+ '<tr>',
+ '<td class="x-toolbar-left" align="{0}">',
+ '<table cellspacing="0">',
+ '<tbody>',
+ '<tr class="x-toolbar-left-row"></tr>',
+ '</tbody>',
+ '</table>',
+ '</td>',
+ '<td class="x-toolbar-right" align="right">',
+ '<table cellspacing="0" class="x-toolbar-right-ct">',
+ '<tbody>',
+ '<tr>',
+ '<td>',
+ '<table cellspacing="0">',
+ '<tbody>',
+ '<tr class="x-toolbar-right-row"></tr>',
+ '</tbody>',
+ '</table>',
+ '</td>',
+ '<td>',
+ '<table cellspacing="0">',
+ '<tbody>',
+ '<tr class="x-toolbar-extras-row"></tr>',
+ '</tbody>',
+ '</table>',
+ '</td>',
+ '</tr>',
+ '</tbody>',
+ '</table>',
+ '</td>',
+ '</tr>',
+ '</tbody>',
+ '</table>'
+ ].join(""),
+
+
+ onLayout : function(ct, target) {
+
+ if (!this.leftTr) {
+ var align = ct.buttonAlign == 'center' ? 'center' : 'left';
+
+ target.addClass('x-toolbar-layout-ct');
+ target.insertHtml('beforeEnd', String.format(this.tableHTML, align));
+
+ this.leftTr = target.child('tr.x-toolbar-left-row', true);
+ this.rightTr = target.child('tr.x-toolbar-right-row', true);
+ this.extrasTr = target.child('tr.x-toolbar-extras-row', true);
+
+ if (this.hiddenItem == undefined) {
+
+ this.hiddenItems = [];
+ }
+ }
+
+ var side = ct.buttonAlign == 'right' ? this.rightTr : this.leftTr,
+ items = ct.items.items,
+ position = 0;
+
+
+ for (var i = 0, len = items.length, c; i < len; i++, position++) {
+ c = items[i];
+
+ if (c.isFill) {
+ side = this.rightTr;
+ position = -1;
+ } else if (!c.rendered) {
+ c.render(this.insertCell(c, side, position));
+ this.configureItem(c);
+ } else {
+ if (!c.xtbHidden && !this.isValidParent(c, side.childNodes[position])) {
+ var td = this.insertCell(c, side, position);
+ td.appendChild(c.getPositionEl().dom);
+ c.container = Ext.get(td);
+ }
+ }
+ }
+
+
+ this.cleanup(this.leftTr);
+ this.cleanup(this.rightTr);
+ this.cleanup(this.extrasTr);
+ this.fitToSize(target);
+ },
+
+
+ cleanup : function(el) {
+ var cn = el.childNodes, i, c;
+
+ for (i = cn.length-1; i >= 0 && (c = cn[i]); i--) {
+ if (!c.firstChild) {
+ el.removeChild(c);
+ }
+ }
+ },
+
+
+ insertCell : function(c, target, position) {
+ var td = document.createElement('td');
+ td.className = 'x-toolbar-cell';
+
+ target.insertBefore(td, target.childNodes[position] || null);
+
+ return td;
+ },
+
+
+ hideItem : function(item) {
+ this.hiddenItems.push(item);
+
+ item.xtbHidden = true;
+ item.xtbWidth = item.getPositionEl().dom.parentNode.offsetWidth;
+ item.hide();
+ },
+
+
+ unhideItem : function(item) {
+ item.show();
+ item.xtbHidden = false;
+ this.hiddenItems.remove(item);
+ },
+
+
+ getItemWidth : function(c) {
+ return c.hidden ? (c.xtbWidth || 0) : c.getPositionEl().dom.parentNode.offsetWidth;
+ },
+
+
+ fitToSize : function(target) {
+ if (this.container.enableOverflow === false) {
+ return;
+ }
+
+ var width = target.dom.clientWidth,
+ tableWidth = target.dom.firstChild.offsetWidth,
+ clipWidth = width - this.triggerWidth,
+ lastWidth = this.lastWidth || 0,
+
+ hiddenItems = this.hiddenItems,
+ hasHiddens = hiddenItems.length != 0,
+ isLarger = width >= lastWidth;
+
+ this.lastWidth = width;
+
+ if (tableWidth > width || (hasHiddens && isLarger)) {
+ var items = this.container.items.items,
+ len = items.length,
+ loopWidth = 0,
+ item;
+
+ for (var i = 0; i < len; i++) {
+ item = items[i];
+
+ if (!item.isFill) {
+ loopWidth += this.getItemWidth(item);
+ if (loopWidth > clipWidth) {
+ if (!(item.hidden || item.xtbHidden)) {
+ this.hideItem(item);
+ }
+ } else if (item.xtbHidden) {
+ this.unhideItem(item);
+ }
+ }
+ }
+ }
+
+
+ hasHiddens = hiddenItems.length != 0;
+
+ if (hasHiddens) {
+ this.initMore();
+
+ if (!this.lastOverflow) {
+ this.container.fireEvent('overflowchange', this.container, true);
+ this.lastOverflow = true;
+ }
+ } else if (this.more) {
+ this.clearMenu();
+ this.more.destroy();
+ delete this.more;
+
+ if (this.lastOverflow) {
+ this.container.fireEvent('overflowchange', this.container, false);
+ this.lastOverflow = false;
+ }
+ }
+ },
+
+
+ createMenuConfig : function(component, hideOnClick){
+ var config = Ext.apply({}, component.initialConfig),
+ group = component.toggleGroup;
+
+ Ext.copyTo(config, component, [
+ 'iconCls', 'icon', 'itemId', 'disabled', 'handler', 'scope', 'menu'
+ ]);
+
+ Ext.apply(config, {
+ text : component.overflowText || component.text,
+ hideOnClick: hideOnClick
+ });
+
+ if (group || component.enableToggle) {
+ Ext.apply(config, {
+ group : group,
+ checked: component.pressed,
+ listeners: {
+ checkchange: function(item, checked){
+ component.toggle(checked);
+ }
+ }
+ });
+ }
+
+ delete config.ownerCt;
+ delete config.xtype;
+ delete config.id;
+
+ return config;
+ },
+
+
+ addComponentToMenu : function(menu, component) {
+ if (component instanceof Ext.Toolbar.Separator) {
+ menu.add('-');
+
+ } else if (Ext.isFunction(component.isXType)) {
+ if (component.isXType('splitbutton')) {
+ menu.add(this.createMenuConfig(component, true));
+
+ } else if (component.isXType('button')) {
+ menu.add(this.createMenuConfig(component, !component.menu));
+
+ } else if (component.isXType('buttongroup')) {
+ component.items.each(function(item){
+ this.addComponentToMenu(menu, item);
+ }, this);
+ }
+ }
+ },
+
+
+ clearMenu : function(){
+ var menu = this.moreMenu;
+ if (menu && menu.items) {
+ menu.items.each(function(item){
+ delete item.menu;
+ });
+ }
+ },
+
+
+ beforeMoreShow : function(menu) {
+ var items = this.container.items.items,
+ len = items.length,
+ item,
+ prev;
+
+ var needsSep = function(group, item){
+ return group.isXType('buttongroup') && !(item instanceof Ext.Toolbar.Separator);
+ };
+
+ this.clearMenu();
+ menu.removeAll();
+ for (var i = 0; i < len; i++) {
+ item = items[i];
+ if (item.xtbHidden) {
+ if (prev && (needsSep(item, prev) || needsSep(prev, item))) {
+ menu.add('-');
+ }
+ this.addComponentToMenu(menu, item);
+ prev = item;
+ }
+ }
+
+
+ if (menu.items.length < 1) {
+ menu.add(this.noItemsMenuText);
+ }
+ },
+
+
+ initMore : function(){
+ if (!this.more) {
+
+ this.moreMenu = new Ext.menu.Menu({
+ ownerCt : this.container,
+ listeners: {
+ beforeshow: this.beforeMoreShow,
+ scope: this
+ }
+ });
+
+
+ this.more = new Ext.Button({
+ iconCls: 'x-toolbar-more-icon',
+ cls : 'x-toolbar-more',
+ menu : this.moreMenu,
+ ownerCt: this.container
+ });
+
+ var td = this.insertCell(this.more, this.extrasTr, 100);
+ this.more.render(td);
+ }
+ },
+
+ destroy : function(){
+ Ext.destroy(this.more, this.moreMenu);
+ delete this.leftTr;
+ delete this.rightTr;
+ delete this.extrasTr;
+ Ext.layout.ToolbarLayout.superclass.destroy.call(this);
+ }
+});
+
+Ext.Container.LAYOUTS.toolbar = Ext.layout.ToolbarLayout;
+
+ Ext.layout.MenuLayout = Ext.extend(Ext.layout.ContainerLayout, {
+ monitorResize : true,
+
+ type: 'menu',
+
+ setContainer : function(ct){
+ this.monitorResize = !ct.floating;
+
+
+ ct.on('autosize', this.doAutoSize, this);
+ Ext.layout.MenuLayout.superclass.setContainer.call(this, ct);
+ },
+
+ renderItem : function(c, position, target){
+ if (!this.itemTpl) {
+ this.itemTpl = Ext.layout.MenuLayout.prototype.itemTpl = new Ext.XTemplate(
+ '<li id="{itemId}" class="{itemCls}">',
+ '<tpl if="needsIcon">',
+ '<img alt="{altText}" src="{icon}" class="{iconCls}"/>',
+ '</tpl>',
+ '</li>'
+ );
+ }
+
+ if(c && !c.rendered){
+ if(Ext.isNumber(position)){
+ position = target.dom.childNodes[position];
+ }
+ var a = this.getItemArgs(c);
+
+
+ c.render(c.positionEl = position ?
+ this.itemTpl.insertBefore(position, a, true) :
+ this.itemTpl.append(target, a, true));
+
+
+ c.positionEl.menuItemId = c.getItemId();
+
+
+
+ if (!a.isMenuItem && a.needsIcon) {
+ c.positionEl.addClass('x-menu-list-item-indent');
+ }
+ this.configureItem(c);
+ }else if(c && !this.isValidParent(c, target)){
+ if(Ext.isNumber(position)){
+ position = target.dom.childNodes[position];
+ }
+ target.dom.insertBefore(c.getActionEl().dom, position || null);
+ }
+ },
+
+ getItemArgs : function(c) {
+ var isMenuItem = c instanceof Ext.menu.Item,
+ canHaveIcon = !(isMenuItem || c instanceof Ext.menu.Separator);
+
+ return {
+ isMenuItem: isMenuItem,
+ needsIcon: canHaveIcon && (c.icon || c.iconCls),
+ icon: c.icon || Ext.BLANK_IMAGE_URL,
+ iconCls: 'x-menu-item-icon ' + (c.iconCls || ''),
+ itemId: 'x-menu-el-' + c.id,
+ itemCls: 'x-menu-list-item ',
+ altText: c.altText || ''
+ };
+ },
+
+
+ isValidParent : function(c, target) {
+ return c.el.up('li.x-menu-list-item', 5).dom.parentNode === (target.dom || target);
+ },
+
+ onLayout : function(ct, target){
+ Ext.layout.MenuLayout.superclass.onLayout.call(this, ct, target);
+ this.doAutoSize();
+ },
+
+ doAutoSize : function(){
+ var ct = this.container, w = ct.width;
+ if(ct.floating){
+ if(w){
+ ct.setWidth(w);
+ }else if(Ext.isIE9m){
+ ct.setWidth(Ext.isStrict && (Ext.isIE7 || Ext.isIE8 || Ext.isIE9) ? 'auto' : ct.minWidth);
+ var el = ct.getEl(), t = el.dom.offsetWidth;
+ ct.setWidth(ct.getLayoutTarget().getWidth() + el.getFrameWidth('lr'));
+ }
+ }
+ }
+});
+Ext.Container.LAYOUTS['menu'] = Ext.layout.MenuLayout;
+
+Ext.Viewport = Ext.extend(Ext.Container, {
+
+
+
+
+
+
+
+
+
+
+
+
+ initComponent : function() {
+ Ext.Viewport.superclass.initComponent.call(this);
+ document.getElementsByTagName('html')[0].className += ' x-viewport';
+ this.el = Ext.getBody();
+ this.el.setHeight = Ext.emptyFn;
+ this.el.setWidth = Ext.emptyFn;
+ this.el.setSize = Ext.emptyFn;
+ this.el.dom.scroll = 'no';
+ this.allowDomMove = false;
+ this.autoWidth = true;
+ this.autoHeight = true;
+ Ext.EventManager.onWindowResize(this.fireResize, this);
+ this.renderTo = this.el;
+ },
+
+ fireResize : function(w, h){
+ this.fireEvent('resize', this, w, h, w, h);
+ }
+});
+Ext.reg('viewport', Ext.Viewport);
+
+Ext.Panel = Ext.extend(Ext.Container, {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ baseCls : 'x-panel',
+
+ collapsedCls : 'x-panel-collapsed',
+
+ maskDisabled : true,
+
+ animCollapse : Ext.enableFx,
+
+ headerAsText : true,
+
+ buttonAlign : 'right',
+
+ collapsed : false,
+
+ collapseFirst : true,
+
+ minButtonWidth : 75,
+
+
+ elements : 'body',
+
+ preventBodyReset : false,
+
+
+ padding: undefined,
+
+
+ resizeEvent: 'bodyresize',
+
+
+
+
+ toolTarget : 'header',
+ collapseEl : 'bwrap',
+ slideAnchor : 't',
+ disabledClass : '',
+
+
+ deferHeight : true,
+
+ expandDefaults: {
+ duration : 0.25
+ },
+
+ collapseDefaults : {
+ duration : 0.25
+ },
+
+
+ initComponent : function(){
+ Ext.Panel.superclass.initComponent.call(this);
+
+ this.addEvents(
+
+ 'bodyresize',
+
+ 'titlechange',
+
+ 'iconchange',
+
+ 'collapse',
+
+ 'expand',
+
+ 'beforecollapse',
+
+ 'beforeexpand',
+
+ 'beforeclose',
+
+ 'close',
+
+ 'activate',
+
+ 'deactivate'
+ );
+
+ if(this.unstyled){
+ this.baseCls = 'x-plain';
+ }
+
+
+ this.toolbars = [];
+
+ if(this.tbar){
+ this.elements += ',tbar';
+ this.topToolbar = this.createToolbar(this.tbar);
+ this.tbar = null;
+
+ }
+ if(this.bbar){
+ this.elements += ',bbar';
+ this.bottomToolbar = this.createToolbar(this.bbar);
+ this.bbar = null;
+ }
+
+ if(this.header === true){
+ this.elements += ',header';
+ this.header = null;
+ }else if(this.headerCfg || (this.title && this.header !== false)){
+ this.elements += ',header';
+ }
+
+ if(this.footerCfg || this.footer === true){
+ this.elements += ',footer';
+ this.footer = null;
+ }
+
+ if(this.buttons){
+ this.fbar = this.buttons;
+ this.buttons = null;
+ }
+ if(this.fbar){
+ this.createFbar(this.fbar);
+ }
+ if(this.autoLoad){
+ this.on('render', this.doAutoLoad, this, {delay:10});
+ }
+ },
+
+
+ createFbar : function(fbar){
+ var min = this.minButtonWidth;
+ this.elements += ',footer';
+ this.fbar = this.createToolbar(fbar, {
+ buttonAlign: this.buttonAlign,
+ toolbarCls: 'x-panel-fbar',
+ enableOverflow: false,
+ defaults: function(c){
+ return {
+ minWidth: c.minWidth || min
+ };
+ }
+ });
+
+
+
+ this.fbar.items.each(function(c){
+ c.minWidth = c.minWidth || this.minButtonWidth;
+ }, this);
+ this.buttons = this.fbar.items.items;
+ },
+
+
+ createToolbar: function(tb, options){
+ var result;
+
+ if(Ext.isArray(tb)){
+ tb = {
+ items: tb
+ };
+ }
+ result = tb.events ? Ext.apply(tb, options) : this.createComponent(Ext.apply({}, tb, options), 'toolbar');
+ this.toolbars.push(result);
+ return result;
+ },
+
+
+ createElement : function(name, pnode){
+ if(this[name]){
+ pnode.appendChild(this[name].dom);
+ return;
+ }
+
+ if(name === 'bwrap' || this.elements.indexOf(name) != -1){
+ if(this[name+'Cfg']){
+ this[name] = Ext.fly(pnode).createChild(this[name+'Cfg']);
+ }else{
+ var el = document.createElement('div');
+ el.className = this[name+'Cls'];
+ this[name] = Ext.get(pnode.appendChild(el));
+ }
+ if(this[name+'CssClass']){
+ this[name].addClass(this[name+'CssClass']);
+ }
+ if(this[name+'Style']){
+ this[name].applyStyles(this[name+'Style']);
+ }
+ }
+ },
+
+
+ onRender : function(ct, position){
+ Ext.Panel.superclass.onRender.call(this, ct, position);
+ this.createClasses();
+
+ var el = this.el,
+ d = el.dom,
+ bw,
+ ts;
+
+
+ if(this.collapsible && !this.hideCollapseTool){
+ this.tools = this.tools ? this.tools.slice(0) : [];
+ this.tools[this.collapseFirst?'unshift':'push']({
+ id: 'toggle',
+ handler : this.toggleCollapse,
+ scope: this
+ });
+ }
+
+ if(this.tools){
+ ts = this.tools;
+ this.elements += (this.header !== false) ? ',header' : '';
+ }
+ this.tools = {};
+
+ el.addClass(this.baseCls);
+ if(d.firstChild){
+ this.header = el.down('.'+this.headerCls);
+ this.bwrap = el.down('.'+this.bwrapCls);
+ var cp = this.bwrap ? this.bwrap : el;
+ this.tbar = cp.down('.'+this.tbarCls);
+ this.body = cp.down('.'+this.bodyCls);
+ this.bbar = cp.down('.'+this.bbarCls);
+ this.footer = cp.down('.'+this.footerCls);
+ this.fromMarkup = true;
+ }
+ if (this.preventBodyReset === true) {
+ el.addClass('x-panel-reset');
+ }
+ if(this.cls){
+ el.addClass(this.cls);
+ }
+
+ if(this.buttons){
+ this.elements += ',footer';
+ }
+
+
+
+
+ if(this.frame){
+ el.insertHtml('afterBegin', String.format(Ext.Element.boxMarkup, this.baseCls));
+
+ this.createElement('header', d.firstChild.firstChild.firstChild);
+ this.createElement('bwrap', d);
+
+
+ bw = this.bwrap.dom;
+ var ml = d.childNodes[1], bl = d.childNodes[2];
+ bw.appendChild(ml);
+ bw.appendChild(bl);
+
+ var mc = bw.firstChild.firstChild.firstChild;
+ this.createElement('tbar', mc);
+ this.createElement('body', mc);
+ this.createElement('bbar', mc);
+ this.createElement('footer', bw.lastChild.firstChild.firstChild);
+
+ if(!this.footer){
+ this.bwrap.dom.lastChild.className += ' x-panel-nofooter';
+ }
+
+ this.ft = Ext.get(this.bwrap.dom.lastChild);
+ this.mc = Ext.get(mc);
+ }else{
+ this.createElement('header', d);
+ this.createElement('bwrap', d);
+
+
+ bw = this.bwrap.dom;
+ this.createElement('tbar', bw);
+ this.createElement('body', bw);
+ this.createElement('bbar', bw);
+ this.createElement('footer', bw);
+
+ if(!this.header){
+ this.body.addClass(this.bodyCls + '-noheader');
+ if(this.tbar){
+ this.tbar.addClass(this.tbarCls + '-noheader');
+ }
+ }
+ }
+
+ if(Ext.isDefined(this.padding)){
+ this.body.setStyle('padding', this.body.addUnits(this.padding));
+ }
+
+ if(this.border === false){
+ this.el.addClass(this.baseCls + '-noborder');
+ this.body.addClass(this.bodyCls + '-noborder');
+ if(this.header){
+ this.header.addClass(this.headerCls + '-noborder');
+ }
+ if(this.footer){
+ this.footer.addClass(this.footerCls + '-noborder');
+ }
+ if(this.tbar){
+ this.tbar.addClass(this.tbarCls + '-noborder');
+ }
+ if(this.bbar){
+ this.bbar.addClass(this.bbarCls + '-noborder');
+ }
+ }
+
+ if(this.bodyBorder === false){
+ this.body.addClass(this.bodyCls + '-noborder');
+ }
+
+ this.bwrap.enableDisplayMode('block');
+
+ if(this.header){
+ this.header.unselectable();
+
+
+ if(this.headerAsText){
+ this.header.dom.innerHTML =
+ '<span class="' + this.headerTextCls + '">'+this.header.dom.innerHTML+'</span>';
+
+ if(this.iconCls){
+ this.setIconClass(this.iconCls);
+ }
+ }
+ }
+
+ if(this.floating){
+ this.makeFloating(this.floating);
+ }
+
+ if(this.collapsible && this.titleCollapse && this.header){
+ this.mon(this.header, 'click', this.toggleCollapse, this);
+ this.header.setStyle('cursor', 'pointer');
+ }
+ if(ts){
+ this.addTool.apply(this, ts);
+ }
+
+
+ if(this.fbar){
+ this.footer.addClass('x-panel-btns');
+ this.fbar.ownerCt = this;
+ this.fbar.render(this.footer);
+ this.footer.createChild({cls:'x-clear'});
+ }
+ if(this.tbar && this.topToolbar){
+ this.topToolbar.ownerCt = this;
+ this.topToolbar.render(this.tbar);
+ }
+ if(this.bbar && this.bottomToolbar){
+ this.bottomToolbar.ownerCt = this;
+ this.bottomToolbar.render(this.bbar);
+ }
+ },
+
+
+ setIconClass : function(cls){
+ var old = this.iconCls;
+ this.iconCls = cls;
+ if(this.rendered && this.header){
+ if(this.frame){
+ this.header.addClass('x-panel-icon');
+ this.header.replaceClass(old, this.iconCls);
+ }else{
+ var hd = this.header,
+ img = hd.child('img.x-panel-inline-icon');
+ if(img){
+ Ext.fly(img).replaceClass(old, this.iconCls);
+ }else{
+ var hdspan = hd.child('span.' + this.headerTextCls);
+ if (hdspan) {
+ Ext.DomHelper.insertBefore(hdspan.dom, {
+ tag:'img', alt: '', src: Ext.BLANK_IMAGE_URL, cls:'x-panel-inline-icon '+this.iconCls
+ });
+ }
+ }
+ }
+ }
+ this.fireEvent('iconchange', this, cls, old);
+ },
+
+
+ makeFloating : function(cfg){
+ this.floating = true;
+ this.el = new Ext.Layer(Ext.apply({}, cfg, {
+ shadow: Ext.isDefined(this.shadow) ? this.shadow : 'sides',
+ shadowOffset: this.shadowOffset,
+ constrain:false,
+ shim: this.shim === false ? false : undefined
+ }), this.el);
+ },
+
+
+ getTopToolbar : function(){
+ return this.topToolbar;
+ },
+
+
+ getBottomToolbar : function(){
+ return this.bottomToolbar;
+ },
+
+
+ getFooterToolbar : function() {
+ return this.fbar;
+ },
+
+
+ addButton : function(config, handler, scope){
+ if(!this.fbar){
+ this.createFbar([]);
+ }
+ if(handler){
+ if(Ext.isString(config)){
+ config = {text: config};
+ }
+ config = Ext.apply({
+ handler: handler,
+ scope: scope
+ }, config);
+ }
+ return this.fbar.add(config);
+ },
+
+
+ addTool : function(){
+ if(!this.rendered){
+ if(!this.tools){
+ this.tools = [];
+ }
+ Ext.each(arguments, function(arg){
+ this.tools.push(arg);
+ }, this);
+ return;
+ }
+
+ if(!this[this.toolTarget]){
+ return;
+ }
+ if(!this.toolTemplate){
+
+ var tt = new Ext.Template(
+ '<div class="x-tool x-tool-{id}">&#160;</div>'
+ );
+ tt.disableFormats = true;
+ tt.compile();
+ Ext.Panel.prototype.toolTemplate = tt;
+ }
+ for(var i = 0, a = arguments, len = a.length; i < len; i++) {
+ var tc = a[i];
+ if(!this.tools[tc.id]){
+ var overCls = 'x-tool-'+tc.id+'-over';
+ var t = this.toolTemplate.insertFirst(this[this.toolTarget], tc, true);
+ this.tools[tc.id] = t;
+ t.enableDisplayMode('block');
+ this.mon(t, 'click', this.createToolHandler(t, tc, overCls, this));
+ if(tc.on){
+ this.mon(t, tc.on);
+ }
+ if(tc.hidden){
+ t.hide();
+ }
+ if(tc.qtip){
+ if(Ext.isObject(tc.qtip)){
+ Ext.QuickTips.register(Ext.apply({
+ target: t.id
+ }, tc.qtip));
+ } else {
+ t.dom.qtip = tc.qtip;
+ }
+ }
+ t.addClassOnOver(overCls);
+ }
+ }
+ },
+
+ onLayout : function(shallow, force){
+ Ext.Panel.superclass.onLayout.apply(this, arguments);
+ if(this.hasLayout && this.toolbars.length > 0){
+ Ext.each(this.toolbars, function(tb){
+ tb.doLayout(undefined, force);
+ });
+ this.syncHeight();
+ }
+ },
+
+ syncHeight : function(){
+ var h = this.toolbarHeight,
+ bd = this.body,
+ lsh = this.lastSize.height,
+ sz;
+
+ if(this.autoHeight || !Ext.isDefined(lsh) || lsh == 'auto'){
+ return;
+ }
+
+
+ if(h != this.getToolbarHeight()){
+ h = Math.max(0, lsh - this.getFrameHeight());
+ bd.setHeight(h);
+ sz = bd.getSize();
+ this.toolbarHeight = this.getToolbarHeight();
+ this.onBodyResize(sz.width, sz.height);
+ }
+ },
+
+
+ onShow : function(){
+ if(this.floating){
+ return this.el.show();
+ }
+ Ext.Panel.superclass.onShow.call(this);
+ },
+
+
+ onHide : function(){
+ if(this.floating){
+ return this.el.hide();
+ }
+ Ext.Panel.superclass.onHide.call(this);
+ },
+
+
+ createToolHandler : function(t, tc, overCls, panel){
+ return function(e){
+ t.removeClass(overCls);
+ if(tc.stopEvent !== false){
+ e.stopEvent();
+ }
+ if(tc.handler){
+ tc.handler.call(tc.scope || t, e, t, panel, tc);
+ }
+ };
+ },
+
+
+ afterRender : function(){
+ if(this.floating && !this.hidden){
+ this.el.show();
+ }
+ if(this.title){
+ this.setTitle(this.title);
+ }
+ Ext.Panel.superclass.afterRender.call(this);
+ if (this.collapsed) {
+ this.collapsed = false;
+ this.collapse(false);
+ }
+ this.initEvents();
+ },
+
+
+ getKeyMap : function(){
+ if(!this.keyMap){
+ this.keyMap = new Ext.KeyMap(this.el, this.keys);
+ }
+ return this.keyMap;
+ },
+
+
+ initEvents : function(){
+ if(this.keys){
+ this.getKeyMap();
+ }
+ if(this.draggable){
+ this.initDraggable();
+ }
+ if(this.toolbars.length > 0){
+ Ext.each(this.toolbars, function(tb){
+ tb.doLayout();
+ tb.on({
+ scope: this,
+ afterlayout: this.syncHeight,
+ remove: this.syncHeight
+ });
+ }, this);
+ this.syncHeight();
+ }
+
+ },
+
+
+ initDraggable : function(){
+
+ this.dd = new Ext.Panel.DD(this, Ext.isBoolean(this.draggable) ? null : this.draggable);
+ },
+
+
+ beforeEffect : function(anim){
+ if(this.floating){
+ this.el.beforeAction();
+ }
+ if(anim !== false){
+ this.el.addClass('x-panel-animated');
+ }
+ },
+
+
+ afterEffect : function(anim){
+ this.syncShadow();
+ this.el.removeClass('x-panel-animated');
+ },
+
+
+ createEffect : function(a, cb, scope){
+ var o = {
+ scope:scope,
+ block:true
+ };
+ if(a === true){
+ o.callback = cb;
+ return o;
+ }else if(!a.callback){
+ o.callback = cb;
+ }else {
+ o.callback = function(){
+ cb.call(scope);
+ Ext.callback(a.callback, a.scope);
+ };
+ }
+ return Ext.applyIf(o, a);
+ },
+
+
+ collapse : function(animate){
+ if(this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforecollapse', this, animate) === false){
+ return;
+ }
+ var doAnim = animate === true || (animate !== false && this.animCollapse);
+ this.beforeEffect(doAnim);
+ this.onCollapse(doAnim, animate);
+ return this;
+ },
+
+
+ onCollapse : function(doAnim, animArg){
+ if(doAnim){
+ this[this.collapseEl].slideOut(this.slideAnchor,
+ Ext.apply(this.createEffect(animArg||true, this.afterCollapse, this),
+ this.collapseDefaults));
+ }else{
+ this[this.collapseEl].hide(this.hideMode);
+ this.afterCollapse(false);
+ }
+ },
+
+
+ afterCollapse : function(anim){
+ this.collapsed = true;
+ this.el.addClass(this.collapsedCls);
+ if(anim !== false){
+ this[this.collapseEl].hide(this.hideMode);
+ }
+ this.afterEffect(anim);
+
+
+ this.cascade(function(c) {
+ if (c.lastSize) {
+ c.lastSize = { width: undefined, height: undefined };
+ }
+ });
+ this.fireEvent('collapse', this);
+ },
+
+
+ expand : function(animate){
+ if(!this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforeexpand', this, animate) === false){
+ return;
+ }
+ var doAnim = animate === true || (animate !== false && this.animCollapse);
+ this.el.removeClass(this.collapsedCls);
+ this.beforeEffect(doAnim);
+ this.onExpand(doAnim, animate);
+ return this;
+ },
+
+
+ onExpand : function(doAnim, animArg){
+ if(doAnim){
+ this[this.collapseEl].slideIn(this.slideAnchor,
+ Ext.apply(this.createEffect(animArg||true, this.afterExpand, this),
+ this.expandDefaults));
+ }else{
+ this[this.collapseEl].show(this.hideMode);
+ this.afterExpand(false);
+ }
+ },
+
+
+ afterExpand : function(anim){
+ this.collapsed = false;
+ if(anim !== false){
+ this[this.collapseEl].show(this.hideMode);
+ }
+ this.afterEffect(anim);
+ if (this.deferLayout) {
+ delete this.deferLayout;
+ this.doLayout(true);
+ }
+ this.fireEvent('expand', this);
+ },
+
+
+ toggleCollapse : function(animate){
+ this[this.collapsed ? 'expand' : 'collapse'](animate);
+ return this;
+ },
+
+
+ onDisable : function(){
+ if(this.rendered && this.maskDisabled){
+ this.el.mask();
+ }
+ Ext.Panel.superclass.onDisable.call(this);
+ },
+
+
+ onEnable : function(){
+ if(this.rendered && this.maskDisabled){
+ this.el.unmask();
+ }
+ Ext.Panel.superclass.onEnable.call(this);
+ },
+
+
+ onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){
+ var w = adjWidth,
+ h = adjHeight;
+
+ if(Ext.isDefined(w) || Ext.isDefined(h)){
+ if(!this.collapsed){
+
+
+
+
+ if(Ext.isNumber(w)){
+ this.body.setWidth(w = this.adjustBodyWidth(w - this.getFrameWidth()));
+ } else if (w == 'auto') {
+ w = this.body.setWidth('auto').dom.offsetWidth;
+ } else {
+ w = this.body.dom.offsetWidth;
+ }
+
+ if(this.tbar){
+ this.tbar.setWidth(w);
+ if(this.topToolbar){
+ this.topToolbar.setSize(w);
+ }
+ }
+ if(this.bbar){
+ this.bbar.setWidth(w);
+ if(this.bottomToolbar){
+ this.bottomToolbar.setSize(w);
+
+ if (Ext.isIE9m) {
+ this.bbar.setStyle('position', 'static');
+ this.bbar.setStyle('position', '');
+ }
+ }
+ }
+ if(this.footer){
+ this.footer.setWidth(w);
+ if(this.fbar){
+ this.fbar.setSize(Ext.isIE9m ? (w - this.footer.getFrameWidth('lr')) : 'auto');
+ }
+ }
+
+
+ if(Ext.isNumber(h)){
+ h = Math.max(0, h - this.getFrameHeight());
+
+ this.body.setHeight(h);
+ }else if(h == 'auto'){
+ this.body.setHeight(h);
+ }
+
+ if(this.disabled && this.el._mask){
+ this.el._mask.setSize(this.el.dom.clientWidth, this.el.getHeight());
+ }
+ }else{
+
+ this.queuedBodySize = {width: w, height: h};
+ if(!this.queuedExpand && this.allowQueuedExpand !== false){
+ this.queuedExpand = true;
+ this.on('expand', function(){
+ delete this.queuedExpand;
+ this.onResize(this.queuedBodySize.width, this.queuedBodySize.height);
+ }, this, {single:true});
+ }
+ }
+ this.onBodyResize(w, h);
+ }
+ this.syncShadow();
+ Ext.Panel.superclass.onResize.call(this, adjWidth, adjHeight, rawWidth, rawHeight);
+
+ },
+
+
+ onBodyResize: function(w, h){
+ this.fireEvent('bodyresize', this, w, h);
+ },
+
+
+ getToolbarHeight: function(){
+ var h = 0;
+ if(this.rendered){
+ Ext.each(this.toolbars, function(tb){
+ h += tb.getHeight();
+ }, this);
+ }
+ return h;
+ },
+
+
+ adjustBodyHeight : function(h){
+ return h;
+ },
+
+
+ adjustBodyWidth : function(w){
+ return w;
+ },
+
+
+ onPosition : function(){
+ this.syncShadow();
+ },
+
+
+ getFrameWidth : function(){
+ var w = this.el.getFrameWidth('lr') + this.bwrap.getFrameWidth('lr');
+
+ if(this.frame){
+ var l = this.bwrap.dom.firstChild;
+ w += (Ext.fly(l).getFrameWidth('l') + Ext.fly(l.firstChild).getFrameWidth('r'));
+ w += this.mc.getFrameWidth('lr');
+ }
+ return w;
+ },
+
+
+ getFrameHeight : function() {
+ var h = this.el.getFrameWidth('tb') + this.bwrap.getFrameWidth('tb');
+ h += (this.tbar ? this.tbar.getHeight() : 0) +
+ (this.bbar ? this.bbar.getHeight() : 0);
+
+ if(this.frame){
+ h += this.el.dom.firstChild.offsetHeight + this.ft.dom.offsetHeight + this.mc.getFrameWidth('tb');
+ }else{
+ h += (this.header ? this.header.getHeight() : 0) +
+ (this.footer ? this.footer.getHeight() : 0);
+ }
+ return h;
+ },
+
+
+ getInnerWidth : function(){
+ return this.getSize().width - this.getFrameWidth();
+ },
+
+
+ getInnerHeight : function(){
+ return this.body.getHeight();
+
+ },
+
+
+ syncShadow : function(){
+ if(this.floating){
+ this.el.sync(true);
+ }
+ },
+
+
+ getLayoutTarget : function(){
+ return this.body;
+ },
+
+
+ getContentTarget : function(){
+ return this.body;
+ },
+
+
+ setTitle : function(title, iconCls){
+ this.title = title;
+ if(this.header && this.headerAsText){
+ this.header.child('span').update(title);
+ }
+ if(iconCls){
+ this.setIconClass(iconCls);
+ }
+ this.fireEvent('titlechange', this, title);
+ return this;
+ },
+
+
+ getUpdater : function(){
+ return this.body.getUpdater();
+ },
+
+
+ load : function(){
+ var um = this.body.getUpdater();
+ um.update.apply(um, arguments);
+ return this;
+ },
+
+
+ beforeDestroy : function(){
+ Ext.Panel.superclass.beforeDestroy.call(this);
+ if(this.header){
+ this.header.removeAllListeners();
+ }
+ if(this.tools){
+ for(var k in this.tools){
+ Ext.destroy(this.tools[k]);
+ }
+ }
+ if(this.toolbars.length > 0){
+ Ext.each(this.toolbars, function(tb){
+ tb.un('afterlayout', this.syncHeight, this);
+ tb.un('remove', this.syncHeight, this);
+ }, this);
+ }
+ if(Ext.isArray(this.buttons)){
+ while(this.buttons.length) {
+ Ext.destroy(this.buttons[0]);
+ }
+ }
+ if(this.rendered){
+ Ext.destroy(
+ this.ft,
+ this.header,
+ this.footer,
+ this.tbar,
+ this.bbar,
+ this.body,
+ this.mc,
+ this.bwrap,
+ this.dd
+ );
+ if (this.fbar) {
+ Ext.destroy(
+ this.fbar,
+ this.fbar.el
+ );
+ }
+ }
+ Ext.destroy(this.toolbars);
+ },
+
+
+ createClasses : function(){
+ this.headerCls = this.baseCls + '-header';
+ this.headerTextCls = this.baseCls + '-header-text';
+ this.bwrapCls = this.baseCls + '-bwrap';
+ this.tbarCls = this.baseCls + '-tbar';
+ this.bodyCls = this.baseCls + '-body';
+ this.bbarCls = this.baseCls + '-bbar';
+ this.footerCls = this.baseCls + '-footer';
+ },
+
+
+ createGhost : function(cls, useShim, appendTo){
+ var el = document.createElement('div');
+ el.className = 'x-panel-ghost ' + (cls ? cls : '');
+ if(this.header){
+ el.appendChild(this.el.dom.firstChild.cloneNode(true));
+ }
+ Ext.fly(el.appendChild(document.createElement('ul'))).setHeight(this.bwrap.getHeight());
+ el.style.width = this.el.dom.offsetWidth + 'px';;
+ if(!appendTo){
+ this.container.dom.appendChild(el);
+ }else{
+ Ext.getDom(appendTo).appendChild(el);
+ }
+ if(useShim !== false && this.el.useShim !== false){
+ var layer = new Ext.Layer({shadow:false, useDisplay:true, constrain:false}, el);
+ layer.show();
+ return layer;
+ }else{
+ return new Ext.Element(el);
+ }
+ },
+
+
+ doAutoLoad : function(){
+ var u = this.body.getUpdater();
+ if(this.renderer){
+ u.setRenderer(this.renderer);
+ }
+ u.update(Ext.isObject(this.autoLoad) ? this.autoLoad : {url: this.autoLoad});
+ },
+
+
+ getTool : function(id) {
+ return this.tools[id];
+ }
+
+
+});
+Ext.reg('panel', Ext.Panel);
+
+Ext.Editor = function(field, config){
+ if(field.field){
+ this.field = Ext.create(field.field, 'textfield');
+ config = Ext.apply({}, field);
+ delete config.field;
+ }else{
+ this.field = field;
+ }
+ Ext.Editor.superclass.constructor.call(this, config);
+};
+
+Ext.extend(Ext.Editor, Ext.Component, {
+
+
+ allowBlur: true,
+
+
+
+
+
+ value : "",
+
+ alignment: "c-c?",
+
+ offsets: [0, 0],
+
+ shadow : "frame",
+
+ constrain : false,
+
+ swallowKeys : true,
+
+ completeOnEnter : true,
+
+ cancelOnEsc : true,
+
+ updateEl : false,
+
+ initComponent : function(){
+ Ext.Editor.superclass.initComponent.call(this);
+ this.addEvents(
+
+ "beforestartedit",
+
+ "startedit",
+
+ "beforecomplete",
+
+ "complete",
+
+ "canceledit",
+
+ "specialkey"
+ );
+ },
+
+
+ onRender : function(ct, position){
+ this.el = new Ext.Layer({
+ shadow: this.shadow,
+ cls: "x-editor",
+ parentEl : ct,
+ shim : this.shim,
+ shadowOffset: this.shadowOffset || 4,
+ id: this.id,
+ constrain: this.constrain
+ });
+ if(this.zIndex){
+ this.el.setZIndex(this.zIndex);
+ }
+ this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden");
+ if(this.field.msgTarget != 'title'){
+ this.field.msgTarget = 'qtip';
+ }
+ this.field.inEditor = true;
+ this.mon(this.field, {
+ scope: this,
+ blur: this.onBlur,
+ specialkey: this.onSpecialKey
+ });
+ if(this.field.grow){
+ this.mon(this.field, "autosize", this.el.sync, this.el, {delay:1});
+ }
+ this.field.render(this.el).show();
+ this.field.getEl().dom.name = '';
+ if(this.swallowKeys){
+ this.field.el.swallowEvent([
+ 'keypress',
+ 'keydown'
+ ]);
+ }
+ },
+
+
+ onSpecialKey : function(field, e){
+ var key = e.getKey(),
+ complete = this.completeOnEnter && key == e.ENTER,
+ cancel = this.cancelOnEsc && key == e.ESC;
+ if(complete || cancel){
+ e.stopEvent();
+ if(complete){
+ this.completeEdit();
+ }else{
+ this.cancelEdit();
+ }
+ if(field.triggerBlur){
+ field.triggerBlur();
+ }
+ }
+ this.fireEvent('specialkey', field, e);
+ },
+
+
+ startEdit : function(el, value){
+ if(this.editing){
+ this.completeEdit();
+ }
+ this.boundEl = Ext.get(el);
+ var v = value !== undefined ? value : this.boundEl.dom.innerHTML;
+ if(!this.rendered){
+ this.render(this.parentEl || document.body);
+ }
+ if(this.fireEvent("beforestartedit", this, this.boundEl, v) !== false){
+ this.startValue = v;
+ this.field.reset();
+ this.field.setValue(v);
+ this.realign(true);
+ this.editing = true;
+ this.show();
+ }
+ },
+
+
+ doAutoSize : function(){
+ if(this.autoSize){
+ var sz = this.boundEl.getSize(),
+ fs = this.field.getSize();
+
+ switch(this.autoSize){
+ case "width":
+ this.setSize(sz.width, fs.height);
+ break;
+ case "height":
+ this.setSize(fs.width, sz.height);
+ break;
+ case "none":
+ this.setSize(fs.width, fs.height);
+ break;
+ default:
+ this.setSize(sz.width, sz.height);
+ }
+ }
+ },
+
+
+ setSize : function(w, h){
+ delete this.field.lastSize;
+ this.field.setSize(w, h);
+ if(this.el){
+
+ if(Ext.isGecko2 || Ext.isOpera || (Ext.isIE7 && Ext.isStrict)){
+
+ this.el.setSize(w, h);
+ }
+ this.el.sync();
+ }
+ },
+
+
+ realign : function(autoSize){
+ if(autoSize === true){
+ this.doAutoSize();
+ }
+ this.el.alignTo(this.boundEl, this.alignment, this.offsets);
+ },
+
+
+ completeEdit : function(remainVisible){
+ if(!this.editing){
+ return;
+ }
+
+ if (this.field.assertValue) {
+ this.field.assertValue();
+ }
+ var v = this.getValue();
+ if(!this.field.isValid()){
+ if(this.revertInvalid !== false){
+ this.cancelEdit(remainVisible);
+ }
+ return;
+ }
+ if(String(v) === String(this.startValue) && this.ignoreNoChange){
+ this.hideEdit(remainVisible);
+ return;
+ }
+ if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){
+ v = this.getValue();
+ if(this.updateEl && this.boundEl){
+ this.boundEl.update(v);
+ }
+ this.hideEdit(remainVisible);
+ this.fireEvent("complete", this, v, this.startValue);
+ }
+ },
+
+
+ onShow : function(){
+ this.el.show();
+ if(this.hideEl !== false){
+ this.boundEl.hide();
+ }
+ this.field.show().focus(false, true);
+ this.fireEvent("startedit", this.boundEl, this.startValue);
+ },
+
+
+ cancelEdit : function(remainVisible){
+ if(this.editing){
+ var v = this.getValue();
+ this.setValue(this.startValue);
+ this.hideEdit(remainVisible);
+ this.fireEvent("canceledit", this, v, this.startValue);
+ }
+ },
+
+
+ hideEdit: function(remainVisible){
+ if(remainVisible !== true){
+ this.editing = false;
+ this.hide();
+ }
+ },
+
+
+ onBlur : function(){
+
+ if(this.allowBlur === true && this.editing && this.selectSameEditor !== true){
+ this.completeEdit();
+ }
+ },
+
+
+ onHide : function(){
+ if(this.editing){
+ this.completeEdit();
+ return;
+ }
+ this.field.blur();
+ if(this.field.collapse){
+ this.field.collapse();
+ }
+ this.el.hide();
+ if(this.hideEl !== false){
+ this.boundEl.show();
+ }
+ },
+
+
+ setValue : function(v){
+ this.field.setValue(v);
+ },
+
+
+ getValue : function(){
+ return this.field.getValue();
+ },
+
+ beforeDestroy : function(){
+ Ext.destroyMembers(this, 'field');
+
+ delete this.parentEl;
+ delete this.boundEl;
+ }
+});
+Ext.reg('editor', Ext.Editor);
+
+Ext.ColorPalette = Ext.extend(Ext.Component, {
+
+
+ itemCls : 'x-color-palette',
+
+ value : null,
+
+ clickEvent :'click',
+
+ ctype : 'Ext.ColorPalette',
+
+
+ allowReselect : false,
+
+
+ colors : [
+ '000000', '993300', '333300', '003300', '003366', '000080', '333399', '333333',
+ '800000', 'FF6600', '808000', '008000', '008080', '0000FF', '666699', '808080',
+ 'FF0000', 'FF9900', '99CC00', '339966', '33CCCC', '3366FF', '800080', '969696',
+ 'FF00FF', 'FFCC00', 'FFFF00', '00FF00', '00FFFF', '00CCFF', '993366', 'C0C0C0',
+ 'FF99CC', 'FFCC99', 'FFFF99', 'CCFFCC', 'CCFFFF', '99CCFF', 'CC99FF', 'FFFFFF'
+ ],
+
+
+
+
+
+ initComponent : function(){
+ Ext.ColorPalette.superclass.initComponent.call(this);
+ this.addEvents(
+
+ 'select'
+ );
+
+ if(this.handler){
+ this.on('select', this.handler, this.scope, true);
+ }
+ },
+
+
+ onRender : function(container, position){
+ this.autoEl = {
+ tag: 'div',
+ cls: this.itemCls
+ };
+ Ext.ColorPalette.superclass.onRender.call(this, container, position);
+ var t = this.tpl || new Ext.XTemplate(
+ '<tpl for="."><a href="#" class="color-{.}" hidefocus="on"><em><span style="background:#{.}" class="x-unselectable" unselectable="on">&#160;</span></em></a></tpl>'
+ );
+ t.overwrite(this.el, this.colors);
+ this.mon(this.el, this.clickEvent, this.handleClick, this, {delegate: 'a'});
+ if(this.clickEvent != 'click'){
+ this.mon(this.el, 'click', Ext.emptyFn, this, {delegate: 'a', preventDefault: true});
+ }
+ },
+
+
+ afterRender : function(){
+ Ext.ColorPalette.superclass.afterRender.call(this);
+ if(this.value){
+ var s = this.value;
+ this.value = null;
+ this.select(s, true);
+ }
+ },
+
+
+ handleClick : function(e, t){
+ e.preventDefault();
+ if(!this.disabled){
+ var c = t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];
+ this.select(c.toUpperCase());
+ }
+ },
+
+
+ select : function(color, suppressEvent){
+ color = color.replace('#', '');
+ if(color != this.value || this.allowReselect){
+ var el = this.el;
+ if(this.value){
+ el.child('a.color-'+this.value).removeClass('x-color-palette-sel');
+ }
+ el.child('a.color-'+color).addClass('x-color-palette-sel');
+ this.value = color;
+ if(suppressEvent !== true){
+ this.fireEvent('select', this, color);
+ }
+ }
+ }
+
+
+});
+Ext.reg('colorpalette', Ext.ColorPalette);
+Ext.DatePicker = Ext.extend(Ext.BoxComponent, {
+
+ todayText : 'Today',
+
+ okText : '&#160;OK&#160;',
+
+ cancelText : 'Cancel',
+
+
+
+ todayTip : '{0} (Spacebar)',
+
+ minText : 'This date is before the minimum date',
+
+ maxText : 'This date is after the maximum date',
+
+ format : 'm/d/y',
+
+ disabledDaysText : 'Disabled',
+
+ disabledDatesText : 'Disabled',
+
+ monthNames : Date.monthNames,
+
+ dayNames : Date.dayNames,
+
+ nextText : 'Next Month (Control+Right)',
+
+ prevText : 'Previous Month (Control+Left)',
+
+ monthYearText : 'Choose a month (Control+Up/Down to move years)',
+
+ startDay : 0,
+
+ showToday : true,
+
+
+
+
+
+
+
+
+ focusOnSelect: true,
+
+
+
+ initHour: 12,
+
+
+ initComponent : function(){
+ Ext.DatePicker.superclass.initComponent.call(this);
+
+ this.value = this.value ?
+ this.value.clearTime(true) : new Date().clearTime();
+
+ this.addEvents(
+
+ 'select'
+ );
+
+ if(this.handler){
+ this.on('select', this.handler, this.scope || this);
+ }
+
+ this.initDisabledDays();
+ },
+
+
+ initDisabledDays : function(){
+ if(!this.disabledDatesRE && this.disabledDates){
+ var dd = this.disabledDates,
+ len = dd.length - 1,
+ re = '(?:';
+
+ Ext.each(dd, function(d, i){
+ re += Ext.isDate(d) ? '^' + Ext.escapeRe(d.dateFormat(this.format)) + '$' : dd[i];
+ if(i != len){
+ re += '|';
+ }
+ }, this);
+ this.disabledDatesRE = new RegExp(re + ')');
+ }
+ },
+
+
+ setDisabledDates : function(dd){
+ if(Ext.isArray(dd)){
+ this.disabledDates = dd;
+ this.disabledDatesRE = null;
+ }else{
+ this.disabledDatesRE = dd;
+ }
+ this.initDisabledDays();
+ this.update(this.value, true);
+ },
+
+
+ setDisabledDays : function(dd){
+ this.disabledDays = dd;
+ this.update(this.value, true);
+ },
+
+
+ setMinDate : function(dt){
+ this.minDate = dt;
+ this.update(this.value, true);
+ },
+
+
+ setMaxDate : function(dt){
+ this.maxDate = dt;
+ this.update(this.value, true);
+ },
+
+
+ setValue : function(value){
+ this.value = value.clearTime(true);
+ this.update(this.value);
+ },
+
+
+ getValue : function(){
+ return this.value;
+ },
+
+
+ focus : function(){
+ this.update(this.activeDate);
+ },
+
+
+ onEnable: function(initial){
+ Ext.DatePicker.superclass.onEnable.call(this);
+ this.doDisabled(false);
+ this.update(initial ? this.value : this.activeDate);
+ if(Ext.isIE9m){
+ this.el.repaint();
+ }
+
+ },
+
+
+ onDisable : function(){
+ Ext.DatePicker.superclass.onDisable.call(this);
+ this.doDisabled(true);
+ if(Ext.isIE9m && !Ext.isIE8){
+
+ Ext.each([].concat(this.textNodes, this.el.query('th span')), function(el){
+ Ext.fly(el).repaint();
+ });
+ }
+ },
+
+
+ doDisabled : function(disabled){
+ this.keyNav.setDisabled(disabled);
+ this.prevRepeater.setDisabled(disabled);
+ this.nextRepeater.setDisabled(disabled);
+ if(this.showToday){
+ this.todayKeyListener.setDisabled(disabled);
+ this.todayBtn.setDisabled(disabled);
+ }
+ },
+
+
+ onRender : function(container, position){
+ var m = [
+ '<table cellspacing="0">',
+ '<tr><td class="x-date-left"><a href="#" title="', this.prevText ,'">&#160;</a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="', this.nextText ,'">&#160;</a></td></tr>',
+ '<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>'],
+ dn = this.dayNames,
+ i;
+ for(i = 0; i < 7; i++){
+ var d = this.startDay+i;
+ if(d > 6){
+ d = d-7;
+ }
+ m.push('<th><span>', dn[d].substr(0,1), '</span></th>');
+ }
+ m[m.length] = '</tr></thead><tbody><tr>';
+ for(i = 0; i < 42; i++) {
+ if(i % 7 === 0 && i !== 0){
+ m[m.length] = '</tr><tr>';
+ }
+ m[m.length] = '<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>';
+ }
+ m.push('</tr></tbody></table></td></tr>',
+ this.showToday ? '<tr><td colspan="3" class="x-date-bottom" align="center"></td></tr>' : '',
+ '</table><div class="x-date-mp"></div>');
+
+ var el = document.createElement('div');
+ el.className = 'x-date-picker';
+ el.innerHTML = m.join('');
+
+ container.dom.insertBefore(el, position);
+
+ this.el = Ext.get(el);
+ this.eventEl = Ext.get(el.firstChild);
+
+ this.prevRepeater = new Ext.util.ClickRepeater(this.el.child('td.x-date-left a'), {
+ handler: this.showPrevMonth,
+ scope: this,
+ preventDefault:true,
+ stopDefault:true
+ });
+
+ this.nextRepeater = new Ext.util.ClickRepeater(this.el.child('td.x-date-right a'), {
+ handler: this.showNextMonth,
+ scope: this,
+ preventDefault:true,
+ stopDefault:true
+ });
+
+ this.monthPicker = this.el.down('div.x-date-mp');
+ this.monthPicker.enableDisplayMode('block');
+
+ this.keyNav = new Ext.KeyNav(this.eventEl, {
+ 'left' : function(e){
+ if(e.ctrlKey){
+ this.showPrevMonth();
+ }else{
+ this.update(this.activeDate.add('d', -1));
+ }
+ },
+
+ 'right' : function(e){
+ if(e.ctrlKey){
+ this.showNextMonth();
+ }else{
+ this.update(this.activeDate.add('d', 1));
+ }
+ },
+
+ 'up' : function(e){
+ if(e.ctrlKey){
+ this.showNextYear();
+ }else{
+ this.update(this.activeDate.add('d', -7));
+ }
+ },
+
+ 'down' : function(e){
+ if(e.ctrlKey){
+ this.showPrevYear();
+ }else{
+ this.update(this.activeDate.add('d', 7));
+ }
+ },
+
+ 'pageUp' : function(e){
+ this.showNextMonth();
+ },
+
+ 'pageDown' : function(e){
+ this.showPrevMonth();
+ },
+
+ 'enter' : function(e){
+ e.stopPropagation();
+ return true;
+ },
+
+ scope : this
+ });
+
+ this.el.unselectable();
+
+ this.cells = this.el.select('table.x-date-inner tbody td');
+ this.textNodes = this.el.query('table.x-date-inner tbody span');
+
+ this.mbtn = new Ext.Button({
+ text: '&#160;',
+ tooltip: this.monthYearText,
+ renderTo: this.el.child('td.x-date-middle', true)
+ });
+ this.mbtn.el.child('em').addClass('x-btn-arrow');
+
+ if(this.showToday){
+ this.todayKeyListener = this.eventEl.addKeyListener(Ext.EventObject.SPACE, this.selectToday, this);
+ var today = (new Date()).dateFormat(this.format);
+ this.todayBtn = new Ext.Button({
+ renderTo: this.el.child('td.x-date-bottom', true),
+ text: String.format(this.todayText, today),
+ tooltip: String.format(this.todayTip, today),
+ handler: this.selectToday,
+ scope: this
+ });
+ }
+ this.mon(this.eventEl, 'mousewheel', this.handleMouseWheel, this);
+ this.mon(this.eventEl, 'click', this.handleDateClick, this, {delegate: 'a.x-date-date'});
+ this.mon(this.mbtn, 'click', this.showMonthPicker, this);
+ this.onEnable(true);
+ },
+
+
+ createMonthPicker : function(){
+ if(!this.monthPicker.dom.firstChild){
+ var buf = ['<table border="0" cellspacing="0">'];
+ for(var i = 0; i < 6; i++){
+ buf.push(
+ '<tr><td class="x-date-mp-month"><a href="#">', Date.getShortMonthName(i), '</a></td>',
+ '<td class="x-date-mp-month x-date-mp-sep"><a href="#">', Date.getShortMonthName(i + 6), '</a></td>',
+ i === 0 ?
+ '<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>' :
+ '<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>'
+ );
+ }
+ buf.push(
+ '<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">',
+ this.okText,
+ '</button><button type="button" class="x-date-mp-cancel">',
+ this.cancelText,
+ '</button></td></tr>',
+ '</table>'
+ );
+ this.monthPicker.update(buf.join(''));
+
+ this.mon(this.monthPicker, 'click', this.onMonthClick, this);
+ this.mon(this.monthPicker, 'dblclick', this.onMonthDblClick, this);
+
+ this.mpMonths = this.monthPicker.select('td.x-date-mp-month');
+ this.mpYears = this.monthPicker.select('td.x-date-mp-year');
+
+ this.mpMonths.each(function(m, a, i){
+ i += 1;
+ if((i%2) === 0){
+ m.dom.xmonth = 5 + Math.round(i * 0.5);
+ }else{
+ m.dom.xmonth = Math.round((i-1) * 0.5);
+ }
+ });
+ }
+ },
+
+
+ showMonthPicker : function(){
+ if(!this.disabled){
+ this.createMonthPicker();
+ var size = this.el.getSize();
+ this.monthPicker.setSize(size);
+ this.monthPicker.child('table').setSize(size);
+
+ this.mpSelMonth = (this.activeDate || this.value).getMonth();
+ this.updateMPMonth(this.mpSelMonth);
+ this.mpSelYear = (this.activeDate || this.value).getFullYear();
+ this.updateMPYear(this.mpSelYear);
+
+ this.monthPicker.slideIn('t', {duration:0.2});
+ }
+ },
+
+
+ updateMPYear : function(y){
+ this.mpyear = y;
+ var ys = this.mpYears.elements;
+ for(var i = 1; i <= 10; i++){
+ var td = ys[i-1], y2;
+ if((i%2) === 0){
+ y2 = y + Math.round(i * 0.5);
+ td.firstChild.innerHTML = y2;
+ td.xyear = y2;
+ }else{
+ y2 = y - (5-Math.round(i * 0.5));
+ td.firstChild.innerHTML = y2;
+ td.xyear = y2;
+ }
+ this.mpYears.item(i-1)[y2 == this.mpSelYear ? 'addClass' : 'removeClass']('x-date-mp-sel');
+ }
+ },
+
+
+ updateMPMonth : function(sm){
+ this.mpMonths.each(function(m, a, i){
+ m[m.dom.xmonth == sm ? 'addClass' : 'removeClass']('x-date-mp-sel');
+ });
+ },
+
+
+ selectMPMonth : function(m){
+
+ },
+
+
+ onMonthClick : function(e, t){
+ e.stopEvent();
+ var el = new Ext.Element(t), pn;
+ if(el.is('button.x-date-mp-cancel')){
+ this.hideMonthPicker();
+ }
+ else if(el.is('button.x-date-mp-ok')){
+ var d = new Date(this.mpSelYear, this.mpSelMonth, (this.activeDate || this.value).getDate());
+ if(d.getMonth() != this.mpSelMonth){
+
+ d = new Date(this.mpSelYear, this.mpSelMonth, 1).getLastDateOfMonth();
+ }
+ this.update(d);
+ this.hideMonthPicker();
+ }
+ else if((pn = el.up('td.x-date-mp-month', 2))){
+ this.mpMonths.removeClass('x-date-mp-sel');
+ pn.addClass('x-date-mp-sel');
+ this.mpSelMonth = pn.dom.xmonth;
+ }
+ else if((pn = el.up('td.x-date-mp-year', 2))){
+ this.mpYears.removeClass('x-date-mp-sel');
+ pn.addClass('x-date-mp-sel');
+ this.mpSelYear = pn.dom.xyear;
+ }
+ else if(el.is('a.x-date-mp-prev')){
+ this.updateMPYear(this.mpyear-10);
+ }
+ else if(el.is('a.x-date-mp-next')){
+ this.updateMPYear(this.mpyear+10);
+ }
+ },
+
+
+ onMonthDblClick : function(e, t){
+ e.stopEvent();
+ var el = new Ext.Element(t), pn;
+ if((pn = el.up('td.x-date-mp-month', 2))){
+ this.update(new Date(this.mpSelYear, pn.dom.xmonth, (this.activeDate || this.value).getDate()));
+ this.hideMonthPicker();
+ }
+ else if((pn = el.up('td.x-date-mp-year', 2))){
+ this.update(new Date(pn.dom.xyear, this.mpSelMonth, (this.activeDate || this.value).getDate()));
+ this.hideMonthPicker();
+ }
+ },
+
+
+ hideMonthPicker : function(disableAnim){
+ if(this.monthPicker){
+ if(disableAnim === true){
+ this.monthPicker.hide();
+ }else{
+ this.monthPicker.slideOut('t', {duration:0.2});
+ }
+ }
+ },
+
+
+ showPrevMonth : function(e){
+ this.update(this.activeDate.add('mo', -1));
+ },
+
+
+ showNextMonth : function(e){
+ this.update(this.activeDate.add('mo', 1));
+ },
+
+
+ showPrevYear : function(){
+ this.update(this.activeDate.add('y', -1));
+ },
+
+
+ showNextYear : function(){
+ this.update(this.activeDate.add('y', 1));
+ },
+
+
+ handleMouseWheel : function(e){
+ e.stopEvent();
+ if(!this.disabled){
+ var delta = e.getWheelDelta();
+ if(delta > 0){
+ this.showPrevMonth();
+ } else if(delta < 0){
+ this.showNextMonth();
+ }
+ }
+ },
+
+
+ handleDateClick : function(e, t){
+ e.stopEvent();
+ if(!this.disabled && t.dateValue && !Ext.fly(t.parentNode).hasClass('x-date-disabled')){
+ this.cancelFocus = this.focusOnSelect === false;
+ this.setValue(new Date(t.dateValue));
+ delete this.cancelFocus;
+ this.fireEvent('select', this, this.value);
+ }
+ },
+
+
+ selectToday : function(){
+ if(this.todayBtn && !this.todayBtn.disabled){
+ this.setValue(new Date().clearTime());
+ this.fireEvent('select', this, this.value);
+ }
+ },
+
+
+ update : function(date, forceRefresh){
+ if(this.rendered){
+ var vd = this.activeDate, vis = this.isVisible();
+ this.activeDate = date;
+ if(!forceRefresh && vd && this.el){
+ var t = date.getTime();
+ if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){
+ this.cells.removeClass('x-date-selected');
+ this.cells.each(function(c){
+ if(c.dom.firstChild.dateValue == t){
+ c.addClass('x-date-selected');
+ if(vis && !this.cancelFocus){
+ Ext.fly(c.dom.firstChild).focus(50);
+ }
+ return false;
+ }
+ }, this);
+ return;
+ }
+ }
+ var days = date.getDaysInMonth(),
+ firstOfMonth = date.getFirstDateOfMonth(),
+ startingPos = firstOfMonth.getDay()-this.startDay;
+
+ if(startingPos < 0){
+ startingPos += 7;
+ }
+ days += startingPos;
+
+ var pm = date.add('mo', -1),
+ prevStart = pm.getDaysInMonth()-startingPos,
+ cells = this.cells.elements,
+ textEls = this.textNodes,
+
+ d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart, this.initHour)),
+ today = new Date().clearTime().getTime(),
+ sel = date.clearTime(true).getTime(),
+ min = this.minDate ? this.minDate.clearTime(true) : Number.NEGATIVE_INFINITY,
+ max = this.maxDate ? this.maxDate.clearTime(true) : Number.POSITIVE_INFINITY,
+ ddMatch = this.disabledDatesRE,
+ ddText = this.disabledDatesText,
+ ddays = this.disabledDays ? this.disabledDays.join('') : false,
+ ddaysText = this.disabledDaysText,
+ format = this.format;
+
+ if(this.showToday){
+ var td = new Date().clearTime(),
+ disable = (td < min || td > max ||
+ (ddMatch && format && ddMatch.test(td.dateFormat(format))) ||
+ (ddays && ddays.indexOf(td.getDay()) != -1));
+
+ if(!this.disabled){
+ this.todayBtn.setDisabled(disable);
+ this.todayKeyListener[disable ? 'disable' : 'enable']();
+ }
+ }
+
+ var setCellClass = function(cal, cell){
+ cell.title = '';
+ var t = d.clearTime(true).getTime();
+ cell.firstChild.dateValue = t;
+ if(t == today){
+ cell.className += ' x-date-today';
+ cell.title = cal.todayText;
+ }
+ if(t == sel){
+ cell.className += ' x-date-selected';
+ if(vis){
+ Ext.fly(cell.firstChild).focus(50);
+ }
+ }
+
+ if(t < min) {
+ cell.className = ' x-date-disabled';
+ cell.title = cal.minText;
+ return;
+ }
+ if(t > max) {
+ cell.className = ' x-date-disabled';
+ cell.title = cal.maxText;
+ return;
+ }
+ if(ddays){
+ if(ddays.indexOf(d.getDay()) != -1){
+ cell.title = ddaysText;
+ cell.className = ' x-date-disabled';
+ }
+ }
+ if(ddMatch && format){
+ var fvalue = d.dateFormat(format);
+ if(ddMatch.test(fvalue)){
+ cell.title = ddText.replace('%0', fvalue);
+ cell.className = ' x-date-disabled';
+ }
+ }
+ };
+
+ var i = 0;
+ for(; i < startingPos; i++) {
+ textEls[i].innerHTML = (++prevStart);
+ d.setDate(d.getDate()+1);
+ cells[i].className = 'x-date-prevday';
+ setCellClass(this, cells[i]);
+ }
+ for(; i < days; i++){
+ var intDay = i - startingPos + 1;
+ textEls[i].innerHTML = (intDay);
+ d.setDate(d.getDate()+1);
+ cells[i].className = 'x-date-active';
+ setCellClass(this, cells[i]);
+ }
+ var extraDays = 0;
+ for(; i < 42; i++) {
+ textEls[i].innerHTML = (++extraDays);
+ d.setDate(d.getDate()+1);
+ cells[i].className = 'x-date-nextday';
+ setCellClass(this, cells[i]);
+ }
+
+ this.mbtn.setText(this.monthNames[date.getMonth()] + ' ' + date.getFullYear());
+
+ if(!this.internalRender){
+ var main = this.el.dom.firstChild,
+ w = main.offsetWidth;
+ this.el.setWidth(w + this.el.getBorderWidth('lr'));
+ Ext.fly(main).setWidth(w);
+ this.internalRender = true;
+
+
+
+ if(Ext.isOpera && !this.secondPass){
+ main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + 'px';
+ this.secondPass = true;
+ this.update.defer(10, this, [date]);
+ }
+ }
+ }
+ },
+
+
+ beforeDestroy : function() {
+ if(this.rendered){
+ Ext.destroy(
+ this.keyNav,
+ this.monthPicker,
+ this.eventEl,
+ this.mbtn,
+ this.nextRepeater,
+ this.prevRepeater,
+ this.cells.el,
+ this.todayBtn
+ );
+ delete this.textNodes;
+ delete this.cells.elements;
+ }
+ }
+
+
+});
+
+Ext.reg('datepicker', Ext.DatePicker);
+
+Ext.LoadMask = function(el, config){
+ this.el = Ext.get(el);
+ Ext.apply(this, config);
+ if(this.store){
+ this.store.on({
+ scope: this,
+ beforeload: this.onBeforeLoad,
+ load: this.onLoad,
+ exception: this.onLoad
+ });
+ this.removeMask = Ext.value(this.removeMask, false);
+ }else{
+ var um = this.el.getUpdater();
+ um.showLoadIndicator = false;
+ um.on({
+ scope: this,
+ beforeupdate: this.onBeforeLoad,
+ update: this.onLoad,
+ failure: this.onLoad
+ });
+ this.removeMask = Ext.value(this.removeMask, true);
+ }
+};
+
+Ext.LoadMask.prototype = {
+
+
+
+ msg : 'Loading...',
+
+ msgCls : 'x-mask-loading',
+
+
+ disabled: false,
+
+
+ disable : function(){
+ this.disabled = true;
+ },
+
+
+ enable : function(){
+ this.disabled = false;
+ },
+
+
+ onLoad : function(){
+ this.el.unmask(this.removeMask);
+ },
+
+
+ onBeforeLoad : function(){
+ if(!this.disabled){
+ this.el.mask(this.msg, this.msgCls);
+ }
+ },
+
+
+ show: function(){
+ this.onBeforeLoad();
+ },
+
+
+ hide: function(){
+ this.onLoad();
+ },
+
+
+ destroy : function(){
+ if(this.store){
+ this.store.un('beforeload', this.onBeforeLoad, this);
+ this.store.un('load', this.onLoad, this);
+ this.store.un('exception', this.onLoad, this);
+ }else{
+ var um = this.el.getUpdater();
+ um.un('beforeupdate', this.onBeforeLoad, this);
+ um.un('update', this.onLoad, this);
+ um.un('failure', this.onLoad, this);
+ }
+ }
+};
+Ext.slider.Thumb = Ext.extend(Object, {
+
+
+ dragging: false,
+
+
+ constructor: function(config) {
+
+ Ext.apply(this, config || {}, {
+ cls: 'x-slider-thumb',
+
+
+ constrain: false
+ });
+
+ Ext.slider.Thumb.superclass.constructor.call(this, config);
+
+ if (this.slider.vertical) {
+ Ext.apply(this, Ext.slider.Thumb.Vertical);
+ }
+ },
+
+
+ render: function() {
+ this.el = this.slider.innerEl.insertFirst({cls: this.cls});
+
+ this.initEvents();
+ },
+
+
+ enable: function() {
+ this.disabled = false;
+ this.el.removeClass(this.slider.disabledClass);
+ },
+
+
+ disable: function() {
+ this.disabled = true;
+ this.el.addClass(this.slider.disabledClass);
+ },
+
+
+ initEvents: function() {
+ var el = this.el;
+
+ el.addClassOnOver('x-slider-thumb-over');
+
+ this.tracker = new Ext.dd.DragTracker({
+ onBeforeStart: this.onBeforeDragStart.createDelegate(this),
+ onStart : this.onDragStart.createDelegate(this),
+ onDrag : this.onDrag.createDelegate(this),
+ onEnd : this.onDragEnd.createDelegate(this),
+ tolerance : 3,
+ autoStart : 300
+ });
+
+ this.tracker.initEl(el);
+ },
+
+
+ onBeforeDragStart : function(e) {
+ if (this.disabled) {
+ return false;
+ } else {
+ this.slider.promoteThumb(this);
+ return true;
+ }
+ },
+
+
+ onDragStart: function(e){
+ this.el.addClass('x-slider-thumb-drag');
+ this.dragging = true;
+ this.dragStartValue = this.value;
+
+ this.slider.fireEvent('dragstart', this.slider, e, this);
+ },
+
+
+ onDrag: function(e) {
+ var slider = this.slider,
+ index = this.index,
+ newValue = this.getNewValue();
+
+ if (this.constrain) {
+ var above = slider.thumbs[index + 1],
+ below = slider.thumbs[index - 1];
+
+ if (below != undefined && newValue <= below.value) newValue = below.value;
+ if (above != undefined && newValue >= above.value) newValue = above.value;
+ }
+
+ slider.setValue(index, newValue, false);
+ slider.fireEvent('drag', slider, e, this);
+ },
+
+ getNewValue: function() {
+ var slider = this.slider,
+ pos = slider.innerEl.translatePoints(this.tracker.getXY());
+
+ return Ext.util.Format.round(slider.reverseValue(pos.left), slider.decimalPrecision);
+ },
+
+
+ onDragEnd: function(e) {
+ var slider = this.slider,
+ value = this.value;
+
+ this.el.removeClass('x-slider-thumb-drag');
+
+ this.dragging = false;
+ slider.fireEvent('dragend', slider, e);
+
+ if (this.dragStartValue != value) {
+ slider.fireEvent('changecomplete', slider, value, this);
+ }
+ },
+
+
+ destroy: function(){
+ Ext.destroyMembers(this, 'tracker', 'el');
+ }
+});
+
+
+Ext.slider.MultiSlider = Ext.extend(Ext.BoxComponent, {
+
+
+ vertical: false,
+
+ minValue: 0,
+
+ maxValue: 100,
+
+ decimalPrecision: 0,
+
+ keyIncrement: 1,
+
+ increment: 0,
+
+
+ clickRange: [5,15],
+
+
+ clickToChange : true,
+
+ animate: true,
+
+ constrainThumbs: true,
+
+
+ topThumbZIndex: 10000,
+
+
+ initComponent : function(){
+ if(!Ext.isDefined(this.value)){
+ this.value = this.minValue;
+ }
+
+
+ this.thumbs = [];
+
+ Ext.slider.MultiSlider.superclass.initComponent.call(this);
+
+ this.keyIncrement = Math.max(this.increment, this.keyIncrement);
+ this.addEvents(
+
+ 'beforechange',
+
+
+ 'change',
+
+
+ 'changecomplete',
+
+
+ 'dragstart',
+
+
+ 'drag',
+
+
+ 'dragend'
+ );
+
+
+ if (this.values == undefined || Ext.isEmpty(this.values)) this.values = [0];
+
+ var values = this.values;
+
+ for (var i=0; i < values.length; i++) {
+ this.addThumb(values[i]);
+ }
+
+ if(this.vertical){
+ Ext.apply(this, Ext.slider.Vertical);
+ }
+ },
+
+
+ addThumb: function(value) {
+ var thumb = new Ext.slider.Thumb({
+ value : value,
+ slider : this,
+ index : this.thumbs.length,
+ constrain: this.constrainThumbs
+ });
+ this.thumbs.push(thumb);
+
+
+ if (this.rendered) thumb.render();
+ },
+
+
+ promoteThumb: function(topThumb) {
+ var thumbs = this.thumbs,
+ zIndex, thumb;
+
+ for (var i = 0, j = thumbs.length; i < j; i++) {
+ thumb = thumbs[i];
+
+ if (thumb == topThumb) {
+ zIndex = this.topThumbZIndex;
+ } else {
+ zIndex = '';
+ }
+
+ thumb.el.setStyle('zIndex', zIndex);
+ }
+ },
+
+
+ onRender : function() {
+ this.autoEl = {
+ cls: 'x-slider ' + (this.vertical ? 'x-slider-vert' : 'x-slider-horz'),
+ cn : {
+ cls: 'x-slider-end',
+ cn : {
+ cls:'x-slider-inner',
+ cn : [{tag:'a', cls:'x-slider-focus', href:"#", tabIndex: '-1', hidefocus:'on'}]
+ }
+ }
+ };
+
+ Ext.slider.MultiSlider.superclass.onRender.apply(this, arguments);
+
+ this.endEl = this.el.first();
+ this.innerEl = this.endEl.first();
+ this.focusEl = this.innerEl.child('.x-slider-focus');
+
+
+ for (var i=0; i < this.thumbs.length; i++) {
+ this.thumbs[i].render();
+ }
+
+
+ var thumb = this.innerEl.child('.x-slider-thumb');
+ this.halfThumb = (this.vertical ? thumb.getHeight() : thumb.getWidth()) / 2;
+
+ this.initEvents();
+ },
+
+
+ initEvents : function(){
+ this.mon(this.el, {
+ scope : this,
+ mousedown: this.onMouseDown,
+ keydown : this.onKeyDown
+ });
+
+ this.focusEl.swallowEvent("click", true);
+ },
+
+
+ onMouseDown : function(e){
+ if(this.disabled){
+ return;
+ }
+
+
+ var thumbClicked = false;
+ for (var i=0; i < this.thumbs.length; i++) {
+ thumbClicked = thumbClicked || e.target == this.thumbs[i].el.dom;
+ }
+
+ if (this.clickToChange && !thumbClicked) {
+ var local = this.innerEl.translatePoints(e.getXY());
+ this.onClickChange(local);
+ }
+ this.focus();
+ },
+
+
+ onClickChange : function(local) {
+ if (local.top > this.clickRange[0] && local.top < this.clickRange[1]) {
+
+ var thumb = this.getNearest(local, 'left'),
+ index = thumb.index;
+
+ this.setValue(index, Ext.util.Format.round(this.reverseValue(local.left), this.decimalPrecision), undefined, true);
+ }
+ },
+
+
+ getNearest: function(local, prop) {
+ var localValue = prop == 'top' ? this.innerEl.getHeight() - local[prop] : local[prop],
+ clickValue = this.reverseValue(localValue),
+ nearestDistance = (this.maxValue - this.minValue) + 5,
+ index = 0,
+ nearest = null;
+
+ for (var i=0; i < this.thumbs.length; i++) {
+ var thumb = this.thumbs[i],
+ value = thumb.value,
+ dist = Math.abs(value - clickValue);
+
+ if (Math.abs(dist <= nearestDistance)) {
+ nearest = thumb;
+ index = i;
+ nearestDistance = dist;
+ }
+ }
+ return nearest;
+ },
+
+
+ onKeyDown : function(e){
+
+ if(this.disabled || this.thumbs.length !== 1){
+ e.preventDefault();
+ return;
+ }
+ var k = e.getKey(),
+ val;
+ switch(k){
+ case e.UP:
+ case e.RIGHT:
+ e.stopEvent();
+ val = e.ctrlKey ? this.maxValue : this.getValue(0) + this.keyIncrement;
+ this.setValue(0, val, undefined, true);
+ break;
+ case e.DOWN:
+ case e.LEFT:
+ e.stopEvent();
+ val = e.ctrlKey ? this.minValue : this.getValue(0) - this.keyIncrement;
+ this.setValue(0, val, undefined, true);
+ break;
+ default:
+ e.preventDefault();
+ }
+ },
+
+
+ doSnap : function(value){
+ if (!(this.increment && value)) {
+ return value;
+ }
+ var newValue = value,
+ inc = this.increment,
+ m = value % inc;
+ if (m != 0) {
+ newValue -= m;
+ if (m * 2 >= inc) {
+ newValue += inc;
+ } else if (m * 2 < -inc) {
+ newValue -= inc;
+ }
+ }
+ return newValue.constrain(this.minValue, this.maxValue);
+ },
+
+
+ afterRender : function(){
+ Ext.slider.MultiSlider.superclass.afterRender.apply(this, arguments);
+
+ for (var i=0; i < this.thumbs.length; i++) {
+ var thumb = this.thumbs[i];
+
+ if (thumb.value !== undefined) {
+ var v = this.normalizeValue(thumb.value);
+
+ if (v !== thumb.value) {
+
+ this.setValue(i, v, false);
+ } else {
+ this.moveThumb(i, this.translateValue(v), false);
+ }
+ }
+ };
+ },
+
+
+ getRatio : function(){
+ var w = this.innerEl.getWidth(),
+ v = this.maxValue - this.minValue;
+ return v == 0 ? w : (w/v);
+ },
+
+
+ normalizeValue : function(v){
+ v = this.doSnap(v);
+ v = Ext.util.Format.round(v, this.decimalPrecision);
+ v = v.constrain(this.minValue, this.maxValue);
+ return v;
+ },
+
+
+ setMinValue : function(val){
+ this.minValue = val;
+ var i = 0,
+ thumbs = this.thumbs,
+ len = thumbs.length,
+ t;
+
+ for(; i < len; ++i){
+ t = thumbs[i];
+ t.value = t.value < val ? val : t.value;
+ }
+ this.syncThumb();
+ },
+
+
+ setMaxValue : function(val){
+ this.maxValue = val;
+ var i = 0,
+ thumbs = this.thumbs,
+ len = thumbs.length,
+ t;
+
+ for(; i < len; ++i){
+ t = thumbs[i];
+ t.value = t.value > val ? val : t.value;
+ }
+ this.syncThumb();
+ },
+
+
+ setValue : function(index, v, animate, changeComplete) {
+ var thumb = this.thumbs[index],
+ el = thumb.el;
+
+ v = this.normalizeValue(v);
+
+ if (v !== thumb.value && this.fireEvent('beforechange', this, v, thumb.value, thumb) !== false) {
+ thumb.value = v;
+ if(this.rendered){
+ this.moveThumb(index, this.translateValue(v), animate !== false);
+ this.fireEvent('change', this, v, thumb);
+ if(changeComplete){
+ this.fireEvent('changecomplete', this, v, thumb);
+ }
+ }
+ }
+ },
+
+
+ translateValue : function(v) {
+ var ratio = this.getRatio();
+ return (v * ratio) - (this.minValue * ratio) - this.halfThumb;
+ },
+
+
+ reverseValue : function(pos){
+ var ratio = this.getRatio();
+ return (pos + (this.minValue * ratio)) / ratio;
+ },
+
+
+ moveThumb: function(index, v, animate){
+ var thumb = this.thumbs[index].el;
+
+ if(!animate || this.animate === false){
+ thumb.setLeft(v);
+ }else{
+ thumb.shift({left: v, stopFx: true, duration:.35});
+ }
+ },
+
+
+ focus : function(){
+ this.focusEl.focus(10);
+ },
+
+
+ onResize : function(w, h){
+ var thumbs = this.thumbs,
+ len = thumbs.length,
+ i = 0;
+
+
+ for(; i < len; ++i){
+ thumbs[i].el.stopFx();
+ }
+
+ if(Ext.isNumber(w)){
+ this.innerEl.setWidth(w - (this.el.getPadding('l') + this.endEl.getPadding('r')));
+ }
+ this.syncThumb();
+ Ext.slider.MultiSlider.superclass.onResize.apply(this, arguments);
+ },
+
+
+ onDisable: function(){
+ Ext.slider.MultiSlider.superclass.onDisable.call(this);
+
+ for (var i=0; i < this.thumbs.length; i++) {
+ var thumb = this.thumbs[i],
+ el = thumb.el;
+
+ thumb.disable();
+
+ if(Ext.isIE){
+
+
+ var xy = el.getXY();
+ el.hide();
+
+ this.innerEl.addClass(this.disabledClass).dom.disabled = true;
+
+ if (!this.thumbHolder) {
+ this.thumbHolder = this.endEl.createChild({cls: 'x-slider-thumb ' + this.disabledClass});
+ }
+
+ this.thumbHolder.show().setXY(xy);
+ }
+ }
+ },
+
+
+ onEnable: function(){
+ Ext.slider.MultiSlider.superclass.onEnable.call(this);
+
+ for (var i=0; i < this.thumbs.length; i++) {
+ var thumb = this.thumbs[i],
+ el = thumb.el;
+
+ thumb.enable();
+
+ if (Ext.isIE) {
+ this.innerEl.removeClass(this.disabledClass).dom.disabled = false;
+
+ if (this.thumbHolder) this.thumbHolder.hide();
+
+ el.show();
+ this.syncThumb();
+ }
+ }
+ },
+
+
+ syncThumb : function() {
+ if (this.rendered) {
+ for (var i=0; i < this.thumbs.length; i++) {
+ this.moveThumb(i, this.translateValue(this.thumbs[i].value));
+ }
+ }
+ },
+
+
+ getValue : function(index) {
+ return this.thumbs[index].value;
+ },
+
+
+ getValues: function() {
+ var values = [];
+
+ for (var i=0; i < this.thumbs.length; i++) {
+ values.push(this.thumbs[i].value);
+ }
+
+ return values;
+ },
+
+
+ beforeDestroy : function(){
+ var thumbs = this.thumbs;
+ for(var i = 0, len = thumbs.length; i < len; ++i){
+ thumbs[i].destroy();
+ thumbs[i] = null;
+ }
+ Ext.destroyMembers(this, 'endEl', 'innerEl', 'focusEl', 'thumbHolder');
+ Ext.slider.MultiSlider.superclass.beforeDestroy.call(this);
+ }
+});
+
+Ext.reg('multislider', Ext.slider.MultiSlider);
+
+
+Ext.slider.SingleSlider = Ext.extend(Ext.slider.MultiSlider, {
+ constructor: function(config) {
+ config = config || {};
+
+ Ext.applyIf(config, {
+ values: [config.value || 0]
+ });
+
+ Ext.slider.SingleSlider.superclass.constructor.call(this, config);
+ },
+
+
+ getValue: function() {
+
+ return Ext.slider.SingleSlider.superclass.getValue.call(this, 0);
+ },
+
+
+ setValue: function(value, animate) {
+ var args = Ext.toArray(arguments),
+ len = args.length;
+
+
+
+
+ if (len == 1 || (len <= 3 && typeof arguments[1] != 'number')) {
+ args.unshift(0);
+ }
+
+ return Ext.slider.SingleSlider.superclass.setValue.apply(this, args);
+ },
+
+
+ syncThumb : function() {
+ return Ext.slider.SingleSlider.superclass.syncThumb.apply(this, [0].concat(arguments));
+ },
+
+
+ getNearest : function(){
+
+ return this.thumbs[0];
+ }
+});
+
+
+Ext.Slider = Ext.slider.SingleSlider;
+
+Ext.reg('slider', Ext.slider.SingleSlider);
+
+
+Ext.slider.Vertical = {
+ onResize : function(w, h){
+ this.innerEl.setHeight(h - (this.el.getPadding('t') + this.endEl.getPadding('b')));
+ this.syncThumb();
+ },
+
+ getRatio : function(){
+ var h = this.innerEl.getHeight(),
+ v = this.maxValue - this.minValue;
+ return h/v;
+ },
+
+ moveThumb: function(index, v, animate) {
+ var thumb = this.thumbs[index],
+ el = thumb.el;
+
+ if (!animate || this.animate === false) {
+ el.setBottom(v);
+ } else {
+ el.shift({bottom: v, stopFx: true, duration:.35});
+ }
+ },
+
+ onClickChange : function(local) {
+ if (local.left > this.clickRange[0] && local.left < this.clickRange[1]) {
+ var thumb = this.getNearest(local, 'top'),
+ index = thumb.index,
+ value = this.minValue + this.reverseValue(this.innerEl.getHeight() - local.top);
+
+ this.setValue(index, Ext.util.Format.round(value, this.decimalPrecision), undefined, true);
+ }
+ }
+};
+
+
+Ext.slider.Thumb.Vertical = {
+ getNewValue: function() {
+ var slider = this.slider,
+ innerEl = slider.innerEl,
+ pos = innerEl.translatePoints(this.tracker.getXY()),
+ bottom = innerEl.getHeight() - pos.top;
+
+ return slider.minValue + Ext.util.Format.round(bottom / slider.getRatio(), slider.decimalPrecision);
+ }
+};
+
+Ext.ProgressBar = Ext.extend(Ext.BoxComponent, {
+
+ baseCls : 'x-progress',
+
+
+ animate : false,
+
+
+ waitTimer : null,
+
+
+ initComponent : function(){
+ Ext.ProgressBar.superclass.initComponent.call(this);
+ this.addEvents(
+
+ "update"
+ );
+ },
+
+
+ onRender : function(ct, position){
+ var tpl = new Ext.Template(
+ '<div class="{cls}-wrap">',
+ '<div class="{cls}-inner">',
+ '<div class="{cls}-bar">',
+ '<div class="{cls}-text">',
+ '<div>&#160;</div>',
+ '</div>',
+ '</div>',
+ '<div class="{cls}-text {cls}-text-back">',
+ '<div>&#160;</div>',
+ '</div>',
+ '</div>',
+ '</div>'
+ );
+
+ this.el = position ? tpl.insertBefore(position, {cls: this.baseCls}, true)
+ : tpl.append(ct, {cls: this.baseCls}, true);
+
+ if(this.id){
+ this.el.dom.id = this.id;
+ }
+ var inner = this.el.dom.firstChild;
+ this.progressBar = Ext.get(inner.firstChild);
+
+ if(this.textEl){
+
+ this.textEl = Ext.get(this.textEl);
+ delete this.textTopEl;
+ }else{
+
+ this.textTopEl = Ext.get(this.progressBar.dom.firstChild);
+ var textBackEl = Ext.get(inner.childNodes[1]);
+ this.textTopEl.setStyle("z-index", 99).addClass('x-hidden');
+ this.textEl = new Ext.CompositeElement([this.textTopEl.dom.firstChild, textBackEl.dom.firstChild]);
+ this.textEl.setWidth(inner.offsetWidth);
+ }
+ this.progressBar.setHeight(inner.offsetHeight);
+ },
+
+
+ afterRender : function(){
+ Ext.ProgressBar.superclass.afterRender.call(this);
+ if(this.value){
+ this.updateProgress(this.value, this.text);
+ }else{
+ this.updateText(this.text);
+ }
+ },
+
+
+ updateProgress : function(value, text, animate){
+ this.value = value || 0;
+ if(text){
+ this.updateText(text);
+ }
+ if(this.rendered && !this.isDestroyed){
+ var w = Math.floor(value*this.el.dom.firstChild.offsetWidth);
+ this.progressBar.setWidth(w, animate === true || (animate !== false && this.animate));
+ if(this.textTopEl){
+
+ this.textTopEl.removeClass('x-hidden').setWidth(w);
+ }
+ }
+ this.fireEvent('update', this, value, text);
+ return this;
+ },
+
+
+ wait : function(o){
+ if(!this.waitTimer){
+ var scope = this;
+ o = o || {};
+ this.updateText(o.text);
+ this.waitTimer = Ext.TaskMgr.start({
+ run: function(i){
+ var inc = o.increment || 10;
+ i -= 1;
+ this.updateProgress(((((i+inc)%inc)+1)*(100/inc))*0.01, null, o.animate);
+ },
+ interval: o.interval || 1000,
+ duration: o.duration,
+ onStop: function(){
+ if(o.fn){
+ o.fn.apply(o.scope || this);
+ }
+ this.reset();
+ },
+ scope: scope
+ });
+ }
+ return this;
+ },
+
+
+ isWaiting : function(){
+ return this.waitTimer !== null;
+ },
+
+
+ updateText : function(text){
+ this.text = text || '&#160;';
+ if(this.rendered){
+ this.textEl.update(this.text);
+ }
+ return this;
+ },
+
+
+ syncProgressBar : function(){
+ if(this.value){
+ this.updateProgress(this.value, this.text);
+ }
+ return this;
+ },
+
+
+ setSize : function(w, h){
+ Ext.ProgressBar.superclass.setSize.call(this, w, h);
+ if(this.textTopEl){
+ var inner = this.el.dom.firstChild;
+ this.textEl.setSize(inner.offsetWidth, inner.offsetHeight);
+ }
+ this.syncProgressBar();
+ return this;
+ },
+
+
+ reset : function(hide){
+ this.updateProgress(0);
+ if(this.textTopEl){
+ this.textTopEl.addClass('x-hidden');
+ }
+ this.clearTimer();
+ if(hide === true){
+ this.hide();
+ }
+ return this;
+ },
+
+
+ clearTimer : function(){
+ if(this.waitTimer){
+ this.waitTimer.onStop = null;
+ Ext.TaskMgr.stop(this.waitTimer);
+ this.waitTimer = null;
+ }
+ },
+
+ onDestroy: function(){
+ this.clearTimer();
+ if(this.rendered){
+ if(this.textEl.isComposite){
+ this.textEl.clear();
+ }
+ Ext.destroyMembers(this, 'textEl', 'progressBar', 'textTopEl');
+ }
+ Ext.ProgressBar.superclass.onDestroy.call(this);
+ }
+});
+Ext.reg('progress', Ext.ProgressBar);
+
+(function() {
+
+var Event=Ext.EventManager;
+var Dom=Ext.lib.Dom;
+
+
+Ext.dd.DragDrop = function(id, sGroup, config) {
+ if(id) {
+ this.init(id, sGroup, config);
+ }
+};
+
+Ext.dd.DragDrop.prototype = {
+
+
+
+
+ id: null,
+
+
+ config: null,
+
+
+ dragElId: null,
+
+
+ handleElId: null,
+
+
+ invalidHandleTypes: null,
+
+
+ invalidHandleIds: null,
+
+
+ invalidHandleClasses: null,
+
+
+ startPageX: 0,
+
+
+ startPageY: 0,
+
+
+ groups: null,
+
+
+ locked: false,
+
+
+ lock: function() {
+ this.locked = true;
+ },
+
+
+ moveOnly: false,
+
+
+ unlock: function() {
+ this.locked = false;
+ },
+
+
+ isTarget: true,
+
+
+ padding: null,
+
+
+ _domRef: null,
+
+
+ __ygDragDrop: true,
+
+
+ constrainX: false,
+
+
+ constrainY: false,
+
+
+ minX: 0,
+
+
+ maxX: 0,
+
+
+ minY: 0,
+
+
+ maxY: 0,
+
+
+ maintainOffset: false,
+
+
+ xTicks: null,
+
+
+ yTicks: null,
+
+
+ primaryButtonOnly: true,
+
+
+ available: false,
+
+
+ hasOuterHandles: false,
+
+
+ b4StartDrag: function(x, y) { },
+
+
+ startDrag: function(x, y) { },
+
+
+ b4Drag: function(e) { },
+
+
+ onDrag: function(e) { },
+
+
+ onDragEnter: function(e, id) { },
+
+
+ b4DragOver: function(e) { },
+
+
+ onDragOver: function(e, id) { },
+
+
+ b4DragOut: function(e) { },
+
+
+ onDragOut: function(e, id) { },
+
+
+ b4DragDrop: function(e) { },
+
+
+ onDragDrop: function(e, id) { },
+
+
+ onInvalidDrop: function(e) { },
+
+
+ b4EndDrag: function(e) { },
+
+
+ endDrag: function(e) { },
+
+
+ b4MouseDown: function(e) { },
+
+
+ onMouseDown: function(e) { },
+
+
+ onMouseUp: function(e) { },
+
+
+ onAvailable: function () {
+ },
+
+
+ defaultPadding : {left:0, right:0, top:0, bottom:0},
+
+
+ constrainTo : function(constrainTo, pad, inContent){
+ if(Ext.isNumber(pad)){
+ pad = {left: pad, right:pad, top:pad, bottom:pad};
+ }
+ pad = pad || this.defaultPadding;
+ var b = Ext.get(this.getEl()).getBox(),
+ ce = Ext.get(constrainTo),
+ s = ce.getScroll(),
+ c,
+ cd = ce.dom;
+ if(cd == document.body){
+ c = { x: s.left, y: s.top, width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()};
+ }else{
+ var xy = ce.getXY();
+ c = {x : xy[0], y: xy[1], width: cd.clientWidth, height: cd.clientHeight};
+ }
+
+
+ var topSpace = b.y - c.y,
+ leftSpace = b.x - c.x;
+
+ this.resetConstraints();
+ this.setXConstraint(leftSpace - (pad.left||0),
+ c.width - leftSpace - b.width - (pad.right||0),
+ this.xTickSize
+ );
+ this.setYConstraint(topSpace - (pad.top||0),
+ c.height - topSpace - b.height - (pad.bottom||0),
+ this.yTickSize
+ );
+ },
+
+
+ getEl: function() {
+ if (!this._domRef) {
+ this._domRef = Ext.getDom(this.id);
+ }
+
+ return this._domRef;
+ },
+
+
+ getDragEl: function() {
+ return Ext.getDom(this.dragElId);
+ },
+
+
+ init: function(id, sGroup, config) {
+ this.initTarget(id, sGroup, config);
+ Event.on(this.id, "mousedown", this.handleMouseDown, this);
+
+ },
+
+
+ initTarget: function(id, sGroup, config) {
+
+
+ this.config = config || {};
+
+
+ this.DDM = Ext.dd.DDM;
+
+ this.groups = {};
+
+
+
+ if (typeof id !== "string") {
+ id = Ext.id(id);
+ }
+
+
+ this.id = id;
+
+
+ this.addToGroup((sGroup) ? sGroup : "default");
+
+
+
+ this.handleElId = id;
+
+
+ this.setDragElId(id);
+
+
+ this.invalidHandleTypes = { A: "A" };
+ this.invalidHandleIds = {};
+ this.invalidHandleClasses = [];
+
+ this.applyConfig();
+
+ this.handleOnAvailable();
+ },
+
+
+ applyConfig: function() {
+
+
+
+ this.padding = this.config.padding || [0, 0, 0, 0];
+ this.isTarget = (this.config.isTarget !== false);
+ this.maintainOffset = (this.config.maintainOffset);
+ this.primaryButtonOnly = (this.config.primaryButtonOnly !== false);
+
+ },
+
+
+ handleOnAvailable: function() {
+ this.available = true;
+ this.resetConstraints();
+ this.onAvailable();
+ },
+
+
+ setPadding: function(iTop, iRight, iBot, iLeft) {
+
+ if (!iRight && 0 !== iRight) {
+ this.padding = [iTop, iTop, iTop, iTop];
+ } else if (!iBot && 0 !== iBot) {
+ this.padding = [iTop, iRight, iTop, iRight];
+ } else {
+ this.padding = [iTop, iRight, iBot, iLeft];
+ }
+ },
+
+
+ setInitPosition: function(diffX, diffY) {
+ var el = this.getEl();
+
+ if (!this.DDM.verifyEl(el)) {
+ return;
+ }
+
+ var dx = diffX || 0;
+ var dy = diffY || 0;
+
+ var p = Dom.getXY( el );
+
+ this.initPageX = p[0] - dx;
+ this.initPageY = p[1] - dy;
+
+ this.lastPageX = p[0];
+ this.lastPageY = p[1];
+
+ this.setStartPosition(p);
+ },
+
+
+ setStartPosition: function(pos) {
+ var p = pos || Dom.getXY( this.getEl() );
+ this.deltaSetXY = null;
+
+ this.startPageX = p[0];
+ this.startPageY = p[1];
+ },
+
+
+ addToGroup: function(sGroup) {
+ this.groups[sGroup] = true;
+ this.DDM.regDragDrop(this, sGroup);
+ },
+
+
+ removeFromGroup: function(sGroup) {
+ if (this.groups[sGroup]) {
+ delete this.groups[sGroup];
+ }
+
+ this.DDM.removeDDFromGroup(this, sGroup);
+ },
+
+
+ setDragElId: function(id) {
+ this.dragElId = id;
+ },
+
+
+ setHandleElId: function(id) {
+ if (typeof id !== "string") {
+ id = Ext.id(id);
+ }
+ this.handleElId = id;
+ this.DDM.regHandle(this.id, id);
+ },
+
+
+ setOuterHandleElId: function(id) {
+ if (typeof id !== "string") {
+ id = Ext.id(id);
+ }
+ Event.on(id, "mousedown",
+ this.handleMouseDown, this);
+ this.setHandleElId(id);
+
+ this.hasOuterHandles = true;
+ },
+
+
+ unreg: function() {
+ Event.un(this.id, "mousedown",
+ this.handleMouseDown);
+ this._domRef = null;
+ this.DDM._remove(this);
+ },
+
+ destroy : function(){
+ this.unreg();
+ },
+
+
+ isLocked: function() {
+ return (this.DDM.isLocked() || this.locked);
+ },
+
+
+ handleMouseDown: function(e, oDD){
+ if (this.primaryButtonOnly && e.button != 0) {
+ return;
+ }
+
+ if (this.isLocked()) {
+ return;
+ }
+
+ this.DDM.refreshCache(this.groups);
+
+ var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.Event.getPageY(e));
+ if (!this.hasOuterHandles && !this.DDM.isOverTarget(pt, this) ) {
+ } else {
+ if (this.clickValidator(e)) {
+
+
+ this.setStartPosition();
+
+ this.b4MouseDown(e);
+ this.onMouseDown(e);
+
+ this.DDM.handleMouseDown(e, this);
+
+ if (this.preventDefault || this.stopPropagation) {
+ if (this.preventDefault) {
+ e.preventDefault();
+ }
+ if (this.stopPropagation) {
+ e.stopPropagation();
+ }
+ } else {
+ this.DDM.stopEvent(e);
+ }
+ } else {
+
+
+ }
+ }
+ },
+
+ clickValidator: function(e) {
+ var target = e.getTarget();
+ return ( this.isValidHandleChild(target) &&
+ (this.id == this.handleElId ||
+ this.DDM.handleWasClicked(target, this.id)) );
+ },
+
+
+ addInvalidHandleType: function(tagName) {
+ var type = tagName.toUpperCase();
+ this.invalidHandleTypes[type] = type;
+ },
+
+
+ addInvalidHandleId: function(id) {
+ if (typeof id !== "string") {
+ id = Ext.id(id);
+ }
+ this.invalidHandleIds[id] = id;
+ },
+
+
+ addInvalidHandleClass: function(cssClass) {
+ this.invalidHandleClasses.push(cssClass);
+ },
+
+
+ removeInvalidHandleType: function(tagName) {
+ var type = tagName.toUpperCase();
+
+ delete this.invalidHandleTypes[type];
+ },
+
+
+ removeInvalidHandleId: function(id) {
+ if (typeof id !== "string") {
+ id = Ext.id(id);
+ }
+ delete this.invalidHandleIds[id];
+ },
+
+
+ removeInvalidHandleClass: function(cssClass) {
+ for (var i=0, len=this.invalidHandleClasses.length; i<len; ++i) {
+ if (this.invalidHandleClasses[i] == cssClass) {
+ delete this.invalidHandleClasses[i];
+ }
+ }
+ },
+
+
+ isValidHandleChild: function(node) {
+
+ var valid = true;
+
+ var nodeName;
+ try {
+ nodeName = node.nodeName.toUpperCase();
+ } catch(e) {
+ nodeName = node.nodeName;
+ }
+ valid = valid && !this.invalidHandleTypes[nodeName];
+ valid = valid && !this.invalidHandleIds[node.id];
+
+ for (var i=0, len=this.invalidHandleClasses.length; valid && i<len; ++i) {
+ valid = !Ext.fly(node).hasClass(this.invalidHandleClasses[i]);
+ }
+
+
+ return valid;
+
+ },
+
+
+ setXTicks: function(iStartX, iTickSize) {
+ this.xTicks = [];
+ this.xTickSize = iTickSize;
+
+ var tickMap = {};
+
+ for (var i = this.initPageX; i >= this.minX; i = i - iTickSize) {
+ if (!tickMap[i]) {
+ this.xTicks[this.xTicks.length] = i;
+ tickMap[i] = true;
+ }
+ }
+
+ for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) {
+ if (!tickMap[i]) {
+ this.xTicks[this.xTicks.length] = i;
+ tickMap[i] = true;
+ }
+ }
+
+ this.xTicks.sort(this.DDM.numericSort) ;
+ },
+
+
+ setYTicks: function(iStartY, iTickSize) {
+ this.yTicks = [];
+ this.yTickSize = iTickSize;
+
+ var tickMap = {};
+
+ for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) {
+ if (!tickMap[i]) {
+ this.yTicks[this.yTicks.length] = i;
+ tickMap[i] = true;
+ }
+ }
+
+ for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) {
+ if (!tickMap[i]) {
+ this.yTicks[this.yTicks.length] = i;
+ tickMap[i] = true;
+ }
+ }
+
+ this.yTicks.sort(this.DDM.numericSort) ;
+ },
+
+
+ setXConstraint: function(iLeft, iRight, iTickSize) {
+ this.leftConstraint = iLeft;
+ this.rightConstraint = iRight;
+
+ this.minX = this.initPageX - iLeft;
+ this.maxX = this.initPageX + iRight;
+ if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }
+
+ this.constrainX = true;
+ },
+
+
+ clearConstraints: function() {
+ this.constrainX = false;
+ this.constrainY = false;
+ this.clearTicks();
+ },
+
+
+ clearTicks: function() {
+ this.xTicks = null;
+ this.yTicks = null;
+ this.xTickSize = 0;
+ this.yTickSize = 0;
+ },
+
+
+ setYConstraint: function(iUp, iDown, iTickSize) {
+ this.topConstraint = iUp;
+ this.bottomConstraint = iDown;
+
+ this.minY = this.initPageY - iUp;
+ this.maxY = this.initPageY + iDown;
+ if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }
+
+ this.constrainY = true;
+
+ },
+
+
+ resetConstraints: function() {
+
+ if (this.initPageX || this.initPageX === 0) {
+
+ var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0;
+ var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;
+
+ this.setInitPosition(dx, dy);
+
+
+ } else {
+ this.setInitPosition();
+ }
+
+ if (this.constrainX) {
+ this.setXConstraint( this.leftConstraint,
+ this.rightConstraint,
+ this.xTickSize );
+ }
+
+ if (this.constrainY) {
+ this.setYConstraint( this.topConstraint,
+ this.bottomConstraint,
+ this.yTickSize );
+ }
+ },
+
+
+ getTick: function(val, tickArray) {
+ if (!tickArray) {
+
+
+ return val;
+ } else if (tickArray[0] >= val) {
+
+
+ return tickArray[0];
+ } else {
+ for (var i=0, len=tickArray.length; i<len; ++i) {
+ var next = i + 1;
+ if (tickArray[next] && tickArray[next] >= val) {
+ var diff1 = val - tickArray[i];
+ var diff2 = tickArray[next] - val;
+ return (diff2 > diff1) ? tickArray[i] : tickArray[next];
+ }
+ }
+
+
+
+ return tickArray[tickArray.length - 1];
+ }
+ },
+
+
+ toString: function() {
+ return ("DragDrop " + this.id);
+ }
+
+};
+
+})();
+
+
+
+
+if (!Ext.dd.DragDropMgr) {
+
+
+Ext.dd.DragDropMgr = function() {
+
+ var Event = Ext.EventManager;
+
+ return {
+
+
+ ids: {},
+
+
+ handleIds: {},
+
+
+ dragCurrent: null,
+
+
+ dragOvers: {},
+
+
+ deltaX: 0,
+
+
+ deltaY: 0,
+
+
+ preventDefault: true,
+
+
+ stopPropagation: true,
+
+
+ initialized: false,
+
+
+ locked: false,
+
+
+ init: function() {
+ this.initialized = true;
+ },
+
+
+ POINT: 0,
+
+
+ INTERSECT: 1,
+
+
+ mode: 0,
+
+
+ notifyOccluded: false,
+
+
+ _execOnAll: function(sMethod, args) {
+ for (var i in this.ids) {
+ for (var j in this.ids[i]) {
+ var oDD = this.ids[i][j];
+ if (! this.isTypeOfDD(oDD)) {
+ continue;
+ }
+ oDD[sMethod].apply(oDD, args);
+ }
+ }
+ },
+
+
+ _onLoad: function() {
+
+ this.init();
+
+
+ Event.on(document, "mouseup", this.handleMouseUp, this, true);
+ Event.on(document, "mousemove", this.handleMouseMove, this, true);
+ Event.on(window, "unload", this._onUnload, this, true);
+ Event.on(window, "resize", this._onResize, this, true);
+
+
+ },
+
+
+ _onResize: function(e) {
+ this._execOnAll("resetConstraints", []);
+ },
+
+
+ lock: function() { this.locked = true; },
+
+
+ unlock: function() { this.locked = false; },
+
+
+ isLocked: function() { return this.locked; },
+
+
+ locationCache: {},
+
+
+ useCache: true,
+
+
+ clickPixelThresh: 3,
+
+
+ clickTimeThresh: 350,
+
+
+ dragThreshMet: false,
+
+
+ clickTimeout: null,
+
+
+ startX: 0,
+
+
+ startY: 0,
+
+
+ regDragDrop: function(oDD, sGroup) {
+ if (!this.initialized) { this.init(); }
+
+ if (!this.ids[sGroup]) {
+ this.ids[sGroup] = {};
+ }
+ this.ids[sGroup][oDD.id] = oDD;
+ },
+
+
+ removeDDFromGroup: function(oDD, sGroup) {
+ if (!this.ids[sGroup]) {
+ this.ids[sGroup] = {};
+ }
+
+ var obj = this.ids[sGroup];
+ if (obj && obj[oDD.id]) {
+ delete obj[oDD.id];
+ }
+ },
+
+
+ _remove: function(oDD) {
+ for (var g in oDD.groups) {
+ if (g && this.ids[g] && this.ids[g][oDD.id]) {
+ delete this.ids[g][oDD.id];
+ }
+ }
+ delete this.handleIds[oDD.id];
+ },
+
+
+ regHandle: function(sDDId, sHandleId) {
+ if (!this.handleIds[sDDId]) {
+ this.handleIds[sDDId] = {};
+ }
+ this.handleIds[sDDId][sHandleId] = sHandleId;
+ },
+
+
+ isDragDrop: function(id) {
+ return ( this.getDDById(id) ) ? true : false;
+ },
+
+
+ getRelated: function(p_oDD, bTargetsOnly) {
+ var oDDs = [];
+ for (var i in p_oDD.groups) {
+ for (var j in this.ids[i]) {
+ var dd = this.ids[i][j];
+ if (! this.isTypeOfDD(dd)) {
+ continue;
+ }
+ if (!bTargetsOnly || dd.isTarget) {
+ oDDs[oDDs.length] = dd;
+ }
+ }
+ }
+
+ return oDDs;
+ },
+
+
+ isLegalTarget: function (oDD, oTargetDD) {
+ var targets = this.getRelated(oDD, true);
+ for (var i=0, len=targets.length;i<len;++i) {
+ if (targets[i].id == oTargetDD.id) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+
+ isTypeOfDD: function (oDD) {
+ return (oDD && oDD.__ygDragDrop);
+ },
+
+
+ isHandle: function(sDDId, sHandleId) {
+ return ( this.handleIds[sDDId] &&
+ this.handleIds[sDDId][sHandleId] );
+ },
+
+
+ getDDById: function(id) {
+ for (var i in this.ids) {
+ if (this.ids[i][id]) {
+ return this.ids[i][id];
+ }
+ }
+ return null;
+ },
+
+
+ handleMouseDown: function(e, oDD) {
+ if(Ext.QuickTips){
+ Ext.QuickTips.ddDisable();
+ }
+ if(this.dragCurrent){
+
+
+ this.handleMouseUp(e);
+ }
+
+ this.currentTarget = e.getTarget();
+ this.dragCurrent = oDD;
+
+ var el = oDD.getEl();
+
+
+ this.startX = e.getPageX();
+ this.startY = e.getPageY();
+
+ this.deltaX = this.startX - el.offsetLeft;
+ this.deltaY = this.startY - el.offsetTop;
+
+ this.dragThreshMet = false;
+
+ this.clickTimeout = setTimeout(
+ function() {
+ var DDM = Ext.dd.DDM;
+ DDM.startDrag(DDM.startX, DDM.startY);
+ },
+ this.clickTimeThresh );
+ },
+
+
+ startDrag: function(x, y) {
+ clearTimeout(this.clickTimeout);
+ if (this.dragCurrent) {
+ this.dragCurrent.b4StartDrag(x, y);
+ this.dragCurrent.startDrag(x, y);
+ }
+ this.dragThreshMet = true;
+ },
+
+
+ handleMouseUp: function(e) {
+
+ if(Ext.QuickTips){
+ Ext.QuickTips.ddEnable();
+ }
+ if (! this.dragCurrent) {
+ return;
+ }
+
+ clearTimeout(this.clickTimeout);
+
+ if (this.dragThreshMet) {
+ this.fireEvents(e, true);
+ } else {
+ }
+
+ this.stopDrag(e);
+
+ this.stopEvent(e);
+ },
+
+
+ stopEvent: function(e){
+ if(this.stopPropagation) {
+ e.stopPropagation();
+ }
+
+ if (this.preventDefault) {
+ e.preventDefault();
+ }
+ },
+
+
+ stopDrag: function(e) {
+
+ if (this.dragCurrent) {
+ if (this.dragThreshMet) {
+ this.dragCurrent.b4EndDrag(e);
+ this.dragCurrent.endDrag(e);
+ }
+
+ this.dragCurrent.onMouseUp(e);
+ }
+
+ this.dragCurrent = null;
+ this.dragOvers = {};
+ },
+
+
+ handleMouseMove: function(e) {
+ if (! this.dragCurrent) {
+ return true;
+ }
+
+
+
+ if (Ext.isIE && (e.button !== 0 && e.button !== 1 && e.button !== 2)) {
+ this.stopEvent(e);
+ return this.handleMouseUp(e);
+ }
+
+ if (!this.dragThreshMet) {
+ var diffX = Math.abs(this.startX - e.getPageX());
+ var diffY = Math.abs(this.startY - e.getPageY());
+ if (diffX > this.clickPixelThresh ||
+ diffY > this.clickPixelThresh) {
+ this.startDrag(this.startX, this.startY);
+ }
+ }
+
+ if (this.dragThreshMet) {
+ this.dragCurrent.b4Drag(e);
+ this.dragCurrent.onDrag(e);
+ if(!this.dragCurrent.moveOnly){
+ this.fireEvents(e, false);
+ }
+ }
+
+ this.stopEvent(e);
+
+ return true;
+ },
+
+
+ fireEvents: function(e, isDrop) {
+ var me = this,
+ dragCurrent = me.dragCurrent,
+ mousePoint = e.getPoint(),
+ overTarget,
+ overTargetEl,
+ allTargets = [],
+ oldOvers = [],
+ outEvts = [],
+ overEvts = [],
+ dropEvts = [],
+ enterEvts = [],
+ needsSort,
+ i,
+ len,
+ sGroup;
+
+
+
+ if (!dragCurrent || dragCurrent.isLocked()) {
+ return;
+ }
+
+
+
+ for (i in me.dragOvers) {
+ overTarget = me.dragOvers[i];
+
+ if (! me.isTypeOfDD(overTarget)) {
+ continue;
+ }
+
+ if (! this.isOverTarget(mousePoint, overTarget, me.mode)) {
+ outEvts.push( overTarget );
+ }
+
+ oldOvers[i] = true;
+ delete me.dragOvers[i];
+ }
+
+
+
+
+ for (sGroup in dragCurrent.groups) {
+
+ if ("string" != typeof sGroup) {
+ continue;
+ }
+
+
+ for (i in me.ids[sGroup]) {
+ overTarget = me.ids[sGroup][i];
+
+
+
+
+
+
+ if (me.isTypeOfDD(overTarget) &&
+ (overTargetEl = overTarget.getEl()) &&
+ (overTarget.isTarget) &&
+ (!overTarget.isLocked()) &&
+ ((overTarget != dragCurrent) || (dragCurrent.ignoreSelf === false))) {
+
+
+ if ((overTarget.zIndex = me.getZIndex(overTargetEl)) !== -1) {
+ needsSort = true;
+ }
+ allTargets.push(overTarget);
+ }
+ }
+ }
+
+
+ if (needsSort) {
+ allTargets.sort(me.byZIndex);
+ }
+
+
+
+ for (i = 0, len = allTargets.length; i < len; i++) {
+ overTarget = allTargets[i];
+
+
+ if (me.isOverTarget(mousePoint, overTarget, me.mode)) {
+
+ if (isDrop) {
+ dropEvts.push( overTarget );
+
+ } else {
+
+ if (!oldOvers[overTarget.id]) {
+ enterEvts.push( overTarget );
+
+ } else {
+ overEvts.push( overTarget );
+ }
+ me.dragOvers[overTarget.id] = overTarget;
+ }
+
+
+ if (!me.notifyOccluded) {
+ break;
+ }
+ }
+ }
+
+ if (me.mode) {
+ if (outEvts.length) {
+ dragCurrent.b4DragOut(e, outEvts);
+ dragCurrent.onDragOut(e, outEvts);
+ }
+
+ if (enterEvts.length) {
+ dragCurrent.onDragEnter(e, enterEvts);
+ }
+
+ if (overEvts.length) {
+ dragCurrent.b4DragOver(e, overEvts);
+ dragCurrent.onDragOver(e, overEvts);
+ }
+
+ if (dropEvts.length) {
+ dragCurrent.b4DragDrop(e, dropEvts);
+ dragCurrent.onDragDrop(e, dropEvts);
+ }
+
+ } else {
+
+ for (i=0, len=outEvts.length; i<len; ++i) {
+ dragCurrent.b4DragOut(e, outEvts[i].id);
+ dragCurrent.onDragOut(e, outEvts[i].id);
+ }
+
+
+ for (i=0,len=enterEvts.length; i<len; ++i) {
+
+ dragCurrent.onDragEnter(e, enterEvts[i].id);
+ }
+
+
+ for (i=0,len=overEvts.length; i<len; ++i) {
+ dragCurrent.b4DragOver(e, overEvts[i].id);
+ dragCurrent.onDragOver(e, overEvts[i].id);
+ }
+
+
+ for (i=0, len=dropEvts.length; i<len; ++i) {
+ dragCurrent.b4DragDrop(e, dropEvts[i].id);
+ dragCurrent.onDragDrop(e, dropEvts[i].id);
+ }
+
+ }
+
+
+ if (isDrop && !dropEvts.length) {
+ dragCurrent.onInvalidDrop(e);
+ }
+ },
+
+
+ getZIndex: function(element) {
+ var body = document.body,
+ z,
+ zIndex = -1;
+
+ element = Ext.getDom(element);
+ while (element !== body) {
+ if (!isNaN(z = Number(Ext.fly(element).getStyle('zIndex')))) {
+ zIndex = z;
+ }
+ element = element.parentNode;
+ }
+ return zIndex;
+ },
+
+
+ byZIndex: function(d1, d2) {
+ return d1.zIndex < d2.zIndex;
+ },
+
+
+ getBestMatch: function(dds) {
+ var winner = null;
+
+
+
+
+
+
+ var len = dds.length;
+
+ if (len == 1) {
+ winner = dds[0];
+ } else {
+
+ for (var i=0; i<len; ++i) {
+ var dd = dds[i];
+
+
+
+ if (dd.cursorIsOver) {
+ winner = dd;
+ break;
+
+ } else {
+ if (!winner ||
+ winner.overlap.getArea() < dd.overlap.getArea()) {
+ winner = dd;
+ }
+ }
+ }
+ }
+
+ return winner;
+ },
+
+
+ refreshCache: function(groups) {
+ for (var sGroup in groups) {
+ if ("string" != typeof sGroup) {
+ continue;
+ }
+ for (var i in this.ids[sGroup]) {
+ var oDD = this.ids[sGroup][i];
+
+ if (this.isTypeOfDD(oDD)) {
+
+ var loc = this.getLocation(oDD);
+ if (loc) {
+ this.locationCache[oDD.id] = loc;
+ } else {
+ delete this.locationCache[oDD.id];
+
+
+
+ }
+ }
+ }
+ }
+ },
+
+
+ verifyEl: function(el) {
+ if (el) {
+ var parent;
+ if(Ext.isIE){
+ try{
+ parent = el.offsetParent;
+ }catch(e){}
+ }else{
+ parent = el.offsetParent;
+ }
+ if (parent) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+
+ getLocation: function(oDD) {
+ if (! this.isTypeOfDD(oDD)) {
+ return null;
+ }
+
+ var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l, region;
+
+ try {
+ pos= Ext.lib.Dom.getXY(el);
+ } catch (e) { }
+
+ if (!pos) {
+ return null;
+ }
+
+ x1 = pos[0];
+ x2 = x1 + el.offsetWidth;
+ y1 = pos[1];
+ y2 = y1 + el.offsetHeight;
+
+ t = y1 - oDD.padding[0];
+ r = x2 + oDD.padding[1];
+ b = y2 + oDD.padding[2];
+ l = x1 - oDD.padding[3];
+
+ return new Ext.lib.Region( t, r, b, l );
+ },
+
+
+ isOverTarget: function(pt, oTarget, intersect) {
+
+ var loc = this.locationCache[oTarget.id];
+ if (!loc || !this.useCache) {
+ loc = this.getLocation(oTarget);
+ this.locationCache[oTarget.id] = loc;
+
+ }
+
+ if (!loc) {
+ return false;
+ }
+
+ oTarget.cursorIsOver = loc.contains( pt );
+
+
+
+
+
+
+ var dc = this.dragCurrent;
+ if (!dc || !dc.getTargetCoord ||
+ (!intersect && !dc.constrainX && !dc.constrainY)) {
+ return oTarget.cursorIsOver;
+ }
+
+ oTarget.overlap = null;
+
+
+
+
+
+ var pos = dc.getTargetCoord(pt.x, pt.y);
+
+ var el = dc.getDragEl();
+ var curRegion = new Ext.lib.Region( pos.y,
+ pos.x + el.offsetWidth,
+ pos.y + el.offsetHeight,
+ pos.x );
+
+ var overlap = curRegion.intersect(loc);
+
+ if (overlap) {
+ oTarget.overlap = overlap;
+ return (intersect) ? true : oTarget.cursorIsOver;
+ } else {
+ return false;
+ }
+ },
+
+
+ _onUnload: function(e, me) {
+ Event.removeListener(document, "mouseup", this.handleMouseUp, this);
+ Event.removeListener(document, "mousemove", this.handleMouseMove, this);
+ Event.removeListener(window, "resize", this._onResize, this);
+ Ext.dd.DragDropMgr.unregAll();
+ },
+
+
+ unregAll: function() {
+
+ if (this.dragCurrent) {
+ this.stopDrag();
+ this.dragCurrent = null;
+ }
+
+ this._execOnAll("unreg", []);
+
+ for (var i in this.elementCache) {
+ delete this.elementCache[i];
+ }
+
+ this.elementCache = {};
+ this.ids = {};
+ },
+
+
+ elementCache: {},
+
+
+ getElWrapper: function(id) {
+ var oWrapper = this.elementCache[id];
+ if (!oWrapper || !oWrapper.el) {
+ oWrapper = this.elementCache[id] =
+ new this.ElementWrapper(Ext.getDom(id));
+ }
+ return oWrapper;
+ },
+
+
+ getElement: function(id) {
+ return Ext.getDom(id);
+ },
+
+
+ getCss: function(id) {
+ var el = Ext.getDom(id);
+ return (el) ? el.style : null;
+ },
+
+
+ ElementWrapper: function(el) {
+
+ this.el = el || null;
+
+ this.id = this.el && el.id;
+
+ this.css = this.el && el.style;
+ },
+
+
+ getPosX: function(el) {
+ return Ext.lib.Dom.getX(el);
+ },
+
+
+ getPosY: function(el) {
+ return Ext.lib.Dom.getY(el);
+ },
+
+
+ swapNode: function(n1, n2) {
+ if (n1.swapNode) {
+ n1.swapNode(n2);
+ } else {
+ var p = n2.parentNode;
+ var s = n2.nextSibling;
+
+ if (s == n1) {
+ p.insertBefore(n1, n2);
+ } else if (n2 == n1.nextSibling) {
+ p.insertBefore(n2, n1);
+ } else {
+ n1.parentNode.replaceChild(n2, n1);
+ p.insertBefore(n1, s);
+ }
+ }
+ },
+
+
+ getScroll: function () {
+ var t, l, dde=document.documentElement, db=document.body;
+ if (dde && (dde.scrollTop || dde.scrollLeft)) {
+ t = dde.scrollTop;
+ l = dde.scrollLeft;
+ } else if (db) {
+ t = db.scrollTop;
+ l = db.scrollLeft;
+ } else {
+
+ }
+ return { top: t, left: l };
+ },
+
+
+ getStyle: function(el, styleProp) {
+ return Ext.fly(el).getStyle(styleProp);
+ },
+
+
+ getScrollTop: function () {
+ return this.getScroll().top;
+ },
+
+
+ getScrollLeft: function () {
+ return this.getScroll().left;
+ },
+
+
+ moveToEl: function (moveEl, targetEl) {
+ var aCoord = Ext.lib.Dom.getXY(targetEl);
+ Ext.lib.Dom.setXY(moveEl, aCoord);
+ },
+
+
+ numericSort: function(a, b) {
+ return (a - b);
+ },
+
+
+ _timeoutCount: 0,
+
+
+ _addListeners: function() {
+ var DDM = Ext.dd.DDM;
+ if ( Ext.lib.Event && document ) {
+ DDM._onLoad();
+ } else {
+ if (DDM._timeoutCount > 2000) {
+ } else {
+ setTimeout(DDM._addListeners, 10);
+ if (document && document.body) {
+ DDM._timeoutCount += 1;
+ }
+ }
+ }
+ },
+
+
+ handleWasClicked: function(node, id) {
+ if (this.isHandle(id, node.id)) {
+ return true;
+ } else {
+
+ var p = node.parentNode;
+
+ while (p) {
+ if (this.isHandle(id, p.id)) {
+ return true;
+ } else {
+ p = p.parentNode;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ };
+
+}();
+
+
+Ext.dd.DDM = Ext.dd.DragDropMgr;
+Ext.dd.DDM._addListeners();
+
+}
+
+
+Ext.dd.DD = function(id, sGroup, config) {
+ if (id) {
+ this.init(id, sGroup, config);
+ }
+};
+
+Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, {
+
+
+ scroll: true,
+
+
+ autoOffset: function(iPageX, iPageY) {
+ var x = iPageX - this.startPageX;
+ var y = iPageY - this.startPageY;
+ this.setDelta(x, y);
+ },
+
+
+ setDelta: function(iDeltaX, iDeltaY) {
+ this.deltaX = iDeltaX;
+ this.deltaY = iDeltaY;
+ },
+
+
+ setDragElPos: function(iPageX, iPageY) {
+
+
+
+ var el = this.getDragEl();
+ this.alignElWithMouse(el, iPageX, iPageY);
+ },
+
+
+ alignElWithMouse: function(el, iPageX, iPageY) {
+ var oCoord = this.getTargetCoord(iPageX, iPageY);
+ var fly = el.dom ? el : Ext.fly(el, '_dd');
+ if (!this.deltaSetXY) {
+ var aCoord = [oCoord.x, oCoord.y];
+ fly.setXY(aCoord);
+ var newLeft = fly.getLeft(true);
+ var newTop = fly.getTop(true);
+ this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ];
+ } else {
+ fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]);
+ }
+
+ this.cachePosition(oCoord.x, oCoord.y);
+ this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth);
+ return oCoord;
+ },
+
+
+ cachePosition: function(iPageX, iPageY) {
+ if (iPageX) {
+ this.lastPageX = iPageX;
+ this.lastPageY = iPageY;
+ } else {
+ var aCoord = Ext.lib.Dom.getXY(this.getEl());
+ this.lastPageX = aCoord[0];
+ this.lastPageY = aCoord[1];
+ }
+ },
+
+
+ autoScroll: function(x, y, h, w) {
+
+ if (this.scroll) {
+
+ var clientH = Ext.lib.Dom.getViewHeight();
+
+
+ var clientW = Ext.lib.Dom.getViewWidth();
+
+
+ var st = this.DDM.getScrollTop();
+
+
+ var sl = this.DDM.getScrollLeft();
+
+
+ var bot = h + y;
+
+
+ var right = w + x;
+
+
+
+
+ var toBot = (clientH + st - y - this.deltaY);
+
+
+ var toRight = (clientW + sl - x - this.deltaX);
+
+
+
+
+ var thresh = 40;
+
+
+
+
+ var scrAmt = (document.all) ? 80 : 30;
+
+
+
+ if ( bot > clientH && toBot < thresh ) {
+ window.scrollTo(sl, st + scrAmt);
+ }
+
+
+
+ if ( y < st && st > 0 && y - st < thresh ) {
+ window.scrollTo(sl, st - scrAmt);
+ }
+
+
+
+ if ( right > clientW && toRight < thresh ) {
+ window.scrollTo(sl + scrAmt, st);
+ }
+
+
+
+ if ( x < sl && sl > 0 && x - sl < thresh ) {
+ window.scrollTo(sl - scrAmt, st);
+ }
+ }
+ },
+
+
+ getTargetCoord: function(iPageX, iPageY) {
+ var x = iPageX - this.deltaX;
+ var y = iPageY - this.deltaY;
+
+ if (this.constrainX) {
+ if (x < this.minX) { x = this.minX; }
+ if (x > this.maxX) { x = this.maxX; }
+ }
+
+ if (this.constrainY) {
+ if (y < this.minY) { y = this.minY; }
+ if (y > this.maxY) { y = this.maxY; }
+ }
+
+ x = this.getTick(x, this.xTicks);
+ y = this.getTick(y, this.yTicks);
+
+
+ return {x:x, y:y};
+ },
+
+
+ applyConfig: function() {
+ Ext.dd.DD.superclass.applyConfig.call(this);
+ this.scroll = (this.config.scroll !== false);
+ },
+
+
+ b4MouseDown: function(e) {
+
+ this.autoOffset(e.getPageX(),
+ e.getPageY());
+ },
+
+
+ b4Drag: function(e) {
+ this.setDragElPos(e.getPageX(),
+ e.getPageY());
+ },
+
+ toString: function() {
+ return ("DD " + this.id);
+ }
+
+
+
+
+
+
+});
+
+Ext.dd.DDProxy = function(id, sGroup, config) {
+ if (id) {
+ this.init(id, sGroup, config);
+ this.initFrame();
+ }
+};
+
+
+Ext.dd.DDProxy.dragElId = "ygddfdiv";
+
+Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, {
+
+
+ resizeFrame: true,
+
+
+ centerFrame: false,
+
+
+ createFrame: function() {
+ var self = this;
+ var body = document.body;
+
+ if (!body || !body.firstChild) {
+ setTimeout( function() { self.createFrame(); }, 50 );
+ return;
+ }
+
+ var div = this.getDragEl();
+
+ if (!div) {
+ div = document.createElement("div");
+ div.id = this.dragElId;
+ var s = div.style;
+
+ s.position = "absolute";
+ s.visibility = "hidden";
+ s.cursor = "move";
+ s.border = "2px solid #aaa";
+ s.zIndex = 999;
+
+
+
+
+ body.insertBefore(div, body.firstChild);
+ }
+ },
+
+
+ initFrame: function() {
+ this.createFrame();
+ },
+
+ applyConfig: function() {
+ Ext.dd.DDProxy.superclass.applyConfig.call(this);
+
+ this.resizeFrame = (this.config.resizeFrame !== false);
+ this.centerFrame = (this.config.centerFrame);
+ this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId);
+ },
+
+
+ showFrame: function(iPageX, iPageY) {
+ var el = this.getEl();
+ var dragEl = this.getDragEl();
+ var s = dragEl.style;
+
+ this._resizeProxy();
+
+ if (this.centerFrame) {
+ this.setDelta( Math.round(parseInt(s.width, 10)/2),
+ Math.round(parseInt(s.height, 10)/2) );
+ }
+
+ this.setDragElPos(iPageX, iPageY);
+
+ Ext.fly(dragEl).show();
+ },
+
+
+ _resizeProxy: function() {
+ if (this.resizeFrame) {
+ var el = this.getEl();
+ Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight);
+ }
+ },
+
+
+ b4MouseDown: function(e) {
+ var x = e.getPageX();
+ var y = e.getPageY();
+ this.autoOffset(x, y);
+ this.setDragElPos(x, y);
+ },
+
+
+ b4StartDrag: function(x, y) {
+
+ this.showFrame(x, y);
+ },
+
+
+ b4EndDrag: function(e) {
+ Ext.fly(this.getDragEl()).hide();
+ },
+
+
+
+
+ endDrag: function(e) {
+
+ var lel = this.getEl();
+ var del = this.getDragEl();
+
+
+ del.style.visibility = "";
+
+ this.beforeMove();
+
+
+ lel.style.visibility = "hidden";
+ Ext.dd.DDM.moveToEl(lel, del);
+ del.style.visibility = "hidden";
+ lel.style.visibility = "";
+
+ this.afterDrag();
+ },
+
+ beforeMove : function(){
+
+ },
+
+ afterDrag : function(){
+
+ },
+
+ toString: function() {
+ return ("DDProxy " + this.id);
+ }
+
+});
+
+Ext.dd.DDTarget = function(id, sGroup, config) {
+ if (id) {
+ this.initTarget(id, sGroup, config);
+ }
+};
+
+
+Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, {
+
+ getDragEl: Ext.emptyFn,
+
+ isValidHandleChild: Ext.emptyFn,
+
+ startDrag: Ext.emptyFn,
+
+ endDrag: Ext.emptyFn,
+
+ onDrag: Ext.emptyFn,
+
+ onDragDrop: Ext.emptyFn,
+
+ onDragEnter: Ext.emptyFn,
+
+ onDragOut: Ext.emptyFn,
+
+ onDragOver: Ext.emptyFn,
+
+ onInvalidDrop: Ext.emptyFn,
+
+ onMouseDown: Ext.emptyFn,
+
+ onMouseUp: Ext.emptyFn,
+
+ setXConstraint: Ext.emptyFn,
+
+ setYConstraint: Ext.emptyFn,
+
+ resetConstraints: Ext.emptyFn,
+
+ clearConstraints: Ext.emptyFn,
+
+ clearTicks: Ext.emptyFn,
+
+ setInitPosition: Ext.emptyFn,
+
+ setDragElId: Ext.emptyFn,
+
+ setHandleElId: Ext.emptyFn,
+
+ setOuterHandleElId: Ext.emptyFn,
+
+ addInvalidHandleClass: Ext.emptyFn,
+
+ addInvalidHandleId: Ext.emptyFn,
+
+ addInvalidHandleType: Ext.emptyFn,
+
+ removeInvalidHandleClass: Ext.emptyFn,
+
+ removeInvalidHandleId: Ext.emptyFn,
+
+ removeInvalidHandleType: Ext.emptyFn,
+
+ toString: function() {
+ return ("DDTarget " + this.id);
+ }
+});
+Ext.dd.DragTracker = Ext.extend(Ext.util.Observable, {
+
+ active: false,
+
+ tolerance: 5,
+
+ autoStart: false,
+
+ constructor : function(config){
+ Ext.apply(this, config);
+ this.addEvents(
+
+ 'mousedown',
+
+ 'mouseup',
+
+ 'mousemove',
+
+ 'dragstart',
+
+ 'dragend',
+
+ 'drag'
+ );
+
+ this.dragRegion = new Ext.lib.Region(0,0,0,0);
+
+ if(this.el){
+ this.initEl(this.el);
+ }
+ Ext.dd.DragTracker.superclass.constructor.call(this, config);
+ },
+
+ initEl: function(el){
+ this.el = Ext.get(el);
+ el.on('mousedown', this.onMouseDown, this,
+ this.delegate ? {delegate: this.delegate} : undefined);
+ },
+
+ destroy : function(){
+ this.el.un('mousedown', this.onMouseDown, this);
+ delete this.el;
+ },
+
+ onMouseDown: function(e, target){
+ if(this.fireEvent('mousedown', this, e) !== false && this.onBeforeStart(e) !== false){
+ this.startXY = this.lastXY = e.getXY();
+ this.dragTarget = this.delegate ? target : this.el.dom;
+ if(this.preventDefault !== false){
+ e.preventDefault();
+ }
+ Ext.getDoc().on({
+ scope: this,
+ mouseup: this.onMouseUp,
+ mousemove: this.onMouseMove,
+ selectstart: this.stopSelect
+ });
+ if(this.autoStart){
+ this.timer = this.triggerStart.defer(this.autoStart === true ? 1000 : this.autoStart, this, [e]);
+ }
+ }
+ },
+
+ onMouseMove: function(e, target){
+
+ var ieCheck = Ext.isIE6 || Ext.isIE7 || Ext.isIE8;
+ if(this.active && ieCheck && !e.browserEvent.button){
+ e.preventDefault();
+ this.onMouseUp(e);
+ return;
+ }
+
+ e.preventDefault();
+ var xy = e.getXY(), s = this.startXY;
+ this.lastXY = xy;
+ if(!this.active){
+ if(Math.abs(s[0]-xy[0]) > this.tolerance || Math.abs(s[1]-xy[1]) > this.tolerance){
+ this.triggerStart(e);
+ }else{
+ return;
+ }
+ }
+ this.fireEvent('mousemove', this, e);
+ this.onDrag(e);
+ this.fireEvent('drag', this, e);
+ },
+
+ onMouseUp: function(e) {
+ var doc = Ext.getDoc(),
+ wasActive = this.active;
+
+ doc.un('mousemove', this.onMouseMove, this);
+ doc.un('mouseup', this.onMouseUp, this);
+ doc.un('selectstart', this.stopSelect, this);
+ e.preventDefault();
+ this.clearStart();
+ this.active = false;
+ delete this.elRegion;
+ this.fireEvent('mouseup', this, e);
+ if(wasActive){
+ this.onEnd(e);
+ this.fireEvent('dragend', this, e);
+ }
+ },
+
+ triggerStart: function(e) {
+ this.clearStart();
+ this.active = true;
+ this.onStart(e);
+ this.fireEvent('dragstart', this, e);
+ },
+
+ clearStart : function() {
+ if(this.timer){
+ clearTimeout(this.timer);
+ delete this.timer;
+ }
+ },
+
+ stopSelect : function(e) {
+ e.stopEvent();
+ return false;
+ },
+
+
+ onBeforeStart : function(e) {
+
+ },
+
+
+ onStart : function(xy) {
+
+ },
+
+
+ onDrag : function(e) {
+
+ },
+
+
+ onEnd : function(e) {
+
+ },
+
+
+ getDragTarget : function(){
+ return this.dragTarget;
+ },
+
+ getDragCt : function(){
+ return this.el;
+ },
+
+ getXY : function(constrain){
+ return constrain ?
+ this.constrainModes[constrain].call(this, this.lastXY) : this.lastXY;
+ },
+
+ getOffset : function(constrain){
+ var xy = this.getXY(constrain),
+ s = this.startXY;
+ return [s[0]-xy[0], s[1]-xy[1]];
+ },
+
+ constrainModes: {
+ 'point' : function(xy){
+
+ if(!this.elRegion){
+ this.elRegion = this.getDragCt().getRegion();
+ }
+
+ var dr = this.dragRegion;
+
+ dr.left = xy[0];
+ dr.top = xy[1];
+ dr.right = xy[0];
+ dr.bottom = xy[1];
+
+ dr.constrainTo(this.elRegion);
+
+ return [dr.left, dr.top];
+ }
+ }
+});
+Ext.dd.ScrollManager = function(){
+ var ddm = Ext.dd.DragDropMgr;
+ var els = {};
+ var dragEl = null;
+ var proc = {};
+
+ var onStop = function(e){
+ dragEl = null;
+ clearProc();
+ };
+
+ var triggerRefresh = function(){
+ if(ddm.dragCurrent){
+ ddm.refreshCache(ddm.dragCurrent.groups);
+ }
+ };
+
+ var doScroll = function(){
+ if(ddm.dragCurrent){
+ var dds = Ext.dd.ScrollManager;
+ var inc = proc.el.ddScrollConfig ?
+ proc.el.ddScrollConfig.increment : dds.increment;
+ if(!dds.animate){
+ if(proc.el.scroll(proc.dir, inc)){
+ triggerRefresh();
+ }
+ }else{
+ proc.el.scroll(proc.dir, inc, true, dds.animDuration, triggerRefresh);
+ }
+ }
+ };
+
+ var clearProc = function(){
+ if(proc.id){
+ clearInterval(proc.id);
+ }
+ proc.id = 0;
+ proc.el = null;
+ proc.dir = "";
+ };
+
+ var startProc = function(el, dir){
+ clearProc();
+ proc.el = el;
+ proc.dir = dir;
+ var group = el.ddScrollConfig ? el.ddScrollConfig.ddGroup : undefined,
+ freq = (el.ddScrollConfig && el.ddScrollConfig.frequency)
+ ? el.ddScrollConfig.frequency
+ : Ext.dd.ScrollManager.frequency;
+
+ if (group === undefined || ddm.dragCurrent.ddGroup == group) {
+ proc.id = setInterval(doScroll, freq);
+ }
+ };
+
+ var onFire = function(e, isDrop){
+ if(isDrop || !ddm.dragCurrent){ return; }
+ var dds = Ext.dd.ScrollManager;
+ if(!dragEl || dragEl != ddm.dragCurrent){
+ dragEl = ddm.dragCurrent;
+
+ dds.refreshCache();
+ }
+
+ var xy = Ext.lib.Event.getXY(e);
+ var pt = new Ext.lib.Point(xy[0], xy[1]);
+ for(var id in els){
+ var el = els[id], r = el._region;
+ var c = el.ddScrollConfig ? el.ddScrollConfig : dds;
+ if(r && r.contains(pt) && el.isScrollable()){
+ if(r.bottom - pt.y <= c.vthresh){
+ if(proc.el != el){
+ startProc(el, "down");
+ }
+ return;
+ }else if(r.right - pt.x <= c.hthresh){
+ if(proc.el != el){
+ startProc(el, "left");
+ }
+ return;
+ }else if(pt.y - r.top <= c.vthresh){
+ if(proc.el != el){
+ startProc(el, "up");
+ }
+ return;
+ }else if(pt.x - r.left <= c.hthresh){
+ if(proc.el != el){
+ startProc(el, "right");
+ }
+ return;
+ }
+ }
+ }
+ clearProc();
+ };
+
+ ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm);
+ ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm);
+
+ return {
+
+ register : function(el){
+ if(Ext.isArray(el)){
+ for(var i = 0, len = el.length; i < len; i++) {
+ this.register(el[i]);
+ }
+ }else{
+ el = Ext.get(el);
+ els[el.id] = el;
+ }
+ },
+
+
+ unregister : function(el){
+ if(Ext.isArray(el)){
+ for(var i = 0, len = el.length; i < len; i++) {
+ this.unregister(el[i]);
+ }
+ }else{
+ el = Ext.get(el);
+ delete els[el.id];
+ }
+ },
+
+
+ vthresh : 25,
+
+ hthresh : 25,
+
+
+ increment : 100,
+
+
+ frequency : 500,
+
+
+ animate: true,
+
+
+ animDuration: .4,
+
+
+ ddGroup: undefined,
+
+
+ refreshCache : function(){
+ for(var id in els){
+ if(typeof els[id] == 'object'){
+ els[id]._region = els[id].getRegion();
+ }
+ }
+ }
+ };
+}();
+Ext.dd.Registry = function(){
+ var elements = {};
+ var handles = {};
+ var autoIdSeed = 0;
+
+ var getId = function(el, autogen){
+ if(typeof el == "string"){
+ return el;
+ }
+ var id = el.id;
+ if(!id && autogen !== false){
+ id = "extdd-" + (++autoIdSeed);
+ el.id = id;
+ }
+ return id;
+ };
+
+ return {
+
+ register : function(el, data){
+ data = data || {};
+ if(typeof el == "string"){
+ el = document.getElementById(el);
+ }
+ data.ddel = el;
+ elements[getId(el)] = data;
+ if(data.isHandle !== false){
+ handles[data.ddel.id] = data;
+ }
+ if(data.handles){
+ var hs = data.handles;
+ for(var i = 0, len = hs.length; i < len; i++){
+ handles[getId(hs[i])] = data;
+ }
+ }
+ },
+
+
+ unregister : function(el){
+ var id = getId(el, false);
+ var data = elements[id];
+ if(data){
+ delete elements[id];
+ if(data.handles){
+ var hs = data.handles;
+ for(var i = 0, len = hs.length; i < len; i++){
+ delete handles[getId(hs[i], false)];
+ }
+ }
+ }
+ },
+
+
+ getHandle : function(id){
+ if(typeof id != "string"){
+ id = id.id;
+ }
+ return handles[id];
+ },
+
+
+ getHandleFromEvent : function(e){
+ var t = Ext.lib.Event.getTarget(e);
+ return t ? handles[t.id] : null;
+ },
+
+
+ getTarget : function(id){
+ if(typeof id != "string"){
+ id = id.id;
+ }
+ return elements[id];
+ },
+
+
+ getTargetFromEvent : function(e){
+ var t = Ext.lib.Event.getTarget(e);
+ return t ? elements[t.id] || handles[t.id] : null;
+ }
+ };
+}();
+Ext.dd.StatusProxy = function(config){
+ Ext.apply(this, config);
+ this.id = this.id || Ext.id();
+ this.el = new Ext.Layer({
+ dh: {
+ id: this.id, tag: "div", cls: "x-dd-drag-proxy "+this.dropNotAllowed, children: [
+ {tag: "div", cls: "x-dd-drop-icon"},
+ {tag: "div", cls: "x-dd-drag-ghost"}
+ ]
+ },
+ shadow: !config || config.shadow !== false
+ });
+ this.ghost = Ext.get(this.el.dom.childNodes[1]);
+ this.dropStatus = this.dropNotAllowed;
+};
+
+Ext.dd.StatusProxy.prototype = {
+
+ dropAllowed : "x-dd-drop-ok",
+
+ dropNotAllowed : "x-dd-drop-nodrop",
+
+
+ setStatus : function(cssClass){
+ cssClass = cssClass || this.dropNotAllowed;
+ if(this.dropStatus != cssClass){
+ this.el.replaceClass(this.dropStatus, cssClass);
+ this.dropStatus = cssClass;
+ }
+ },
+
+
+ reset : function(clearGhost){
+ this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed;
+ this.dropStatus = this.dropNotAllowed;
+ if(clearGhost){
+ this.ghost.update("");
+ }
+ },
+
+
+ update : function(html){
+ if(typeof html == "string"){
+ this.ghost.update(html);
+ }else{
+ this.ghost.update("");
+ html.style.margin = "0";
+ this.ghost.dom.appendChild(html);
+ }
+ var el = this.ghost.dom.firstChild;
+ if(el){
+ Ext.fly(el).setStyle('float', 'none');
+ }
+ },
+
+
+ getEl : function(){
+ return this.el;
+ },
+
+
+ getGhost : function(){
+ return this.ghost;
+ },
+
+
+ hide : function(clear){
+ this.el.hide();
+ if(clear){
+ this.reset(true);
+ }
+ },
+
+
+ stop : function(){
+ if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){
+ this.anim.stop();
+ }
+ },
+
+
+ show : function(){
+ this.el.show();
+ },
+
+
+ sync : function(){
+ this.el.sync();
+ },
+
+
+ repair : function(xy, callback, scope){
+ this.callback = callback;
+ this.scope = scope;
+ if(xy && this.animRepair !== false){
+ this.el.addClass("x-dd-drag-repair");
+ this.el.hideUnders(true);
+ this.anim = this.el.shift({
+ duration: this.repairDuration || .5,
+ easing: 'easeOut',
+ xy: xy,
+ stopFx: true,
+ callback: this.afterRepair,
+ scope: this
+ });
+ }else{
+ this.afterRepair();
+ }
+ },
+
+
+ afterRepair : function(){
+ this.hide(true);
+ if(typeof this.callback == "function"){
+ this.callback.call(this.scope || this);
+ }
+ this.callback = null;
+ this.scope = null;
+ },
+
+ destroy: function(){
+ Ext.destroy(this.ghost, this.el);
+ }
+};
+Ext.dd.DragSource = function(el, config){
+ this.el = Ext.get(el);
+ if(!this.dragData){
+ this.dragData = {};
+ }
+
+ Ext.apply(this, config);
+
+ if(!this.proxy){
+ this.proxy = new Ext.dd.StatusProxy();
+ }
+ Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group,
+ {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true});
+
+ this.dragging = false;
+};
+
+Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, {
+
+
+ dropAllowed : "x-dd-drop-ok",
+
+ dropNotAllowed : "x-dd-drop-nodrop",
+
+
+ getDragData : function(e){
+ return this.dragData;
+ },
+
+
+ onDragEnter : function(e, id){
+ var target = Ext.dd.DragDropMgr.getDDById(id);
+ this.cachedTarget = target;
+ if(this.beforeDragEnter(target, e, id) !== false){
+ if(target.isNotifyTarget){
+ var status = target.notifyEnter(this, e, this.dragData);
+ this.proxy.setStatus(status);
+ }else{
+ this.proxy.setStatus(this.dropAllowed);
+ }
+
+ if(this.afterDragEnter){
+
+ this.afterDragEnter(target, e, id);
+ }
+ }
+ },
+
+
+ beforeDragEnter : function(target, e, id){
+ return true;
+ },
+
+
+ alignElWithMouse: function() {
+ Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);
+ this.proxy.sync();
+ },
+
+
+ onDragOver : function(e, id){
+ var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
+ if(this.beforeDragOver(target, e, id) !== false){
+ if(target.isNotifyTarget){
+ var status = target.notifyOver(this, e, this.dragData);
+ this.proxy.setStatus(status);
+ }
+
+ if(this.afterDragOver){
+
+ this.afterDragOver(target, e, id);
+ }
+ }
+ },
+
+
+ beforeDragOver : function(target, e, id){
+ return true;
+ },
+
+
+ onDragOut : function(e, id){
+ var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
+ if(this.beforeDragOut(target, e, id) !== false){
+ if(target.isNotifyTarget){
+ target.notifyOut(this, e, this.dragData);
+ }
+ this.proxy.reset();
+ if(this.afterDragOut){
+
+ this.afterDragOut(target, e, id);
+ }
+ }
+ this.cachedTarget = null;
+ },
+
+
+ beforeDragOut : function(target, e, id){
+ return true;
+ },
+
+
+ onDragDrop : function(e, id){
+ var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
+ if(this.beforeDragDrop(target, e, id) !== false){
+ if(target.isNotifyTarget){
+ if(target.notifyDrop(this, e, this.dragData)){
+ this.onValidDrop(target, e, id);
+ }else{
+ this.onInvalidDrop(target, e, id);
+ }
+ }else{
+ this.onValidDrop(target, e, id);
+ }
+
+ if(this.afterDragDrop){
+
+ this.afterDragDrop(target, e, id);
+ }
+ }
+ delete this.cachedTarget;
+ },
+
+
+ beforeDragDrop : function(target, e, id){
+ return true;
+ },
+
+
+ onValidDrop : function(target, e, id){
+ this.hideProxy();
+ if(this.afterValidDrop){
+
+ this.afterValidDrop(target, e, id);
+ }
+ },
+
+
+ getRepairXY : function(e, data){
+ return this.el.getXY();
+ },
+
+
+ onInvalidDrop : function(target, e, id){
+ this.beforeInvalidDrop(target, e, id);
+ if(this.cachedTarget){
+ if(this.cachedTarget.isNotifyTarget){
+ this.cachedTarget.notifyOut(this, e, this.dragData);
+ }
+ this.cacheTarget = null;
+ }
+ this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this);
+
+ if(this.afterInvalidDrop){
+
+ this.afterInvalidDrop(e, id);
+ }
+ },
+
+
+ afterRepair : function(){
+ if(Ext.enableFx){
+ this.el.highlight(this.hlColor || "c3daf9");
+ }
+ this.dragging = false;
+ },
+
+
+ beforeInvalidDrop : function(target, e, id){
+ return true;
+ },
+
+
+ handleMouseDown : function(e){
+ if(this.dragging) {
+ return;
+ }
+ var data = this.getDragData(e);
+ if(data && this.onBeforeDrag(data, e) !== false){
+ this.dragData = data;
+ this.proxy.stop();
+ Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments);
+ }
+ },
+
+
+ onBeforeDrag : function(data, e){
+ return true;
+ },
+
+
+ onStartDrag : Ext.emptyFn,
+
+
+ startDrag : function(x, y){
+ this.proxy.reset();
+ this.dragging = true;
+ this.proxy.update("");
+ this.onInitDrag(x, y);
+ this.proxy.show();
+ },
+
+
+ onInitDrag : function(x, y){
+ var clone = this.el.dom.cloneNode(true);
+ clone.id = Ext.id();
+ this.proxy.update(clone);
+ this.onStartDrag(x, y);
+ return true;
+ },
+
+
+ getProxy : function(){
+ return this.proxy;
+ },
+
+
+ hideProxy : function(){
+ this.proxy.hide();
+ this.proxy.reset(true);
+ this.dragging = false;
+ },
+
+
+ triggerCacheRefresh : function(){
+ Ext.dd.DDM.refreshCache(this.groups);
+ },
+
+
+ b4EndDrag: function(e) {
+ },
+
+
+ endDrag : function(e){
+ this.onEndDrag(this.dragData, e);
+ },
+
+
+ onEndDrag : function(data, e){
+ },
+
+
+ autoOffset : function(x, y) {
+ this.setDelta(-12, -20);
+ },
+
+ destroy: function(){
+ Ext.dd.DragSource.superclass.destroy.call(this);
+ Ext.destroy(this.proxy);
+ }
+});
+Ext.dd.DropTarget = Ext.extend(Ext.dd.DDTarget, {
+
+ constructor : function(el, config){
+ this.el = Ext.get(el);
+
+ Ext.apply(this, config);
+
+ if(this.containerScroll){
+ Ext.dd.ScrollManager.register(this.el);
+ }
+
+ Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group,
+ {isTarget: true});
+ },
+
+
+
+
+ dropAllowed : "x-dd-drop-ok",
+
+ dropNotAllowed : "x-dd-drop-nodrop",
+
+
+ isTarget : true,
+
+
+ isNotifyTarget : true,
+
+
+ notifyEnter : function(dd, e, data){
+ if(this.overClass){
+ this.el.addClass(this.overClass);
+ }
+ return this.dropAllowed;
+ },
+
+
+ notifyOver : function(dd, e, data){
+ return this.dropAllowed;
+ },
+
+
+ notifyOut : function(dd, e, data){
+ if(this.overClass){
+ this.el.removeClass(this.overClass);
+ }
+ },
+
+
+ notifyDrop : function(dd, e, data){
+ return false;
+ },
+
+ destroy : function(){
+ Ext.dd.DropTarget.superclass.destroy.call(this);
+ if(this.containerScroll){
+ Ext.dd.ScrollManager.unregister(this.el);
+ }
+ }
+});
+Ext.dd.DragZone = Ext.extend(Ext.dd.DragSource, {
+
+ constructor : function(el, config){
+ Ext.dd.DragZone.superclass.constructor.call(this, el, config);
+ if(this.containerScroll){
+ Ext.dd.ScrollManager.register(this.el);
+ }
+ },
+
+
+
+
+
+
+ getDragData : function(e){
+ return Ext.dd.Registry.getHandleFromEvent(e);
+ },
+
+
+ onInitDrag : function(x, y){
+ this.proxy.update(this.dragData.ddel.cloneNode(true));
+ this.onStartDrag(x, y);
+ return true;
+ },
+
+
+ afterRepair : function(){
+ if(Ext.enableFx){
+ Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");
+ }
+ this.dragging = false;
+ },
+
+
+ getRepairXY : function(e){
+ return Ext.Element.fly(this.dragData.ddel).getXY();
+ },
+
+ destroy : function(){
+ Ext.dd.DragZone.superclass.destroy.call(this);
+ if(this.containerScroll){
+ Ext.dd.ScrollManager.unregister(this.el);
+ }
+ }
+});
+Ext.dd.DropZone = function(el, config){
+ Ext.dd.DropZone.superclass.constructor.call(this, el, config);
+};
+
+Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, {
+
+ getTargetFromEvent : function(e){
+ return Ext.dd.Registry.getTargetFromEvent(e);
+ },
+
+
+ onNodeEnter : function(n, dd, e, data){
+
+ },
+
+
+ onNodeOver : function(n, dd, e, data){
+ return this.dropAllowed;
+ },
+
+
+ onNodeOut : function(n, dd, e, data){
+
+ },
+
+
+ onNodeDrop : function(n, dd, e, data){
+ return false;
+ },
+
+
+ onContainerOver : function(dd, e, data){
+ return this.dropNotAllowed;
+ },
+
+
+ onContainerDrop : function(dd, e, data){
+ return false;
+ },
+
+
+ notifyEnter : function(dd, e, data){
+ return this.dropNotAllowed;
+ },
+
+
+ notifyOver : function(dd, e, data){
+ var n = this.getTargetFromEvent(e);
+ if(!n){
+ if(this.lastOverNode){
+ this.onNodeOut(this.lastOverNode, dd, e, data);
+ this.lastOverNode = null;
+ }
+ return this.onContainerOver(dd, e, data);
+ }
+ if(this.lastOverNode != n){
+ if(this.lastOverNode){
+ this.onNodeOut(this.lastOverNode, dd, e, data);
+ }
+ this.onNodeEnter(n, dd, e, data);
+ this.lastOverNode = n;
+ }
+ return this.onNodeOver(n, dd, e, data);
+ },
+
+
+ notifyOut : function(dd, e, data){
+ if(this.lastOverNode){
+ this.onNodeOut(this.lastOverNode, dd, e, data);
+ this.lastOverNode = null;
+ }
+ },
+
+
+ notifyDrop : function(dd, e, data){
+ if(this.lastOverNode){
+ this.onNodeOut(this.lastOverNode, dd, e, data);
+ this.lastOverNode = null;
+ }
+ var n = this.getTargetFromEvent(e);
+ return n ?
+ this.onNodeDrop(n, dd, e, data) :
+ this.onContainerDrop(dd, e, data);
+ },
+
+
+ triggerCacheRefresh : function(){
+ Ext.dd.DDM.refreshCache(this.groups);
+ }
+});
+Ext.Element.addMethods({
+
+ initDD : function(group, config, overrides){
+ var dd = new Ext.dd.DD(Ext.id(this.dom), group, config);
+ return Ext.apply(dd, overrides);
+ },
+
+
+ initDDProxy : function(group, config, overrides){
+ var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config);
+ return Ext.apply(dd, overrides);
+ },
+
+
+ initDDTarget : function(group, config, overrides){
+ var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config);
+ return Ext.apply(dd, overrides);
+ }
+});
+
+Ext.data.Api = (function() {
+
+
+
+
+
+ var validActions = {};
+
+ return {
+
+ actions : {
+ create : 'create',
+ read : 'read',
+ update : 'update',
+ destroy : 'destroy'
+ },
+
+
+ restActions : {
+ create : 'POST',
+ read : 'GET',
+ update : 'PUT',
+ destroy : 'DELETE'
+ },
+
+
+ isAction : function(action) {
+ return (Ext.data.Api.actions[action]) ? true : false;
+ },
+
+
+ getVerb : function(name) {
+ if (validActions[name]) {
+ return validActions[name];
+ }
+ for (var verb in this.actions) {
+ if (this.actions[verb] === name) {
+ validActions[name] = verb;
+ break;
+ }
+ }
+ return (validActions[name] !== undefined) ? validActions[name] : null;
+ },
+
+
+ isValid : function(api){
+ var invalid = [];
+ var crud = this.actions;
+ for (var action in api) {
+ if (!(action in crud)) {
+ invalid.push(action);
+ }
+ }
+ return (!invalid.length) ? true : invalid;
+ },
+
+
+ hasUniqueUrl : function(proxy, verb) {
+ var url = (proxy.api[verb]) ? proxy.api[verb].url : null;
+ var unique = true;
+ for (var action in proxy.api) {
+ if ((unique = (action === verb) ? true : (proxy.api[action].url != url) ? true : false) === false) {
+ break;
+ }
+ }
+ return unique;
+ },
+
+
+ prepare : function(proxy) {
+ if (!proxy.api) {
+ proxy.api = {};
+ }
+ for (var verb in this.actions) {
+ var action = this.actions[verb];
+ proxy.api[action] = proxy.api[action] || proxy.url || proxy.directFn;
+ if (typeof(proxy.api[action]) == 'string') {
+ proxy.api[action] = {
+ url: proxy.api[action],
+ method: (proxy.restful === true) ? Ext.data.Api.restActions[action] : undefined
+ };
+ }
+ }
+ },
+
+
+ restify : function(proxy) {
+ proxy.restful = true;
+ for (var verb in this.restActions) {
+ proxy.api[this.actions[verb]].method ||
+ (proxy.api[this.actions[verb]].method = this.restActions[verb]);
+ }
+
+
+ proxy.onWrite = proxy.onWrite.createInterceptor(function(action, o, response, rs) {
+ var reader = o.reader;
+ var res = new Ext.data.Response({
+ action: action,
+ raw: response
+ });
+
+ switch (response.status) {
+ case 200:
+ return true;
+ break;
+ case 201:
+ if (Ext.isEmpty(res.raw.responseText)) {
+ res.success = true;
+ } else {
+
+ return true;
+ }
+ break;
+ case 204:
+ res.success = true;
+ res.data = null;
+ break;
+ default:
+ return true;
+ break;
+ }
+ if (res.success === true) {
+ this.fireEvent("write", this, action, res.data, res, rs, o.request.arg);
+ } else {
+ this.fireEvent('exception', this, 'remote', action, o, res, rs);
+ }
+ o.request.callback.call(o.request.scope, res.data, res, res.success);
+
+ return false;
+ }, proxy);
+ }
+ };
+})();
+
+
+Ext.data.Response = function(params, response) {
+ Ext.apply(this, params, {
+ raw: response
+ });
+};
+Ext.data.Response.prototype = {
+ message : null,
+ success : false,
+ status : null,
+ root : null,
+ raw : null,
+
+ getMessage : function() {
+ return this.message;
+ },
+ getSuccess : function() {
+ return this.success;
+ },
+ getStatus : function() {
+ return this.status;
+ },
+ getRoot : function() {
+ return this.root;
+ },
+ getRawResponse : function() {
+ return this.raw;
+ }
+};
+
+
+Ext.data.Api.Error = Ext.extend(Ext.Error, {
+ constructor : function(message, arg) {
+ this.arg = arg;
+ Ext.Error.call(this, message);
+ },
+ name: 'Ext.data.Api'
+});
+Ext.apply(Ext.data.Api.Error.prototype, {
+ lang: {
+ 'action-url-undefined': 'No fallback url defined for this action. When defining a DataProxy api, please be sure to define an url for each CRUD action in Ext.data.Api.actions or define a default url in addition to your api-configuration.',
+ 'invalid': 'received an invalid API-configuration. Please ensure your proxy API-configuration contains only the actions defined in Ext.data.Api.actions',
+ 'invalid-url': 'Invalid url. Please review your proxy configuration.',
+ 'execute': 'Attempted to execute an unknown action. Valid API actions are defined in Ext.data.Api.actions"'
+ }
+});
+
+
+
+
+Ext.data.SortTypes = {
+
+ none : function(s){
+ return s;
+ },
+
+
+ stripTagsRE : /<\/?[^>]+>/gi,
+
+
+ asText : function(s){
+ return String(s).replace(this.stripTagsRE, "");
+ },
+
+
+ asUCText : function(s){
+ return String(s).toUpperCase().replace(this.stripTagsRE, "");
+ },
+
+
+ asUCString : function(s) {
+ return String(s).toUpperCase();
+ },
+
+
+ asDate : function(s) {
+ if(!s){
+ return 0;
+ }
+ if(Ext.isDate(s)){
+ return s.getTime();
+ }
+ return Date.parse(String(s));
+ },
+
+
+ asFloat : function(s) {
+ var val = parseFloat(String(s).replace(/,/g, ""));
+ return isNaN(val) ? 0 : val;
+ },
+
+
+ asInt : function(s) {
+ var val = parseInt(String(s).replace(/,/g, ""), 10);
+ return isNaN(val) ? 0 : val;
+ }
+};
+Ext.data.Record = function(data, id){
+
+ this.id = (id || id === 0) ? id : Ext.data.Record.id(this);
+ this.data = data || {};
+};
+
+
+Ext.data.Record.create = function(o){
+ var f = Ext.extend(Ext.data.Record, {});
+ var p = f.prototype;
+ p.fields = new Ext.util.MixedCollection(false, function(field){
+ return field.name;
+ });
+ for(var i = 0, len = o.length; i < len; i++){
+ p.fields.add(new Ext.data.Field(o[i]));
+ }
+ f.getField = function(name){
+ return p.fields.get(name);
+ };
+ return f;
+};
+
+Ext.data.Record.PREFIX = 'ext-record';
+Ext.data.Record.AUTO_ID = 1;
+Ext.data.Record.EDIT = 'edit';
+Ext.data.Record.REJECT = 'reject';
+Ext.data.Record.COMMIT = 'commit';
+
+
+
+Ext.data.Record.id = function(rec) {
+ rec.phantom = true;
+ return [Ext.data.Record.PREFIX, '-', Ext.data.Record.AUTO_ID++].join('');
+};
+
+Ext.data.Record.prototype = {
+
+
+
+
+
+
+ dirty : false,
+ editing : false,
+ error : null,
+
+ modified : null,
+
+ phantom : false,
+
+
+ join : function(store){
+
+ this.store = store;
+ },
+
+
+ set : function(name, value){
+ var encode = Ext.isPrimitive(value) ? String : Ext.encode;
+ if(encode(this.data[name]) == encode(value)) {
+ return;
+ }
+ this.dirty = true;
+ if(!this.modified){
+ this.modified = {};
+ }
+ if(this.modified[name] === undefined){
+ this.modified[name] = this.data[name];
+ }
+ this.data[name] = value;
+ if(!this.editing){
+ this.afterEdit();
+ }
+ },
+
+
+ afterEdit : function(){
+ if (this.store != undefined && typeof this.store.afterEdit == "function") {
+ this.store.afterEdit(this);
+ }
+ },
+
+
+ afterReject : function(){
+ if(this.store){
+ this.store.afterReject(this);
+ }
+ },
+
+
+ afterCommit : function(){
+ if(this.store){
+ this.store.afterCommit(this);
+ }
+ },
+
+
+ get : function(name){
+ return this.data[name];
+ },
+
+
+ beginEdit : function(){
+ this.editing = true;
+ this.modified = this.modified || {};
+ },
+
+
+ cancelEdit : function(){
+ this.editing = false;
+ delete this.modified;
+ },
+
+
+ endEdit : function(){
+ this.editing = false;
+ if(this.dirty){
+ this.afterEdit();
+ }
+ },
+
+
+ reject : function(silent){
+ var m = this.modified;
+ for(var n in m){
+ if(typeof m[n] != "function"){
+ this.data[n] = m[n];
+ }
+ }
+ this.dirty = false;
+ delete this.modified;
+ this.editing = false;
+ if(silent !== true){
+ this.afterReject();
+ }
+ },
+
+
+ commit : function(silent){
+ this.dirty = false;
+ delete this.modified;
+ this.editing = false;
+ if(silent !== true){
+ this.afterCommit();
+ }
+ },
+
+
+ getChanges : function(){
+ var m = this.modified, cs = {};
+ for(var n in m){
+ if(m.hasOwnProperty(n)){
+ cs[n] = this.data[n];
+ }
+ }
+ return cs;
+ },
+
+
+ hasError : function(){
+ return this.error !== null;
+ },
+
+
+ clearError : function(){
+ this.error = null;
+ },
+
+
+ copy : function(newId) {
+ return new this.constructor(Ext.apply({}, this.data), newId || this.id);
+ },
+
+
+ isModified : function(fieldName){
+ return !!(this.modified && this.modified.hasOwnProperty(fieldName));
+ },
+
+
+ isValid : function() {
+ return this.fields.find(function(f) {
+ return (f.allowBlank === false && Ext.isEmpty(this.data[f.name])) ? true : false;
+ },this) ? false : true;
+ },
+
+
+ markDirty : function(){
+ this.dirty = true;
+ if(!this.modified){
+ this.modified = {};
+ }
+ this.fields.each(function(f) {
+ this.modified[f.name] = this.data[f.name];
+ },this);
+ }
+};
+
+Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), {
+
+
+
+ register : function(){
+ for(var i = 0, s; (s = arguments[i]); i++){
+ this.add(s);
+ }
+ },
+
+
+ unregister : function(){
+ for(var i = 0, s; (s = arguments[i]); i++){
+ this.remove(this.lookup(s));
+ }
+ },
+
+
+ lookup : function(id){
+ if(Ext.isArray(id)){
+ var fields = ['field1'], expand = !Ext.isArray(id[0]);
+ if(!expand){
+ for(var i = 2, len = id[0].length; i <= len; ++i){
+ fields.push('field' + i);
+ }
+ }
+ return new Ext.data.ArrayStore({
+ fields: fields,
+ data: id,
+ expandData: expand,
+ autoDestroy: true,
+ autoCreated: true
+
+ });
+ }
+ return Ext.isObject(id) ? (id.events ? id : Ext.create(id, 'store')) : this.get(id);
+ },
+
+
+ getKey : function(o){
+ return o.storeId;
+ }
+});
+Ext.data.Store = Ext.extend(Ext.util.Observable, {
+
+
+
+
+
+
+
+ writer : undefined,
+
+
+
+ remoteSort : false,
+
+
+ autoDestroy : false,
+
+
+ pruneModifiedRecords : false,
+
+
+ lastOptions : null,
+
+
+ autoSave : true,
+
+
+ batch : true,
+
+
+ restful: false,
+
+
+ paramNames : undefined,
+
+
+ defaultParamNames : {
+ start : 'start',
+ limit : 'limit',
+ sort : 'sort',
+ dir : 'dir'
+ },
+
+ isDestroyed: false,
+ hasMultiSort: false,
+
+
+ batchKey : '_ext_batch_',
+
+ constructor : function(config){
+
+
+
+
+ this.data = new Ext.util.MixedCollection(false);
+ this.data.getKey = function(o){
+ return o.id;
+ };
+
+
+
+ this.removed = [];
+
+ if(config && config.data){
+ this.inlineData = config.data;
+ delete config.data;
+ }
+
+ Ext.apply(this, config);
+
+
+ this.baseParams = Ext.isObject(this.baseParams) ? this.baseParams : {};
+
+ this.paramNames = Ext.applyIf(this.paramNames || {}, this.defaultParamNames);
+
+ if((this.url || this.api) && !this.proxy){
+ this.proxy = new Ext.data.HttpProxy({url: this.url, api: this.api});
+ }
+
+ if (this.restful === true && this.proxy) {
+
+
+ this.batch = false;
+ Ext.data.Api.restify(this.proxy);
+ }
+
+ if(this.reader){
+ if(!this.recordType){
+ this.recordType = this.reader.recordType;
+ }
+ if(this.reader.onMetaChange){
+ this.reader.onMetaChange = this.reader.onMetaChange.createSequence(this.onMetaChange, this);
+ }
+ if (this.writer) {
+ if (this.writer instanceof(Ext.data.DataWriter) === false) {
+ this.writer = this.buildWriter(this.writer);
+ }
+ this.writer.meta = this.reader.meta;
+ this.pruneModifiedRecords = true;
+ }
+ }
+
+
+
+ if(this.recordType){
+
+ this.fields = this.recordType.prototype.fields;
+ }
+ this.modified = [];
+
+ this.addEvents(
+
+ 'datachanged',
+
+ 'metachange',
+
+ 'add',
+
+ 'remove',
+
+ 'update',
+
+ 'clear',
+
+ 'exception',
+
+ 'beforeload',
+
+ 'load',
+
+ 'loadexception',
+
+ 'beforewrite',
+
+ 'write',
+
+ 'beforesave',
+
+ 'save'
+
+ );
+
+ if(this.proxy){
+
+ this.relayEvents(this.proxy, ['loadexception', 'exception']);
+ }
+
+ if (this.writer) {
+ this.on({
+ scope: this,
+ add: this.createRecords,
+ remove: this.destroyRecord,
+ update: this.updateRecord,
+ clear: this.onClear
+ });
+ }
+
+ this.sortToggle = {};
+ if(this.sortField){
+ this.setDefaultSort(this.sortField, this.sortDir);
+ }else if(this.sortInfo){
+ this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction);
+ }
+
+ Ext.data.Store.superclass.constructor.call(this);
+
+ if(this.id){
+ this.storeId = this.id;
+ delete this.id;
+ }
+ if(this.storeId){
+ Ext.StoreMgr.register(this);
+ }
+ if(this.inlineData){
+ this.loadData(this.inlineData);
+ delete this.inlineData;
+ }else if(this.autoLoad){
+ this.load.defer(10, this, [
+ typeof this.autoLoad == 'object' ?
+ this.autoLoad : undefined]);
+ }
+
+ this.batchCounter = 0;
+ this.batches = {};
+ },
+
+
+ buildWriter : function(config) {
+ var klass = undefined,
+ type = (config.format || 'json').toLowerCase();
+ switch (type) {
+ case 'json':
+ klass = Ext.data.JsonWriter;
+ break;
+ case 'xml':
+ klass = Ext.data.XmlWriter;
+ break;
+ default:
+ klass = Ext.data.JsonWriter;
+ }
+ return new klass(config);
+ },
+
+
+ destroy : function(){
+ if(!this.isDestroyed){
+ if(this.storeId){
+ Ext.StoreMgr.unregister(this);
+ }
+ this.clearData();
+ this.data = null;
+ Ext.destroy(this.proxy);
+ this.reader = this.writer = null;
+ this.purgeListeners();
+ this.isDestroyed = true;
+ }
+ },
+
+
+ add : function(records) {
+ var i, len, record, index;
+
+ records = [].concat(records);
+ if (records.length < 1) {
+ return;
+ }
+
+ for (i = 0, len = records.length; i < len; i++) {
+ record = records[i];
+
+ record.join(this);
+
+ if (record.dirty || record.phantom) {
+ this.modified.push(record);
+ }
+ }
+
+ index = this.data.length;
+ this.data.addAll(records);
+
+ if (this.snapshot) {
+ this.snapshot.addAll(records);
+ }
+
+ this.fireEvent('add', this, records, index);
+ },
+
+
+ addSorted : function(record){
+ var index = this.findInsertIndex(record);
+ this.insert(index, record);
+ },
+
+
+ doUpdate: function(rec){
+ var id = rec.id;
+
+ this.getById(id).join(null);
+
+ this.data.replace(id, rec);
+ if (this.snapshot) {
+ this.snapshot.replace(id, rec);
+ }
+ rec.join(this);
+ this.fireEvent('update', this, rec, Ext.data.Record.COMMIT);
+ },
+
+
+ remove : function(record){
+ if(Ext.isArray(record)){
+ Ext.each(record, function(r){
+ this.remove(r);
+ }, this);
+ return;
+ }
+ var index = this.data.indexOf(record);
+ if(index > -1){
+ record.join(null);
+ this.data.removeAt(index);
+ }
+ if(this.pruneModifiedRecords){
+ this.modified.remove(record);
+ }
+ if(this.snapshot){
+ this.snapshot.remove(record);
+ }
+ if(index > -1){
+ this.fireEvent('remove', this, record, index);
+ }
+ },
+
+
+ removeAt : function(index){
+ this.remove(this.getAt(index));
+ },
+
+
+ removeAll : function(silent){
+ var items = [];
+ this.each(function(rec){
+ items.push(rec);
+ });
+ this.clearData();
+ if(this.snapshot){
+ this.snapshot.clear();
+ }
+ if(this.pruneModifiedRecords){
+ this.modified = [];
+ }
+ if (silent !== true) {
+ this.fireEvent('clear', this, items);
+ }
+ },
+
+
+ onClear: function(store, records){
+ Ext.each(records, function(rec, index){
+ this.destroyRecord(this, rec, index);
+ }, this);
+ },
+
+
+ insert : function(index, records) {
+ var i, len, record;
+
+ records = [].concat(records);
+ for (i = 0, len = records.length; i < len; i++) {
+ record = records[i];
+
+ this.data.insert(index + i, record);
+ record.join(this);
+
+ if (record.dirty || record.phantom) {
+ this.modified.push(record);
+ }
+ }
+
+ if (this.snapshot) {
+ this.snapshot.addAll(records);
+ }
+
+ this.fireEvent('add', this, records, index);
+ },
+
+
+ indexOf : function(record){
+ return this.data.indexOf(record);
+ },
+
+
+ indexOfId : function(id){
+ return this.data.indexOfKey(id);
+ },
+
+
+ getById : function(id){
+ return (this.snapshot || this.data).key(id);
+ },
+
+
+ getAt : function(index){
+ return this.data.itemAt(index);
+ },
+
+
+ getRange : function(start, end){
+ return this.data.getRange(start, end);
+ },
+
+
+ storeOptions : function(o){
+ o = Ext.apply({}, o);
+ delete o.callback;
+ delete o.scope;
+ this.lastOptions = o;
+ },
+
+
+ clearData: function(){
+ this.data.each(function(rec) {
+ rec.join(null);
+ });
+ this.data.clear();
+ },
+
+
+ load : function(options) {
+ options = Ext.apply({}, options);
+ this.storeOptions(options);
+ if(this.sortInfo && this.remoteSort){
+ var pn = this.paramNames;
+ options.params = Ext.apply({}, options.params);
+ options.params[pn.sort] = this.sortInfo.field;
+ options.params[pn.dir] = this.sortInfo.direction;
+ }
+ try {
+ return this.execute('read', null, options);
+ } catch(e) {
+ this.handleException(e);
+ return false;
+ }
+ },
+
+
+ updateRecord : function(store, record, action) {
+ if (action == Ext.data.Record.EDIT && this.autoSave === true && (!record.phantom || (record.phantom && record.isValid()))) {
+ this.save();
+ }
+ },
+
+
+ createRecords : function(store, records, index) {
+ var modified = this.modified,
+ length = records.length,
+ record, i;
+
+ for (i = 0; i < length; i++) {
+ record = records[i];
+
+ if (record.phantom && record.isValid()) {
+ record.markDirty();
+
+ if (modified.indexOf(record) == -1) {
+ modified.push(record);
+ }
+ }
+ }
+ if (this.autoSave === true) {
+ this.save();
+ }
+ },
+
+
+ destroyRecord : function(store, record, index) {
+ if (this.modified.indexOf(record) != -1) {
+ this.modified.remove(record);
+ }
+ if (!record.phantom) {
+ this.removed.push(record);
+
+
+
+
+ record.lastIndex = index;
+
+ if (this.autoSave === true) {
+ this.save();
+ }
+ }
+ },
+
+
+ execute : function(action, rs, options, batch) {
+
+ if (!Ext.data.Api.isAction(action)) {
+ throw new Ext.data.Api.Error('execute', action);
+ }
+
+ options = Ext.applyIf(options||{}, {
+ params: {}
+ });
+ if(batch !== undefined){
+ this.addToBatch(batch);
+ }
+
+
+ var doRequest = true;
+
+ if (action === 'read') {
+ doRequest = this.fireEvent('beforeload', this, options);
+ Ext.applyIf(options.params, this.baseParams);
+ }
+ else {
+
+
+ if (this.writer.listful === true && this.restful !== true) {
+ rs = (Ext.isArray(rs)) ? rs : [rs];
+ }
+
+ else if (Ext.isArray(rs) && rs.length == 1) {
+ rs = rs.shift();
+ }
+
+ if ((doRequest = this.fireEvent('beforewrite', this, action, rs, options)) !== false) {
+ this.writer.apply(options.params, this.baseParams, action, rs);
+ }
+ }
+ if (doRequest !== false) {
+
+ if (this.writer && this.proxy.url && !this.proxy.restful && !Ext.data.Api.hasUniqueUrl(this.proxy, action)) {
+ options.params.xaction = action;
+ }
+
+
+
+
+
+ this.proxy.request(Ext.data.Api.actions[action], rs, options.params, this.reader, this.createCallback(action, rs, batch), this, options);
+ }
+ return doRequest;
+ },
+
+
+ save : function() {
+ if (!this.writer) {
+ throw new Ext.data.Store.Error('writer-undefined');
+ }
+
+ var queue = [],
+ len,
+ trans,
+ batch,
+ data = {},
+ i;
+
+ if(this.removed.length){
+ queue.push(['destroy', this.removed]);
+ }
+
+
+ var rs = [].concat(this.getModifiedRecords());
+ if(rs.length){
+
+ var phantoms = [];
+ for(i = rs.length-1; i >= 0; i--){
+ if(rs[i].phantom === true){
+ var rec = rs.splice(i, 1).shift();
+ if(rec.isValid()){
+ phantoms.push(rec);
+ }
+ }else if(!rs[i].isValid()){
+ rs.splice(i,1);
+ }
+ }
+
+ if(phantoms.length){
+ queue.push(['create', phantoms]);
+ }
+
+
+ if(rs.length){
+ queue.push(['update', rs]);
+ }
+ }
+ len = queue.length;
+ if(len){
+ batch = ++this.batchCounter;
+ for(i = 0; i < len; ++i){
+ trans = queue[i];
+ data[trans[0]] = trans[1];
+ }
+ if(this.fireEvent('beforesave', this, data) !== false){
+ for(i = 0; i < len; ++i){
+ trans = queue[i];
+ this.doTransaction(trans[0], trans[1], batch);
+ }
+ return batch;
+ }
+ }
+ return -1;
+ },
+
+
+ doTransaction : function(action, rs, batch) {
+ function transaction(records) {
+ try{
+ this.execute(action, records, undefined, batch);
+ }catch (e){
+ this.handleException(e);
+ }
+ }
+ if(this.batch === false){
+ for(var i = 0, len = rs.length; i < len; i++){
+ transaction.call(this, rs[i]);
+ }
+ }else{
+ transaction.call(this, rs);
+ }
+ },
+
+
+ addToBatch : function(batch){
+ var b = this.batches,
+ key = this.batchKey + batch,
+ o = b[key];
+
+ if(!o){
+ b[key] = o = {
+ id: batch,
+ count: 0,
+ data: {}
+ };
+ }
+ ++o.count;
+ },
+
+ removeFromBatch : function(batch, action, data){
+ var b = this.batches,
+ key = this.batchKey + batch,
+ o = b[key],
+ arr;
+
+
+ if(o){
+ arr = o.data[action] || [];
+ o.data[action] = arr.concat(data);
+ if(o.count === 1){
+ data = o.data;
+ delete b[key];
+ this.fireEvent('save', this, batch, data);
+ }else{
+ --o.count;
+ }
+ }
+ },
+
+
+
+ createCallback : function(action, rs, batch) {
+ var actions = Ext.data.Api.actions;
+ return (action == 'read') ? this.loadRecords : function(data, response, success) {
+
+ this['on' + Ext.util.Format.capitalize(action) + 'Records'](success, rs, [].concat(data));
+
+ if (success === true) {
+ this.fireEvent('write', this, action, data, response, rs);
+ }
+ this.removeFromBatch(batch, action, data);
+ };
+ },
+
+
+
+
+ clearModified : function(rs) {
+ if (Ext.isArray(rs)) {
+ for (var n=rs.length-1;n>=0;n--) {
+ this.modified.splice(this.modified.indexOf(rs[n]), 1);
+ }
+ } else {
+ this.modified.splice(this.modified.indexOf(rs), 1);
+ }
+ },
+
+
+ reMap : function(record) {
+ if (Ext.isArray(record)) {
+ for (var i = 0, len = record.length; i < len; i++) {
+ this.reMap(record[i]);
+ }
+ } else {
+ delete this.data.map[record._phid];
+ this.data.map[record.id] = record;
+ var index = this.data.keys.indexOf(record._phid);
+ this.data.keys.splice(index, 1, record.id);
+ delete record._phid;
+ }
+ },
+
+
+ onCreateRecords : function(success, rs, data) {
+ if (success === true) {
+ try {
+ this.reader.realize(rs, data);
+ }
+ catch (e) {
+ this.handleException(e);
+ if (Ext.isArray(rs)) {
+
+ this.onCreateRecords(success, rs, data);
+ }
+ }
+ }
+ },
+
+
+ onUpdateRecords : function(success, rs, data) {
+ if (success === true) {
+ try {
+ this.reader.update(rs, data);
+ } catch (e) {
+ this.handleException(e);
+ if (Ext.isArray(rs)) {
+
+ this.onUpdateRecords(success, rs, data);
+ }
+ }
+ }
+ },
+
+
+ onDestroyRecords : function(success, rs, data) {
+
+ rs = (rs instanceof Ext.data.Record) ? [rs] : [].concat(rs);
+ for (var i=0,len=rs.length;i<len;i++) {
+ this.removed.splice(this.removed.indexOf(rs[i]), 1);
+ }
+ if (success === false) {
+
+
+ for (i=rs.length-1;i>=0;i--) {
+ this.insert(rs[i].lastIndex, rs[i]);
+ }
+ }
+ },
+
+
+ handleException : function(e) {
+
+ Ext.handleError(e);
+ },
+
+
+ reload : function(options){
+ this.load(Ext.applyIf(options||{}, this.lastOptions));
+ },
+
+
+
+ loadRecords : function(o, options, success){
+ var i, len;
+
+ if (this.isDestroyed === true) {
+ return;
+ }
+ if(!o || success === false){
+ if(success !== false){
+ this.fireEvent('load', this, [], options);
+ }
+ if(options.callback){
+ options.callback.call(options.scope || this, [], options, false, o);
+ }
+ return;
+ }
+ var r = o.records, t = o.totalRecords || r.length;
+ if(!options || options.add !== true){
+ if(this.pruneModifiedRecords){
+ this.modified = [];
+ }
+ for(i = 0, len = r.length; i < len; i++){
+ r[i].join(this);
+ }
+ if(this.snapshot){
+ this.data = this.snapshot;
+ delete this.snapshot;
+ }
+ this.clearData();
+ this.data.addAll(r);
+ this.totalLength = t;
+ this.applySort();
+ this.fireEvent('datachanged', this);
+ }else{
+ var toAdd = [],
+ rec,
+ cnt = 0;
+ for(i = 0, len = r.length; i < len; ++i){
+ rec = r[i];
+ if(this.indexOfId(rec.id) > -1){
+ this.doUpdate(rec);
+ }else{
+ toAdd.push(rec);
+ ++cnt;
+ }
+ }
+ this.totalLength = Math.max(t, this.data.length + cnt);
+ this.add(toAdd);
+ }
+ this.fireEvent('load', this, r, options);
+ if(options.callback){
+ options.callback.call(options.scope || this, r, options, true);
+ }
+ },
+
+
+ loadData : function(o, append){
+ var r = this.reader.readRecords(o);
+ this.loadRecords(r, {add: append}, true);
+ },
+
+
+ getCount : function(){
+ return this.data.length || 0;
+ },
+
+
+ getTotalCount : function(){
+ return this.totalLength || 0;
+ },
+
+
+ getSortState : function(){
+ return this.sortInfo;
+ },
+
+
+ applySort : function(){
+ if ((this.sortInfo || this.multiSortInfo) && !this.remoteSort) {
+ this.sortData();
+ }
+ },
+
+
+ sortData : function() {
+ var sortInfo = this.hasMultiSort ? this.multiSortInfo : this.sortInfo,
+ direction = sortInfo.direction || "ASC",
+ sorters = sortInfo.sorters,
+ sortFns = [];
+
+
+ if (!this.hasMultiSort) {
+ sorters = [{direction: direction, field: sortInfo.field}];
+ }
+
+
+ for (var i=0, j = sorters.length; i < j; i++) {
+ sortFns.push(this.createSortFunction(sorters[i].field, sorters[i].direction));
+ }
+
+ if (sortFns.length == 0) {
+ return;
+ }
+
+
+
+ var directionModifier = direction.toUpperCase() == "DESC" ? -1 : 1;
+
+
+ var fn = function(r1, r2) {
+ var result = sortFns[0].call(this, r1, r2);
+
+
+ if (sortFns.length > 1) {
+ for (var i=1, j = sortFns.length; i < j; i++) {
+ result = result || sortFns[i].call(this, r1, r2);
+ }
+ }
+
+ return directionModifier * result;
+ };
+
+
+ this.data.sort(direction, fn);
+ if (this.snapshot && this.snapshot != this.data) {
+ this.snapshot.sort(direction, fn);
+ }
+ },
+
+
+ createSortFunction: function(field, direction) {
+ direction = direction || "ASC";
+ var directionModifier = direction.toUpperCase() == "DESC" ? -1 : 1;
+
+ var sortType = this.fields.get(field).sortType;
+
+
+
+ return function(r1, r2) {
+ var v1 = sortType(r1.data[field]),
+ v2 = sortType(r2.data[field]);
+
+ return directionModifier * (v1 > v2 ? 1 : (v1 < v2 ? -1 : 0));
+ };
+ },
+
+
+ setDefaultSort : function(field, dir) {
+ dir = dir ? dir.toUpperCase() : 'ASC';
+ this.sortInfo = {field: field, direction: dir};
+ this.sortToggle[field] = dir;
+ },
+
+
+ sort : function(fieldName, dir) {
+ if (Ext.isArray(arguments[0])) {
+ return this.multiSort.call(this, fieldName, dir);
+ } else {
+ return this.singleSort(fieldName, dir);
+ }
+ },
+
+
+ singleSort: function(fieldName, dir) {
+ var field = this.fields.get(fieldName);
+ if (!field) {
+ return false;
+ }
+
+ var name = field.name,
+ sortInfo = this.sortInfo || null,
+ sortToggle = this.sortToggle ? this.sortToggle[name] : null;
+
+ if (!dir) {
+ if (sortInfo && sortInfo.field == name) {
+ dir = (this.sortToggle[name] || 'ASC').toggle('ASC', 'DESC');
+ } else {
+ dir = field.sortDir;
+ }
+ }
+
+ this.sortToggle[name] = dir;
+ this.sortInfo = {field: name, direction: dir};
+ this.hasMultiSort = false;
+
+ if (this.remoteSort) {
+ if (!this.load(this.lastOptions)) {
+ if (sortToggle) {
+ this.sortToggle[name] = sortToggle;
+ }
+ if (sortInfo) {
+ this.sortInfo = sortInfo;
+ }
+ }
+ } else {
+ this.applySort();
+ this.fireEvent('datachanged', this);
+ }
+ return true;
+ },
+
+
+ multiSort: function(sorters, direction) {
+ this.hasMultiSort = true;
+ direction = direction || "ASC";
+
+
+ if (this.multiSortInfo && direction == this.multiSortInfo.direction) {
+ direction = direction.toggle("ASC", "DESC");
+ }
+
+
+ this.multiSortInfo = {
+ sorters : sorters,
+ direction: direction
+ };
+
+ if (this.remoteSort) {
+ this.singleSort(sorters[0].field, sorters[0].direction);
+
+ } else {
+ this.applySort();
+ this.fireEvent('datachanged', this);
+ }
+ },
+
+
+ each : function(fn, scope){
+ this.data.each(fn, scope);
+ },
+
+
+ getModifiedRecords : function(){
+ return this.modified;
+ },
+
+
+ sum : function(property, start, end){
+ var rs = this.data.items, v = 0;
+ start = start || 0;
+ end = (end || end === 0) ? end : rs.length-1;
+
+ for(var i = start; i <= end; i++){
+ v += (rs[i].data[property] || 0);
+ }
+ return v;
+ },
+
+
+ createFilterFn : function(property, value, anyMatch, caseSensitive, exactMatch){
+ if(Ext.isEmpty(value, false)){
+ return false;
+ }
+ value = this.data.createValueMatcher(value, anyMatch, caseSensitive, exactMatch);
+ return function(r) {
+ return value.test(r.data[property]);
+ };
+ },
+
+
+ createMultipleFilterFn: function(filters) {
+ return function(record) {
+ var isMatch = true;
+
+ for (var i=0, j = filters.length; i < j; i++) {
+ var filter = filters[i],
+ fn = filter.fn,
+ scope = filter.scope;
+
+ isMatch = isMatch && fn.call(scope, record);
+ }
+
+ return isMatch;
+ };
+ },
+
+
+ filter : function(property, value, anyMatch, caseSensitive, exactMatch){
+ var fn;
+
+ if (Ext.isObject(property)) {
+ property = [property];
+ }
+
+ if (Ext.isArray(property)) {
+ var filters = [];
+
+
+ for (var i=0, j = property.length; i < j; i++) {
+ var filter = property[i],
+ func = filter.fn,
+ scope = filter.scope || this;
+
+
+ if (!Ext.isFunction(func)) {
+ func = this.createFilterFn(filter.property, filter.value, filter.anyMatch, filter.caseSensitive, filter.exactMatch);
+ }
+
+ filters.push({fn: func, scope: scope});
+ }
+
+ fn = this.createMultipleFilterFn(filters);
+ } else {
+
+ fn = this.createFilterFn(property, value, anyMatch, caseSensitive, exactMatch);
+ }
+
+ return fn ? this.filterBy(fn) : this.clearFilter();
+ },
+
+
+ filterBy : function(fn, scope){
+ this.snapshot = this.snapshot || this.data;
+ this.data = this.queryBy(fn, scope || this);
+ this.fireEvent('datachanged', this);
+ },
+
+
+ clearFilter : function(suppressEvent){
+ if(this.isFiltered()){
+ this.data = this.snapshot;
+ delete this.snapshot;
+ if(suppressEvent !== true){
+ this.fireEvent('datachanged', this);
+ }
+ }
+ },
+
+
+ isFiltered : function(){
+ return !!this.snapshot && this.snapshot != this.data;
+ },
+
+
+ query : function(property, value, anyMatch, caseSensitive){
+ var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);
+ return fn ? this.queryBy(fn) : this.data.clone();
+ },
+
+
+ queryBy : function(fn, scope){
+ var data = this.snapshot || this.data;
+ return data.filterBy(fn, scope||this);
+ },
+
+
+ find : function(property, value, start, anyMatch, caseSensitive){
+ var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);
+ return fn ? this.data.findIndexBy(fn, null, start) : -1;
+ },
+
+
+ findExact: function(property, value, start){
+ return this.data.findIndexBy(function(rec){
+ return rec.get(property) === value;
+ }, this, start);
+ },
+
+
+ findBy : function(fn, scope, start){
+ return this.data.findIndexBy(fn, scope, start);
+ },
+
+
+ collect : function(dataIndex, allowNull, bypassFilter){
+ var d = (bypassFilter === true && this.snapshot) ?
+ this.snapshot.items : this.data.items;
+ var v, sv, r = [], l = {};
+ for(var i = 0, len = d.length; i < len; i++){
+ v = d[i].data[dataIndex];
+ sv = String(v);
+ if((allowNull || !Ext.isEmpty(v)) && !l[sv]){
+ l[sv] = true;
+ r[r.length] = v;
+ }
+ }
+ return r;
+ },
+
+
+ afterEdit : function(record){
+ if(this.modified.indexOf(record) == -1){
+ this.modified.push(record);
+ }
+ this.fireEvent('update', this, record, Ext.data.Record.EDIT);
+ },
+
+
+ afterReject : function(record){
+ this.modified.remove(record);
+ this.fireEvent('update', this, record, Ext.data.Record.REJECT);
+ },
+
+
+ afterCommit : function(record){
+ this.modified.remove(record);
+ this.fireEvent('update', this, record, Ext.data.Record.COMMIT);
+ },
+
+
+ commitChanges : function(){
+ var modified = this.modified.slice(0),
+ length = modified.length,
+ i;
+
+ for (i = 0; i < length; i++){
+ modified[i].commit();
+ }
+
+ this.modified = [];
+ this.removed = [];
+ },
+
+
+ rejectChanges : function() {
+ var modified = this.modified.slice(0),
+ removed = this.removed.slice(0).reverse(),
+ mLength = modified.length,
+ rLength = removed.length,
+ i;
+
+ for (i = 0; i < mLength; i++) {
+ modified[i].reject();
+ }
+
+ for (i = 0; i < rLength; i++) {
+ this.insert(removed[i].lastIndex || 0, removed[i]);
+ removed[i].reject();
+ }
+
+ this.modified = [];
+ this.removed = [];
+ },
+
+
+ onMetaChange : function(meta){
+ this.recordType = this.reader.recordType;
+ this.fields = this.recordType.prototype.fields;
+ delete this.snapshot;
+ if(this.reader.meta.sortInfo){
+ this.sortInfo = this.reader.meta.sortInfo;
+ }else if(this.sortInfo && !this.fields.get(this.sortInfo.field)){
+ delete this.sortInfo;
+ }
+ if(this.writer){
+ this.writer.meta = this.reader.meta;
+ }
+ this.modified = [];
+ this.fireEvent('metachange', this, this.reader.meta);
+ },
+
+
+ findInsertIndex : function(record){
+ this.suspendEvents();
+ var data = this.data.clone();
+ this.data.add(record);
+ this.applySort();
+ var index = this.data.indexOf(record);
+ this.data = data;
+ this.resumeEvents();
+ return index;
+ },
+
+
+ setBaseParam : function (name, value){
+ this.baseParams = this.baseParams || {};
+ this.baseParams[name] = value;
+ }
+});
+
+Ext.reg('store', Ext.data.Store);
+
+
+Ext.data.Store.Error = Ext.extend(Ext.Error, {
+ name: 'Ext.data.Store'
+});
+Ext.apply(Ext.data.Store.Error.prototype, {
+ lang: {
+ 'writer-undefined' : 'Attempted to execute a write-action without a DataWriter installed.'
+ }
+});
+
+Ext.data.Field = Ext.extend(Object, {
+
+ constructor : function(config){
+ if(Ext.isString(config)){
+ config = {name: config};
+ }
+ Ext.apply(this, config);
+
+ var types = Ext.data.Types,
+ st = this.sortType,
+ t;
+
+ if(this.type){
+ if(Ext.isString(this.type)){
+ this.type = Ext.data.Types[this.type.toUpperCase()] || types.AUTO;
+ }
+ }else{
+ this.type = types.AUTO;
+ }
+
+
+ if(Ext.isString(st)){
+ this.sortType = Ext.data.SortTypes[st];
+ }else if(Ext.isEmpty(st)){
+ this.sortType = this.type.sortType;
+ }
+
+ if(!this.convert){
+ this.convert = this.type.convert;
+ }
+ },
+
+
+
+
+
+ dateFormat: null,
+
+
+ useNull: false,
+
+
+ defaultValue: "",
+
+ mapping: null,
+
+ sortType : null,
+
+ sortDir : "ASC",
+
+ allowBlank : true
+});
+
+Ext.data.DataReader = function(meta, recordType){
+
+ this.meta = meta;
+
+ this.recordType = Ext.isArray(recordType) ?
+ Ext.data.Record.create(recordType) : recordType;
+
+
+ if (this.recordType){
+ this.buildExtractors();
+ }
+};
+
+Ext.data.DataReader.prototype = {
+
+
+ getTotal: Ext.emptyFn,
+
+ getRoot: Ext.emptyFn,
+
+ getMessage: Ext.emptyFn,
+
+ getSuccess: Ext.emptyFn,
+
+ getId: Ext.emptyFn,
+
+ buildExtractors : Ext.emptyFn,
+
+ extractValues : Ext.emptyFn,
+
+
+ realize: function(rs, data){
+ if (Ext.isArray(rs)) {
+ for (var i = rs.length - 1; i >= 0; i--) {
+
+ if (Ext.isArray(data)) {
+ this.realize(rs.splice(i,1).shift(), data.splice(i,1).shift());
+ }
+ else {
+
+
+ this.realize(rs.splice(i,1).shift(), data);
+ }
+ }
+ }
+ else {
+
+ if (Ext.isArray(data) && data.length == 1) {
+ data = data.shift();
+ }
+ if (!this.isData(data)) {
+
+
+ throw new Ext.data.DataReader.Error('realize', rs);
+ }
+ rs.phantom = false;
+ rs._phid = rs.id;
+ rs.id = this.getId(data);
+ rs.data = data;
+
+ rs.commit();
+ rs.store.reMap(rs);
+ }
+ },
+
+
+ update : function(rs, data) {
+ if (Ext.isArray(rs)) {
+ for (var i=rs.length-1; i >= 0; i--) {
+ if (Ext.isArray(data)) {
+ this.update(rs.splice(i,1).shift(), data.splice(i,1).shift());
+ }
+ else {
+
+
+ this.update(rs.splice(i,1).shift(), data);
+ }
+ }
+ }
+ else {
+
+ if (Ext.isArray(data) && data.length == 1) {
+ data = data.shift();
+ }
+ if (this.isData(data)) {
+ rs.data = Ext.apply(rs.data, data);
+ }
+ rs.commit();
+ }
+ },
+
+
+ extractData : function(root, returnRecords) {
+
+ var rawName = (this instanceof Ext.data.JsonReader) ? 'json' : 'node';
+
+ var rs = [];
+
+
+
+ if (this.isData(root) && !(this instanceof Ext.data.XmlReader)) {
+ root = [root];
+ }
+ var f = this.recordType.prototype.fields,
+ fi = f.items,
+ fl = f.length,
+ rs = [];
+ if (returnRecords === true) {
+ var Record = this.recordType;
+ for (var i = 0; i < root.length; i++) {
+ var n = root[i];
+ var record = new Record(this.extractValues(n, fi, fl), this.getId(n));
+ record[rawName] = n;
+ rs.push(record);
+ }
+ }
+ else {
+ for (var i = 0; i < root.length; i++) {
+ var data = this.extractValues(root[i], fi, fl);
+ data[this.meta.idProperty] = this.getId(root[i]);
+ rs.push(data);
+ }
+ }
+ return rs;
+ },
+
+
+ isData : function(data) {
+ return (data && Ext.isObject(data) && !Ext.isEmpty(this.getId(data))) ? true : false;
+ },
+
+
+ onMetaChange : function(meta){
+ delete this.ef;
+ this.meta = meta;
+ this.recordType = Ext.data.Record.create(meta.fields);
+ this.buildExtractors();
+ }
+};
+
+
+Ext.data.DataReader.Error = Ext.extend(Ext.Error, {
+ constructor : function(message, arg) {
+ this.arg = arg;
+ Ext.Error.call(this, message);
+ },
+ name: 'Ext.data.DataReader'
+});
+Ext.apply(Ext.data.DataReader.Error.prototype, {
+ lang : {
+ 'update': "#update received invalid data from server. Please see docs for DataReader#update and review your DataReader configuration.",
+ 'realize': "#realize was called with invalid remote-data. Please see the docs for DataReader#realize and review your DataReader configuration.",
+ 'invalid-response': "#readResponse received an invalid response from the server."
+ }
+});
+
+Ext.data.DataWriter = function(config){
+ Ext.apply(this, config);
+};
+Ext.data.DataWriter.prototype = {
+
+
+ writeAllFields : false,
+
+ listful : false,
+
+
+ apply : function(params, baseParams, action, rs) {
+ var data = [],
+ renderer = action + 'Record';
+
+ if (Ext.isArray(rs)) {
+ Ext.each(rs, function(rec){
+ data.push(this[renderer](rec));
+ }, this);
+ }
+ else if (rs instanceof Ext.data.Record) {
+ data = this[renderer](rs);
+ }
+ this.render(params, baseParams, data);
+ },
+
+
+ render : Ext.emptyFn,
+
+
+ updateRecord : Ext.emptyFn,
+
+
+ createRecord : Ext.emptyFn,
+
+
+ destroyRecord : Ext.emptyFn,
+
+
+ toHash : function(rec, config) {
+ var map = rec.fields.map,
+ data = {},
+ raw = (this.writeAllFields === false && rec.phantom === false) ? rec.getChanges() : rec.data,
+ m;
+ Ext.iterate(raw, function(prop, value){
+ if((m = map[prop])){
+ data[m.mapping ? m.mapping : m.name] = value;
+ }
+ });
+
+
+
+ if (rec.phantom) {
+ if (rec.fields.containsKey(this.meta.idProperty) && Ext.isEmpty(rec.data[this.meta.idProperty])) {
+ delete data[this.meta.idProperty];
+ }
+ } else {
+ data[this.meta.idProperty] = rec.id;
+ }
+ return data;
+ },
+
+
+ toArray : function(data) {
+ var fields = [];
+ Ext.iterate(data, function(k, v) {fields.push({name: k, value: v});},this);
+ return fields;
+ }
+};
+Ext.data.DataProxy = function(conn){
+
+
+ conn = conn || {};
+
+
+
+
+
+ this.api = conn.api;
+ this.url = conn.url;
+ this.restful = conn.restful;
+ this.listeners = conn.listeners;
+
+
+ this.prettyUrls = conn.prettyUrls;
+
+
+
+ this.addEvents(
+
+ 'exception',
+
+ 'beforeload',
+
+ 'load',
+
+ 'loadexception',
+
+ 'beforewrite',
+
+ 'write'
+ );
+ Ext.data.DataProxy.superclass.constructor.call(this);
+
+
+ try {
+ Ext.data.Api.prepare(this);
+ } catch (e) {
+ if (e instanceof Ext.data.Api.Error) {
+ e.toConsole();
+ }
+ }
+
+ Ext.data.DataProxy.relayEvents(this, ['beforewrite', 'write', 'exception']);
+};
+
+Ext.extend(Ext.data.DataProxy, Ext.util.Observable, {
+
+ restful: false,
+
+
+ setApi : function() {
+ if (arguments.length == 1) {
+ var valid = Ext.data.Api.isValid(arguments[0]);
+ if (valid === true) {
+ this.api = arguments[0];
+ }
+ else {
+ throw new Ext.data.Api.Error('invalid', valid);
+ }
+ }
+ else if (arguments.length == 2) {
+ if (!Ext.data.Api.isAction(arguments[0])) {
+ throw new Ext.data.Api.Error('invalid', arguments[0]);
+ }
+ this.api[arguments[0]] = arguments[1];
+ }
+ Ext.data.Api.prepare(this);
+ },
+
+
+ isApiAction : function(action) {
+ return (this.api[action]) ? true : false;
+ },
+
+
+ request : function(action, rs, params, reader, callback, scope, options) {
+ if (!this.api[action] && !this.load) {
+ throw new Ext.data.DataProxy.Error('action-undefined', action);
+ }
+ params = params || {};
+ if ((action === Ext.data.Api.actions.read) ? this.fireEvent("beforeload", this, params) : this.fireEvent("beforewrite", this, action, rs, params) !== false) {
+ this.doRequest.apply(this, arguments);
+ }
+ else {
+ callback.call(scope || this, null, options, false);
+ }
+ },
+
+
+
+ load : null,
+
+
+ doRequest : function(action, rs, params, reader, callback, scope, options) {
+
+
+
+ this.load(params, reader, callback, scope, options);
+ },
+
+
+ onRead : Ext.emptyFn,
+
+ onWrite : Ext.emptyFn,
+
+ buildUrl : function(action, record) {
+ record = record || null;
+
+
+
+
+ var url = (this.conn && this.conn.url) ? this.conn.url : (this.api[action]) ? this.api[action].url : this.url;
+ if (!url) {
+ throw new Ext.data.Api.Error('invalid-url', action);
+ }
+
+
+
+
+
+
+
+ var provides = null;
+ var m = url.match(/(.*)(\.json|\.xml|\.html)$/);
+ if (m) {
+ provides = m[2];
+ url = m[1];
+ }
+
+ if ((this.restful === true || this.prettyUrls === true) && record instanceof Ext.data.Record && !record.phantom) {
+ url += '/' + record.id;
+ }
+ return (provides === null) ? url : url + provides;
+ },
+
+
+ destroy: function(){
+ this.purgeListeners();
+ }
+});
+
+
+
+Ext.apply(Ext.data.DataProxy, Ext.util.Observable.prototype);
+Ext.util.Observable.call(Ext.data.DataProxy);
+
+
+Ext.data.DataProxy.Error = Ext.extend(Ext.Error, {
+ constructor : function(message, arg) {
+ this.arg = arg;
+ Ext.Error.call(this, message);
+ },
+ name: 'Ext.data.DataProxy'
+});
+Ext.apply(Ext.data.DataProxy.Error.prototype, {
+ lang: {
+ 'action-undefined': "DataProxy attempted to execute an API-action but found an undefined url / function. Please review your Proxy url/api-configuration.",
+ 'api-invalid': 'Recieved an invalid API-configuration. Please ensure your proxy API-configuration contains only the actions from Ext.data.Api.actions.'
+ }
+});
+
+
+
+Ext.data.Request = function(params) {
+ Ext.apply(this, params);
+};
+Ext.data.Request.prototype = {
+
+ action : undefined,
+
+ rs : undefined,
+
+ params: undefined,
+
+ callback : Ext.emptyFn,
+
+ scope : undefined,
+
+ reader : undefined
+};
+
+Ext.data.Response = function(params) {
+ Ext.apply(this, params);
+};
+Ext.data.Response.prototype = {
+
+ action: undefined,
+
+ success : undefined,
+
+ message : undefined,
+
+ data: undefined,
+
+ raw: undefined,
+
+ records: undefined
+};
+
+Ext.data.ScriptTagProxy = function(config){
+ Ext.apply(this, config);
+
+ Ext.data.ScriptTagProxy.superclass.constructor.call(this, config);
+
+ this.head = document.getElementsByTagName("head")[0];
+
+
+};
+
+Ext.data.ScriptTagProxy.TRANS_ID = 1000;
+
+Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, {
+
+
+ timeout : 30000,
+
+ callbackParam : "callback",
+
+ nocache : true,
+
+
+ doRequest : function(action, rs, params, reader, callback, scope, arg) {
+ var p = Ext.urlEncode(Ext.apply(params, this.extraParams));
+
+ var url = this.buildUrl(action, rs);
+ if (!url) {
+ throw new Ext.data.Api.Error('invalid-url', url);
+ }
+ url = Ext.urlAppend(url, p);
+
+ if(this.nocache){
+ url = Ext.urlAppend(url, '_dc=' + (new Date().getTime()));
+ }
+ var transId = ++Ext.data.ScriptTagProxy.TRANS_ID;
+ var trans = {
+ id : transId,
+ action: action,
+ cb : "stcCallback"+transId,
+ scriptId : "stcScript"+transId,
+ params : params,
+ arg : arg,
+ url : url,
+ callback : callback,
+ scope : scope,
+ reader : reader
+ };
+ window[trans.cb] = this.createCallback(action, rs, trans);
+ url += String.format("&{0}={1}", this.callbackParam, trans.cb);
+ if(this.autoAbort !== false){
+ this.abort();
+ }
+
+ trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]);
+
+ var script = document.createElement("script");
+ script.setAttribute("src", url);
+ script.setAttribute("type", "text/javascript");
+ script.setAttribute("id", trans.scriptId);
+ this.head.appendChild(script);
+
+ this.trans = trans;
+ },
+
+
+ createCallback : function(action, rs, trans) {
+ var self = this;
+ return function(res) {
+ self.trans = false;
+ self.destroyTrans(trans, true);
+ if (action === Ext.data.Api.actions.read) {
+ self.onRead.call(self, action, trans, res);
+ } else {
+ self.onWrite.call(self, action, trans, res, rs);
+ }
+ };
+ },
+
+ onRead : function(action, trans, res) {
+ var result;
+ try {
+ result = trans.reader.readRecords(res);
+ }catch(e){
+
+ this.fireEvent("loadexception", this, trans, res, e);
+
+ this.fireEvent('exception', this, 'response', action, trans, res, e);
+ trans.callback.call(trans.scope||window, null, trans.arg, false);
+ return;
+ }
+ if (result.success === false) {
+
+ this.fireEvent('loadexception', this, trans, res);
+
+ this.fireEvent('exception', this, 'remote', action, trans, res, null);
+ } else {
+ this.fireEvent("load", this, res, trans.arg);
+ }
+ trans.callback.call(trans.scope||window, result, trans.arg, result.success);
+ },
+
+ onWrite : function(action, trans, response, rs) {
+ var reader = trans.reader;
+ try {
+
+ var res = reader.readResponse(action, response);
+ } catch (e) {
+ this.fireEvent('exception', this, 'response', action, trans, res, e);
+ trans.callback.call(trans.scope||window, null, res, false);
+ return;
+ }
+ if(!res.success === true){
+ this.fireEvent('exception', this, 'remote', action, trans, res, rs);
+ trans.callback.call(trans.scope||window, null, res, false);
+ return;
+ }
+ this.fireEvent("write", this, action, res.data, res, rs, trans.arg );
+ trans.callback.call(trans.scope||window, res.data, res, true);
+ },
+
+
+ isLoading : function(){
+ return this.trans ? true : false;
+ },
+
+
+ abort : function(){
+ if(this.isLoading()){
+ this.destroyTrans(this.trans);
+ }
+ },
+
+
+ destroyTrans : function(trans, isLoaded){
+ this.head.removeChild(document.getElementById(trans.scriptId));
+ clearTimeout(trans.timeoutId);
+ if(isLoaded){
+ window[trans.cb] = undefined;
+ try{
+ delete window[trans.cb];
+ }catch(e){}
+ }else{
+
+ window[trans.cb] = function(){
+ window[trans.cb] = undefined;
+ try{
+ delete window[trans.cb];
+ }catch(e){}
+ };
+ }
+ },
+
+
+ handleFailure : function(trans){
+ this.trans = false;
+ this.destroyTrans(trans, false);
+ if (trans.action === Ext.data.Api.actions.read) {
+
+ this.fireEvent("loadexception", this, null, trans.arg);
+ }
+
+ this.fireEvent('exception', this, 'response', trans.action, {
+ response: null,
+ options: trans.arg
+ });
+ trans.callback.call(trans.scope||window, null, trans.arg, false);
+ },
+
+
+ destroy: function(){
+ this.abort();
+ Ext.data.ScriptTagProxy.superclass.destroy.call(this);
+ }
+});
+Ext.data.HttpProxy = function(conn){
+ Ext.data.HttpProxy.superclass.constructor.call(this, conn);
+
+
+ this.conn = conn;
+
+
+
+
+
+ this.conn.url = null;
+
+ this.useAjax = !conn || !conn.events;
+
+
+ var actions = Ext.data.Api.actions;
+ this.activeRequest = {};
+ for (var verb in actions) {
+ this.activeRequest[actions[verb]] = undefined;
+ }
+};
+
+Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {
+
+ getConnection : function() {
+ return this.useAjax ? Ext.Ajax : this.conn;
+ },
+
+
+ setUrl : function(url, makePermanent) {
+ this.conn.url = url;
+ if (makePermanent === true) {
+ this.url = url;
+ this.api = null;
+ Ext.data.Api.prepare(this);
+ }
+ },
+
+
+ doRequest : function(action, rs, params, reader, cb, scope, arg) {
+ var o = {
+ method: (this.api[action]) ? this.api[action]['method'] : undefined,
+ request: {
+ callback : cb,
+ scope : scope,
+ arg : arg
+ },
+ reader: reader,
+ callback : this.createCallback(action, rs),
+ scope: this
+ };
+
+
+
+ if (params.jsonData) {
+ o.jsonData = params.jsonData;
+ } else if (params.xmlData) {
+ o.xmlData = params.xmlData;
+ } else {
+ o.params = params || {};
+ }
+
+
+
+ this.conn.url = this.buildUrl(action, rs);
+
+ if(this.useAjax){
+
+ Ext.applyIf(o, this.conn);
+
+
+ if (action == Ext.data.Api.actions.read && this.activeRequest[action]) {
+ Ext.Ajax.abort(this.activeRequest[action]);
+ }
+ this.activeRequest[action] = Ext.Ajax.request(o);
+ }else{
+ this.conn.request(o);
+ }
+
+ this.conn.url = null;
+ },
+
+
+ createCallback : function(action, rs) {
+ return function(o, success, response) {
+ this.activeRequest[action] = undefined;
+ if (!success) {
+ if (action === Ext.data.Api.actions.read) {
+
+
+ this.fireEvent('loadexception', this, o, response);
+ }
+ this.fireEvent('exception', this, 'response', action, o, response);
+ o.request.callback.call(o.request.scope, null, o.request.arg, false);
+ return;
+ }
+ if (action === Ext.data.Api.actions.read) {
+ this.onRead(action, o, response);
+ } else {
+ this.onWrite(action, o, response, rs);
+ }
+ };
+ },
+
+
+ onRead : function(action, o, response) {
+ var result;
+ try {
+ result = o.reader.read(response);
+ }catch(e){
+
+
+ this.fireEvent('loadexception', this, o, response, e);
+
+ this.fireEvent('exception', this, 'response', action, o, response, e);
+ o.request.callback.call(o.request.scope, null, o.request.arg, false);
+ return;
+ }
+ if (result.success === false) {
+
+
+ this.fireEvent('loadexception', this, o, response);
+
+
+ var res = o.reader.readResponse(action, response);
+ this.fireEvent('exception', this, 'remote', action, o, res, null);
+ }
+ else {
+ this.fireEvent('load', this, o, o.request.arg);
+ }
+
+
+
+ o.request.callback.call(o.request.scope, result, o.request.arg, result.success);
+ },
+
+ onWrite : function(action, o, response, rs) {
+ var reader = o.reader;
+ var res;
+ try {
+ res = reader.readResponse(action, response);
+ } catch (e) {
+ this.fireEvent('exception', this, 'response', action, o, response, e);
+ o.request.callback.call(o.request.scope, null, o.request.arg, false);
+ return;
+ }
+ if (res.success === true) {
+ this.fireEvent('write', this, action, res.data, res, rs, o.request.arg);
+ } else {
+ this.fireEvent('exception', this, 'remote', action, o, res, rs);
+ }
+
+
+
+ o.request.callback.call(o.request.scope, res.data, res, res.success);
+ },
+
+
+ destroy: function(){
+ if(!this.useAjax){
+ this.conn.abort();
+ }else if(this.activeRequest){
+ var actions = Ext.data.Api.actions;
+ for (var verb in actions) {
+ if(this.activeRequest[actions[verb]]){
+ Ext.Ajax.abort(this.activeRequest[actions[verb]]);
+ }
+ }
+ }
+ Ext.data.HttpProxy.superclass.destroy.call(this);
+ }
+});
+Ext.data.MemoryProxy = function(data){
+
+ var api = {};
+ api[Ext.data.Api.actions.read] = true;
+ Ext.data.MemoryProxy.superclass.constructor.call(this, {
+ api: api
+ });
+ this.data = data;
+};
+
+Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {
+
+
+
+ doRequest : function(action, rs, params, reader, callback, scope, arg) {
+
+ params = params || {};
+ var result;
+ try {
+ result = reader.readRecords(this.data);
+ }catch(e){
+
+ this.fireEvent("loadexception", this, null, arg, e);
+
+ this.fireEvent('exception', this, 'response', action, arg, null, e);
+ callback.call(scope, null, arg, false);
+ return;
+ }
+ callback.call(scope, result, arg, true);
+ }
+});
+Ext.data.Types = new function(){
+ var st = Ext.data.SortTypes;
+ Ext.apply(this, {
+
+ stripRe: /[\$,%]/g,
+
+
+ AUTO: {
+ convert: function(v){ return v; },
+ sortType: st.none,
+ type: 'auto'
+ },
+
+
+ STRING: {
+ convert: function(v){ return (v === undefined || v === null) ? '' : String(v); },
+ sortType: st.asUCString,
+ type: 'string'
+ },
+
+
+ INT: {
+ convert: function(v){
+ return v !== undefined && v !== null && v !== '' ?
+ parseInt(String(v).replace(Ext.data.Types.stripRe, ''), 10) : (this.useNull ? null : 0);
+ },
+ sortType: st.none,
+ type: 'int'
+ },
+
+
+ FLOAT: {
+ convert: function(v){
+ return v !== undefined && v !== null && v !== '' ?
+ parseFloat(String(v).replace(Ext.data.Types.stripRe, ''), 10) : (this.useNull ? null : 0);
+ },
+ sortType: st.none,
+ type: 'float'
+ },
+
+
+ BOOL: {
+ convert: function(v){ return v === true || v === 'true' || v == 1; },
+ sortType: st.none,
+ type: 'bool'
+ },
+
+
+ DATE: {
+ convert: function(v){
+ var df = this.dateFormat;
+ if(!v){
+ return null;
+ }
+ if(Ext.isDate(v)){
+ return v;
+ }
+ if(df){
+ if(df == 'timestamp'){
+ return new Date(v*1000);
+ }
+ if(df == 'time'){
+ return new Date(parseInt(v, 10));
+ }
+ return Date.parseDate(v, df);
+ }
+ var parsed = Date.parse(v);
+ return parsed ? new Date(parsed) : null;
+ },
+ sortType: st.asDate,
+ type: 'date'
+ }
+ });
+
+ Ext.apply(this, {
+
+ BOOLEAN: this.BOOL,
+
+ INTEGER: this.INT,
+
+ NUMBER: this.FLOAT
+ });
+};
+Ext.data.JsonWriter = Ext.extend(Ext.data.DataWriter, {
+
+ encode : true,
+
+ encodeDelete: false,
+
+ constructor : function(config){
+ Ext.data.JsonWriter.superclass.constructor.call(this, config);
+ },
+
+
+ render : function(params, baseParams, data) {
+ if (this.encode === true) {
+
+ Ext.apply(params, baseParams);
+ params[this.meta.root] = Ext.encode(data);
+ } else {
+
+ var jdata = Ext.apply({}, baseParams);
+ jdata[this.meta.root] = data;
+ params.jsonData = jdata;
+ }
+ },
+
+ createRecord : function(rec) {
+ return this.toHash(rec);
+ },
+
+ updateRecord : function(rec) {
+ return this.toHash(rec);
+
+ },
+
+ destroyRecord : function(rec){
+ if(this.encodeDelete){
+ var data = {};
+ data[this.meta.idProperty] = rec.id;
+ return data;
+ }else{
+ return rec.id;
+ }
+ }
+});
+Ext.data.JsonReader = function(meta, recordType){
+ meta = meta || {};
+
+
+
+
+ Ext.applyIf(meta, {
+ idProperty: 'id',
+ successProperty: 'success',
+ totalProperty: 'total'
+ });
+
+ Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType || meta.fields);
+};
+Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, {
+
+
+ read : function(response){
+ var json = response.responseText;
+ var o = Ext.decode(json);
+ if(!o) {
+ throw {message: 'JsonReader.read: Json object not found'};
+ }
+ return this.readRecords(o);
+ },
+
+
+
+ readResponse : function(action, response) {
+ var o = (response.responseText !== undefined) ? Ext.decode(response.responseText) : response;
+ if(!o) {
+ throw new Ext.data.JsonReader.Error('response');
+ }
+
+ var root = this.getRoot(o),
+ success = this.getSuccess(o);
+ if (success && action === Ext.data.Api.actions.create) {
+ var def = Ext.isDefined(root);
+ if (def && Ext.isEmpty(root)) {
+ throw new Ext.data.JsonReader.Error('root-empty', this.meta.root);
+ }
+ else if (!def) {
+ throw new Ext.data.JsonReader.Error('root-undefined-response', this.meta.root);
+ }
+ }
+
+
+ var res = new Ext.data.Response({
+ action: action,
+ success: success,
+ data: (root) ? this.extractData(root, false) : [],
+ message: this.getMessage(o),
+ raw: o
+ });
+
+
+ if (Ext.isEmpty(res.success)) {
+ throw new Ext.data.JsonReader.Error('successProperty-response', this.meta.successProperty);
+ }
+ return res;
+ },
+
+
+ readRecords : function(o){
+
+ this.jsonData = o;
+ if(o.metaData){
+ this.onMetaChange(o.metaData);
+ }
+ var s = this.meta, Record = this.recordType,
+ f = Record.prototype.fields, fi = f.items, fl = f.length, v;
+
+ var root = this.getRoot(o), c = root.length, totalRecords = c, success = true;
+ if(s.totalProperty){
+ v = parseInt(this.getTotal(o), 10);
+ if(!isNaN(v)){
+ totalRecords = v;
+ }
+ }
+ if(s.successProperty){
+ v = this.getSuccess(o);
+ if(v === false || v === 'false'){
+ success = false;
+ }
+ }
+
+
+ return {
+ success : success,
+ records : this.extractData(root, true),
+ totalRecords : totalRecords
+ };
+ },
+
+
+ buildExtractors : function() {
+ if(this.ef){
+ return;
+ }
+ var s = this.meta, Record = this.recordType,
+ f = Record.prototype.fields, fi = f.items, fl = f.length;
+
+ if(s.totalProperty) {
+ this.getTotal = this.createAccessor(s.totalProperty);
+ }
+ if(s.successProperty) {
+ this.getSuccess = this.createAccessor(s.successProperty);
+ }
+ if (s.messageProperty) {
+ this.getMessage = this.createAccessor(s.messageProperty);
+ }
+ this.getRoot = s.root ? this.createAccessor(s.root) : function(p){return p;};
+ if (s.id || s.idProperty) {
+ var g = this.createAccessor(s.id || s.idProperty);
+ this.getId = function(rec) {
+ var r = g(rec);
+ return (r === undefined || r === '') ? null : r;
+ };
+ } else {
+ this.getId = function(){return null;};
+ }
+ var ef = [];
+ for(var i = 0; i < fl; i++){
+ f = fi[i];
+ var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;
+ ef.push(this.createAccessor(map));
+ }
+ this.ef = ef;
+ },
+
+
+ simpleAccess : function(obj, subsc) {
+ return obj[subsc];
+ },
+
+
+ createAccessor : function(){
+ var re = /[\[\.]/;
+ return function(expr) {
+ if(Ext.isEmpty(expr)){
+ return Ext.emptyFn;
+ }
+ if(Ext.isFunction(expr)){
+ return expr;
+ }
+ var i = String(expr).search(re);
+ if(i >= 0){
+ return new Function('obj', 'return obj' + (i > 0 ? '.' : '') + expr);
+ }
+ return function(obj){
+ return obj[expr];
+ };
+
+ };
+ }(),
+
+
+ extractValues : function(data, items, len) {
+ var f, values = {};
+ for(var j = 0; j < len; j++){
+ f = items[j];
+ var v = this.ef[j](data);
+ values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue, data);
+ }
+ return values;
+ }
+});
+
+
+Ext.data.JsonReader.Error = Ext.extend(Ext.Error, {
+ constructor : function(message, arg) {
+ this.arg = arg;
+ Ext.Error.call(this, message);
+ },
+ name : 'Ext.data.JsonReader'
+});
+Ext.apply(Ext.data.JsonReader.Error.prototype, {
+ lang: {
+ 'response': 'An error occurred while json-decoding your server response',
+ 'successProperty-response': 'Could not locate your "successProperty" in your server response. Please review your JsonReader config to ensure the config-property "successProperty" matches the property in your server-response. See the JsonReader docs.',
+ 'root-undefined-config': 'Your JsonReader was configured without a "root" property. Please review your JsonReader config and make sure to define the root property. See the JsonReader docs.',
+ 'idProperty-undefined' : 'Your JsonReader was configured without an "idProperty" Please review your JsonReader configuration and ensure the "idProperty" is set (e.g.: "id"). See the JsonReader docs.',
+ 'root-empty': 'Data was expected to be returned by the server in the "root" property of the response. Please review your JsonReader configuration to ensure the "root" property matches that returned in the server-response. See JsonReader docs.'
+ }
+});
+
+Ext.data.ArrayReader = Ext.extend(Ext.data.JsonReader, {
+
+
+
+
+ readRecords : function(o){
+ this.arrayData = o;
+ var s = this.meta,
+ sid = s ? Ext.num(s.idIndex, s.id) : null,
+ recordType = this.recordType,
+ fields = recordType.prototype.fields,
+ records = [],
+ success = true,
+ v;
+
+ var root = this.getRoot(o);
+
+ for(var i = 0, len = root.length; i < len; i++) {
+ var n = root[i],
+ values = {},
+ id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
+ for(var j = 0, jlen = fields.length; j < jlen; j++) {
+ var f = fields.items[j],
+ k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j;
+ v = n[k] !== undefined ? n[k] : f.defaultValue;
+ v = f.convert(v, n);
+ values[f.name] = v;
+ }
+ var record = new recordType(values, id);
+ record.json = n;
+ records[records.length] = record;
+ }
+
+ var totalRecords = records.length;
+
+ if(s.totalProperty) {
+ v = parseInt(this.getTotal(o), 10);
+ if(!isNaN(v)) {
+ totalRecords = v;
+ }
+ }
+ if(s.successProperty){
+ v = this.getSuccess(o);
+ if(v === false || v === 'false'){
+ success = false;
+ }
+ }
+
+ return {
+ success : success,
+ records : records,
+ totalRecords : totalRecords
+ };
+ }
+});
+Ext.data.ArrayStore = Ext.extend(Ext.data.Store, {
+
+ constructor: function(config){
+ Ext.data.ArrayStore.superclass.constructor.call(this, Ext.apply(config, {
+ reader: new Ext.data.ArrayReader(config)
+ }));
+ },
+
+ loadData : function(data, append){
+ if(this.expandData === true){
+ var r = [];
+ for(var i = 0, len = data.length; i < len; i++){
+ r[r.length] = [data[i]];
+ }
+ data = r;
+ }
+ Ext.data.ArrayStore.superclass.loadData.call(this, data, append);
+ }
+});
+Ext.reg('arraystore', Ext.data.ArrayStore);
+
+
+Ext.data.SimpleStore = Ext.data.ArrayStore;
+Ext.reg('simplestore', Ext.data.SimpleStore);
+Ext.data.JsonStore = Ext.extend(Ext.data.Store, {
+
+ constructor: function(config){
+ Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(config, {
+ reader: new Ext.data.JsonReader(config)
+ }));
+ }
+});
+Ext.reg('jsonstore', Ext.data.JsonStore);
+Ext.data.XmlWriter = function(params) {
+ Ext.data.XmlWriter.superclass.constructor.apply(this, arguments);
+
+ this.tpl = (typeof(this.tpl) === 'string') ? new Ext.XTemplate(this.tpl).compile() : this.tpl.compile();
+};
+Ext.extend(Ext.data.XmlWriter, Ext.data.DataWriter, {
+
+ documentRoot: 'xrequest',
+
+ forceDocumentRoot: false,
+
+ root: 'records',
+
+ xmlVersion : '1.0',
+
+ xmlEncoding: 'ISO-8859-15',
+
+
+ tpl: '<tpl for="."><\u003fxml version="{version}" encoding="{encoding}"\u003f><tpl if="documentRoot"><{documentRoot}><tpl for="baseParams"><tpl for="."><{name}>{value}</{name}></tpl></tpl></tpl><tpl if="records.length&gt;1"><{root}></tpl><tpl for="records"><{parent.record}><tpl for="."><{name}>{value}</{name}></tpl></{parent.record}></tpl><tpl if="records.length&gt;1"></{root}></tpl><tpl if="documentRoot"></{documentRoot}></tpl></tpl>',
+
+
+
+ render : function(params, baseParams, data) {
+ baseParams = this.toArray(baseParams);
+ params.xmlData = this.tpl.applyTemplate({
+ version: this.xmlVersion,
+ encoding: this.xmlEncoding,
+ documentRoot: (baseParams.length > 0 || this.forceDocumentRoot === true) ? this.documentRoot : false,
+ record: this.meta.record,
+ root: this.root,
+ baseParams: baseParams,
+ records: (Ext.isArray(data[0])) ? data : [data]
+ });
+ },
+
+
+ createRecord : function(rec) {
+ return this.toArray(this.toHash(rec));
+ },
+
+
+ updateRecord : function(rec) {
+ return this.toArray(this.toHash(rec));
+
+ },
+
+ destroyRecord : function(rec) {
+ var data = {};
+ data[this.meta.idProperty] = rec.id;
+ return this.toArray(data);
+ }
+});
+
+Ext.data.XmlReader = function(meta, recordType){
+ meta = meta || {};
+
+
+ Ext.applyIf(meta, {
+ idProperty: meta.idProperty || meta.idPath || meta.id,
+ successProperty: meta.successProperty || meta.success
+ });
+
+ Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType || meta.fields);
+};
+Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, {
+
+ read : function(response){
+ var doc = response.responseXML;
+ if(!doc) {
+ throw {message: "XmlReader.read: XML Document not available"};
+ }
+ return this.readRecords(doc);
+ },
+
+
+ readRecords : function(doc){
+
+ this.xmlData = doc;
+
+ var root = doc.documentElement || doc,
+ q = Ext.DomQuery,
+ totalRecords = 0,
+ success = true;
+
+ if(this.meta.totalProperty){
+ totalRecords = this.getTotal(root, 0);
+ }
+ if(this.meta.successProperty){
+ success = this.getSuccess(root);
+ }
+
+ var records = this.extractData(q.select(this.meta.record, root), true);
+
+
+ return {
+ success : success,
+ records : records,
+ totalRecords : totalRecords || records.length
+ };
+ },
+
+
+ readResponse : function(action, response) {
+ var q = Ext.DomQuery,
+ doc = response.responseXML,
+ root = doc.documentElement || doc;
+
+
+ var res = new Ext.data.Response({
+ action: action,
+ success : this.getSuccess(root),
+ message: this.getMessage(root),
+ data: this.extractData(q.select(this.meta.record, root) || q.select(this.meta.root, root), false),
+ raw: doc
+ });
+
+ if (Ext.isEmpty(res.success)) {
+ throw new Ext.data.DataReader.Error('successProperty-response', this.meta.successProperty);
+ }
+
+
+ if (action === Ext.data.Api.actions.create) {
+ var def = Ext.isDefined(res.data);
+ if (def && Ext.isEmpty(res.data)) {
+ throw new Ext.data.JsonReader.Error('root-empty', this.meta.root);
+ }
+ else if (!def) {
+ throw new Ext.data.JsonReader.Error('root-undefined-response', this.meta.root);
+ }
+ }
+ return res;
+ },
+
+ getSuccess : function() {
+ return true;
+ },
+
+
+ buildExtractors : function() {
+ if(this.ef){
+ return;
+ }
+ var s = this.meta,
+ Record = this.recordType,
+ f = Record.prototype.fields,
+ fi = f.items,
+ fl = f.length;
+
+ if(s.totalProperty) {
+ this.getTotal = this.createAccessor(s.totalProperty);
+ }
+ if(s.successProperty) {
+ this.getSuccess = this.createAccessor(s.successProperty);
+ }
+ if (s.messageProperty) {
+ this.getMessage = this.createAccessor(s.messageProperty);
+ }
+ this.getRoot = function(res) {
+ return (!Ext.isEmpty(res[this.meta.record])) ? res[this.meta.record] : res[this.meta.root];
+ };
+ if (s.idPath || s.idProperty) {
+ var g = this.createAccessor(s.idPath || s.idProperty);
+ this.getId = function(rec) {
+ var id = g(rec) || rec.id;
+ return (id === undefined || id === '') ? null : id;
+ };
+ } else {
+ this.getId = function(){return null;};
+ }
+ var ef = [];
+ for(var i = 0; i < fl; i++){
+ f = fi[i];
+ var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;
+ ef.push(this.createAccessor(map));
+ }
+ this.ef = ef;
+ },
+
+
+ createAccessor : function(){
+ var q = Ext.DomQuery;
+ return function(key) {
+ if (Ext.isFunction(key)) {
+ return key;
+ }
+ switch(key) {
+ case this.meta.totalProperty:
+ return function(root, def){
+ return q.selectNumber(key, root, def);
+ };
+ break;
+ case this.meta.successProperty:
+ return function(root, def) {
+ var sv = q.selectValue(key, root, true);
+ var success = sv !== false && sv !== 'false';
+ return success;
+ };
+ break;
+ default:
+ return function(root, def) {
+ return q.selectValue(key, root, def);
+ };
+ break;
+ }
+ };
+ }(),
+
+
+ extractValues : function(data, items, len) {
+ var f, values = {};
+ for(var j = 0; j < len; j++){
+ f = items[j];
+ var v = this.ef[j](data);
+ values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue, data);
+ }
+ return values;
+ }
+});
+Ext.data.XmlStore = Ext.extend(Ext.data.Store, {
+
+ constructor: function(config){
+ Ext.data.XmlStore.superclass.constructor.call(this, Ext.apply(config, {
+ reader: new Ext.data.XmlReader(config)
+ }));
+ }
+});
+Ext.reg('xmlstore', Ext.data.XmlStore);
+Ext.data.GroupingStore = Ext.extend(Ext.data.Store, {
+
+
+ constructor: function(config) {
+ config = config || {};
+
+
+
+
+
+ this.hasMultiSort = true;
+ this.multiSortInfo = this.multiSortInfo || {sorters: []};
+
+ var sorters = this.multiSortInfo.sorters,
+ groupField = config.groupField || this.groupField,
+ sortInfo = config.sortInfo || this.sortInfo,
+ groupDir = config.groupDir || this.groupDir;
+
+
+ if(groupField){
+ sorters.push({
+ field : groupField,
+ direction: groupDir
+ });
+ }
+
+
+ if (sortInfo) {
+ sorters.push(sortInfo);
+ }
+
+ Ext.data.GroupingStore.superclass.constructor.call(this, config);
+
+ this.addEvents(
+
+ 'groupchange'
+ );
+
+ this.applyGroupField();
+ },
+
+
+
+ remoteGroup : false,
+
+ groupOnSort:false,
+
+
+ groupDir : 'ASC',
+
+
+ clearGrouping : function(){
+ this.groupField = false;
+
+ if(this.remoteGroup){
+ if(this.baseParams){
+ delete this.baseParams.groupBy;
+ delete this.baseParams.groupDir;
+ }
+ var lo = this.lastOptions;
+ if(lo && lo.params){
+ delete lo.params.groupBy;
+ delete lo.params.groupDir;
+ }
+
+ this.reload();
+ }else{
+ this.sort();
+ this.fireEvent('datachanged', this);
+ }
+ },
+
+
+ groupBy : function(field, forceRegroup, direction) {
+ direction = direction ? (String(direction).toUpperCase() == 'DESC' ? 'DESC' : 'ASC') : this.groupDir;
+
+ if (this.groupField == field && this.groupDir == direction && !forceRegroup) {
+ return;
+ }
+
+
+
+ var sorters = this.multiSortInfo.sorters;
+ if (sorters.length > 0 && sorters[0].field == this.groupField) {
+ sorters.shift();
+ }
+
+ this.groupField = field;
+ this.groupDir = direction;
+ this.applyGroupField();
+
+ var fireGroupEvent = function() {
+ this.fireEvent('groupchange', this, this.getGroupState());
+ };
+
+ if (this.groupOnSort) {
+ this.sort(field, direction);
+ fireGroupEvent.call(this);
+ return;
+ }
+
+ if (this.remoteGroup) {
+ this.on('load', fireGroupEvent, this, {single: true});
+ this.reload();
+ } else {
+ this.sort(sorters);
+ fireGroupEvent.call(this);
+ }
+ },
+
+
+
+ sort : function(fieldName, dir) {
+ if (this.remoteSort) {
+ return Ext.data.GroupingStore.superclass.sort.call(this, fieldName, dir);
+ }
+
+ var sorters = [];
+
+
+ if (Ext.isArray(arguments[0])) {
+ sorters = arguments[0];
+ } else if (fieldName == undefined) {
+
+
+ sorters = this.sortInfo ? [this.sortInfo] : [];
+ } else {
+
+
+ var field = this.fields.get(fieldName);
+ if (!field) return false;
+
+ var name = field.name,
+ sortInfo = this.sortInfo || null,
+ sortToggle = this.sortToggle ? this.sortToggle[name] : null;
+
+ if (!dir) {
+ if (sortInfo && sortInfo.field == name) {
+ dir = (this.sortToggle[name] || 'ASC').toggle('ASC', 'DESC');
+ } else {
+ dir = field.sortDir;
+ }
+ }
+
+ this.sortToggle[name] = dir;
+ this.sortInfo = {field: name, direction: dir};
+
+ sorters = [this.sortInfo];
+ }
+
+
+ if (this.groupField) {
+ sorters.unshift({direction: this.groupDir, field: this.groupField});
+ }
+
+ return this.multiSort.call(this, sorters, dir);
+ },
+
+
+ applyGroupField: function(){
+ if (this.remoteGroup) {
+ if(!this.baseParams){
+ this.baseParams = {};
+ }
+
+ Ext.apply(this.baseParams, {
+ groupBy : this.groupField,
+ groupDir: this.groupDir
+ });
+
+ var lo = this.lastOptions;
+ if (lo && lo.params) {
+ lo.params.groupDir = this.groupDir;
+
+
+ delete lo.params.groupBy;
+ }
+ }
+ },
+
+
+ applyGrouping : function(alwaysFireChange){
+ if(this.groupField !== false){
+ this.groupBy(this.groupField, true, this.groupDir);
+ return true;
+ }else{
+ if(alwaysFireChange === true){
+ this.fireEvent('datachanged', this);
+ }
+ return false;
+ }
+ },
+
+
+ getGroupState : function(){
+ return this.groupOnSort && this.groupField !== false ?
+ (this.sortInfo ? this.sortInfo.field : undefined) : this.groupField;
+ }
+});
+Ext.reg('groupingstore', Ext.data.GroupingStore);
+
+Ext.data.DirectProxy = function(config){
+ Ext.apply(this, config);
+ if(typeof this.paramOrder == 'string'){
+ this.paramOrder = this.paramOrder.split(/[\s,|]/);
+ }
+ Ext.data.DirectProxy.superclass.constructor.call(this, config);
+};
+
+Ext.extend(Ext.data.DirectProxy, Ext.data.DataProxy, {
+
+ paramOrder: undefined,
+
+
+ paramsAsHash: true,
+
+
+ directFn : undefined,
+
+
+ doRequest : function(action, rs, params, reader, callback, scope, options) {
+ var args = [],
+ directFn = this.api[action] || this.directFn;
+
+ switch (action) {
+ case Ext.data.Api.actions.create:
+ args.push(params.jsonData);
+ break;
+ case Ext.data.Api.actions.read:
+
+ if(directFn.directCfg.method.len > 0){
+ if(this.paramOrder){
+ for(var i = 0, len = this.paramOrder.length; i < len; i++){
+ args.push(params[this.paramOrder[i]]);
+ }
+ }else if(this.paramsAsHash){
+ args.push(params);
+ }
+ }
+ break;
+ case Ext.data.Api.actions.update:
+ args.push(params.jsonData);
+ break;
+ case Ext.data.Api.actions.destroy:
+ args.push(params.jsonData);
+ break;
+ }
+
+ var trans = {
+ params : params || {},
+ request: {
+ callback : callback,
+ scope : scope,
+ arg : options
+ },
+ reader: reader
+ };
+
+ args.push(this.createCallback(action, rs, trans), this);
+ directFn.apply(window, args);
+ },
+
+
+ createCallback : function(action, rs, trans) {
+ var me = this;
+ return function(result, res) {
+ if (!res.status) {
+
+ if (action === Ext.data.Api.actions.read) {
+ me.fireEvent("loadexception", me, trans, res, null);
+ }
+ me.fireEvent('exception', me, 'remote', action, trans, res, null);
+ trans.request.callback.call(trans.request.scope, null, trans.request.arg, false);
+ return;
+ }
+ if (action === Ext.data.Api.actions.read) {
+ me.onRead(action, trans, result, res);
+ } else {
+ me.onWrite(action, trans, result, res, rs);
+ }
+ };
+ },
+
+
+ onRead : function(action, trans, result, res) {
+ var records;
+ try {
+ records = trans.reader.readRecords(result);
+ }
+ catch (ex) {
+
+ this.fireEvent("loadexception", this, trans, res, ex);
+
+ this.fireEvent('exception', this, 'response', action, trans, res, ex);
+ trans.request.callback.call(trans.request.scope, null, trans.request.arg, false);
+ return;
+ }
+ this.fireEvent("load", this, res, trans.request.arg);
+ trans.request.callback.call(trans.request.scope, records, trans.request.arg, true);
+ },
+
+ onWrite : function(action, trans, result, res, rs) {
+ var data = trans.reader.extractData(trans.reader.getRoot(result), false);
+ var success = trans.reader.getSuccess(result);
+ success = (success !== false);
+ if (success){
+ this.fireEvent("write", this, action, data, res, rs, trans.request.arg);
+ }else{
+ this.fireEvent('exception', this, 'remote', action, trans, result, rs);
+ }
+ trans.request.callback.call(trans.request.scope, data, res, success);
+ }
+});
+
+Ext.data.DirectStore = Ext.extend(Ext.data.Store, {
+ constructor : function(config){
+
+ var c = Ext.apply({}, {
+ batchTransactions: false
+ }, config);
+ Ext.data.DirectStore.superclass.constructor.call(this, Ext.apply(c, {
+ proxy: Ext.isDefined(c.proxy) ? c.proxy : new Ext.data.DirectProxy(Ext.copyTo({}, c, 'paramOrder,paramsAsHash,directFn,api')),
+ reader: (!Ext.isDefined(c.reader) && c.fields) ? new Ext.data.JsonReader(Ext.copyTo({}, c, 'totalProperty,root,idProperty'), c.fields) : c.reader
+ }));
+ }
+});
+Ext.reg('directstore', Ext.data.DirectStore);
+
+Ext.Direct = Ext.extend(Ext.util.Observable, {
+
+
+
+ exceptions: {
+ TRANSPORT: 'xhr',
+ PARSE: 'parse',
+ LOGIN: 'login',
+ SERVER: 'exception'
+ },
+
+
+ constructor: function(){
+ this.addEvents(
+
+ 'event',
+
+ 'exception'
+ );
+ this.transactions = {};
+ this.providers = {};
+ },
+
+
+ addProvider : function(provider){
+ var a = arguments;
+ if(a.length > 1){
+ for(var i = 0, len = a.length; i < len; i++){
+ this.addProvider(a[i]);
+ }
+ return;
+ }
+
+
+ if(!provider.events){
+ provider = new Ext.Direct.PROVIDERS[provider.type](provider);
+ }
+ provider.id = provider.id || Ext.id();
+ this.providers[provider.id] = provider;
+
+ provider.on('data', this.onProviderData, this);
+ provider.on('exception', this.onProviderException, this);
+
+
+ if(!provider.isConnected()){
+ provider.connect();
+ }
+
+ return provider;
+ },
+
+
+ getProvider : function(id){
+ return this.providers[id];
+ },
+
+ removeProvider : function(id){
+ var provider = id.id ? id : this.providers[id];
+ provider.un('data', this.onProviderData, this);
+ provider.un('exception', this.onProviderException, this);
+ delete this.providers[provider.id];
+ return provider;
+ },
+
+ addTransaction: function(t){
+ this.transactions[t.tid] = t;
+ return t;
+ },
+
+ removeTransaction: function(t){
+ delete this.transactions[t.tid || t];
+ return t;
+ },
+
+ getTransaction: function(tid){
+ return this.transactions[tid.tid || tid];
+ },
+
+ onProviderData : function(provider, e){
+ if(Ext.isArray(e)){
+ for(var i = 0, len = e.length; i < len; i++){
+ this.onProviderData(provider, e[i]);
+ }
+ return;
+ }
+ if(e.name && e.name != 'event' && e.name != 'exception'){
+ this.fireEvent(e.name, e);
+ }else if(e.type == 'exception'){
+ this.fireEvent('exception', e);
+ }
+ this.fireEvent('event', e, provider);
+ },
+
+ createEvent : function(response, extraProps){
+ return new Ext.Direct.eventTypes[response.type](Ext.apply(response, extraProps));
+ }
+});
+
+Ext.Direct = new Ext.Direct();
+
+Ext.Direct.TID = 1;
+Ext.Direct.PROVIDERS = {};
+Ext.Direct.Transaction = function(config){
+ Ext.apply(this, config);
+ this.tid = ++Ext.Direct.TID;
+ this.retryCount = 0;
+};
+Ext.Direct.Transaction.prototype = {
+ send: function(){
+ this.provider.queueTransaction(this);
+ },
+
+ retry: function(){
+ this.retryCount++;
+ this.send();
+ },
+
+ getProvider: function(){
+ return this.provider;
+ }
+};Ext.Direct.Event = function(config){
+ Ext.apply(this, config);
+};
+
+Ext.Direct.Event.prototype = {
+ status: true,
+ getData: function(){
+ return this.data;
+ }
+};
+
+Ext.Direct.RemotingEvent = Ext.extend(Ext.Direct.Event, {
+ type: 'rpc',
+ getTransaction: function(){
+ return this.transaction || Ext.Direct.getTransaction(this.tid);
+ }
+});
+
+Ext.Direct.ExceptionEvent = Ext.extend(Ext.Direct.RemotingEvent, {
+ status: false,
+ type: 'exception'
+});
+
+Ext.Direct.eventTypes = {
+ 'rpc': Ext.Direct.RemotingEvent,
+ 'event': Ext.Direct.Event,
+ 'exception': Ext.Direct.ExceptionEvent
+};
+
+Ext.direct.Provider = Ext.extend(Ext.util.Observable, {
+
+
+
+ priority: 1,
+
+
+
+
+ constructor : function(config){
+ Ext.apply(this, config);
+ this.addEvents(
+
+ 'connect',
+
+ 'disconnect',
+
+ 'data',
+
+ 'exception'
+ );
+ Ext.direct.Provider.superclass.constructor.call(this, config);
+ },
+
+
+ isConnected: function(){
+ return false;
+ },
+
+
+ connect: Ext.emptyFn,
+
+
+ disconnect: Ext.emptyFn
+});
+
+Ext.direct.JsonProvider = Ext.extend(Ext.direct.Provider, {
+ parseResponse: function(xhr){
+ if(!Ext.isEmpty(xhr.responseText)){
+ if(typeof xhr.responseText == 'object'){
+ return xhr.responseText;
+ }
+ return Ext.decode(xhr.responseText);
+ }
+ return null;
+ },
+
+ getEvents: function(xhr){
+ var data = null;
+ try{
+ data = this.parseResponse(xhr);
+ }catch(e){
+ var event = new Ext.Direct.ExceptionEvent({
+ data: e,
+ xhr: xhr,
+ code: Ext.Direct.exceptions.PARSE,
+ message: 'Error parsing json response: \n\n ' + data
+ });
+ return [event];
+ }
+ var events = [];
+ if(Ext.isArray(data)){
+ for(var i = 0, len = data.length; i < len; i++){
+ events.push(Ext.Direct.createEvent(data[i]));
+ }
+ }else{
+ events.push(Ext.Direct.createEvent(data));
+ }
+ return events;
+ }
+});
+Ext.direct.PollingProvider = Ext.extend(Ext.direct.JsonProvider, {
+
+
+ priority: 3,
+
+
+ interval: 3000,
+
+
+
+
+
+
+ constructor : function(config){
+ Ext.direct.PollingProvider.superclass.constructor.call(this, config);
+ this.addEvents(
+
+ 'beforepoll',
+
+ 'poll'
+ );
+ },
+
+
+ isConnected: function(){
+ return !!this.pollTask;
+ },
+
+
+ connect: function(){
+ if(this.url && !this.pollTask){
+ this.pollTask = Ext.TaskMgr.start({
+ run: function(){
+ if(this.fireEvent('beforepoll', this) !== false){
+ if(typeof this.url == 'function'){
+ this.url(this.baseParams);
+ }else{
+ Ext.Ajax.request({
+ url: this.url,
+ callback: this.onData,
+ scope: this,
+ params: this.baseParams
+ });
+ }
+ }
+ },
+ interval: this.interval,
+ scope: this
+ });
+ this.fireEvent('connect', this);
+ }else if(!this.url){
+ throw 'Error initializing PollingProvider, no url configured.';
+ }
+ },
+
+
+ disconnect: function(){
+ if(this.pollTask){
+ Ext.TaskMgr.stop(this.pollTask);
+ delete this.pollTask;
+ this.fireEvent('disconnect', this);
+ }
+ },
+
+
+ onData: function(opt, success, xhr){
+ if(success){
+ var events = this.getEvents(xhr);
+ for(var i = 0, len = events.length; i < len; i++){
+ var e = events[i];
+ this.fireEvent('data', this, e);
+ }
+ }else{
+ var e = new Ext.Direct.ExceptionEvent({
+ data: e,
+ code: Ext.Direct.exceptions.TRANSPORT,
+ message: 'Unable to connect to the server.',
+ xhr: xhr
+ });
+ this.fireEvent('data', this, e);
+ }
+ }
+});
+
+Ext.Direct.PROVIDERS['polling'] = Ext.direct.PollingProvider;
+Ext.direct.RemotingProvider = Ext.extend(Ext.direct.JsonProvider, {
+
+
+
+
+
+
+
+
+
+ enableBuffer: 10,
+
+
+ maxRetries: 1,
+
+
+ timeout: undefined,
+
+ constructor : function(config){
+ Ext.direct.RemotingProvider.superclass.constructor.call(this, config);
+ this.addEvents(
+
+ 'beforecall',
+
+ 'call'
+ );
+ this.namespace = (Ext.isString(this.namespace)) ? Ext.ns(this.namespace) : this.namespace || window;
+ this.transactions = {};
+ this.callBuffer = [];
+ },
+
+
+ initAPI : function(){
+ var o = this.actions;
+ for(var c in o){
+ var cls = this.namespace[c] || (this.namespace[c] = {}),
+ ms = o[c];
+ for(var i = 0, len = ms.length; i < len; i++){
+ var m = ms[i];
+ cls[m.name] = this.createMethod(c, m);
+ }
+ }
+ },
+
+
+ isConnected: function(){
+ return !!this.connected;
+ },
+
+ connect: function(){
+ if(this.url){
+ this.initAPI();
+ this.connected = true;
+ this.fireEvent('connect', this);
+ }else if(!this.url){
+ throw 'Error initializing RemotingProvider, no url configured.';
+ }
+ },
+
+ disconnect: function(){
+ if(this.connected){
+ this.connected = false;
+ this.fireEvent('disconnect', this);
+ }
+ },
+
+ onData: function(opt, success, xhr){
+ if(success){
+ var events = this.getEvents(xhr);
+ for(var i = 0, len = events.length; i < len; i++){
+ var e = events[i],
+ t = this.getTransaction(e);
+ this.fireEvent('data', this, e);
+ if(t){
+ this.doCallback(t, e, true);
+ Ext.Direct.removeTransaction(t);
+ }
+ }
+ }else{
+ var ts = [].concat(opt.ts);
+ for(var i = 0, len = ts.length; i < len; i++){
+ var t = this.getTransaction(ts[i]);
+ if(t && t.retryCount < this.maxRetries){
+ t.retry();
+ }else{
+ var e = new Ext.Direct.ExceptionEvent({
+ data: e,
+ transaction: t,
+ code: Ext.Direct.exceptions.TRANSPORT,
+ message: 'Unable to connect to the server.',
+ xhr: xhr
+ });
+ this.fireEvent('data', this, e);
+ if(t){
+ this.doCallback(t, e, false);
+ Ext.Direct.removeTransaction(t);
+ }
+ }
+ }
+ }
+ },
+
+ getCallData: function(t){
+ return {
+ action: t.action,
+ method: t.method,
+ data: t.data,
+ type: 'rpc',
+ tid: t.tid
+ };
+ },
+
+ doSend : function(data){
+ var o = {
+ url: this.url,
+ callback: this.onData,
+ scope: this,
+ ts: data,
+ timeout: this.timeout
+ }, callData;
+
+ if(Ext.isArray(data)){
+ callData = [];
+ for(var i = 0, len = data.length; i < len; i++){
+ callData.push(this.getCallData(data[i]));
+ }
+ }else{
+ callData = this.getCallData(data);
+ }
+
+ if(this.enableUrlEncode){
+ var params = {};
+ params[Ext.isString(this.enableUrlEncode) ? this.enableUrlEncode : 'data'] = Ext.encode(callData);
+ o.params = params;
+ }else{
+ o.jsonData = callData;
+ }
+ Ext.Ajax.request(o);
+ },
+
+ combineAndSend : function(){
+ var len = this.callBuffer.length;
+ if(len > 0){
+ this.doSend(len == 1 ? this.callBuffer[0] : this.callBuffer);
+ this.callBuffer = [];
+ }
+ },
+
+ queueTransaction: function(t){
+ if(t.form){
+ this.processForm(t);
+ return;
+ }
+ this.callBuffer.push(t);
+ if(this.enableBuffer){
+ if(!this.callTask){
+ this.callTask = new Ext.util.DelayedTask(this.combineAndSend, this);
+ }
+ this.callTask.delay(Ext.isNumber(this.enableBuffer) ? this.enableBuffer : 10);
+ }else{
+ this.combineAndSend();
+ }
+ },
+
+ doCall : function(c, m, args){
+ var data = null, hs = args[m.len], scope = args[m.len+1];
+
+ if(m.len !== 0){
+ data = args.slice(0, m.len);
+ }
+
+ var t = new Ext.Direct.Transaction({
+ provider: this,
+ args: args,
+ action: c,
+ method: m.name,
+ data: data,
+ cb: scope && Ext.isFunction(hs) ? hs.createDelegate(scope) : hs
+ });
+
+ if(this.fireEvent('beforecall', this, t, m) !== false){
+ Ext.Direct.addTransaction(t);
+ this.queueTransaction(t);
+ this.fireEvent('call', this, t, m);
+ }
+ },
+
+ doForm : function(c, m, form, callback, scope){
+ var t = new Ext.Direct.Transaction({
+ provider: this,
+ action: c,
+ method: m.name,
+ args:[form, callback, scope],
+ cb: scope && Ext.isFunction(callback) ? callback.createDelegate(scope) : callback,
+ isForm: true
+ });
+
+ if(this.fireEvent('beforecall', this, t, m) !== false){
+ Ext.Direct.addTransaction(t);
+ var isUpload = String(form.getAttribute("enctype")).toLowerCase() == 'multipart/form-data',
+ params = {
+ extTID: t.tid,
+ extAction: c,
+ extMethod: m.name,
+ extType: 'rpc',
+ extUpload: String(isUpload)
+ };
+
+
+
+ Ext.apply(t, {
+ form: Ext.getDom(form),
+ isUpload: isUpload,
+ params: callback && Ext.isObject(callback.params) ? Ext.apply(params, callback.params) : params
+ });
+ this.fireEvent('call', this, t, m);
+ this.processForm(t);
+ }
+ },
+
+ processForm: function(t){
+ Ext.Ajax.request({
+ url: this.url,
+ params: t.params,
+ callback: this.onData,
+ scope: this,
+ form: t.form,
+ isUpload: t.isUpload,
+ ts: t
+ });
+ },
+
+ createMethod : function(c, m){
+ var f;
+ if(!m.formHandler){
+ f = function(){
+ this.doCall(c, m, Array.prototype.slice.call(arguments, 0));
+ }.createDelegate(this);
+ }else{
+ f = function(form, callback, scope){
+ this.doForm(c, m, form, callback, scope);
+ }.createDelegate(this);
+ }
+ f.directCfg = {
+ action: c,
+ method: m
+ };
+ return f;
+ },
+
+ getTransaction: function(opt){
+ return opt && opt.tid ? Ext.Direct.getTransaction(opt.tid) : null;
+ },
+
+ doCallback: function(t, e){
+ var fn = e.status ? 'success' : 'failure';
+ if(t && t.cb){
+ var hs = t.cb,
+ result = Ext.isDefined(e.result) ? e.result : e.data;
+ if(Ext.isFunction(hs)){
+ hs(result, e);
+ } else{
+ Ext.callback(hs[fn], hs.scope, [result, e]);
+ Ext.callback(hs.callback, hs.scope, [result, e]);
+ }
+ }
+ }
+});
+Ext.Direct.PROVIDERS['remoting'] = Ext.direct.RemotingProvider;
+Ext.Resizable = Ext.extend(Ext.util.Observable, {
+
+ constructor: function(el, config){
+ this.el = Ext.get(el);
+ if(config && config.wrap){
+ config.resizeChild = this.el;
+ this.el = this.el.wrap(typeof config.wrap == 'object' ? config.wrap : {cls:'xresizable-wrap'});
+ this.el.id = this.el.dom.id = config.resizeChild.id + '-rzwrap';
+ this.el.setStyle('overflow', 'hidden');
+ this.el.setPositioning(config.resizeChild.getPositioning());
+ config.resizeChild.clearPositioning();
+ if(!config.width || !config.height){
+ var csize = config.resizeChild.getSize();
+ this.el.setSize(csize.width, csize.height);
+ }
+ if(config.pinned && !config.adjustments){
+ config.adjustments = 'auto';
+ }
+ }
+
+
+ this.proxy = this.el.createProxy({tag: 'div', cls: 'x-resizable-proxy', id: this.el.id + '-rzproxy'}, Ext.getBody());
+ this.proxy.unselectable();
+ this.proxy.enableDisplayMode('block');
+
+ Ext.apply(this, config);
+
+ if(this.pinned){
+ this.disableTrackOver = true;
+ this.el.addClass('x-resizable-pinned');
+ }
+
+ var position = this.el.getStyle('position');
+ if(position != 'absolute' && position != 'fixed'){
+ this.el.setStyle('position', 'relative');
+ }
+ if(!this.handles){
+ this.handles = 's,e,se';
+ if(this.multiDirectional){
+ this.handles += ',n,w';
+ }
+ }
+ if(this.handles == 'all'){
+ this.handles = 'n s e w ne nw se sw';
+ }
+ var hs = this.handles.split(/\s*?[,;]\s*?| /);
+ var ps = Ext.Resizable.positions;
+ for(var i = 0, len = hs.length; i < len; i++){
+ if(hs[i] && ps[hs[i]]){
+ var pos = ps[hs[i]];
+ this[pos] = new Ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent, this.handleCls);
+ }
+ }
+
+ this.corner = this.southeast;
+
+ if(this.handles.indexOf('n') != -1 || this.handles.indexOf('w') != -1){
+ this.updateBox = true;
+ }
+
+ this.activeHandle = null;
+
+ if(this.resizeChild){
+ if(typeof this.resizeChild == 'boolean'){
+ this.resizeChild = Ext.get(this.el.dom.firstChild, true);
+ }else{
+ this.resizeChild = Ext.get(this.resizeChild, true);
+ }
+ }
+
+ if(this.adjustments == 'auto'){
+ var rc = this.resizeChild;
+ var hw = this.west, he = this.east, hn = this.north, hs = this.south;
+ if(rc && (hw || hn)){
+ rc.position('relative');
+ rc.setLeft(hw ? hw.el.getWidth() : 0);
+ rc.setTop(hn ? hn.el.getHeight() : 0);
+ }
+ this.adjustments = [
+ (he ? -he.el.getWidth() : 0) + (hw ? -hw.el.getWidth() : 0),
+ (hn ? -hn.el.getHeight() : 0) + (hs ? -hs.el.getHeight() : 0) -1
+ ];
+ }
+
+ if(this.draggable){
+ this.dd = this.dynamic ?
+ this.el.initDD(null) : this.el.initDDProxy(null, {dragElId: this.proxy.id});
+ this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id : this.el.id);
+ if(this.constrainTo){
+ this.dd.constrainTo(this.constrainTo);
+ }
+ }
+
+ this.addEvents(
+
+ 'beforeresize',
+
+ 'resize'
+ );
+
+ if(this.width !== null && this.height !== null){
+ this.resizeTo(this.width, this.height);
+ }else{
+ this.updateChildSize();
+ }
+ if(Ext.isIE){
+ this.el.dom.style.zoom = 1;
+ }
+ Ext.Resizable.superclass.constructor.call(this);
+ },
+
+
+ adjustments : [0, 0],
+
+ animate : false,
+
+
+ disableTrackOver : false,
+
+ draggable: false,
+
+ duration : 0.35,
+
+ dynamic : false,
+
+ easing : 'easeOutStrong',
+
+ enabled : true,
+
+
+ handles : false,
+
+ multiDirectional : false,
+
+ height : null,
+
+ width : null,
+
+ heightIncrement : 0,
+
+ widthIncrement : 0,
+
+ minHeight : 5,
+
+ minWidth : 5,
+
+ maxHeight : 10000,
+
+ maxWidth : 10000,
+
+ minX: 0,
+
+ minY: 0,
+
+ pinned : false,
+
+ preserveRatio : false,
+
+ resizeChild : false,
+
+ transparent: false,
+
+
+
+
+
+
+ resizeTo : function(width, height){
+ this.el.setSize(width, height);
+ this.updateChildSize();
+ this.fireEvent('resize', this, width, height, null);
+ },
+
+
+ startSizing : function(e, handle){
+ this.fireEvent('beforeresize', this, e);
+ if(this.enabled){
+
+ if(!this.overlay){
+ this.overlay = this.el.createProxy({tag: 'div', cls: 'x-resizable-overlay', html: '&#160;'}, Ext.getBody());
+ this.overlay.unselectable();
+ this.overlay.enableDisplayMode('block');
+ this.overlay.on({
+ scope: this,
+ mousemove: this.onMouseMove,
+ mouseup: this.onMouseUp
+ });
+ }
+ this.overlay.setStyle('cursor', handle.el.getStyle('cursor'));
+
+ this.resizing = true;
+ this.startBox = this.el.getBox();
+ this.startPoint = e.getXY();
+ this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0],
+ (this.startBox.y + this.startBox.height) - this.startPoint[1]];
+
+ this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
+ this.overlay.show();
+
+ if(this.constrainTo) {
+ var ct = Ext.get(this.constrainTo);
+ this.resizeRegion = ct.getRegion().adjust(
+ ct.getFrameWidth('t'),
+ ct.getFrameWidth('l'),
+ -ct.getFrameWidth('b'),
+ -ct.getFrameWidth('r')
+ );
+ }
+
+ this.proxy.setStyle('visibility', 'hidden');
+ this.proxy.show();
+ this.proxy.setBox(this.startBox);
+ if(!this.dynamic){
+ this.proxy.setStyle('visibility', 'visible');
+ }
+ }
+ },
+
+
+ onMouseDown : function(handle, e){
+ if(this.enabled){
+ e.stopEvent();
+ this.activeHandle = handle;
+ this.startSizing(e, handle);
+ }
+ },
+
+
+ onMouseUp : function(e){
+ this.activeHandle = null;
+ var size = this.resizeElement();
+ this.resizing = false;
+ this.handleOut();
+ this.overlay.hide();
+ this.proxy.hide();
+ this.fireEvent('resize', this, size.width, size.height, e);
+ },
+
+
+ updateChildSize : function(){
+ if(this.resizeChild){
+ var el = this.el;
+ var child = this.resizeChild;
+ var adj = this.adjustments;
+ if(el.dom.offsetWidth){
+ var b = el.getSize(true);
+ child.setSize(b.width+adj[0], b.height+adj[1]);
+ }
+
+
+
+
+ if(Ext.isIE9m){
+ setTimeout(function(){
+ if(el.dom.offsetWidth){
+ var b = el.getSize(true);
+ child.setSize(b.width+adj[0], b.height+adj[1]);
+ }
+ }, 10);
+ }
+ }
+ },
+
+
+ snap : function(value, inc, min){
+ if(!inc || !value){
+ return value;
+ }
+ var newValue = value;
+ var m = value % inc;
+ if(m > 0){
+ if(m > (inc/2)){
+ newValue = value + (inc-m);
+ }else{
+ newValue = value - m;
+ }
+ }
+ return Math.max(min, newValue);
+ },
+
+
+ resizeElement : function(){
+ var box = this.proxy.getBox();
+ if(this.updateBox){
+ this.el.setBox(box, false, this.animate, this.duration, null, this.easing);
+ }else{
+ this.el.setSize(box.width, box.height, this.animate, this.duration, null, this.easing);
+ }
+ this.updateChildSize();
+ if(!this.dynamic){
+ this.proxy.hide();
+ }
+ if(this.draggable && this.constrainTo){
+ this.dd.resetConstraints();
+ this.dd.constrainTo(this.constrainTo);
+ }
+ return box;
+ },
+
+
+ constrain : function(v, diff, m, mx){
+ if(v - diff < m){
+ diff = v - m;
+ }else if(v - diff > mx){
+ diff = v - mx;
+ }
+ return diff;
+ },
+
+
+ onMouseMove : function(e){
+ if(this.enabled && this.activeHandle){
+ try{
+
+ if(this.resizeRegion && !this.resizeRegion.contains(e.getPoint())) {
+ return;
+ }
+
+
+ var curSize = this.curSize || this.startBox,
+ x = this.startBox.x, y = this.startBox.y,
+ ox = x,
+ oy = y,
+ w = curSize.width,
+ h = curSize.height,
+ ow = w,
+ oh = h,
+ mw = this.minWidth,
+ mh = this.minHeight,
+ mxw = this.maxWidth,
+ mxh = this.maxHeight,
+ wi = this.widthIncrement,
+ hi = this.heightIncrement,
+ eventXY = e.getXY(),
+ diffX = -(this.startPoint[0] - Math.max(this.minX, eventXY[0])),
+ diffY = -(this.startPoint[1] - Math.max(this.minY, eventXY[1])),
+ pos = this.activeHandle.position,
+ tw,
+ th;
+
+ switch(pos){
+ case 'east':
+ w += diffX;
+ w = Math.min(Math.max(mw, w), mxw);
+ break;
+ case 'south':
+ h += diffY;
+ h = Math.min(Math.max(mh, h), mxh);
+ break;
+ case 'southeast':
+ w += diffX;
+ h += diffY;
+ w = Math.min(Math.max(mw, w), mxw);
+ h = Math.min(Math.max(mh, h), mxh);
+ break;
+ case 'north':
+ diffY = this.constrain(h, diffY, mh, mxh);
+ y += diffY;
+ h -= diffY;
+ break;
+ case 'west':
+ diffX = this.constrain(w, diffX, mw, mxw);
+ x += diffX;
+ w -= diffX;
+ break;
+ case 'northeast':
+ w += diffX;
+ w = Math.min(Math.max(mw, w), mxw);
+ diffY = this.constrain(h, diffY, mh, mxh);
+ y += diffY;
+ h -= diffY;
+ break;
+ case 'northwest':
+ diffX = this.constrain(w, diffX, mw, mxw);
+ diffY = this.constrain(h, diffY, mh, mxh);
+ y += diffY;
+ h -= diffY;
+ x += diffX;
+ w -= diffX;
+ break;
+ case 'southwest':
+ diffX = this.constrain(w, diffX, mw, mxw);
+ h += diffY;
+ h = Math.min(Math.max(mh, h), mxh);
+ x += diffX;
+ w -= diffX;
+ break;
+ }
+
+ var sw = this.snap(w, wi, mw);
+ var sh = this.snap(h, hi, mh);
+ if(sw != w || sh != h){
+ switch(pos){
+ case 'northeast':
+ y -= sh - h;
+ break;
+ case 'north':
+ y -= sh - h;
+ break;
+ case 'southwest':
+ x -= sw - w;
+ break;
+ case 'west':
+ x -= sw - w;
+ break;
+ case 'northwest':
+ x -= sw - w;
+ y -= sh - h;
+ break;
+ }
+ w = sw;
+ h = sh;
+ }
+
+ if(this.preserveRatio){
+ switch(pos){
+ case 'southeast':
+ case 'east':
+ h = oh * (w/ow);
+ h = Math.min(Math.max(mh, h), mxh);
+ w = ow * (h/oh);
+ break;
+ case 'south':
+ w = ow * (h/oh);
+ w = Math.min(Math.max(mw, w), mxw);
+ h = oh * (w/ow);
+ break;
+ case 'northeast':
+ w = ow * (h/oh);
+ w = Math.min(Math.max(mw, w), mxw);
+ h = oh * (w/ow);
+ break;
+ case 'north':
+ tw = w;
+ w = ow * (h/oh);
+ w = Math.min(Math.max(mw, w), mxw);
+ h = oh * (w/ow);
+ x += (tw - w) / 2;
+ break;
+ case 'southwest':
+ h = oh * (w/ow);
+ h = Math.min(Math.max(mh, h), mxh);
+ tw = w;
+ w = ow * (h/oh);
+ x += tw - w;
+ break;
+ case 'west':
+ th = h;
+ h = oh * (w/ow);
+ h = Math.min(Math.max(mh, h), mxh);
+ y += (th - h) / 2;
+ tw = w;
+ w = ow * (h/oh);
+ x += tw - w;
+ break;
+ case 'northwest':
+ tw = w;
+ th = h;
+ h = oh * (w/ow);
+ h = Math.min(Math.max(mh, h), mxh);
+ w = ow * (h/oh);
+ y += th - h;
+ x += tw - w;
+ break;
+
+ }
+ }
+ this.proxy.setBounds(x, y, w, h);
+ if(this.dynamic){
+ this.resizeElement();
+ }
+ }catch(ex){}
+ }
+ },
+
+
+ handleOver : function(){
+ if(this.enabled){
+ this.el.addClass('x-resizable-over');
+ }
+ },
+
+
+ handleOut : function(){
+ if(!this.resizing){
+ this.el.removeClass('x-resizable-over');
+ }
+ },
+
+
+ getEl : function(){
+ return this.el;
+ },
+
+
+ getResizeChild : function(){
+ return this.resizeChild;
+ },
+
+
+ destroy : function(removeEl){
+ Ext.destroy(this.dd, this.overlay, this.proxy);
+ this.overlay = null;
+ this.proxy = null;
+
+ var ps = Ext.Resizable.positions;
+ for(var k in ps){
+ if(typeof ps[k] != 'function' && this[ps[k]]){
+ this[ps[k]].destroy();
+ }
+ }
+ if(removeEl){
+ this.el.update('');
+ Ext.destroy(this.el);
+ this.el = null;
+ }
+ this.purgeListeners();
+ },
+
+ syncHandleHeight : function(){
+ var h = this.el.getHeight(true);
+ if(this.west){
+ this.west.el.setHeight(h);
+ }
+ if(this.east){
+ this.east.el.setHeight(h);
+ }
+ }
+});
+
+
+
+Ext.Resizable.positions = {
+ n: 'north', s: 'south', e: 'east', w: 'west', se: 'southeast', sw: 'southwest', nw: 'northwest', ne: 'northeast'
+};
+
+Ext.Resizable.Handle = Ext.extend(Object, {
+ constructor : function(rz, pos, disableTrackOver, transparent, cls){
+ if(!this.tpl){
+
+ var tpl = Ext.DomHelper.createTemplate(
+ {tag: 'div', cls: 'x-resizable-handle x-resizable-handle-{0}'}
+ );
+ tpl.compile();
+ Ext.Resizable.Handle.prototype.tpl = tpl;
+ }
+ this.position = pos;
+ this.rz = rz;
+ this.el = this.tpl.append(rz.el.dom, [this.position], true);
+ this.el.unselectable();
+ if(transparent){
+ this.el.setOpacity(0);
+ }
+ if(!Ext.isEmpty(cls)){
+ this.el.addClass(cls);
+ }
+ this.el.on('mousedown', this.onMouseDown, this);
+ if(!disableTrackOver){
+ this.el.on({
+ scope: this,
+ mouseover: this.onMouseOver,
+ mouseout: this.onMouseOut
+ });
+ }
+ },
+
+
+ afterResize : function(rz){
+
+ },
+
+ onMouseDown : function(e){
+ this.rz.onMouseDown(this, e);
+ },
+
+ onMouseOver : function(e){
+ this.rz.handleOver(this, e);
+ },
+
+ onMouseOut : function(e){
+ this.rz.handleOut(this, e);
+ },
+
+ destroy : function(){
+ Ext.destroy(this.el);
+ this.el = null;
+ }
+});
+
+Ext.Window = Ext.extend(Ext.Panel, {
+
+
+
+
+
+
+
+
+
+
+
+
+ baseCls : 'x-window',
+
+ resizable : true,
+
+ draggable : true,
+
+ closable : true,
+
+ closeAction : 'close',
+
+ constrain : false,
+
+ constrainHeader : false,
+
+ plain : false,
+
+ minimizable : false,
+
+ maximizable : false,
+
+ minHeight : 100,
+
+ minWidth : 200,
+
+ expandOnShow : true,
+
+
+ showAnimDuration: 0.25,
+
+
+ hideAnimDuration: 0.25,
+
+
+ collapsible : false,
+
+
+ initHidden : undefined,
+
+
+ hidden : true,
+
+
+
+
+
+
+ elements : 'header,body',
+
+ frame : true,
+
+ floating : true,
+
+
+ initComponent : function(){
+ this.initTools();
+ Ext.Window.superclass.initComponent.call(this);
+ this.addEvents(
+
+
+
+ 'resize',
+
+ 'maximize',
+
+ 'minimize',
+
+ 'restore'
+ );
+
+ if(Ext.isDefined(this.initHidden)){
+ this.hidden = this.initHidden;
+ }
+ if(this.hidden === false){
+ this.hidden = true;
+ this.show();
+ }
+ },
+
+
+ getState : function(){
+ return Ext.apply(Ext.Window.superclass.getState.call(this) || {}, this.getBox(true));
+ },
+
+
+ onRender : function(ct, position){
+ Ext.Window.superclass.onRender.call(this, ct, position);
+
+ if(this.plain){
+ this.el.addClass('x-window-plain');
+ }
+
+
+ this.focusEl = this.el.createChild({
+ tag: 'a', href:'#', cls:'x-dlg-focus',
+ tabIndex:'-1', html: '&#160;'});
+ this.focusEl.swallowEvent('click', true);
+
+ this.proxy = this.el.createProxy('x-window-proxy');
+ this.proxy.enableDisplayMode('block');
+
+ if(this.modal){
+ this.mask = this.container.createChild({cls:'ext-el-mask'}, this.el.dom);
+ this.mask.enableDisplayMode('block');
+ this.mask.hide();
+ this.mon(this.mask, 'click', this.focus, this);
+ }
+ if(this.maximizable){
+ this.mon(this.header, 'dblclick', this.toggleMaximize, this);
+ }
+ },
+
+
+ initEvents : function(){
+ Ext.Window.superclass.initEvents.call(this);
+ if(this.animateTarget){
+ this.setAnimateTarget(this.animateTarget);
+ }
+
+ if(this.resizable){
+ this.resizer = new Ext.Resizable(this.el, {
+ minWidth: this.minWidth,
+ minHeight:this.minHeight,
+ handles: this.resizeHandles || 'all',
+ pinned: true,
+ resizeElement : this.resizerAction,
+ handleCls: 'x-window-handle'
+ });
+ this.resizer.window = this;
+ this.mon(this.resizer, 'beforeresize', this.beforeResize, this);
+ }
+
+ if(this.draggable){
+ this.header.addClass('x-window-draggable');
+ }
+ this.mon(this.el, 'mousedown', this.toFront, this);
+ this.manager = this.manager || Ext.WindowMgr;
+ this.manager.register(this);
+ if(this.maximized){
+ this.maximized = false;
+ this.maximize();
+ }
+ if(this.closable){
+ var km = this.getKeyMap();
+ km.on(27, this.onEsc, this);
+ km.disable();
+ }
+ },
+
+ initDraggable : function(){
+
+ this.dd = new Ext.Window.DD(this);
+ },
+
+
+ onEsc : function(k, e){
+ if (this.activeGhost) {
+ this.unghost();
+ }
+ e.stopEvent();
+ this[this.closeAction]();
+ },
+
+
+ beforeDestroy : function(){
+ if(this.rendered){
+ this.hide();
+ this.clearAnchor();
+ Ext.destroy(
+ this.focusEl,
+ this.resizer,
+ this.dd,
+ this.proxy,
+ this.mask
+ );
+ }
+ Ext.Window.superclass.beforeDestroy.call(this);
+ },
+
+
+ onDestroy : function(){
+ if(this.manager){
+ this.manager.unregister(this);
+ }
+ Ext.Window.superclass.onDestroy.call(this);
+ },
+
+
+ initTools : function(){
+ if(this.minimizable){
+ this.addTool({
+ id: 'minimize',
+ handler: this.minimize.createDelegate(this, [])
+ });
+ }
+ if(this.maximizable){
+ this.addTool({
+ id: 'maximize',
+ handler: this.maximize.createDelegate(this, [])
+ });
+ this.addTool({
+ id: 'restore',
+ handler: this.restore.createDelegate(this, []),
+ hidden:true
+ });
+ }
+ if(this.closable){
+ this.addTool({
+ id: 'close',
+ handler: this[this.closeAction].createDelegate(this, [])
+ });
+ }
+ },
+
+
+ resizerAction : function(){
+ var box = this.proxy.getBox();
+ this.proxy.hide();
+ this.window.handleResize(box);
+ return box;
+ },
+
+
+ beforeResize : function(){
+ this.resizer.minHeight = Math.max(this.minHeight, this.getFrameHeight() + 40);
+ this.resizer.minWidth = Math.max(this.minWidth, this.getFrameWidth() + 40);
+ this.resizeBox = this.el.getBox();
+ },
+
+
+ updateHandles : function(){
+ if(Ext.isIE9m && this.resizer){
+ this.resizer.syncHandleHeight();
+ this.el.repaint();
+ }
+ },
+
+
+ handleResize : function(box){
+ var rz = this.resizeBox;
+ if(rz.x != box.x || rz.y != box.y){
+ this.updateBox(box);
+ }else{
+ this.setSize(box);
+ if (Ext.isIE6 && Ext.isStrict) {
+ this.doLayout();
+ }
+ }
+ this.focus();
+ this.updateHandles();
+ this.saveState();
+ },
+
+
+ focus : function(){
+ var f = this.focusEl,
+ db = this.defaultButton,
+ t = typeof db,
+ el,
+ ct;
+ if(Ext.isDefined(db)){
+ if(Ext.isNumber(db) && this.fbar){
+ f = this.fbar.items.get(db);
+ }else if(Ext.isString(db)){
+ f = Ext.getCmp(db);
+ }else{
+ f = db;
+ }
+ el = f.getEl();
+ ct = Ext.getDom(this.container);
+ if (el && ct) {
+ if (ct != document.body && !Ext.lib.Region.getRegion(ct).contains(Ext.lib.Region.getRegion(el.dom))){
+ return;
+ }
+ }
+ }
+ f = f || this.focusEl;
+ f.focus.defer(10, f);
+ },
+
+
+ setAnimateTarget : function(el){
+ el = Ext.get(el);
+ this.animateTarget = el;
+ },
+
+
+ beforeShow : function(){
+ delete this.el.lastXY;
+ delete this.el.lastLT;
+ if(this.x === undefined || this.y === undefined){
+ var xy = this.el.getAlignToXY(this.container, 'c-c');
+ var pos = this.el.translatePoints(xy[0], xy[1]);
+ this.x = this.x === undefined? pos.left : this.x;
+ this.y = this.y === undefined? pos.top : this.y;
+ }
+ this.el.setLeftTop(this.x, this.y);
+
+ if(this.expandOnShow){
+ this.expand(false);
+ }
+
+ if(this.modal){
+ Ext.getBody().addClass('x-body-masked');
+ this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
+ this.mask.show();
+ }
+ },
+
+
+ show : function(animateTarget, cb, scope){
+ if(!this.rendered){
+ this.render(Ext.getBody());
+ }
+ if(this.hidden === false){
+ this.toFront();
+ return this;
+ }
+ if(this.fireEvent('beforeshow', this) === false){
+ return this;
+ }
+ if(cb){
+ this.on('show', cb, scope, {single:true});
+ }
+ this.hidden = false;
+ if(Ext.isDefined(animateTarget)){
+ this.setAnimateTarget(animateTarget);
+ }
+ this.beforeShow();
+ if(this.animateTarget){
+ this.animShow();
+ }else{
+ this.afterShow();
+ }
+ return this;
+ },
+
+
+ afterShow : function(isAnim){
+ if (this.isDestroyed){
+ return false;
+ }
+ this.proxy.hide();
+ this.el.setStyle('display', 'block');
+ this.el.show();
+ if(this.maximized){
+ this.fitContainer();
+ }
+ if(Ext.isMac && Ext.isGecko2){
+ this.cascade(this.setAutoScroll);
+ }
+
+ if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){
+ Ext.EventManager.onWindowResize(this.onWindowResize, this);
+ }
+ this.doConstrain();
+ this.doLayout();
+ if(this.keyMap){
+ this.keyMap.enable();
+ }
+ this.toFront();
+ this.updateHandles();
+ if(isAnim && (Ext.isIE || Ext.isWebKit)){
+ var sz = this.getSize();
+ this.onResize(sz.width, sz.height);
+ }
+ this.onShow();
+ this.fireEvent('show', this);
+ },
+
+
+ animShow : function(){
+ this.proxy.show();
+ this.proxy.setBox(this.animateTarget.getBox());
+ this.proxy.setOpacity(0);
+ var b = this.getBox();
+ this.el.setStyle('display', 'none');
+ this.proxy.shift(Ext.apply(b, {
+ callback: this.afterShow.createDelegate(this, [true], false),
+ scope: this,
+ easing: 'easeNone',
+ duration: this.showAnimDuration,
+ opacity: 0.5
+ }));
+ },
+
+
+ hide : function(animateTarget, cb, scope){
+ if(this.hidden || this.fireEvent('beforehide', this) === false){
+ return this;
+ }
+ if(cb){
+ this.on('hide', cb, scope, {single:true});
+ }
+ this.hidden = true;
+ if(animateTarget !== undefined){
+ this.setAnimateTarget(animateTarget);
+ }
+ if(this.modal){
+ this.mask.hide();
+ Ext.getBody().removeClass('x-body-masked');
+ }
+ if(this.animateTarget){
+ this.animHide();
+ }else{
+ this.el.hide();
+ this.afterHide();
+ }
+ return this;
+ },
+
+
+ afterHide : function(){
+ this.proxy.hide();
+ if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){
+ Ext.EventManager.removeResizeListener(this.onWindowResize, this);
+ }
+ if(this.keyMap){
+ this.keyMap.disable();
+ }
+ this.onHide();
+ this.fireEvent('hide', this);
+ },
+
+
+ animHide : function(){
+ this.proxy.setOpacity(0.5);
+ this.proxy.show();
+ var tb = this.getBox(false);
+ this.proxy.setBox(tb);
+ this.el.hide();
+ this.proxy.shift(Ext.apply(this.animateTarget.getBox(), {
+ callback: this.afterHide,
+ scope: this,
+ duration: this.hideAnimDuration,
+ easing: 'easeNone',
+ opacity: 0
+ }));
+ },
+
+
+ onShow : Ext.emptyFn,
+
+
+ onHide : Ext.emptyFn,
+
+
+ onWindowResize : function(){
+ if(this.maximized){
+ this.fitContainer();
+ }
+ if(this.modal){
+ this.mask.setSize('100%', '100%');
+ var force = this.mask.dom.offsetHeight;
+ this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
+ }
+ this.doConstrain();
+ },
+
+
+ doConstrain : function(){
+ if(this.constrain || this.constrainHeader){
+ var offsets;
+ if(this.constrain){
+ offsets = {
+ right:this.el.shadowOffset,
+ left:this.el.shadowOffset,
+ bottom:this.el.shadowOffset
+ };
+ }else {
+ var s = this.getSize();
+ offsets = {
+ right:-(s.width - 100),
+ bottom:-(s.height - 25 + this.el.getConstrainOffset())
+ };
+ }
+
+ var xy = this.el.getConstrainToXY(this.container, true, offsets);
+ if(xy){
+ this.setPosition(xy[0], xy[1]);
+ }
+ }
+ },
+
+
+ ghost : function(cls){
+ var ghost = this.createGhost(cls);
+ var box = this.getBox(true);
+ ghost.setLeftTop(box.x, box.y);
+ ghost.setWidth(box.width);
+ this.el.hide();
+ this.activeGhost = ghost;
+ return ghost;
+ },
+
+
+ unghost : function(show, matchPosition){
+ if(!this.activeGhost) {
+ return;
+ }
+ if(show !== false){
+ this.el.show();
+ this.focus.defer(10, this);
+ if(Ext.isMac && Ext.isGecko2){
+ this.cascade(this.setAutoScroll);
+ }
+ }
+ if(matchPosition !== false){
+ this.setPosition(this.activeGhost.getLeft(true), this.activeGhost.getTop(true));
+ }
+ this.activeGhost.hide();
+ this.activeGhost.remove();
+ delete this.activeGhost;
+ },
+
+
+ minimize : function(){
+ this.fireEvent('minimize', this);
+ return this;
+ },
+
+
+ close : function(){
+ if(this.fireEvent('beforeclose', this) !== false){
+ if(this.hidden){
+ this.doClose();
+ }else{
+ this.hide(null, this.doClose, this);
+ }
+ }
+ },
+
+
+ doClose : function(){
+ this.fireEvent('close', this);
+ this.destroy();
+ },
+
+
+ maximize : function(){
+ if(!this.maximized){
+ this.expand(false);
+ this.restoreSize = this.getSize();
+ this.restorePos = this.getPosition(true);
+ if (this.maximizable){
+ this.tools.maximize.hide();
+ this.tools.restore.show();
+ }
+ this.maximized = true;
+ this.el.disableShadow();
+
+ if(this.dd){
+ this.dd.lock();
+ }
+ if(this.collapsible){
+ this.tools.toggle.hide();
+ }
+ this.el.addClass('x-window-maximized');
+ this.container.addClass('x-window-maximized-ct');
+
+ this.setPosition(0, 0);
+ this.fitContainer();
+ this.fireEvent('maximize', this);
+ }
+ return this;
+ },
+
+
+ restore : function(){
+ if(this.maximized){
+ var t = this.tools;
+ this.el.removeClass('x-window-maximized');
+ if(t.restore){
+ t.restore.hide();
+ }
+ if(t.maximize){
+ t.maximize.show();
+ }
+ this.setPosition(this.restorePos[0], this.restorePos[1]);
+ this.setSize(this.restoreSize.width, this.restoreSize.height);
+ delete this.restorePos;
+ delete this.restoreSize;
+ this.maximized = false;
+ this.el.enableShadow(true);
+
+ if(this.dd){
+ this.dd.unlock();
+ }
+ if(this.collapsible && t.toggle){
+ t.toggle.show();
+ }
+ this.container.removeClass('x-window-maximized-ct');
+
+ this.doConstrain();
+ this.fireEvent('restore', this);
+ }
+ return this;
+ },
+
+
+ toggleMaximize : function(){
+ return this[this.maximized ? 'restore' : 'maximize']();
+ },
+
+
+ fitContainer : function(){
+ var vs = this.container.getViewSize(false);
+ this.setSize(vs.width, vs.height);
+ },
+
+
+
+ setZIndex : function(index){
+ if(this.modal){
+ this.mask.setStyle('z-index', index);
+ }
+ this.el.setZIndex(++index);
+ index += 5;
+
+ if(this.resizer){
+ this.resizer.proxy.setStyle('z-index', ++index);
+ }
+
+ this.lastZIndex = index;
+ },
+
+
+ alignTo : function(element, position, offsets){
+ var xy = this.el.getAlignToXY(element, position, offsets);
+ this.setPagePosition(xy[0], xy[1]);
+ return this;
+ },
+
+
+ anchorTo : function(el, alignment, offsets, monitorScroll){
+ this.clearAnchor();
+ this.anchorTarget = {
+ el: el,
+ alignment: alignment,
+ offsets: offsets
+ };
+
+ Ext.EventManager.onWindowResize(this.doAnchor, this);
+ var tm = typeof monitorScroll;
+ if(tm != 'undefined'){
+ Ext.EventManager.on(window, 'scroll', this.doAnchor, this,
+ {buffer: tm == 'number' ? monitorScroll : 50});
+ }
+ return this.doAnchor();
+ },
+
+
+ doAnchor : function(){
+ var o = this.anchorTarget;
+ this.alignTo(o.el, o.alignment, o.offsets);
+ return this;
+ },
+
+
+ clearAnchor : function(){
+ if(this.anchorTarget){
+ Ext.EventManager.removeResizeListener(this.doAnchor, this);
+ Ext.EventManager.un(window, 'scroll', this.doAnchor, this);
+ delete this.anchorTarget;
+ }
+ return this;
+ },
+
+
+ toFront : function(e){
+ if(this.manager.bringToFront(this)){
+ if(!e || !e.getTarget().focus){
+ this.focus();
+ }
+ }
+ return this;
+ },
+
+
+ setActive : function(active){
+ if(active){
+ if(!this.maximized){
+ this.el.enableShadow(true);
+ }
+ this.fireEvent('activate', this);
+ }else{
+ this.el.disableShadow();
+ this.fireEvent('deactivate', this);
+ }
+ },
+
+
+ toBack : function(){
+ this.manager.sendToBack(this);
+ return this;
+ },
+
+
+ center : function(){
+ var xy = this.el.getAlignToXY(this.container, 'c-c');
+ this.setPagePosition(xy[0], xy[1]);
+ return this;
+ }
+
+
+});
+Ext.reg('window', Ext.Window);
+
+
+Ext.Window.DD = Ext.extend(Ext.dd.DD, {
+
+ constructor : function(win){
+ this.win = win;
+ Ext.Window.DD.superclass.constructor.call(this, win.el.id, 'WindowDD-'+win.id);
+ this.setHandleElId(win.header.id);
+ this.scroll = false;
+ },
+
+ moveOnly:true,
+ headerOffsets:[100, 25],
+ startDrag : function(){
+ var w = this.win;
+ this.proxy = w.ghost(w.initialConfig.cls);
+ if(w.constrain !== false){
+ var so = w.el.shadowOffset;
+ this.constrainTo(w.container, {right: so, left: so, bottom: so});
+ }else if(w.constrainHeader !== false){
+ var s = this.proxy.getSize();
+ this.constrainTo(w.container, {right: -(s.width-this.headerOffsets[0]), bottom: -(s.height-this.headerOffsets[1])});
+ }
+ },
+ b4Drag : Ext.emptyFn,
+
+ onDrag : function(e){
+ this.alignElWithMouse(this.proxy, e.getPageX(), e.getPageY());
+ },
+
+ endDrag : function(e){
+ this.win.unghost();
+ this.win.saveState();
+ }
+});
+
+Ext.WindowGroup = function(){
+ var list = {};
+ var accessList = [];
+ var front = null;
+
+
+ var sortWindows = function(d1, d2){
+ return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1;
+ };
+
+
+ var orderWindows = function(){
+ var a = accessList, len = a.length;
+ if(len > 0){
+ a.sort(sortWindows);
+ var seed = a[0].manager.zseed;
+ for(var i = 0; i < len; i++){
+ var win = a[i];
+ if(win && !win.hidden){
+ win.setZIndex(seed + (i*10));
+ }
+ }
+ }
+ activateLast();
+ };
+
+
+ var setActiveWin = function(win){
+ if(win != front){
+ if(front){
+ front.setActive(false);
+ }
+ front = win;
+ if(win){
+ win.setActive(true);
+ }
+ }
+ };
+
+
+ var activateLast = function(){
+ for(var i = accessList.length-1; i >=0; --i) {
+ if(!accessList[i].hidden){
+ setActiveWin(accessList[i]);
+ return;
+ }
+ }
+
+ setActiveWin(null);
+ };
+
+ return {
+
+ zseed : 9000,
+
+
+ register : function(win){
+ if(win.manager){
+ win.manager.unregister(win);
+ }
+ win.manager = this;
+
+ list[win.id] = win;
+ accessList.push(win);
+ win.on('hide', activateLast);
+ },
+
+
+ unregister : function(win){
+ delete win.manager;
+ delete list[win.id];
+ win.un('hide', activateLast);
+ accessList.remove(win);
+ },
+
+
+ get : function(id){
+ return typeof id == "object" ? id : list[id];
+ },
+
+
+ bringToFront : function(win){
+ win = this.get(win);
+ if(win != front){
+ win._lastAccess = new Date().getTime();
+ orderWindows();
+ return true;
+ }
+ return false;
+ },
+
+
+ sendToBack : function(win){
+ win = this.get(win);
+ win._lastAccess = -(new Date().getTime());
+ orderWindows();
+ return win;
+ },
+
+
+ hideAll : function(){
+ for(var id in list){
+ if(list[id] && typeof list[id] != "function" && list[id].isVisible()){
+ list[id].hide();
+ }
+ }
+ },
+
+
+ getActive : function(){
+ return front;
+ },
+
+
+ getBy : function(fn, scope){
+ var r = [];
+ for(var i = accessList.length-1; i >=0; --i) {
+ var win = accessList[i];
+ if(fn.call(scope||win, win) !== false){
+ r.push(win);
+ }
+ }
+ return r;
+ },
+
+
+ each : function(fn, scope){
+ for(var id in list){
+ if(list[id] && typeof list[id] != "function"){
+ if(fn.call(scope || list[id], list[id]) === false){
+ return;
+ }
+ }
+ }
+ }
+ };
+};
+
+
+
+Ext.WindowMgr = new Ext.WindowGroup();
+Ext.MessageBox = function(){
+ var dlg, opt, mask, waitTimer,
+ bodyEl, msgEl, textboxEl, textareaEl, progressBar, pp, iconEl, spacerEl,
+ buttons, activeTextEl, bwidth, bufferIcon = '', iconCls = '',
+ buttonNames = ['ok', 'yes', 'no', 'cancel'];
+
+
+ var handleButton = function(button){
+ buttons[button].blur();
+ if(dlg.isVisible()){
+ dlg.hide();
+ handleHide();
+ Ext.callback(opt.fn, opt.scope||window, [button, activeTextEl.dom.value, opt], 1);
+ }
+ };
+
+
+ var handleHide = function(){
+ if(opt && opt.cls){
+ dlg.el.removeClass(opt.cls);
+ }
+ progressBar.reset();
+ };
+
+
+ var handleEsc = function(d, k, e){
+ if(opt && opt.closable !== false){
+ dlg.hide();
+ handleHide();
+ }
+ if(e){
+ e.stopEvent();
+ }
+ };
+
+
+ var updateButtons = function(b){
+ var width = 0,
+ cfg;
+ if(!b){
+ Ext.each(buttonNames, function(name){
+ buttons[name].hide();
+ });
+ return width;
+ }
+ dlg.footer.dom.style.display = '';
+ Ext.iterate(buttons, function(name, btn){
+ cfg = b[name];
+ if(cfg){
+ btn.show();
+ btn.setText(Ext.isString(cfg) ? cfg : Ext.MessageBox.buttonText[name]);
+ width += btn.getEl().getWidth() + 15;
+ }else{
+ btn.hide();
+ }
+ });
+ return width;
+ };
+
+ return {
+
+ getDialog : function(titleText){
+ if(!dlg){
+ var btns = [];
+
+ buttons = {};
+ Ext.each(buttonNames, function(name){
+ btns.push(buttons[name] = new Ext.Button({
+ text: this.buttonText[name],
+ handler: handleButton.createCallback(name),
+ hideMode: 'offsets'
+ }));
+ }, this);
+ dlg = new Ext.Window({
+ autoCreate : true,
+ title:titleText,
+ resizable:false,
+ constrain:true,
+ constrainHeader:true,
+ minimizable : false,
+ maximizable : false,
+ stateful: false,
+ modal: true,
+ shim:true,
+ buttonAlign:"center",
+ width:400,
+ height:100,
+ minHeight: 80,
+ plain:true,
+ footer:true,
+ closable:true,
+ close : function(){
+ if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){
+ handleButton("no");
+ }else{
+ handleButton("cancel");
+ }
+ },
+ fbar: new Ext.Toolbar({
+ items: btns,
+ enableOverflow: false
+ })
+ });
+ dlg.render(document.body);
+ dlg.getEl().addClass('x-window-dlg');
+ mask = dlg.mask;
+ bodyEl = dlg.body.createChild({
+ html:'<div class="ext-mb-icon"></div><div class="ext-mb-content"><span class="ext-mb-text"></span><br /><div class="ext-mb-fix-cursor"><input type="text" class="ext-mb-input" /><textarea class="ext-mb-textarea"></textarea></div></div>'
+ });
+ iconEl = Ext.get(bodyEl.dom.firstChild);
+ var contentEl = bodyEl.dom.childNodes[1];
+ msgEl = Ext.get(contentEl.firstChild);
+ textboxEl = Ext.get(contentEl.childNodes[2].firstChild);
+ textboxEl.enableDisplayMode();
+ textboxEl.addKeyListener([10,13], function(){
+ if(dlg.isVisible() && opt && opt.buttons){
+ if(opt.buttons.ok){
+ handleButton("ok");
+ }else if(opt.buttons.yes){
+ handleButton("yes");
+ }
+ }
+ });
+ textareaEl = Ext.get(contentEl.childNodes[2].childNodes[1]);
+ textareaEl.enableDisplayMode();
+ progressBar = new Ext.ProgressBar({
+ renderTo:bodyEl
+ });
+ bodyEl.createChild({cls:'x-clear'});
+ }
+ return dlg;
+ },
+
+
+ updateText : function(text){
+ if(!dlg.isVisible() && !opt.width){
+ dlg.setSize(this.maxWidth, 100);
+ }
+
+ msgEl.update(text ? text + ' ' : '&#160;');
+
+ var iw = iconCls != '' ? (iconEl.getWidth() + iconEl.getMargins('lr')) : 0,
+ mw = msgEl.getWidth() + msgEl.getMargins('lr'),
+ fw = dlg.getFrameWidth('lr'),
+ bw = dlg.body.getFrameWidth('lr'),
+ w;
+
+ w = Math.max(Math.min(opt.width || iw+mw+fw+bw, opt.maxWidth || this.maxWidth),
+ Math.max(opt.minWidth || this.minWidth, bwidth || 0));
+
+ if(opt.prompt === true){
+ activeTextEl.setWidth(w-iw-fw-bw);
+ }
+ if(opt.progress === true || opt.wait === true){
+ progressBar.setSize(w-iw-fw-bw);
+ }
+ if(Ext.isIE9m && w == bwidth){
+ w += 4;
+ }
+ msgEl.update(text || '&#160;');
+ dlg.setSize(w, 'auto').center();
+ return this;
+ },
+
+
+ updateProgress : function(value, progressText, msg){
+ progressBar.updateProgress(value, progressText);
+ if(msg){
+ this.updateText(msg);
+ }
+ return this;
+ },
+
+
+ isVisible : function(){
+ return dlg && dlg.isVisible();
+ },
+
+
+ hide : function(){
+ var proxy = dlg ? dlg.activeGhost : null;
+ if(this.isVisible() || proxy){
+ dlg.hide();
+ handleHide();
+ if (proxy){
+
+
+ dlg.unghost(false, false);
+ }
+ }
+ return this;
+ },
+
+
+ show : function(options){
+ if(this.isVisible()){
+ this.hide();
+ }
+ opt = options;
+ var d = this.getDialog(opt.title || "&#160;");
+
+ d.setTitle(opt.title || "&#160;");
+ var allowClose = (opt.closable !== false && opt.progress !== true && opt.wait !== true);
+ d.tools.close.setDisplayed(allowClose);
+ activeTextEl = textboxEl;
+ opt.prompt = opt.prompt || (opt.multiline ? true : false);
+ if(opt.prompt){
+ if(opt.multiline){
+ textboxEl.hide();
+ textareaEl.show();
+ textareaEl.setHeight(Ext.isNumber(opt.multiline) ? opt.multiline : this.defaultTextHeight);
+ activeTextEl = textareaEl;
+ }else{
+ textboxEl.show();
+ textareaEl.hide();
+ }
+ }else{
+ textboxEl.hide();
+ textareaEl.hide();
+ }
+ activeTextEl.dom.value = opt.value || "";
+ if(opt.prompt){
+ d.focusEl = activeTextEl;
+ }else{
+ var bs = opt.buttons;
+ var db = null;
+ if(bs && bs.ok){
+ db = buttons["ok"];
+ }else if(bs && bs.yes){
+ db = buttons["yes"];
+ }
+ if (db){
+ d.focusEl = db;
+ }
+ }
+ if(Ext.isDefined(opt.iconCls)){
+ d.setIconClass(opt.iconCls);
+ }
+ this.setIcon(Ext.isDefined(opt.icon) ? opt.icon : bufferIcon);
+ bwidth = updateButtons(opt.buttons);
+ progressBar.setVisible(opt.progress === true || opt.wait === true);
+ this.updateProgress(0, opt.progressText);
+ this.updateText(opt.msg);
+ if(opt.cls){
+ d.el.addClass(opt.cls);
+ }
+ d.proxyDrag = opt.proxyDrag === true;
+ d.modal = opt.modal !== false;
+ d.mask = opt.modal !== false ? mask : false;
+ if(!d.isVisible()){
+
+ document.body.appendChild(dlg.el.dom);
+ d.setAnimateTarget(opt.animEl);
+
+ d.on('show', function(){
+ if(allowClose === true){
+ d.keyMap.enable();
+ }else{
+ d.keyMap.disable();
+ }
+ }, this, {single:true});
+ d.show(opt.animEl);
+ }
+ if(opt.wait === true){
+ progressBar.wait(opt.waitConfig);
+ }
+ return this;
+ },
+
+
+ setIcon : function(icon){
+ if(!dlg){
+ bufferIcon = icon;
+ return;
+ }
+ bufferIcon = undefined;
+ if(icon && icon != ''){
+ iconEl.removeClass('x-hidden');
+ iconEl.replaceClass(iconCls, icon);
+ bodyEl.addClass('x-dlg-icon');
+ iconCls = icon;
+ }else{
+ iconEl.replaceClass(iconCls, 'x-hidden');
+ bodyEl.removeClass('x-dlg-icon');
+ iconCls = '';
+ }
+ return this;
+ },
+
+
+ progress : function(title, msg, progressText){
+ this.show({
+ title : title,
+ msg : msg,
+ buttons: false,
+ progress:true,
+ closable:false,
+ minWidth: this.minProgressWidth,
+ progressText: progressText
+ });
+ return this;
+ },
+
+
+ wait : function(msg, title, config){
+ this.show({
+ title : title,
+ msg : msg,
+ buttons: false,
+ closable:false,
+ wait:true,
+ modal:true,
+ minWidth: this.minProgressWidth,
+ waitConfig: config
+ });
+ return this;
+ },
+
+
+ alert : function(title, msg, fn, scope){
+ this.show({
+ title : title,
+ msg : msg,
+ buttons: this.OK,
+ fn: fn,
+ scope : scope,
+ minWidth: this.minWidth
+ });
+ return this;
+ },
+
+
+ confirm : function(title, msg, fn, scope){
+ this.show({
+ title : title,
+ msg : msg,
+ buttons: this.YESNO,
+ fn: fn,
+ scope : scope,
+ icon: this.QUESTION,
+ minWidth: this.minWidth
+ });
+ return this;
+ },
+
+
+ prompt : function(title, msg, fn, scope, multiline, value){
+ this.show({
+ title : title,
+ msg : msg,
+ buttons: this.OKCANCEL,
+ fn: fn,
+ minWidth: this.minPromptWidth,
+ scope : scope,
+ prompt:true,
+ multiline: multiline,
+ value: value
+ });
+ return this;
+ },
+
+
+ OK : {ok:true},
+
+ CANCEL : {cancel:true},
+
+ OKCANCEL : {ok:true, cancel:true},
+
+ YESNO : {yes:true, no:true},
+
+ YESNOCANCEL : {yes:true, no:true, cancel:true},
+
+ INFO : 'ext-mb-info',
+
+ WARNING : 'ext-mb-warning',
+
+ QUESTION : 'ext-mb-question',
+
+ ERROR : 'ext-mb-error',
+
+
+ defaultTextHeight : 75,
+
+ maxWidth : 600,
+
+ minWidth : 100,
+
+ minProgressWidth : 250,
+
+ minPromptWidth: 250,
+
+ buttonText : {
+ ok : "OK",
+ cancel : "Cancel",
+ yes : "Yes",
+ no : "No"
+ }
+ };
+}();
+
+
+Ext.Msg = Ext.MessageBox;
+Ext.dd.PanelProxy = Ext.extend(Object, {
+
+ constructor : function(panel, config){
+ this.panel = panel;
+ this.id = this.panel.id +'-ddproxy';
+ Ext.apply(this, config);
+ },
+
+
+ insertProxy : true,
+
+
+ setStatus : Ext.emptyFn,
+ reset : Ext.emptyFn,
+ update : Ext.emptyFn,
+ stop : Ext.emptyFn,
+ sync: Ext.emptyFn,
+
+
+ getEl : function(){
+ return this.ghost;
+ },
+
+
+ getGhost : function(){
+ return this.ghost;
+ },
+
+
+ getProxy : function(){
+ return this.proxy;
+ },
+
+
+ hide : function(){
+ if(this.ghost){
+ if(this.proxy){
+ this.proxy.remove();
+ delete this.proxy;
+ }
+ this.panel.el.dom.style.display = '';
+ this.ghost.remove();
+ delete this.ghost;
+ }
+ },
+
+
+ show : function(){
+ if(!this.ghost){
+ this.ghost = this.panel.createGhost(this.panel.initialConfig.cls, undefined, Ext.getBody());
+ this.ghost.setXY(this.panel.el.getXY());
+ if(this.insertProxy){
+ this.proxy = this.panel.el.insertSibling({cls:'x-panel-dd-spacer'});
+ this.proxy.setSize(this.panel.getSize());
+ }
+ this.panel.el.dom.style.display = 'none';
+ }
+ },
+
+
+ repair : function(xy, callback, scope){
+ this.hide();
+ if(typeof callback == "function"){
+ callback.call(scope || this);
+ }
+ },
+
+
+ moveProxy : function(parentNode, before){
+ if(this.proxy){
+ parentNode.insertBefore(this.proxy.dom, before);
+ }
+ }
+});
+
+
+Ext.Panel.DD = Ext.extend(Ext.dd.DragSource, {
+
+ constructor : function(panel, cfg){
+ this.panel = panel;
+ this.dragData = {panel: panel};
+ this.proxy = new Ext.dd.PanelProxy(panel, cfg);
+ Ext.Panel.DD.superclass.constructor.call(this, panel.el, cfg);
+ var h = panel.header,
+ el = panel.body;
+ if(h){
+ this.setHandleElId(h.id);
+ el = panel.header;
+ }
+ el.setStyle('cursor', 'move');
+ this.scroll = false;
+ },
+
+ showFrame: Ext.emptyFn,
+ startDrag: Ext.emptyFn,
+ b4StartDrag: function(x, y) {
+ this.proxy.show();
+ },
+ b4MouseDown: function(e) {
+ var x = e.getPageX(),
+ y = e.getPageY();
+ this.autoOffset(x, y);
+ },
+ onInitDrag : function(x, y){
+ this.onStartDrag(x, y);
+ return true;
+ },
+ createFrame : Ext.emptyFn,
+ getDragEl : function(e){
+ return this.proxy.ghost.dom;
+ },
+ endDrag : function(e){
+ this.proxy.hide();
+ this.panel.saveState();
+ },
+
+ autoOffset : function(x, y) {
+ x -= this.startPageX;
+ y -= this.startPageY;
+ this.setDelta(x, y);
+ }
+});
+Ext.state.Provider = Ext.extend(Ext.util.Observable, {
+
+ constructor : function(){
+
+ this.addEvents("statechange");
+ this.state = {};
+ Ext.state.Provider.superclass.constructor.call(this);
+ },
+
+
+ get : function(name, defaultValue){
+ return typeof this.state[name] == "undefined" ?
+ defaultValue : this.state[name];
+ },
+
+
+ clear : function(name){
+ delete this.state[name];
+ this.fireEvent("statechange", this, name, null);
+ },
+
+
+ set : function(name, value){
+ this.state[name] = value;
+ this.fireEvent("statechange", this, name, value);
+ },
+
+
+ decodeValue : function(cookie){
+
+ var re = /^(a|n|d|b|s|o|e)\:(.*)$/,
+ matches = re.exec(unescape(cookie)),
+ all,
+ type,
+ v,
+ kv;
+ if(!matches || !matches[1]){
+ return;
+ }
+ type = matches[1];
+ v = matches[2];
+ switch(type){
+ case 'e':
+ return null;
+ case 'n':
+ return parseFloat(v);
+ case 'd':
+ return new Date(Date.parse(v));
+ case 'b':
+ return (v == '1');
+ case 'a':
+ all = [];
+ if(v != ''){
+ Ext.each(v.split('^'), function(val){
+ all.push(this.decodeValue(val));
+ }, this);
+ }
+ return all;
+ case 'o':
+ all = {};
+ if(v != ''){
+ Ext.each(v.split('^'), function(val){
+ kv = val.split('=');
+ all[kv[0]] = this.decodeValue(kv[1]);
+ }, this);
+ }
+ return all;
+ default:
+ return v;
+ }
+ },
+
+
+ encodeValue : function(v){
+ var enc,
+ flat = '',
+ i = 0,
+ len,
+ key;
+ if(v == null){
+ return 'e:1';
+ }else if(typeof v == 'number'){
+ enc = 'n:' + v;
+ }else if(typeof v == 'boolean'){
+ enc = 'b:' + (v ? '1' : '0');
+ }else if(Ext.isDate(v)){
+ enc = 'd:' + v.toGMTString();
+ }else if(Ext.isArray(v)){
+ for(len = v.length; i < len; i++){
+ flat += this.encodeValue(v[i]);
+ if(i != len - 1){
+ flat += '^';
+ }
+ }
+ enc = 'a:' + flat;
+ }else if(typeof v == 'object'){
+ for(key in v){
+ if(typeof v[key] != 'function' && v[key] !== undefined){
+ flat += key + '=' + this.encodeValue(v[key]) + '^';
+ }
+ }
+ enc = 'o:' + flat.substring(0, flat.length-1);
+ }else{
+ enc = 's:' + v;
+ }
+ return escape(enc);
+ }
+});
+
+Ext.state.Manager = function(){
+ var provider = new Ext.state.Provider();
+
+ return {
+
+ setProvider : function(stateProvider){
+ provider = stateProvider;
+ },
+
+
+ get : function(key, defaultValue){
+ return provider.get(key, defaultValue);
+ },
+
+
+ set : function(key, value){
+ provider.set(key, value);
+ },
+
+
+ clear : function(key){
+ provider.clear(key);
+ },
+
+
+ getProvider : function(){
+ return provider;
+ }
+ };
+}();
+
+Ext.state.CookieProvider = Ext.extend(Ext.state.Provider, {
+
+ constructor : function(config){
+ Ext.state.CookieProvider.superclass.constructor.call(this);
+ this.path = "/";
+ this.expires = new Date(new Date().getTime()+(1000*60*60*24*7));
+ this.domain = null;
+ this.secure = false;
+ Ext.apply(this, config);
+ this.state = this.readCookies();
+ },
+
+
+ set : function(name, value){
+ if(typeof value == "undefined" || value === null){
+ this.clear(name);
+ return;
+ }
+ this.setCookie(name, value);
+ Ext.state.CookieProvider.superclass.set.call(this, name, value);
+ },
+
+
+ clear : function(name){
+ this.clearCookie(name);
+ Ext.state.CookieProvider.superclass.clear.call(this, name);
+ },
+
+
+ readCookies : function(){
+ var cookies = {},
+ c = document.cookie + ";",
+ re = /\s?(.*?)=(.*?);/g,
+ matches,
+ name,
+ value;
+ while((matches = re.exec(c)) != null){
+ name = matches[1];
+ value = matches[2];
+ if(name && name.substring(0,3) == "ys-"){
+ cookies[name.substr(3)] = this.decodeValue(value);
+ }
+ }
+ return cookies;
+ },
+
+
+ setCookie : function(name, value){
+ document.cookie = "ys-"+ name + "=" + this.encodeValue(value) +
+ ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) +
+ ((this.path == null) ? "" : ("; path=" + this.path)) +
+ ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
+ ((this.secure == true) ? "; secure" : "");
+ },
+
+
+ clearCookie : function(name){
+ document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +
+ ((this.path == null) ? "" : ("; path=" + this.path)) +
+ ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
+ ((this.secure == true) ? "; secure" : "");
+ }
+});
+Ext.DataView = Ext.extend(Ext.BoxComponent, {
+
+
+
+
+
+
+
+
+
+ selectedClass : "x-view-selected",
+
+ emptyText : "",
+
+
+ deferEmptyText: true,
+
+ trackOver: false,
+
+
+ blockRefresh: false,
+
+
+ last: false,
+
+
+ initComponent : function(){
+ Ext.DataView.superclass.initComponent.call(this);
+ if(Ext.isString(this.tpl) || Ext.isArray(this.tpl)){
+ this.tpl = new Ext.XTemplate(this.tpl);
+ }
+
+ this.addEvents(
+
+ "beforeclick",
+
+ "click",
+
+ "mouseenter",
+
+ "mouseleave",
+
+ "containerclick",
+
+ "dblclick",
+
+ "contextmenu",
+
+ "containercontextmenu",
+
+ "selectionchange",
+
+
+ "beforeselect"
+ );
+
+ this.store = Ext.StoreMgr.lookup(this.store);
+ this.all = new Ext.CompositeElementLite();
+ this.selected = new Ext.CompositeElementLite();
+ },
+
+
+ afterRender : function(){
+ Ext.DataView.superclass.afterRender.call(this);
+
+ this.mon(this.getTemplateTarget(), {
+ "click": this.onClick,
+ "dblclick": this.onDblClick,
+ "contextmenu": this.onContextMenu,
+ scope:this
+ });
+
+ if(this.overClass || this.trackOver){
+ this.mon(this.getTemplateTarget(), {
+ "mouseover": this.onMouseOver,
+ "mouseout": this.onMouseOut,
+ scope:this
+ });
+ }
+
+ if(this.store){
+ this.bindStore(this.store, true);
+ }
+ },
+
+
+ refresh : function() {
+ this.clearSelections(false, true);
+ var el = this.getTemplateTarget(),
+ records = this.store.getRange();
+
+ el.update('');
+ if(records.length < 1){
+ if(!this.deferEmptyText || this.hasSkippedEmptyText){
+ el.update(this.emptyText);
+ }
+ this.all.clear();
+ }else{
+ this.tpl.overwrite(el, this.collectData(records, 0));
+ this.all.fill(Ext.query(this.itemSelector, el.dom));
+ this.updateIndexes(0);
+ }
+ this.hasSkippedEmptyText = true;
+ },
+
+ getTemplateTarget: function(){
+ return this.el;
+ },
+
+
+ prepareData : function(data){
+ return data;
+ },
+
+
+ collectData : function(records, startIndex){
+ var r = [],
+ i = 0,
+ len = records.length;
+ for(; i < len; i++){
+ r[r.length] = this.prepareData(records[i].data, startIndex + i, records[i]);
+ }
+ return r;
+ },
+
+
+ bufferRender : function(records, index){
+ var div = document.createElement('div');
+ this.tpl.overwrite(div, this.collectData(records, index));
+ return Ext.query(this.itemSelector, div);
+ },
+
+
+ onUpdate : function(ds, record){
+ var index = this.store.indexOf(record);
+ if(index > -1){
+ var sel = this.isSelected(index),
+ original = this.all.elements[index],
+ node = this.bufferRender([record], index)[0];
+
+ this.all.replaceElement(index, node, true);
+ if(sel){
+ this.selected.replaceElement(original, node);
+ this.all.item(index).addClass(this.selectedClass);
+ }
+ this.updateIndexes(index, index);
+ }
+ },
+
+
+ onAdd : function(ds, records, index){
+ if(this.all.getCount() === 0){
+ this.refresh();
+ return;
+ }
+ var nodes = this.bufferRender(records, index), n, a = this.all.elements;
+ if(index < this.all.getCount()){
+ n = this.all.item(index).insertSibling(nodes, 'before', true);
+ a.splice.apply(a, [index, 0].concat(nodes));
+ }else{
+ n = this.all.last().insertSibling(nodes, 'after', true);
+ a.push.apply(a, nodes);
+ }
+ this.updateIndexes(index);
+ },
+
+
+ onRemove : function(ds, record, index){
+ this.deselect(index);
+ this.all.removeElement(index, true);
+ this.updateIndexes(index);
+ if (this.store.getCount() === 0){
+ this.refresh();
+ }
+ },
+
+
+ refreshNode : function(index){
+ this.onUpdate(this.store, this.store.getAt(index));
+ },
+
+
+ updateIndexes : function(startIndex, endIndex){
+ var ns = this.all.elements;
+ startIndex = startIndex || 0;
+ endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length - 1));
+ for(var i = startIndex; i <= endIndex; i++){
+ ns[i].viewIndex = i;
+ }
+ },
+
+
+ getStore : function(){
+ return this.store;
+ },
+
+
+ bindStore : function(store, initial){
+ if(!initial && this.store){
+ if(store !== this.store && this.store.autoDestroy){
+ this.store.destroy();
+ }else{
+ this.store.un("beforeload", this.onBeforeLoad, this);
+ this.store.un("datachanged", this.onDataChanged, this);
+ this.store.un("add", this.onAdd, this);
+ this.store.un("remove", this.onRemove, this);
+ this.store.un("update", this.onUpdate, this);
+ this.store.un("clear", this.refresh, this);
+ }
+ if(!store){
+ this.store = null;
+ }
+ }
+ if(store){
+ store = Ext.StoreMgr.lookup(store);
+ store.on({
+ scope: this,
+ beforeload: this.onBeforeLoad,
+ datachanged: this.onDataChanged,
+ add: this.onAdd,
+ remove: this.onRemove,
+ update: this.onUpdate,
+ clear: this.refresh
+ });
+ }
+ this.store = store;
+ if(store){
+ this.refresh();
+ }
+ },
+
+
+ onDataChanged: function() {
+ if (this.blockRefresh !== true) {
+ this.refresh.apply(this, arguments);
+ }
+ },
+
+
+ findItemFromChild : function(node){
+ return Ext.fly(node).findParent(this.itemSelector, this.getTemplateTarget());
+ },
+
+
+ onClick : function(e){
+ var item = e.getTarget(this.itemSelector, this.getTemplateTarget()),
+ index;
+ if(item){
+ index = this.indexOf(item);
+ if(this.onItemClick(item, index, e) !== false){
+ this.fireEvent("click", this, index, item, e);
+ }
+ }else{
+ if(this.fireEvent("containerclick", this, e) !== false){
+ this.onContainerClick(e);
+ }
+ }
+ },
+
+ onContainerClick : function(e){
+ this.clearSelections();
+ },
+
+
+ onContextMenu : function(e){
+ var item = e.getTarget(this.itemSelector, this.getTemplateTarget());
+ if(item){
+ this.fireEvent("contextmenu", this, this.indexOf(item), item, e);
+ }else{
+ this.fireEvent("containercontextmenu", this, e);
+ }
+ },
+
+
+ onDblClick : function(e){
+ var item = e.getTarget(this.itemSelector, this.getTemplateTarget());
+ if(item){
+ this.fireEvent("dblclick", this, this.indexOf(item), item, e);
+ }
+ },
+
+
+ onMouseOver : function(e){
+ var item = e.getTarget(this.itemSelector, this.getTemplateTarget());
+ if(item && item !== this.lastItem){
+ this.lastItem = item;
+ Ext.fly(item).addClass(this.overClass);
+ this.fireEvent("mouseenter", this, this.indexOf(item), item, e);
+ }
+ },
+
+
+ onMouseOut : function(e){
+ if(this.lastItem){
+ if(!e.within(this.lastItem, true, true)){
+ Ext.fly(this.lastItem).removeClass(this.overClass);
+ this.fireEvent("mouseleave", this, this.indexOf(this.lastItem), this.lastItem, e);
+ delete this.lastItem;
+ }
+ }
+ },
+
+
+ onItemClick : function(item, index, e){
+ if(this.fireEvent("beforeclick", this, index, item, e) === false){
+ return false;
+ }
+ if(this.multiSelect){
+ this.doMultiSelection(item, index, e);
+ e.preventDefault();
+ }else if(this.singleSelect){
+ this.doSingleSelection(item, index, e);
+ e.preventDefault();
+ }
+ return true;
+ },
+
+
+ doSingleSelection : function(item, index, e){
+ if(e.ctrlKey && this.isSelected(index)){
+ this.deselect(index);
+ }else{
+ this.select(index, false);
+ }
+ },
+
+
+ doMultiSelection : function(item, index, e){
+ if(e.shiftKey && this.last !== false){
+ var last = this.last;
+ this.selectRange(last, index, e.ctrlKey);
+ this.last = last;
+ }else{
+ if((e.ctrlKey||this.simpleSelect) && this.isSelected(index)){
+ this.deselect(index);
+ }else{
+ this.select(index, e.ctrlKey || e.shiftKey || this.simpleSelect);
+ }
+ }
+ },
+
+
+ getSelectionCount : function(){
+ return this.selected.getCount();
+ },
+
+
+ getSelectedNodes : function(){
+ return this.selected.elements;
+ },
+
+
+ getSelectedIndexes : function(){
+ var indexes = [],
+ selected = this.selected.elements,
+ i = 0,
+ len = selected.length;
+
+ for(; i < len; i++){
+ indexes.push(selected[i].viewIndex);
+ }
+ return indexes;
+ },
+
+
+ getSelectedRecords : function(){
+ return this.getRecords(this.selected.elements);
+ },
+
+
+ getRecords : function(nodes){
+ var records = [],
+ i = 0,
+ len = nodes.length;
+
+ for(; i < len; i++){
+ records[records.length] = this.store.getAt(nodes[i].viewIndex);
+ }
+ return records;
+ },
+
+
+ getRecord : function(node){
+ return this.store.getAt(node.viewIndex);
+ },
+
+
+ clearSelections : function(suppressEvent, skipUpdate){
+ if((this.multiSelect || this.singleSelect) && this.selected.getCount() > 0){
+ if(!skipUpdate){
+ this.selected.removeClass(this.selectedClass);
+ }
+ this.selected.clear();
+ this.last = false;
+ if(!suppressEvent){
+ this.fireEvent("selectionchange", this, this.selected.elements);
+ }
+ }
+ },
+
+
+ isSelected : function(node){
+ return this.selected.contains(this.getNode(node));
+ },
+
+
+ deselect : function(node){
+ if(this.isSelected(node)){
+ node = this.getNode(node);
+ this.selected.removeElement(node);
+ if(this.last == node.viewIndex){
+ this.last = false;
+ }
+ Ext.fly(node).removeClass(this.selectedClass);
+ this.fireEvent("selectionchange", this, this.selected.elements);
+ }
+ },
+
+
+ select : function(nodeInfo, keepExisting, suppressEvent){
+ if(Ext.isArray(nodeInfo)){
+ if(!keepExisting){
+ this.clearSelections(true);
+ }
+ for(var i = 0, len = nodeInfo.length; i < len; i++){
+ this.select(nodeInfo[i], true, true);
+ }
+ if(!suppressEvent){
+ this.fireEvent("selectionchange", this, this.selected.elements);
+ }
+ } else{
+ var node = this.getNode(nodeInfo);
+ if(!keepExisting){
+ this.clearSelections(true);
+ }
+ if(node && !this.isSelected(node)){
+ if(this.fireEvent("beforeselect", this, node, this.selected.elements) !== false){
+ Ext.fly(node).addClass(this.selectedClass);
+ this.selected.add(node);
+ this.last = node.viewIndex;
+ if(!suppressEvent){
+ this.fireEvent("selectionchange", this, this.selected.elements);
+ }
+ }
+ }
+ }
+ },
+
+
+ selectRange : function(start, end, keepExisting){
+ if(!keepExisting){
+ this.clearSelections(true);
+ }
+ this.select(this.getNodes(start, end), true);
+ },
+
+
+ getNode : function(nodeInfo){
+ if(Ext.isString(nodeInfo)){
+ return document.getElementById(nodeInfo);
+ }else if(Ext.isNumber(nodeInfo)){
+ return this.all.elements[nodeInfo];
+ }else if(nodeInfo instanceof Ext.data.Record){
+ var idx = this.store.indexOf(nodeInfo);
+ return this.all.elements[idx];
+ }
+ return nodeInfo;
+ },
+
+
+ getNodes : function(start, end){
+ var ns = this.all.elements,
+ nodes = [],
+ i;
+
+ start = start || 0;
+ end = !Ext.isDefined(end) ? Math.max(ns.length - 1, 0) : end;
+ if(start <= end){
+ for(i = start; i <= end && ns[i]; i++){
+ nodes.push(ns[i]);
+ }
+ } else{
+ for(i = start; i >= end && ns[i]; i--){
+ nodes.push(ns[i]);
+ }
+ }
+ return nodes;
+ },
+
+
+ indexOf : function(node){
+ node = this.getNode(node);
+ if(Ext.isNumber(node.viewIndex)){
+ return node.viewIndex;
+ }
+ return this.all.indexOf(node);
+ },
+
+
+ onBeforeLoad : function(){
+ if(this.loadingText){
+ this.clearSelections(false, true);
+ this.getTemplateTarget().update('<div class="loading-indicator">'+this.loadingText+'</div>');
+ this.all.clear();
+ }
+ },
+
+ onDestroy : function(){
+ this.all.clear();
+ this.selected.clear();
+ Ext.DataView.superclass.onDestroy.call(this);
+ this.bindStore(null);
+ }
+});
+
+
+Ext.DataView.prototype.setStore = Ext.DataView.prototype.bindStore;
+
+Ext.reg('dataview', Ext.DataView);
+
+Ext.list.ListView = Ext.extend(Ext.DataView, {
+
+
+
+ itemSelector: 'dl',
+
+ selectedClass:'x-list-selected',
+
+ overClass:'x-list-over',
+
+
+ scrollOffset : undefined,
+
+ columnResize: true,
+
+
+ columnSort: true,
+
+
+
+ maxColumnWidth: Ext.isIE9m ? 99 : 100,
+
+ initComponent : function(){
+ if(this.columnResize){
+ this.colResizer = new Ext.list.ColumnResizer(this.colResizer);
+ this.colResizer.init(this);
+ }
+ if(this.columnSort){
+ this.colSorter = new Ext.list.Sorter(this.columnSort);
+ this.colSorter.init(this);
+ }
+ if(!this.internalTpl){
+ this.internalTpl = new Ext.XTemplate(
+ '<div class="x-list-header"><div class="x-list-header-inner">',
+ '<tpl for="columns">',
+ '<div style="width:{[values.width*100]}%;text-align:{align};"><em class="x-unselectable" unselectable="on" id="',this.id, '-xlhd-{#}">',
+ '{header}',
+ '</em></div>',
+ '</tpl>',
+ '<div class="x-clear"></div>',
+ '</div></div>',
+ '<div class="x-list-body"><div class="x-list-body-inner">',
+ '</div></div>'
+ );
+ }
+ if(!this.tpl){
+ this.tpl = new Ext.XTemplate(
+ '<tpl for="rows">',
+ '<dl>',
+ '<tpl for="parent.columns">',
+ '<dt style="width:{[values.width*100]}%;text-align:{align};">',
+ '<em unselectable="on"<tpl if="cls"> class="{cls}</tpl>">',
+ '{[values.tpl.apply(parent)]}',
+ '</em></dt>',
+ '</tpl>',
+ '<div class="x-clear"></div>',
+ '</dl>',
+ '</tpl>'
+ );
+ };
+
+ var cs = this.columns,
+ allocatedWidth = 0,
+ colsWithWidth = 0,
+ len = cs.length,
+ columns = [];
+
+ for(var i = 0; i < len; i++){
+ var c = cs[i];
+ if(!c.isColumn) {
+ c.xtype = c.xtype ? (/^lv/.test(c.xtype) ? c.xtype : 'lv' + c.xtype) : 'lvcolumn';
+ c = Ext.create(c);
+ }
+ if(c.width) {
+ allocatedWidth += c.width*100;
+ if(allocatedWidth > this.maxColumnWidth){
+ c.width -= (allocatedWidth - this.maxColumnWidth) / 100;
+ }
+ colsWithWidth++;
+ }
+ columns.push(c);
+ }
+
+ cs = this.columns = columns;
+
+
+ if(colsWithWidth < len){
+ var remaining = len - colsWithWidth;
+ if(allocatedWidth < this.maxColumnWidth){
+ var perCol = ((this.maxColumnWidth-allocatedWidth) / remaining)/100;
+ for(var j = 0; j < len; j++){
+ var c = cs[j];
+ if(!c.width){
+ c.width = perCol;
+ }
+ }
+ }
+ }
+ Ext.list.ListView.superclass.initComponent.call(this);
+ },
+
+ onRender : function(){
+ this.autoEl = {
+ cls: 'x-list-wrap'
+ };
+ Ext.list.ListView.superclass.onRender.apply(this, arguments);
+
+ this.internalTpl.overwrite(this.el, {columns: this.columns});
+
+ this.innerBody = Ext.get(this.el.dom.childNodes[1].firstChild);
+ this.innerHd = Ext.get(this.el.dom.firstChild.firstChild);
+
+ if(this.hideHeaders){
+ this.el.dom.firstChild.style.display = 'none';
+ }
+ },
+
+ getTemplateTarget : function(){
+ return this.innerBody;
+ },
+
+
+ collectData : function(){
+ var rs = Ext.list.ListView.superclass.collectData.apply(this, arguments);
+ return {
+ columns: this.columns,
+ rows: rs
+ };
+ },
+
+ verifyInternalSize : function(){
+ if(this.lastSize){
+ this.onResize(this.lastSize.width, this.lastSize.height);
+ }
+ },
+
+
+ onResize : function(w, h){
+ var body = this.innerBody.dom,
+ header = this.innerHd.dom,
+ scrollWidth = w - Ext.num(this.scrollOffset, Ext.getScrollBarWidth()) + 'px',
+ parentNode;
+
+ if(!body){
+ return;
+ }
+ parentNode = body.parentNode;
+ if(Ext.isNumber(w)){
+ if(this.reserveScrollOffset || ((parentNode.offsetWidth - parentNode.clientWidth) > 10)){
+ body.style.width = scrollWidth;
+ header.style.width = scrollWidth;
+ }else{
+ body.style.width = w + 'px';
+ header.style.width = w + 'px';
+ setTimeout(function(){
+ if((parentNode.offsetWidth - parentNode.clientWidth) > 10){
+ body.style.width = scrollWidth;
+ header.style.width = scrollWidth;
+ }
+ }, 10);
+ }
+ }
+ if(Ext.isNumber(h)){
+ parentNode.style.height = Math.max(0, h - header.parentNode.offsetHeight) + 'px';
+ }
+ },
+
+ updateIndexes : function(){
+ Ext.list.ListView.superclass.updateIndexes.apply(this, arguments);
+ this.verifyInternalSize();
+ },
+
+ findHeaderIndex : function(header){
+ header = header.dom || header;
+ var parentNode = header.parentNode,
+ children = parentNode.parentNode.childNodes,
+ i = 0,
+ c;
+ for(; c = children[i]; i++){
+ if(c == parentNode){
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ setHdWidths : function(){
+ var els = this.innerHd.dom.getElementsByTagName('div'),
+ i = 0,
+ columns = this.columns,
+ len = columns.length;
+
+ for(; i < len; i++){
+ els[i].style.width = (columns[i].width*100) + '%';
+ }
+ }
+});
+
+Ext.reg('listview', Ext.list.ListView);
+
+
+Ext.ListView = Ext.list.ListView;
+Ext.list.Column = Ext.extend(Object, {
+
+ isColumn: true,
+
+
+ align: 'left',
+
+ header: '',
+
+
+ width: null,
+
+
+ cls: '',
+
+
+
+
+
+ constructor : function(c){
+ if(!c.tpl){
+ c.tpl = new Ext.XTemplate('{' + c.dataIndex + '}');
+ }
+ else if(Ext.isString(c.tpl)){
+ c.tpl = new Ext.XTemplate(c.tpl);
+ }
+
+ Ext.apply(this, c);
+ }
+});
+
+Ext.reg('lvcolumn', Ext.list.Column);
+
+
+Ext.list.NumberColumn = Ext.extend(Ext.list.Column, {
+
+ format: '0,000.00',
+
+ constructor : function(c) {
+ c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':number("' + (c.format || this.format) + '")}');
+ Ext.list.NumberColumn.superclass.constructor.call(this, c);
+ }
+});
+
+Ext.reg('lvnumbercolumn', Ext.list.NumberColumn);
+
+
+Ext.list.DateColumn = Ext.extend(Ext.list.Column, {
+ format: 'm/d/Y',
+ constructor : function(c) {
+ c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':date("' + (c.format || this.format) + '")}');
+ Ext.list.DateColumn.superclass.constructor.call(this, c);
+ }
+});
+Ext.reg('lvdatecolumn', Ext.list.DateColumn);
+
+
+Ext.list.BooleanColumn = Ext.extend(Ext.list.Column, {
+
+ trueText: 'true',
+
+ falseText: 'false',
+
+ undefinedText: '&#160;',
+
+ constructor : function(c) {
+ c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':this.format}');
+
+ var t = this.trueText, f = this.falseText, u = this.undefinedText;
+ c.tpl.format = function(v){
+ if(v === undefined){
+ return u;
+ }
+ if(!v || v === 'false'){
+ return f;
+ }
+ return t;
+ };
+
+ Ext.list.DateColumn.superclass.constructor.call(this, c);
+ }
+});
+
+Ext.reg('lvbooleancolumn', Ext.list.BooleanColumn);
+Ext.list.ColumnResizer = Ext.extend(Ext.util.Observable, {
+
+ minPct: .05,
+
+ constructor: function(config){
+ Ext.apply(this, config);
+ Ext.list.ColumnResizer.superclass.constructor.call(this);
+ },
+ init : function(listView){
+ this.view = listView;
+ listView.on('render', this.initEvents, this);
+ },
+
+ initEvents : function(view){
+ view.mon(view.innerHd, 'mousemove', this.handleHdMove, this);
+ this.tracker = new Ext.dd.DragTracker({
+ onBeforeStart: this.onBeforeStart.createDelegate(this),
+ onStart: this.onStart.createDelegate(this),
+ onDrag: this.onDrag.createDelegate(this),
+ onEnd: this.onEnd.createDelegate(this),
+ tolerance: 3,
+ autoStart: 300
+ });
+ this.tracker.initEl(view.innerHd);
+ view.on('beforedestroy', this.tracker.destroy, this.tracker);
+ },
+
+ handleHdMove : function(e, t){
+ var handleWidth = 5,
+ x = e.getPageX(),
+ header = e.getTarget('em', 3, true);
+ if(header){
+ var region = header.getRegion(),
+ style = header.dom.style,
+ parentNode = header.dom.parentNode;
+
+ if(x - region.left <= handleWidth && parentNode != parentNode.parentNode.firstChild){
+ this.activeHd = Ext.get(parentNode.previousSibling.firstChild);
+ style.cursor = Ext.isWebKit ? 'e-resize' : 'col-resize';
+ } else if(region.right - x <= handleWidth && parentNode != parentNode.parentNode.lastChild.previousSibling){
+ this.activeHd = header;
+ style.cursor = Ext.isWebKit ? 'w-resize' : 'col-resize';
+ } else{
+ delete this.activeHd;
+ style.cursor = '';
+ }
+ }
+ },
+
+ onBeforeStart : function(e){
+ this.dragHd = this.activeHd;
+ return !!this.dragHd;
+ },
+
+ onStart: function(e){
+
+ var me = this,
+ view = me.view,
+ dragHeader = me.dragHd,
+ x = me.tracker.getXY()[0];
+
+ me.proxy = view.el.createChild({cls:'x-list-resizer'});
+ me.dragX = dragHeader.getX();
+ me.headerIndex = view.findHeaderIndex(dragHeader);
+
+ me.headersDisabled = view.disableHeaders;
+ view.disableHeaders = true;
+
+ me.proxy.setHeight(view.el.getHeight());
+ me.proxy.setX(me.dragX);
+ me.proxy.setWidth(x - me.dragX);
+
+ this.setBoundaries();
+
+ },
+
+
+ setBoundaries: function(relativeX){
+ var view = this.view,
+ headerIndex = this.headerIndex,
+ width = view.innerHd.getWidth(),
+ relativeX = view.innerHd.getX(),
+ minWidth = Math.ceil(width * this.minPct),
+ maxWidth = width - minWidth,
+ numColumns = view.columns.length,
+ headers = view.innerHd.select('em', true),
+ minX = minWidth + relativeX,
+ maxX = maxWidth + relativeX,
+ header;
+
+ if (numColumns == 2) {
+ this.minX = minX;
+ this.maxX = maxX;
+ }else{
+ header = headers.item(headerIndex + 2);
+ this.minX = headers.item(headerIndex).getX() + minWidth;
+ this.maxX = header ? header.getX() - minWidth : maxX;
+ if (headerIndex == 0) {
+
+ this.minX = minX;
+ } else if (headerIndex == numColumns - 2) {
+
+ this.maxX = maxX;
+ }
+ }
+ },
+
+ onDrag: function(e){
+ var me = this,
+ cursorX = me.tracker.getXY()[0].constrain(me.minX, me.maxX);
+
+ me.proxy.setWidth(cursorX - this.dragX);
+ },
+
+ onEnd: function(e){
+
+ var newWidth = this.proxy.getWidth(),
+ index = this.headerIndex,
+ view = this.view,
+ columns = view.columns,
+ width = view.innerHd.getWidth(),
+ newPercent = Math.ceil(newWidth * view.maxColumnWidth / width) / 100,
+ disabled = this.headersDisabled,
+ headerCol = columns[index],
+ otherCol = columns[index + 1],
+ totalPercent = headerCol.width + otherCol.width;
+
+ this.proxy.remove();
+
+ headerCol.width = newPercent;
+ otherCol.width = totalPercent - newPercent;
+
+ delete this.dragHd;
+ view.setHdWidths();
+ view.refresh();
+
+ setTimeout(function(){
+ view.disableHeaders = disabled;
+ }, 100);
+ }
+});
+
+
+Ext.ListView.ColumnResizer = Ext.list.ColumnResizer;
+Ext.list.Sorter = Ext.extend(Ext.util.Observable, {
+
+ sortClasses : ["sort-asc", "sort-desc"],
+
+ constructor: function(config){
+ Ext.apply(this, config);
+ Ext.list.Sorter.superclass.constructor.call(this);
+ },
+
+ init : function(listView){
+ this.view = listView;
+ listView.on('render', this.initEvents, this);
+ },
+
+ initEvents : function(view){
+ view.mon(view.innerHd, 'click', this.onHdClick, this);
+ view.innerHd.setStyle('cursor', 'pointer');
+ view.mon(view.store, 'datachanged', this.updateSortState, this);
+ this.updateSortState.defer(10, this, [view.store]);
+ },
+
+ updateSortState : function(store){
+ var state = store.getSortState();
+ if(!state){
+ return;
+ }
+ this.sortState = state;
+ var cs = this.view.columns, sortColumn = -1;
+ for(var i = 0, len = cs.length; i < len; i++){
+ if(cs[i].dataIndex == state.field){
+ sortColumn = i;
+ break;
+ }
+ }
+ if(sortColumn != -1){
+ var sortDir = state.direction;
+ this.updateSortIcon(sortColumn, sortDir);
+ }
+ },
+
+ updateSortIcon : function(col, dir){
+ var sc = this.sortClasses;
+ var hds = this.view.innerHd.select('em').removeClass(sc);
+ hds.item(col).addClass(sc[dir == "DESC" ? 1 : 0]);
+ },
+
+ onHdClick : function(e){
+ var hd = e.getTarget('em', 3);
+ if(hd && !this.view.disableHeaders){
+ var index = this.view.findHeaderIndex(hd);
+ this.view.store.sort(this.view.columns[index].dataIndex);
+ }
+ }
+});
+
+
+Ext.ListView.Sorter = Ext.list.Sorter;
+Ext.TabPanel = Ext.extend(Ext.Panel, {
+
+
+
+ deferredRender : true,
+
+ tabWidth : 120,
+
+ minTabWidth : 30,
+
+ resizeTabs : false,
+
+ enableTabScroll : false,
+
+ scrollIncrement : 0,
+
+ scrollRepeatInterval : 400,
+
+ scrollDuration : 0.35,
+
+ animScroll : true,
+
+ tabPosition : 'top',
+
+ baseCls : 'x-tab-panel',
+
+ autoTabs : false,
+
+ autoTabSelector : 'div.x-tab',
+
+ activeTab : undefined,
+
+ tabMargin : 2,
+
+ plain : false,
+
+ wheelIncrement : 20,
+
+
+ idDelimiter : '__',
+
+
+ itemCls : 'x-tab-item',
+
+
+ elements : 'body',
+ headerAsText : false,
+ frame : false,
+ hideBorders :true,
+
+
+ initComponent : function(){
+ this.frame = false;
+ Ext.TabPanel.superclass.initComponent.call(this);
+ this.addEvents(
+
+ 'beforetabchange',
+
+ 'tabchange',
+
+ 'contextmenu'
+ );
+
+ this.setLayout(new Ext.layout.CardLayout(Ext.apply({
+ layoutOnCardChange: this.layoutOnTabChange,
+ deferredRender: this.deferredRender
+ }, this.layoutConfig)));
+
+ if(this.tabPosition == 'top'){
+ this.elements += ',header';
+ this.stripTarget = 'header';
+ }else {
+ this.elements += ',footer';
+ this.stripTarget = 'footer';
+ }
+ if(!this.stack){
+ this.stack = Ext.TabPanel.AccessStack();
+ }
+ this.initItems();
+ },
+
+
+ onRender : function(ct, position){
+ Ext.TabPanel.superclass.onRender.call(this, ct, position);
+
+ if(this.plain){
+ var pos = this.tabPosition == 'top' ? 'header' : 'footer';
+ this[pos].addClass('x-tab-panel-'+pos+'-plain');
+ }
+
+ var st = this[this.stripTarget];
+
+ this.stripWrap = st.createChild({cls:'x-tab-strip-wrap', cn:{
+ tag:'ul', cls:'x-tab-strip x-tab-strip-'+this.tabPosition}});
+
+ var beforeEl = (this.tabPosition=='bottom' ? this.stripWrap : null);
+ st.createChild({cls:'x-tab-strip-spacer'}, beforeEl);
+ this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
+
+
+ this.edge = this.strip.createChild({tag:'li', cls:'x-tab-edge', cn: [{tag: 'span', cls: 'x-tab-strip-text', cn: '&#160;'}]});
+ this.strip.createChild({cls:'x-clear'});
+
+ this.body.addClass('x-tab-panel-body-'+this.tabPosition);
+
+
+ if(!this.itemTpl){
+ var tt = new Ext.Template(
+ '<li class="{cls}" id="{id}"><a class="x-tab-strip-close"></a>',
+ '<a class="x-tab-right" href="#"><em class="x-tab-left">',
+ '<span class="x-tab-strip-inner"><span class="x-tab-strip-text {iconCls}">{text}</span></span>',
+ '</em></a></li>'
+ );
+ tt.disableFormats = true;
+ tt.compile();
+ Ext.TabPanel.prototype.itemTpl = tt;
+ }
+
+ this.items.each(this.initTab, this);
+ },
+
+
+ afterRender : function(){
+ Ext.TabPanel.superclass.afterRender.call(this);
+ if(this.autoTabs){
+ this.readTabs(false);
+ }
+ if(this.activeTab !== undefined){
+ var item = Ext.isObject(this.activeTab) ? this.activeTab : this.items.get(this.activeTab);
+ delete this.activeTab;
+ this.setActiveTab(item);
+ }
+ },
+
+
+ initEvents : function(){
+ Ext.TabPanel.superclass.initEvents.call(this);
+ this.mon(this.strip, {
+ scope: this,
+ mousedown: this.onStripMouseDown,
+ contextmenu: this.onStripContextMenu
+ });
+ if(this.enableTabScroll){
+ this.mon(this.strip, 'mousewheel', this.onWheel, this);
+ }
+ },
+
+
+ findTargets : function(e){
+ var item = null,
+ itemEl = e.getTarget('li:not(.x-tab-edge)', this.strip);
+
+ if(itemEl){
+ item = this.getComponent(itemEl.id.split(this.idDelimiter)[1]);
+ if(item.disabled){
+ return {
+ close : null,
+ item : null,
+ el : null
+ };
+ }
+ }
+ return {
+ close : e.getTarget('.x-tab-strip-close', this.strip),
+ item : item,
+ el : itemEl
+ };
+ },
+
+
+ onStripMouseDown : function(e){
+ if(e.button !== 0){
+ return;
+ }
+ e.preventDefault();
+ var t = this.findTargets(e);
+ if(t.close){
+ if (t.item.fireEvent('beforeclose', t.item) !== false) {
+ t.item.fireEvent('close', t.item);
+ this.remove(t.item);
+ }
+ return;
+ }
+ if(t.item && t.item != this.activeTab){
+ this.setActiveTab(t.item);
+ }
+ },
+
+
+ onStripContextMenu : function(e){
+ e.preventDefault();
+ var t = this.findTargets(e);
+ if(t.item){
+ this.fireEvent('contextmenu', this, t.item, e);
+ }
+ },
+
+
+ readTabs : function(removeExisting){
+ if(removeExisting === true){
+ this.items.each(function(item){
+ this.remove(item);
+ }, this);
+ }
+ var tabs = this.el.query(this.autoTabSelector);
+ for(var i = 0, len = tabs.length; i < len; i++){
+ var tab = tabs[i],
+ title = tab.getAttribute('title');
+ tab.removeAttribute('title');
+ this.add({
+ title: title,
+ contentEl: tab
+ });
+ }
+ },
+
+
+ initTab : function(item, index){
+ var before = this.strip.dom.childNodes[index],
+ p = this.getTemplateArgs(item),
+ el = before ?
+ this.itemTpl.insertBefore(before, p) :
+ this.itemTpl.append(this.strip, p),
+ cls = 'x-tab-strip-over',
+ tabEl = Ext.get(el);
+
+ tabEl.hover(function(){
+ if(!item.disabled){
+ tabEl.addClass(cls);
+ }
+ }, function(){
+ tabEl.removeClass(cls);
+ });
+
+ if(item.tabTip){
+ tabEl.child('span.x-tab-strip-text', true).qtip = item.tabTip;
+ }
+ item.tabEl = el;
+
+
+ tabEl.select('a').on('click', function(e){
+ if(!e.getPageX()){
+ this.onStripMouseDown(e);
+ }
+ }, this, {preventDefault: true});
+
+ item.on({
+ scope: this,
+ disable: this.onItemDisabled,
+ enable: this.onItemEnabled,
+ titlechange: this.onItemTitleChanged,
+ iconchange: this.onItemIconChanged,
+ beforeshow: this.onBeforeShowItem
+ });
+ },
+
+
+
+
+ getTemplateArgs : function(item) {
+ var cls = item.closable ? 'x-tab-strip-closable' : '';
+ if(item.disabled){
+ cls += ' x-item-disabled';
+ }
+ if(item.iconCls){
+ cls += ' x-tab-with-icon';
+ }
+ if(item.tabCls){
+ cls += ' ' + item.tabCls;
+ }
+
+ return {
+ id: this.id + this.idDelimiter + item.getItemId(),
+ text: item.title,
+ cls: cls,
+ iconCls: item.iconCls || ''
+ };
+ },
+
+
+ onAdd : function(c){
+ Ext.TabPanel.superclass.onAdd.call(this, c);
+ if(this.rendered){
+ var items = this.items;
+ this.initTab(c, items.indexOf(c));
+ this.delegateUpdates();
+ }
+ },
+
+
+ onBeforeAdd : function(item){
+ var existing = item.events ? (this.items.containsKey(item.getItemId()) ? item : null) : this.items.get(item);
+ if(existing){
+ this.setActiveTab(item);
+ return false;
+ }
+ Ext.TabPanel.superclass.onBeforeAdd.apply(this, arguments);
+ var es = item.elements;
+ item.elements = es ? es.replace(',header', '') : es;
+ item.border = (item.border === true);
+ },
+
+
+ onRemove : function(c){
+ var te = Ext.get(c.tabEl);
+
+ if(te){
+ te.select('a').removeAllListeners();
+ Ext.destroy(te);
+ }
+ Ext.TabPanel.superclass.onRemove.call(this, c);
+ this.stack.remove(c);
+ delete c.tabEl;
+ c.un('disable', this.onItemDisabled, this);
+ c.un('enable', this.onItemEnabled, this);
+ c.un('titlechange', this.onItemTitleChanged, this);
+ c.un('iconchange', this.onItemIconChanged, this);
+ c.un('beforeshow', this.onBeforeShowItem, this);
+ if(c == this.activeTab){
+ var next = this.stack.next();
+ if(next){
+ this.setActiveTab(next);
+ }else if(this.items.getCount() > 0){
+ this.setActiveTab(0);
+ }else{
+ this.setActiveTab(null);
+ }
+ }
+ if(!this.destroying){
+ this.delegateUpdates();
+ }
+ },
+
+
+ onBeforeShowItem : function(item){
+ if(item != this.activeTab){
+ this.setActiveTab(item);
+ return false;
+ }
+ },
+
+
+ onItemDisabled : function(item){
+ var el = this.getTabEl(item);
+ if(el){
+ Ext.fly(el).addClass('x-item-disabled');
+ }
+ this.stack.remove(item);
+ },
+
+
+ onItemEnabled : function(item){
+ var el = this.getTabEl(item);
+ if(el){
+ Ext.fly(el).removeClass('x-item-disabled');
+ }
+ },
+
+
+ onItemTitleChanged : function(item){
+ var el = this.getTabEl(item);
+ if(el){
+ Ext.fly(el).child('span.x-tab-strip-text', true).innerHTML = item.title;
+ this.delegateUpdates();
+ }
+ },
+
+
+ onItemIconChanged : function(item, iconCls, oldCls){
+ var el = this.getTabEl(item);
+ if(el){
+ el = Ext.get(el);
+ el.child('span.x-tab-strip-text').replaceClass(oldCls, iconCls);
+ el[Ext.isEmpty(iconCls) ? 'removeClass' : 'addClass']('x-tab-with-icon');
+ this.delegateUpdates();
+ }
+ },
+
+
+ getTabEl : function(item){
+ var c = this.getComponent(item);
+ return c ? c.tabEl : null;
+ },
+
+
+ onResize : function(){
+ Ext.TabPanel.superclass.onResize.apply(this, arguments);
+ this.delegateUpdates();
+ },
+
+
+ beginUpdate : function(){
+ this.suspendUpdates = true;
+ },
+
+
+ endUpdate : function(){
+ this.suspendUpdates = false;
+ this.delegateUpdates();
+ },
+
+
+ hideTabStripItem : function(item){
+ item = this.getComponent(item);
+ var el = this.getTabEl(item);
+ if(el){
+ el.style.display = 'none';
+ this.delegateUpdates();
+ }
+ this.stack.remove(item);
+ },
+
+
+ unhideTabStripItem : function(item){
+ item = this.getComponent(item);
+ var el = this.getTabEl(item);
+ if(el){
+ el.style.display = '';
+ this.delegateUpdates();
+ }
+ },
+
+
+ delegateUpdates : function(){
+ var rendered = this.rendered;
+ if(this.suspendUpdates){
+ return;
+ }
+ if(this.resizeTabs && rendered){
+ this.autoSizeTabs();
+ }
+ if(this.enableTabScroll && rendered){
+ this.autoScrollTabs();
+ }
+ },
+
+
+ autoSizeTabs : function(){
+ var count = this.items.length,
+ ce = this.tabPosition != 'bottom' ? 'header' : 'footer',
+ ow = this[ce].dom.offsetWidth,
+ aw = this[ce].dom.clientWidth;
+
+ if(!this.resizeTabs || count < 1 || !aw){
+ return;
+ }
+
+ var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.tabMargin, this.tabWidth), this.minTabWidth);
+ this.lastTabWidth = each;
+ var lis = this.strip.query('li:not(.x-tab-edge)');
+ for(var i = 0, len = lis.length; i < len; i++) {
+ var li = lis[i],
+ inner = Ext.fly(li).child('.x-tab-strip-inner', true),
+ tw = li.offsetWidth,
+ iw = inner.offsetWidth;
+ inner.style.width = (each - (tw-iw)) + 'px';
+ }
+ },
+
+
+ adjustBodyWidth : function(w){
+ if(this.header){
+ this.header.setWidth(w);
+ }
+ if(this.footer){
+ this.footer.setWidth(w);
+ }
+ return w;
+ },
+
+
+ setActiveTab : function(item){
+ item = this.getComponent(item);
+ if(this.fireEvent('beforetabchange', this, item, this.activeTab) === false){
+ return;
+ }
+ if(!this.rendered){
+ this.activeTab = item;
+ return;
+ }
+ if(this.activeTab != item){
+ if(this.activeTab){
+ var oldEl = this.getTabEl(this.activeTab);
+ if(oldEl){
+ Ext.fly(oldEl).removeClass('x-tab-strip-active');
+ }
+ }
+ this.activeTab = item;
+ if(item){
+ var el = this.getTabEl(item);
+ Ext.fly(el).addClass('x-tab-strip-active');
+ this.stack.add(item);
+
+ this.layout.setActiveItem(item);
+
+ this.delegateUpdates();
+ if(this.scrolling){
+ this.scrollToTab(item, this.animScroll);
+ }
+ }
+ this.fireEvent('tabchange', this, item);
+ }
+ },
+
+
+ getActiveTab : function(){
+ return this.activeTab || null;
+ },
+
+
+ getItem : function(item){
+ return this.getComponent(item);
+ },
+
+
+ autoScrollTabs : function(){
+ this.pos = this.tabPosition=='bottom' ? this.footer : this.header;
+ var count = this.items.length,
+ ow = this.pos.dom.offsetWidth,
+ tw = this.pos.dom.clientWidth,
+ wrap = this.stripWrap,
+ wd = wrap.dom,
+ cw = wd.offsetWidth,
+ pos = this.getScrollPos(),
+ l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;
+
+ if(!this.enableTabScroll || cw < 20){
+ return;
+ }
+ if(count == 0 || l <= tw){
+
+ wd.scrollLeft = 0;
+ wrap.setWidth(tw);
+ if(this.scrolling){
+ this.scrolling = false;
+ this.pos.removeClass('x-tab-scrolling');
+ this.scrollLeft.hide();
+ this.scrollRight.hide();
+
+ if(Ext.isAir || Ext.isWebKit){
+ wd.style.marginLeft = '';
+ wd.style.marginRight = '';
+ }
+ }
+ }else{
+ if(!this.scrolling){
+ this.pos.addClass('x-tab-scrolling');
+
+ if(Ext.isAir || Ext.isWebKit){
+ wd.style.marginLeft = '18px';
+ wd.style.marginRight = '18px';
+ }
+ }
+ tw -= wrap.getMargins('lr');
+ wrap.setWidth(tw > 20 ? tw : 20);
+ if(!this.scrolling){
+ if(!this.scrollLeft){
+ this.createScrollers();
+ }else{
+ this.scrollLeft.show();
+ this.scrollRight.show();
+ }
+ }
+ this.scrolling = true;
+ if(pos > (l-tw)){
+ wd.scrollLeft = l-tw;
+ }else{
+ this.scrollToTab(this.activeTab, false);
+ }
+ this.updateScrollButtons();
+ }
+ },
+
+
+ createScrollers : function(){
+ this.pos.addClass('x-tab-scrolling-' + this.tabPosition);
+ var h = this.stripWrap.dom.offsetHeight;
+
+
+ var sl = this.pos.insertFirst({
+ cls:'x-tab-scroller-left'
+ });
+ sl.setHeight(h);
+ sl.addClassOnOver('x-tab-scroller-left-over');
+ this.leftRepeater = new Ext.util.ClickRepeater(sl, {
+ interval : this.scrollRepeatInterval,
+ handler: this.onScrollLeft,
+ scope: this
+ });
+ this.scrollLeft = sl;
+
+
+ var sr = this.pos.insertFirst({
+ cls:'x-tab-scroller-right'
+ });
+ sr.setHeight(h);
+ sr.addClassOnOver('x-tab-scroller-right-over');
+ this.rightRepeater = new Ext.util.ClickRepeater(sr, {
+ interval : this.scrollRepeatInterval,
+ handler: this.onScrollRight,
+ scope: this
+ });
+ this.scrollRight = sr;
+ },
+
+
+ getScrollWidth : function(){
+ return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();
+ },
+
+
+ getScrollPos : function(){
+ return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;
+ },
+
+
+ getScrollArea : function(){
+ return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;
+ },
+
+
+ getScrollAnim : function(){
+ return {duration:this.scrollDuration, callback: this.updateScrollButtons, scope: this};
+ },
+
+
+ getScrollIncrement : function(){
+ return this.scrollIncrement || (this.resizeTabs ? this.lastTabWidth+2 : 100);
+ },
+
+
+
+ scrollToTab : function(item, animate){
+ if(!item){
+ return;
+ }
+ var el = this.getTabEl(item),
+ pos = this.getScrollPos(),
+ area = this.getScrollArea(),
+ left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos,
+ right = left + el.offsetWidth;
+ if(left < pos){
+ this.scrollTo(left, animate);
+ }else if(right > (pos + area)){
+ this.scrollTo(right - area, animate);
+ }
+ },
+
+
+ scrollTo : function(pos, animate){
+ this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);
+ if(!animate){
+ this.updateScrollButtons();
+ }
+ },
+
+ onWheel : function(e){
+ var d = e.getWheelDelta()*this.wheelIncrement*-1;
+ e.stopEvent();
+
+ var pos = this.getScrollPos(),
+ newpos = pos + d,
+ sw = this.getScrollWidth()-this.getScrollArea();
+
+ var s = Math.max(0, Math.min(sw, newpos));
+ if(s != pos){
+ this.scrollTo(s, false);
+ }
+ },
+
+
+ onScrollRight : function(){
+ var sw = this.getScrollWidth()-this.getScrollArea(),
+ pos = this.getScrollPos(),
+ s = Math.min(sw, pos + this.getScrollIncrement());
+ if(s != pos){
+ this.scrollTo(s, this.animScroll);
+ }
+ },
+
+
+ onScrollLeft : function(){
+ var pos = this.getScrollPos(),
+ s = Math.max(0, pos - this.getScrollIncrement());
+ if(s != pos){
+ this.scrollTo(s, this.animScroll);
+ }
+ },
+
+
+ updateScrollButtons : function(){
+ var pos = this.getScrollPos();
+ this.scrollLeft[pos === 0 ? 'addClass' : 'removeClass']('x-tab-scroller-left-disabled');
+ this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('x-tab-scroller-right-disabled');
+ },
+
+
+ beforeDestroy : function() {
+ Ext.destroy(this.leftRepeater, this.rightRepeater);
+ this.deleteMembers('strip', 'edge', 'scrollLeft', 'scrollRight', 'stripWrap');
+ this.activeTab = null;
+ Ext.TabPanel.superclass.beforeDestroy.apply(this);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+});
+Ext.reg('tabpanel', Ext.TabPanel);
+
+
+Ext.TabPanel.prototype.activate = Ext.TabPanel.prototype.setActiveTab;
+
+
+Ext.TabPanel.AccessStack = function(){
+ var items = [];
+ return {
+ add : function(item){
+ items.push(item);
+ if(items.length > 10){
+ items.shift();
+ }
+ },
+
+ remove : function(item){
+ var s = [];
+ for(var i = 0, len = items.length; i < len; i++) {
+ if(items[i] != item){
+ s.push(items[i]);
+ }
+ }
+ items = s;
+ },
+
+ next : function(){
+ return items.pop();
+ }
+ };
+};
+
+Ext.Button = Ext.extend(Ext.BoxComponent, {
+
+ hidden : false,
+
+ disabled : false,
+
+ pressed : false,
+
+
+
+
+
+
+ enableToggle : false,
+
+
+
+ menuAlign : 'tl-bl?',
+
+
+
+
+ type : 'button',
+
+
+ menuClassTarget : 'tr:nth(2)',
+
+
+ clickEvent : 'click',
+
+
+ handleMouseEvents : true,
+
+
+ tooltipType : 'qtip',
+
+
+ buttonSelector : 'button:first-child',
+
+
+ scale : 'small',
+
+
+
+
+ iconAlign : 'left',
+
+
+ arrowAlign : 'right',
+
+
+
+
+
+
+ initComponent : function(){
+ if(this.menu){
+
+
+ if (Ext.isArray(this.menu)){
+ this.menu = { items: this.menu };
+ }
+
+
+
+ if (Ext.isObject(this.menu)){
+ this.menu.ownerCt = this;
+ }
+
+ this.menu = Ext.menu.MenuMgr.get(this.menu);
+ this.menu.ownerCt = undefined;
+ }
+
+ Ext.Button.superclass.initComponent.call(this);
+
+ this.addEvents(
+
+ 'click',
+
+ 'toggle',
+
+ 'mouseover',
+
+ 'mouseout',
+
+ 'menushow',
+
+ 'menuhide',
+
+ 'menutriggerover',
+
+ 'menutriggerout'
+ );
+
+ if(Ext.isString(this.toggleGroup)){
+ this.enableToggle = true;
+ }
+ },
+
+
+ getTemplateArgs : function(){
+ return [this.type, 'x-btn-' + this.scale + ' x-btn-icon-' + this.scale + '-' + this.iconAlign, this.getMenuClass(), this.cls, this.id];
+ },
+
+
+ setButtonClass : function(){
+ if(this.useSetClass){
+ if(!Ext.isEmpty(this.oldCls)){
+ this.el.removeClass([this.oldCls, 'x-btn-pressed']);
+ }
+ this.oldCls = (this.iconCls || this.icon) ? (this.text ? 'x-btn-text-icon' : 'x-btn-icon') : 'x-btn-noicon';
+ this.el.addClass([this.oldCls, this.pressed ? 'x-btn-pressed' : null]);
+ }
+ },
+
+
+ getMenuClass : function(){
+ return this.menu ? (this.arrowAlign != 'bottom' ? 'x-btn-arrow' : 'x-btn-arrow-bottom') : '';
+ },
+
+
+ onRender : function(ct, position){
+ if(!this.template){
+ if(!Ext.Button.buttonTemplate){
+
+ Ext.Button.buttonTemplate = new Ext.Template(
+ '<table id="{4}" cellspacing="0" class="x-btn {3}"><tbody class="{1}">',
+ '<tr><td class="x-btn-tl"><i>&#160;</i></td><td class="x-btn-tc"></td><td class="x-btn-tr"><i>&#160;</i></td></tr>',
+ '<tr><td class="x-btn-ml"><i>&#160;</i></td><td class="x-btn-mc"><em class="{2} x-unselectable" unselectable="on"><button type="{0}"></button></em></td><td class="x-btn-mr"><i>&#160;</i></td></tr>',
+ '<tr><td class="x-btn-bl"><i>&#160;</i></td><td class="x-btn-bc"></td><td class="x-btn-br"><i>&#160;</i></td></tr>',
+ '</tbody></table>');
+ Ext.Button.buttonTemplate.compile();
+ }
+ this.template = Ext.Button.buttonTemplate;
+ }
+
+ var btn, targs = this.getTemplateArgs();
+
+ if(position){
+ btn = this.template.insertBefore(position, targs, true);
+ }else{
+ btn = this.template.append(ct, targs, true);
+ }
+
+ this.btnEl = btn.child(this.buttonSelector);
+ this.mon(this.btnEl, {
+ scope: this,
+ focus: this.onFocus,
+ blur: this.onBlur
+ });
+
+ this.initButtonEl(btn, this.btnEl);
+
+ Ext.ButtonToggleMgr.register(this);
+ },
+
+
+ initButtonEl : function(btn, btnEl){
+ this.el = btn;
+ this.setIcon(this.icon);
+ this.setText(this.text);
+ this.setIconClass(this.iconCls);
+ if(Ext.isDefined(this.tabIndex)){
+ btnEl.dom.tabIndex = this.tabIndex;
+ }
+ if(this.tooltip){
+ this.setTooltip(this.tooltip, true);
+ }
+
+ if(this.handleMouseEvents){
+ this.mon(btn, {
+ scope: this,
+ mouseover: this.onMouseOver,
+ mousedown: this.onMouseDown
+ });
+
+
+
+ }
+
+ if(this.menu){
+ this.mon(this.menu, {
+ scope: this,
+ show: this.onMenuShow,
+ hide: this.onMenuHide
+ });
+ }
+
+ if(this.repeat){
+ var repeater = new Ext.util.ClickRepeater(btn, Ext.isObject(this.repeat) ? this.repeat : {});
+ this.mon(repeater, 'click', this.onRepeatClick, this);
+ }else{
+ this.mon(btn, this.clickEvent, this.onClick, this);
+ }
+ },
+
+
+ afterRender : function(){
+ Ext.Button.superclass.afterRender.call(this);
+ this.useSetClass = true;
+ this.setButtonClass();
+ this.doc = Ext.getDoc();
+ this.doAutoWidth();
+ },
+
+
+ setIconClass : function(cls){
+ this.iconCls = cls;
+ if(this.el){
+ this.btnEl.dom.className = '';
+ this.btnEl.addClass(['x-btn-text', cls || '']);
+ this.setButtonClass();
+ }
+ return this;
+ },
+
+
+ setTooltip : function(tooltip, initial){
+ if(this.rendered){
+ if(!initial){
+ this.clearTip();
+ }
+ if(Ext.isObject(tooltip)){
+ Ext.QuickTips.register(Ext.apply({
+ target: this.btnEl.id
+ }, tooltip));
+ this.tooltip = tooltip;
+ }else{
+ this.btnEl.dom[this.tooltipType] = tooltip;
+ }
+ }else{
+ this.tooltip = tooltip;
+ }
+ return this;
+ },
+
+
+ clearTip : function(){
+ if(Ext.isObject(this.tooltip)){
+ Ext.QuickTips.unregister(this.btnEl);
+ }
+ },
+
+
+ beforeDestroy : function(){
+ if(this.rendered){
+ this.clearTip();
+ }
+ if(this.menu && this.destroyMenu !== false) {
+ Ext.destroy(this.btnEl, this.menu);
+ }
+ Ext.destroy(this.repeater);
+ },
+
+
+ onDestroy : function(){
+ if(this.rendered){
+ this.doc.un('mouseover', this.monitorMouseOver, this);
+ this.doc.un('mouseup', this.onMouseUp, this);
+ delete this.doc;
+ delete this.btnEl;
+ Ext.ButtonToggleMgr.unregister(this);
+ }
+ Ext.Button.superclass.onDestroy.call(this);
+ },
+
+
+ doAutoWidth : function(){
+ if(this.autoWidth !== false && this.el && this.text && this.width === undefined){
+ this.el.setWidth('auto');
+ if(Ext.isIE7 && Ext.isStrict){
+ var ib = this.btnEl;
+ if(ib && ib.getWidth() > 20){
+ ib.clip();
+ ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr'));
+ }
+ }
+ if(this.minWidth){
+ if(this.el.getWidth() < this.minWidth){
+ this.el.setWidth(this.minWidth);
+ }
+ }
+ }
+ },
+
+
+ setHandler : function(handler, scope){
+ this.handler = handler;
+ this.scope = scope;
+ return this;
+ },
+
+
+ setText : function(text){
+ this.text = text;
+ if(this.el){
+ this.btnEl.update(text || '&#160;');
+ this.setButtonClass();
+ }
+ this.doAutoWidth();
+ return this;
+ },
+
+
+ setIcon : function(icon){
+ this.icon = icon;
+ if(this.el){
+ this.btnEl.setStyle('background-image', icon ? 'url(' + icon + ')' : '');
+ this.setButtonClass();
+ }
+ return this;
+ },
+
+
+ getText : function(){
+ return this.text;
+ },
+
+
+ toggle : function(state, suppressEvent){
+ state = state === undefined ? !this.pressed : !!state;
+ if(state != this.pressed){
+ if(this.rendered){
+ this.el[state ? 'addClass' : 'removeClass']('x-btn-pressed');
+ }
+ this.pressed = state;
+ if(!suppressEvent){
+ this.fireEvent('toggle', this, state);
+ if(this.toggleHandler){
+ this.toggleHandler.call(this.scope || this, this, state);
+ }
+ }
+ }
+ return this;
+ },
+
+
+ onDisable : function(){
+ this.onDisableChange(true);
+ },
+
+
+ onEnable : function(){
+ this.onDisableChange(false);
+ },
+
+ onDisableChange : function(disabled){
+ if(this.el){
+ if(!Ext.isIE6 || !this.text){
+ this.el[disabled ? 'addClass' : 'removeClass'](this.disabledClass);
+ }
+ this.el.dom.disabled = disabled;
+ }
+ this.disabled = disabled;
+ },
+
+
+ showMenu : function(){
+ if(this.rendered && this.menu){
+ if(this.tooltip){
+ Ext.QuickTips.getQuickTip().cancelShow(this.btnEl);
+ }
+ if(this.menu.isVisible()){
+ this.menu.hide();
+ }
+ this.menu.ownerCt = this;
+ this.menu.show(this.el, this.menuAlign);
+ }
+ return this;
+ },
+
+
+ hideMenu : function(){
+ if(this.hasVisibleMenu()){
+ this.menu.hide();
+ }
+ return this;
+ },
+
+
+ hasVisibleMenu : function(){
+ return this.menu && this.menu.ownerCt == this && this.menu.isVisible();
+ },
+
+
+ onRepeatClick : function(repeat, e){
+ this.onClick(e);
+ },
+
+
+ onClick : function(e){
+ if(e){
+ e.preventDefault();
+ }
+ if(e.button !== 0){
+ return;
+ }
+ if(!this.disabled){
+ this.doToggle();
+ if(this.menu && !this.hasVisibleMenu() && !this.ignoreNextClick){
+ this.showMenu();
+ }
+ this.fireEvent('click', this, e);
+ if(this.handler){
+
+ this.handler.call(this.scope || this, this, e);
+ }
+ }
+ },
+
+
+ doToggle: function(){
+ if (this.enableToggle && (this.allowDepress !== false || !this.pressed)) {
+ this.toggle();
+ }
+ },
+
+
+ isMenuTriggerOver : function(e, internal){
+ return this.menu && !internal;
+ },
+
+
+ isMenuTriggerOut : function(e, internal){
+ return this.menu && !internal;
+ },
+
+
+ onMouseOver : function(e){
+ if(!this.disabled){
+ var internal = e.within(this.el, true);
+ if(!internal){
+ this.el.addClass('x-btn-over');
+ if(!this.monitoringMouseOver){
+ this.doc.on('mouseover', this.monitorMouseOver, this);
+ this.monitoringMouseOver = true;
+ }
+ this.fireEvent('mouseover', this, e);
+ }
+ if(this.isMenuTriggerOver(e, internal)){
+ this.fireEvent('menutriggerover', this, this.menu, e);
+ }
+ }
+ },
+
+
+ monitorMouseOver : function(e){
+ if(e.target != this.el.dom && !e.within(this.el)){
+ if(this.monitoringMouseOver){
+ this.doc.un('mouseover', this.monitorMouseOver, this);
+ this.monitoringMouseOver = false;
+ }
+ this.onMouseOut(e);
+ }
+ },
+
+
+ onMouseOut : function(e){
+ var internal = e.within(this.el) && e.target != this.el.dom;
+ this.el.removeClass('x-btn-over');
+ this.fireEvent('mouseout', this, e);
+ if(this.isMenuTriggerOut(e, internal)){
+ this.fireEvent('menutriggerout', this, this.menu, e);
+ }
+ },
+
+ focus : function() {
+ this.btnEl.focus();
+ },
+
+ blur : function() {
+ this.btnEl.blur();
+ },
+
+
+ onFocus : function(e){
+ if(!this.disabled){
+ this.el.addClass('x-btn-focus');
+ }
+ },
+
+ onBlur : function(e){
+ this.el.removeClass('x-btn-focus');
+ },
+
+
+ getClickEl : function(e, isUp){
+ return this.el;
+ },
+
+
+ onMouseDown : function(e){
+ if(!this.disabled && e.button === 0){
+ this.getClickEl(e).addClass('x-btn-click');
+ this.doc.on('mouseup', this.onMouseUp, this);
+ }
+ },
+
+ onMouseUp : function(e){
+ if(e.button === 0){
+ this.getClickEl(e, true).removeClass('x-btn-click');
+ this.doc.un('mouseup', this.onMouseUp, this);
+ }
+ },
+
+ onMenuShow : function(e){
+ if(this.menu.ownerCt == this){
+ this.menu.ownerCt = this;
+ this.ignoreNextClick = 0;
+ this.el.addClass('x-btn-menu-active');
+ this.fireEvent('menushow', this, this.menu);
+ }
+ },
+
+ onMenuHide : function(e){
+ if(this.menu.ownerCt == this){
+ this.el.removeClass('x-btn-menu-active');
+ this.ignoreNextClick = this.restoreClick.defer(250, this);
+ this.fireEvent('menuhide', this, this.menu);
+ delete this.menu.ownerCt;
+ }
+ },
+
+
+ restoreClick : function(){
+ this.ignoreNextClick = 0;
+ }
+
+
+
+
+
+
+
+});
+Ext.reg('button', Ext.Button);
+
+
+Ext.ButtonToggleMgr = function(){
+ var groups = {};
+
+ function toggleGroup(btn, state){
+ if(state){
+ var g = groups[btn.toggleGroup];
+ for(var i = 0, l = g.length; i < l; i++){
+ if(g[i] != btn){
+ g[i].toggle(false);
+ }
+ }
+ }
+ }
+
+ return {
+ register : function(btn){
+ if(!btn.toggleGroup){
+ return;
+ }
+ var g = groups[btn.toggleGroup];
+ if(!g){
+ g = groups[btn.toggleGroup] = [];
+ }
+ g.push(btn);
+ btn.on('toggle', toggleGroup);
+ },
+
+ unregister : function(btn){
+ if(!btn.toggleGroup){
+ return;
+ }
+ var g = groups[btn.toggleGroup];
+ if(g){
+ g.remove(btn);
+ btn.un('toggle', toggleGroup);
+ }
+ },
+
+
+ getPressed : function(group){
+ var g = groups[group];
+ if(g){
+ for(var i = 0, len = g.length; i < len; i++){
+ if(g[i].pressed === true){
+ return g[i];
+ }
+ }
+ }
+ return null;
+ }
+ };
+}();
+
+Ext.SplitButton = Ext.extend(Ext.Button, {
+
+ arrowSelector : 'em',
+ split: true,
+
+
+ initComponent : function(){
+ Ext.SplitButton.superclass.initComponent.call(this);
+
+ this.addEvents("arrowclick");
+ },
+
+
+ onRender : function(){
+ Ext.SplitButton.superclass.onRender.apply(this, arguments);
+ if(this.arrowTooltip){
+ this.el.child(this.arrowSelector).dom[this.tooltipType] = this.arrowTooltip;
+ }
+ },
+
+
+ setArrowHandler : function(handler, scope){
+ this.arrowHandler = handler;
+ this.scope = scope;
+ },
+
+ getMenuClass : function(){
+ return 'x-btn-split' + (this.arrowAlign == 'bottom' ? '-bottom' : '');
+ },
+
+ isClickOnArrow : function(e){
+ if (this.arrowAlign != 'bottom') {
+ var visBtn = this.el.child('em.x-btn-split');
+ var right = visBtn.getRegion().right - visBtn.getPadding('r');
+ return e.getPageX() > right;
+ } else {
+ return e.getPageY() > this.btnEl.getRegion().bottom;
+ }
+ },
+
+
+ onClick : function(e, t){
+ e.preventDefault();
+ if(!this.disabled){
+ if(this.isClickOnArrow(e)){
+ if(this.menu && !this.menu.isVisible() && !this.ignoreNextClick){
+ this.showMenu();
+ }
+ this.fireEvent("arrowclick", this, e);
+ if(this.arrowHandler){
+ this.arrowHandler.call(this.scope || this, this, e);
+ }
+ }else{
+ this.doToggle();
+ this.fireEvent("click", this, e);
+ if(this.handler){
+ this.handler.call(this.scope || this, this, e);
+ }
+ }
+ }
+ },
+
+
+ isMenuTriggerOver : function(e){
+ return this.menu && e.target.tagName == this.arrowSelector;
+ },
+
+
+ isMenuTriggerOut : function(e, internal){
+ return this.menu && e.target.tagName != this.arrowSelector;
+ }
+});
+
+Ext.reg('splitbutton', Ext.SplitButton);
+Ext.CycleButton = Ext.extend(Ext.SplitButton, {
+
+
+
+
+
+
+
+
+ getItemText : function(item){
+ if(item && this.showText === true){
+ var text = '';
+ if(this.prependText){
+ text += this.prependText;
+ }
+ text += item.text;
+ return text;
+ }
+ return undefined;
+ },
+
+
+ setActiveItem : function(item, suppressEvent){
+ if(!Ext.isObject(item)){
+ item = this.menu.getComponent(item);
+ }
+ if(item){
+ if(!this.rendered){
+ this.text = this.getItemText(item);
+ this.iconCls = item.iconCls;
+ }else{
+ var t = this.getItemText(item);
+ if(t){
+ this.setText(t);
+ }
+ this.setIconClass(item.iconCls);
+ }
+ this.activeItem = item;
+ if(!item.checked){
+ item.setChecked(true, suppressEvent);
+ }
+ if(this.forceIcon){
+ this.setIconClass(this.forceIcon);
+ }
+ if(!suppressEvent){
+ this.fireEvent('change', this, item);
+ }
+ }
+ },
+
+
+ getActiveItem : function(){
+ return this.activeItem;
+ },
+
+
+ initComponent : function(){
+ this.addEvents(
+
+ "change"
+ );
+
+ if(this.changeHandler){
+ this.on('change', this.changeHandler, this.scope||this);
+ delete this.changeHandler;
+ }
+
+ this.itemCount = this.items.length;
+
+ this.menu = {cls:'x-cycle-menu', items:[]};
+ var checked = 0;
+ Ext.each(this.items, function(item, i){
+ Ext.apply(item, {
+ group: item.group || this.id,
+ itemIndex: i,
+ checkHandler: this.checkHandler,
+ scope: this,
+ checked: item.checked || false
+ });
+ this.menu.items.push(item);
+ if(item.checked){
+ checked = i;
+ }
+ }, this);
+ Ext.CycleButton.superclass.initComponent.call(this);
+ this.on('click', this.toggleSelected, this);
+ this.setActiveItem(checked, true);
+ },
+
+
+ checkHandler : function(item, pressed){
+ if(pressed){
+ this.setActiveItem(item);
+ }
+ },
+
+
+ toggleSelected : function(){
+ var m = this.menu;
+ m.render();
+
+ if(!m.hasLayout){
+ m.doLayout();
+ }
+
+ var nextIdx, checkItem;
+ for (var i = 1; i < this.itemCount; i++) {
+ nextIdx = (this.activeItem.itemIndex + i) % this.itemCount;
+
+ checkItem = m.items.itemAt(nextIdx);
+
+ if (!checkItem.disabled) {
+ checkItem.setChecked(true);
+ break;
+ }
+ }
+ }
+});
+Ext.reg('cycle', Ext.CycleButton);
+Ext.Toolbar = function(config){
+ if(Ext.isArray(config)){
+ config = {items: config, layout: 'toolbar'};
+ } else {
+ config = Ext.apply({
+ layout: 'toolbar'
+ }, config);
+ if(config.buttons) {
+ config.items = config.buttons;
+ }
+ }
+ Ext.Toolbar.superclass.constructor.call(this, config);
+};
+
+(function(){
+
+var T = Ext.Toolbar;
+
+Ext.extend(T, Ext.Container, {
+
+ defaultType: 'button',
+
+
+
+ enableOverflow : false,
+
+
+
+
+ trackMenus : true,
+ internalDefaults: {removeMode: 'container', hideParent: true},
+ toolbarCls: 'x-toolbar',
+
+ initComponent : function(){
+ T.superclass.initComponent.call(this);
+
+
+ this.addEvents('overflowchange');
+ },
+
+
+ onRender : function(ct, position){
+ if(!this.el){
+ if(!this.autoCreate){
+ this.autoCreate = {
+ cls: this.toolbarCls + ' x-small-editor'
+ };
+ }
+ this.el = ct.createChild(Ext.apply({ id: this.id },this.autoCreate), position);
+ Ext.Toolbar.superclass.onRender.apply(this, arguments);
+ }
+ },
+
+
+
+
+ lookupComponent : function(c){
+ if(Ext.isString(c)){
+ if(c == '-'){
+ c = new T.Separator();
+ }else if(c == ' '){
+ c = new T.Spacer();
+ }else if(c == '->'){
+ c = new T.Fill();
+ }else{
+ c = new T.TextItem(c);
+ }
+ this.applyDefaults(c);
+ }else{
+ if(c.isFormField || c.render){
+ c = this.createComponent(c);
+ }else if(c.tag){
+ c = new T.Item({autoEl: c});
+ }else if(c.tagName){
+ c = new T.Item({el:c});
+ }else if(Ext.isObject(c)){
+ c = c.xtype ? this.createComponent(c) : this.constructButton(c);
+ }
+ }
+ return c;
+ },
+
+
+ applyDefaults : function(c){
+ if(!Ext.isString(c)){
+ c = Ext.Toolbar.superclass.applyDefaults.call(this, c);
+ var d = this.internalDefaults;
+ if(c.events){
+ Ext.applyIf(c.initialConfig, d);
+ Ext.apply(c, d);
+ }else{
+ Ext.applyIf(c, d);
+ }
+ }
+ return c;
+ },
+
+
+ addSeparator : function(){
+ return this.add(new T.Separator());
+ },
+
+
+ addSpacer : function(){
+ return this.add(new T.Spacer());
+ },
+
+
+ addFill : function(){
+ this.add(new T.Fill());
+ },
+
+
+ addElement : function(el){
+ return this.addItem(new T.Item({el:el}));
+ },
+
+
+ addItem : function(item){
+ return this.add.apply(this, arguments);
+ },
+
+
+ addButton : function(config){
+ if(Ext.isArray(config)){
+ var buttons = [];
+ for(var i = 0, len = config.length; i < len; i++) {
+ buttons.push(this.addButton(config[i]));
+ }
+ return buttons;
+ }
+ return this.add(this.constructButton(config));
+ },
+
+
+ addText : function(text){
+ return this.addItem(new T.TextItem(text));
+ },
+
+
+ addDom : function(config){
+ return this.add(new T.Item({autoEl: config}));
+ },
+
+
+ addField : function(field){
+ return this.add(field);
+ },
+
+
+ insertButton : function(index, item){
+ if(Ext.isArray(item)){
+ var buttons = [];
+ for(var i = 0, len = item.length; i < len; i++) {
+ buttons.push(this.insertButton(index + i, item[i]));
+ }
+ return buttons;
+ }
+ return Ext.Toolbar.superclass.insert.call(this, index, item);
+ },
+
+
+ trackMenu : function(item, remove){
+ if(this.trackMenus && item.menu){
+ var method = remove ? 'mun' : 'mon';
+ this[method](item, 'menutriggerover', this.onButtonTriggerOver, this);
+ this[method](item, 'menushow', this.onButtonMenuShow, this);
+ this[method](item, 'menuhide', this.onButtonMenuHide, this);
+ }
+ },
+
+
+ constructButton : function(item){
+ var b = item.events ? item : this.createComponent(item, item.split ? 'splitbutton' : this.defaultType);
+ return b;
+ },
+
+
+ onAdd : function(c){
+ Ext.Toolbar.superclass.onAdd.call(this);
+ this.trackMenu(c);
+ if(this.disabled){
+ c.disable();
+ }
+ },
+
+
+ onRemove : function(c){
+ Ext.Toolbar.superclass.onRemove.call(this);
+ if (c == this.activeMenuBtn) {
+ delete this.activeMenuBtn;
+ }
+ this.trackMenu(c, true);
+ },
+
+
+ onDisable : function(){
+ this.items.each(function(item){
+ if(item.disable){
+ item.disable();
+ }
+ });
+ },
+
+
+ onEnable : function(){
+ this.items.each(function(item){
+ if(item.enable){
+ item.enable();
+ }
+ });
+ },
+
+
+ onButtonTriggerOver : function(btn){
+ if(this.activeMenuBtn && this.activeMenuBtn != btn){
+ this.activeMenuBtn.hideMenu();
+ btn.showMenu();
+ this.activeMenuBtn = btn;
+ }
+ },
+
+
+ onButtonMenuShow : function(btn){
+ this.activeMenuBtn = btn;
+ },
+
+
+ onButtonMenuHide : function(btn){
+ delete this.activeMenuBtn;
+ }
+});
+Ext.reg('toolbar', Ext.Toolbar);
+
+
+T.Item = Ext.extend(Ext.BoxComponent, {
+ hideParent: true,
+ enable:Ext.emptyFn,
+ disable:Ext.emptyFn,
+ focus:Ext.emptyFn
+
+});
+Ext.reg('tbitem', T.Item);
+
+
+T.Separator = Ext.extend(T.Item, {
+ onRender : function(ct, position){
+ this.el = ct.createChild({tag:'span', cls:'xtb-sep'}, position);
+ }
+});
+Ext.reg('tbseparator', T.Separator);
+
+
+T.Spacer = Ext.extend(T.Item, {
+
+
+ onRender : function(ct, position){
+ this.el = ct.createChild({tag:'div', cls:'xtb-spacer', style: this.width?'width:'+this.width+'px':''}, position);
+ }
+});
+Ext.reg('tbspacer', T.Spacer);
+
+
+T.Fill = Ext.extend(T.Item, {
+
+ render : Ext.emptyFn,
+ isFill : true
+});
+Ext.reg('tbfill', T.Fill);
+
+
+T.TextItem = Ext.extend(T.Item, {
+
+
+ constructor: function(config){
+ T.TextItem.superclass.constructor.call(this, Ext.isString(config) ? {text: config} : config);
+ },
+
+
+ onRender : function(ct, position) {
+ this.autoEl = {cls: 'xtb-text', html: this.text || ''};
+ T.TextItem.superclass.onRender.call(this, ct, position);
+ },
+
+
+ setText : function(t) {
+ if(this.rendered){
+ this.el.update(t);
+ }else{
+ this.text = t;
+ }
+ }
+});
+Ext.reg('tbtext', T.TextItem);
+
+
+T.Button = Ext.extend(Ext.Button, {});
+T.SplitButton = Ext.extend(Ext.SplitButton, {});
+Ext.reg('tbbutton', T.Button);
+Ext.reg('tbsplit', T.SplitButton);
+
+})();
+
+Ext.ButtonGroup = Ext.extend(Ext.Panel, {
+
+
+ baseCls: 'x-btn-group',
+
+ layout:'table',
+ defaultType: 'button',
+
+ frame: true,
+ internalDefaults: {removeMode: 'container', hideParent: true},
+
+ initComponent : function(){
+ this.layoutConfig = this.layoutConfig || {};
+ Ext.applyIf(this.layoutConfig, {
+ columns : this.columns
+ });
+ if(!this.title){
+ this.addClass('x-btn-group-notitle');
+ }
+ this.on('afterlayout', this.onAfterLayout, this);
+ Ext.ButtonGroup.superclass.initComponent.call(this);
+ },
+
+ applyDefaults : function(c){
+ c = Ext.ButtonGroup.superclass.applyDefaults.call(this, c);
+ var d = this.internalDefaults;
+ if(c.events){
+ Ext.applyIf(c.initialConfig, d);
+ Ext.apply(c, d);
+ }else{
+ Ext.applyIf(c, d);
+ }
+ return c;
+ },
+
+ onAfterLayout : function(){
+ var bodyWidth = this.body.getFrameWidth('lr') + this.body.dom.firstChild.offsetWidth;
+ this.body.setWidth(bodyWidth);
+ this.el.setWidth(bodyWidth + this.getFrameWidth());
+ }
+
+});
+
+Ext.reg('buttongroup', Ext.ButtonGroup);
+
+(function() {
+
+var T = Ext.Toolbar;
+
+Ext.PagingToolbar = Ext.extend(Ext.Toolbar, {
+
+
+
+ pageSize : 20,
+
+
+ displayMsg : 'Displaying {0} - {1} of {2}',
+
+ emptyMsg : 'No data to display',
+
+ beforePageText : 'Page',
+
+ afterPageText : 'of {0}',
+
+ firstText : 'First Page',
+
+ prevText : 'Previous Page',
+
+ nextText : 'Next Page',
+
+ lastText : 'Last Page',
+
+ refreshText : 'Refresh',
+
+
+
+
+
+
+
+ initComponent : function(){
+ var pagingItems = [this.first = new T.Button({
+ tooltip: this.firstText,
+ overflowText: this.firstText,
+ iconCls: 'x-tbar-page-first',
+ disabled: true,
+ handler: this.moveFirst,
+ scope: this
+ }), this.prev = new T.Button({
+ tooltip: this.prevText,
+ overflowText: this.prevText,
+ iconCls: 'x-tbar-page-prev',
+ disabled: true,
+ handler: this.movePrevious,
+ scope: this
+ }), '-', this.beforePageText,
+ this.inputItem = new Ext.form.NumberField({
+ cls: 'x-tbar-page-number',
+ allowDecimals: false,
+ allowNegative: false,
+ enableKeyEvents: true,
+ selectOnFocus: true,
+ submitValue: false,
+ listeners: {
+ scope: this,
+ keydown: this.onPagingKeyDown,
+ blur: this.onPagingBlur
+ }
+ }), this.afterTextItem = new T.TextItem({
+ text: String.format(this.afterPageText, 1)
+ }), '-', this.next = new T.Button({
+ tooltip: this.nextText,
+ overflowText: this.nextText,
+ iconCls: 'x-tbar-page-next',
+ disabled: true,
+ handler: this.moveNext,
+ scope: this
+ }), this.last = new T.Button({
+ tooltip: this.lastText,
+ overflowText: this.lastText,
+ iconCls: 'x-tbar-page-last',
+ disabled: true,
+ handler: this.moveLast,
+ scope: this
+ }), '-', this.refresh = new T.Button({
+ tooltip: this.refreshText,
+ overflowText: this.refreshText,
+ iconCls: 'x-tbar-loading',
+ handler: this.doRefresh,
+ scope: this
+ })];
+
+
+ var userItems = this.items || this.buttons || [];
+ if (this.prependButtons) {
+ this.items = userItems.concat(pagingItems);
+ }else{
+ this.items = pagingItems.concat(userItems);
+ }
+ delete this.buttons;
+ if(this.displayInfo){
+ this.items.push('->');
+ this.items.push(this.displayItem = new T.TextItem({}));
+ }
+ Ext.PagingToolbar.superclass.initComponent.call(this);
+ this.addEvents(
+
+ 'change',
+
+ 'beforechange'
+ );
+ this.on('afterlayout', this.onFirstLayout, this, {single: true});
+ this.cursor = 0;
+ this.bindStore(this.store, true);
+ },
+
+
+ onFirstLayout : function(){
+ if(this.dsLoaded){
+ this.onLoad.apply(this, this.dsLoaded);
+ }
+ },
+
+
+ updateInfo : function(){
+ if(this.displayItem){
+ var count = this.store.getCount();
+ var msg = count == 0 ?
+ this.emptyMsg :
+ String.format(
+ this.displayMsg,
+ this.cursor+1, this.cursor+count, this.store.getTotalCount()
+ );
+ this.displayItem.setText(msg);
+ }
+ },
+
+
+ onLoad : function(store, r, o){
+ if(!this.rendered){
+ this.dsLoaded = [store, r, o];
+ return;
+ }
+ var p = this.getParams();
+ this.cursor = (o.params && o.params[p.start]) ? o.params[p.start] : 0;
+ var d = this.getPageData(), ap = d.activePage, ps = d.pages;
+
+ this.afterTextItem.setText(String.format(this.afterPageText, d.pages));
+ this.inputItem.setValue(ap);
+ this.first.setDisabled(ap == 1);
+ this.prev.setDisabled(ap == 1);
+ this.next.setDisabled(ap == ps);
+ this.last.setDisabled(ap == ps);
+ this.refresh.enable();
+ this.updateInfo();
+ this.fireEvent('change', this, d);
+ },
+
+
+ getPageData : function(){
+ var total = this.store.getTotalCount();
+ return {
+ total : total,
+ activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize),
+ pages : total < this.pageSize ? 1 : Math.ceil(total/this.pageSize)
+ };
+ },
+
+
+ changePage : function(page){
+ this.doLoad(((page-1) * this.pageSize).constrain(0, this.store.getTotalCount()));
+ },
+
+
+ onLoadError : function(){
+ if(!this.rendered){
+ return;
+ }
+ this.refresh.enable();
+ },
+
+
+ readPage : function(d){
+ var v = this.inputItem.getValue(), pageNum;
+ if (!v || isNaN(pageNum = parseInt(v, 10))) {
+ this.inputItem.setValue(d.activePage);
+ return false;
+ }
+ return pageNum;
+ },
+
+ onPagingFocus : function(){
+ this.inputItem.select();
+ },
+
+
+ onPagingBlur : function(e){
+ this.inputItem.setValue(this.getPageData().activePage);
+ },
+
+
+ onPagingKeyDown : function(field, e){
+ var k = e.getKey(), d = this.getPageData(), pageNum;
+ if (k == e.RETURN) {
+ e.stopEvent();
+ pageNum = this.readPage(d);
+ if(pageNum !== false){
+ pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1;
+ this.doLoad(pageNum * this.pageSize);
+ }
+ }else if (k == e.HOME || k == e.END){
+ e.stopEvent();
+ pageNum = k == e.HOME ? 1 : d.pages;
+ field.setValue(pageNum);
+ }else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN){
+ e.stopEvent();
+ if((pageNum = this.readPage(d))){
+ var increment = e.shiftKey ? 10 : 1;
+ if(k == e.DOWN || k == e.PAGEDOWN){
+ increment *= -1;
+ }
+ pageNum += increment;
+ if(pageNum >= 1 & pageNum <= d.pages){
+ field.setValue(pageNum);
+ }
+ }
+ }
+ },
+
+
+ getParams : function(){
+
+ return this.paramNames || this.store.paramNames;
+ },
+
+
+ beforeLoad : function(){
+ if(this.rendered && this.refresh){
+ this.refresh.disable();
+ }
+ },
+
+
+ doLoad : function(start){
+ var o = {}, pn = this.getParams();
+ o[pn.start] = start;
+ o[pn.limit] = this.pageSize;
+ if(this.fireEvent('beforechange', this, o) !== false){
+ this.store.load({params:o});
+ }
+ },
+
+
+ moveFirst : function(){
+ this.doLoad(0);
+ },
+
+
+ movePrevious : function(){
+ this.doLoad(Math.max(0, this.cursor-this.pageSize));
+ },
+
+
+ moveNext : function(){
+ this.doLoad(this.cursor+this.pageSize);
+ },
+
+
+ moveLast : function(){
+ var total = this.store.getTotalCount(),
+ extra = total % this.pageSize;
+
+ this.doLoad(extra ? (total - extra) : total - this.pageSize);
+ },
+
+
+ doRefresh : function(){
+ this.doLoad(this.cursor);
+ },
+
+
+ bindStore : function(store, initial){
+ var doLoad;
+ if(!initial && this.store){
+ if(store !== this.store && this.store.autoDestroy){
+ this.store.destroy();
+ }else{
+ this.store.un('beforeload', this.beforeLoad, this);
+ this.store.un('load', this.onLoad, this);
+ this.store.un('exception', this.onLoadError, this);
+ }
+ if(!store){
+ this.store = null;
+ }
+ }
+ if(store){
+ store = Ext.StoreMgr.lookup(store);
+ store.on({
+ scope: this,
+ beforeload: this.beforeLoad,
+ load: this.onLoad,
+ exception: this.onLoadError
+ });
+ doLoad = true;
+ }
+ this.store = store;
+ if(doLoad){
+ this.onLoad(store, null, {});
+ }
+ },
+
+
+ unbind : function(store){
+ this.bindStore(null);
+ },
+
+
+ bind : function(store){
+ this.bindStore(store);
+ },
+
+
+ onDestroy : function(){
+ this.bindStore(null);
+ Ext.PagingToolbar.superclass.onDestroy.call(this);
+ }
+});
+
+})();
+Ext.reg('paging', Ext.PagingToolbar);
+Ext.History = (function () {
+ var iframe, hiddenField;
+ var ready = false;
+ var currentToken;
+
+ function getHash() {
+ var href = location.href, i = href.indexOf("#"),
+ hash = i >= 0 ? href.substr(i + 1) : null;
+
+ if (Ext.isGecko) {
+ hash = decodeURIComponent(hash);
+ }
+ return hash;
+ }
+
+ function doSave() {
+ hiddenField.value = currentToken;
+ }
+
+ function handleStateChange(token) {
+ currentToken = token;
+ Ext.History.fireEvent('change', token);
+ }
+
+ function updateIFrame (token) {
+ var html = ['<html><body><div id="state">',Ext.util.Format.htmlEncode(token),'</div></body></html>'].join('');
+ try {
+ var doc = iframe.contentWindow.document;
+ doc.open();
+ doc.write(html);
+ doc.close();
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ function checkIFrame() {
+ if (!iframe.contentWindow || !iframe.contentWindow.document) {
+ setTimeout(checkIFrame, 10);
+ return;
+ }
+
+ var doc = iframe.contentWindow.document;
+ var elem = doc.getElementById("state");
+ var token = elem ? elem.innerText : null;
+
+ var hash = getHash();
+
+ setInterval(function () {
+
+ doc = iframe.contentWindow.document;
+ elem = doc.getElementById("state");
+
+ var newtoken = elem ? elem.innerText : null;
+
+ var newHash = getHash();
+
+ if (newtoken !== token) {
+ token = newtoken;
+ handleStateChange(token);
+ location.hash = token;
+ hash = token;
+ doSave();
+ } else if (newHash !== hash) {
+ hash = newHash;
+ updateIFrame(newHash);
+ }
+
+ }, 50);
+
+ ready = true;
+
+ Ext.History.fireEvent('ready', Ext.History);
+ }
+
+ function startUp() {
+ currentToken = hiddenField.value ? hiddenField.value : getHash();
+
+ if (Ext.isIE) {
+ checkIFrame();
+ } else {
+ var hash = getHash();
+ setInterval(function () {
+ var newHash = getHash();
+ if (newHash !== hash) {
+ hash = newHash;
+ handleStateChange(hash);
+ doSave();
+ }
+ }, 50);
+ ready = true;
+ Ext.History.fireEvent('ready', Ext.History);
+ }
+ }
+
+ return {
+
+ fieldId: 'x-history-field',
+
+ iframeId: 'x-history-frame',
+
+ events:{},
+
+
+ init: function (onReady, scope) {
+ if(ready) {
+ Ext.callback(onReady, scope, [this]);
+ return;
+ }
+ if(!Ext.isReady){
+ Ext.onReady(function(){
+ Ext.History.init(onReady, scope);
+ });
+ return;
+ }
+ hiddenField = Ext.getDom(Ext.History.fieldId);
+ if (Ext.isIE) {
+ iframe = Ext.getDom(Ext.History.iframeId);
+ }
+ this.addEvents(
+
+ 'ready',
+
+ 'change'
+ );
+ if(onReady){
+ this.on('ready', onReady, scope, {single:true});
+ }
+ startUp();
+ },
+
+
+ add: function (token, preventDup) {
+ if(preventDup !== false){
+ if(this.getToken() == token){
+ return true;
+ }
+ }
+ if (Ext.isIE) {
+ return updateIFrame(token);
+ } else {
+ location.hash = token;
+ return true;
+ }
+ },
+
+
+ back: function(){
+ history.go(-1);
+ },
+
+
+ forward: function(){
+ history.go(1);
+ },
+
+
+ getToken: function() {
+ return ready ? currentToken : getHash();
+ }
+ };
+})();
+Ext.apply(Ext.History, new Ext.util.Observable());
+Ext.Tip = Ext.extend(Ext.Panel, {
+
+
+
+ minWidth : 40,
+
+ maxWidth : 300,
+
+ shadow : "sides",
+
+ defaultAlign : "tl-bl?",
+ autoRender: true,
+ quickShowInterval : 250,
+
+
+ frame:true,
+ hidden:true,
+ baseCls: 'x-tip',
+ floating:{shadow:true,shim:true,useDisplay:true,constrain:false},
+ autoHeight:true,
+
+ closeAction: 'hide',
+
+
+ initComponent : function(){
+ Ext.Tip.superclass.initComponent.call(this);
+ if(this.closable && !this.title){
+ this.elements += ',header';
+ }
+ },
+
+
+ afterRender : function(){
+ Ext.Tip.superclass.afterRender.call(this);
+ if(this.closable){
+ this.addTool({
+ id: 'close',
+ handler: this[this.closeAction],
+ scope: this
+ });
+ }
+ },
+
+
+ showAt : function(xy){
+ Ext.Tip.superclass.show.call(this);
+ if(this.measureWidth !== false && (!this.initialConfig || typeof this.initialConfig.width != 'number')){
+ this.doAutoWidth();
+ }
+ if(this.constrainPosition){
+ xy = this.el.adjustForConstraints(xy);
+ }
+ this.setPagePosition(xy[0], xy[1]);
+ },
+
+
+ doAutoWidth : function(adjust){
+ adjust = adjust || 0;
+ var bw = this.body.getTextWidth();
+ if(this.title){
+ bw = Math.max(bw, this.header.child('span').getTextWidth(this.title));
+ }
+ bw += this.getFrameWidth() + (this.closable ? 20 : 0) + this.body.getPadding("lr") + adjust;
+ this.setWidth(bw.constrain(this.minWidth, this.maxWidth));
+
+
+ if(Ext.isIE7 && !this.repainted){
+ this.el.repaint();
+ this.repainted = true;
+ }
+ },
+
+
+ showBy : function(el, pos){
+ if(!this.rendered){
+ this.render(Ext.getBody());
+ }
+ this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign));
+ },
+
+ initDraggable : function(){
+ this.dd = new Ext.Tip.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable);
+ this.header.addClass('x-tip-draggable');
+ }
+});
+
+Ext.reg('tip', Ext.Tip);
+
+
+Ext.Tip.DD = function(tip, config){
+ Ext.apply(this, config);
+ this.tip = tip;
+ Ext.Tip.DD.superclass.constructor.call(this, tip.el.id, 'WindowDD-'+tip.id);
+ this.setHandleElId(tip.header.id);
+ this.scroll = false;
+};
+
+Ext.extend(Ext.Tip.DD, Ext.dd.DD, {
+ moveOnly:true,
+ scroll:false,
+ headerOffsets:[100, 25],
+ startDrag : function(){
+ this.tip.el.disableShadow();
+ },
+ endDrag : function(e){
+ this.tip.el.enableShadow(true);
+ }
+});
+Ext.ToolTip = Ext.extend(Ext.Tip, {
+
+
+
+
+ showDelay : 500,
+
+ hideDelay : 200,
+
+ dismissDelay : 5000,
+
+
+ trackMouse : false,
+
+ anchorToTarget : true,
+
+ anchorOffset : 0,
+
+
+
+ targetCounter : 0,
+
+ constrainPosition : false,
+
+
+ initComponent : function(){
+ Ext.ToolTip.superclass.initComponent.call(this);
+ this.lastActive = new Date();
+ this.initTarget(this.target);
+ this.origAnchor = this.anchor;
+ },
+
+
+ onRender : function(ct, position){
+ Ext.ToolTip.superclass.onRender.call(this, ct, position);
+ this.anchorCls = 'x-tip-anchor-' + this.getAnchorPosition();
+ this.anchorEl = this.el.createChild({
+ cls: 'x-tip-anchor ' + this.anchorCls
+ });
+ },
+
+
+ afterRender : function(){
+ Ext.ToolTip.superclass.afterRender.call(this);
+ this.anchorEl.setStyle('z-index', this.el.getZIndex() + 1).setVisibilityMode(Ext.Element.DISPLAY);
+ },
+
+
+ initTarget : function(target){
+ var t;
+ if((t = Ext.get(target))){
+ if(this.target){
+ var tg = Ext.get(this.target);
+ this.mun(tg, 'mouseover', this.onTargetOver, this);
+ this.mun(tg, 'mouseout', this.onTargetOut, this);
+ this.mun(tg, 'mousemove', this.onMouseMove, this);
+ }
+ this.mon(t, {
+ mouseover: this.onTargetOver,
+ mouseout: this.onTargetOut,
+ mousemove: this.onMouseMove,
+ scope: this
+ });
+ this.target = t;
+ }
+ if(this.anchor){
+ this.anchorTarget = this.target;
+ }
+ },
+
+
+ onMouseMove : function(e){
+ var t = this.delegate ? e.getTarget(this.delegate) : this.triggerElement = true;
+ if (t) {
+ this.targetXY = e.getXY();
+ if (t === this.triggerElement) {
+ if(!this.hidden && this.trackMouse){
+ this.setPagePosition(this.getTargetXY());
+ }
+ } else {
+ this.hide();
+ this.lastActive = new Date(0);
+ this.onTargetOver(e);
+ }
+ } else if (!this.closable && this.isVisible()) {
+ this.hide();
+ }
+ },
+
+
+ getTargetXY : function(){
+ if(this.delegate){
+ this.anchorTarget = this.triggerElement;
+ }
+ if(this.anchor){
+ this.targetCounter++;
+ var offsets = this.getOffsets(),
+ xy = (this.anchorToTarget && !this.trackMouse) ? this.el.getAlignToXY(this.anchorTarget, this.getAnchorAlign()) : this.targetXY,
+ dw = Ext.lib.Dom.getViewWidth() - 5,
+ dh = Ext.lib.Dom.getViewHeight() - 5,
+ de = document.documentElement,
+ bd = document.body,
+ scrollX = (de.scrollLeft || bd.scrollLeft || 0) + 5,
+ scrollY = (de.scrollTop || bd.scrollTop || 0) + 5,
+ axy = [xy[0] + offsets[0], xy[1] + offsets[1]],
+ sz = this.getSize();
+
+ this.anchorEl.removeClass(this.anchorCls);
+
+ if(this.targetCounter < 2){
+ if(axy[0] < scrollX){
+ if(this.anchorToTarget){
+ this.defaultAlign = 'l-r';
+ if(this.mouseOffset){this.mouseOffset[0] *= -1;}
+ }
+ this.anchor = 'left';
+ return this.getTargetXY();
+ }
+ if(axy[0]+sz.width > dw){
+ if(this.anchorToTarget){
+ this.defaultAlign = 'r-l';
+ if(this.mouseOffset){this.mouseOffset[0] *= -1;}
+ }
+ this.anchor = 'right';
+ return this.getTargetXY();
+ }
+ if(axy[1] < scrollY){
+ if(this.anchorToTarget){
+ this.defaultAlign = 't-b';
+ if(this.mouseOffset){this.mouseOffset[1] *= -1;}
+ }
+ this.anchor = 'top';
+ return this.getTargetXY();
+ }
+ if(axy[1]+sz.height > dh){
+ if(this.anchorToTarget){
+ this.defaultAlign = 'b-t';
+ if(this.mouseOffset){this.mouseOffset[1] *= -1;}
+ }
+ this.anchor = 'bottom';
+ return this.getTargetXY();
+ }
+ }
+
+ this.anchorCls = 'x-tip-anchor-'+this.getAnchorPosition();
+ this.anchorEl.addClass(this.anchorCls);
+ this.targetCounter = 0;
+ return axy;
+ }else{
+ var mouseOffset = this.getMouseOffset();
+ return [this.targetXY[0]+mouseOffset[0], this.targetXY[1]+mouseOffset[1]];
+ }
+ },
+
+ getMouseOffset : function(){
+ var offset = this.anchor ? [0,0] : [15,18];
+ if(this.mouseOffset){
+ offset[0] += this.mouseOffset[0];
+ offset[1] += this.mouseOffset[1];
+ }
+ return offset;
+ },
+
+
+ getAnchorPosition : function(){
+ if(this.anchor){
+ this.tipAnchor = this.anchor.charAt(0);
+ }else{
+ var m = this.defaultAlign.match(/^([a-z]+)-([a-z]+)(\?)?$/);
+ if(!m){
+ throw 'AnchorTip.defaultAlign is invalid';
+ }
+ this.tipAnchor = m[1].charAt(0);
+ }
+
+ switch(this.tipAnchor){
+ case 't': return 'top';
+ case 'b': return 'bottom';
+ case 'r': return 'right';
+ }
+ return 'left';
+ },
+
+
+ getAnchorAlign : function(){
+ switch(this.anchor){
+ case 'top' : return 'tl-bl';
+ case 'left' : return 'tl-tr';
+ case 'right': return 'tr-tl';
+ default : return 'bl-tl';
+ }
+ },
+
+
+ getOffsets : function(){
+ var offsets,
+ ap = this.getAnchorPosition().charAt(0);
+ if(this.anchorToTarget && !this.trackMouse){
+ switch(ap){
+ case 't':
+ offsets = [0, 9];
+ break;
+ case 'b':
+ offsets = [0, -13];
+ break;
+ case 'r':
+ offsets = [-13, 0];
+ break;
+ default:
+ offsets = [9, 0];
+ break;
+ }
+ }else{
+ switch(ap){
+ case 't':
+ offsets = [-15-this.anchorOffset, 30];
+ break;
+ case 'b':
+ offsets = [-19-this.anchorOffset, -13-this.el.dom.offsetHeight];
+ break;
+ case 'r':
+ offsets = [-15-this.el.dom.offsetWidth, -13-this.anchorOffset];
+ break;
+ default:
+ offsets = [25, -13-this.anchorOffset];
+ break;
+ }
+ }
+ var mouseOffset = this.getMouseOffset();
+ offsets[0] += mouseOffset[0];
+ offsets[1] += mouseOffset[1];
+
+ return offsets;
+ },
+
+
+ onTargetOver : function(e){
+ if(this.disabled || e.within(this.target.dom, true)){
+ return;
+ }
+ var t = e.getTarget(this.delegate);
+ if (t) {
+ this.triggerElement = t;
+ this.clearTimer('hide');
+ this.targetXY = e.getXY();
+ this.delayShow();
+ }
+ },
+
+
+ delayShow : function(){
+ if(this.hidden && !this.showTimer){
+ if(this.lastActive.getElapsed() < this.quickShowInterval){
+ this.show();
+ }else{
+ this.showTimer = this.show.defer(this.showDelay, this);
+ }
+ }else if(!this.hidden && this.autoHide !== false){
+ this.show();
+ }
+ },
+
+
+ onTargetOut : function(e){
+ if(this.disabled || e.within(this.target.dom, true)){
+ return;
+ }
+ this.clearTimer('show');
+ if(this.autoHide !== false){
+ this.delayHide();
+ }
+ },
+
+
+ delayHide : function(){
+ if(!this.hidden && !this.hideTimer){
+ this.hideTimer = this.hide.defer(this.hideDelay, this);
+ }
+ },
+
+
+ hide: function(){
+ this.clearTimer('dismiss');
+ this.lastActive = new Date();
+ if(this.anchorEl){
+ this.anchorEl.hide();
+ }
+ Ext.ToolTip.superclass.hide.call(this);
+ delete this.triggerElement;
+ },
+
+
+ show : function(){
+ if(this.anchor){
+
+
+ this.showAt([-1000,-1000]);
+ this.origConstrainPosition = this.constrainPosition;
+ this.constrainPosition = false;
+ this.anchor = this.origAnchor;
+ }
+ this.showAt(this.getTargetXY());
+
+ if(this.anchor){
+ this.anchorEl.show();
+ this.syncAnchor();
+ this.constrainPosition = this.origConstrainPosition;
+ }else{
+ this.anchorEl.hide();
+ }
+ },
+
+
+ showAt : function(xy){
+ this.lastActive = new Date();
+ this.clearTimers();
+ Ext.ToolTip.superclass.showAt.call(this, xy);
+ if(this.dismissDelay && this.autoHide !== false){
+ this.dismissTimer = this.hide.defer(this.dismissDelay, this);
+ }
+ if(this.anchor && !this.anchorEl.isVisible()){
+ this.syncAnchor();
+ this.anchorEl.show();
+ }else{
+ this.anchorEl.hide();
+ }
+ },
+
+
+ syncAnchor : function(){
+ var anchorPos, targetPos, offset;
+ switch(this.tipAnchor.charAt(0)){
+ case 't':
+ anchorPos = 'b';
+ targetPos = 'tl';
+ offset = [20+this.anchorOffset, 2];
+ break;
+ case 'r':
+ anchorPos = 'l';
+ targetPos = 'tr';
+ offset = [-2, 11+this.anchorOffset];
+ break;
+ case 'b':
+ anchorPos = 't';
+ targetPos = 'bl';
+ offset = [20+this.anchorOffset, -2];
+ break;
+ default:
+ anchorPos = 'r';
+ targetPos = 'tl';
+ offset = [2, 11+this.anchorOffset];
+ break;
+ }
+ this.anchorEl.alignTo(this.el, anchorPos+'-'+targetPos, offset);
+ },
+
+
+ setPagePosition : function(x, y){
+ Ext.ToolTip.superclass.setPagePosition.call(this, x, y);
+ if(this.anchor){
+ this.syncAnchor();
+ }
+ },
+
+
+ clearTimer : function(name){
+ name = name + 'Timer';
+ clearTimeout(this[name]);
+ delete this[name];
+ },
+
+
+ clearTimers : function(){
+ this.clearTimer('show');
+ this.clearTimer('dismiss');
+ this.clearTimer('hide');
+ },
+
+
+ onShow : function(){
+ Ext.ToolTip.superclass.onShow.call(this);
+ Ext.getDoc().on('mousedown', this.onDocMouseDown, this);
+ },
+
+
+ onHide : function(){
+ Ext.ToolTip.superclass.onHide.call(this);
+ Ext.getDoc().un('mousedown', this.onDocMouseDown, this);
+ },
+
+
+ onDocMouseDown : function(e){
+ if(this.autoHide !== true && !this.closable && !e.within(this.el.dom)){
+ this.disable();
+ this.doEnable.defer(100, this);
+ }
+ },
+
+
+ doEnable : function(){
+ if(!this.isDestroyed){
+ this.enable();
+ }
+ },
+
+
+ onDisable : function(){
+ this.clearTimers();
+ this.hide();
+ },
+
+
+ adjustPosition : function(x, y){
+ if(this.constrainPosition){
+ var ay = this.targetXY[1], h = this.getSize().height;
+ if(y <= ay && (y+h) >= ay){
+ y = ay-h-5;
+ }
+ }
+ return {x : x, y: y};
+ },
+
+ beforeDestroy : function(){
+ this.clearTimers();
+ Ext.destroy(this.anchorEl);
+ delete this.anchorEl;
+ delete this.target;
+ delete this.anchorTarget;
+ delete this.triggerElement;
+ Ext.ToolTip.superclass.beforeDestroy.call(this);
+ },
+
+
+ onDestroy : function(){
+ Ext.getDoc().un('mousedown', this.onDocMouseDown, this);
+ Ext.ToolTip.superclass.onDestroy.call(this);
+ }
+});
+
+Ext.reg('tooltip', Ext.ToolTip);
+Ext.QuickTip = Ext.extend(Ext.ToolTip, {
+
+
+ interceptTitles : false,
+
+
+ tagConfig : {
+ namespace : "ext",
+ attribute : "qtip",
+ width : "qwidth",
+ target : "target",
+ title : "qtitle",
+ hide : "hide",
+ cls : "qclass",
+ align : "qalign",
+ anchor : "anchor"
+ },
+
+
+ initComponent : function(){
+ this.target = this.target || Ext.getDoc();
+ this.targets = this.targets || {};
+ Ext.QuickTip.superclass.initComponent.call(this);
+ },
+
+
+ register : function(config){
+ var cs = Ext.isArray(config) ? config : arguments;
+ for(var i = 0, len = cs.length; i < len; i++){
+ var c = cs[i];
+ var target = c.target;
+ if(target){
+ if(Ext.isArray(target)){
+ for(var j = 0, jlen = target.length; j < jlen; j++){
+ this.targets[Ext.id(target[j])] = c;
+ }
+ } else{
+ this.targets[Ext.id(target)] = c;
+ }
+ }
+ }
+ },
+
+
+ unregister : function(el){
+ delete this.targets[Ext.id(el)];
+ },
+
+
+ cancelShow: function(el){
+ var at = this.activeTarget;
+ el = Ext.get(el).dom;
+ if(this.isVisible()){
+ if(at && at.el == el){
+ this.hide();
+ }
+ }else if(at && at.el == el){
+ this.clearTimer('show');
+ }
+ },
+
+ getTipCfg: function(e) {
+ var t = e.getTarget(),
+ ttp,
+ cfg;
+ if(this.interceptTitles && t.title && Ext.isString(t.title)){
+ ttp = t.title;
+ t.qtip = ttp;
+ t.removeAttribute("title");
+ e.preventDefault();
+ }else{
+ cfg = this.tagConfig;
+ ttp = t.qtip || Ext.fly(t).getAttribute(cfg.attribute, cfg.namespace);
+ }
+ return ttp;
+ },
+
+
+ onTargetOver : function(e){
+ if(this.disabled){
+ return;
+ }
+ this.targetXY = e.getXY();
+ var t = e.getTarget();
+ if(!t || t.nodeType !== 1 || t == document || t == document.body){
+ return;
+ }
+ if(this.activeTarget && ((t == this.activeTarget.el) || Ext.fly(this.activeTarget.el).contains(t))){
+ this.clearTimer('hide');
+ this.show();
+ return;
+ }
+ if(t && this.targets[t.id]){
+ this.activeTarget = this.targets[t.id];
+ this.activeTarget.el = t;
+ this.anchor = this.activeTarget.anchor;
+ if(this.anchor){
+ this.anchorTarget = t;
+ }
+ this.delayShow();
+ return;
+ }
+ var ttp, et = Ext.fly(t), cfg = this.tagConfig, ns = cfg.namespace;
+ if(ttp = this.getTipCfg(e)){
+ var autoHide = et.getAttribute(cfg.hide, ns);
+ this.activeTarget = {
+ el: t,
+ text: ttp,
+ width: et.getAttribute(cfg.width, ns),
+ autoHide: autoHide != "user" && autoHide !== 'false',
+ title: et.getAttribute(cfg.title, ns),
+ cls: et.getAttribute(cfg.cls, ns),
+ align: et.getAttribute(cfg.align, ns)
+
+ };
+ this.anchor = et.getAttribute(cfg.anchor, ns);
+ if(this.anchor){
+ this.anchorTarget = t;
+ }
+ this.delayShow();
+ }
+ },
+
+
+ onTargetOut : function(e){
+
+
+ if (this.activeTarget && e.within(this.activeTarget.el) && !this.getTipCfg(e)) {
+ return;
+ }
+
+ this.clearTimer('show');
+ if(this.autoHide !== false){
+ this.delayHide();
+ }
+ },
+
+
+ showAt : function(xy){
+ var t = this.activeTarget;
+ if(t){
+ if(!this.rendered){
+ this.render(Ext.getBody());
+ this.activeTarget = t;
+ }
+ if(t.width){
+ this.setWidth(t.width);
+ this.body.setWidth(this.adjustBodyWidth(t.width - this.getFrameWidth()));
+ this.measureWidth = false;
+ } else{
+ this.measureWidth = true;
+ }
+ this.setTitle(t.title || '');
+ this.body.update(t.text);
+ this.autoHide = t.autoHide;
+ this.dismissDelay = t.dismissDelay || this.dismissDelay;
+ if(this.lastCls){
+ this.el.removeClass(this.lastCls);
+ delete this.lastCls;
+ }
+ if(t.cls){
+ this.el.addClass(t.cls);
+ this.lastCls = t.cls;
+ }
+ if(this.anchor){
+ this.constrainPosition = false;
+ }else if(t.align){
+ xy = this.el.getAlignToXY(t.el, t.align);
+ this.constrainPosition = false;
+ }else{
+ this.constrainPosition = true;
+ }
+ }
+ Ext.QuickTip.superclass.showAt.call(this, xy);
+ },
+
+
+ hide: function(){
+ delete this.activeTarget;
+ Ext.QuickTip.superclass.hide.call(this);
+ }
+});
+Ext.reg('quicktip', Ext.QuickTip);
+Ext.QuickTips = function(){
+ var tip,
+ disabled = false;
+
+ return {
+
+ init : function(autoRender){
+ if(!tip){
+ if(!Ext.isReady){
+ Ext.onReady(function(){
+ Ext.QuickTips.init(autoRender);
+ });
+ return;
+ }
+ tip = new Ext.QuickTip({
+ elements:'header,body',
+ disabled: disabled
+ });
+ if(autoRender !== false){
+ tip.render(Ext.getBody());
+ }
+ }
+ },
+
+
+ ddDisable : function(){
+
+ if(tip && !disabled){
+ tip.disable();
+ }
+ },
+
+
+ ddEnable : function(){
+
+ if(tip && !disabled){
+ tip.enable();
+ }
+ },
+
+
+ enable : function(){
+ if(tip){
+ tip.enable();
+ }
+ disabled = false;
+ },
+
+
+ disable : function(){
+ if(tip){
+ tip.disable();
+ }
+ disabled = true;
+ },
+
+
+ isEnabled : function(){
+ return tip !== undefined && !tip.disabled;
+ },
+
+
+ getQuickTip : function(){
+ return tip;
+ },
+
+
+ register : function(){
+ tip.register.apply(tip, arguments);
+ },
+
+
+ unregister : function(){
+ tip.unregister.apply(tip, arguments);
+ },
+
+
+ tips : function(){
+ tip.register.apply(tip, arguments);
+ }
+ };
+}();
+Ext.slider.Tip = Ext.extend(Ext.Tip, {
+ minWidth: 10,
+ offsets : [0, -10],
+
+ init: function(slider) {
+ slider.on({
+ scope : this,
+ dragstart: this.onSlide,
+ drag : this.onSlide,
+ dragend : this.hide,
+ destroy : this.destroy
+ });
+ },
+
+
+ onSlide : function(slider, e, thumb) {
+ this.show();
+ this.body.update(this.getText(thumb));
+ this.doAutoWidth();
+ this.el.alignTo(thumb.el, 'b-t?', this.offsets);
+ },
+
+
+ getText : function(thumb) {
+ return String(thumb.value);
+ }
+});
+
+
+Ext.ux.SliderTip = Ext.slider.Tip;
+Ext.tree.TreePanel = Ext.extend(Ext.Panel, {
+ rootVisible : true,
+ animate : Ext.enableFx,
+ lines : true,
+ enableDD : false,
+ hlDrop : Ext.enableFx,
+ pathSeparator : '/',
+
+
+ bubbleEvents : [],
+
+ initComponent : function(){
+ Ext.tree.TreePanel.superclass.initComponent.call(this);
+
+ if(!this.eventModel){
+ this.eventModel = new Ext.tree.TreeEventModel(this);
+ }
+
+
+ var l = this.loader;
+ if(!l){
+ l = new Ext.tree.TreeLoader({
+ dataUrl: this.dataUrl,
+ requestMethod: this.requestMethod
+ });
+ }else if(Ext.isObject(l) && !l.load){
+ l = new Ext.tree.TreeLoader(l);
+ }
+ this.loader = l;
+
+ this.nodeHash = {};
+
+
+ if(this.root){
+ var r = this.root;
+ delete this.root;
+ this.setRootNode(r);
+ }
+
+
+ this.addEvents(
+
+
+ 'append',
+
+ 'remove',
+
+ 'movenode',
+
+ 'insert',
+
+ 'beforeappend',
+
+ 'beforeremove',
+
+ 'beforemovenode',
+
+ 'beforeinsert',
+
+
+ 'beforeload',
+
+ 'load',
+
+ 'textchange',
+
+ 'beforeexpandnode',
+
+ 'beforecollapsenode',
+
+ 'expandnode',
+
+ 'disabledchange',
+
+ 'collapsenode',
+
+ 'beforeclick',
+
+ 'click',
+
+ 'containerclick',
+
+ 'checkchange',
+
+ 'beforedblclick',
+
+ 'dblclick',
+
+ 'containerdblclick',
+
+ 'contextmenu',
+
+ 'containercontextmenu',
+
+ 'beforechildrenrendered',
+
+ 'startdrag',
+
+ 'enddrag',
+
+ 'dragdrop',
+
+ 'beforenodedrop',
+
+ 'nodedrop',
+
+ 'nodedragover'
+ );
+ if(this.singleExpand){
+ this.on('beforeexpandnode', this.restrictExpand, this);
+ }
+ },
+
+
+ proxyNodeEvent : function(ename, a1, a2, a3, a4, a5, a6){
+ if(ename == 'collapse' || ename == 'expand' || ename == 'beforecollapse' || ename == 'beforeexpand' || ename == 'move' || ename == 'beforemove'){
+ ename = ename+'node';
+ }
+
+ return this.fireEvent(ename, a1, a2, a3, a4, a5, a6);
+ },
+
+
+
+ getRootNode : function(){
+ return this.root;
+ },
+
+
+ setRootNode : function(node){
+ this.destroyRoot();
+ if(!node.render){
+ node = this.loader.createNode(node);
+ }
+ this.root = node;
+ node.ownerTree = this;
+ node.isRoot = true;
+ this.registerNode(node);
+ if(!this.rootVisible){
+ var uiP = node.attributes.uiProvider;
+ node.ui = uiP ? new uiP(node) : new Ext.tree.RootTreeNodeUI(node);
+ }
+ if(this.innerCt){
+ this.clearInnerCt();
+ this.renderRoot();
+ }
+ return node;
+ },
+
+ clearInnerCt : function(){
+ this.innerCt.update('');
+ },
+
+
+ renderRoot : function(){
+ this.root.render();
+ if(!this.rootVisible){
+ this.root.renderChildren();
+ }
+ },
+
+
+ getNodeById : function(id){
+ return this.nodeHash[id];
+ },
+
+
+ registerNode : function(node){
+ this.nodeHash[node.id] = node;
+ },
+
+
+ unregisterNode : function(node){
+ delete this.nodeHash[node.id];
+ },
+
+
+ toString : function(){
+ return '[Tree'+(this.id?' '+this.id:'')+']';
+ },
+
+
+ restrictExpand : function(node){
+ var p = node.parentNode;
+ if(p){
+ if(p.expandedChild && p.expandedChild.parentNode == p){
+ p.expandedChild.collapse();
+ }
+ p.expandedChild = node;
+ }
+ },
+
+
+ getChecked : function(a, startNode){
+ startNode = startNode || this.root;
+ var r = [];
+ var f = function(){
+ if(this.attributes.checked){
+ r.push(!a ? this : (a == 'id' ? this.id : this.attributes[a]));
+ }
+ };
+ startNode.cascade(f);
+ return r;
+ },
+
+
+ getLoader : function(){
+ return this.loader;
+ },
+
+
+ expandAll : function(){
+ this.root.expand(true);
+ },
+
+
+ collapseAll : function(){
+ this.root.collapse(true);
+ },
+
+
+ getSelectionModel : function(){
+ if(!this.selModel){
+ this.selModel = new Ext.tree.DefaultSelectionModel();
+ }
+ return this.selModel;
+ },
+
+
+ expandPath : function(path, attr, callback){
+ if(Ext.isEmpty(path)){
+ if(callback){
+ callback(false, undefined);
+ }
+ return;
+ }
+ attr = attr || 'id';
+ var keys = path.split(this.pathSeparator);
+ var curNode = this.root;
+ if(curNode.attributes[attr] != keys[1]){
+ if(callback){
+ callback(false, null);
+ }
+ return;
+ }
+ var index = 1;
+ var f = function(){
+ if(++index == keys.length){
+ if(callback){
+ callback(true, curNode);
+ }
+ return;
+ }
+ var c = curNode.findChild(attr, keys[index]);
+ if(!c){
+ if(callback){
+ callback(false, curNode);
+ }
+ return;
+ }
+ curNode = c;
+ c.expand(false, false, f);
+ };
+ curNode.expand(false, false, f);
+ },
+
+
+ selectPath : function(path, attr, callback){
+ if(Ext.isEmpty(path)){
+ if(callback){
+ callback(false, undefined);
+ }
+ return;
+ }
+ attr = attr || 'id';
+ var keys = path.split(this.pathSeparator),
+ v = keys.pop();
+ if(keys.length > 1){
+ var f = function(success, node){
+ if(success && node){
+ var n = node.findChild(attr, v);
+ if(n){
+ n.select();
+ if(callback){
+ callback(true, n);
+ }
+ }else if(callback){
+ callback(false, n);
+ }
+ }else{
+ if(callback){
+ callback(false, n);
+ }
+ }
+ };
+ this.expandPath(keys.join(this.pathSeparator), attr, f);
+ }else{
+ this.root.select();
+ if(callback){
+ callback(true, this.root);
+ }
+ }
+ },
+
+
+ getTreeEl : function(){
+ return this.body;
+ },
+
+
+ onRender : function(ct, position){
+ Ext.tree.TreePanel.superclass.onRender.call(this, ct, position);
+ this.el.addClass('x-tree');
+ this.innerCt = this.body.createChild({tag:'ul',
+ cls:'x-tree-root-ct ' +
+ (this.useArrows ? 'x-tree-arrows' : this.lines ? 'x-tree-lines' : 'x-tree-no-lines')});
+ },
+
+
+ initEvents : function(){
+ Ext.tree.TreePanel.superclass.initEvents.call(this);
+
+ if(this.containerScroll){
+ Ext.dd.ScrollManager.register(this.body);
+ }
+ if((this.enableDD || this.enableDrop) && !this.dropZone){
+
+ this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || {
+ ddGroup: this.ddGroup || 'TreeDD', appendOnly: this.ddAppendOnly === true
+ });
+ }
+ if((this.enableDD || this.enableDrag) && !this.dragZone){
+
+ this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || {
+ ddGroup: this.ddGroup || 'TreeDD',
+ scroll: this.ddScroll
+ });
+ }
+ this.getSelectionModel().init(this);
+ },
+
+
+ afterRender : function(){
+ Ext.tree.TreePanel.superclass.afterRender.call(this);
+ this.renderRoot();
+ },
+
+ beforeDestroy : function(){
+ if(this.rendered){
+ Ext.dd.ScrollManager.unregister(this.body);
+ Ext.destroy(this.dropZone, this.dragZone);
+ }
+ this.destroyRoot();
+ Ext.destroy(this.loader);
+ this.nodeHash = this.root = this.loader = null;
+ Ext.tree.TreePanel.superclass.beforeDestroy.call(this);
+ },
+
+
+ destroyRoot : function(){
+ if(this.root && this.root.destroy){
+ this.root.destroy(true);
+ }
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+});
+
+Ext.tree.TreePanel.nodeTypes = {};
+
+Ext.reg('treepanel', Ext.tree.TreePanel);Ext.tree.TreeEventModel = function(tree){
+ this.tree = tree;
+ this.tree.on('render', this.initEvents, this);
+};
+
+Ext.tree.TreeEventModel.prototype = {
+ initEvents : function(){
+ var t = this.tree;
+
+ if(t.trackMouseOver !== false){
+ t.mon(t.innerCt, {
+ scope: this,
+ mouseover: this.delegateOver,
+ mouseout: this.delegateOut
+ });
+ }
+ t.mon(t.getTreeEl(), {
+ scope: this,
+ click: this.delegateClick,
+ dblclick: this.delegateDblClick,
+ contextmenu: this.delegateContextMenu
+ });
+ },
+
+ getNode : function(e){
+ var t;
+ if(t = e.getTarget('.x-tree-node-el', 10)){
+ var id = Ext.fly(t, '_treeEvents').getAttribute('tree-node-id', 'ext');
+ if(id){
+ return this.tree.getNodeById(id);
+ }
+ }
+ return null;
+ },
+
+ getNodeTarget : function(e){
+ var t = e.getTarget('.x-tree-node-icon', 1);
+ if(!t){
+ t = e.getTarget('.x-tree-node-el', 6);
+ }
+ return t;
+ },
+
+ delegateOut : function(e, t){
+ if(!this.beforeEvent(e)){
+ return;
+ }
+ if(e.getTarget('.x-tree-ec-icon', 1)){
+ var n = this.getNode(e);
+ this.onIconOut(e, n);
+ if(n == this.lastEcOver){
+ delete this.lastEcOver;
+ }
+ }
+ if((t = this.getNodeTarget(e)) && !e.within(t, true)){
+ this.onNodeOut(e, this.getNode(e));
+ }
+ },
+
+ delegateOver : function(e, t){
+ if(!this.beforeEvent(e)){
+ return;
+ }
+ if(Ext.isGecko && !this.trackingDoc){
+ Ext.getBody().on('mouseover', this.trackExit, this);
+ this.trackingDoc = true;
+ }
+ if(this.lastEcOver){
+ this.onIconOut(e, this.lastEcOver);
+ delete this.lastEcOver;
+ }
+ if(e.getTarget('.x-tree-ec-icon', 1)){
+ this.lastEcOver = this.getNode(e);
+ this.onIconOver(e, this.lastEcOver);
+ }
+ if(t = this.getNodeTarget(e)){
+ this.onNodeOver(e, this.getNode(e));
+ }
+ },
+
+ trackExit : function(e){
+ if(this.lastOverNode){
+ if(this.lastOverNode.ui && !e.within(this.lastOverNode.ui.getEl())){
+ this.onNodeOut(e, this.lastOverNode);
+ }
+ delete this.lastOverNode;
+ Ext.getBody().un('mouseover', this.trackExit, this);
+ this.trackingDoc = false;
+ }
+
+ },
+
+ delegateClick : function(e, t){
+ if(this.beforeEvent(e)){
+ if(e.getTarget('input[type=checkbox]', 1)){
+ this.onCheckboxClick(e, this.getNode(e));
+ }else if(e.getTarget('.x-tree-ec-icon', 1)){
+ this.onIconClick(e, this.getNode(e));
+ }else if(this.getNodeTarget(e)){
+ this.onNodeClick(e, this.getNode(e));
+ }
+ }else{
+ this.checkContainerEvent(e, 'click');
+ }
+ },
+
+ delegateDblClick : function(e, t){
+ if(this.beforeEvent(e)){
+ if(this.getNodeTarget(e)){
+ this.onNodeDblClick(e, this.getNode(e));
+ }
+ }else{
+ this.checkContainerEvent(e, 'dblclick');
+ }
+ },
+
+ delegateContextMenu : function(e, t){
+ if(this.beforeEvent(e)){
+ if(this.getNodeTarget(e)){
+ this.onNodeContextMenu(e, this.getNode(e));
+ }
+ }else{
+ this.checkContainerEvent(e, 'contextmenu');
+ }
+ },
+
+ checkContainerEvent: function(e, type){
+ if(this.disabled){
+ e.stopEvent();
+ return false;
+ }
+ this.onContainerEvent(e, type);
+ },
+
+ onContainerEvent: function(e, type){
+ this.tree.fireEvent('container' + type, this.tree, e);
+ },
+
+ onNodeClick : function(e, node){
+ node.ui.onClick(e);
+ },
+
+ onNodeOver : function(e, node){
+ this.lastOverNode = node;
+ node.ui.onOver(e);
+ },
+
+ onNodeOut : function(e, node){
+ node.ui.onOut(e);
+ },
+
+ onIconOver : function(e, node){
+ node.ui.addClass('x-tree-ec-over');
+ },
+
+ onIconOut : function(e, node){
+ node.ui.removeClass('x-tree-ec-over');
+ },
+
+ onIconClick : function(e, node){
+ node.ui.ecClick(e);
+ },
+
+ onCheckboxClick : function(e, node){
+ node.ui.onCheckChange(e);
+ },
+
+ onNodeDblClick : function(e, node){
+ node.ui.onDblClick(e);
+ },
+
+ onNodeContextMenu : function(e, node){
+ node.ui.onContextMenu(e);
+ },
+
+ beforeEvent : function(e){
+ var node = this.getNode(e);
+ if(this.disabled || !node || !node.ui){
+ e.stopEvent();
+ return false;
+ }
+ return true;
+ },
+
+ disable: function(){
+ this.disabled = true;
+ },
+
+ enable: function(){
+ this.disabled = false;
+ }
+};
+Ext.tree.DefaultSelectionModel = Ext.extend(Ext.util.Observable, {
+
+ constructor : function(config){
+ this.selNode = null;
+
+ this.addEvents(
+
+ 'selectionchange',
+
+
+ 'beforeselect'
+ );
+
+ Ext.apply(this, config);
+ Ext.tree.DefaultSelectionModel.superclass.constructor.call(this);
+ },
+
+ init : function(tree){
+ this.tree = tree;
+ tree.mon(tree.getTreeEl(), 'keydown', this.onKeyDown, this);
+ tree.on('click', this.onNodeClick, this);
+ },
+
+ onNodeClick : function(node, e){
+ this.select(node);
+ },
+
+
+ select : function(node, selectNextNode){
+
+ if (!Ext.fly(node.ui.wrap).isVisible() && selectNextNode) {
+ return selectNextNode.call(this, node);
+ }
+ var last = this.selNode;
+ if(node == last){
+ node.ui.onSelectedChange(true);
+ }else if(this.fireEvent('beforeselect', this, node, last) !== false){
+ if(last && last.ui){
+ last.ui.onSelectedChange(false);
+ }
+ this.selNode = node;
+ node.ui.onSelectedChange(true);
+ this.fireEvent('selectionchange', this, node, last);
+ }
+ return node;
+ },
+
+
+ unselect : function(node, silent){
+ if(this.selNode == node){
+ this.clearSelections(silent);
+ }
+ },
+
+
+ clearSelections : function(silent){
+ var n = this.selNode;
+ if(n){
+ n.ui.onSelectedChange(false);
+ this.selNode = null;
+ if(silent !== true){
+ this.fireEvent('selectionchange', this, null);
+ }
+ }
+ return n;
+ },
+
+
+ getSelectedNode : function(){
+ return this.selNode;
+ },
+
+
+ isSelected : function(node){
+ return this.selNode == node;
+ },
+
+
+ selectPrevious : function( s){
+ if(!(s = s || this.selNode || this.lastSelNode)){
+ return null;
+ }
+
+ var ps = s.previousSibling;
+ if(ps){
+ if(!ps.isExpanded() || ps.childNodes.length < 1){
+ return this.select(ps, this.selectPrevious);
+ } else{
+ var lc = ps.lastChild;
+ while(lc && lc.isExpanded() && Ext.fly(lc.ui.wrap).isVisible() && lc.childNodes.length > 0){
+ lc = lc.lastChild;
+ }
+ return this.select(lc, this.selectPrevious);
+ }
+ } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){
+ return this.select(s.parentNode, this.selectPrevious);
+ }
+ return null;
+ },
+
+
+ selectNext : function( s){
+ if(!(s = s || this.selNode || this.lastSelNode)){
+ return null;
+ }
+
+ if(s.firstChild && s.isExpanded() && Ext.fly(s.ui.wrap).isVisible()){
+ return this.select(s.firstChild, this.selectNext);
+ }else if(s.nextSibling){
+ return this.select(s.nextSibling, this.selectNext);
+ }else if(s.parentNode){
+ var newS = null;
+ s.parentNode.bubble(function(){
+ if(this.nextSibling){
+ newS = this.getOwnerTree().selModel.select(this.nextSibling, this.selectNext);
+ return false;
+ }
+ });
+ return newS;
+ }
+ return null;
+ },
+
+ onKeyDown : function(e){
+ var s = this.selNode || this.lastSelNode;
+
+ var sm = this;
+ if(!s){
+ return;
+ }
+ var k = e.getKey();
+ switch(k){
+ case e.DOWN:
+ e.stopEvent();
+ this.selectNext();
+ break;
+ case e.UP:
+ e.stopEvent();
+ this.selectPrevious();
+ break;
+ case e.RIGHT:
+ e.preventDefault();
+ if(s.hasChildNodes()){
+ if(!s.isExpanded()){
+ s.expand();
+ }else if(s.firstChild){
+ this.select(s.firstChild, e);
+ }
+ }
+ break;
+ case e.LEFT:
+ e.preventDefault();
+ if(s.hasChildNodes() && s.isExpanded()){
+ s.collapse();
+ }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){
+ this.select(s.parentNode, e);
+ }
+ break;
+ };
+ }
+});
+
+
+Ext.tree.MultiSelectionModel = Ext.extend(Ext.util.Observable, {
+
+ constructor : function(config){
+ this.selNodes = [];
+ this.selMap = {};
+ this.addEvents(
+
+ 'selectionchange'
+ );
+ Ext.apply(this, config);
+ Ext.tree.MultiSelectionModel.superclass.constructor.call(this);
+ },
+
+ init : function(tree){
+ this.tree = tree;
+ tree.mon(tree.getTreeEl(), 'keydown', this.onKeyDown, this);
+ tree.on('click', this.onNodeClick, this);
+ },
+
+ onNodeClick : function(node, e){
+ if(e.ctrlKey && this.isSelected(node)){
+ this.unselect(node);
+ }else{
+ this.select(node, e, e.ctrlKey);
+ }
+ },
+
+
+ select : function(node, e, keepExisting){
+ if(keepExisting !== true){
+ this.clearSelections(true);
+ }
+ if(this.isSelected(node)){
+ this.lastSelNode = node;
+ return node;
+ }
+ this.selNodes.push(node);
+ this.selMap[node.id] = node;
+ this.lastSelNode = node;
+ node.ui.onSelectedChange(true);
+ this.fireEvent('selectionchange', this, this.selNodes);
+ return node;
+ },
+
+
+ unselect : function(node){
+ if(this.selMap[node.id]){
+ node.ui.onSelectedChange(false);
+ var sn = this.selNodes;
+ var index = sn.indexOf(node);
+ if(index != -1){
+ this.selNodes.splice(index, 1);
+ }
+ delete this.selMap[node.id];
+ this.fireEvent('selectionchange', this, this.selNodes);
+ }
+ },
+
+
+ clearSelections : function(suppressEvent){
+ var sn = this.selNodes;
+ if(sn.length > 0){
+ for(var i = 0, len = sn.length; i < len; i++){
+ sn[i].ui.onSelectedChange(false);
+ }
+ this.selNodes = [];
+ this.selMap = {};
+ if(suppressEvent !== true){
+ this.fireEvent('selectionchange', this, this.selNodes);
+ }
+ }
+ },
+
+
+ isSelected : function(node){
+ return this.selMap[node.id] ? true : false;
+ },
+
+
+ getSelectedNodes : function(){
+ return this.selNodes.concat([]);
+ },
+
+ onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown,
+
+ selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext,
+
+ selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious
+});
+Ext.data.Tree = Ext.extend(Ext.util.Observable, {
+
+ constructor: function(root){
+ this.nodeHash = {};
+
+ this.root = null;
+ if(root){
+ this.setRootNode(root);
+ }
+ this.addEvents(
+
+ "append",
+
+ "remove",
+
+ "move",
+
+ "insert",
+
+ "beforeappend",
+
+ "beforeremove",
+
+ "beforemove",
+
+ "beforeinsert"
+ );
+ Ext.data.Tree.superclass.constructor.call(this);
+ },
+
+
+ pathSeparator: "/",
+
+
+ proxyNodeEvent : function(){
+ return this.fireEvent.apply(this, arguments);
+ },
+
+
+ getRootNode : function(){
+ return this.root;
+ },
+
+
+ setRootNode : function(node){
+ this.root = node;
+ node.ownerTree = this;
+ node.isRoot = true;
+ this.registerNode(node);
+ return node;
+ },
+
+
+ getNodeById : function(id){
+ return this.nodeHash[id];
+ },
+
+
+ registerNode : function(node){
+ this.nodeHash[node.id] = node;
+ },
+
+
+ unregisterNode : function(node){
+ delete this.nodeHash[node.id];
+ },
+
+ toString : function(){
+ return "[Tree"+(this.id?" "+this.id:"")+"]";
+ }
+});
+
+
+Ext.data.Node = Ext.extend(Ext.util.Observable, {
+
+ constructor: function(attributes){
+
+ this.attributes = attributes || {};
+ this.leaf = this.attributes.leaf;
+
+ this.id = this.attributes.id;
+ if(!this.id){
+ this.id = Ext.id(null, "xnode-");
+ this.attributes.id = this.id;
+ }
+
+ this.childNodes = [];
+
+ this.parentNode = null;
+
+ this.firstChild = null;
+
+ this.lastChild = null;
+
+ this.previousSibling = null;
+
+ this.nextSibling = null;
+
+ this.addEvents({
+
+ "append" : true,
+
+ "remove" : true,
+
+ "move" : true,
+
+ "insert" : true,
+
+ "beforeappend" : true,
+
+ "beforeremove" : true,
+
+ "beforemove" : true,
+
+ "beforeinsert" : true
+ });
+ this.listeners = this.attributes.listeners;
+ Ext.data.Node.superclass.constructor.call(this);
+ },
+
+
+ fireEvent : function(evtName){
+
+ if(Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false){
+ return false;
+ }
+
+ var ot = this.getOwnerTree();
+ if(ot){
+ if(ot.proxyNodeEvent.apply(ot, arguments) === false){
+ return false;
+ }
+ }
+ return true;
+ },
+
+
+ isLeaf : function(){
+ return this.leaf === true;
+ },
+
+
+ setFirstChild : function(node){
+ this.firstChild = node;
+ },
+
+
+ setLastChild : function(node){
+ this.lastChild = node;
+ },
+
+
+
+ isLast : function(){
+ return (!this.parentNode ? true : this.parentNode.lastChild == this);
+ },
+
+
+ isFirst : function(){
+ return (!this.parentNode ? true : this.parentNode.firstChild == this);
+ },
+
+
+ hasChildNodes : function(){
+ return !this.isLeaf() && this.childNodes.length > 0;
+ },
+
+
+ isExpandable : function(){
+ return this.attributes.expandable || this.hasChildNodes();
+ },
+
+
+ appendChild : function(node){
+ var multi = false;
+ if(Ext.isArray(node)){
+ multi = node;
+ }else if(arguments.length > 1){
+ multi = arguments;
+ }
+
+ if(multi){
+ for(var i = 0, len = multi.length; i < len; i++) {
+ this.appendChild(multi[i]);
+ }
+ }else{
+ if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){
+ return false;
+ }
+ var index = this.childNodes.length;
+ var oldParent = node.parentNode;
+
+ if(oldParent){
+ if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){
+ return false;
+ }
+ oldParent.removeChild(node);
+ }
+ index = this.childNodes.length;
+ if(index === 0){
+ this.setFirstChild(node);
+ }
+ this.childNodes.push(node);
+ node.parentNode = this;
+ var ps = this.childNodes[index-1];
+ if(ps){
+ node.previousSibling = ps;
+ ps.nextSibling = node;
+ }else{
+ node.previousSibling = null;
+ }
+ node.nextSibling = null;
+ this.setLastChild(node);
+ node.setOwnerTree(this.getOwnerTree());
+ this.fireEvent("append", this.ownerTree, this, node, index);
+ if(oldParent){
+ node.fireEvent("move", this.ownerTree, node, oldParent, this, index);
+ }
+ return node;
+ }
+ },
+
+
+ removeChild : function(node, destroy){
+ var index = this.childNodes.indexOf(node);
+ if(index == -1){
+ return false;
+ }
+ if(this.fireEvent("beforeremove", this.ownerTree, this, node) === false){
+ return false;
+ }
+
+
+ this.childNodes.splice(index, 1);
+
+
+ if(node.previousSibling){
+ node.previousSibling.nextSibling = node.nextSibling;
+ }
+ if(node.nextSibling){
+ node.nextSibling.previousSibling = node.previousSibling;
+ }
+
+
+ if(this.firstChild == node){
+ this.setFirstChild(node.nextSibling);
+ }
+ if(this.lastChild == node){
+ this.setLastChild(node.previousSibling);
+ }
+
+ this.fireEvent("remove", this.ownerTree, this, node);
+ if(destroy){
+ node.destroy(true);
+ }else{
+ node.clear();
+ }
+ return node;
+ },
+
+
+ clear : function(destroy){
+
+ this.setOwnerTree(null, destroy);
+ this.parentNode = this.previousSibling = this.nextSibling = null;
+ if(destroy){
+ this.firstChild = this.lastChild = null;
+ }
+ },
+
+
+ destroy : function( silent){
+
+ if(silent === true){
+ this.purgeListeners();
+ this.clear(true);
+ Ext.each(this.childNodes, function(n){
+ n.destroy(true);
+ });
+ this.childNodes = null;
+ }else{
+ this.remove(true);
+ }
+ },
+
+
+ insertBefore : function(node, refNode){
+ if(!refNode){
+ return this.appendChild(node);
+ }
+
+ if(node == refNode){
+ return false;
+ }
+
+ if(this.fireEvent("beforeinsert", this.ownerTree, this, node, refNode) === false){
+ return false;
+ }
+ var index = this.childNodes.indexOf(refNode);
+ var oldParent = node.parentNode;
+ var refIndex = index;
+
+
+ if(oldParent == this && this.childNodes.indexOf(node) < index){
+ refIndex--;
+ }
+
+
+ if(oldParent){
+ if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index, refNode) === false){
+ return false;
+ }
+ oldParent.removeChild(node);
+ }
+ if(refIndex === 0){
+ this.setFirstChild(node);
+ }
+ this.childNodes.splice(refIndex, 0, node);
+ node.parentNode = this;
+ var ps = this.childNodes[refIndex-1];
+ if(ps){
+ node.previousSibling = ps;
+ ps.nextSibling = node;
+ }else{
+ node.previousSibling = null;
+ }
+ node.nextSibling = refNode;
+ refNode.previousSibling = node;
+ node.setOwnerTree(this.getOwnerTree());
+ this.fireEvent("insert", this.ownerTree, this, node, refNode);
+ if(oldParent){
+ node.fireEvent("move", this.ownerTree, node, oldParent, this, refIndex, refNode);
+ }
+ return node;
+ },
+
+
+ remove : function(destroy){
+ if (this.parentNode) {
+ this.parentNode.removeChild(this, destroy);
+ }
+ return this;
+ },
+
+
+ removeAll : function(destroy){
+ var cn = this.childNodes,
+ n;
+ while((n = cn[0])){
+ this.removeChild(n, destroy);
+ }
+ return this;
+ },
+
+
+ item : function(index){
+ return this.childNodes[index];
+ },
+
+
+ replaceChild : function(newChild, oldChild){
+ var s = oldChild ? oldChild.nextSibling : null;
+ this.removeChild(oldChild);
+ this.insertBefore(newChild, s);
+ return oldChild;
+ },
+
+
+ indexOf : function(child){
+ return this.childNodes.indexOf(child);
+ },
+
+
+ getOwnerTree : function(){
+
+ if(!this.ownerTree){
+ var p = this;
+ while(p){
+ if(p.ownerTree){
+ this.ownerTree = p.ownerTree;
+ break;
+ }
+ p = p.parentNode;
+ }
+ }
+ return this.ownerTree;
+ },
+
+
+ getDepth : function(){
+ var depth = 0;
+ var p = this;
+ while(p.parentNode){
+ ++depth;
+ p = p.parentNode;
+ }
+ return depth;
+ },
+
+
+ setOwnerTree : function(tree, destroy){
+
+ if(tree != this.ownerTree){
+ if(this.ownerTree){
+ this.ownerTree.unregisterNode(this);
+ }
+ this.ownerTree = tree;
+
+ if(destroy !== true){
+ Ext.each(this.childNodes, function(n){
+ n.setOwnerTree(tree);
+ });
+ }
+ if(tree){
+ tree.registerNode(this);
+ }
+ }
+ },
+
+
+ setId: function(id){
+ if(id !== this.id){
+ var t = this.ownerTree;
+ if(t){
+ t.unregisterNode(this);
+ }
+ this.id = this.attributes.id = id;
+ if(t){
+ t.registerNode(this);
+ }
+ this.onIdChange(id);
+ }
+ },
+
+
+ onIdChange: Ext.emptyFn,
+
+
+ getPath : function(attr){
+ attr = attr || "id";
+ var p = this.parentNode;
+ var b = [this.attributes[attr]];
+ while(p){
+ b.unshift(p.attributes[attr]);
+ p = p.parentNode;
+ }
+ var sep = this.getOwnerTree().pathSeparator;
+ return sep + b.join(sep);
+ },
+
+
+ bubble : function(fn, scope, args){
+ var p = this;
+ while(p){
+ if(fn.apply(scope || p, args || [p]) === false){
+ break;
+ }
+ p = p.parentNode;
+ }
+ },
+
+
+ cascade : function(fn, scope, args){
+ if(fn.apply(scope || this, args || [this]) !== false){
+ var cs = this.childNodes;
+ for(var i = 0, len = cs.length; i < len; i++) {
+ cs[i].cascade(fn, scope, args);
+ }
+ }
+ },
+
+
+ eachChild : function(fn, scope, args){
+ var cs = this.childNodes;
+ for(var i = 0, len = cs.length; i < len; i++) {
+ if(fn.apply(scope || cs[i], args || [cs[i]]) === false){
+ break;
+ }
+ }
+ },
+
+
+ findChild : function(attribute, value, deep){
+ return this.findChildBy(function(){
+ return this.attributes[attribute] == value;
+ }, null, deep);
+ },
+
+
+ findChildBy : function(fn, scope, deep){
+ var cs = this.childNodes,
+ len = cs.length,
+ i = 0,
+ n,
+ res;
+ for(; i < len; i++){
+ n = cs[i];
+ if(fn.call(scope || n, n) === true){
+ return n;
+ }else if (deep){
+ res = n.findChildBy(fn, scope, deep);
+ if(res != null){
+ return res;
+ }
+ }
+
+ }
+ return null;
+ },
+
+
+ sort : function(fn, scope){
+ var cs = this.childNodes;
+ var len = cs.length;
+ if(len > 0){
+ var sortFn = scope ? function(){fn.apply(scope, arguments);} : fn;
+ cs.sort(sortFn);
+ for(var i = 0; i < len; i++){
+ var n = cs[i];
+ n.previousSibling = cs[i-1];
+ n.nextSibling = cs[i+1];
+ if(i === 0){
+ this.setFirstChild(n);
+ }
+ if(i == len-1){
+ this.setLastChild(n);
+ }
+ }
+ }
+ },
+
+
+ contains : function(node){
+ return node.isAncestor(this);
+ },
+
+
+ isAncestor : function(node){
+ var p = this.parentNode;
+ while(p){
+ if(p == node){
+ return true;
+ }
+ p = p.parentNode;
+ }
+ return false;
+ },
+
+ toString : function(){
+ return "[Node"+(this.id?" "+this.id:"")+"]";
+ }
+});
+Ext.tree.TreeNode = Ext.extend(Ext.data.Node, {
+
+ constructor : function(attributes){
+ attributes = attributes || {};
+ if(Ext.isString(attributes)){
+ attributes = {text: attributes};
+ }
+ this.childrenRendered = false;
+ this.rendered = false;
+ Ext.tree.TreeNode.superclass.constructor.call(this, attributes);
+ this.expanded = attributes.expanded === true;
+ this.isTarget = attributes.isTarget !== false;
+ this.draggable = attributes.draggable !== false && attributes.allowDrag !== false;
+ this.allowChildren = attributes.allowChildren !== false && attributes.allowDrop !== false;
+
+
+ this.text = attributes.text;
+
+ this.disabled = attributes.disabled === true;
+
+ this.hidden = attributes.hidden === true;
+
+ this.addEvents(
+
+ 'textchange',
+
+ 'beforeexpand',
+
+ 'beforecollapse',
+
+ 'expand',
+
+ 'disabledchange',
+
+ 'collapse',
+
+ 'beforeclick',
+
+ 'click',
+
+ 'checkchange',
+
+ 'beforedblclick',
+
+ 'dblclick',
+
+ 'contextmenu',
+
+ 'beforechildrenrendered'
+ );
+
+ var uiClass = this.attributes.uiProvider || this.defaultUI || Ext.tree.TreeNodeUI;
+
+
+ this.ui = new uiClass(this);
+ },
+
+ preventHScroll : true,
+
+ isExpanded : function(){
+ return this.expanded;
+ },
+
+
+ getUI : function(){
+ return this.ui;
+ },
+
+ getLoader : function(){
+ var owner;
+ return this.loader || ((owner = this.getOwnerTree()) && owner.loader ? owner.loader : (this.loader = new Ext.tree.TreeLoader()));
+ },
+
+
+ setFirstChild : function(node){
+ var of = this.firstChild;
+ Ext.tree.TreeNode.superclass.setFirstChild.call(this, node);
+ if(this.childrenRendered && of && node != of){
+ of.renderIndent(true, true);
+ }
+ if(this.rendered){
+ this.renderIndent(true, true);
+ }
+ },
+
+
+ setLastChild : function(node){
+ var ol = this.lastChild;
+ Ext.tree.TreeNode.superclass.setLastChild.call(this, node);
+ if(this.childrenRendered && ol && node != ol){
+ ol.renderIndent(true, true);
+ }
+ if(this.rendered){
+ this.renderIndent(true, true);
+ }
+ },
+
+
+
+ appendChild : function(n){
+ if(!n.render && !Ext.isArray(n)){
+ n = this.getLoader().createNode(n);
+ }
+ var node = Ext.tree.TreeNode.superclass.appendChild.call(this, n);
+ if(node && this.childrenRendered){
+ node.render();
+ }
+ this.ui.updateExpandIcon();
+ return node;
+ },
+
+
+ removeChild : function(node, destroy){
+ this.ownerTree.getSelectionModel().unselect(node);
+ Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments);
+
+ if(!destroy){
+ var rendered = node.ui.rendered;
+
+ if(rendered){
+ node.ui.remove();
+ }
+ if(rendered && this.childNodes.length < 1){
+ this.collapse(false, false);
+ }else{
+ this.ui.updateExpandIcon();
+ }
+ if(!this.firstChild && !this.isHiddenRoot()){
+ this.childrenRendered = false;
+ }
+ }
+ return node;
+ },
+
+
+ insertBefore : function(node, refNode){
+ if(!node.render){
+ node = this.getLoader().createNode(node);
+ }
+ var newNode = Ext.tree.TreeNode.superclass.insertBefore.call(this, node, refNode);
+ if(newNode && refNode && this.childrenRendered){
+ node.render();
+ }
+ this.ui.updateExpandIcon();
+ return newNode;
+ },
+
+
+ setText : function(text){
+ var oldText = this.text;
+ this.text = this.attributes.text = text;
+ if(this.rendered){
+ this.ui.onTextChange(this, text, oldText);
+ }
+ this.fireEvent('textchange', this, text, oldText);
+ },
+
+
+ setIconCls : function(cls){
+ var old = this.attributes.iconCls;
+ this.attributes.iconCls = cls;
+ if(this.rendered){
+ this.ui.onIconClsChange(this, cls, old);
+ }
+ },
+
+
+ setTooltip : function(tip, title){
+ this.attributes.qtip = tip;
+ this.attributes.qtipTitle = title;
+ if(this.rendered){
+ this.ui.onTipChange(this, tip, title);
+ }
+ },
+
+
+ setIcon : function(icon){
+ this.attributes.icon = icon;
+ if(this.rendered){
+ this.ui.onIconChange(this, icon);
+ }
+ },
+
+
+ setHref : function(href, target){
+ this.attributes.href = href;
+ this.attributes.hrefTarget = target;
+ if(this.rendered){
+ this.ui.onHrefChange(this, href, target);
+ }
+ },
+
+
+ setCls : function(cls){
+ var old = this.attributes.cls;
+ this.attributes.cls = cls;
+ if(this.rendered){
+ this.ui.onClsChange(this, cls, old);
+ }
+ },
+
+
+ select : function(){
+ var t = this.getOwnerTree();
+ if(t){
+ t.getSelectionModel().select(this);
+ }
+ },
+
+
+ unselect : function(silent){
+ var t = this.getOwnerTree();
+ if(t){
+ t.getSelectionModel().unselect(this, silent);
+ }
+ },
+
+
+ isSelected : function(){
+ var t = this.getOwnerTree();
+ return t ? t.getSelectionModel().isSelected(this) : false;
+ },
+
+
+ expand : function(deep, anim, callback, scope){
+ if(!this.expanded){
+ if(this.fireEvent('beforeexpand', this, deep, anim) === false){
+ return;
+ }
+ if(!this.childrenRendered){
+ this.renderChildren();
+ }
+ this.expanded = true;
+ if(!this.isHiddenRoot() && (this.getOwnerTree().animate && anim !== false) || anim){
+ this.ui.animExpand(function(){
+ this.fireEvent('expand', this);
+ this.runCallback(callback, scope || this, [this]);
+ if(deep === true){
+ this.expandChildNodes(true, true);
+ }
+ }.createDelegate(this));
+ return;
+ }else{
+ this.ui.expand();
+ this.fireEvent('expand', this);
+ this.runCallback(callback, scope || this, [this]);
+ }
+ }else{
+ this.runCallback(callback, scope || this, [this]);
+ }
+ if(deep === true){
+ this.expandChildNodes(true);
+ }
+ },
+
+ runCallback : function(cb, scope, args){
+ if(Ext.isFunction(cb)){
+ cb.apply(scope, args);
+ }
+ },
+
+ isHiddenRoot : function(){
+ return this.isRoot && !this.getOwnerTree().rootVisible;
+ },
+
+
+ collapse : function(deep, anim, callback, scope){
+ if(this.expanded && !this.isHiddenRoot()){
+ if(this.fireEvent('beforecollapse', this, deep, anim) === false){
+ return;
+ }
+ this.expanded = false;
+ if((this.getOwnerTree().animate && anim !== false) || anim){
+ this.ui.animCollapse(function(){
+ this.fireEvent('collapse', this);
+ this.runCallback(callback, scope || this, [this]);
+ if(deep === true){
+ this.collapseChildNodes(true);
+ }
+ }.createDelegate(this));
+ return;
+ }else{
+ this.ui.collapse();
+ this.fireEvent('collapse', this);
+ this.runCallback(callback, scope || this, [this]);
+ }
+ }else if(!this.expanded){
+ this.runCallback(callback, scope || this, [this]);
+ }
+ if(deep === true){
+ var cs = this.childNodes;
+ for(var i = 0, len = cs.length; i < len; i++) {
+ cs[i].collapse(true, false);
+ }
+ }
+ },
+
+
+ delayedExpand : function(delay){
+ if(!this.expandProcId){
+ this.expandProcId = this.expand.defer(delay, this);
+ }
+ },
+
+
+ cancelExpand : function(){
+ if(this.expandProcId){
+ clearTimeout(this.expandProcId);
+ }
+ this.expandProcId = false;
+ },
+
+
+ toggle : function(){
+ if(this.expanded){
+ this.collapse();
+ }else{
+ this.expand();
+ }
+ },
+
+
+ ensureVisible : function(callback, scope){
+ var tree = this.getOwnerTree();
+ tree.expandPath(this.parentNode ? this.parentNode.getPath() : this.getPath(), false, function(){
+ var node = tree.getNodeById(this.id);
+ tree.getTreeEl().scrollChildIntoView(node.ui.anchor);
+ this.runCallback(callback, scope || this, [this]);
+ }.createDelegate(this));
+ },
+
+
+ expandChildNodes : function(deep, anim) {
+ var cs = this.childNodes,
+ i,
+ len = cs.length;
+ for (i = 0; i < len; i++) {
+ cs[i].expand(deep, anim);
+ }
+ },
+
+
+ collapseChildNodes : function(deep){
+ var cs = this.childNodes;
+ for(var i = 0, len = cs.length; i < len; i++) {
+ cs[i].collapse(deep);
+ }
+ },
+
+
+ disable : function(){
+ this.disabled = true;
+ this.unselect();
+ if(this.rendered && this.ui.onDisableChange){
+ this.ui.onDisableChange(this, true);
+ }
+ this.fireEvent('disabledchange', this, true);
+ },
+
+
+ enable : function(){
+ this.disabled = false;
+ if(this.rendered && this.ui.onDisableChange){
+ this.ui.onDisableChange(this, false);
+ }
+ this.fireEvent('disabledchange', this, false);
+ },
+
+
+ renderChildren : function(suppressEvent){
+ if(suppressEvent !== false){
+ this.fireEvent('beforechildrenrendered', this);
+ }
+ var cs = this.childNodes;
+ for(var i = 0, len = cs.length; i < len; i++){
+ cs[i].render(true);
+ }
+ this.childrenRendered = true;
+ },
+
+
+ sort : function(fn, scope){
+ Ext.tree.TreeNode.superclass.sort.apply(this, arguments);
+ if(this.childrenRendered){
+ var cs = this.childNodes;
+ for(var i = 0, len = cs.length; i < len; i++){
+ cs[i].render(true);
+ }
+ }
+ },
+
+
+ render : function(bulkRender){
+ this.ui.render(bulkRender);
+ if(!this.rendered){
+
+ this.getOwnerTree().registerNode(this);
+ this.rendered = true;
+ if(this.expanded){
+ this.expanded = false;
+ this.expand(false, false);
+ }
+ }
+ },
+
+
+ renderIndent : function(deep, refresh){
+ if(refresh){
+ this.ui.childIndent = null;
+ }
+ this.ui.renderIndent();
+ if(deep === true && this.childrenRendered){
+ var cs = this.childNodes;
+ for(var i = 0, len = cs.length; i < len; i++){
+ cs[i].renderIndent(true, refresh);
+ }
+ }
+ },
+
+ beginUpdate : function(){
+ this.childrenRendered = false;
+ },
+
+ endUpdate : function(){
+ if(this.expanded && this.rendered){
+ this.renderChildren();
+ }
+ },
+
+
+ destroy : function(silent){
+ if(silent === true){
+ this.unselect(true);
+ }
+ Ext.tree.TreeNode.superclass.destroy.call(this, silent);
+ Ext.destroy(this.ui, this.loader);
+ this.ui = this.loader = null;
+ },
+
+
+ onIdChange : function(id){
+ this.ui.onIdChange(id);
+ }
+});
+
+Ext.tree.TreePanel.nodeTypes.node = Ext.tree.TreeNode;
+ Ext.tree.AsyncTreeNode = function(config){
+ this.loaded = config && config.loaded === true;
+ this.loading = false;
+ Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments);
+
+ this.addEvents('beforeload', 'load');
+
+
+};
+Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, {
+ expand : function(deep, anim, callback, scope){
+ if(this.loading){
+ var timer;
+ var f = function(){
+ if(!this.loading){
+ clearInterval(timer);
+ this.expand(deep, anim, callback, scope);
+ }
+ }.createDelegate(this);
+ timer = setInterval(f, 200);
+ return;
+ }
+ if(!this.loaded){
+ if(this.fireEvent("beforeload", this) === false){
+ return;
+ }
+ this.loading = true;
+ this.ui.beforeLoad(this);
+ var loader = this.loader || this.attributes.loader || this.getOwnerTree().getLoader();
+ if(loader){
+ loader.load(this, this.loadComplete.createDelegate(this, [deep, anim, callback, scope]), this);
+ return;
+ }
+ }
+ Ext.tree.AsyncTreeNode.superclass.expand.call(this, deep, anim, callback, scope);
+ },
+
+
+ isLoading : function(){
+ return this.loading;
+ },
+
+ loadComplete : function(deep, anim, callback, scope){
+ this.loading = false;
+ this.loaded = true;
+ this.ui.afterLoad(this);
+ this.fireEvent("load", this);
+ this.expand(deep, anim, callback, scope);
+ },
+
+
+ isLoaded : function(){
+ return this.loaded;
+ },
+
+ hasChildNodes : function(){
+ if(!this.isLeaf() && !this.loaded){
+ return true;
+ }else{
+ return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this);
+ }
+ },
+
+
+ reload : function(callback, scope){
+ this.collapse(false, false);
+ while(this.firstChild){
+ this.removeChild(this.firstChild).destroy();
+ }
+ this.childrenRendered = false;
+ this.loaded = false;
+ if(this.isHiddenRoot()){
+ this.expanded = false;
+ }
+ this.expand(false, false, callback, scope);
+ }
+});
+
+Ext.tree.TreePanel.nodeTypes.async = Ext.tree.AsyncTreeNode;
+Ext.tree.TreeNodeUI = Ext.extend(Object, {
+
+ constructor : function(node){
+ Ext.apply(this, {
+ node: node,
+ rendered: false,
+ animating: false,
+ wasLeaf: true,
+ ecc: 'x-tree-ec-icon x-tree-elbow',
+ emptyIcon: Ext.BLANK_IMAGE_URL
+ });
+ },
+
+
+ removeChild : function(node){
+ if(this.rendered){
+ this.ctNode.removeChild(node.ui.getEl());
+ }
+ },
+
+
+ beforeLoad : function(){
+ this.addClass("x-tree-node-loading");
+ },
+
+
+ afterLoad : function(){
+ this.removeClass("x-tree-node-loading");
+ },
+
+
+ onTextChange : function(node, text, oldText){
+ if(this.rendered){
+ this.textNode.innerHTML = text;
+ }
+ },
+
+
+ onIconClsChange : function(node, cls, oldCls){
+ if(this.rendered){
+ Ext.fly(this.iconNode).replaceClass(oldCls, cls);
+ }
+ },
+
+
+ onIconChange : function(node, icon){
+ if(this.rendered){
+
+ var empty = Ext.isEmpty(icon);
+ this.iconNode.src = empty ? this.emptyIcon : icon;
+ Ext.fly(this.iconNode)[empty ? 'removeClass' : 'addClass']('x-tree-node-inline-icon');
+ }
+ },
+
+
+ onTipChange : function(node, tip, title){
+ if(this.rendered){
+ var hasTitle = Ext.isDefined(title);
+ if(this.textNode.setAttributeNS){
+ this.textNode.setAttributeNS("ext", "qtip", tip);
+ if(hasTitle){
+ this.textNode.setAttributeNS("ext", "qtitle", title);
+ }
+ }else{
+ this.textNode.setAttribute("ext:qtip", tip);
+ if(hasTitle){
+ this.textNode.setAttribute("ext:qtitle", title);
+ }
+ }
+ }
+ },
+
+
+ onHrefChange : function(node, href, target){
+ if(this.rendered){
+ this.anchor.href = this.getHref(href);
+ if(Ext.isDefined(target)){
+ this.anchor.target = target;
+ }
+ }
+ },
+
+
+ onClsChange : function(node, cls, oldCls){
+ if(this.rendered){
+ Ext.fly(this.elNode).replaceClass(oldCls, cls);
+ }
+ },
+
+
+ onDisableChange : function(node, state){
+ this.disabled = state;
+ if (this.checkbox) {
+ this.checkbox.disabled = state;
+ }
+ this[state ? 'addClass' : 'removeClass']('x-tree-node-disabled');
+ },
+
+
+ onSelectedChange : function(state){
+ if(state){
+ this.focus();
+ this.addClass("x-tree-selected");
+ }else{
+
+ this.removeClass("x-tree-selected");
+ }
+ },
+
+
+ onMove : function(tree, node, oldParent, newParent, index, refNode){
+ this.childIndent = null;
+ if(this.rendered){
+ var targetNode = newParent.ui.getContainer();
+ if(!targetNode){
+ this.holder = document.createElement("div");
+ this.holder.appendChild(this.wrap);
+ return;
+ }
+ var insertBefore = refNode ? refNode.ui.getEl() : null;
+ if(insertBefore){
+ targetNode.insertBefore(this.wrap, insertBefore);
+ }else{
+ targetNode.appendChild(this.wrap);
+ }
+ this.node.renderIndent(true, oldParent != newParent);
+ }
+ },
+
+
+ addClass : function(cls){
+ if(this.elNode){
+ Ext.fly(this.elNode).addClass(cls);
+ }
+ },
+
+
+ removeClass : function(cls){
+ if(this.elNode){
+ Ext.fly(this.elNode).removeClass(cls);
+ }
+ },
+
+
+ remove : function(){
+ if(this.rendered){
+ this.holder = document.createElement("div");
+ this.holder.appendChild(this.wrap);
+ }
+ },
+
+
+ fireEvent : function(){
+ return this.node.fireEvent.apply(this.node, arguments);
+ },
+
+
+ initEvents : function(){
+ this.node.on("move", this.onMove, this);
+
+ if(this.node.disabled){
+ this.onDisableChange(this.node, true);
+ }
+ if(this.node.hidden){
+ this.hide();
+ }
+ var ot = this.node.getOwnerTree();
+ var dd = ot.enableDD || ot.enableDrag || ot.enableDrop;
+ if(dd && (!this.node.isRoot || ot.rootVisible)){
+ Ext.dd.Registry.register(this.elNode, {
+ node: this.node,
+ handles: this.getDDHandles(),
+ isHandle: false
+ });
+ }
+ },
+
+
+ getDDHandles : function(){
+ return [this.iconNode, this.textNode, this.elNode];
+ },
+
+
+ hide : function(){
+ this.node.hidden = true;
+ if(this.wrap){
+ this.wrap.style.display = "none";
+ }
+ },
+
+
+ show : function(){
+ this.node.hidden = false;
+ if(this.wrap){
+ this.wrap.style.display = "";
+ }
+ },
+
+
+ onContextMenu : function(e){
+ if (this.node.hasListener("contextmenu") || this.node.getOwnerTree().hasListener("contextmenu")) {
+ e.preventDefault();
+ this.focus();
+ this.fireEvent("contextmenu", this.node, e);
+ }
+ },
+
+
+ onClick : function(e){
+ if(this.dropping){
+ e.stopEvent();
+ return;
+ }
+ if(this.fireEvent("beforeclick", this.node, e) !== false){
+ var a = e.getTarget('a');
+ if(!this.disabled && this.node.attributes.href && a){
+ this.fireEvent("click", this.node, e);
+ return;
+ }else if(a && e.ctrlKey){
+ e.stopEvent();
+ }
+ e.preventDefault();
+ if(this.disabled){
+ return;
+ }
+
+ if(this.node.attributes.singleClickExpand && !this.animating && this.node.isExpandable()){
+ this.node.toggle();
+ }
+
+ this.fireEvent("click", this.node, e);
+ }else{
+ e.stopEvent();
+ }
+ },
+
+
+ onDblClick : function(e){
+ e.preventDefault();
+ if(this.disabled){
+ return;
+ }
+ if(this.fireEvent("beforedblclick", this.node, e) !== false){
+ if(this.checkbox){
+ this.toggleCheck();
+ }
+ if(!this.animating && this.node.isExpandable()){
+ this.node.toggle();
+ }
+ this.fireEvent("dblclick", this.node, e);
+ }
+ },
+
+ onOver : function(e){
+ this.addClass('x-tree-node-over');
+ },
+
+ onOut : function(e){
+ this.removeClass('x-tree-node-over');
+ },
+
+
+ onCheckChange : function(){
+ var checked = this.checkbox.checked;
+
+ this.checkbox.defaultChecked = checked;
+ this.node.attributes.checked = checked;
+ this.fireEvent('checkchange', this.node, checked);
+ },
+
+
+ ecClick : function(e){
+ if(!this.animating && this.node.isExpandable()){
+ this.node.toggle();
+ }
+ },
+
+
+ startDrop : function(){
+ this.dropping = true;
+ },
+
+
+ endDrop : function(){
+ setTimeout(function(){
+ this.dropping = false;
+ }.createDelegate(this), 50);
+ },
+
+
+ expand : function(){
+ this.updateExpandIcon();
+ this.ctNode.style.display = "";
+ },
+
+
+ focus : function(){
+ if(!this.node.preventHScroll){
+ try{this.anchor.focus();
+ }catch(e){}
+ }else{
+ try{
+ var noscroll = this.node.getOwnerTree().getTreeEl().dom;
+ var l = noscroll.scrollLeft;
+ this.anchor.focus();
+ noscroll.scrollLeft = l;
+ }catch(e){}
+ }
+ },
+
+
+ toggleCheck : function(value){
+ var cb = this.checkbox;
+ if(cb){
+ cb.checked = (value === undefined ? !cb.checked : value);
+ this.onCheckChange();
+ }
+ },
+
+
+ blur : function(){
+ try{
+ this.anchor.blur();
+ }catch(e){}
+ },
+
+
+ animExpand : function(callback){
+ var ct = Ext.get(this.ctNode);
+ ct.stopFx();
+ if(!this.node.isExpandable()){
+ this.updateExpandIcon();
+ this.ctNode.style.display = "";
+ Ext.callback(callback);
+ return;
+ }
+ this.animating = true;
+ this.updateExpandIcon();
+
+ ct.slideIn('t', {
+ callback : function(){
+ this.animating = false;
+ Ext.callback(callback);
+ },
+ scope: this,
+ duration: this.node.ownerTree.duration || .25
+ });
+ },
+
+
+ highlight : function(){
+ var tree = this.node.getOwnerTree();
+ Ext.fly(this.wrap).highlight(
+ tree.hlColor || "C3DAF9",
+ {endColor: tree.hlBaseColor}
+ );
+ },
+
+
+ collapse : function(){
+ this.updateExpandIcon();
+ this.ctNode.style.display = "none";
+ },
+
+
+ animCollapse : function(callback){
+ var ct = Ext.get(this.ctNode);
+ ct.enableDisplayMode('block');
+ ct.stopFx();
+
+ this.animating = true;
+ this.updateExpandIcon();
+
+ ct.slideOut('t', {
+ callback : function(){
+ this.animating = false;
+ Ext.callback(callback);
+ },
+ scope: this,
+ duration: this.node.ownerTree.duration || .25
+ });
+ },
+
+
+ getContainer : function(){
+ return this.ctNode;
+ },
+
+
+ getEl : function(){
+ return this.wrap;
+ },
+
+
+ appendDDGhost : function(ghostNode){
+ ghostNode.appendChild(this.elNode.cloneNode(true));
+ },
+
+
+ getDDRepairXY : function(){
+ return Ext.lib.Dom.getXY(this.iconNode);
+ },
+
+
+ onRender : function(){
+ this.render();
+ },
+
+
+ render : function(bulkRender){
+ var n = this.node, a = n.attributes;
+ var targetNode = n.parentNode ?
+ n.parentNode.ui.getContainer() : n.ownerTree.innerCt.dom;
+
+ if(!this.rendered){
+ this.rendered = true;
+
+ this.renderElements(n, a, targetNode, bulkRender);
+
+ if(a.qtip){
+ this.onTipChange(n, a.qtip, a.qtipTitle);
+ }else if(a.qtipCfg){
+ a.qtipCfg.target = Ext.id(this.textNode);
+ Ext.QuickTips.register(a.qtipCfg);
+ }
+ this.initEvents();
+ if(!this.node.expanded){
+ this.updateExpandIcon(true);
+ }
+ }else{
+ if(bulkRender === true) {
+ targetNode.appendChild(this.wrap);
+ }
+ }
+ },
+
+
+ renderElements : function(n, a, targetNode, bulkRender){
+
+ this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : '';
+
+ var cb = Ext.isBoolean(a.checked),
+ nel,
+ href = this.getHref(a.href),
+ buf = ['<li class="x-tree-node"><div ext:tree-node-id="',n.id,'" class="x-tree-node-el x-tree-node-leaf x-unselectable ', a.cls,'" unselectable="on">',
+ '<span class="x-tree-node-indent">',this.indentMarkup,"</span>",
+ '<img alt="" src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow" />',
+ '<img alt="" src="', a.icon || this.emptyIcon, '" class="x-tree-node-icon',(a.icon ? " x-tree-node-inline-icon" : ""),(a.iconCls ? " "+a.iconCls : ""),'" unselectable="on" />',
+ cb ? ('<input class="x-tree-node-cb" type="checkbox" ' + (a.checked ? 'checked="checked" />' : '/>')) : '',
+ '<a hidefocus="on" class="x-tree-node-anchor" href="',href,'" tabIndex="1" ',
+ a.hrefTarget ? ' target="'+a.hrefTarget+'"' : "", '><span unselectable="on">',n.text,"</span></a></div>",
+ '<ul class="x-tree-node-ct" style="display:none;"></ul>',
+ "</li>"].join('');
+
+ if(bulkRender !== true && n.nextSibling && (nel = n.nextSibling.ui.getEl())){
+ this.wrap = Ext.DomHelper.insertHtml("beforeBegin", nel, buf);
+ }else{
+ this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf);
+ }
+
+ this.elNode = this.wrap.childNodes[0];
+ this.ctNode = this.wrap.childNodes[1];
+ var cs = this.elNode.childNodes;
+ this.indentNode = cs[0];
+ this.ecNode = cs[1];
+ this.iconNode = cs[2];
+ var index = 3;
+ if(cb){
+ this.checkbox = cs[3];
+
+ this.checkbox.defaultChecked = this.checkbox.checked;
+ index++;
+ }
+ this.anchor = cs[index];
+ this.textNode = cs[index].firstChild;
+ },
+
+
+ getHref : function(href){
+ return Ext.isEmpty(href) ? (Ext.isGecko ? '' : '#') : href;
+ },
+
+
+ getAnchor : function(){
+ return this.anchor;
+ },
+
+
+ getTextEl : function(){
+ return this.textNode;
+ },
+
+
+ getIconEl : function(){
+ return this.iconNode;
+ },
+
+
+ isChecked : function(){
+ return this.checkbox ? this.checkbox.checked : false;
+ },
+
+
+ updateExpandIcon : function(){
+ if(this.rendered){
+ var n = this.node,
+ c1,
+ c2,
+ cls = n.isLast() ? "x-tree-elbow-end" : "x-tree-elbow",
+ hasChild = n.hasChildNodes();
+ if(hasChild || n.attributes.expandable){
+ if(n.expanded){
+ cls += "-minus";
+ c1 = "x-tree-node-collapsed";
+ c2 = "x-tree-node-expanded";
+ }else{
+ cls += "-plus";
+ c1 = "x-tree-node-expanded";
+ c2 = "x-tree-node-collapsed";
+ }
+ if(this.wasLeaf){
+ this.removeClass("x-tree-node-leaf");
+ this.wasLeaf = false;
+ }
+ if(this.c1 != c1 || this.c2 != c2){
+ Ext.fly(this.elNode).replaceClass(c1, c2);
+ this.c1 = c1; this.c2 = c2;
+ }
+ }else{
+ if(!this.wasLeaf){
+ Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-collapsed");
+ delete this.c1;
+ delete this.c2;
+ this.wasLeaf = true;
+ }
+ }
+ var ecc = "x-tree-ec-icon "+cls;
+ if(this.ecc != ecc){
+ this.ecNode.className = ecc;
+ this.ecc = ecc;
+ }
+ }
+ },
+
+
+ onIdChange: function(id){
+ if(this.rendered){
+ this.elNode.setAttribute('ext:tree-node-id', id);
+ }
+ },
+
+
+ getChildIndent : function(){
+ if(!this.childIndent){
+ var buf = [],
+ p = this.node;
+ while(p){
+ if(!p.isRoot || (p.isRoot && p.ownerTree.rootVisible)){
+ if(!p.isLast()) {
+ buf.unshift('<img alt="" src="'+this.emptyIcon+'" class="x-tree-elbow-line" />');
+ } else {
+ buf.unshift('<img alt="" src="'+this.emptyIcon+'" class="x-tree-icon" />');
+ }
+ }
+ p = p.parentNode;
+ }
+ this.childIndent = buf.join("");
+ }
+ return this.childIndent;
+ },
+
+
+ renderIndent : function(){
+ if(this.rendered){
+ var indent = "",
+ p = this.node.parentNode;
+ if(p){
+ indent = p.ui.getChildIndent();
+ }
+ if(this.indentMarkup != indent){
+ this.indentNode.innerHTML = indent;
+ this.indentMarkup = indent;
+ }
+ this.updateExpandIcon();
+ }
+ },
+
+ destroy : function(){
+ if(this.elNode){
+ Ext.dd.Registry.unregister(this.elNode.id);
+ }
+
+ Ext.each(['textnode', 'anchor', 'checkbox', 'indentNode', 'ecNode', 'iconNode', 'elNode', 'ctNode', 'wrap', 'holder'], function(el){
+ if(this[el]){
+ Ext.fly(this[el]).remove();
+ delete this[el];
+ }
+ }, this);
+ delete this.node;
+ }
+});
+
+
+Ext.tree.RootTreeNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
+
+ render : function(){
+ if(!this.rendered){
+ var targetNode = this.node.ownerTree.innerCt.dom;
+ this.node.expanded = true;
+ targetNode.innerHTML = '<div class="x-tree-root-node"></div>';
+ this.wrap = this.ctNode = targetNode.firstChild;
+ }
+ },
+ collapse : Ext.emptyFn,
+ expand : Ext.emptyFn
+});
+Ext.tree.TreeLoader = function(config){
+ this.baseParams = {};
+ Ext.apply(this, config);
+
+ this.addEvents(
+
+ "beforeload",
+
+ "load",
+
+ "loadexception"
+ );
+ Ext.tree.TreeLoader.superclass.constructor.call(this);
+ if(Ext.isString(this.paramOrder)){
+ this.paramOrder = this.paramOrder.split(/[\s,|]/);
+ }
+};
+
+Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, {
+
+
+
+
+
+
+
+ uiProviders : {},
+
+
+ clearOnLoad : true,
+
+
+ paramOrder: undefined,
+
+
+ paramsAsHash: false,
+
+
+ nodeParameter: 'node',
+
+
+ directFn : undefined,
+
+
+ load : function(node, callback, scope){
+ if(this.clearOnLoad){
+ while(node.firstChild){
+ node.removeChild(node.firstChild);
+ }
+ }
+ if(this.doPreload(node)){
+ this.runCallback(callback, scope || node, [node]);
+ }else if(this.directFn || this.dataUrl || this.url){
+ this.requestData(node, callback, scope || node);
+ }
+ },
+
+ doPreload : function(node){
+ if(node.attributes.children){
+ if(node.childNodes.length < 1){
+ var cs = node.attributes.children;
+ node.beginUpdate();
+ for(var i = 0, len = cs.length; i < len; i++){
+ var cn = node.appendChild(this.createNode(cs[i]));
+ if(this.preloadChildren){
+ this.doPreload(cn);
+ }
+ }
+ node.endUpdate();
+ }
+ return true;
+ }
+ return false;
+ },
+
+ getParams: function(node){
+ var bp = Ext.apply({}, this.baseParams),
+ np = this.nodeParameter,
+ po = this.paramOrder;
+
+ np && (bp[ np ] = node.id);
+
+ if(this.directFn){
+ var buf = [node.id];
+ if(po){
+
+ if(np && po.indexOf(np) > -1){
+ buf = [];
+ }
+
+ for(var i = 0, len = po.length; i < len; i++){
+ buf.push(bp[ po[i] ]);
+ }
+ }else if(this.paramsAsHash){
+ buf = [bp];
+ }
+ return buf;
+ }else{
+ return bp;
+ }
+ },
+
+ requestData : function(node, callback, scope){
+ if(this.fireEvent("beforeload", this, node, callback) !== false){
+ if(this.directFn){
+ var args = this.getParams(node);
+ args.push(this.processDirectResponse.createDelegate(this, [{callback: callback, node: node, scope: scope}], true));
+ this.directFn.apply(window, args);
+ }else{
+ this.transId = Ext.Ajax.request({
+ method:this.requestMethod,
+ url: this.dataUrl||this.url,
+ success: this.handleResponse,
+ failure: this.handleFailure,
+ scope: this,
+ argument: {callback: callback, node: node, scope: scope},
+ params: this.getParams(node)
+ });
+ }
+ }else{
+
+
+ this.runCallback(callback, scope || node, []);
+ }
+ },
+
+ processDirectResponse: function(result, response, args){
+ if(response.status){
+ this.handleResponse({
+ responseData: Ext.isArray(result) ? result : null,
+ responseText: result,
+ argument: args
+ });
+ }else{
+ this.handleFailure({
+ argument: args
+ });
+ }
+ },
+
+
+ runCallback: function(cb, scope, args){
+ if(Ext.isFunction(cb)){
+ cb.apply(scope, args);
+ }
+ },
+
+ isLoading : function(){
+ return !!this.transId;
+ },
+
+ abort : function(){
+ if(this.isLoading()){
+ Ext.Ajax.abort(this.transId);
+ }
+ },
+
+
+ createNode : function(attr){
+
+ if(this.baseAttrs){
+ Ext.applyIf(attr, this.baseAttrs);
+ }
+ if(this.applyLoader !== false && !attr.loader){
+ attr.loader = this;
+ }
+ if(Ext.isString(attr.uiProvider)){
+ attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider);
+ }
+ if(attr.nodeType){
+ return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr);
+ }else{
+ return attr.leaf ?
+ new Ext.tree.TreeNode(attr) :
+ new Ext.tree.AsyncTreeNode(attr);
+ }
+ },
+
+ processResponse : function(response, node, callback, scope){
+ var json = response.responseText;
+ try {
+ var o = response.responseData || Ext.decode(json);
+ node.beginUpdate();
+ for(var i = 0, len = o.length; i < len; i++){
+ var n = this.createNode(o[i]);
+ if(n){
+ node.appendChild(n);
+ }
+ }
+ node.endUpdate();
+ this.runCallback(callback, scope || node, [node]);
+ }catch(e){
+ this.handleFailure(response);
+ }
+ },
+
+ handleResponse : function(response){
+ this.transId = false;
+ var a = response.argument;
+ this.processResponse(response, a.node, a.callback, a.scope);
+ this.fireEvent("load", this, a.node, response);
+ },
+
+ handleFailure : function(response){
+ this.transId = false;
+ var a = response.argument;
+ this.fireEvent("loadexception", this, a.node, response);
+ this.runCallback(a.callback, a.scope || a.node, [a.node]);
+ },
+
+ destroy : function(){
+ this.abort();
+ this.purgeListeners();
+ }
+});
+Ext.tree.TreeFilter = function(tree, config){
+ this.tree = tree;
+ this.filtered = {};
+ Ext.apply(this, config);
+};
+
+Ext.tree.TreeFilter.prototype = {
+ clearBlank:false,
+ reverse:false,
+ autoClear:false,
+ remove:false,
+
+
+ filter : function(value, attr, startNode){
+ attr = attr || "text";
+ var f;
+ if(typeof value == "string"){
+ var vlen = value.length;
+
+ if(vlen == 0 && this.clearBlank){
+ this.clear();
+ return;
+ }
+ value = value.toLowerCase();
+ f = function(n){
+ return n.attributes[attr].substr(0, vlen).toLowerCase() == value;
+ };
+ }else if(value.exec){
+ f = function(n){
+ return value.test(n.attributes[attr]);
+ };
+ }else{
+ throw 'Illegal filter type, must be string or regex';
+ }
+ this.filterBy(f, null, startNode);
+ },
+
+
+ filterBy : function(fn, scope, startNode){
+ startNode = startNode || this.tree.root;
+ if(this.autoClear){
+ this.clear();
+ }
+ var af = this.filtered, rv = this.reverse;
+ var f = function(n){
+ if(n == startNode){
+ return true;
+ }
+ if(af[n.id]){
+ return false;
+ }
+ var m = fn.call(scope || n, n);
+ if(!m || rv){
+ af[n.id] = n;
+ n.ui.hide();
+ return false;
+ }
+ return true;
+ };
+ startNode.cascade(f);
+ if(this.remove){
+ for(var id in af){
+ if(typeof id != "function"){
+ var n = af[id];
+ if(n && n.parentNode){
+ n.parentNode.removeChild(n);
+ }
+ }
+ }
+ }
+ },
+
+
+ clear : function(){
+ var t = this.tree;
+ var af = this.filtered;
+ for(var id in af){
+ if(typeof id != "function"){
+ var n = af[id];
+ if(n){
+ n.ui.show();
+ }
+ }
+ }
+ this.filtered = {};
+ }
+};
+
+Ext.tree.TreeSorter = Ext.extend(Object, {
+
+ constructor: function(tree, config){
+
+
+
+
+
+
+
+ Ext.apply(this, config);
+ tree.on({
+ scope: this,
+ beforechildrenrendered: this.doSort,
+ append: this.updateSort,
+ insert: this.updateSort,
+ textchange: this.updateSortParent
+ });
+
+ var desc = this.dir && this.dir.toLowerCase() == 'desc',
+ prop = this.property || 'text',
+ sortType = this.sortType,
+ folderSort = this.folderSort,
+ caseSensitive = this.caseSensitive === true,
+ leafAttr = this.leafAttr || 'leaf';
+
+ if(Ext.isString(sortType)){
+ sortType = Ext.data.SortTypes[sortType];
+ }
+ this.sortFn = function(n1, n2){
+ var attr1 = n1.attributes,
+ attr2 = n2.attributes;
+
+ if(folderSort){
+ if(attr1[leafAttr] && !attr2[leafAttr]){
+ return 1;
+ }
+ if(!attr1[leafAttr] && attr2[leafAttr]){
+ return -1;
+ }
+ }
+ var prop1 = attr1[prop],
+ prop2 = attr2[prop],
+ v1 = sortType ? sortType(prop1, n1) : (caseSensitive ? prop1 : prop1.toUpperCase()),
+ v2 = sortType ? sortType(prop2, n2) : (caseSensitive ? prop2 : prop2.toUpperCase());
+
+ if(v1 < v2){
+ return desc ? 1 : -1;
+ }else if(v1 > v2){
+ return desc ? -1 : 1;
+ }
+ return 0;
+ };
+ },
+
+ doSort : function(node){
+ node.sort(this.sortFn);
+ },
+
+ updateSort : function(tree, node){
+ if(node.childrenRendered){
+ this.doSort.defer(1, this, [node]);
+ }
+ },
+
+ updateSortParent : function(node){
+ var p = node.parentNode;
+ if(p && p.childrenRendered){
+ this.doSort.defer(1, this, [p]);
+ }
+ }
+});
+
+if(Ext.dd.DropZone){
+
+Ext.tree.TreeDropZone = function(tree, config){
+
+ this.allowParentInsert = config.allowParentInsert || false;
+
+ this.allowContainerDrop = config.allowContainerDrop || false;
+
+ this.appendOnly = config.appendOnly || false;
+
+ Ext.tree.TreeDropZone.superclass.constructor.call(this, tree.getTreeEl(), config);
+
+ this.tree = tree;
+
+ this.dragOverData = {};
+
+ this.lastInsertClass = "x-tree-no-status";
+};
+
+Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, {
+
+ ddGroup : "TreeDD",
+
+
+ expandDelay : 1000,
+
+
+ expandNode : function(node){
+ if(node.hasChildNodes() && !node.isExpanded()){
+ node.expand(false, null, this.triggerCacheRefresh.createDelegate(this));
+ }
+ },
+
+
+ queueExpand : function(node){
+ this.expandProcId = this.expandNode.defer(this.expandDelay, this, [node]);
+ },
+
+
+ cancelExpand : function(){
+ if(this.expandProcId){
+ clearTimeout(this.expandProcId);
+ this.expandProcId = false;
+ }
+ },
+
+
+ isValidDropPoint : function(n, pt, dd, e, data){
+ if(!n || !data){ return false; }
+ var targetNode = n.node;
+ var dropNode = data.node;
+
+ if(!(targetNode && targetNode.isTarget && pt)){
+ return false;
+ }
+ if(pt == "append" && targetNode.allowChildren === false){
+ return false;
+ }
+ if((pt == "above" || pt == "below") && (targetNode.parentNode && targetNode.parentNode.allowChildren === false)){
+ return false;
+ }
+ if(dropNode && (targetNode == dropNode || dropNode.contains(targetNode))){
+ return false;
+ }
+
+ var overEvent = this.dragOverData;
+ overEvent.tree = this.tree;
+ overEvent.target = targetNode;
+ overEvent.data = data;
+ overEvent.point = pt;
+ overEvent.source = dd;
+ overEvent.rawEvent = e;
+ overEvent.dropNode = dropNode;
+ overEvent.cancel = false;
+ var result = this.tree.fireEvent("nodedragover", overEvent);
+ return overEvent.cancel === false && result !== false;
+ },
+
+
+ getDropPoint : function(e, n, dd){
+ var tn = n.node;
+ if(tn.isRoot){
+ return tn.allowChildren !== false ? "append" : false;
+ }
+ var dragEl = n.ddel;
+ var t = Ext.lib.Dom.getY(dragEl), b = t + dragEl.offsetHeight;
+ var y = Ext.lib.Event.getPageY(e);
+ var noAppend = tn.allowChildren === false || tn.isLeaf();
+ if(this.appendOnly || tn.parentNode.allowChildren === false){
+ return noAppend ? false : "append";
+ }
+ var noBelow = false;
+ if(!this.allowParentInsert){
+ noBelow = tn.hasChildNodes() && tn.isExpanded();
+ }
+ var q = (b - t) / (noAppend ? 2 : 3);
+ if(y >= t && y < (t + q)){
+ return "above";
+ }else if(!noBelow && (noAppend || y >= b-q && y <= b)){
+ return "below";
+ }else{
+ return "append";
+ }
+ },
+
+
+ onNodeEnter : function(n, dd, e, data){
+ this.cancelExpand();
+ },
+
+ onContainerOver : function(dd, e, data) {
+ if (this.allowContainerDrop && this.isValidDropPoint({ ddel: this.tree.getRootNode().ui.elNode, node: this.tree.getRootNode() }, "append", dd, e, data)) {
+ return this.dropAllowed;
+ }
+ return this.dropNotAllowed;
+ },
+
+
+ onNodeOver : function(n, dd, e, data){
+ var pt = this.getDropPoint(e, n, dd);
+ var node = n.node;
+
+
+ if(!this.expandProcId && pt == "append" && node.hasChildNodes() && !n.node.isExpanded()){
+ this.queueExpand(node);
+ }else if(pt != "append"){
+ this.cancelExpand();
+ }
+
+
+ var returnCls = this.dropNotAllowed;
+ if(this.isValidDropPoint(n, pt, dd, e, data)){
+ if(pt){
+ var el = n.ddel;
+ var cls;
+ if(pt == "above"){
+ returnCls = n.node.isFirst() ? "x-tree-drop-ok-above" : "x-tree-drop-ok-between";
+ cls = "x-tree-drag-insert-above";
+ }else if(pt == "below"){
+ returnCls = n.node.isLast() ? "x-tree-drop-ok-below" : "x-tree-drop-ok-between";
+ cls = "x-tree-drag-insert-below";
+ }else{
+ returnCls = "x-tree-drop-ok-append";
+ cls = "x-tree-drag-append";
+ }
+ if(this.lastInsertClass != cls){
+ Ext.fly(el).replaceClass(this.lastInsertClass, cls);
+ this.lastInsertClass = cls;
+ }
+ }
+ }
+ return returnCls;
+ },
+
+
+ onNodeOut : function(n, dd, e, data){
+ this.cancelExpand();
+ this.removeDropIndicators(n);
+ },
+
+
+ onNodeDrop : function(n, dd, e, data){
+ var point = this.getDropPoint(e, n, dd);
+ var targetNode = n.node;
+ targetNode.ui.startDrop();
+ if(!this.isValidDropPoint(n, point, dd, e, data)){
+ targetNode.ui.endDrop();
+ return false;
+ }
+
+ var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, point, e) : null);
+ return this.processDrop(targetNode, data, point, dd, e, dropNode);
+ },
+
+ onContainerDrop : function(dd, e, data){
+ if (this.allowContainerDrop && this.isValidDropPoint({ ddel: this.tree.getRootNode().ui.elNode, node: this.tree.getRootNode() }, "append", dd, e, data)) {
+ var targetNode = this.tree.getRootNode();
+ targetNode.ui.startDrop();
+ var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, 'append', e) : null);
+ return this.processDrop(targetNode, data, 'append', dd, e, dropNode);
+ }
+ return false;
+ },
+
+
+ processDrop: function(target, data, point, dd, e, dropNode){
+ var dropEvent = {
+ tree : this.tree,
+ target: target,
+ data: data,
+ point: point,
+ source: dd,
+ rawEvent: e,
+ dropNode: dropNode,
+ cancel: !dropNode,
+ dropStatus: false
+ };
+ var retval = this.tree.fireEvent("beforenodedrop", dropEvent);
+ if(retval === false || dropEvent.cancel === true || !dropEvent.dropNode){
+ target.ui.endDrop();
+ return dropEvent.dropStatus;
+ }
+
+ target = dropEvent.target;
+ if(point == 'append' && !target.isExpanded()){
+ target.expand(false, null, function(){
+ this.completeDrop(dropEvent);
+ }.createDelegate(this));
+ }else{
+ this.completeDrop(dropEvent);
+ }
+ return true;
+ },
+
+
+ completeDrop : function(de){
+ var ns = de.dropNode, p = de.point, t = de.target;
+ if(!Ext.isArray(ns)){
+ ns = [ns];
+ }
+ var n;
+ for(var i = 0, len = ns.length; i < len; i++){
+ n = ns[i];
+ if(p == "above"){
+ t.parentNode.insertBefore(n, t);
+ }else if(p == "below"){
+ t.parentNode.insertBefore(n, t.nextSibling);
+ }else{
+ t.appendChild(n);
+ }
+ }
+ n.ui.focus();
+ if(Ext.enableFx && this.tree.hlDrop){
+ n.ui.highlight();
+ }
+ t.ui.endDrop();
+ this.tree.fireEvent("nodedrop", de);
+ },
+
+
+ afterNodeMoved : function(dd, data, e, targetNode, dropNode){
+ if(Ext.enableFx && this.tree.hlDrop){
+ dropNode.ui.focus();
+ dropNode.ui.highlight();
+ }
+ this.tree.fireEvent("nodedrop", this.tree, targetNode, data, dd, e);
+ },
+
+
+ getTree : function(){
+ return this.tree;
+ },
+
+
+ removeDropIndicators : function(n){
+ if(n && n.ddel){
+ var el = n.ddel;
+ Ext.fly(el).removeClass([
+ "x-tree-drag-insert-above",
+ "x-tree-drag-insert-below",
+ "x-tree-drag-append"]);
+ this.lastInsertClass = "_noclass";
+ }
+ },
+
+
+ beforeDragDrop : function(target, e, id){
+ this.cancelExpand();
+ return true;
+ },
+
+
+ afterRepair : function(data){
+ if(data && Ext.enableFx){
+ data.node.ui.highlight();
+ }
+ this.hideProxy();
+ }
+});
+
+}
+if(Ext.dd.DragZone){
+Ext.tree.TreeDragZone = function(tree, config){
+ Ext.tree.TreeDragZone.superclass.constructor.call(this, tree.innerCt, config);
+
+ this.tree = tree;
+};
+
+Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone, {
+
+ ddGroup : "TreeDD",
+
+
+ onBeforeDrag : function(data, e){
+ var n = data.node;
+ return n && n.draggable && !n.disabled;
+ },
+
+
+ onInitDrag : function(e){
+ var data = this.dragData;
+ this.tree.getSelectionModel().select(data.node);
+ this.tree.eventModel.disable();
+ this.proxy.update("");
+ data.node.ui.appendDDGhost(this.proxy.ghost.dom);
+ this.tree.fireEvent("startdrag", this.tree, data.node, e);
+ },
+
+
+ getRepairXY : function(e, data){
+ return data.node.ui.getDDRepairXY();
+ },
+
+
+ onEndDrag : function(data, e){
+ this.tree.eventModel.enable.defer(100, this.tree.eventModel);
+ this.tree.fireEvent("enddrag", this.tree, data.node, e);
+ },
+
+
+ onValidDrop : function(dd, e, id){
+ this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, dd, e);
+ this.hideProxy();
+ },
+
+
+ beforeInvalidDrop : function(e, id){
+
+ var sm = this.tree.getSelectionModel();
+ sm.clearSelections();
+ sm.select(this.dragData.node);
+ },
+
+
+ afterRepair : function(){
+ if (Ext.enableFx && this.tree.hlDrop) {
+ Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");
+ }
+ this.dragging = false;
+ }
+});
+}
+Ext.tree.TreeEditor = function(tree, fc, config){
+ fc = fc || {};
+ var field = fc.events ? fc : new Ext.form.TextField(fc);
+
+ Ext.tree.TreeEditor.superclass.constructor.call(this, field, config);
+
+ this.tree = tree;
+
+ if(!tree.rendered){
+ tree.on('render', this.initEditor, this);
+ }else{
+ this.initEditor(tree);
+ }
+};
+
+Ext.extend(Ext.tree.TreeEditor, Ext.Editor, {
+
+ alignment: "l-l",
+
+ autoSize: false,
+
+ hideEl : false,
+
+ cls: "x-small-editor x-tree-editor",
+
+ shim:false,
+
+ shadow:"frame",
+
+ maxWidth: 250,
+
+ editDelay : 350,
+
+ initEditor : function(tree){
+ tree.on({
+ scope : this,
+ beforeclick: this.beforeNodeClick,
+ dblclick : this.onNodeDblClick
+ });
+
+ this.on({
+ scope : this,
+ complete : this.updateNode,
+ beforestartedit: this.fitToTree,
+ specialkey : this.onSpecialKey
+ });
+
+ this.on('startedit', this.bindScroll, this, {delay:10});
+ },
+
+
+ fitToTree : function(ed, el){
+ var td = this.tree.getTreeEl().dom, nd = el.dom;
+ if(td.scrollLeft > nd.offsetLeft){
+ td.scrollLeft = nd.offsetLeft;
+ }
+ var w = Math.min(
+ this.maxWidth,
+ (td.clientWidth > 20 ? td.clientWidth : td.offsetWidth) - Math.max(0, nd.offsetLeft-td.scrollLeft) - 5);
+ this.setSize(w, '');
+ },
+
+
+ triggerEdit : function(node, defer){
+ this.completeEdit();
+ if(node.attributes.editable !== false){
+
+ this.editNode = node;
+ if(this.tree.autoScroll){
+ Ext.fly(node.ui.getEl()).scrollIntoView(this.tree.body);
+ }
+ var value = node.text || '';
+ if (!Ext.isGecko && Ext.isEmpty(node.text)){
+ node.setText('&#160;');
+ }
+ this.autoEditTimer = this.startEdit.defer(this.editDelay, this, [node.ui.textNode, value]);
+ return false;
+ }
+ },
+
+
+ bindScroll : function(){
+ this.tree.getTreeEl().on('scroll', this.cancelEdit, this);
+ },
+
+
+ beforeNodeClick : function(node, e){
+ clearTimeout(this.autoEditTimer);
+ if(this.tree.getSelectionModel().isSelected(node)){
+ e.stopEvent();
+ return this.triggerEdit(node);
+ }
+ },
+
+ onNodeDblClick : function(node, e){
+ clearTimeout(this.autoEditTimer);
+ },
+
+
+ updateNode : function(ed, value){
+ this.tree.getTreeEl().un('scroll', this.cancelEdit, this);
+ this.editNode.setText(value);
+ },
+
+
+ onHide : function(){
+ Ext.tree.TreeEditor.superclass.onHide.call(this);
+ if(this.editNode){
+ this.editNode.ui.focus.defer(50, this.editNode.ui);
+ }
+ },
+
+
+ onSpecialKey : function(field, e){
+ var k = e.getKey();
+ if(k == e.ESC){
+ e.stopEvent();
+ this.cancelEdit();
+ }else if(k == e.ENTER && !e.hasModifier()){
+ e.stopEvent();
+ this.completeEdit();
+ }
+ },
+
+ onDestroy : function(){
+ clearTimeout(this.autoEditTimer);
+ Ext.tree.TreeEditor.superclass.onDestroy.call(this);
+ var tree = this.tree;
+ tree.un('beforeclick', this.beforeNodeClick, this);
+ tree.un('dblclick', this.onNodeDblClick, this);
+ }
+});
+
+var swfobject = function() {
+
+ var UNDEF = "undefined",
+ OBJECT = "object",
+ SHOCKWAVE_FLASH = "Shockwave Flash",
+ SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
+ FLASH_MIME_TYPE = "application/x-shockwave-flash",
+ EXPRESS_INSTALL_ID = "SWFObjectExprInst",
+ ON_READY_STATE_CHANGE = "onreadystatechange",
+
+ win = window,
+ doc = document,
+ nav = navigator,
+
+ plugin = false,
+ domLoadFnArr = [main],
+ regObjArr = [],
+ objIdArr = [],
+ listenersArr = [],
+ storedAltContent,
+ storedAltContentId,
+ storedCallbackFn,
+ storedCallbackObj,
+ isDomLoaded = false,
+ isExpressInstallActive = false,
+ dynamicStylesheet,
+ dynamicStylesheetMedia,
+ autoHideShow = true,
+
+
+ ua = function() {
+ var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
+ u = nav.userAgent.toLowerCase(),
+ p = nav.platform.toLowerCase(),
+ windows = p ? (/win/).test(p) : /win/.test(u),
+ mac = p ? (/mac/).test(p) : /mac/.test(u),
+ webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false,
+ ie = !+"\v1",
+ playerVersion = [0,0,0],
+ d = null;
+ if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
+ d = nav.plugins[SHOCKWAVE_FLASH].description;
+ if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) {
+ plugin = true;
+ ie = false;
+ d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
+ playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
+ playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
+ playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
+ }
+ }
+ else if (typeof win.ActiveXObject != UNDEF) {
+ try {
+ var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
+ if (a) {
+ d = a.GetVariable("$version");
+ if (d) {
+ ie = true;
+ d = d.split(" ")[1].split(",");
+ playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+ }
+ }
+ }
+ catch(e) {}
+ }
+ return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
+ }(),
+
+
+ onDomLoad = function() {
+ if (!ua.w3) { return; }
+ if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) {
+ callDomLoadFunctions();
+ }
+ if (!isDomLoaded) {
+ if (typeof doc.addEventListener != UNDEF) {
+ doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false);
+ }
+ if (ua.ie && ua.win) {
+ doc.attachEvent(ON_READY_STATE_CHANGE, function() {
+ if (doc.readyState == "complete") {
+ doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee);
+ callDomLoadFunctions();
+ }
+ });
+ if (win == top) {
+ (function(){
+ if (isDomLoaded) { return; }
+ try {
+ doc.documentElement.doScroll("left");
+ }
+ catch(e) {
+ setTimeout(arguments.callee, 0);
+ return;
+ }
+ callDomLoadFunctions();
+ })();
+ }
+ }
+ if (ua.wk) {
+ (function(){
+ if (isDomLoaded) { return; }
+ if (!(/loaded|complete/).test(doc.readyState)) {
+ setTimeout(arguments.callee, 0);
+ return;
+ }
+ callDomLoadFunctions();
+ })();
+ }
+ addLoadEvent(callDomLoadFunctions);
+ }
+ }();
+
+ function callDomLoadFunctions() {
+ if (isDomLoaded) { return; }
+ try {
+ var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));
+ t.parentNode.removeChild(t);
+ }
+ catch (e) { return; }
+ isDomLoaded = true;
+ var dl = domLoadFnArr.length;
+ for (var i = 0; i < dl; i++) {
+ domLoadFnArr[i]();
+ }
+ }
+
+ function addDomLoadEvent(fn) {
+ if (isDomLoaded) {
+ fn();
+ }
+ else {
+ domLoadFnArr[domLoadFnArr.length] = fn;
+ }
+ }
+
+
+ function addLoadEvent(fn) {
+ if (typeof win.addEventListener != UNDEF) {
+ win.addEventListener("load", fn, false);
+ }
+ else if (typeof doc.addEventListener != UNDEF) {
+ doc.addEventListener("load", fn, false);
+ }
+ else if (typeof win.attachEvent != UNDEF) {
+ addListener(win, "onload", fn);
+ }
+ else if (typeof win.onload == "function") {
+ var fnOld = win.onload;
+ win.onload = function() {
+ fnOld();
+ fn();
+ };
+ }
+ else {
+ win.onload = fn;
+ }
+ }
+
+
+ function main() {
+ //~ if (plugin) {
+ //~ testPlayerVersion();
+ //~ }
+ //~ else {
+ matchVersions();
+ //~ }
+ }
+
+
+ function testPlayerVersion() {
+ var b = doc.getElementsByTagName("body")[0];
+ var o = createElement(OBJECT);
+ o.setAttribute("type", FLASH_MIME_TYPE);
+ var t = b.appendChild(o);
+ if (t) {
+ var counter = 0;
+ (function(){
+ if (typeof t.GetVariable != UNDEF) {
+ var d = t.GetVariable("$version");
+ if (d) {
+ d = d.split(" ")[1].split(",");
+ ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+ }
+ }
+ else if (counter < 10) {
+ counter++;
+ setTimeout(arguments.callee, 10);
+ return;
+ }
+ b.removeChild(o);
+ t = null;
+ matchVersions();
+ })();
+ }
+ else {
+ matchVersions();
+ }
+ }
+
+
+ function matchVersions() {
+ var rl = regObjArr.length;
+ if (rl > 0) {
+ for (var i = 0; i < rl; i++) {
+ var id = regObjArr[i].id;
+ var cb = regObjArr[i].callbackFn;
+ var cbObj = {success:false, id:id};
+ if (ua.pv[0] > 0) {
+ var obj = getElementById(id);
+ if (obj) {
+ if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) {
+ setVisibility(id, true);
+ if (cb) {
+ cbObj.success = true;
+ cbObj.ref = getObjectById(id);
+ cb(cbObj);
+ }
+ }
+ else if (regObjArr[i].expressInstall && canExpressInstall()) {
+ var att = {};
+ att.data = regObjArr[i].expressInstall;
+ att.width = obj.getAttribute("width") || "0";
+ att.height = obj.getAttribute("height") || "0";
+ if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); }
+ if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); }
+
+ var par = {};
+ var p = obj.getElementsByTagName("param");
+ var pl = p.length;
+ for (var j = 0; j < pl; j++) {
+ if (p[j].getAttribute("name").toLowerCase() != "movie") {
+ par[p[j].getAttribute("name")] = p[j].getAttribute("value");
+ }
+ }
+ showExpressInstall(att, par, id, cb);
+ }
+ else {
+ displayAltContent(obj);
+ if (cb) { cb(cbObj); }
+ }
+ }
+ }
+ else {
+ setVisibility(id, true);
+ if (cb) {
+ var o = getObjectById(id);
+ if (o && typeof o.SetVariable != UNDEF) {
+ cbObj.success = true;
+ cbObj.ref = o;
+ }
+ cb(cbObj);
+ }
+ }
+ }
+ }
+ }
+
+ function getObjectById(objectIdStr) {
+ var r = null;
+ var o = getElementById(objectIdStr);
+ if (o && o.nodeName == "OBJECT") {
+ if (typeof o.SetVariable != UNDEF) {
+ r = o;
+ }
+ else {
+ var n = o.getElementsByTagName(OBJECT)[0];
+ if (n) {
+ r = n;
+ }
+ }
+ }
+ return r;
+ }
+
+
+ function canExpressInstall() {
+ return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);
+ }
+
+
+ function showExpressInstall(att, par, replaceElemIdStr, callbackFn) {
+ isExpressInstallActive = true;
+ storedCallbackFn = callbackFn || null;
+ storedCallbackObj = {success:false, id:replaceElemIdStr};
+ var obj = getElementById(replaceElemIdStr);
+ if (obj) {
+ if (obj.nodeName == "OBJECT") {
+ storedAltContent = abstractAltContent(obj);
+ storedAltContentId = null;
+ }
+ else {
+ storedAltContent = obj;
+ storedAltContentId = replaceElemIdStr;
+ }
+ att.id = EXPRESS_INSTALL_ID;
+ if (typeof att.width == UNDEF || (!(/%$/).test(att.width) && parseInt(att.width, 10) < 310)) {
+ att.width = "310";
+ }
+
+ if (typeof att.height == UNDEF || (!(/%$/).test(att.height) && parseInt(att.height, 10) < 137)) {
+ att.height = "137";
+ }
+ doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
+ var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
+ fv = "MMredirectURL=" + win.location.toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title;
+ if (typeof par.flashvars != UNDEF) {
+ par.flashvars += "&" + fv;
+ }
+ else {
+ par.flashvars = fv;
+ }
+
+
+ if (ua.ie && ua.win && obj.readyState != 4) {
+ var newObj = createElement("div");
+ replaceElemIdStr += "SWFObjectNew";
+ newObj.setAttribute("id", replaceElemIdStr);
+ obj.parentNode.insertBefore(newObj, obj);
+ obj.style.display = "none";
+ (function(){
+ if (obj.readyState == 4) {
+ obj.parentNode.removeChild(obj);
+ }
+ else {
+ setTimeout(arguments.callee, 10);
+ }
+ })();
+ }
+ createSWF(att, par, replaceElemIdStr);
+ }
+ }
+
+
+ function displayAltContent(obj) {
+ if (ua.ie && ua.win && obj.readyState != 4) {
+
+
+ var el = createElement("div");
+ obj.parentNode.insertBefore(el, obj);
+ el.parentNode.replaceChild(abstractAltContent(obj), el);
+ obj.style.display = "none";
+ (function(){
+ if (obj.readyState == 4) {
+ obj.parentNode.removeChild(obj);
+ }
+ else {
+ setTimeout(arguments.callee, 10);
+ }
+ })();
+ }
+ else {
+ obj.parentNode.replaceChild(abstractAltContent(obj), obj);
+ }
+ }
+
+ function abstractAltContent(obj) {
+ var ac = createElement("div");
+ if (ua.win && ua.ie) {
+ ac.innerHTML = obj.innerHTML;
+ }
+ else {
+ var nestedObj = obj.getElementsByTagName(OBJECT)[0];
+ if (nestedObj) {
+ var c = nestedObj.childNodes;
+ if (c) {
+ var cl = c.length;
+ for (var i = 0; i < cl; i++) {
+ if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
+ ac.appendChild(c[i].cloneNode(true));
+ }
+ }
+ }
+ }
+ }
+ return ac;
+ }
+
+
+ function createSWF(attObj, parObj, id) {
+ var r, el = getElementById(id);
+ if (ua.wk && ua.wk < 312) { return r; }
+ if (el) {
+ if (typeof attObj.id == UNDEF) {
+ attObj.id = id;
+ }
+ if (ua.ie && ua.win) {
+ var att = "";
+ for (var i in attObj) {
+ if (attObj[i] != Object.prototype[i]) {
+ if (i.toLowerCase() == "data") {
+ parObj.movie = attObj[i];
+ }
+ else if (i.toLowerCase() == "styleclass") {
+ att += ' class="' + attObj[i] + '"';
+ }
+ else if (i.toLowerCase() != "classid") {
+ att += ' ' + i + '="' + attObj[i] + '"';
+ }
+ }
+ }
+ var par = "";
+ for (var j in parObj) {
+ if (parObj[j] != Object.prototype[j]) {
+ par += '<param name="' + j + '" value="' + parObj[j] + '" />';
+ }
+ }
+ el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
+ objIdArr[objIdArr.length] = attObj.id;
+ r = getElementById(attObj.id);
+ }
+ else {
+ var o = createElement(OBJECT);
+ o.setAttribute("type", FLASH_MIME_TYPE);
+ for (var m in attObj) {
+ if (attObj[m] != Object.prototype[m]) {
+ if (m.toLowerCase() == "styleclass") {
+ o.setAttribute("class", attObj[m]);
+ }
+ else if (m.toLowerCase() != "classid") {
+ o.setAttribute(m, attObj[m]);
+ }
+ }
+ }
+ for (var n in parObj) {
+ if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") {
+ createObjParam(o, n, parObj[n]);
+ }
+ }
+ el.parentNode.replaceChild(o, el);
+ r = o;
+ }
+ }
+ return r;
+ }
+
+ function createObjParam(el, pName, pValue) {
+ var p = createElement("param");
+ p.setAttribute("name", pName);
+ p.setAttribute("value", pValue);
+ el.appendChild(p);
+ }
+
+
+ function removeSWF(id) {
+ var obj = getElementById(id);
+ if (obj && obj.nodeName == "OBJECT") {
+ if (ua.ie && ua.win) {
+ obj.style.display = "none";
+ (function(){
+ if (obj.readyState == 4) {
+ removeObjectInIE(id);
+ }
+ else {
+ setTimeout(arguments.callee, 10);
+ }
+ })();
+ }
+ else {
+ obj.parentNode.removeChild(obj);
+ }
+ }
+ }
+
+ function removeObjectInIE(id) {
+ var obj = getElementById(id);
+ if (obj) {
+ for (var i in obj) {
+ if (typeof obj[i] == "function") {
+ obj[i] = null;
+ }
+ }
+ obj.parentNode.removeChild(obj);
+ }
+ }
+
+
+ function getElementById(id) {
+ var el = null;
+ try {
+ el = doc.getElementById(id);
+ }
+ catch (e) {}
+ return el;
+ }
+
+ function createElement(el) {
+ return doc.createElement(el);
+ }
+
+
+ function addListener(target, eventType, fn) {
+ target.attachEvent(eventType, fn);
+ listenersArr[listenersArr.length] = [target, eventType, fn];
+ }
+
+
+ function hasPlayerVersion(rv) {
+ var pv = ua.pv, v = rv.split(".");
+ v[0] = parseInt(v[0], 10);
+ v[1] = parseInt(v[1], 10) || 0;
+ v[2] = parseInt(v[2], 10) || 0;
+ return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
+ }
+
+
+ function createCSS(sel, decl, media, newStyle) {
+ if (ua.ie && ua.mac) { return; }
+ var h = doc.getElementsByTagName("head")[0];
+ if (!h) { return; }
+ var m = (media && typeof media == "string") ? media : "screen";
+ if (newStyle) {
+ dynamicStylesheet = null;
+ dynamicStylesheetMedia = null;
+ }
+ if (!dynamicStylesheet || dynamicStylesheetMedia != m) {
+
+ var s = createElement("style");
+ s.setAttribute("type", "text/css");
+ s.setAttribute("media", m);
+ dynamicStylesheet = h.appendChild(s);
+ if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
+ dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];
+ }
+ dynamicStylesheetMedia = m;
+ }
+
+ if (ua.ie && ua.win) {
+ if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) {
+ dynamicStylesheet.addRule(sel, decl);
+ }
+ }
+ else {
+ if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) {
+ dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
+ }
+ }
+ }
+
+ function setVisibility(id, isVisible) {
+ if (!autoHideShow) { return; }
+ var v = isVisible ? "visible" : "hidden";
+ if (isDomLoaded && getElementById(id)) {
+ getElementById(id).style.visibility = v;
+ }
+ else {
+ createCSS("#" + id, "visibility:" + v);
+ }
+ }
+
+
+ function urlEncodeIfNecessary(s) {
+ var regex = /[\\\"<>\.;]/;
+ var hasBadChars = regex.exec(s) != null;
+ return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
+ }
+
+
+ var cleanup = function() {
+ if (ua.ie && ua.win) {
+ window.attachEvent("onunload", function() {
+
+ var ll = listenersArr.length;
+ for (var i = 0; i < ll; i++) {
+ listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
+ }
+
+ var il = objIdArr.length;
+ for (var j = 0; j < il; j++) {
+ removeSWF(objIdArr[j]);
+ }
+
+ for (var k in ua) {
+ ua[k] = null;
+ }
+ ua = null;
+ for (var l in swfobject) {
+ swfobject[l] = null;
+ }
+ swfobject = null;
+ window.detachEvent('onunload', arguments.callee);
+ });
+ }
+ }();
+
+ return {
+
+ registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {
+ if (ua.w3 && objectIdStr && swfVersionStr) {
+ var regObj = {};
+ regObj.id = objectIdStr;
+ regObj.swfVersion = swfVersionStr;
+ regObj.expressInstall = xiSwfUrlStr;
+ regObj.callbackFn = callbackFn;
+ regObjArr[regObjArr.length] = regObj;
+ setVisibility(objectIdStr, false);
+ }
+ else if (callbackFn) {
+ callbackFn({success:false, id:objectIdStr});
+ }
+ },
+
+ getObjectById: function(objectIdStr) {
+ if (ua.w3) {
+ return getObjectById(objectIdStr);
+ }
+ },
+
+ embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
+ var callbackObj = {success:false, id:replaceElemIdStr};
+ if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
+ setVisibility(replaceElemIdStr, false);
+ addDomLoadEvent(function() {
+ widthStr += "";
+ heightStr += "";
+ var att = {};
+ if (attObj && typeof attObj === OBJECT) {
+ for (var i in attObj) {
+ att[i] = attObj[i];
+ }
+ }
+ att.data = swfUrlStr;
+ att.width = widthStr;
+ att.height = heightStr;
+ var par = {};
+ if (parObj && typeof parObj === OBJECT) {
+ for (var j in parObj) {
+ par[j] = parObj[j];
+ }
+ }
+ if (flashvarsObj && typeof flashvarsObj === OBJECT) {
+ for (var k in flashvarsObj) {
+ if (typeof par.flashvars != UNDEF) {
+ par.flashvars += "&" + k + "=" + flashvarsObj[k];
+ }
+ else {
+ par.flashvars = k + "=" + flashvarsObj[k];
+ }
+ }
+ }
+ if (hasPlayerVersion(swfVersionStr)) {
+ var obj = createSWF(att, par, replaceElemIdStr);
+ if (att.id == replaceElemIdStr) {
+ setVisibility(replaceElemIdStr, true);
+ }
+ callbackObj.success = true;
+ callbackObj.ref = obj;
+ }
+ else if (xiSwfUrlStr && canExpressInstall()) {
+ att.data = xiSwfUrlStr;
+ showExpressInstall(att, par, replaceElemIdStr, callbackFn);
+ return;
+ }
+ else {
+ setVisibility(replaceElemIdStr, true);
+ }
+ if (callbackFn) { callbackFn(callbackObj); }
+ });
+ }
+ else if (callbackFn) { callbackFn(callbackObj); }
+ },
+
+ switchOffAutoHideShow: function() {
+ autoHideShow = false;
+ },
+
+ ua: ua,
+
+ getFlashPlayerVersion: function() {
+ return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
+ },
+
+ hasFlashPlayerVersion: hasPlayerVersion,
+
+ createSWF: function(attObj, parObj, replaceElemIdStr) {
+ if (ua.w3) {
+ return createSWF(attObj, parObj, replaceElemIdStr);
+ }
+ else {
+ return undefined;
+ }
+ },
+
+ showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) {
+ if (ua.w3 && canExpressInstall()) {
+ showExpressInstall(att, par, replaceElemIdStr, callbackFn);
+ }
+ },
+
+ removeSWF: function(objElemIdStr) {
+ if (ua.w3) {
+ removeSWF(objElemIdStr);
+ }
+ },
+
+ createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) {
+ if (ua.w3) {
+ createCSS(selStr, declStr, mediaStr, newStyleBoolean);
+ }
+ },
+
+ addDomLoadEvent: addDomLoadEvent,
+
+ addLoadEvent: addLoadEvent,
+
+ getQueryParamValue: function(param) {
+ var q = doc.location.search || doc.location.hash;
+ if (q) {
+ if (/\?/.test(q)) { q = q.split("?")[1]; }
+ if (param == null) {
+ return urlEncodeIfNecessary(q);
+ }
+ var pairs = q.split("&");
+ for (var i = 0; i < pairs.length; i++) {
+ if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
+ return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
+ }
+ }
+ }
+ return "";
+ },
+
+
+ expressInstallCallback: function() {
+ if (isExpressInstallActive) {
+ var obj = getElementById(EXPRESS_INSTALL_ID);
+ if (obj && storedAltContent) {
+ obj.parentNode.replaceChild(storedAltContent, obj);
+ if (storedAltContentId) {
+ setVisibility(storedAltContentId, true);
+ if (ua.ie && ua.win) { storedAltContent.style.display = "block"; }
+ }
+ if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }
+ }
+ isExpressInstallActive = false;
+ }
+ }
+ };
+}();
+
+Ext.FlashComponent = Ext.extend(Ext.BoxComponent, {
+
+ flashVersion : '9.0.115',
+
+
+ backgroundColor: '#ffffff',
+
+
+ wmode: 'opaque',
+
+
+ flashVars: undefined,
+
+
+ flashParams: undefined,
+
+
+ url: undefined,
+ swfId : undefined,
+ swfWidth: '100%',
+ swfHeight: '100%',
+
+
+ expressInstall: false,
+
+ initComponent : function(){
+ Ext.FlashComponent.superclass.initComponent.call(this);
+
+ this.addEvents(
+
+ 'initialize'
+ );
+ },
+
+ onRender : function(){
+ Ext.FlashComponent.superclass.onRender.apply(this, arguments);
+
+ var params = Ext.apply({
+ allowScriptAccess: 'always',
+ bgcolor: this.backgroundColor,
+ wmode: this.wmode
+ }, this.flashParams), vars = Ext.apply({
+ allowedDomain: document.location.hostname,
+ YUISwfId: this.getId(),
+ YUIBridgeCallback: 'Ext.FlashEventProxy.onEvent'
+ }, this.flashVars);
+
+ new swfobject.embedSWF(this.url, this.id, this.swfWidth, this.swfHeight, this.flashVersion,
+ this.expressInstall ? Ext.FlashComponent.EXPRESS_INSTALL_URL : undefined, vars, params);
+
+ this.swf = Ext.getDom(this.id);
+ this.el = Ext.get(this.swf);
+ },
+
+ getSwfId : function(){
+ return this.swfId || (this.swfId = "extswf" + (++Ext.Component.AUTO_ID));
+ },
+
+ getId : function(){
+ return this.id || (this.id = "extflashcmp" + (++Ext.Component.AUTO_ID));
+ },
+
+ onFlashEvent : function(e){
+ switch(e.type){
+ case "swfReady":
+ this.initSwf();
+ return;
+ case "log":
+ return;
+ }
+ e.component = this;
+ this.fireEvent(e.type.toLowerCase().replace(/event$/, ''), e);
+ },
+
+ initSwf : function(){
+ this.onSwfReady(!!this.isInitialized);
+ this.isInitialized = true;
+ this.fireEvent('initialize', this);
+ },
+
+ beforeDestroy: function(){
+ if(this.rendered){
+ swfobject.removeSWF(this.swf.id);
+ }
+ Ext.FlashComponent.superclass.beforeDestroy.call(this);
+ },
+
+ onSwfReady : Ext.emptyFn
+});
+
+
+Ext.FlashComponent.EXPRESS_INSTALL_URL = 'http:/' + '/swfobject.googlecode.com/svn/trunk/swfobject/expressInstall.swf';
+
+Ext.reg('flash', Ext.FlashComponent);
+Ext.FlashEventProxy = {
+ onEvent : function(id, e){
+ var fp = Ext.getCmp(id);
+ if(fp){
+ fp.onFlashEvent(e);
+ }else{
+ arguments.callee.defer(10, this, [id, e]);
+ }
+ }
+};
+
+ Ext.chart.Chart = Ext.extend(Ext.FlashComponent, {
+ refreshBuffer: 100,
+
+
+
+
+ chartStyle: {
+ padding: 10,
+ animationEnabled: true,
+ font: {
+ name: 'Tahoma',
+ color: 0x444444,
+ size: 11
+ },
+ dataTip: {
+ padding: 5,
+ border: {
+ color: 0x99bbe8,
+ size:1
+ },
+ background: {
+ color: 0xDAE7F6,
+ alpha: .9
+ },
+ font: {
+ name: 'Tahoma',
+ color: 0x15428B,
+ size: 10,
+ bold: true
+ }
+ }
+ },
+
+
+
+
+ extraStyle: null,
+
+
+ seriesStyles: null,
+
+
+ disableCaching: Ext.isIE || Ext.isOpera,
+ disableCacheParam: '_dc',
+
+ initComponent : function(){
+ Ext.chart.Chart.superclass.initComponent.call(this);
+ if(!this.url){
+ this.url = Ext.chart.Chart.CHART_URL;
+ }
+ if(this.disableCaching){
+ this.url = Ext.urlAppend(this.url, String.format('{0}={1}', this.disableCacheParam, new Date().getTime()));
+ }
+ this.addEvents(
+ 'itemmouseover',
+ 'itemmouseout',
+ 'itemclick',
+ 'itemdoubleclick',
+ 'itemdragstart',
+ 'itemdrag',
+ 'itemdragend',
+
+ 'beforerefresh',
+
+ 'refresh'
+ );
+ this.store = Ext.StoreMgr.lookup(this.store);
+ },
+
+
+ setStyle: function(name, value){
+ this.swf.setStyle(name, Ext.encode(value));
+ },
+
+
+ setStyles: function(styles){
+ this.swf.setStyles(Ext.encode(styles));
+ },
+
+
+ setSeriesStyles: function(styles){
+ this.seriesStyles = styles;
+ var s = [];
+ Ext.each(styles, function(style){
+ s.push(Ext.encode(style));
+ });
+ this.swf.setSeriesStyles(s);
+ },
+
+ setCategoryNames : function(names){
+ this.swf.setCategoryNames(names);
+ },
+
+ setLegendRenderer : function(fn, scope){
+ var chart = this;
+ scope = scope || chart;
+ chart.removeFnProxy(chart.legendFnName);
+ chart.legendFnName = chart.createFnProxy(function(name){
+ return fn.call(scope, name);
+ });
+ chart.swf.setLegendLabelFunction(chart.legendFnName);
+ },
+
+ setTipRenderer : function(fn, scope){
+ var chart = this;
+ scope = scope || chart;
+ chart.removeFnProxy(chart.tipFnName);
+ chart.tipFnName = chart.createFnProxy(function(item, index, series){
+ var record = chart.store.getAt(index);
+ return fn.call(scope, chart, record, index, series);
+ });
+ chart.swf.setDataTipFunction(chart.tipFnName);
+ },
+
+ setSeries : function(series){
+ this.series = series;
+ this.refresh();
+ },
+
+
+ bindStore : function(store, initial){
+ if(!initial && this.store){
+ if(store !== this.store && this.store.autoDestroy){
+ this.store.destroy();
+ }else{
+ this.store.un("datachanged", this.refresh, this);
+ this.store.un("add", this.delayRefresh, this);
+ this.store.un("remove", this.delayRefresh, this);
+ this.store.un("update", this.delayRefresh, this);
+ this.store.un("clear", this.refresh, this);
+ }
+ }
+ if(store){
+ store = Ext.StoreMgr.lookup(store);
+ store.on({
+ scope: this,
+ datachanged: this.refresh,
+ add: this.delayRefresh,
+ remove: this.delayRefresh,
+ update: this.delayRefresh,
+ clear: this.refresh
+ });
+ }
+ this.store = store;
+ if(store && !initial){
+ this.refresh();
+ }
+ },
+
+ onSwfReady : function(isReset){
+ Ext.chart.Chart.superclass.onSwfReady.call(this, isReset);
+ var ref;
+ this.swf.setType(this.type);
+
+ if(this.chartStyle){
+ this.setStyles(Ext.apply({}, this.extraStyle, this.chartStyle));
+ }
+
+ if(this.categoryNames){
+ this.setCategoryNames(this.categoryNames);
+ }
+
+ if(this.tipRenderer){
+ ref = this.getFunctionRef(this.tipRenderer);
+ this.setTipRenderer(ref.fn, ref.scope);
+ }
+ if(this.legendRenderer){
+ ref = this.getFunctionRef(this.legendRenderer);
+ this.setLegendRenderer(ref.fn, ref.scope);
+ }
+ if(!isReset){
+ this.bindStore(this.store, true);
+ }
+ this.refresh.defer(10, this);
+ },
+
+ delayRefresh : function(){
+ if(!this.refreshTask){
+ this.refreshTask = new Ext.util.DelayedTask(this.refresh, this);
+ }
+ this.refreshTask.delay(this.refreshBuffer);
+ },
+
+ refresh : function(){
+ if(this.fireEvent('beforerefresh', this) !== false){
+ var styleChanged = false;
+
+ var data = [], rs = this.store.data.items;
+ for(var j = 0, len = rs.length; j < len; j++){
+ data[j] = rs[j].data;
+ }
+
+
+ var dataProvider = [];
+ var seriesCount = 0;
+ var currentSeries = null;
+ var i = 0;
+ if(this.series){
+ seriesCount = this.series.length;
+ for(i = 0; i < seriesCount; i++){
+ currentSeries = this.series[i];
+ var clonedSeries = {};
+ for(var prop in currentSeries){
+ if(prop == "style" && currentSeries.style !== null){
+ clonedSeries.style = Ext.encode(currentSeries.style);
+ styleChanged = true;
+
+
+
+
+ } else{
+ clonedSeries[prop] = currentSeries[prop];
+ }
+ }
+ dataProvider.push(clonedSeries);
+ }
+ }
+
+ if(seriesCount > 0){
+ for(i = 0; i < seriesCount; i++){
+ currentSeries = dataProvider[i];
+ if(!currentSeries.type){
+ currentSeries.type = this.type;
+ }
+ currentSeries.dataProvider = data;
+ }
+ } else{
+ dataProvider.push({type: this.type, dataProvider: data});
+ }
+ this.swf.setDataProvider(dataProvider);
+ if(this.seriesStyles){
+ this.setSeriesStyles(this.seriesStyles);
+ }
+ this.fireEvent('refresh', this);
+ }
+ },
+
+
+ createFnProxy : function(fn){
+ var fnName = 'extFnProxy' + (++Ext.chart.Chart.PROXY_FN_ID);
+ Ext.chart.Chart.proxyFunction[fnName] = fn;
+ return 'Ext.chart.Chart.proxyFunction.' + fnName;
+ },
+
+
+ removeFnProxy : function(fn){
+ if(!Ext.isEmpty(fn)){
+ fn = fn.replace('Ext.chart.Chart.proxyFunction.', '');
+ delete Ext.chart.Chart.proxyFunction[fn];
+ }
+ },
+
+
+ getFunctionRef : function(val){
+ if(Ext.isFunction(val)){
+ return {
+ fn: val,
+ scope: this
+ };
+ }else{
+ return {
+ fn: val.fn,
+ scope: val.scope || this
+ };
+ }
+ },
+
+
+ onDestroy: function(){
+ if (this.refreshTask && this.refreshTask.cancel){
+ this.refreshTask.cancel();
+ }
+ Ext.chart.Chart.superclass.onDestroy.call(this);
+ this.bindStore(null);
+ this.removeFnProxy(this.tipFnName);
+ this.removeFnProxy(this.legendFnName);
+ }
+});
+Ext.reg('chart', Ext.chart.Chart);
+Ext.chart.Chart.PROXY_FN_ID = 0;
+Ext.chart.Chart.proxyFunction = {};
+
+
+Ext.chart.Chart.CHART_URL = 'http:/' + '/yui.yahooapis.com/2.8.2/build/charts/assets/charts.swf';
+
+
+Ext.chart.PieChart = Ext.extend(Ext.chart.Chart, {
+ type: 'pie',
+
+ onSwfReady : function(isReset){
+ Ext.chart.PieChart.superclass.onSwfReady.call(this, isReset);
+
+ this.setDataField(this.dataField);
+ this.setCategoryField(this.categoryField);
+ },
+
+ setDataField : function(field){
+ this.dataField = field;
+ this.swf.setDataField(field);
+ },
+
+ setCategoryField : function(field){
+ this.categoryField = field;
+ this.swf.setCategoryField(field);
+ }
+});
+Ext.reg('piechart', Ext.chart.PieChart);
+
+
+Ext.chart.CartesianChart = Ext.extend(Ext.chart.Chart, {
+ onSwfReady : function(isReset){
+ Ext.chart.CartesianChart.superclass.onSwfReady.call(this, isReset);
+ this.labelFn = [];
+ if(this.xField){
+ this.setXField(this.xField);
+ }
+ if(this.yField){
+ this.setYField(this.yField);
+ }
+ if(this.xAxis){
+ this.setXAxis(this.xAxis);
+ }
+ if(this.xAxes){
+ this.setXAxes(this.xAxes);
+ }
+ if(this.yAxis){
+ this.setYAxis(this.yAxis);
+ }
+ if(this.yAxes){
+ this.setYAxes(this.yAxes);
+ }
+ if(Ext.isDefined(this.constrainViewport)){
+ this.swf.setConstrainViewport(this.constrainViewport);
+ }
+ },
+
+ setXField : function(value){
+ this.xField = value;
+ this.swf.setHorizontalField(value);
+ },
+
+ setYField : function(value){
+ this.yField = value;
+ this.swf.setVerticalField(value);
+ },
+
+ setXAxis : function(value){
+ this.xAxis = this.createAxis('xAxis', value);
+ this.swf.setHorizontalAxis(this.xAxis);
+ },
+
+ setXAxes : function(value){
+ var axis;
+ for(var i = 0; i < value.length; i++) {
+ axis = this.createAxis('xAxis' + i, value[i]);
+ this.swf.setHorizontalAxis(axis);
+ }
+ },
+
+ setYAxis : function(value){
+ this.yAxis = this.createAxis('yAxis', value);
+ this.swf.setVerticalAxis(this.yAxis);
+ },
+
+ setYAxes : function(value){
+ var axis;
+ for(var i = 0; i < value.length; i++) {
+ axis = this.createAxis('yAxis' + i, value[i]);
+ this.swf.setVerticalAxis(axis);
+ }
+ },
+
+ createAxis : function(axis, value){
+ var o = Ext.apply({}, value),
+ ref,
+ old;
+
+ if(this[axis]){
+ old = this[axis].labelFunction;
+ this.removeFnProxy(old);
+ this.labelFn.remove(old);
+ }
+ if(o.labelRenderer){
+ ref = this.getFunctionRef(o.labelRenderer);
+ o.labelFunction = this.createFnProxy(function(v){
+ return ref.fn.call(ref.scope, v);
+ });
+ delete o.labelRenderer;
+ this.labelFn.push(o.labelFunction);
+ }
+ if(axis.indexOf('xAxis') > -1 && o.position == 'left'){
+ o.position = 'bottom';
+ }
+ return o;
+ },
+
+ onDestroy : function(){
+ Ext.chart.CartesianChart.superclass.onDestroy.call(this);
+ Ext.each(this.labelFn, function(fn){
+ this.removeFnProxy(fn);
+ }, this);
+ }
+});
+Ext.reg('cartesianchart', Ext.chart.CartesianChart);
+
+
+Ext.chart.LineChart = Ext.extend(Ext.chart.CartesianChart, {
+ type: 'line'
+});
+Ext.reg('linechart', Ext.chart.LineChart);
+
+
+Ext.chart.ColumnChart = Ext.extend(Ext.chart.CartesianChart, {
+ type: 'column'
+});
+Ext.reg('columnchart', Ext.chart.ColumnChart);
+
+
+Ext.chart.StackedColumnChart = Ext.extend(Ext.chart.CartesianChart, {
+ type: 'stackcolumn'
+});
+Ext.reg('stackedcolumnchart', Ext.chart.StackedColumnChart);
+
+
+Ext.chart.BarChart = Ext.extend(Ext.chart.CartesianChart, {
+ type: 'bar'
+});
+Ext.reg('barchart', Ext.chart.BarChart);
+
+
+Ext.chart.StackedBarChart = Ext.extend(Ext.chart.CartesianChart, {
+ type: 'stackbar'
+});
+Ext.reg('stackedbarchart', Ext.chart.StackedBarChart);
+
+
+
+
+Ext.chart.Axis = function(config){
+ Ext.apply(this, config);
+};
+
+Ext.chart.Axis.prototype =
+{
+
+ type: null,
+
+
+ orientation: "horizontal",
+
+
+ reverse: false,
+
+
+ labelFunction: null,
+
+
+ hideOverlappingLabels: true,
+
+
+ labelSpacing: 2
+};
+
+
+Ext.chart.NumericAxis = Ext.extend(Ext.chart.Axis, {
+ type: "numeric",
+
+
+ minimum: NaN,
+
+
+ maximum: NaN,
+
+
+ majorUnit: NaN,
+
+
+ minorUnit: NaN,
+
+
+ snapToUnits: true,
+
+
+ alwaysShowZero: true,
+
+
+ scale: "linear",
+
+
+ roundMajorUnit: true,
+
+
+ calculateByLabelSize: true,
+
+
+ position: 'left',
+
+
+ adjustMaximumByMajorUnit: true,
+
+
+ adjustMinimumByMajorUnit: true
+
+});
+
+
+Ext.chart.TimeAxis = Ext.extend(Ext.chart.Axis, {
+ type: "time",
+
+
+ minimum: null,
+
+
+ maximum: null,
+
+
+ majorUnit: NaN,
+
+
+ majorTimeUnit: null,
+
+
+ minorUnit: NaN,
+
+
+ minorTimeUnit: null,
+
+
+ snapToUnits: true,
+
+
+ stackingEnabled: false,
+
+
+ calculateByLabelSize: true
+
+});
+
+
+Ext.chart.CategoryAxis = Ext.extend(Ext.chart.Axis, {
+ type: "category",
+
+
+ categoryNames: null,
+
+
+ calculateCategoryCount: false
+
+});
+
+
+Ext.chart.Series = function(config) { Ext.apply(this, config); };
+
+Ext.chart.Series.prototype =
+{
+
+ type: null,
+
+
+ displayName: null
+};
+
+
+Ext.chart.CartesianSeries = Ext.extend(Ext.chart.Series, {
+
+ xField: null,
+
+
+ yField: null,
+
+
+ showInLegend: true,
+
+
+ axis: 'primary'
+});
+
+
+Ext.chart.ColumnSeries = Ext.extend(Ext.chart.CartesianSeries, {
+ type: "column"
+});
+
+
+Ext.chart.LineSeries = Ext.extend(Ext.chart.CartesianSeries, {
+ type: "line"
+});
+
+
+Ext.chart.BarSeries = Ext.extend(Ext.chart.CartesianSeries, {
+ type: "bar"
+});
+
+
+
+Ext.chart.PieSeries = Ext.extend(Ext.chart.Series, {
+ type: "pie",
+ dataField: null,
+ categoryField: null
+});
+Ext.menu.Menu = Ext.extend(Ext.Container, {
+
+
+
+ minWidth : 120,
+
+ shadow : 'sides',
+
+ subMenuAlign : 'tl-tr?',
+
+ defaultAlign : 'tl-bl?',
+
+ allowOtherMenus : false,
+
+ ignoreParentClicks : false,
+
+ enableScrolling : true,
+
+ maxHeight : null,
+
+ scrollIncrement : 24,
+
+ showSeparator : true,
+
+ defaultOffsets : [0, 0],
+
+
+ plain : false,
+
+
+ floating : true,
+
+
+
+ zIndex: 15000,
+
+
+ hidden : true,
+
+
+ layout : 'menu',
+ hideMode : 'offsets',
+ scrollerHeight : 8,
+ autoLayout : true,
+ defaultType : 'menuitem',
+ bufferResize : false,
+
+ initComponent : function(){
+ if(Ext.isArray(this.initialConfig)){
+ Ext.apply(this, {items:this.initialConfig});
+ }
+ this.addEvents(
+
+ 'click',
+
+ 'mouseover',
+
+ 'mouseout',
+
+ 'itemclick'
+ );
+ Ext.menu.MenuMgr.register(this);
+ if(this.floating){
+ Ext.EventManager.onWindowResize(this.hide, this);
+ }else{
+ if(this.initialConfig.hidden !== false){
+ this.hidden = false;
+ }
+ this.internalDefaults = {hideOnClick: false};
+ }
+ Ext.menu.Menu.superclass.initComponent.call(this);
+ if(this.autoLayout){
+ var fn = this.doLayout.createDelegate(this, []);
+ this.on({
+ add: fn,
+ remove: fn
+ });
+ }
+ },
+
+
+ getLayoutTarget : function() {
+ return this.ul;
+ },
+
+
+ onRender : function(ct, position){
+ if(!ct){
+ ct = Ext.getBody();
+ }
+
+ var dh = {
+ id: this.getId(),
+ cls: 'x-menu ' + ((this.floating) ? 'x-menu-floating x-layer ' : '') + (this.cls || '') + (this.plain ? ' x-menu-plain' : '') + (this.showSeparator ? '' : ' x-menu-nosep'),
+ style: this.style,
+ cn: [
+ {tag: 'a', cls: 'x-menu-focus', href: '#', onclick: 'return false;', tabIndex: '-1'},
+ {tag: 'ul', cls: 'x-menu-list'}
+ ]
+ };
+ if(this.floating){
+ this.el = new Ext.Layer({
+ shadow: this.shadow,
+ dh: dh,
+ constrain: false,
+ parentEl: ct,
+ zindex: this.zIndex
+ });
+ }else{
+ this.el = ct.createChild(dh);
+ }
+ Ext.menu.Menu.superclass.onRender.call(this, ct, position);
+
+ if(!this.keyNav){
+ this.keyNav = new Ext.menu.MenuNav(this);
+ }
+
+ this.focusEl = this.el.child('a.x-menu-focus');
+ this.ul = this.el.child('ul.x-menu-list');
+ this.mon(this.ul, {
+ scope: this,
+ click: this.onClick,
+ mouseover: this.onMouseOver,
+ mouseout: this.onMouseOut
+ });
+ if(this.enableScrolling){
+ this.mon(this.el, {
+ scope: this,
+ delegate: '.x-menu-scroller',
+ click: this.onScroll,
+ mouseover: this.deactivateActive
+ });
+ }
+ },
+
+
+ findTargetItem : function(e){
+ var t = e.getTarget('.x-menu-list-item', this.ul, true);
+ if(t && t.menuItemId){
+ return this.items.get(t.menuItemId);
+ }
+ },
+
+
+ onClick : function(e){
+ var t = this.findTargetItem(e);
+ if(t){
+ if(t.isFormField){
+ this.setActiveItem(t);
+ }else if(t instanceof Ext.menu.BaseItem){
+ if(t.menu && this.ignoreParentClicks){
+ t.expandMenu();
+ e.preventDefault();
+ }else if(t.onClick){
+ t.onClick(e);
+ this.fireEvent('click', this, t, e);
+ }
+ }
+ }
+ },
+
+
+ setActiveItem : function(item, autoExpand){
+ if(item != this.activeItem){
+ this.deactivateActive();
+ if((this.activeItem = item).isFormField){
+ item.focus();
+ }else{
+ item.activate(autoExpand);
+ }
+ }else if(autoExpand){
+ item.expandMenu();
+ }
+ },
+
+ deactivateActive : function(){
+ var a = this.activeItem;
+ if(a){
+ if(a.isFormField){
+
+ if(a.collapse){
+ a.collapse();
+ }
+ }else{
+ a.deactivate();
+ }
+ delete this.activeItem;
+ }
+ },
+
+
+ tryActivate : function(start, step){
+ var items = this.items;
+ for(var i = start, len = items.length; i >= 0 && i < len; i+= step){
+ var item = items.get(i);
+ if(item.isVisible() && !item.disabled && (item.canActivate || item.isFormField)){
+ this.setActiveItem(item, false);
+ return item;
+ }
+ }
+ return false;
+ },
+
+
+ onMouseOver : function(e){
+ var t = this.findTargetItem(e);
+ if(t){
+ if(t.canActivate && !t.disabled){
+ this.setActiveItem(t, true);
+ }
+ }
+ this.over = true;
+ this.fireEvent('mouseover', this, e, t);
+ },
+
+
+ onMouseOut : function(e){
+ var t = this.findTargetItem(e);
+ if(t){
+ if(t == this.activeItem && t.shouldDeactivate && t.shouldDeactivate(e)){
+ this.activeItem.deactivate();
+ delete this.activeItem;
+ }
+ }
+ this.over = false;
+ this.fireEvent('mouseout', this, e, t);
+ },
+
+
+ onScroll : function(e, t){
+ if(e){
+ e.stopEvent();
+ }
+ var ul = this.ul.dom, top = Ext.fly(t).is('.x-menu-scroller-top');
+ ul.scrollTop += this.scrollIncrement * (top ? -1 : 1);
+ if(top ? ul.scrollTop <= 0 : ul.scrollTop + this.activeMax >= ul.scrollHeight){
+ this.onScrollerOut(null, t);
+ }
+ },
+
+
+ onScrollerIn : function(e, t){
+ var ul = this.ul.dom, top = Ext.fly(t).is('.x-menu-scroller-top');
+ if(top ? ul.scrollTop > 0 : ul.scrollTop + this.activeMax < ul.scrollHeight){
+ Ext.fly(t).addClass(['x-menu-item-active', 'x-menu-scroller-active']);
+ }
+ },
+
+
+ onScrollerOut : function(e, t){
+ Ext.fly(t).removeClass(['x-menu-item-active', 'x-menu-scroller-active']);
+ },
+
+
+ show : function(el, pos, parentMenu){
+ if(this.floating){
+ this.parentMenu = parentMenu;
+ if(!this.el){
+ this.render();
+ this.doLayout(false, true);
+ }
+ this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign, this.defaultOffsets), parentMenu);
+ }else{
+ Ext.menu.Menu.superclass.show.call(this);
+ }
+ },
+
+
+ showAt : function(xy, parentMenu){
+ if(this.fireEvent('beforeshow', this) !== false){
+ this.parentMenu = parentMenu;
+ if(!this.el){
+ this.render();
+ }
+ if(this.enableScrolling){
+
+ this.el.setXY(xy);
+
+ xy[1] = this.constrainScroll(xy[1]);
+ xy = [this.el.adjustForConstraints(xy)[0], xy[1]];
+ }else{
+
+ xy = this.el.adjustForConstraints(xy);
+ }
+ this.el.setXY(xy);
+ this.el.show();
+ Ext.menu.Menu.superclass.onShow.call(this);
+ if(Ext.isIE9m){
+
+ this.fireEvent('autosize', this);
+ if(!Ext.isIE8){
+ this.el.repaint();
+ }
+ }
+ this.hidden = false;
+ this.focus();
+ this.fireEvent('show', this);
+ }
+ },
+
+ constrainScroll : function(y){
+ var max, full = this.ul.setHeight('auto').getHeight(),
+ returnY = y, normalY, parentEl, scrollTop, viewHeight;
+ if(this.floating){
+ parentEl = Ext.fly(this.el.dom.parentNode);
+ scrollTop = parentEl.getScroll().top;
+ viewHeight = parentEl.getViewSize().height;
+
+
+ normalY = y - scrollTop;
+ max = this.maxHeight ? this.maxHeight : viewHeight - normalY;
+ if(full > viewHeight) {
+ max = viewHeight;
+
+ returnY = y - normalY;
+ } else if(max < full) {
+ returnY = y - (full - max);
+ max = full;
+ }
+ }else{
+ max = this.getHeight();
+ }
+
+ if (this.maxHeight){
+ max = Math.min(this.maxHeight, max);
+ }
+ if(full > max && max > 0){
+ this.activeMax = max - this.scrollerHeight * 2 - this.el.getFrameWidth('tb') - Ext.num(this.el.shadowOffset, 0);
+ this.ul.setHeight(this.activeMax);
+ this.createScrollers();
+ this.el.select('.x-menu-scroller').setDisplayed('');
+ }else{
+ this.ul.setHeight(full);
+ this.el.select('.x-menu-scroller').setDisplayed('none');
+ }
+ this.ul.dom.scrollTop = 0;
+ return returnY;
+ },
+
+ createScrollers : function(){
+ if(!this.scroller){
+ this.scroller = {
+ pos: 0,
+ top: this.el.insertFirst({
+ tag: 'div',
+ cls: 'x-menu-scroller x-menu-scroller-top',
+ html: '&#160;'
+ }),
+ bottom: this.el.createChild({
+ tag: 'div',
+ cls: 'x-menu-scroller x-menu-scroller-bottom',
+ html: '&#160;'
+ })
+ };
+ this.scroller.top.hover(this.onScrollerIn, this.onScrollerOut, this);
+ this.scroller.topRepeater = new Ext.util.ClickRepeater(this.scroller.top, {
+ listeners: {
+ click: this.onScroll.createDelegate(this, [null, this.scroller.top], false)
+ }
+ });
+ this.scroller.bottom.hover(this.onScrollerIn, this.onScrollerOut, this);
+ this.scroller.bottomRepeater = new Ext.util.ClickRepeater(this.scroller.bottom, {
+ listeners: {
+ click: this.onScroll.createDelegate(this, [null, this.scroller.bottom], false)
+ }
+ });
+ }
+ },
+
+ onLayout : function(){
+ if(this.isVisible()){
+ if(this.enableScrolling){
+ this.constrainScroll(this.el.getTop());
+ }
+ if(this.floating){
+ this.el.sync();
+ }
+ }
+ },
+
+ focus : function(){
+ if(!this.hidden){
+ this.doFocus.defer(50, this);
+ }
+ },
+
+ doFocus : function(){
+ if(!this.hidden){
+ this.focusEl.focus();
+ }
+ },
+
+
+ hide : function(deep){
+ if (!this.isDestroyed) {
+ this.deepHide = deep;
+ Ext.menu.Menu.superclass.hide.call(this);
+ delete this.deepHide;
+ }
+ },
+
+
+ onHide : function(){
+ Ext.menu.Menu.superclass.onHide.call(this);
+ this.deactivateActive();
+ if(this.el && this.floating){
+ this.el.hide();
+ }
+ var pm = this.parentMenu;
+ if(this.deepHide === true && pm){
+ if(pm.floating){
+ pm.hide(true);
+ }else{
+ pm.deactivateActive();
+ }
+ }
+ },
+
+
+ lookupComponent : function(c){
+ if(Ext.isString(c)){
+ c = (c == 'separator' || c == '-') ? new Ext.menu.Separator() : new Ext.menu.TextItem(c);
+ this.applyDefaults(c);
+ }else{
+ if(Ext.isObject(c)){
+ c = this.getMenuItem(c);
+ }else if(c.tagName || c.el){
+ c = new Ext.BoxComponent({
+ el: c
+ });
+ }
+ }
+ return c;
+ },
+
+ applyDefaults : function(c) {
+ if (!Ext.isString(c)) {
+ c = Ext.menu.Menu.superclass.applyDefaults.call(this, c);
+ var d = this.internalDefaults;
+ if(d){
+ if(c.events){
+ Ext.applyIf(c.initialConfig, d);
+ Ext.apply(c, d);
+ }else{
+ Ext.applyIf(c, d);
+ }
+ }
+ }
+ return c;
+ },
+
+
+ getMenuItem : function(config) {
+ config.ownerCt = this;
+
+ if (!config.isXType) {
+ if (!config.xtype && Ext.isBoolean(config.checked)) {
+ return new Ext.menu.CheckItem(config);
+ }
+ return Ext.create(config, this.defaultType);
+ }
+ return config;
+ },
+
+
+ addSeparator : function() {
+ return this.add(new Ext.menu.Separator());
+ },
+
+
+ addElement : function(el) {
+ return this.add(new Ext.menu.BaseItem({
+ el: el
+ }));
+ },
+
+
+ addItem : function(item) {
+ return this.add(item);
+ },
+
+
+ addMenuItem : function(config) {
+ return this.add(this.getMenuItem(config));
+ },
+
+
+ addText : function(text){
+ return this.add(new Ext.menu.TextItem(text));
+ },
+
+
+ onDestroy : function(){
+ Ext.EventManager.removeResizeListener(this.hide, this);
+ var pm = this.parentMenu;
+ if(pm && pm.activeChild == this){
+ delete pm.activeChild;
+ }
+ delete this.parentMenu;
+ Ext.menu.Menu.superclass.onDestroy.call(this);
+ Ext.menu.MenuMgr.unregister(this);
+ if(this.keyNav) {
+ this.keyNav.disable();
+ }
+ var s = this.scroller;
+ if(s){
+ Ext.destroy(s.topRepeater, s.bottomRepeater, s.top, s.bottom);
+ }
+ Ext.destroy(
+ this.el,
+ this.focusEl,
+ this.ul
+ );
+ }
+});
+
+Ext.reg('menu', Ext.menu.Menu);
+
+
+Ext.menu.MenuNav = Ext.extend(Ext.KeyNav, function(){
+ function up(e, m){
+ if(!m.tryActivate(m.items.indexOf(m.activeItem)-1, -1)){
+ m.tryActivate(m.items.length-1, -1);
+ }
+ }
+ function down(e, m){
+ if(!m.tryActivate(m.items.indexOf(m.activeItem)+1, 1)){
+ m.tryActivate(0, 1);
+ }
+ }
+ return {
+ constructor : function(menu){
+ Ext.menu.MenuNav.superclass.constructor.call(this, menu.el);
+ this.scope = this.menu = menu;
+ },
+
+ doRelay : function(e, h){
+ var k = e.getKey();
+
+ if (this.menu.activeItem && this.menu.activeItem.isFormField && k != e.TAB) {
+ return false;
+ }
+ if(!this.menu.activeItem && e.isNavKeyPress() && k != e.SPACE && k != e.RETURN){
+ this.menu.tryActivate(0, 1);
+ return false;
+ }
+ return h.call(this.scope || this, e, this.menu);
+ },
+
+ tab: function(e, m) {
+ e.stopEvent();
+ if (e.shiftKey) {
+ up(e, m);
+ } else {
+ down(e, m);
+ }
+ },
+
+ up : up,
+
+ down : down,
+
+ right : function(e, m){
+ if(m.activeItem){
+ m.activeItem.expandMenu(true);
+ }
+ },
+
+ left : function(e, m){
+ m.hide();
+ if(m.parentMenu && m.parentMenu.activeItem){
+ m.parentMenu.activeItem.activate();
+ }
+ },
+
+ enter : function(e, m){
+ if(m.activeItem){
+ e.stopPropagation();
+ m.activeItem.onClick(e);
+ m.fireEvent('click', this, m.activeItem);
+ return true;
+ }
+ }
+ };
+}());
+
+Ext.menu.MenuMgr = function(){
+ var menus,
+ active,
+ map,
+ groups = {},
+ attached = false,
+ lastShow = new Date();
+
+
+
+ function init(){
+ menus = {};
+ active = new Ext.util.MixedCollection();
+ map = Ext.getDoc().addKeyListener(27, hideAll);
+ map.disable();
+ }
+
+
+ function hideAll(){
+ if(active && active.length > 0){
+ var c = active.clone();
+ c.each(function(m){
+ m.hide();
+ });
+ return true;
+ }
+ return false;
+ }
+
+
+ function onHide(m){
+ active.remove(m);
+ if(active.length < 1){
+ map.disable();
+ Ext.getDoc().un("mousedown", onMouseDown);
+ attached = false;
+ }
+ }
+
+
+ function onShow(m){
+ var last = active.last();
+ lastShow = new Date();
+ active.add(m);
+ if(!attached){
+ map.enable();
+ Ext.getDoc().on("mousedown", onMouseDown);
+ attached = true;
+ }
+ if(m.parentMenu){
+ m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);
+ m.parentMenu.activeChild = m;
+ }else if(last && !last.isDestroyed && last.isVisible()){
+ m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);
+ }
+ }
+
+
+ function onBeforeHide(m){
+ if(m.activeChild){
+ m.activeChild.hide();
+ }
+ if(m.autoHideTimer){
+ clearTimeout(m.autoHideTimer);
+ delete m.autoHideTimer;
+ }
+ }
+
+
+ function onBeforeShow(m){
+ var pm = m.parentMenu;
+ if(!pm && !m.allowOtherMenus){
+ hideAll();
+ }else if(pm && pm.activeChild){
+ pm.activeChild.hide();
+ }
+ }
+
+
+ function onMouseDown(e){
+ if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
+ hideAll();
+ }
+ }
+
+ return {
+
+
+ hideAll : function(){
+ return hideAll();
+ },
+
+
+ register : function(menu){
+ if(!menus){
+ init();
+ }
+ menus[menu.id] = menu;
+ menu.on({
+ beforehide: onBeforeHide,
+ hide: onHide,
+ beforeshow: onBeforeShow,
+ show: onShow
+ });
+ },
+
+
+ get : function(menu){
+ if(typeof menu == "string"){
+ if(!menus){
+ return null;
+ }
+ return menus[menu];
+ }else if(menu.events){
+ return menu;
+ }else if(typeof menu.length == 'number'){
+ return new Ext.menu.Menu({items:menu});
+ }else{
+ return Ext.create(menu, 'menu');
+ }
+ },
+
+
+ unregister : function(menu){
+ delete menus[menu.id];
+ menu.un("beforehide", onBeforeHide);
+ menu.un("hide", onHide);
+ menu.un("beforeshow", onBeforeShow);
+ menu.un("show", onShow);
+ },
+
+
+ registerCheckable : function(menuItem){
+ var g = menuItem.group;
+ if(g){
+ if(!groups[g]){
+ groups[g] = [];
+ }
+ groups[g].push(menuItem);
+ }
+ },
+
+
+ unregisterCheckable : function(menuItem){
+ var g = menuItem.group;
+ if(g){
+ groups[g].remove(menuItem);
+ }
+ },
+
+
+ onCheckChange: function(item, state){
+ if(item.group && state){
+ var group = groups[item.group],
+ i = 0,
+ len = group.length,
+ current;
+
+ for(; i < len; i++){
+ current = group[i];
+ if(current != item){
+ current.setChecked(false);
+ }
+ }
+ }
+ },
+
+ getCheckedItem : function(groupId){
+ var g = groups[groupId];
+ if(g){
+ for(var i = 0, l = g.length; i < l; i++){
+ if(g[i].checked){
+ return g[i];
+ }
+ }
+ }
+ return null;
+ },
+
+ setCheckedItem : function(groupId, itemId){
+ var g = groups[groupId];
+ if(g){
+ for(var i = 0, l = g.length; i < l; i++){
+ if(g[i].id == itemId){
+ g[i].setChecked(true);
+ }
+ }
+ }
+ return null;
+ }
+ };
+}();
+
+Ext.menu.BaseItem = Ext.extend(Ext.Component, {
+
+
+
+
+ canActivate : false,
+
+ activeClass : "x-menu-item-active",
+
+ hideOnClick : true,
+
+ clickHideDelay : 1,
+
+
+ ctype : "Ext.menu.BaseItem",
+
+
+ actionMode : "container",
+
+ initComponent : function(){
+ Ext.menu.BaseItem.superclass.initComponent.call(this);
+ this.addEvents(
+
+ 'click',
+
+ 'activate',
+
+ 'deactivate'
+ );
+ if(this.handler){
+ this.on("click", this.handler, this.scope);
+ }
+ },
+
+
+ onRender : function(container, position){
+ Ext.menu.BaseItem.superclass.onRender.apply(this, arguments);
+ if(this.ownerCt && this.ownerCt instanceof Ext.menu.Menu){
+ this.parentMenu = this.ownerCt;
+ }else{
+ this.container.addClass('x-menu-list-item');
+ this.mon(this.el, {
+ scope: this,
+ click: this.onClick,
+ mouseenter: this.activate,
+ mouseleave: this.deactivate
+ });
+ }
+ },
+
+
+ setHandler : function(handler, scope){
+ if(this.handler){
+ this.un("click", this.handler, this.scope);
+ }
+ this.on("click", this.handler = handler, this.scope = scope);
+ },
+
+
+ onClick : function(e){
+ if(!this.disabled && this.fireEvent("click", this, e) !== false
+ && (this.parentMenu && this.parentMenu.fireEvent("itemclick", this, e) !== false)){
+ this.handleClick(e);
+ }else{
+ e.stopEvent();
+ }
+ },
+
+
+ activate : function(){
+ if(this.disabled){
+ return false;
+ }
+ var li = this.container;
+ li.addClass(this.activeClass);
+ this.region = li.getRegion().adjust(2, 2, -2, -2);
+ this.fireEvent("activate", this);
+ return true;
+ },
+
+
+ deactivate : function(){
+ this.container.removeClass(this.activeClass);
+ this.fireEvent("deactivate", this);
+ },
+
+
+ shouldDeactivate : function(e){
+ return !this.region || !this.region.contains(e.getPoint());
+ },
+
+
+ handleClick : function(e){
+ var pm = this.parentMenu;
+ if(this.hideOnClick){
+ if(pm.floating){
+ this.clickHideDelayTimer = pm.hide.defer(this.clickHideDelay, pm, [true]);
+ }else{
+ pm.deactivateActive();
+ }
+ }
+ },
+
+ beforeDestroy: function(){
+ clearTimeout(this.clickHideDelayTimer);
+ Ext.menu.BaseItem.superclass.beforeDestroy.call(this);
+ },
+
+
+ expandMenu : Ext.emptyFn,
+
+
+ hideMenu : Ext.emptyFn
+});
+Ext.reg('menubaseitem', Ext.menu.BaseItem);
+Ext.menu.TextItem = Ext.extend(Ext.menu.BaseItem, {
+
+
+ hideOnClick : false,
+
+ itemCls : "x-menu-text",
+
+ constructor : function(config) {
+ if (typeof config == 'string') {
+ config = {
+ text: config
+ };
+ }
+ Ext.menu.TextItem.superclass.constructor.call(this, config);
+ },
+
+
+ onRender : function() {
+ var s = document.createElement("span");
+ s.className = this.itemCls;
+ s.innerHTML = this.text;
+ this.el = s;
+ Ext.menu.TextItem.superclass.onRender.apply(this, arguments);
+ }
+});
+Ext.reg('menutextitem', Ext.menu.TextItem);
+Ext.menu.Separator = Ext.extend(Ext.menu.BaseItem, {
+
+ itemCls : "x-menu-sep",
+
+ hideOnClick : false,
+
+
+ activeClass: '',
+
+
+ onRender : function(li){
+ var s = document.createElement("span");
+ s.className = this.itemCls;
+ s.innerHTML = "&#160;";
+ this.el = s;
+ li.addClass("x-menu-sep-li");
+ Ext.menu.Separator.superclass.onRender.apply(this, arguments);
+ }
+});
+Ext.reg('menuseparator', Ext.menu.Separator);
+Ext.menu.Item = Ext.extend(Ext.menu.BaseItem, {
+
+
+
+
+
+
+
+
+ itemCls : 'x-menu-item',
+
+ canActivate : true,
+
+ showDelay: 200,
+
+
+ altText: '',
+
+
+ hideDelay: 200,
+
+
+ ctype: 'Ext.menu.Item',
+
+ initComponent : function(){
+ Ext.menu.Item.superclass.initComponent.call(this);
+ if(this.menu){
+
+
+ if (Ext.isArray(this.menu)){
+ this.menu = { items: this.menu };
+ }
+
+
+
+ if (Ext.isObject(this.menu)){
+ this.menu.ownerCt = this;
+ }
+
+ this.menu = Ext.menu.MenuMgr.get(this.menu);
+ this.menu.ownerCt = undefined;
+ }
+ },
+
+
+ onRender : function(container, position){
+ if (!this.itemTpl) {
+ this.itemTpl = Ext.menu.Item.prototype.itemTpl = new Ext.XTemplate(
+ '<a id="{id}" class="{cls} x-unselectable" hidefocus="true" unselectable="on" href="{href}"',
+ '<tpl if="hrefTarget">',
+ ' target="{hrefTarget}"',
+ '</tpl>',
+ '>',
+ '<img alt="{altText}" src="{icon}" class="x-menu-item-icon {iconCls}"/>',
+ '<span class="x-menu-item-text">{text}</span>',
+ '</a>'
+ );
+ }
+ var a = this.getTemplateArgs();
+ this.el = position ? this.itemTpl.insertBefore(position, a, true) : this.itemTpl.append(container, a, true);
+ this.iconEl = this.el.child('img.x-menu-item-icon');
+ this.textEl = this.el.child('.x-menu-item-text');
+ if(!this.href) {
+ this.mon(this.el, 'click', Ext.emptyFn, null, { preventDefault: true });
+ }
+ Ext.menu.Item.superclass.onRender.call(this, container, position);
+ },
+
+ getTemplateArgs: function() {
+ return {
+ id: this.id,
+ cls: this.itemCls + (this.menu ? ' x-menu-item-arrow' : '') + (this.cls ? ' ' + this.cls : ''),
+ href: this.href || '#',
+ hrefTarget: this.hrefTarget,
+ icon: this.icon || Ext.BLANK_IMAGE_URL,
+ iconCls: this.iconCls || '',
+ text: this.itemText||this.text||'&#160;',
+ altText: this.altText || ''
+ };
+ },
+
+
+ setText : function(text){
+ this.text = text||'&#160;';
+ if(this.rendered){
+ this.textEl.update(this.text);
+ this.parentMenu.layout.doAutoSize();
+ }
+ },
+
+
+ setIconClass : function(cls){
+ var oldCls = this.iconCls;
+ this.iconCls = cls;
+ if(this.rendered){
+ this.iconEl.replaceClass(oldCls, this.iconCls);
+ }
+ },
+
+
+ beforeDestroy: function(){
+ clearTimeout(this.showTimer);
+ clearTimeout(this.hideTimer);
+ if (this.menu){
+ delete this.menu.ownerCt;
+ this.menu.destroy();
+ }
+ Ext.menu.Item.superclass.beforeDestroy.call(this);
+ },
+
+
+ handleClick : function(e){
+ if(!this.href){
+ e.stopEvent();
+ }
+ Ext.menu.Item.superclass.handleClick.apply(this, arguments);
+ },
+
+
+ activate : function(autoExpand){
+ if(Ext.menu.Item.superclass.activate.apply(this, arguments)){
+ this.focus();
+ if(autoExpand){
+ this.expandMenu();
+ }
+ }
+ return true;
+ },
+
+
+ shouldDeactivate : function(e){
+ if(Ext.menu.Item.superclass.shouldDeactivate.call(this, e)){
+ if(this.menu && this.menu.isVisible()){
+ return !this.menu.getEl().getRegion().contains(e.getPoint());
+ }
+ return true;
+ }
+ return false;
+ },
+
+
+ deactivate : function(){
+ Ext.menu.Item.superclass.deactivate.apply(this, arguments);
+ this.hideMenu();
+ },
+
+
+ expandMenu : function(autoActivate){
+ if(!this.disabled && this.menu){
+ clearTimeout(this.hideTimer);
+ delete this.hideTimer;
+ if(!this.menu.isVisible() && !this.showTimer){
+ this.showTimer = this.deferExpand.defer(this.showDelay, this, [autoActivate]);
+ }else if (this.menu.isVisible() && autoActivate){
+ this.menu.tryActivate(0, 1);
+ }
+ }
+ },
+
+
+ deferExpand : function(autoActivate){
+ delete this.showTimer;
+ this.menu.show(this.container, this.parentMenu.subMenuAlign || 'tl-tr?', this.parentMenu);
+ if(autoActivate){
+ this.menu.tryActivate(0, 1);
+ }
+ },
+
+
+ hideMenu : function(){
+ clearTimeout(this.showTimer);
+ delete this.showTimer;
+ if(!this.hideTimer && this.menu && this.menu.isVisible()){
+ this.hideTimer = this.deferHide.defer(this.hideDelay, this);
+ }
+ },
+
+
+ deferHide : function(){
+ delete this.hideTimer;
+ if(this.menu.over){
+ this.parentMenu.setActiveItem(this, false);
+ }else{
+ this.menu.hide();
+ }
+ }
+});
+Ext.reg('menuitem', Ext.menu.Item);
+Ext.menu.CheckItem = Ext.extend(Ext.menu.Item, {
+
+
+ itemCls : "x-menu-item x-menu-check-item",
+
+ groupClass : "x-menu-group-item",
+
+
+ checked: false,
+
+
+ ctype: "Ext.menu.CheckItem",
+
+ initComponent : function(){
+ Ext.menu.CheckItem.superclass.initComponent.call(this);
+ this.addEvents(
+
+ "beforecheckchange" ,
+
+ "checkchange"
+ );
+
+ if(this.checkHandler){
+ this.on('checkchange', this.checkHandler, this.scope);
+ }
+ Ext.menu.MenuMgr.registerCheckable(this);
+ },
+
+
+ onRender : function(c){
+ Ext.menu.CheckItem.superclass.onRender.apply(this, arguments);
+ if(this.group){
+ this.el.addClass(this.groupClass);
+ }
+ if(this.checked){
+ this.checked = false;
+ this.setChecked(true, true);
+ }
+ },
+
+
+ destroy : function(){
+ Ext.menu.MenuMgr.unregisterCheckable(this);
+ Ext.menu.CheckItem.superclass.destroy.apply(this, arguments);
+ },
+
+
+ setChecked : function(state, suppressEvent){
+ var suppress = suppressEvent === true;
+ if(this.checked != state && (suppress || this.fireEvent("beforecheckchange", this, state) !== false)){
+ Ext.menu.MenuMgr.onCheckChange(this, state);
+ if(this.container){
+ this.container[state ? "addClass" : "removeClass"]("x-menu-item-checked");
+ }
+ this.checked = state;
+ if(!suppress){
+ this.fireEvent("checkchange", this, state);
+ }
+ }
+ },
+
+
+ handleClick : function(e){
+ if(!this.disabled && !(this.checked && this.group)){
+ this.setChecked(!this.checked);
+ }
+ Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments);
+ }
+});
+Ext.reg('menucheckitem', Ext.menu.CheckItem);
+ Ext.menu.DateMenu = Ext.extend(Ext.menu.Menu, {
+
+ enableScrolling : false,
+
+
+
+ hideOnClick : true,
+
+
+ pickerId : null,
+
+
+
+
+ cls : 'x-date-menu',
+
+
+
+
+
+ initComponent : function(){
+ this.on('beforeshow', this.onBeforeShow, this);
+ if(this.strict = (Ext.isIE7 && Ext.isStrict)){
+ this.on('show', this.onShow, this, {single: true, delay: 20});
+ }
+ Ext.apply(this, {
+ plain: true,
+ showSeparator: false,
+ items: this.picker = new Ext.DatePicker(Ext.applyIf({
+ internalRender: this.strict || !Ext.isIE9m,
+ ctCls: 'x-menu-date-item',
+ id: this.pickerId
+ }, this.initialConfig))
+ });
+ this.picker.purgeListeners();
+ Ext.menu.DateMenu.superclass.initComponent.call(this);
+
+ this.relayEvents(this.picker, ['select']);
+ this.on('show', this.picker.focus, this.picker);
+ this.on('select', this.menuHide, this);
+ if(this.handler){
+ this.on('select', this.handler, this.scope || this);
+ }
+ },
+
+ menuHide : function() {
+ if(this.hideOnClick){
+ this.hide(true);
+ }
+ },
+
+ onBeforeShow : function(){
+ if(this.picker){
+ this.picker.hideMonthPicker(true);
+ }
+ },
+
+ onShow : function(){
+ var el = this.picker.getEl();
+ el.setWidth(el.getWidth());
+ }
+ });
+ Ext.reg('datemenu', Ext.menu.DateMenu);
+
+ Ext.menu.ColorMenu = Ext.extend(Ext.menu.Menu, {
+
+ enableScrolling : false,
+
+
+
+
+ hideOnClick : true,
+
+ cls : 'x-color-menu',
+
+
+ paletteId : null,
+
+
+
+
+
+
+
+
+
+
+ initComponent : function(){
+ Ext.apply(this, {
+ plain: true,
+ showSeparator: false,
+ items: this.palette = new Ext.ColorPalette(Ext.applyIf({
+ id: this.paletteId
+ }, this.initialConfig))
+ });
+ this.palette.purgeListeners();
+ Ext.menu.ColorMenu.superclass.initComponent.call(this);
+
+ this.relayEvents(this.palette, ['select']);
+ this.on('select', this.menuHide, this);
+ if(this.handler){
+ this.on('select', this.handler, this.scope || this);
+ }
+ },
+
+ menuHide : function(){
+ if(this.hideOnClick){
+ this.hide(true);
+ }
+ }
+});
+Ext.reg('colormenu', Ext.menu.ColorMenu);
+
+Ext.form.Field = Ext.extend(Ext.BoxComponent, {
+
+
+
+
+
+
+
+
+ invalidClass : 'x-form-invalid',
+
+ invalidText : 'The value in this field is invalid',
+
+ focusClass : 'x-form-focus',
+
+
+ validationEvent : 'keyup',
+
+ validateOnBlur : true,
+
+ validationDelay : 250,
+
+ defaultAutoCreate : {tag: 'input', type: 'text', size: '20', autocomplete: 'off'},
+
+ fieldClass : 'x-form-field',
+
+ msgTarget : 'qtip',
+
+ msgFx : 'normal',
+
+ readOnly : false,
+
+ disabled : false,
+
+ submitValue: true,
+
+
+ isFormField : true,
+
+
+ msgDisplay: '',
+
+
+ hasFocus : false,
+
+
+ initComponent : function(){
+ Ext.form.Field.superclass.initComponent.call(this);
+ this.addEvents(
+
+ 'focus',
+
+ 'blur',
+
+ 'specialkey',
+
+ 'change',
+
+ 'invalid',
+
+ 'valid'
+ );
+ },
+
+
+ getName : function(){
+ return this.rendered && this.el.dom.name ? this.el.dom.name : this.name || this.id || '';
+ },
+
+
+ onRender : function(ct, position){
+ if(!this.el){
+ var cfg = this.getAutoCreate();
+
+ if(!cfg.name){
+ cfg.name = this.name || this.id;
+ }
+ if(this.inputType){
+ cfg.type = this.inputType;
+ }
+ this.autoEl = cfg;
+ }
+ Ext.form.Field.superclass.onRender.call(this, ct, position);
+ if(this.submitValue === false){
+ this.el.dom.removeAttribute('name');
+ }
+ var type = this.el.dom.type;
+ if(type){
+ if(type == 'password'){
+ type = 'text';
+ }
+ this.el.addClass('x-form-'+type);
+ }
+ if(this.readOnly){
+ this.setReadOnly(true);
+ }
+ if(this.tabIndex !== undefined){
+ this.el.dom.setAttribute('tabIndex', this.tabIndex);
+ }
+
+ this.el.addClass([this.fieldClass, this.cls]);
+ },
+
+
+ getItemCt : function(){
+ return this.itemCt;
+ },
+
+
+ initValue : function(){
+ if(this.value !== undefined){
+ this.setValue(this.value);
+ }else if(!Ext.isEmpty(this.el.dom.value) && this.el.dom.value != this.emptyText){
+ this.setValue(this.el.dom.value);
+ }
+
+ this.originalValue = this.getValue();
+ },
+
+
+ isDirty : function() {
+ if(this.disabled || !this.rendered) {
+ return false;
+ }
+ return String(this.getValue()) !== String(this.originalValue);
+ },
+
+
+ setReadOnly : function(readOnly){
+ if(this.rendered){
+ this.el.dom.readOnly = readOnly;
+ }
+ this.readOnly = readOnly;
+ },
+
+
+ afterRender : function(){
+ Ext.form.Field.superclass.afterRender.call(this);
+ this.initEvents();
+ this.initValue();
+ },
+
+
+ fireKey : function(e){
+ if(e.isSpecialKey()){
+ this.fireEvent('specialkey', this, e);
+ }
+ },
+
+
+ reset : function(){
+ this.setValue(this.originalValue);
+ this.clearInvalid();
+ },
+
+
+ initEvents : function(){
+ this.mon(this.el, Ext.EventManager.getKeyEvent(), this.fireKey, this);
+ this.mon(this.el, 'focus', this.onFocus, this);
+
+
+
+ this.mon(this.el, 'blur', this.onBlur, this, this.inEditor ? {buffer:10} : null);
+ },
+
+
+ preFocus: Ext.emptyFn,
+
+
+ onFocus : function(){
+ this.preFocus();
+ if(this.focusClass){
+ this.el.addClass(this.focusClass);
+ }
+ if(!this.hasFocus){
+ this.hasFocus = true;
+
+ this.startValue = this.getValue();
+ this.fireEvent('focus', this);
+ }
+ },
+
+
+ beforeBlur : Ext.emptyFn,
+
+
+ onBlur : function(){
+ this.beforeBlur();
+ if(this.focusClass){
+ this.el.removeClass(this.focusClass);
+ }
+ this.hasFocus = false;
+ if(this.validationEvent !== false && (this.validateOnBlur || this.validationEvent == 'blur')){
+ this.validate();
+ }
+ var v = this.getValue();
+ if(String(v) !== String(this.startValue)){
+ this.fireEvent('change', this, v, this.startValue);
+ }
+ this.fireEvent('blur', this);
+ this.postBlur();
+ },
+
+
+ postBlur : Ext.emptyFn,
+
+
+ isValid : function(preventMark){
+ if(this.disabled){
+ return true;
+ }
+ var restore = this.preventMark;
+ this.preventMark = preventMark === true;
+ var v = this.validateValue(this.processValue(this.getRawValue()), preventMark);
+ this.preventMark = restore;
+ return v;
+ },
+
+
+ validate : function(){
+ if(this.disabled || this.validateValue(this.processValue(this.getRawValue()))){
+ this.clearInvalid();
+ return true;
+ }
+ return false;
+ },
+
+
+ processValue : function(value){
+ return value;
+ },
+
+
+ validateValue : function(value) {
+
+ var error = this.getErrors(value)[0];
+
+ if (error == undefined) {
+ return true;
+ } else {
+ this.markInvalid(error);
+ return false;
+ }
+ },
+
+
+ getErrors: function() {
+ return [];
+ },
+
+
+ getActiveError : function(){
+ return this.activeError || '';
+ },
+
+
+ markInvalid : function(msg){
+
+ if (this.rendered && !this.preventMark) {
+ msg = msg || this.invalidText;
+
+ var mt = this.getMessageHandler();
+ if(mt){
+ mt.mark(this, msg);
+ }else if(this.msgTarget){
+ this.el.addClass(this.invalidClass);
+ var t = Ext.getDom(this.msgTarget);
+ if(t){
+ t.innerHTML = msg;
+ t.style.display = this.msgDisplay;
+ }
+ }
+ }
+
+ this.setActiveError(msg);
+ },
+
+
+ clearInvalid : function(){
+
+ if (this.rendered && !this.preventMark) {
+ this.el.removeClass(this.invalidClass);
+ var mt = this.getMessageHandler();
+ if(mt){
+ mt.clear(this);
+ }else if(this.msgTarget){
+ this.el.removeClass(this.invalidClass);
+ var t = Ext.getDom(this.msgTarget);
+ if(t){
+ t.innerHTML = '';
+ t.style.display = 'none';
+ }
+ }
+ }
+
+ this.unsetActiveError();
+ },
+
+
+ setActiveError: function(msg, suppressEvent) {
+ this.activeError = msg;
+ if (suppressEvent !== true) this.fireEvent('invalid', this, msg);
+ },
+
+
+ unsetActiveError: function(suppressEvent) {
+ delete this.activeError;
+ if (suppressEvent !== true) this.fireEvent('valid', this);
+ },
+
+
+ getMessageHandler : function(){
+ return Ext.form.MessageTargets[this.msgTarget];
+ },
+
+
+ getErrorCt : function(){
+ return this.el.findParent('.x-form-element', 5, true) ||
+ this.el.findParent('.x-form-field-wrap', 5, true);
+ },
+
+
+ alignErrorEl : function(){
+ this.errorEl.setWidth(this.getErrorCt().getWidth(true) - 20);
+ },
+
+
+ alignErrorIcon : function(){
+ this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]);
+ },
+
+
+ getRawValue : function(){
+ var v = this.rendered ? this.el.getValue() : Ext.value(this.value, '');
+ if(v === this.emptyText){
+ v = '';
+ }
+ return v;
+ },
+
+
+ getValue : function(){
+ if(!this.rendered) {
+ return this.value;
+ }
+ var v = this.el.getValue();
+ if(v === this.emptyText || v === undefined){
+ v = '';
+ }
+ return v;
+ },
+
+
+ setRawValue : function(v){
+ return this.rendered ? (this.el.dom.value = (Ext.isEmpty(v) ? '' : v)) : '';
+ },
+
+
+ setValue : function(v){
+ this.value = v;
+ if(this.rendered){
+ this.el.dom.value = (Ext.isEmpty(v) ? '' : v);
+ this.validate();
+ }
+ return this;
+ },
+
+
+ append : function(v){
+ this.setValue([this.getValue(), v].join(''));
+ }
+
+
+
+
+
+});
+
+
+Ext.form.MessageTargets = {
+ 'qtip' : {
+ mark: function(field, msg){
+ field.el.addClass(field.invalidClass);
+ field.el.dom.qtip = msg;
+ field.el.dom.qclass = 'x-form-invalid-tip';
+ if(Ext.QuickTips){
+ Ext.QuickTips.enable();
+ }
+ },
+ clear: function(field){
+ field.el.removeClass(field.invalidClass);
+ field.el.dom.qtip = '';
+ }
+ },
+ 'title' : {
+ mark: function(field, msg){
+ field.el.addClass(field.invalidClass);
+ field.el.dom.title = msg;
+ },
+ clear: function(field){
+ field.el.dom.title = '';
+ }
+ },
+ 'under' : {
+ mark: function(field, msg){
+ field.el.addClass(field.invalidClass);
+ if(!field.errorEl){
+ var elp = field.getErrorCt();
+ if(!elp){
+ field.el.dom.title = msg;
+ return;
+ }
+ field.errorEl = elp.createChild({cls:'x-form-invalid-msg'});
+ field.on('resize', field.alignErrorEl, field);
+ field.on('destroy', function(){
+ Ext.destroy(this.errorEl);
+ }, field);
+ }
+ field.alignErrorEl();
+ field.errorEl.update(msg);
+ Ext.form.Field.msgFx[field.msgFx].show(field.errorEl, field);
+ },
+ clear: function(field){
+ field.el.removeClass(field.invalidClass);
+ if(field.errorEl){
+ Ext.form.Field.msgFx[field.msgFx].hide(field.errorEl, field);
+ }else{
+ field.el.dom.title = '';
+ }
+ }
+ },
+ 'side' : {
+ mark: function(field, msg){
+ field.el.addClass(field.invalidClass);
+ if(!field.errorIcon){
+ var elp = field.getErrorCt();
+
+ if(!elp){
+ field.el.dom.title = msg;
+ return;
+ }
+ field.errorIcon = elp.createChild({cls:'x-form-invalid-icon'});
+ if (field.ownerCt) {
+ field.ownerCt.on('afterlayout', field.alignErrorIcon, field);
+ field.ownerCt.on('expand', field.alignErrorIcon, field);
+ }
+ field.on('resize', field.alignErrorIcon, field);
+ field.on('destroy', function(){
+ Ext.destroy(this.errorIcon);
+ }, field);
+ }
+ field.alignErrorIcon();
+ field.errorIcon.dom.qtip = msg;
+ field.errorIcon.dom.qclass = 'x-form-invalid-tip';
+ field.errorIcon.show();
+ },
+ clear: function(field){
+ field.el.removeClass(field.invalidClass);
+ if(field.errorIcon){
+ field.errorIcon.dom.qtip = '';
+ field.errorIcon.hide();
+ }else{
+ field.el.dom.title = '';
+ }
+ }
+ }
+};
+
+
+Ext.form.Field.msgFx = {
+ normal : {
+ show: function(msgEl, f){
+ msgEl.setDisplayed('block');
+ },
+
+ hide : function(msgEl, f){
+ msgEl.setDisplayed(false).update('');
+ }
+ },
+
+ slide : {
+ show: function(msgEl, f){
+ msgEl.slideIn('t', {stopFx:true});
+ },
+
+ hide : function(msgEl, f){
+ msgEl.slideOut('t', {stopFx:true,useDisplay:true});
+ }
+ },
+
+ slideRight : {
+ show: function(msgEl, f){
+ msgEl.fixDisplay();
+ msgEl.alignTo(f.el, 'tl-tr');
+ msgEl.slideIn('l', {stopFx:true});
+ },
+
+ hide : function(msgEl, f){
+ msgEl.slideOut('l', {stopFx:true,useDisplay:true});
+ }
+ }
+};
+Ext.reg('field', Ext.form.Field);
+
+Ext.form.TextField = Ext.extend(Ext.form.Field, {
+
+
+
+ grow : false,
+
+ growMin : 30,
+
+ growMax : 800,
+
+ vtype : null,
+
+ maskRe : null,
+
+ disableKeyFilter : false,
+
+ allowBlank : true,
+
+ minLength : 0,
+
+ maxLength : Number.MAX_VALUE,
+
+ minLengthText : 'The minimum length for this field is {0}',
+
+ maxLengthText : 'The maximum length for this field is {0}',
+
+ selectOnFocus : false,
+
+ blankText : 'This field is required',
+
+ validator : null,
+
+ regex : null,
+
+ regexText : '',
+
+ emptyText : null,
+
+ emptyClass : 'x-form-empty-field',
+
+
+
+ initComponent : function(){
+ Ext.form.TextField.superclass.initComponent.call(this);
+ this.addEvents(
+
+ 'autosize',
+
+
+ 'keydown',
+
+ 'keyup',
+
+ 'keypress'
+ );
+ },
+
+
+ initEvents : function(){
+ Ext.form.TextField.superclass.initEvents.call(this);
+ if(this.validationEvent == 'keyup'){
+ this.validationTask = new Ext.util.DelayedTask(this.validate, this);
+ this.mon(this.el, 'keyup', this.filterValidation, this);
+ }
+ else if(this.validationEvent !== false && this.validationEvent != 'blur'){
+ this.mon(this.el, this.validationEvent, this.validate, this, {buffer: this.validationDelay});
+ }
+ if(this.selectOnFocus || this.emptyText){
+ this.mon(this.el, 'mousedown', this.onMouseDown, this);
+
+ if(this.emptyText){
+ this.applyEmptyText();
+ }
+ }
+ if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype+'Mask']))){
+ this.mon(this.el, 'keypress', this.filterKeys, this);
+ }
+ if(this.grow){
+ this.mon(this.el, 'keyup', this.onKeyUpBuffered, this, {buffer: 50});
+ this.mon(this.el, 'click', this.autoSize, this);
+ }
+ if(this.enableKeyEvents){
+ this.mon(this.el, {
+ scope: this,
+ keyup: this.onKeyUp,
+ keydown: this.onKeyDown,
+ keypress: this.onKeyPress
+ });
+ }
+ },
+
+ onMouseDown: function(e){
+ if(!this.hasFocus){
+ this.mon(this.el, 'mouseup', Ext.emptyFn, this, { single: true, preventDefault: true });
+ }
+ },
+
+ processValue : function(value){
+ if(this.stripCharsRe){
+ var newValue = value.replace(this.stripCharsRe, '');
+ if(newValue !== value){
+ this.setRawValue(newValue);
+ return newValue;
+ }
+ }
+ return value;
+ },
+
+ filterValidation : function(e){
+ if(!e.isNavKeyPress()){
+ this.validationTask.delay(this.validationDelay);
+ }
+ },
+
+
+ onDisable: function(){
+ Ext.form.TextField.superclass.onDisable.call(this);
+ if(Ext.isIE){
+ this.el.dom.unselectable = 'on';
+ }
+ },
+
+
+ onEnable: function(){
+ Ext.form.TextField.superclass.onEnable.call(this);
+ if(Ext.isIE){
+ this.el.dom.unselectable = '';
+ }
+ },
+
+
+ onKeyUpBuffered : function(e){
+ if(this.doAutoSize(e)){
+ this.autoSize();
+ }
+ },
+
+
+ doAutoSize : function(e){
+ return !e.isNavKeyPress();
+ },
+
+
+ onKeyUp : function(e){
+ this.fireEvent('keyup', this, e);
+ },
+
+
+ onKeyDown : function(e){
+ this.fireEvent('keydown', this, e);
+ },
+
+
+ onKeyPress : function(e){
+ this.fireEvent('keypress', this, e);
+ },
+
+
+ reset : function(){
+ Ext.form.TextField.superclass.reset.call(this);
+ this.applyEmptyText();
+ },
+
+ applyEmptyText : function(){
+ if(this.rendered && this.emptyText && this.getRawValue().length < 1 && !this.hasFocus){
+ this.setRawValue(this.emptyText);
+ this.el.addClass(this.emptyClass);
+ }
+ },
+
+
+ preFocus : function(){
+ var el = this.el,
+ isEmpty;
+ if(this.emptyText){
+ if(el.dom.value == this.emptyText){
+ this.setRawValue('');
+ isEmpty = true;
+ }
+ el.removeClass(this.emptyClass);
+ }
+ if(this.selectOnFocus || isEmpty){
+ el.dom.select();
+ }
+ },
+
+
+ postBlur : function(){
+ this.applyEmptyText();
+ },
+
+
+ filterKeys : function(e){
+ if(e.ctrlKey){
+ return;
+ }
+ var k = e.getKey();
+ if(Ext.isGecko && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){
+ return;
+ }
+ var cc = String.fromCharCode(e.getCharCode());
+ if(!Ext.isGecko && e.isSpecialKey() && !cc){
+ return;
+ }
+ if(!this.maskRe.test(cc)){
+ e.stopEvent();
+ }
+ },
+
+ setValue : function(v){
+ if(this.emptyText && this.el && !Ext.isEmpty(v)){
+ this.el.removeClass(this.emptyClass);
+ }
+ Ext.form.TextField.superclass.setValue.apply(this, arguments);
+ this.applyEmptyText();
+ this.autoSize();
+ return this;
+ },
+
+
+ getErrors: function(value) {
+ var errors = Ext.form.TextField.superclass.getErrors.apply(this, arguments);
+
+ value = Ext.isDefined(value) ? value : this.processValue(this.getRawValue());
+
+ if (Ext.isFunction(this.validator)) {
+ var msg = this.validator(value);
+ if (msg !== true) {
+ errors.push(msg);
+ }
+ }
+
+ if (value.length < 1 || value === this.emptyText) {
+ if (this.allowBlank) {
+
+ return errors;
+ } else {
+ errors.push(this.blankText);
+ }
+ }
+
+ if (!this.allowBlank && (value.length < 1 || value === this.emptyText)) {
+ errors.push(this.blankText);
+ }
+
+ if (value.length < this.minLength) {
+ errors.push(String.format(this.minLengthText, this.minLength));
+ }
+
+ if (value.length > this.maxLength) {
+ errors.push(String.format(this.maxLengthText, this.maxLength));
+ }
+
+ if (this.vtype) {
+ var vt = Ext.form.VTypes;
+ if(!vt[this.vtype](value, this)){
+ errors.push(this.vtypeText || vt[this.vtype +'Text']);
+ }
+ }
+
+ if (this.regex && !this.regex.test(value)) {
+ errors.push(this.regexText);
+ }
+
+ return errors;
+ },
+
+
+ selectText : function(start, end){
+ var v = this.getRawValue();
+ var doFocus = false;
+ if(v.length > 0){
+ start = start === undefined ? 0 : start;
+ end = end === undefined ? v.length : end;
+ var d = this.el.dom;
+ if(d.setSelectionRange){
+ d.setSelectionRange(start, end);
+ }else if(d.createTextRange){
+ var range = d.createTextRange();
+ range.moveStart('character', start);
+ range.moveEnd('character', end-v.length);
+ range.select();
+ }
+ doFocus = Ext.isGecko || Ext.isOpera;
+ }else{
+ doFocus = true;
+ }
+ if(doFocus){
+ this.focus();
+ }
+ },
+
+
+ autoSize : function(){
+ if(!this.grow || !this.rendered){
+ return;
+ }
+ if(!this.metrics){
+ this.metrics = Ext.util.TextMetrics.createInstance(this.el);
+ }
+ var el = this.el;
+ var v = el.dom.value;
+ var d = document.createElement('div');
+ d.appendChild(document.createTextNode(v));
+ v = d.innerHTML;
+ Ext.removeNode(d);
+ d = null;
+ v += '&#160;';
+ var w = Math.min(this.growMax, Math.max(this.metrics.getWidth(v) + 10, this.growMin));
+ this.el.setWidth(w);
+ this.fireEvent('autosize', this, w);
+ },
+
+ onDestroy: function(){
+ if(this.validationTask){
+ this.validationTask.cancel();
+ this.validationTask = null;
+ }
+ Ext.form.TextField.superclass.onDestroy.call(this);
+ }
+});
+Ext.reg('textfield', Ext.form.TextField);
+
+Ext.form.TriggerField = Ext.extend(Ext.form.TextField, {
+
+
+
+ defaultAutoCreate : {tag: "input", type: "text", size: "16", autocomplete: "off"},
+
+ hideTrigger:false,
+
+ editable: true,
+
+ readOnly: false,
+
+ wrapFocusClass: 'x-trigger-wrap-focus',
+
+ autoSize: Ext.emptyFn,
+
+ monitorTab : true,
+
+ deferHeight : true,
+
+ mimicing : false,
+
+ actionMode: 'wrap',
+
+ defaultTriggerWidth: 17,
+
+
+ onResize : function(w, h){
+ Ext.form.TriggerField.superclass.onResize.call(this, w, h);
+ var tw = this.getTriggerWidth();
+ if(Ext.isNumber(w)){
+ this.el.setWidth(w - tw);
+ }
+ this.wrap.setWidth(this.el.getWidth() + tw);
+ },
+
+ getTriggerWidth: function(){
+ var tw = this.trigger.getWidth();
+ if(!this.hideTrigger && !this.readOnly && tw === 0){
+ tw = this.defaultTriggerWidth;
+ }
+ return tw;
+ },
+
+
+ alignErrorIcon : function(){
+ if(this.wrap){
+ this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]);
+ }
+ },
+
+
+ onRender : function(ct, position){
+ this.doc = Ext.isIE ? Ext.getBody() : Ext.getDoc();
+ Ext.form.TriggerField.superclass.onRender.call(this, ct, position);
+
+ this.wrap = this.el.wrap({cls: 'x-form-field-wrap x-form-field-trigger-wrap'});
+ this.trigger = this.wrap.createChild(this.triggerConfig ||
+ {tag: "img", src: Ext.BLANK_IMAGE_URL, alt: "", cls: "x-form-trigger " + this.triggerClass});
+ this.initTrigger();
+ if(!this.width){
+ this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth());
+ }
+ this.resizeEl = this.positionEl = this.wrap;
+ },
+
+ getWidth: function() {
+ return(this.el.getWidth() + this.trigger.getWidth());
+ },
+
+ updateEditState: function(){
+ if(this.rendered){
+ if (this.readOnly) {
+ this.el.dom.readOnly = true;
+ this.el.addClass('x-trigger-noedit');
+ this.mun(this.el, 'click', this.onTriggerClick, this);
+ this.trigger.setDisplayed(false);
+ } else {
+ if (!this.editable) {
+ this.el.dom.readOnly = true;
+ this.el.addClass('x-trigger-noedit');
+ this.mon(this.el, 'click', this.onTriggerClick, this);
+ } else {
+ this.el.dom.readOnly = false;
+ this.el.removeClass('x-trigger-noedit');
+ this.mun(this.el, 'click', this.onTriggerClick, this);
+ }
+ this.trigger.setDisplayed(!this.hideTrigger);
+ }
+ this.onResize(this.width || this.wrap.getWidth());
+ }
+ },
+
+
+ setHideTrigger: function(hideTrigger){
+ if(hideTrigger != this.hideTrigger){
+ this.hideTrigger = hideTrigger;
+ this.updateEditState();
+ }
+ },
+
+
+ setEditable: function(editable){
+ if(editable != this.editable){
+ this.editable = editable;
+ this.updateEditState();
+ }
+ },
+
+
+ setReadOnly: function(readOnly){
+ if(readOnly != this.readOnly){
+ this.readOnly = readOnly;
+ this.updateEditState();
+ }
+ },
+
+ afterRender : function(){
+ Ext.form.TriggerField.superclass.afterRender.call(this);
+ this.updateEditState();
+ },
+
+
+ initTrigger : function(){
+ this.mon(this.trigger, 'click', this.onTriggerClick, this, {preventDefault:true});
+ this.trigger.addClassOnOver('x-form-trigger-over');
+ this.trigger.addClassOnClick('x-form-trigger-click');
+ },
+
+
+ onDestroy : function(){
+ Ext.destroy(this.trigger, this.wrap);
+ if (this.mimicing){
+ this.doc.un('mousedown', this.mimicBlur, this);
+ }
+ delete this.doc;
+ Ext.form.TriggerField.superclass.onDestroy.call(this);
+ },
+
+
+ onFocus : function(){
+ Ext.form.TriggerField.superclass.onFocus.call(this);
+ if(!this.mimicing){
+ this.wrap.addClass(this.wrapFocusClass);
+ this.mimicing = true;
+ this.doc.on('mousedown', this.mimicBlur, this, {delay: 10});
+ if(this.monitorTab){
+ this.on('specialkey', this.checkTab, this);
+ }
+ }
+ },
+
+
+ checkTab : function(me, e){
+ if(e.getKey() == e.TAB){
+ this.triggerBlur();
+ }
+ },
+
+
+ onBlur : Ext.emptyFn,
+
+
+ mimicBlur : function(e){
+ if(!this.isDestroyed && !this.wrap.contains(e.target) && this.validateBlur(e)){
+ this.triggerBlur();
+ }
+ },
+
+
+ triggerBlur : function(){
+ this.mimicing = false;
+ this.doc.un('mousedown', this.mimicBlur, this);
+ if(this.monitorTab && this.el){
+ this.un('specialkey', this.checkTab, this);
+ }
+ Ext.form.TriggerField.superclass.onBlur.call(this);
+ if(this.wrap){
+ this.wrap.removeClass(this.wrapFocusClass);
+ }
+ },
+
+ beforeBlur : Ext.emptyFn,
+
+
+
+ validateBlur : function(e){
+ return true;
+ },
+
+
+ onTriggerClick : Ext.emptyFn
+
+
+
+
+});
+
+
+Ext.form.TwinTriggerField = Ext.extend(Ext.form.TriggerField, {
+
+
+
+
+ initComponent : function(){
+ Ext.form.TwinTriggerField.superclass.initComponent.call(this);
+
+ this.triggerConfig = {
+ tag:'span', cls:'x-form-twin-triggers', cn:[
+ {tag: "img", src: Ext.BLANK_IMAGE_URL, alt: "", cls: "x-form-trigger " + this.trigger1Class},
+ {tag: "img", src: Ext.BLANK_IMAGE_URL, alt: "", cls: "x-form-trigger " + this.trigger2Class}
+ ]};
+ },
+
+ getTrigger : function(index){
+ return this.triggers[index];
+ },
+
+ afterRender: function(){
+ Ext.form.TwinTriggerField.superclass.afterRender.call(this);
+ var triggers = this.triggers,
+ i = 0,
+ len = triggers.length;
+
+ for(; i < len; ++i){
+ if(this['hideTrigger' + (i + 1)]){
+ triggers[i].hide();
+ }
+
+ }
+ },
+
+ initTrigger : function(){
+ var ts = this.trigger.select('.x-form-trigger', true),
+ triggerField = this;
+
+ ts.each(function(t, all, index){
+ var triggerIndex = 'Trigger'+(index+1);
+ t.hide = function(){
+ var w = triggerField.wrap.getWidth();
+ this.dom.style.display = 'none';
+ triggerField.el.setWidth(w-triggerField.trigger.getWidth());
+ triggerField['hidden' + triggerIndex] = true;
+ };
+ t.show = function(){
+ var w = triggerField.wrap.getWidth();
+ this.dom.style.display = '';
+ triggerField.el.setWidth(w-triggerField.trigger.getWidth());
+ triggerField['hidden' + triggerIndex] = false;
+ };
+ this.mon(t, 'click', this['on'+triggerIndex+'Click'], this, {preventDefault:true});
+ t.addClassOnOver('x-form-trigger-over');
+ t.addClassOnClick('x-form-trigger-click');
+ }, this);
+ this.triggers = ts.elements;
+ },
+
+ getTriggerWidth: function(){
+ var tw = 0;
+ Ext.each(this.triggers, function(t, index){
+ var triggerIndex = 'Trigger' + (index + 1),
+ w = t.getWidth();
+ if(w === 0 && !this['hidden' + triggerIndex]){
+ tw += this.defaultTriggerWidth;
+ }else{
+ tw += w;
+ }
+ }, this);
+ return tw;
+ },
+
+
+ onDestroy : function() {
+ Ext.destroy(this.triggers);
+ Ext.form.TwinTriggerField.superclass.onDestroy.call(this);
+ },
+
+
+ onTrigger1Click : Ext.emptyFn,
+
+ onTrigger2Click : Ext.emptyFn
+});
+Ext.reg('trigger', Ext.form.TriggerField);
+Ext.reg('twintrigger', Ext.form.TwinTriggerField);
+Ext.form.TextArea = Ext.extend(Ext.form.TextField, {
+
+ growMin : 60,
+
+ growMax: 1000,
+ growAppend : '&#160;\n&#160;',
+
+ enterIsSpecial : false,
+
+
+ preventScrollbars: false,
+
+
+
+ onRender : function(ct, position){
+ if(!this.el){
+ this.defaultAutoCreate = {
+ tag: "textarea",
+ style:"width:100px;height:60px;",
+ autocomplete: "off"
+ };
+ }
+ Ext.form.TextArea.superclass.onRender.call(this, ct, position);
+ if(this.grow){
+ this.textSizeEl = Ext.DomHelper.append(document.body, {
+ tag: "pre", cls: "x-form-grow-sizer"
+ });
+ if(this.preventScrollbars){
+ this.el.setStyle("overflow", "hidden");
+ }
+ this.el.setHeight(this.growMin);
+ }
+ },
+
+ onDestroy : function(){
+ Ext.removeNode(this.textSizeEl);
+ Ext.form.TextArea.superclass.onDestroy.call(this);
+ },
+
+ fireKey : function(e){
+ if(e.isSpecialKey() && (this.enterIsSpecial || (e.getKey() != e.ENTER || e.hasModifier()))){
+ this.fireEvent("specialkey", this, e);
+ }
+ },
+
+
+ doAutoSize : function(e){
+ return !e.isNavKeyPress() || e.getKey() == e.ENTER;
+ },
+
+
+ filterValidation: function(e) {
+ if(!e.isNavKeyPress() || (!this.enterIsSpecial && e.keyCode == e.ENTER)){
+ this.validationTask.delay(this.validationDelay);
+ }
+ },
+
+
+ autoSize: function(){
+ if(!this.grow || !this.textSizeEl){
+ return;
+ }
+ var el = this.el,
+ v = Ext.util.Format.htmlEncode(el.dom.value),
+ ts = this.textSizeEl,
+ h;
+
+ Ext.fly(ts).setWidth(this.el.getWidth());
+ if(v.length < 1){
+ v = "&#160;&#160;";
+ }else{
+ v += this.growAppend;
+ if(Ext.isIE){
+ v = v.replace(/\n/g, '&#160;<br />');
+ }
+ }
+ ts.innerHTML = v;
+ h = Math.min(this.growMax, Math.max(ts.offsetHeight, this.growMin));
+ if(h != this.lastHeight){
+ this.lastHeight = h;
+ this.el.setHeight(h);
+ this.fireEvent("autosize", this, h);
+ }
+ }
+});
+Ext.reg('textarea', Ext.form.TextArea);
+Ext.form.NumberField = Ext.extend(Ext.form.TextField, {
+
+
+
+ fieldClass: "x-form-field x-form-num-field",
+
+
+ allowDecimals : true,
+
+
+ decimalSeparator : ".",
+
+
+ decimalPrecision : 2,
+
+
+ allowNegative : true,
+
+
+ minValue : Number.NEGATIVE_INFINITY,
+
+
+ maxValue : Number.MAX_VALUE,
+
+
+ minText : "The minimum value for this field is {0}",
+
+
+ maxText : "The maximum value for this field is {0}",
+
+
+ nanText : "{0} is not a valid number",
+
+
+ baseChars : "0123456789",
+
+
+ autoStripChars: false,
+
+
+ initEvents : function() {
+ var allowed = this.baseChars + '';
+ if (this.allowDecimals) {
+ allowed += this.decimalSeparator;
+ }
+ if (this.allowNegative) {
+ allowed += '-';
+ }
+ allowed = Ext.escapeRe(allowed);
+ this.maskRe = new RegExp('[' + allowed + ']');
+ if (this.autoStripChars) {
+ this.stripCharsRe = new RegExp('[^' + allowed + ']', 'gi');
+ }
+
+ Ext.form.NumberField.superclass.initEvents.call(this);
+ },
+
+
+ getErrors: function(value) {
+ var errors = Ext.form.NumberField.superclass.getErrors.apply(this, arguments);
+
+ value = Ext.isDefined(value) ? value : this.processValue(this.getRawValue());
+
+ if (value.length < 1) {
+ return errors;
+ }
+
+ value = String(value).replace(this.decimalSeparator, ".");
+
+ if(isNaN(value)){
+ errors.push(String.format(this.nanText, value));
+ }
+
+ var num = this.parseValue(value);
+
+ if (num < this.minValue) {
+ errors.push(String.format(this.minText, this.minValue));
+ }
+
+ if (num > this.maxValue) {
+ errors.push(String.format(this.maxText, this.maxValue));
+ }
+
+ return errors;
+ },
+
+ getValue : function() {
+ return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this)));
+ },
+
+ setValue : function(v) {
+ v = Ext.isNumber(v) ? v : parseFloat(String(v).replace(this.decimalSeparator, "."));
+ v = this.fixPrecision(v);
+ v = isNaN(v) ? '' : String(v).replace(".", this.decimalSeparator);
+ return Ext.form.NumberField.superclass.setValue.call(this, v);
+ },
+
+
+ setMinValue : function(value) {
+ this.minValue = Ext.num(value, Number.NEGATIVE_INFINITY);
+ },
+
+
+ setMaxValue : function(value) {
+ this.maxValue = Ext.num(value, Number.MAX_VALUE);
+ },
+
+
+ parseValue : function(value) {
+ value = parseFloat(String(value).replace(this.decimalSeparator, "."));
+ return isNaN(value) ? '' : value;
+ },
+
+
+ fixPrecision : function(value) {
+ var nan = isNaN(value);
+
+ if (!this.allowDecimals || this.decimalPrecision == -1 || nan || !value) {
+ return nan ? '' : value;
+ }
+
+ return parseFloat(parseFloat(value).toFixed(this.decimalPrecision));
+ },
+
+ beforeBlur : function() {
+ var v = this.parseValue(this.getRawValue());
+
+ if (!Ext.isEmpty(v)) {
+ this.setValue(v);
+ }
+ }
+});
+
+Ext.reg('numberfield', Ext.form.NumberField);
+
+Ext.form.DateField = Ext.extend(Ext.form.TriggerField, {
+
+ format : "m/d/Y",
+
+ altFormats : "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d|n-j|n/j",
+
+ disabledDaysText : "Disabled",
+
+ disabledDatesText : "Disabled",
+
+ minText : "The date in this field must be equal to or after {0}",
+
+ maxText : "The date in this field must be equal to or before {0}",
+
+ invalidText : "{0} is not a valid date - it must be in the format {1}",
+
+ triggerClass : 'x-form-date-trigger',
+
+ showToday : true,
+
+
+ startDay : 0,
+
+
+
+
+
+
+
+
+ defaultAutoCreate : {tag: "input", type: "text", size: "10", autocomplete: "off"},
+
+
+
+ initTime: '12',
+
+ initTimeFormat: 'H',
+
+
+ safeParse : function(value, format) {
+ if (Date.formatContainsHourInfo(format)) {
+
+ return Date.parseDate(value, format);
+ } else {
+
+ var parsedDate = Date.parseDate(value + ' ' + this.initTime, format + ' ' + this.initTimeFormat);
+
+ if (parsedDate) {
+ return parsedDate.clearTime();
+ }
+ }
+ },
+
+ initComponent : function(){
+ Ext.form.DateField.superclass.initComponent.call(this);
+
+ this.addEvents(
+
+ 'select'
+ );
+
+ if(Ext.isString(this.minValue)){
+ this.minValue = this.parseDate(this.minValue);
+ }
+ if(Ext.isString(this.maxValue)){
+ this.maxValue = this.parseDate(this.maxValue);
+ }
+ this.disabledDatesRE = null;
+ this.initDisabledDays();
+ },
+
+ initEvents: function() {
+ Ext.form.DateField.superclass.initEvents.call(this);
+ this.keyNav = new Ext.KeyNav(this.el, {
+ "down": function(e) {
+ this.onTriggerClick();
+ },
+ scope: this,
+ forceKeyDown: true
+ });
+ },
+
+
+
+ initDisabledDays : function(){
+ if(this.disabledDates){
+ var dd = this.disabledDates,
+ len = dd.length - 1,
+ re = "(?:";
+
+ Ext.each(dd, function(d, i){
+ re += Ext.isDate(d) ? '^' + Ext.escapeRe(d.dateFormat(this.format)) + '$' : dd[i];
+ if(i != len){
+ re += '|';
+ }
+ }, this);
+ this.disabledDatesRE = new RegExp(re + ')');
+ }
+ },
+
+
+ setDisabledDates : function(dd){
+ this.disabledDates = dd;
+ this.initDisabledDays();
+ if(this.menu){
+ this.menu.picker.setDisabledDates(this.disabledDatesRE);
+ }
+ },
+
+
+ setDisabledDays : function(dd){
+ this.disabledDays = dd;
+ if(this.menu){
+ this.menu.picker.setDisabledDays(dd);
+ }
+ },
+
+
+ setMinValue : function(dt){
+ this.minValue = (Ext.isString(dt) ? this.parseDate(dt) : dt);
+ if(this.menu){
+ this.menu.picker.setMinDate(this.minValue);
+ }
+ },
+
+
+ setMaxValue : function(dt){
+ this.maxValue = (Ext.isString(dt) ? this.parseDate(dt) : dt);
+ if(this.menu){
+ this.menu.picker.setMaxDate(this.maxValue);
+ }
+ },
+
+
+ getErrors: function(value) {
+ var errors = Ext.form.DateField.superclass.getErrors.apply(this, arguments);
+
+ value = this.formatDate(value || this.processValue(this.getRawValue()));
+
+ if (value.length < 1) {
+ return errors;
+ }
+
+ var svalue = value;
+ value = this.parseDate(value);
+ if (!value) {
+ errors.push(String.format(this.invalidText, svalue, this.format));
+ return errors;
+ }
+
+ var time = value.getTime();
+ if (this.minValue && time < this.minValue.clearTime().getTime()) {
+ errors.push(String.format(this.minText, this.formatDate(this.minValue)));
+ }
+
+ if (this.maxValue && time > this.maxValue.clearTime().getTime()) {
+ errors.push(String.format(this.maxText, this.formatDate(this.maxValue)));
+ }
+
+ if (this.disabledDays) {
+ var day = value.getDay();
+
+ for(var i = 0; i < this.disabledDays.length; i++) {
+ if (day === this.disabledDays[i]) {
+ errors.push(this.disabledDaysText);
+ break;
+ }
+ }
+ }
+
+ var fvalue = this.formatDate(value);
+ if (this.disabledDatesRE && this.disabledDatesRE.test(fvalue)) {
+ errors.push(String.format(this.disabledDatesText, fvalue));
+ }
+
+ return errors;
+ },
+
+
+
+ validateBlur : function(){
+ return !this.menu || !this.menu.isVisible();
+ },
+
+
+ getValue : function(){
+ return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || "";
+ },
+
+
+ setValue : function(date){
+ return Ext.form.DateField.superclass.setValue.call(this, this.formatDate(this.parseDate(date)));
+ },
+
+
+ parseDate : function(value) {
+ if(!value || Ext.isDate(value)){
+ return value;
+ }
+
+ var v = this.safeParse(value, this.format),
+ af = this.altFormats,
+ afa = this.altFormatsArray;
+
+ if (!v && af) {
+ afa = afa || af.split("|");
+
+ for (var i = 0, len = afa.length; i < len && !v; i++) {
+ v = this.safeParse(value, afa[i]);
+ }
+ }
+ return v;
+ },
+
+
+ onDestroy : function(){
+ Ext.destroy(this.menu, this.keyNav);
+ Ext.form.DateField.superclass.onDestroy.call(this);
+ },
+
+
+ formatDate : function(date){
+ return Ext.isDate(date) ? date.dateFormat(this.format) : date;
+ },
+
+
+
+
+ onTriggerClick : function(){
+ if(this.disabled){
+ return;
+ }
+ if(this.menu == null){
+ this.menu = new Ext.menu.DateMenu({
+ hideOnClick: false,
+ focusOnSelect: false
+ });
+ }
+ this.onFocus();
+ Ext.apply(this.menu.picker, {
+ minDate : this.minValue,
+ maxDate : this.maxValue,
+ disabledDatesRE : this.disabledDatesRE,
+ disabledDatesText : this.disabledDatesText,
+ disabledDays : this.disabledDays,
+ disabledDaysText : this.disabledDaysText,
+ format : this.format,
+ showToday : this.showToday,
+ startDay: this.startDay,
+ minText : String.format(this.minText, this.formatDate(this.minValue)),
+ maxText : String.format(this.maxText, this.formatDate(this.maxValue))
+ });
+ this.menu.picker.setValue(this.getValue() || new Date());
+ this.menu.show(this.el, "tl-bl?");
+ this.menuEvents('on');
+ },
+
+
+ menuEvents: function(method){
+ this.menu[method]('select', this.onSelect, this);
+ this.menu[method]('hide', this.onMenuHide, this);
+ this.menu[method]('show', this.onFocus, this);
+ },
+
+ onSelect: function(m, d){
+ this.setValue(d);
+ this.fireEvent('select', this, d);
+ this.menu.hide();
+ },
+
+ onMenuHide: function(){
+ this.focus(false, 60);
+ this.menuEvents('un');
+ },
+
+
+ beforeBlur : function(){
+ var v = this.parseDate(this.getRawValue());
+ if(v){
+ this.setValue(v);
+ }
+ }
+
+
+
+
+
+});
+Ext.reg('datefield', Ext.form.DateField);
+
+Ext.form.DisplayField = Ext.extend(Ext.form.Field, {
+ validationEvent : false,
+ validateOnBlur : false,
+ defaultAutoCreate : {tag: "div"},
+
+ fieldClass : "x-form-display-field",
+
+ htmlEncode: false,
+
+
+ initEvents : Ext.emptyFn,
+
+ isValid : function(){
+ return true;
+ },
+
+ validate : function(){
+ return true;
+ },
+
+ getRawValue : function(){
+ var v = this.rendered ? this.el.dom.innerHTML : Ext.value(this.value, '');
+ if(v === this.emptyText){
+ v = '';
+ }
+ if(this.htmlEncode){
+ v = Ext.util.Format.htmlDecode(v);
+ }
+ return v;
+ },
+
+ getValue : function(){
+ return this.getRawValue();
+ },
+
+ getName: function() {
+ return this.name;
+ },
+
+ setRawValue : function(v){
+ if(this.htmlEncode){
+ v = Ext.util.Format.htmlEncode(v);
+ }
+ return this.rendered ? (this.el.dom.innerHTML = (Ext.isEmpty(v) ? '' : v)) : (this.value = v);
+ },
+
+ setValue : function(v){
+ this.setRawValue(v);
+ return this;
+ }
+
+
+
+
+
+
+});
+
+Ext.reg('displayfield', Ext.form.DisplayField);
+
+Ext.form.ComboBox = Ext.extend(Ext.form.TriggerField, {
+
+
+
+
+
+
+
+ defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"},
+
+
+
+
+
+
+
+ listClass : '',
+
+ selectedClass : 'x-combo-selected',
+
+ listEmptyText: '',
+
+ triggerClass : 'x-form-arrow-trigger',
+
+ shadow : 'sides',
+
+ listAlign : 'tl-bl?',
+
+ maxHeight : 300,
+
+ minHeight : 90,
+
+ triggerAction : 'query',
+
+ minChars : 4,
+
+ autoSelect : true,
+
+ typeAhead : false,
+
+ queryDelay : 500,
+
+ pageSize : 0,
+
+ selectOnFocus : false,
+
+ queryParam : 'query',
+
+ loadingText : 'Loading...',
+
+ resizable : false,
+
+ handleHeight : 8,
+
+ allQuery: '',
+
+ mode: 'remote',
+
+ minListWidth : 70,
+
+ forceSelection : false,
+
+ typeAheadDelay : 250,
+
+
+
+ lazyInit : true,
+
+
+ clearFilterOnReset : true,
+
+
+ submitValue: undefined,
+
+
+
+
+ initComponent : function(){
+ Ext.form.ComboBox.superclass.initComponent.call(this);
+ this.addEvents(
+
+ 'expand',
+
+ 'collapse',
+
+
+ 'beforeselect',
+
+ 'select',
+
+ 'beforequery'
+ );
+ if(this.transform){
+ var s = Ext.getDom(this.transform);
+ if(!this.hiddenName){
+ this.hiddenName = s.name;
+ }
+ if(!this.store){
+ this.mode = 'local';
+ var d = [], opts = s.options;
+ for(var i = 0, len = opts.length;i < len; i++){
+ var o = opts[i],
+ value = (o.hasAttribute ? o.hasAttribute('value') : o.getAttributeNode('value').specified) ? o.value : o.text;
+ if(o.selected && Ext.isEmpty(this.value, true)) {
+ this.value = value;
+ }
+ d.push([value, o.text]);
+ }
+ this.store = new Ext.data.ArrayStore({
+ idIndex: 0,
+ fields: ['value', 'text'],
+ data : d,
+ autoDestroy: true
+ });
+ this.valueField = 'value';
+ this.displayField = 'text';
+ }
+ s.name = Ext.id();
+ if(!this.lazyRender){
+ this.target = true;
+ this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate);
+ this.render(this.el.parentNode, s);
+ }
+ Ext.removeNode(s);
+ }
+
+ else if(this.store){
+ this.store = Ext.StoreMgr.lookup(this.store);
+ if(this.store.autoCreated){
+ this.displayField = this.valueField = 'field1';
+ if(!this.store.expandData){
+ this.displayField = 'field2';
+ }
+ this.mode = 'local';
+ }
+ }
+
+ this.selectedIndex = -1;
+ if(this.mode == 'local'){
+ if(!Ext.isDefined(this.initialConfig.queryDelay)){
+ this.queryDelay = 10;
+ }
+ if(!Ext.isDefined(this.initialConfig.minChars)){
+ this.minChars = 0;
+ }
+ }
+ },
+
+
+ onRender : function(ct, position){
+ if(this.hiddenName && !Ext.isDefined(this.submitValue)){
+ this.submitValue = false;
+ }
+ Ext.form.ComboBox.superclass.onRender.call(this, ct, position);
+ if(this.hiddenName){
+ this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName,
+ id: (this.hiddenId || Ext.id())}, 'before', true);
+
+ }
+ if(Ext.isGecko){
+ this.el.dom.setAttribute('autocomplete', 'off');
+ }
+
+ if(!this.lazyInit){
+ this.initList();
+ }else{
+ this.on('focus', this.initList, this, {single: true});
+ }
+ },
+
+
+ initValue : function(){
+ Ext.form.ComboBox.superclass.initValue.call(this);
+ if(this.hiddenField){
+ this.hiddenField.value =
+ Ext.value(Ext.isDefined(this.hiddenValue) ? this.hiddenValue : this.value, '');
+ }
+ },
+
+ getParentZIndex : function(){
+ var zindex;
+ if (this.ownerCt){
+ this.findParentBy(function(ct){
+ zindex = parseInt(ct.getPositionEl().getStyle('z-index'), 10);
+ return !!zindex;
+ });
+ }
+ return zindex;
+ },
+
+ getZIndex : function(listParent){
+ listParent = listParent || Ext.getDom(this.getListParent() || Ext.getBody());
+ var zindex = parseInt(Ext.fly(listParent).getStyle('z-index'), 10);
+ if(!zindex){
+ zindex = this.getParentZIndex();
+ }
+ return (zindex || 12000) + 5;
+ },
+
+
+ initList : function(){
+ if(!this.list){
+ var cls = 'x-combo-list',
+ listParent = Ext.getDom(this.getListParent() || Ext.getBody());
+
+ this.list = new Ext.Layer({
+ parentEl: listParent,
+ shadow: this.shadow,
+ cls: [cls, this.listClass].join(' '),
+ constrain:false,
+ zindex: this.getZIndex(listParent)
+ });
+
+ var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth);
+ this.list.setSize(lw, 0);
+ this.list.swallowEvent('mousewheel');
+ this.assetHeight = 0;
+ if(this.syncFont !== false){
+ this.list.setStyle('font-size', this.el.getStyle('font-size'));
+ }
+ if(this.title){
+ this.header = this.list.createChild({cls:cls+'-hd', html: this.title});
+ this.assetHeight += this.header.getHeight();
+ }
+
+ this.innerList = this.list.createChild({cls:cls+'-inner'});
+ this.mon(this.innerList, 'mouseover', this.onViewOver, this);
+ this.mon(this.innerList, 'mousemove', this.onViewMove, this);
+ this.innerList.setWidth(lw - this.list.getFrameWidth('lr'));
+
+ if(this.pageSize){
+ this.footer = this.list.createChild({cls:cls+'-ft'});
+ this.pageTb = new Ext.PagingToolbar({
+ store: this.store,
+ pageSize: this.pageSize,
+ renderTo:this.footer
+ });
+ this.assetHeight += this.footer.getHeight();
+ }
+
+ if(!this.tpl){
+
+ this.tpl = '<tpl for="."><div class="'+cls+'-item">{' + this.displayField + '}</div></tpl>';
+
+ }
+
+
+ this.view = new Ext.DataView({
+ applyTo: this.innerList,
+ tpl: this.tpl,
+ singleSelect: true,
+ selectedClass: this.selectedClass,
+ itemSelector: this.itemSelector || '.' + cls + '-item',
+ emptyText: this.listEmptyText,
+ deferEmptyText: false
+ });
+
+ this.mon(this.view, {
+ containerclick : this.onViewClick,
+ click : this.onViewClick,
+ scope :this
+ });
+
+ this.bindStore(this.store, true);
+
+ if(this.resizable){
+ this.resizer = new Ext.Resizable(this.list, {
+ pinned:true, handles:'se'
+ });
+ this.mon(this.resizer, 'resize', function(r, w, h){
+ this.maxHeight = h-this.handleHeight-this.list.getFrameWidth('tb')-this.assetHeight;
+ this.listWidth = w;
+ this.innerList.setWidth(w - this.list.getFrameWidth('lr'));
+ this.restrictHeight();
+ }, this);
+
+ this[this.pageSize?'footer':'innerList'].setStyle('margin-bottom', this.handleHeight+'px');
+ }
+ }
+ },
+
+
+ getListParent : function() {
+ return document.body;
+ },
+
+
+ getStore : function(){
+ return this.store;
+ },
+
+
+ bindStore : function(store, initial){
+ if(this.store && !initial){
+ if(this.store !== store && this.store.autoDestroy){
+ this.store.destroy();
+ }else{
+ this.store.un('beforeload', this.onBeforeLoad, this);
+ this.store.un('load', this.onLoad, this);
+ this.store.un('exception', this.collapse, this);
+ }
+ if(!store){
+ this.store = null;
+ if(this.view){
+ this.view.bindStore(null);
+ }
+ if(this.pageTb){
+ this.pageTb.bindStore(null);
+ }
+ }
+ }
+ if(store){
+ if(!initial) {
+ this.lastQuery = null;
+ if(this.pageTb) {
+ this.pageTb.bindStore(store);
+ }
+ }
+
+ this.store = Ext.StoreMgr.lookup(store);
+ this.store.on({
+ scope: this,
+ beforeload: this.onBeforeLoad,
+ load: this.onLoad,
+ exception: this.collapse
+ });
+
+ if(this.view){
+ this.view.bindStore(store);
+ }
+ }
+ },
+
+ reset : function(){
+ if(this.clearFilterOnReset && this.mode == 'local'){
+ this.store.clearFilter();
+ }
+ Ext.form.ComboBox.superclass.reset.call(this);
+ },
+
+
+ initEvents : function(){
+ Ext.form.ComboBox.superclass.initEvents.call(this);
+
+
+ this.keyNav = new Ext.KeyNav(this.el, {
+ "up" : function(e){
+ this.inKeyMode = true;
+ this.selectPrev();
+ },
+
+ "down" : function(e){
+ if(!this.isExpanded()){
+ this.onTriggerClick();
+ }else{
+ this.inKeyMode = true;
+ this.selectNext();
+ }
+ },
+
+ "enter" : function(e){
+ this.onViewClick();
+ },
+
+ "esc" : function(e){
+ this.collapse();
+ },
+
+ "tab" : function(e){
+ if (this.forceSelection === true) {
+ this.collapse();
+ } else {
+ this.onViewClick(false);
+ }
+ return true;
+ },
+
+ scope : this,
+
+ doRelay : function(e, h, hname){
+ if(hname == 'down' || this.scope.isExpanded()){
+
+ var relay = Ext.KeyNav.prototype.doRelay.apply(this, arguments);
+ if((((Ext.isIE9 && Ext.isStrict) || Ext.isIE10p) || !Ext.isIE) && Ext.EventManager.useKeydown){
+
+ this.scope.fireKey(e);
+ }
+ return relay;
+ }
+ return true;
+ },
+
+ forceKeyDown : true,
+ defaultEventAction: 'stopEvent'
+ });
+ this.queryDelay = Math.max(this.queryDelay || 10,
+ this.mode == 'local' ? 10 : 250);
+ this.dqTask = new Ext.util.DelayedTask(this.initQuery, this);
+ if(this.typeAhead){
+ this.taTask = new Ext.util.DelayedTask(this.onTypeAhead, this);
+ }
+ if(!this.enableKeyEvents){
+ this.mon(this.el, 'keyup', this.onKeyUp, this);
+ }
+ },
+
+
+
+ onDestroy : function(){
+ if (this.dqTask){
+ this.dqTask.cancel();
+ this.dqTask = null;
+ }
+ this.bindStore(null);
+ Ext.destroy(
+ this.resizer,
+ this.view,
+ this.pageTb,
+ this.list
+ );
+ Ext.destroyMembers(this, 'hiddenField');
+ Ext.form.ComboBox.superclass.onDestroy.call(this);
+ },
+
+
+ fireKey : function(e){
+ if (!this.isExpanded()) {
+ Ext.form.ComboBox.superclass.fireKey.call(this, e);
+ }
+ },
+
+
+ onResize : function(w, h){
+ Ext.form.ComboBox.superclass.onResize.apply(this, arguments);
+ if(!isNaN(w) && this.isVisible() && this.list){
+ this.doResize(w);
+ }else{
+ this.bufferSize = w;
+ }
+ },
+
+ doResize: function(w){
+ if(!Ext.isDefined(this.listWidth)){
+ var lw = Math.max(w, this.minListWidth);
+ this.list.setWidth(lw);
+ this.innerList.setWidth(lw - this.list.getFrameWidth('lr'));
+ }
+ },
+
+
+ onEnable : function(){
+ Ext.form.ComboBox.superclass.onEnable.apply(this, arguments);
+ if(this.hiddenField){
+ this.hiddenField.disabled = false;
+ }
+ },
+
+
+ onDisable : function(){
+ Ext.form.ComboBox.superclass.onDisable.apply(this, arguments);
+ if(this.hiddenField){
+ this.hiddenField.disabled = true;
+ }
+ },
+
+
+ onBeforeLoad : function(){
+ if(!this.hasFocus){
+ return;
+ }
+ this.innerList.update(this.loadingText ?
+ '<div class="loading-indicator">'+this.loadingText+'</div>' : '');
+ this.restrictHeight();
+ this.selectedIndex = -1;
+ },
+
+
+ onLoad : function(){
+ if(!this.hasFocus){
+ return;
+ }
+ if(this.store.getCount() > 0 || this.listEmptyText){
+ this.expand();
+ this.restrictHeight();
+ if(this.lastQuery == this.allQuery){
+ if(this.editable){
+ this.el.dom.select();
+ }
+
+ if(this.autoSelect !== false && !this.selectByValue(this.value, true)){
+ this.select(0, true);
+ }
+ }else{
+ if(this.autoSelect !== false){
+ this.selectNext();
+ }
+ if(this.typeAhead && this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE){
+ this.taTask.delay(this.typeAheadDelay);
+ }
+ }
+ }else{
+ this.collapse();
+ }
+
+ },
+
+
+ onTypeAhead : function(){
+ if(this.store.getCount() > 0){
+ var r = this.store.getAt(0);
+ var newValue = r.data[this.displayField];
+ var len = newValue.length;
+ var selStart = this.getRawValue().length;
+ if(selStart != len){
+ this.setRawValue(newValue);
+ this.selectText(selStart, newValue.length);
+ }
+ }
+ },
+
+
+ assertValue : function(){
+ var val = this.getRawValue(),
+ rec;
+
+ if(this.valueField && Ext.isDefined(this.value)){
+ rec = this.findRecord(this.valueField, this.value);
+ }
+ if(!rec || rec.get(this.displayField) != val){
+ rec = this.findRecord(this.displayField, val);
+ }
+ if(!rec && this.forceSelection){
+ if(val.length > 0 && val != this.emptyText){
+ this.el.dom.value = Ext.value(this.lastSelectionText, '');
+ this.applyEmptyText();
+ }else{
+ this.clearValue();
+ }
+ }else{
+ if(rec && this.valueField){
+
+
+
+ if (this.value == val){
+ return;
+ }
+ val = rec.get(this.valueField || this.displayField);
+ }
+ this.setValue(val);
+ }
+ },
+
+
+ onSelect : function(record, index){
+ if(this.fireEvent('beforeselect', this, record, index) !== false){
+ this.setValue(record.data[this.valueField || this.displayField]);
+ this.collapse();
+ this.fireEvent('select', this, record, index);
+ }
+ },
+
+
+ getName: function(){
+ var hf = this.hiddenField;
+ return hf && hf.name ? hf.name : this.hiddenName || Ext.form.ComboBox.superclass.getName.call(this);
+ },
+
+
+ getValue : function(){
+ if(this.valueField){
+ return Ext.isDefined(this.value) ? this.value : '';
+ }else{
+ return Ext.form.ComboBox.superclass.getValue.call(this);
+ }
+ },
+
+
+ clearValue : function(){
+ if(this.hiddenField){
+ this.hiddenField.value = '';
+ }
+ this.setRawValue('');
+ this.lastSelectionText = '';
+ this.applyEmptyText();
+ this.value = '';
+ },
+
+
+ setValue : function(v){
+ var text = v;
+ if(this.valueField){
+ var r = this.findRecord(this.valueField, v);
+ if(r){
+ text = r.data[this.displayField];
+ }else if(Ext.isDefined(this.valueNotFoundText)){
+ text = this.valueNotFoundText;
+ }
+ }
+ this.lastSelectionText = text;
+ if(this.hiddenField){
+ this.hiddenField.value = Ext.value(v, '');
+ }
+ Ext.form.ComboBox.superclass.setValue.call(this, text);
+ this.value = v;
+ return this;
+ },
+
+
+ findRecord : function(prop, value){
+ var record;
+ if(this.store.getCount() > 0){
+ this.store.each(function(r){
+ if(r.data[prop] == value){
+ record = r;
+ return false;
+ }
+ });
+ }
+ return record;
+ },
+
+
+ onViewMove : function(e, t){
+ this.inKeyMode = false;
+ },
+
+
+ onViewOver : function(e, t){
+ if(this.inKeyMode){
+ return;
+ }
+ var item = this.view.findItemFromChild(t);
+ if(item){
+ var index = this.view.indexOf(item);
+ this.select(index, false);
+ }
+ },
+
+
+ onViewClick : function(doFocus){
+ var index = this.view.getSelectedIndexes()[0],
+ s = this.store,
+ r = s.getAt(index);
+ if(r){
+ this.onSelect(r, index);
+ }else {
+ this.collapse();
+ }
+ if(doFocus !== false){
+ this.el.focus();
+ }
+ },
+
+
+
+ restrictHeight : function(){
+ this.innerList.dom.style.height = '';
+ var inner = this.innerList.dom,
+ pad = this.list.getFrameWidth('tb') + (this.resizable ? this.handleHeight : 0) + this.assetHeight,
+ h = Math.max(inner.clientHeight, inner.offsetHeight, inner.scrollHeight),
+ ha = this.getPosition()[1]-Ext.getBody().getScroll().top,
+ hb = Ext.lib.Dom.getViewHeight()-ha-this.getSize().height,
+ space = Math.max(ha, hb, this.minHeight || 0)-this.list.shadowOffset-pad-5;
+
+ h = Math.min(h, space, this.maxHeight);
+
+ this.innerList.setHeight(h);
+ this.list.beginUpdate();
+ this.list.setHeight(h+pad);
+ this.list.alignTo.apply(this.list, [this.el].concat(this.listAlign));
+ this.list.endUpdate();
+ },
+
+
+ isExpanded : function(){
+ return this.list && this.list.isVisible();
+ },
+
+
+ selectByValue : function(v, scrollIntoView){
+ if(!Ext.isEmpty(v, true)){
+ var r = this.findRecord(this.valueField || this.displayField, v);
+ if(r){
+ this.select(this.store.indexOf(r), scrollIntoView);
+ return true;
+ }
+ }
+ return false;
+ },
+
+
+ select : function(index, scrollIntoView){
+ this.selectedIndex = index;
+ this.view.select(index);
+ if(scrollIntoView !== false){
+ var el = this.view.getNode(index);
+ if(el){
+ this.innerList.scrollChildIntoView(el, false);
+ }
+ }
+
+ },
+
+
+ selectNext : function(){
+ var ct = this.store.getCount();
+ if(ct > 0){
+ if(this.selectedIndex == -1){
+ this.select(0);
+ }else if(this.selectedIndex < ct-1){
+ this.select(this.selectedIndex+1);
+ }
+ }
+ },
+
+
+ selectPrev : function(){
+ var ct = this.store.getCount();
+ if(ct > 0){
+ if(this.selectedIndex == -1){
+ this.select(0);
+ }else if(this.selectedIndex !== 0){
+ this.select(this.selectedIndex-1);
+ }
+ }
+ },
+
+
+ onKeyUp : function(e){
+ var k = e.getKey();
+ if(this.editable !== false && this.readOnly !== true && (k == e.BACKSPACE || !e.isSpecialKey())){
+
+ this.lastKey = k;
+ this.dqTask.delay(this.queryDelay);
+ }
+ Ext.form.ComboBox.superclass.onKeyUp.call(this, e);
+ },
+
+
+ validateBlur : function(){
+ return !this.list || !this.list.isVisible();
+ },
+
+
+ initQuery : function(){
+ this.doQuery(this.getRawValue());
+ },
+
+
+ beforeBlur : function(){
+ this.assertValue();
+ },
+
+
+ postBlur : function(){
+ Ext.form.ComboBox.superclass.postBlur.call(this);
+ this.collapse();
+ this.inKeyMode = false;
+ },
+
+
+ doQuery : function(q, forceAll){
+ q = Ext.isEmpty(q) ? '' : q;
+ var qe = {
+ query: q,
+ forceAll: forceAll,
+ combo: this,
+ cancel:false
+ };
+ if(this.fireEvent('beforequery', qe)===false || qe.cancel){
+ return false;
+ }
+ q = qe.query;
+ forceAll = qe.forceAll;
+ if(forceAll === true || (q.length >= this.minChars)){
+ if(this.lastQuery !== q){
+ this.lastQuery = q;
+ if(this.mode == 'local'){
+ this.selectedIndex = -1;
+ if(forceAll){
+ this.store.clearFilter();
+ }else{
+ this.store.filter(this.displayField, q);
+ }
+ this.onLoad();
+ }else{
+ this.store.baseParams[this.queryParam] = q;
+ this.store.load({
+ params: this.getParams(q)
+ });
+ this.expand();
+ }
+ }else{
+ this.selectedIndex = -1;
+ this.onLoad();
+ }
+ }
+ },
+
+
+ getParams : function(q){
+ var params = {},
+ paramNames = this.store.paramNames;
+ if(this.pageSize){
+ params[paramNames.start] = 0;
+ params[paramNames.limit] = this.pageSize;
+ }
+ return params;
+ },
+
+
+ collapse : function(){
+ if(!this.isExpanded()){
+ return;
+ }
+ this.list.hide();
+ Ext.getDoc().un('mousewheel', this.collapseIf, this);
+ Ext.getDoc().un('mousedown', this.collapseIf, this);
+ this.fireEvent('collapse', this);
+ },
+
+
+ collapseIf : function(e){
+ if(!this.isDestroyed && !e.within(this.wrap) && !e.within(this.list)){
+ this.collapse();
+ }
+ },
+
+
+ expand : function(){
+ if(this.isExpanded() || !this.hasFocus){
+ return;
+ }
+
+ if(this.title || this.pageSize){
+ this.assetHeight = 0;
+ if(this.title){
+ this.assetHeight += this.header.getHeight();
+ }
+ if(this.pageSize){
+ this.assetHeight += this.footer.getHeight();
+ }
+ }
+
+ if(this.bufferSize){
+ this.doResize(this.bufferSize);
+ delete this.bufferSize;
+ }
+ this.list.alignTo.apply(this.list, [this.el].concat(this.listAlign));
+
+
+ this.list.setZIndex(this.getZIndex());
+ this.list.show();
+ if(Ext.isGecko2){
+ this.innerList.setOverflow('auto');
+ }
+ this.mon(Ext.getDoc(), {
+ scope: this,
+ mousewheel: this.collapseIf,
+ mousedown: this.collapseIf
+ });
+ this.fireEvent('expand', this);
+ },
+
+
+
+
+ onTriggerClick : function(){
+ if(this.readOnly || this.disabled){
+ return;
+ }
+ if(this.isExpanded()){
+ this.collapse();
+ this.el.focus();
+ }else {
+ this.onFocus({});
+ if(this.triggerAction == 'all') {
+ this.doQuery(this.allQuery, true);
+ } else {
+ this.doQuery(this.getRawValue());
+ }
+ this.el.focus();
+ }
+ }
+
+
+
+
+
+
+});
+Ext.reg('combo', Ext.form.ComboBox);
+
+Ext.form.Checkbox = Ext.extend(Ext.form.Field, {
+
+ focusClass : undefined,
+
+ fieldClass : 'x-form-field',
+
+ checked : false,
+
+ boxLabel: '&#160;',
+
+ defaultAutoCreate : { tag: 'input', type: 'checkbox', autocomplete: 'off'},
+
+
+
+
+
+ actionMode : 'wrap',
+
+
+ initComponent : function(){
+ Ext.form.Checkbox.superclass.initComponent.call(this);
+ this.addEvents(
+
+ 'check'
+ );
+ },
+
+
+ onResize : function(){
+ Ext.form.Checkbox.superclass.onResize.apply(this, arguments);
+ if(!this.boxLabel && !this.fieldLabel){
+ this.el.alignTo(this.wrap, 'c-c');
+ }
+ },
+
+
+ initEvents : function(){
+ Ext.form.Checkbox.superclass.initEvents.call(this);
+ this.mon(this.el, {
+ scope: this,
+ click: this.onClick,
+ change: this.onClick
+ });
+ },
+
+
+ markInvalid : Ext.emptyFn,
+
+ clearInvalid : Ext.emptyFn,
+
+
+ onRender : function(ct, position){
+ Ext.form.Checkbox.superclass.onRender.call(this, ct, position);
+ if(this.inputValue !== undefined){
+ this.el.dom.value = this.inputValue;
+ }
+ this.wrap = this.el.wrap({cls: 'x-form-check-wrap'});
+ if(this.boxLabel){
+ this.wrap.createChild({tag: 'label', htmlFor: this.el.id, cls: 'x-form-cb-label', html: this.boxLabel});
+ }
+ if(this.checked){
+ this.setValue(true);
+ }else{
+ this.checked = this.el.dom.checked;
+ }
+
+ if (Ext.isIEQuirks) {
+ this.wrap.repaint();
+ }
+ this.resizeEl = this.positionEl = this.wrap;
+ },
+
+
+ onDestroy : function(){
+ Ext.destroy(this.wrap);
+ Ext.form.Checkbox.superclass.onDestroy.call(this);
+ },
+
+
+ initValue : function() {
+ this.originalValue = this.getValue();
+ },
+
+
+ getValue : function(){
+ if(this.rendered){
+ return this.el.dom.checked;
+ }
+ return this.checked;
+ },
+
+
+ onClick : function(){
+ if(this.el.dom.checked != this.checked){
+ this.setValue(this.el.dom.checked);
+ }
+ },
+
+
+ setValue : function(v){
+ var checked = this.checked,
+ inputVal = this.inputValue;
+
+ if (v === false) {
+ this.checked = false;
+ } else {
+ this.checked = (v === true || v === 'true' || v == '1' || (inputVal ? v == inputVal : String(v).toLowerCase() == 'on'));
+ }
+
+ if(this.rendered){
+ this.el.dom.checked = this.checked;
+ this.el.dom.defaultChecked = this.checked;
+ }
+ if(checked != this.checked){
+ this.fireEvent('check', this, this.checked);
+ if(this.handler){
+ this.handler.call(this.scope || this, this, this.checked);
+ }
+ }
+ return this;
+ }
+});
+Ext.reg('checkbox', Ext.form.Checkbox);
+
+Ext.form.CheckboxGroup = Ext.extend(Ext.form.Field, {
+
+
+ columns : 'auto',
+
+ vertical : false,
+
+ allowBlank : true,
+
+ blankText : "You must select at least one item in this group",
+
+
+ defaultType : 'checkbox',
+
+
+ groupCls : 'x-form-check-group',
+
+
+ initComponent: function(){
+ this.addEvents(
+
+ 'change'
+ );
+ this.on('change', this.validate, this);
+ Ext.form.CheckboxGroup.superclass.initComponent.call(this);
+ },
+
+
+ onRender : function(ct, position){
+ if(!this.el){
+ var panelCfg = {
+ autoEl: {
+ id: this.id
+ },
+ cls: this.groupCls,
+ layout: 'column',
+ renderTo: ct,
+ bufferResize: false
+ };
+ var colCfg = {
+ xtype: 'container',
+ defaultType: this.defaultType,
+ layout: 'form',
+ defaults: {
+ hideLabel: true,
+ anchor: '100%'
+ }
+ };
+
+ if(this.items[0].items){
+
+
+
+ Ext.apply(panelCfg, {
+ layoutConfig: {columns: this.items.length},
+ defaults: this.defaults,
+ items: this.items
+ });
+ for(var i=0, len=this.items.length; i<len; i++){
+ Ext.applyIf(this.items[i], colCfg);
+ }
+
+ }else{
+
+
+
+
+ var numCols, cols = [];
+
+ if(typeof this.columns == 'string'){
+ this.columns = this.items.length;
+ }
+ if(!Ext.isArray(this.columns)){
+ var cs = [];
+ for(var i=0; i<this.columns; i++){
+ cs.push((100/this.columns)*.01);
+ }
+ this.columns = cs;
+ }
+
+ numCols = this.columns.length;
+
+
+ for(var i=0; i<numCols; i++){
+ var cc = Ext.apply({items:[]}, colCfg);
+ cc[this.columns[i] <= 1 ? 'columnWidth' : 'width'] = this.columns[i];
+ if(this.defaults){
+ cc.defaults = Ext.apply(cc.defaults || {}, this.defaults);
+ }
+ cols.push(cc);
+ };
+
+
+ if(this.vertical){
+ var rows = Math.ceil(this.items.length / numCols), ri = 0;
+ for(var i=0, len=this.items.length; i<len; i++){
+ if(i>0 && i%rows==0){
+ ri++;
+ }
+ if(this.items[i].fieldLabel){
+ this.items[i].hideLabel = false;
+ }
+ cols[ri].items.push(this.items[i]);
+ };
+ }else{
+ for(var i=0, len=this.items.length; i<len; i++){
+ var ci = i % numCols;
+ if(this.items[i].fieldLabel){
+ this.items[i].hideLabel = false;
+ }
+ cols[ci].items.push(this.items[i]);
+ };
+ }
+
+ Ext.apply(panelCfg, {
+ layoutConfig: {columns: numCols},
+ items: cols
+ });
+ }
+
+ this.panel = new Ext.Container(panelCfg);
+ this.panel.ownerCt = this;
+ this.el = this.panel.getEl();
+
+ if(this.forId && this.itemCls){
+ var l = this.el.up(this.itemCls).child('label', true);
+ if(l){
+ l.setAttribute('htmlFor', this.forId);
+ }
+ }
+
+ var fields = this.panel.findBy(function(c){
+ return c.isFormField;
+ }, this);
+
+ this.items = new Ext.util.MixedCollection();
+ this.items.addAll(fields);
+ }
+ Ext.form.CheckboxGroup.superclass.onRender.call(this, ct, position);
+ },
+
+ initValue : function(){
+ if(this.value){
+ this.setValue.apply(this, this.buffered ? this.value : [this.value]);
+ delete this.buffered;
+ delete this.value;
+ }
+ },
+
+ afterRender : function(){
+ Ext.form.CheckboxGroup.superclass.afterRender.call(this);
+ this.eachItem(function(item){
+ item.on('check', this.fireChecked, this);
+ item.inGroup = true;
+ });
+ },
+
+
+ doLayout: function(){
+
+ if(this.rendered){
+ this.panel.forceLayout = this.ownerCt.forceLayout;
+ this.panel.doLayout();
+ }
+ },
+
+
+ fireChecked: function(){
+ var arr = [];
+ this.eachItem(function(item){
+ if(item.checked){
+ arr.push(item);
+ }
+ });
+ this.fireEvent('change', this, arr);
+ },
+
+
+ getErrors: function() {
+ var errors = Ext.form.CheckboxGroup.superclass.getErrors.apply(this, arguments);
+
+ if (!this.allowBlank) {
+ var blank = true;
+
+ this.eachItem(function(f){
+ if (f.checked) {
+ return (blank = false);
+ }
+ });
+
+ if (blank) errors.push(this.blankText);
+ }
+
+ return errors;
+ },
+
+
+ isDirty: function(){
+
+ if (this.disabled || !this.rendered) {
+ return false;
+ }
+
+ var dirty = false;
+
+ this.eachItem(function(item){
+ if(item.isDirty()){
+ dirty = true;
+ return false;
+ }
+ });
+
+ return dirty;
+ },
+
+
+ setReadOnly : function(readOnly){
+ if(this.rendered){
+ this.eachItem(function(item){
+ item.setReadOnly(readOnly);
+ });
+ }
+ this.readOnly = readOnly;
+ },
+
+
+ onDisable : function(){
+ this.eachItem(function(item){
+ item.disable();
+ });
+ },
+
+
+ onEnable : function(){
+ this.eachItem(function(item){
+ item.enable();
+ });
+ },
+
+
+ onResize : function(w, h){
+ this.panel.setSize(w, h);
+ this.panel.doLayout();
+ },
+
+
+ reset : function(){
+ if (this.originalValue) {
+
+ this.eachItem(function(c){
+ if(c.setValue){
+ c.setValue(false);
+ c.originalValue = c.getValue();
+ }
+ });
+
+
+ this.resetOriginal = true;
+ this.setValue(this.originalValue);
+ delete this.resetOriginal;
+ } else {
+ this.eachItem(function(c){
+ if(c.reset){
+ c.reset();
+ }
+ });
+ }
+
+
+ (function() {
+ this.clearInvalid();
+ }).defer(50, this);
+ },
+
+
+ setValue: function(){
+ if(this.rendered){
+ this.onSetValue.apply(this, arguments);
+ }else{
+ this.buffered = true;
+ this.value = arguments;
+ }
+ return this;
+ },
+
+
+ onSetValue: function(id, value){
+ if(arguments.length == 1){
+ if(Ext.isArray(id)){
+ Ext.each(id, function(val, idx){
+ if (Ext.isObject(val) && val.setValue){
+ val.setValue(true);
+ if (this.resetOriginal === true) {
+ val.originalValue = val.getValue();
+ }
+ } else {
+ var item = this.items.itemAt(idx);
+ if(item){
+ item.setValue(val);
+ }
+ }
+ }, this);
+ }else if(Ext.isObject(id)){
+
+ for(var i in id){
+ var f = this.getBox(i);
+ if(f){
+ f.setValue(id[i]);
+ }
+ }
+ }else{
+ this.setValueForItem(id);
+ }
+ }else{
+ var f = this.getBox(id);
+ if(f){
+ f.setValue(value);
+ }
+ }
+ },
+
+
+ beforeDestroy: function(){
+ Ext.destroy(this.panel);
+ if (!this.rendered) {
+ Ext.destroy(this.items);
+ }
+ Ext.form.CheckboxGroup.superclass.beforeDestroy.call(this);
+
+ },
+
+ setValueForItem : function(val){
+ val = String(val).split(',');
+ this.eachItem(function(item){
+ if(val.indexOf(item.inputValue)> -1){
+ item.setValue(true);
+ }
+ });
+ },
+
+
+ getBox : function(id){
+ var box = null;
+ this.eachItem(function(f){
+ if(id == f || f.dataIndex == id || f.id == id || f.getName() == id){
+ box = f;
+ return false;
+ }
+ });
+ return box;
+ },
+
+
+ getValue : function(){
+ var out = [];
+ this.eachItem(function(item){
+ if(item.checked){
+ out.push(item);
+ }
+ });
+ return out;
+ },
+
+
+ eachItem: function(fn, scope) {
+ if(this.items && this.items.each){
+ this.items.each(fn, scope || this);
+ }
+ },
+
+
+
+
+ getRawValue : Ext.emptyFn,
+
+
+ setRawValue : Ext.emptyFn
+
+});
+
+Ext.reg('checkboxgroup', Ext.form.CheckboxGroup);
+
+Ext.form.CompositeField = Ext.extend(Ext.form.Field, {
+
+
+ defaultMargins: '0 5 0 0',
+
+
+ skipLastItemMargin: true,
+
+
+ isComposite: true,
+
+
+ combineErrors: true,
+
+
+ labelConnector: ', ',
+
+
+
+
+
+ initComponent: function() {
+ var labels = [],
+ items = this.items,
+ item;
+
+ for (var i=0, j = items.length; i < j; i++) {
+ item = items[i];
+
+ if (!Ext.isEmpty(item.ref)){
+ item.ref = '../' + item.ref;
+ }
+
+ labels.push(item.fieldLabel);
+
+
+ Ext.applyIf(item, this.defaults);
+
+
+ if (!(i == j - 1 && this.skipLastItemMargin)) {
+ Ext.applyIf(item, {margins: this.defaultMargins});
+ }
+ }
+
+ this.fieldLabel = this.fieldLabel || this.buildLabel(labels);
+
+
+ this.fieldErrors = new Ext.util.MixedCollection(true, function(item) {
+ return item.field;
+ });
+
+ this.fieldErrors.on({
+ scope : this,
+ add : this.updateInvalidMark,
+ remove : this.updateInvalidMark,
+ replace: this.updateInvalidMark
+ });
+
+ Ext.form.CompositeField.superclass.initComponent.apply(this, arguments);
+
+ this.innerCt = new Ext.Container({
+ layout : 'hbox',
+ items : this.items,
+ cls : 'x-form-composite',
+ defaultMargins: '0 3 0 0',
+ ownerCt: this
+ });
+ delete this.innerCt.ownerCt;
+
+ var fields = this.innerCt.findBy(function(c) {
+ return c.isFormField;
+ }, this);
+
+
+ this.items = new Ext.util.MixedCollection();
+ this.items.addAll(fields);
+
+ },
+
+
+ onRender: function(ct, position) {
+ if (!this.el) {
+
+ var innerCt = this.innerCt;
+ innerCt.render(ct);
+ this.innerCt.ownerCt = this;
+
+ this.el = innerCt.getEl();
+
+
+
+ if (this.combineErrors) {
+ this.eachItem(function(field) {
+ Ext.apply(field, {
+ markInvalid : this.onFieldMarkInvalid.createDelegate(this, [field], 0),
+ clearInvalid: this.onFieldClearInvalid.createDelegate(this, [field], 0)
+ });
+ });
+ }
+
+
+ var l = this.el.parent().parent().child('label', true);
+ if (l) {
+ l.setAttribute('for', this.items.items[0].id);
+ }
+ }
+
+ Ext.form.CompositeField.superclass.onRender.apply(this, arguments);
+ },
+
+
+ onFieldMarkInvalid: function(field, message) {
+ var name = field.getName(),
+ error = {
+ field: name,
+ errorName: field.fieldLabel || name,
+ error: message
+ };
+
+ this.fieldErrors.replace(name, error);
+
+ if (!field.preventMark) {
+ field.el.addClass(field.invalidClass);
+ }
+ },
+
+
+ onFieldClearInvalid: function(field) {
+ this.fieldErrors.removeKey(field.getName());
+
+ field.el.removeClass(field.invalidClass);
+ },
+
+
+ updateInvalidMark: function() {
+ var ieStrict = Ext.isIE6 && Ext.isStrict;
+
+ if (this.fieldErrors.length == 0) {
+ this.clearInvalid();
+
+
+ if (ieStrict) {
+ this.clearInvalid.defer(50, this);
+ }
+ } else {
+ var message = this.buildCombinedErrorMessage(this.fieldErrors.items);
+
+ this.sortErrors();
+ this.markInvalid(message);
+
+
+ if (ieStrict) {
+ this.markInvalid(message);
+ }
+ }
+ },
+
+
+ validateValue: function(value, preventMark) {
+ var valid = true;
+
+ this.eachItem(function(field) {
+ if (!field.isValid(preventMark)) {
+ valid = false;
+ }
+ });
+
+ return valid;
+ },
+
+
+ buildCombinedErrorMessage: function(errors) {
+ var combined = [],
+ error;
+
+ for (var i = 0, j = errors.length; i < j; i++) {
+ error = errors[i];
+
+ combined.push(String.format("{0}: {1}", error.errorName, error.error));
+ }
+
+ return combined.join("<br />");
+ },
+
+
+ sortErrors: function() {
+ var fields = this.items;
+
+ this.fieldErrors.sort("ASC", function(a, b) {
+ var findByName = function(key) {
+ return function(field) {
+ return field.getName() == key;
+ };
+ };
+
+ var aIndex = fields.findIndexBy(findByName(a.field)),
+ bIndex = fields.findIndexBy(findByName(b.field));
+
+ return aIndex < bIndex ? -1 : 1;
+ });
+ },
+
+
+ reset: function() {
+ this.eachItem(function(item) {
+ item.reset();
+ });
+
+
+
+ (function() {
+ this.clearInvalid();
+ }).defer(50, this);
+ },
+
+
+ clearInvalidChildren: function() {
+ this.eachItem(function(item) {
+ item.clearInvalid();
+ });
+ },
+
+
+ buildLabel: function(segments) {
+ return Ext.clean(segments).join(this.labelConnector);
+ },
+
+
+ isDirty: function(){
+
+ if (this.disabled || !this.rendered) {
+ return false;
+ }
+
+ var dirty = false;
+ this.eachItem(function(item){
+ if(item.isDirty()){
+ dirty = true;
+ return false;
+ }
+ });
+ return dirty;
+ },
+
+
+ eachItem: function(fn, scope) {
+ if(this.items && this.items.each){
+ this.items.each(fn, scope || this);
+ }
+ },
+
+
+ onResize: function(adjWidth, adjHeight, rawWidth, rawHeight) {
+ var innerCt = this.innerCt;
+
+ if (this.rendered && innerCt.rendered) {
+ innerCt.setSize(adjWidth, adjHeight);
+ }
+
+ Ext.form.CompositeField.superclass.onResize.apply(this, arguments);
+ },
+
+
+ doLayout: function(shallow, force) {
+ if (this.rendered) {
+ var innerCt = this.innerCt;
+
+ innerCt.forceLayout = this.ownerCt.forceLayout;
+ innerCt.doLayout(shallow, force);
+ }
+ },
+
+
+ beforeDestroy: function(){
+ Ext.destroy(this.innerCt);
+
+ Ext.form.CompositeField.superclass.beforeDestroy.call(this);
+ },
+
+
+ setReadOnly : function(readOnly) {
+ if (readOnly == undefined) {
+ readOnly = true;
+ }
+ readOnly = !!readOnly;
+
+ if(this.rendered){
+ this.eachItem(function(item){
+ item.setReadOnly(readOnly);
+ });
+ }
+ this.readOnly = readOnly;
+ },
+
+ onShow : function() {
+ Ext.form.CompositeField.superclass.onShow.call(this);
+ this.doLayout();
+ },
+
+
+ onDisable : function(){
+ this.eachItem(function(item){
+ item.disable();
+ });
+ },
+
+
+ onEnable : function(){
+ this.eachItem(function(item){
+ item.enable();
+ });
+ }
+});
+
+Ext.reg('compositefield', Ext.form.CompositeField);
+Ext.form.Radio = Ext.extend(Ext.form.Checkbox, {
+ inputType: 'radio',
+
+
+ markInvalid : Ext.emptyFn,
+
+ clearInvalid : Ext.emptyFn,
+
+
+ getGroupValue : function(){
+ var p = this.el.up('form') || Ext.getBody();
+ var c = p.child('input[name="'+this.el.dom.name+'"]:checked', true);
+ return c ? c.value : null;
+ },
+
+
+ setValue : function(v){
+ var checkEl,
+ els,
+ radio;
+ if (typeof v == 'boolean') {
+ Ext.form.Radio.superclass.setValue.call(this, v);
+ } else if (this.rendered) {
+ checkEl = this.getCheckEl();
+ radio = checkEl.child('input[name="' + this.el.dom.name + '"][value="' + v + '"]', true);
+ if(radio){
+ Ext.getCmp(radio.id).setValue(true);
+ }
+ }
+ if(this.rendered && this.checked){
+ checkEl = checkEl || this.getCheckEl();
+ els = this.getCheckEl().select('input[name="' + this.el.dom.name + '"]');
+ els.each(function(el){
+ if(el.dom.id != this.id){
+ Ext.getCmp(el.dom.id).setValue(false);
+ }
+ }, this);
+ }
+ return this;
+ },
+
+
+ getCheckEl: function(){
+ if(this.inGroup){
+ return this.el.up('.x-form-radio-group');
+ }
+ return this.el.up('form') || Ext.getBody();
+ }
+});
+Ext.reg('radio', Ext.form.Radio);
+
+Ext.form.RadioGroup = Ext.extend(Ext.form.CheckboxGroup, {
+
+
+ allowBlank : true,
+
+ blankText : 'You must select one item in this group',
+
+
+ defaultType : 'radio',
+
+
+ groupCls : 'x-form-radio-group',
+
+
+
+
+ getValue : function(){
+ var out = null;
+ this.eachItem(function(item){
+ if(item.checked){
+ out = item;
+ return false;
+ }
+ });
+ return out;
+ },
+
+
+ onSetValue : function(id, value){
+ if(arguments.length > 1){
+ var f = this.getBox(id);
+ if(f){
+ f.setValue(value);
+ if(f.checked){
+ this.eachItem(function(item){
+ if (item !== f){
+ item.setValue(false);
+ }
+ });
+ }
+ }
+ }else{
+ this.setValueForItem(id);
+ }
+ },
+
+ setValueForItem : function(val){
+ val = String(val).split(',')[0];
+ this.eachItem(function(item){
+ item.setValue(val == item.inputValue);
+ });
+ },
+
+
+ fireChecked : function(){
+ if(!this.checkTask){
+ this.checkTask = new Ext.util.DelayedTask(this.bufferChecked, this);
+ }
+ this.checkTask.delay(10);
+ },
+
+
+ bufferChecked : function(){
+ var out = null;
+ this.eachItem(function(item){
+ if(item.checked){
+ out = item;
+ return false;
+ }
+ });
+ this.fireEvent('change', this, out);
+ },
+
+ onDestroy : function(){
+ if(this.checkTask){
+ this.checkTask.cancel();
+ this.checkTask = null;
+ }
+ Ext.form.RadioGroup.superclass.onDestroy.call(this);
+ }
+
+});
+
+Ext.reg('radiogroup', Ext.form.RadioGroup);
+
+Ext.form.Hidden = Ext.extend(Ext.form.Field, {
+
+ inputType : 'hidden',
+
+ shouldLayout: false,
+
+
+ onRender : function(){
+ Ext.form.Hidden.superclass.onRender.apply(this, arguments);
+ },
+
+
+ initEvents : function(){
+ this.originalValue = this.getValue();
+ },
+
+
+ setSize : Ext.emptyFn,
+ setWidth : Ext.emptyFn,
+ setHeight : Ext.emptyFn,
+ setPosition : Ext.emptyFn,
+ setPagePosition : Ext.emptyFn,
+ markInvalid : Ext.emptyFn,
+ clearInvalid : Ext.emptyFn
+});
+Ext.reg('hidden', Ext.form.Hidden);
+Ext.form.BasicForm = Ext.extend(Ext.util.Observable, {
+
+ constructor: function(el, config){
+ Ext.apply(this, config);
+ if(Ext.isString(this.paramOrder)){
+ this.paramOrder = this.paramOrder.split(/[\s,|]/);
+ }
+
+ this.items = new Ext.util.MixedCollection(false, function(o){
+ return o.getItemId();
+ });
+ this.addEvents(
+
+ 'beforeaction',
+
+ 'actionfailed',
+
+ 'actioncomplete'
+ );
+
+ if(el){
+ this.initEl(el);
+ }
+ Ext.form.BasicForm.superclass.constructor.call(this);
+ },
+
+
+
+
+
+
+
+
+ timeout: 30,
+
+
+
+
+ paramOrder: undefined,
+
+
+ paramsAsHash: false,
+
+
+ waitTitle: 'Please Wait...',
+
+
+ activeAction : null,
+
+
+ trackResetOnLoad : false,
+
+
+
+
+
+ initEl : function(el){
+ this.el = Ext.get(el);
+ this.id = this.el.id || Ext.id();
+ if(!this.standardSubmit){
+ this.el.on('submit', this.onSubmit, this);
+ }
+ this.el.addClass('x-form');
+ },
+
+
+ getEl: function(){
+ return this.el;
+ },
+
+
+ onSubmit : function(e){
+ e.stopEvent();
+ },
+
+
+ destroy: function(bound){
+ if(bound !== true){
+ this.items.each(function(f){
+ Ext.destroy(f);
+ });
+ Ext.destroy(this.el);
+ }
+ this.items.clear();
+ this.purgeListeners();
+ },
+
+
+ isValid : function(){
+ var valid = true;
+ this.items.each(function(f){
+ if(!f.validate()){
+ valid = false;
+ }
+ });
+ return valid;
+ },
+
+
+ isDirty : function(){
+ var dirty = false;
+ this.items.each(function(f){
+ if(f.isDirty()){
+ dirty = true;
+ return false;
+ }
+ });
+ return dirty;
+ },
+
+
+ doAction : function(action, options){
+ if(Ext.isString(action)){
+ action = new Ext.form.Action.ACTION_TYPES[action](this, options);
+ }
+ if(this.fireEvent('beforeaction', this, action) !== false){
+ this.beforeAction(action);
+ action.run.defer(100, action);
+ }
+ return this;
+ },
+
+
+ submit : function(options){
+ options = options || {};
+ if(this.standardSubmit){
+ var v = options.clientValidation === false || this.isValid();
+ if(v){
+ var el = this.el.dom;
+ if(this.url && Ext.isEmpty(el.action)){
+ el.action = this.url;
+ }
+ el.submit();
+ }
+ return v;
+ }
+ var submitAction = String.format('{0}submit', this.api ? 'direct' : '');
+ this.doAction(submitAction, options);
+ return this;
+ },
+
+
+ load : function(options){
+ var loadAction = String.format('{0}load', this.api ? 'direct' : '');
+ this.doAction(loadAction, options);
+ return this;
+ },
+
+
+ updateRecord : function(record){
+ record.beginEdit();
+ var fs = record.fields,
+ field,
+ value;
+ fs.each(function(f){
+ field = this.findField(f.name);
+ if(field){
+ value = field.getValue();
+ if (Ext.type(value) !== false && value.getGroupValue) {
+ value = value.getGroupValue();
+ } else if ( field.eachItem ) {
+ value = [];
+ field.eachItem(function(item){
+ value.push(item.getValue());
+ });
+ }
+ record.set(f.name, value);
+ }
+ }, this);
+ record.endEdit();
+ return this;
+ },
+
+
+ loadRecord : function(record){
+ this.setValues(record.data);
+ return this;
+ },
+
+
+ beforeAction : function(action){
+
+ this.items.each(function(f){
+ if(f.isFormField && f.syncValue){
+ f.syncValue();
+ }
+ });
+ var o = action.options;
+ if(o.waitMsg){
+ if(this.waitMsgTarget === true){
+ this.el.mask(o.waitMsg, 'x-mask-loading');
+ }else if(this.waitMsgTarget){
+ this.waitMsgTarget = Ext.get(this.waitMsgTarget);
+ this.waitMsgTarget.mask(o.waitMsg, 'x-mask-loading');
+ }else{
+ Ext.MessageBox.wait(o.waitMsg, o.waitTitle || this.waitTitle);
+ }
+ }
+ },
+
+
+ afterAction : function(action, success){
+ this.activeAction = null;
+ var o = action.options;
+ if(o.waitMsg){
+ if(this.waitMsgTarget === true){
+ this.el.unmask();
+ }else if(this.waitMsgTarget){
+ this.waitMsgTarget.unmask();
+ }else{
+ Ext.MessageBox.updateProgress(1);
+ Ext.MessageBox.hide();
+ }
+ }
+ if(success){
+ if(o.reset){
+ this.reset();
+ }
+ Ext.callback(o.success, o.scope, [this, action]);
+ this.fireEvent('actioncomplete', this, action);
+ }else{
+ Ext.callback(o.failure, o.scope, [this, action]);
+ this.fireEvent('actionfailed', this, action);
+ }
+ },
+
+
+ findField : function(id) {
+ var field = this.items.get(id);
+
+ if (!Ext.isObject(field)) {
+
+ var findMatchingField = function(f) {
+ if (f.isFormField) {
+ if (f.dataIndex == id || f.id == id || f.getName() == id) {
+ field = f;
+ return false;
+ } else if (f.isComposite) {
+ return f.items.each(findMatchingField);
+ } else if (f instanceof Ext.form.CheckboxGroup && f.rendered) {
+ return f.eachItem(findMatchingField);
+ }
+ }
+ };
+
+ this.items.each(findMatchingField);
+ }
+ return field || null;
+ },
+
+
+
+ markInvalid : function(errors){
+ if (Ext.isArray(errors)) {
+ for(var i = 0, len = errors.length; i < len; i++){
+ var fieldError = errors[i];
+ var f = this.findField(fieldError.id);
+ if(f){
+ f.markInvalid(fieldError.msg);
+ }
+ }
+ } else {
+ var field, id;
+ for(id in errors){
+ if(!Ext.isFunction(errors[id]) && (field = this.findField(id))){
+ field.markInvalid(errors[id]);
+ }
+ }
+ }
+
+ return this;
+ },
+
+
+ setValues : function(values){
+ if(Ext.isArray(values)){
+ for(var i = 0, len = values.length; i < len; i++){
+ var v = values[i];
+ var f = this.findField(v.id);
+ if(f){
+ f.setValue(v.value);
+ if(this.trackResetOnLoad){
+ f.originalValue = f.getValue();
+ }
+ }
+ }
+ }else{
+ var field, id;
+ for(id in values){
+ if(!Ext.isFunction(values[id]) && (field = this.findField(id))){
+ field.setValue(values[id]);
+ if(this.trackResetOnLoad){
+ field.originalValue = field.getValue();
+ }
+ }
+ }
+ }
+ return this;
+ },
+
+
+ getValues : function(asString){
+ var fs = Ext.lib.Ajax.serializeForm(this.el.dom);
+ if(asString === true){
+ return fs;
+ }
+ return Ext.urlDecode(fs);
+ },
+
+
+ getFieldValues : function(dirtyOnly){
+ var o = {},
+ n,
+ key,
+ val;
+ this.items.each(function(f) {
+ if (!f.disabled && (dirtyOnly !== true || f.isDirty())) {
+ n = f.getName();
+ key = o[n];
+ val = f.getValue();
+
+ if(Ext.isDefined(key)){
+ if(Ext.isArray(key)){
+ o[n].push(val);
+ }else{
+ o[n] = [key, val];
+ }
+ }else{
+ o[n] = val;
+ }
+ }
+ });
+ return o;
+ },
+
+
+ clearInvalid : function(){
+ this.items.each(function(f){
+ f.clearInvalid();
+ });
+ return this;
+ },
+
+
+ reset : function(){
+ this.items.each(function(f){
+ f.reset();
+ });
+ return this;
+ },
+
+
+ add : function(){
+ this.items.addAll(Array.prototype.slice.call(arguments, 0));
+ return this;
+ },
+
+
+ remove : function(field){
+ this.items.remove(field);
+ return this;
+ },
+
+
+ cleanDestroyed : function() {
+ this.items.filterBy(function(o) { return !!o.isDestroyed; }).each(this.remove, this);
+ },
+
+
+ render : function(){
+ this.items.each(function(f){
+ if(f.isFormField && !f.rendered && document.getElementById(f.id)){
+ f.applyToMarkup(f.id);
+ }
+ });
+ return this;
+ },
+
+
+ applyToFields : function(o){
+ this.items.each(function(f){
+ Ext.apply(f, o);
+ });
+ return this;
+ },
+
+
+ applyIfToFields : function(o){
+ this.items.each(function(f){
+ Ext.applyIf(f, o);
+ });
+ return this;
+ },
+
+ callFieldMethod : function(fnName, args){
+ args = args || [];
+ this.items.each(function(f){
+ if(Ext.isFunction(f[fnName])){
+ f[fnName].apply(f, args);
+ }
+ });
+ return this;
+ }
+});
+
+
+Ext.BasicForm = Ext.form.BasicForm;
+
+Ext.FormPanel = Ext.extend(Ext.Panel, {
+
+
+
+
+
+
+
+
+
+
+ minButtonWidth : 75,
+
+
+ labelAlign : 'left',
+
+
+ monitorValid : false,
+
+
+ monitorPoll : 200,
+
+
+ layout : 'form',
+
+
+ initComponent : function(){
+ this.form = this.createForm();
+ Ext.FormPanel.superclass.initComponent.call(this);
+
+ this.bodyCfg = {
+ tag: 'form',
+ cls: this.baseCls + '-body',
+ method : this.method || 'POST',
+ id : this.formId || Ext.id()
+ };
+ if(this.fileUpload) {
+ this.bodyCfg.enctype = 'multipart/form-data';
+ }
+ this.initItems();
+
+ this.addEvents(
+
+ 'clientvalidation'
+ );
+
+ this.relayEvents(this.form, ['beforeaction', 'actionfailed', 'actioncomplete']);
+ },
+
+
+ createForm : function(){
+ var config = Ext.applyIf({listeners: {}}, this.initialConfig);
+ return new Ext.form.BasicForm(null, config);
+ },
+
+
+ initFields : function(){
+ var f = this.form;
+ var formPanel = this;
+ var fn = function(c){
+ if(formPanel.isField(c)){
+ f.add(c);
+ }else if(c.findBy && c != formPanel){
+ formPanel.applySettings(c);
+
+ if(c.items && c.items.each){
+ c.items.each(fn, this);
+ }
+ }
+ };
+ this.items.each(fn, this);
+ },
+
+
+ applySettings: function(c){
+ var ct = c.ownerCt;
+ Ext.applyIf(c, {
+ labelAlign: ct.labelAlign,
+ labelWidth: ct.labelWidth,
+ itemCls: ct.itemCls
+ });
+ },
+
+
+ getLayoutTarget : function(){
+ return this.form.el;
+ },
+
+
+ getForm : function(){
+ return this.form;
+ },
+
+
+ onRender : function(ct, position){
+ this.initFields();
+ Ext.FormPanel.superclass.onRender.call(this, ct, position);
+ this.form.initEl(this.body);
+ },
+
+
+ beforeDestroy : function(){
+ this.stopMonitoring();
+ this.form.destroy(true);
+ Ext.FormPanel.superclass.beforeDestroy.call(this);
+ },
+
+
+ isField : function(c) {
+ return !!c.setValue && !!c.getValue && !!c.markInvalid && !!c.clearInvalid;
+ },
+
+
+ initEvents : function(){
+ Ext.FormPanel.superclass.initEvents.call(this);
+
+ this.on({
+ scope: this,
+ add: this.onAddEvent,
+ remove: this.onRemoveEvent
+ });
+ if(this.monitorValid){
+ this.startMonitoring();
+ }
+ },
+
+
+ onAdd: function(c){
+ Ext.FormPanel.superclass.onAdd.call(this, c);
+ this.processAdd(c);
+ },
+
+
+ onAddEvent: function(ct, c){
+ if(ct !== this){
+ this.processAdd(c);
+ }
+ },
+
+
+ processAdd : function(c){
+
+ if(this.isField(c)){
+ this.form.add(c);
+
+ }else if(c.findBy){
+ this.applySettings(c);
+ this.form.add.apply(this.form, c.findBy(this.isField));
+ }
+ },
+
+
+ onRemove: function(c){
+ Ext.FormPanel.superclass.onRemove.call(this, c);
+ this.processRemove(c);
+ },
+
+ onRemoveEvent: function(ct, c){
+ if(ct !== this){
+ this.processRemove(c);
+ }
+ },
+
+
+ processRemove: function(c){
+ if(!this.destroying){
+
+ if(this.isField(c)){
+ this.form.remove(c);
+
+ }else if (c.findBy){
+ Ext.each(c.findBy(this.isField), this.form.remove, this.form);
+
+ this.form.cleanDestroyed();
+ }
+ }
+ },
+
+
+ startMonitoring : function(){
+ if(!this.validTask){
+ this.validTask = new Ext.util.TaskRunner();
+ this.validTask.start({
+ run : this.bindHandler,
+ interval : this.monitorPoll || 200,
+ scope: this
+ });
+ }
+ },
+
+
+ stopMonitoring : function(){
+ if(this.validTask){
+ this.validTask.stopAll();
+ this.validTask = null;
+ }
+ },
+
+
+ load : function(){
+ this.form.load.apply(this.form, arguments);
+ },
+
+
+ onDisable : function(){
+ Ext.FormPanel.superclass.onDisable.call(this);
+ if(this.form){
+ this.form.items.each(function(){
+ this.disable();
+ });
+ }
+ },
+
+
+ onEnable : function(){
+ Ext.FormPanel.superclass.onEnable.call(this);
+ if(this.form){
+ this.form.items.each(function(){
+ this.enable();
+ });
+ }
+ },
+
+
+ bindHandler : function(){
+ var valid = true;
+ this.form.items.each(function(f){
+ if(!f.isValid(true)){
+ valid = false;
+ return false;
+ }
+ });
+ if(this.fbar){
+ var fitems = this.fbar.items.items;
+ for(var i = 0, len = fitems.length; i < len; i++){
+ var btn = fitems[i];
+ if(btn.formBind === true && btn.disabled === valid){
+ btn.setDisabled(!valid);
+ }
+ }
+ }
+ this.fireEvent('clientvalidation', this, valid);
+ }
+});
+Ext.reg('form', Ext.FormPanel);
+
+Ext.form.FormPanel = Ext.FormPanel;
+
+Ext.form.FieldSet = Ext.extend(Ext.Panel, {
+
+
+
+
+
+
+ baseCls : 'x-fieldset',
+
+ layout : 'form',
+
+ animCollapse : false,
+
+
+ onRender : function(ct, position){
+ if(!this.el){
+ this.el = document.createElement('fieldset');
+ this.el.id = this.id;
+ if (this.title || this.header || this.checkboxToggle) {
+ this.el.appendChild(document.createElement('legend')).className = this.baseCls + '-header';
+ }
+ }
+
+ Ext.form.FieldSet.superclass.onRender.call(this, ct, position);
+
+ if(this.checkboxToggle){
+ var o = typeof this.checkboxToggle == 'object' ?
+ this.checkboxToggle :
+ {tag: 'input', type: 'checkbox', name: this.checkboxName || this.id+'-checkbox'};
+ this.checkbox = this.header.insertFirst(o);
+ this.checkbox.dom.checked = !this.collapsed;
+ this.mon(this.checkbox, 'click', this.onCheckClick, this);
+ }
+ },
+
+
+ onCollapse : function(doAnim, animArg){
+ if(this.checkbox){
+ this.checkbox.dom.checked = false;
+ }
+ Ext.form.FieldSet.superclass.onCollapse.call(this, doAnim, animArg);
+
+ },
+
+
+ onExpand : function(doAnim, animArg){
+ if(this.checkbox){
+ this.checkbox.dom.checked = true;
+ }
+ Ext.form.FieldSet.superclass.onExpand.call(this, doAnim, animArg);
+ },
+
+
+ onCheckClick : function(){
+ this[this.checkbox.dom.checked ? 'expand' : 'collapse']();
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+});
+Ext.reg('fieldset', Ext.form.FieldSet);
+
+Ext.form.HtmlEditor = Ext.extend(Ext.form.Field, {
+
+ enableFormat : true,
+
+ enableFontSize : true,
+
+ enableColors : true,
+
+ enableAlignments : true,
+
+ enableLists : true,
+
+ enableSourceEdit : true,
+
+ enableLinks : true,
+
+ enableFont : true,
+
+ createLinkText : 'Please enter the URL for the link:',
+
+ defaultLinkValue : 'http:/'+'/',
+
+ fontFamilies : [
+ 'Arial',
+ 'Courier New',
+ 'Tahoma',
+ 'Times New Roman',
+ 'Verdana'
+ ],
+ defaultFont: 'tahoma',
+
+ defaultValue: (Ext.isOpera || Ext.isIE6) ? '&#160;' : '&#8203;',
+
+
+ actionMode: 'wrap',
+ validationEvent : false,
+ deferHeight: true,
+ initialized : false,
+ activated : false,
+ sourceEditMode : false,
+ onFocus : Ext.emptyFn,
+ iframePad:3,
+ hideMode:'offsets',
+ defaultAutoCreate : {
+ tag: "textarea",
+ style:"width:500px;height:300px;",
+ autocomplete: "off"
+ },
+
+
+ initComponent : function(){
+ this.addEvents(
+
+ 'initialize',
+
+ 'activate',
+
+ 'beforesync',
+
+ 'beforepush',
+
+ 'sync',
+
+ 'push',
+
+ 'editmodechange'
+ );
+ Ext.form.HtmlEditor.superclass.initComponent.call(this);
+ },
+
+
+ createFontOptions : function(){
+ var buf = [], fs = this.fontFamilies, ff, lc;
+ for(var i = 0, len = fs.length; i< len; i++){
+ ff = fs[i];
+ lc = ff.toLowerCase();
+ buf.push(
+ '<option value="',lc,'" style="font-family:',ff,';"',
+ (this.defaultFont == lc ? ' selected="true">' : '>'),
+ ff,
+ '</option>'
+ );
+ }
+ return buf.join('');
+ },
+
+
+ createToolbar : function(editor){
+ var items = [];
+ var tipsEnabled = Ext.QuickTips && Ext.QuickTips.isEnabled();
+
+
+ function btn(id, toggle, handler){
+ return {
+ itemId : id,
+ cls : 'x-btn-icon',
+ iconCls: 'x-edit-'+id,
+ enableToggle:toggle !== false,
+ scope: editor,
+ handler:handler||editor.relayBtnCmd,
+ clickEvent:'mousedown',
+ tooltip: tipsEnabled ? editor.buttonTips[id] || undefined : undefined,
+ overflowText: editor.buttonTips[id].title || undefined,
+ tabIndex:-1
+ };
+ }
+
+
+ if(this.enableFont && !Ext.isSafari2){
+ var fontSelectItem = new Ext.Toolbar.Item({
+ autoEl: {
+ tag:'select',
+ cls:'x-font-select',
+ html: this.createFontOptions()
+ }
+ });
+
+ items.push(
+ fontSelectItem,
+ '-'
+ );
+ }
+
+ if(this.enableFormat){
+ items.push(
+ btn('bold'),
+ btn('italic'),
+ btn('underline')
+ );
+ }
+
+ if(this.enableFontSize){
+ items.push(
+ '-',
+ btn('increasefontsize', false, this.adjustFont),
+ btn('decreasefontsize', false, this.adjustFont)
+ );
+ }
+
+ if(this.enableColors){
+ items.push(
+ '-', {
+ itemId:'forecolor',
+ cls:'x-btn-icon',
+ iconCls: 'x-edit-forecolor',
+ clickEvent:'mousedown',
+ tooltip: tipsEnabled ? editor.buttonTips.forecolor || undefined : undefined,
+ tabIndex:-1,
+ menu : new Ext.menu.ColorMenu({
+ allowReselect: true,
+ focus: Ext.emptyFn,
+ value:'000000',
+ plain:true,
+ listeners: {
+ scope: this,
+ select: function(cp, color){
+ this.execCmd('forecolor', Ext.isWebKit || Ext.isIE ? '#'+color : color);
+ this.deferFocus();
+ }
+ },
+ clickEvent:'mousedown'
+ })
+ }, {
+ itemId:'backcolor',
+ cls:'x-btn-icon',
+ iconCls: 'x-edit-backcolor',
+ clickEvent:'mousedown',
+ tooltip: tipsEnabled ? editor.buttonTips.backcolor || undefined : undefined,
+ tabIndex:-1,
+ menu : new Ext.menu.ColorMenu({
+ focus: Ext.emptyFn,
+ value:'FFFFFF',
+ plain:true,
+ allowReselect: true,
+ listeners: {
+ scope: this,
+ select: function(cp, color){
+ if(Ext.isGecko){
+ this.execCmd('useCSS', false);
+ this.execCmd('hilitecolor', color);
+ this.execCmd('useCSS', true);
+ this.deferFocus();
+ }else{
+ this.execCmd(Ext.isOpera ? 'hilitecolor' : 'backcolor', Ext.isWebKit || Ext.isIE ? '#'+color : color);
+ this.deferFocus();
+ }
+ }
+ },
+ clickEvent:'mousedown'
+ })
+ }
+ );
+ }
+
+ if(this.enableAlignments){
+ items.push(
+ '-',
+ btn('justifyleft'),
+ btn('justifycenter'),
+ btn('justifyright')
+ );
+ }
+
+ if(!Ext.isSafari2){
+ if(this.enableLinks){
+ items.push(
+ '-',
+ btn('createlink', false, this.createLink)
+ );
+ }
+
+ if(this.enableLists){
+ items.push(
+ '-',
+ btn('insertorderedlist'),
+ btn('insertunorderedlist')
+ );
+ }
+ if(this.enableSourceEdit){
+ items.push(
+ '-',
+ btn('sourceedit', true, function(btn){
+ this.toggleSourceEdit(!this.sourceEditMode);
+ })
+ );
+ }
+ }
+
+
+ var tb = new Ext.Toolbar({
+ renderTo: this.wrap.dom.firstChild,
+ items: items
+ });
+
+ if (fontSelectItem) {
+ this.fontSelect = fontSelectItem.el;
+
+ this.mon(this.fontSelect, 'change', function(){
+ var font = this.fontSelect.dom.value;
+ this.relayCmd('fontname', font);
+ this.deferFocus();
+ }, this);
+ }
+
+
+ this.mon(tb.el, 'click', function(e){
+ e.preventDefault();
+ });
+
+ this.tb = tb;
+ this.tb.doLayout();
+ },
+
+ onDisable: function(){
+ this.wrap.mask();
+ Ext.form.HtmlEditor.superclass.onDisable.call(this);
+ },
+
+ onEnable: function(){
+ this.wrap.unmask();
+ Ext.form.HtmlEditor.superclass.onEnable.call(this);
+ },
+
+ setReadOnly: function(readOnly){
+
+ Ext.form.HtmlEditor.superclass.setReadOnly.call(this, readOnly);
+ if(this.initialized){
+ if(Ext.isIE){
+ this.getEditorBody().contentEditable = !readOnly;
+ }else{
+ this.setDesignMode(!readOnly);
+ }
+ var bd = this.getEditorBody();
+ if(bd){
+ bd.style.cursor = this.readOnly ? 'default' : 'text';
+ }
+ this.disableItems(readOnly);
+ }
+ },
+
+
+ getDocMarkup : function(){
+ var h = Ext.fly(this.iframe).getHeight() - this.iframePad * 2;
+ return String.format('<html><head><style type="text/css">body{border: 0; margin: 0; padding: {0}px; height: {1}px; cursor: text}</style></head><body></body></html>', this.iframePad, h);
+ },
+
+
+ getEditorBody : function(){
+ var doc = this.getDoc();
+ return doc.body || doc.documentElement;
+ },
+
+
+ getDoc : function(){
+ return Ext.isIE ? this.getWin().document : (this.iframe.contentDocument || this.getWin().document);
+ },
+
+
+ getWin : function(){
+ return Ext.isIE ? this.iframe.contentWindow : window.frames[this.iframe.name];
+ },
+
+
+ onRender : function(ct, position){
+ Ext.form.HtmlEditor.superclass.onRender.call(this, ct, position);
+ this.el.dom.style.border = '0 none';
+ this.el.dom.setAttribute('tabIndex', -1);
+ this.el.addClass('x-hidden');
+ if(Ext.isIE){
+ this.el.applyStyles('margin-top:-1px;margin-bottom:-1px;');
+ }
+ this.wrap = this.el.wrap({
+ cls:'x-html-editor-wrap', cn:{cls:'x-html-editor-tb'}
+ });
+
+ this.createToolbar(this);
+
+ this.disableItems(true);
+
+ this.tb.doLayout();
+
+ this.createIFrame();
+
+ if(!this.width){
+ var sz = this.el.getSize();
+ this.setSize(sz.width, this.height || sz.height);
+ }
+ this.resizeEl = this.positionEl = this.wrap;
+ },
+
+ createIFrame: function(){
+ var iframe = document.createElement('iframe');
+ iframe.name = Ext.id();
+ iframe.frameBorder = '0';
+ iframe.style.overflow = 'auto';
+ iframe.src = Ext.SSL_SECURE_URL;
+
+ this.wrap.dom.appendChild(iframe);
+ this.iframe = iframe;
+
+ this.monitorTask = Ext.TaskMgr.start({
+ run: this.checkDesignMode,
+ scope: this,
+ interval:100
+ });
+ },
+
+ initFrame : function(){
+ Ext.TaskMgr.stop(this.monitorTask);
+ var doc = this.getDoc();
+ this.win = this.getWin();
+
+ doc.open();
+ doc.write(this.getDocMarkup());
+ doc.close();
+
+ this.readyTask = {
+ run : function(){
+ var doc = this.getDoc();
+ if(doc.body || doc.readyState == 'complete'){
+ Ext.TaskMgr.stop(this.readyTask);
+ this.setDesignMode(true);
+ this.initEditor.defer(10, this);
+ }
+ },
+ interval : 10,
+ duration:10000,
+ scope: this
+ };
+ Ext.TaskMgr.start(this.readyTask);
+ },
+
+
+ checkDesignMode : function(){
+ if(this.wrap && this.wrap.dom.offsetWidth){
+ var doc = this.getDoc();
+ if(!doc){
+ return;
+ }
+ if(!doc.editorInitialized || this.getDesignMode() != 'on'){
+ this.initFrame();
+ }
+ }
+ },
+
+
+ setDesignMode : function(mode){
+ var doc = this.getDoc();
+ if (doc) {
+ if(this.readOnly){
+ mode = false;
+ }
+ doc.designMode = (/on|true/i).test(String(mode).toLowerCase()) ?'on':'off';
+ }
+
+ },
+
+
+ getDesignMode : function(){
+ var doc = this.getDoc();
+ if(!doc){ return ''; }
+ return String(doc.designMode).toLowerCase();
+
+ },
+
+ disableItems: function(disabled){
+ if(this.fontSelect){
+ this.fontSelect.dom.disabled = disabled;
+ }
+ this.tb.items.each(function(item){
+ if(item.getItemId() != 'sourceedit'){
+ item.setDisabled(disabled);
+ }
+ });
+ },
+
+
+ onResize : function(w, h){
+ Ext.form.HtmlEditor.superclass.onResize.apply(this, arguments);
+ if(this.el && this.iframe){
+ if(Ext.isNumber(w)){
+ var aw = w - this.wrap.getFrameWidth('lr');
+ this.el.setWidth(aw);
+ this.tb.setWidth(aw);
+ this.iframe.style.width = Math.max(aw, 0) + 'px';
+ }
+ if(Ext.isNumber(h)){
+ var ah = h - this.wrap.getFrameWidth('tb') - this.tb.el.getHeight();
+ this.el.setHeight(ah);
+ this.iframe.style.height = Math.max(ah, 0) + 'px';
+ var bd = this.getEditorBody();
+ if(bd){
+ bd.style.height = Math.max((ah - (this.iframePad*2)), 0) + 'px';
+ }
+ }
+ }
+ },
+
+
+ toggleSourceEdit : function(sourceEditMode){
+ var iframeHeight,
+ elHeight;
+
+ if (sourceEditMode === undefined) {
+ sourceEditMode = !this.sourceEditMode;
+ }
+ this.sourceEditMode = sourceEditMode === true;
+ var btn = this.tb.getComponent('sourceedit');
+
+ if (btn.pressed !== this.sourceEditMode) {
+ btn.toggle(this.sourceEditMode);
+ if (!btn.xtbHidden) {
+ return;
+ }
+ }
+ if (this.sourceEditMode) {
+
+ this.previousSize = this.getSize();
+
+ iframeHeight = Ext.get(this.iframe).getHeight();
+
+ this.disableItems(true);
+ this.syncValue();
+ this.iframe.className = 'x-hidden';
+ this.el.removeClass('x-hidden');
+ this.el.dom.removeAttribute('tabIndex');
+ this.el.focus();
+ this.el.dom.style.height = iframeHeight + 'px';
+ }
+ else {
+ elHeight = parseInt(this.el.dom.style.height, 10);
+ if (this.initialized) {
+ this.disableItems(this.readOnly);
+ }
+ this.pushValue();
+ this.iframe.className = '';
+ this.el.addClass('x-hidden');
+ this.el.dom.setAttribute('tabIndex', -1);
+ this.deferFocus();
+
+ this.setSize(this.previousSize);
+ delete this.previousSize;
+ this.iframe.style.height = elHeight + 'px';
+ }
+ this.fireEvent('editmodechange', this, this.sourceEditMode);
+ },
+
+
+ createLink : function() {
+ var url = prompt(this.createLinkText, this.defaultLinkValue);
+ if(url && url != 'http:/'+'/'){
+ this.relayCmd('createlink', url);
+ }
+ },
+
+
+ initEvents : function(){
+ this.originalValue = this.getValue();
+ },
+
+
+ markInvalid : Ext.emptyFn,
+
+
+ clearInvalid : Ext.emptyFn,
+
+
+ setValue : function(v){
+ Ext.form.HtmlEditor.superclass.setValue.call(this, v);
+ this.pushValue();
+ return this;
+ },
+
+
+ cleanHtml: function(html) {
+ html = String(html);
+ if(Ext.isWebKit){
+ html = html.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi, '');
+ }
+
+
+ if(html.charCodeAt(0) == this.defaultValue.replace(/\D/g, '')){
+ html = html.substring(1);
+ }
+ return html;
+ },
+
+
+ syncValue : function(){
+ if(this.initialized){
+ var bd = this.getEditorBody();
+ var html = bd.innerHTML;
+ if(Ext.isWebKit){
+ var bs = bd.getAttribute('style');
+ var m = bs.match(/text-align:(.*?);/i);
+ if(m && m[1]){
+ html = '<div style="'+m[0]+'">' + html + '</div>';
+ }
+ }
+ html = this.cleanHtml(html);
+ if(this.fireEvent('beforesync', this, html) !== false){
+ this.el.dom.value = html;
+ this.fireEvent('sync', this, html);
+ }
+ }
+ },
+
+
+ getValue : function() {
+ this[this.sourceEditMode ? 'pushValue' : 'syncValue']();
+ return Ext.form.HtmlEditor.superclass.getValue.call(this);
+ },
+
+
+ pushValue : function(){
+ if(this.initialized){
+ var v = this.el.dom.value;
+ if(!this.activated && v.length < 1){
+ v = this.defaultValue;
+ }
+ if(this.fireEvent('beforepush', this, v) !== false){
+ this.getEditorBody().innerHTML = v;
+ if(Ext.isGecko){
+
+ this.setDesignMode(false);
+ this.setDesignMode(true);
+ }
+ this.fireEvent('push', this, v);
+ }
+
+ }
+ },
+
+
+ deferFocus : function(){
+ this.focus.defer(10, this);
+ },
+
+
+ focus : function(){
+ if(this.win && !this.sourceEditMode){
+ this.win.focus();
+ }else{
+ this.el.focus();
+ }
+ },
+
+
+ initEditor : function(){
+
+ try{
+ var dbody = this.getEditorBody(),
+ ss = this.el.getStyles('font-size', 'font-family', 'background-image', 'background-repeat', 'background-color', 'color'),
+ doc,
+ fn;
+
+ ss['background-attachment'] = 'fixed';
+ dbody.bgProperties = 'fixed';
+
+ Ext.DomHelper.applyStyles(dbody, ss);
+
+ doc = this.getDoc();
+
+ if(doc){
+ try{
+ Ext.EventManager.removeAll(doc);
+ }catch(e){}
+ }
+
+
+ fn = this.onEditorEvent.createDelegate(this);
+ Ext.EventManager.on(doc, {
+ mousedown: fn,
+ dblclick: fn,
+ click: fn,
+ keyup: fn,
+ buffer:100
+ });
+
+ if(Ext.isGecko){
+ Ext.EventManager.on(doc, 'keypress', this.applyCommand, this);
+ }
+ if(Ext.isIE || Ext.isWebKit || Ext.isOpera){
+ Ext.EventManager.on(doc, 'keydown', this.fixKeys, this);
+ }
+ doc.editorInitialized = true;
+ this.initialized = true;
+ this.pushValue();
+ this.setReadOnly(this.readOnly);
+ this.fireEvent('initialize', this);
+ }catch(e){}
+ },
+
+
+ beforeDestroy : function(){
+ if(this.monitorTask){
+ Ext.TaskMgr.stop(this.monitorTask);
+ }
+ if(this.readyTask){
+ Ext.TaskMgr.stop(this.readyTask);
+ }
+ if(this.rendered){
+ Ext.destroy(this.tb);
+ var doc = this.getDoc();
+ Ext.EventManager.removeFromSpecialCache(doc);
+ if(doc){
+ try{
+ Ext.EventManager.removeAll(doc);
+ for (var prop in doc){
+ delete doc[prop];
+ }
+ }catch(e){}
+ }
+ if(this.wrap){
+ this.wrap.dom.innerHTML = '';
+ this.wrap.remove();
+ }
+ }
+ Ext.form.HtmlEditor.superclass.beforeDestroy.call(this);
+ },
+
+
+ onFirstFocus : function(){
+ this.activated = true;
+ this.disableItems(this.readOnly);
+ if(Ext.isGecko){
+ this.win.focus();
+ var s = this.win.getSelection();
+ if(!s.focusNode || s.focusNode.nodeType != 3){
+ var r = s.getRangeAt(0);
+ r.selectNodeContents(this.getEditorBody());
+ r.collapse(true);
+ this.deferFocus();
+ }
+ try{
+ this.execCmd('useCSS', true);
+ this.execCmd('styleWithCSS', false);
+ }catch(e){}
+ }
+ this.fireEvent('activate', this);
+ },
+
+
+ adjustFont: function(btn){
+ var adjust = btn.getItemId() == 'increasefontsize' ? 1 : -1,
+ doc = this.getDoc(),
+ v = parseInt(doc.queryCommandValue('FontSize') || 2, 10);
+ if((Ext.isSafari && !Ext.isSafari2) || Ext.isChrome || Ext.isAir){
+
+
+ if(v <= 10){
+ v = 1 + adjust;
+ }else if(v <= 13){
+ v = 2 + adjust;
+ }else if(v <= 16){
+ v = 3 + adjust;
+ }else if(v <= 18){
+ v = 4 + adjust;
+ }else if(v <= 24){
+ v = 5 + adjust;
+ }else {
+ v = 6 + adjust;
+ }
+ v = v.constrain(1, 6);
+ }else{
+ if(Ext.isSafari){
+ adjust *= 2;
+ }
+ v = Math.max(1, v+adjust) + (Ext.isSafari ? 'px' : 0);
+ }
+ this.execCmd('FontSize', v);
+ },
+
+
+ onEditorEvent : function(e){
+ this.updateToolbar();
+ },
+
+
+
+ updateToolbar: function(){
+
+ if(this.readOnly){
+ return;
+ }
+
+ if(!this.activated){
+ this.onFirstFocus();
+ return;
+ }
+
+ var btns = this.tb.items.map,
+ doc = this.getDoc();
+
+ if(this.enableFont && !Ext.isSafari2){
+ var name = (doc.queryCommandValue('FontName')||this.defaultFont).toLowerCase();
+ if(name != this.fontSelect.dom.value){
+ this.fontSelect.dom.value = name;
+ }
+ }
+ if(this.enableFormat){
+ btns.bold.toggle(doc.queryCommandState('bold'));
+ btns.italic.toggle(doc.queryCommandState('italic'));
+ btns.underline.toggle(doc.queryCommandState('underline'));
+ }
+ if(this.enableAlignments){
+ btns.justifyleft.toggle(doc.queryCommandState('justifyleft'));
+ btns.justifycenter.toggle(doc.queryCommandState('justifycenter'));
+ btns.justifyright.toggle(doc.queryCommandState('justifyright'));
+ }
+ if(!Ext.isSafari2 && this.enableLists){
+ btns.insertorderedlist.toggle(doc.queryCommandState('insertorderedlist'));
+ btns.insertunorderedlist.toggle(doc.queryCommandState('insertunorderedlist'));
+ }
+
+ Ext.menu.MenuMgr.hideAll();
+
+ this.syncValue();
+ },
+
+
+ relayBtnCmd : function(btn){
+ this.relayCmd(btn.getItemId());
+ },
+
+
+ relayCmd : function(cmd, value){
+ (function(){
+ this.focus();
+ this.execCmd(cmd, value);
+ this.updateToolbar();
+ }).defer(10, this);
+ },
+
+
+ execCmd : function(cmd, value){
+ var doc = this.getDoc();
+ doc.execCommand(cmd, false, value === undefined ? null : value);
+ this.syncValue();
+ },
+
+
+ applyCommand : function(e){
+ if(e.ctrlKey){
+ var c = e.getCharCode(), cmd;
+ if(c > 0){
+ c = String.fromCharCode(c);
+ switch(c){
+ case 'b':
+ cmd = 'bold';
+ break;
+ case 'i':
+ cmd = 'italic';
+ break;
+ case 'u':
+ cmd = 'underline';
+ break;
+ }
+ if(cmd){
+ this.win.focus();
+ this.execCmd(cmd);
+ this.deferFocus();
+ e.preventDefault();
+ }
+ }
+ }
+ },
+
+
+ insertAtCursor : function(text){
+ if(!this.activated){
+ return;
+ }
+ if(Ext.isIE){
+ this.win.focus();
+ var doc = this.getDoc(),
+ r = doc.selection.createRange();
+ if(r){
+ r.pasteHTML(text);
+ this.syncValue();
+ this.deferFocus();
+ }
+ }else{
+ this.win.focus();
+ this.execCmd('InsertHTML', text);
+ this.deferFocus();
+ }
+ },
+
+
+ fixKeys : function(){
+ if(Ext.isIE){
+ return function(e){
+ var k = e.getKey(),
+ doc = this.getDoc(),
+ r;
+ if(k == e.TAB){
+ e.stopEvent();
+ r = doc.selection.createRange();
+ if(r){
+ r.collapse(true);
+ r.pasteHTML('&nbsp;&nbsp;&nbsp;&nbsp;');
+ this.deferFocus();
+ }
+ }else if(k == e.ENTER){
+ r = doc.selection.createRange();
+ if(r){
+ var target = r.parentElement();
+ if(!target || target.tagName.toLowerCase() != 'li'){
+ e.stopEvent();
+ r.pasteHTML('<br />');
+ r.collapse(false);
+ r.select();
+ }
+ }
+ }
+ };
+ }else if(Ext.isOpera){
+ return function(e){
+ var k = e.getKey();
+ if(k == e.TAB){
+ e.stopEvent();
+ this.win.focus();
+ this.execCmd('InsertHTML','&nbsp;&nbsp;&nbsp;&nbsp;');
+ this.deferFocus();
+ }
+ };
+ }else if(Ext.isWebKit){
+ return function(e){
+ var k = e.getKey();
+ if(k == e.TAB){
+ e.stopEvent();
+ this.execCmd('InsertText','\t');
+ this.deferFocus();
+ }else if(k == e.ENTER){
+ e.stopEvent();
+ this.execCmd('InsertHtml','<br /><br />');
+ this.deferFocus();
+ }
+ };
+ }
+ }(),
+
+
+ getToolbar : function(){
+ return this.tb;
+ },
+
+
+ buttonTips : {
+ bold : {
+ title: 'Bold (Ctrl+B)',
+ text: 'Make the selected text bold.',
+ cls: 'x-html-editor-tip'
+ },
+ italic : {
+ title: 'Italic (Ctrl+I)',
+ text: 'Make the selected text italic.',
+ cls: 'x-html-editor-tip'
+ },
+ underline : {
+ title: 'Underline (Ctrl+U)',
+ text: 'Underline the selected text.',
+ cls: 'x-html-editor-tip'
+ },
+ increasefontsize : {
+ title: 'Grow Text',
+ text: 'Increase the font size.',
+ cls: 'x-html-editor-tip'
+ },
+ decreasefontsize : {
+ title: 'Shrink Text',
+ text: 'Decrease the font size.',
+ cls: 'x-html-editor-tip'
+ },
+ backcolor : {
+ title: 'Text Highlight Color',
+ text: 'Change the background color of the selected text.',
+ cls: 'x-html-editor-tip'
+ },
+ forecolor : {
+ title: 'Font Color',
+ text: 'Change the color of the selected text.',
+ cls: 'x-html-editor-tip'
+ },
+ justifyleft : {
+ title: 'Align Text Left',
+ text: 'Align text to the left.',
+ cls: 'x-html-editor-tip'
+ },
+ justifycenter : {
+ title: 'Center Text',
+ text: 'Center text in the editor.',
+ cls: 'x-html-editor-tip'
+ },
+ justifyright : {
+ title: 'Align Text Right',
+ text: 'Align text to the right.',
+ cls: 'x-html-editor-tip'
+ },
+ insertunorderedlist : {
+ title: 'Bullet List',
+ text: 'Start a bulleted list.',
+ cls: 'x-html-editor-tip'
+ },
+ insertorderedlist : {
+ title: 'Numbered List',
+ text: 'Start a numbered list.',
+ cls: 'x-html-editor-tip'
+ },
+ createlink : {
+ title: 'Hyperlink',
+ text: 'Make the selected text a hyperlink.',
+ cls: 'x-html-editor-tip'
+ },
+ sourceedit : {
+ title: 'Source Edit',
+ text: 'Switch to source editing mode.',
+ cls: 'x-html-editor-tip'
+ }
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+});
+Ext.reg('htmleditor', Ext.form.HtmlEditor);
+
+Ext.form.TimeField = Ext.extend(Ext.form.ComboBox, {
+
+ minValue : undefined,
+
+ maxValue : undefined,
+
+ minText : "The time in this field must be equal to or after {0}",
+
+ maxText : "The time in this field must be equal to or before {0}",
+
+ invalidText : "{0} is not a valid time",
+
+ format : "g:i A",
+
+ altFormats : "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H|gi a|hi a|giA|hiA|gi A|hi A",
+
+ increment: 15,
+
+
+ mode: 'local',
+
+ triggerAction: 'all',
+
+ typeAhead: false,
+
+
+
+
+ initDate: '1/1/2008',
+
+ initDateFormat: 'j/n/Y',
+
+
+ initComponent : function(){
+ if(Ext.isDefined(this.minValue)){
+ this.setMinValue(this.minValue, true);
+ }
+ if(Ext.isDefined(this.maxValue)){
+ this.setMaxValue(this.maxValue, true);
+ }
+ if(!this.store){
+ this.generateStore(true);
+ }
+ Ext.form.TimeField.superclass.initComponent.call(this);
+ },
+
+
+ setMinValue: function(value, initial){
+ this.setLimit(value, true, initial);
+ return this;
+ },
+
+
+ setMaxValue: function(value, initial){
+ this.setLimit(value, false, initial);
+ return this;
+ },
+
+
+ generateStore: function(initial){
+ var min = this.minValue || new Date(this.initDate).clearTime(),
+ max = this.maxValue || new Date(this.initDate).clearTime().add('mi', (24 * 60) - 1),
+ times = [];
+
+ while(min <= max){
+ times.push(min.dateFormat(this.format));
+ min = min.add('mi', this.increment);
+ }
+ this.bindStore(times, initial);
+ },
+
+
+ setLimit: function(value, isMin, initial){
+ var d;
+ if(Ext.isString(value)){
+ d = this.parseDate(value);
+ }else if(Ext.isDate(value)){
+ d = value;
+ }
+ if(d){
+ var val = new Date(this.initDate).clearTime();
+ val.setHours(d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds());
+ this[isMin ? 'minValue' : 'maxValue'] = val;
+ if(!initial){
+ this.generateStore();
+ }
+ }
+ },
+
+
+ getValue : function(){
+ var v = Ext.form.TimeField.superclass.getValue.call(this);
+ return this.formatDate(this.parseDate(v)) || '';
+ },
+
+
+ setValue : function(value){
+ return Ext.form.TimeField.superclass.setValue.call(this, this.formatDate(this.parseDate(value)));
+ },
+
+
+ validateValue : Ext.form.DateField.prototype.validateValue,
+
+ formatDate : Ext.form.DateField.prototype.formatDate,
+
+ parseDate: function(value) {
+ if (!value || Ext.isDate(value)) {
+ return value;
+ }
+
+ var id = this.initDate + ' ',
+ idf = this.initDateFormat + ' ',
+ v = Date.parseDate(id + value, idf + this.format),
+ af = this.altFormats;
+
+ if (!v && af) {
+ if (!this.altFormatsArray) {
+ this.altFormatsArray = af.split("|");
+ }
+ for (var i = 0, afa = this.altFormatsArray, len = afa.length; i < len && !v; i++) {
+ v = Date.parseDate(id + value, idf + afa[i]);
+ }
+ }
+
+ return v;
+ }
+});
+Ext.reg('timefield', Ext.form.TimeField);
+Ext.form.SliderField = Ext.extend(Ext.form.Field, {
+
+
+ useTips : true,
+
+
+ tipText : null,
+
+
+ actionMode: 'wrap',
+
+
+ initComponent : function() {
+ var cfg = Ext.copyTo({
+ id: this.id + '-slider'
+ }, this.initialConfig, ['vertical', 'minValue', 'maxValue', 'decimalPrecision', 'keyIncrement', 'increment', 'clickToChange', 'animate']);
+
+
+ if (this.useTips) {
+ var plug = this.tipText ? {getText: this.tipText} : {};
+ cfg.plugins = [new Ext.slider.Tip(plug)];
+ }
+ this.slider = new Ext.Slider(cfg);
+ Ext.form.SliderField.superclass.initComponent.call(this);
+ },
+
+
+ onRender : function(ct, position){
+ this.autoCreate = {
+ id: this.id,
+ name: this.name,
+ type: 'hidden',
+ tag: 'input'
+ };
+ Ext.form.SliderField.superclass.onRender.call(this, ct, position);
+ this.wrap = this.el.wrap({cls: 'x-form-field-wrap'});
+ this.resizeEl = this.positionEl = this.wrap;
+ this.slider.render(this.wrap);
+ },
+
+
+ onResize : function(w, h, aw, ah){
+ Ext.form.SliderField.superclass.onResize.call(this, w, h, aw, ah);
+ this.slider.setSize(w, h);
+ },
+
+
+ initEvents : function(){
+ Ext.form.SliderField.superclass.initEvents.call(this);
+ this.slider.on('change', this.onChange, this);
+ },
+
+
+ onChange : function(slider, v){
+ this.setValue(v, undefined, true);
+ },
+
+
+ onEnable : function(){
+ Ext.form.SliderField.superclass.onEnable.call(this);
+ this.slider.enable();
+ },
+
+
+ onDisable : function(){
+ Ext.form.SliderField.superclass.onDisable.call(this);
+ this.slider.disable();
+ },
+
+
+ beforeDestroy : function(){
+ Ext.destroy(this.slider);
+ Ext.form.SliderField.superclass.beforeDestroy.call(this);
+ },
+
+
+ alignErrorIcon : function(){
+ this.errorIcon.alignTo(this.slider.el, 'tl-tr', [2, 0]);
+ },
+
+
+ setMinValue : function(v){
+ this.slider.setMinValue(v);
+ return this;
+ },
+
+
+ setMaxValue : function(v){
+ this.slider.setMaxValue(v);
+ return this;
+ },
+
+
+ setValue : function(v, animate, silent){
+
+
+ if(!silent){
+ this.slider.setValue(v, animate);
+ }
+ return Ext.form.SliderField.superclass.setValue.call(this, this.slider.getValue());
+ },
+
+
+ getValue : function(){
+ return this.slider.getValue();
+ }
+});
+
+Ext.reg('sliderfield', Ext.form.SliderField);
+Ext.form.Label = Ext.extend(Ext.BoxComponent, {
+
+
+
+
+
+ onRender : function(ct, position){
+ if(!this.el){
+ this.el = document.createElement('label');
+ this.el.id = this.getId();
+ this.el.innerHTML = this.text ? Ext.util.Format.htmlEncode(this.text) : (this.html || '');
+ if(this.forId){
+ this.el.setAttribute('for', this.forId);
+ }
+ }
+ Ext.form.Label.superclass.onRender.call(this, ct, position);
+ },
+
+
+ setText : function(t, encode){
+ var e = encode === false;
+ this[!e ? 'text' : 'html'] = t;
+ delete this[e ? 'text' : 'html'];
+ if(this.rendered){
+ this.el.dom.innerHTML = encode !== false ? Ext.util.Format.htmlEncode(t) : t;
+ }
+ return this;
+ }
+});
+
+Ext.reg('label', Ext.form.Label);
+Ext.form.Action = function(form, options){
+ this.form = form;
+ this.options = options || {};
+};
+
+
+Ext.form.Action.CLIENT_INVALID = 'client';
+
+Ext.form.Action.SERVER_INVALID = 'server';
+
+Ext.form.Action.CONNECT_FAILURE = 'connect';
+
+Ext.form.Action.LOAD_FAILURE = 'load';
+
+Ext.form.Action.prototype = {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ type : 'default',
+
+
+
+
+
+ run : function(options){
+
+ },
+
+
+ success : function(response){
+
+ },
+
+
+ handleResponse : function(response){
+
+ },
+
+
+ failure : function(response){
+ this.response = response;
+ this.failureType = Ext.form.Action.CONNECT_FAILURE;
+ this.form.afterAction(this, false);
+ },
+
+
+
+
+ processResponse : function(response){
+ this.response = response;
+ if(!response.responseText && !response.responseXML){
+ return true;
+ }
+ this.result = this.handleResponse(response);
+ return this.result;
+ },
+
+ decodeResponse: function(response) {
+ try {
+ return Ext.decode(response.responseText);
+ } catch(e) {
+ return false;
+ }
+ },
+
+
+ getUrl : function(appendParams){
+ var url = this.options.url || this.form.url || this.form.el.dom.action;
+ if(appendParams){
+ var p = this.getParams();
+ if(p){
+ url = Ext.urlAppend(url, p);
+ }
+ }
+ return url;
+ },
+
+
+ getMethod : function(){
+ return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase();
+ },
+
+
+ getParams : function(){
+ var bp = this.form.baseParams;
+ var p = this.options.params;
+ if(p){
+ if(typeof p == "object"){
+ p = Ext.urlEncode(Ext.applyIf(p, bp));
+ }else if(typeof p == 'string' && bp){
+ p += '&' + Ext.urlEncode(bp);
+ }
+ }else if(bp){
+ p = Ext.urlEncode(bp);
+ }
+ return p;
+ },
+
+
+ createCallback : function(opts){
+ var opts = opts || {};
+ return {
+ success: this.success,
+ failure: this.failure,
+ scope: this,
+ timeout: (opts.timeout*1000) || (this.form.timeout*1000),
+ upload: this.form.fileUpload ? this.success : undefined
+ };
+ }
+};
+
+
+Ext.form.Action.Submit = function(form, options){
+ Ext.form.Action.Submit.superclass.constructor.call(this, form, options);
+};
+
+Ext.extend(Ext.form.Action.Submit, Ext.form.Action, {
+
+
+ type : 'submit',
+
+
+ run : function(){
+ var o = this.options,
+ method = this.getMethod(),
+ isGet = method == 'GET';
+ if(o.clientValidation === false || this.form.isValid()){
+ if (o.submitEmptyText === false) {
+ var fields = this.form.items,
+ emptyFields = [],
+ setupEmptyFields = function(f){
+ if (f.el.getValue() == f.emptyText) {
+ emptyFields.push(f);
+ f.el.dom.value = "";
+ }
+ if(f.isComposite && f.rendered){
+ f.items.each(setupEmptyFields);
+ }
+ };
+
+ fields.each(setupEmptyFields);
+ }
+ Ext.Ajax.request(Ext.apply(this.createCallback(o), {
+ form:this.form.el.dom,
+ url:this.getUrl(isGet),
+ method: method,
+ headers: o.headers,
+ params:!isGet ? this.getParams() : null,
+ isUpload: this.form.fileUpload
+ }));
+ if (o.submitEmptyText === false) {
+ Ext.each(emptyFields, function(f) {
+ if (f.applyEmptyText) {
+ f.applyEmptyText();
+ }
+ });
+ }
+ }else if (o.clientValidation !== false){
+ this.failureType = Ext.form.Action.CLIENT_INVALID;
+ this.form.afterAction(this, false);
+ }
+ },
+
+
+ success : function(response){
+ var result = this.processResponse(response);
+ if(result === true || result.success){
+ this.form.afterAction(this, true);
+ return;
+ }
+ if(result.errors){
+ this.form.markInvalid(result.errors);
+ }
+ this.failureType = Ext.form.Action.SERVER_INVALID;
+ this.form.afterAction(this, false);
+ },
+
+
+ handleResponse : function(response){
+ if(this.form.errorReader){
+ var rs = this.form.errorReader.read(response);
+ var errors = [];
+ if(rs.records){
+ for(var i = 0, len = rs.records.length; i < len; i++) {
+ var r = rs.records[i];
+ errors[i] = r.data;
+ }
+ }
+ if(errors.length < 1){
+ errors = null;
+ }
+ return {
+ success : rs.success,
+ errors : errors
+ };
+ }
+ return this.decodeResponse(response);
+ }
+});
+
+
+
+Ext.form.Action.Load = function(form, options){
+ Ext.form.Action.Load.superclass.constructor.call(this, form, options);
+ this.reader = this.form.reader;
+};
+
+Ext.extend(Ext.form.Action.Load, Ext.form.Action, {
+
+ type : 'load',
+
+
+ run : function(){
+ Ext.Ajax.request(Ext.apply(
+ this.createCallback(this.options), {
+ method:this.getMethod(),
+ url:this.getUrl(false),
+ headers: this.options.headers,
+ params:this.getParams()
+ }));
+ },
+
+
+ success : function(response){
+ var result = this.processResponse(response);
+ if(result === true || !result.success || !result.data){
+ this.failureType = Ext.form.Action.LOAD_FAILURE;
+ this.form.afterAction(this, false);
+ return;
+ }
+ this.form.clearInvalid();
+ this.form.setValues(result.data);
+ this.form.afterAction(this, true);
+ },
+
+
+ handleResponse : function(response){
+ if(this.form.reader){
+ var rs = this.form.reader.read(response);
+ var data = rs.records && rs.records[0] ? rs.records[0].data : null;
+ return {
+ success : rs.success,
+ data : data
+ };
+ }
+ return this.decodeResponse(response);
+ }
+});
+
+
+
+
+Ext.form.Action.DirectLoad = Ext.extend(Ext.form.Action.Load, {
+ constructor: function(form, opts) {
+ Ext.form.Action.DirectLoad.superclass.constructor.call(this, form, opts);
+ },
+ type : 'directload',
+
+ run : function(){
+ var args = this.getParams();
+ args.push(this.success, this);
+ this.form.api.load.apply(window, args);
+ },
+
+ getParams : function() {
+ var buf = [], o = {};
+ var bp = this.form.baseParams;
+ var p = this.options.params;
+ Ext.apply(o, p, bp);
+ var paramOrder = this.form.paramOrder;
+ if(paramOrder){
+ for(var i = 0, len = paramOrder.length; i < len; i++){
+ buf.push(o[paramOrder[i]]);
+ }
+ }else if(this.form.paramsAsHash){
+ buf.push(o);
+ }
+ return buf;
+ },
+
+
+
+ processResponse : function(result) {
+ this.result = result;
+ return result;
+ },
+
+ success : function(response, trans){
+ if(trans.type == Ext.Direct.exceptions.SERVER){
+ response = {};
+ }
+ Ext.form.Action.DirectLoad.superclass.success.call(this, response);
+ }
+});
+
+
+Ext.form.Action.DirectSubmit = Ext.extend(Ext.form.Action.Submit, {
+ constructor : function(form, opts) {
+ Ext.form.Action.DirectSubmit.superclass.constructor.call(this, form, opts);
+ },
+ type : 'directsubmit',
+
+ run : function(){
+ var o = this.options;
+ if(o.clientValidation === false || this.form.isValid()){
+
+
+ this.success.params = this.getParams();
+ this.form.api.submit(this.form.el.dom, this.success, this);
+ }else if (o.clientValidation !== false){
+ this.failureType = Ext.form.Action.CLIENT_INVALID;
+ this.form.afterAction(this, false);
+ }
+ },
+
+ getParams : function() {
+ var o = {};
+ var bp = this.form.baseParams;
+ var p = this.options.params;
+ Ext.apply(o, p, bp);
+ return o;
+ },
+
+
+
+ processResponse : function(result) {
+ this.result = result;
+ return result;
+ },
+
+ success : function(response, trans){
+ if(trans.type == Ext.Direct.exceptions.SERVER){
+ response = {};
+ }
+ Ext.form.Action.DirectSubmit.superclass.success.call(this, response);
+ }
+});
+
+Ext.form.Action.ACTION_TYPES = {
+ 'load' : Ext.form.Action.Load,
+ 'submit' : Ext.form.Action.Submit,
+ 'directload' : Ext.form.Action.DirectLoad,
+ 'directsubmit' : Ext.form.Action.DirectSubmit
+};
+
+Ext.form.VTypes = function(){
+
+ var alpha = /^[a-zA-Z_]+$/,
+ alphanum = /^[a-zA-Z0-9_]+$/,
+ email = /^(\w+)([\-+.\'][\w]+)*@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/,
+ url = /(((^https?)|(^ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
+
+
+ return {
+
+ 'email' : function(v){
+ return email.test(v);
+ },
+
+ 'emailText' : 'This field should be an e-mail address in the format "user@example.com"',
+
+ 'emailMask' : /[a-z0-9_\.\-\+\'@]/i,
+
+ /**
+ * The function used to validate URLs
+ * @param {String} value The URL
+ * @return {Boolean} true if the RegExp test passed, and false if not.
+ */
+ 'url' : function(v){
+ return url.test(v);
+ },
+ /**
+ * The error text to display when the url validation function returns false. Defaults to:
+ * <tt>'This field should be a URL in the format "http:/'+'/www.example.com"'</tt>
+ * @type String
+ */
+ 'urlText' : 'This field should be a URL in the format "http:/'+'/www.example.com"',
+
+ /**
+ * The function used to validate alpha values
+ * @param {String} value The value
+ * @return {Boolean} true if the RegExp test passed, and false if not.
+ */
+ 'alpha' : function(v){
+ return alpha.test(v);
+ },
+ /**
+ * The error text to display when the alpha validation function returns false. Defaults to:
+ * <tt>'This field should only contain letters and _'</tt>
+ * @type String
+ */
+ 'alphaText' : 'This field should only contain letters and _',
+ /**
+ * The keystroke filter mask to be applied on alpha input. Defaults to:
+ * <tt>/[a-z_]/i</tt>
+ * @type RegExp
+ */
+ 'alphaMask' : /[a-z_]/i,
+
+ /**
+ * The function used to validate alphanumeric values
+ * @param {String} value The value
+ * @return {Boolean} true if the RegExp test passed, and false if not.
+ */
+ 'alphanum' : function(v){
+ return alphanum.test(v);
+ },
+ /**
+ * The error text to display when the alphanumeric validation function returns false. Defaults to:
+ * <tt>'This field should only contain letters, numbers and _'</tt>
+ * @type String
+ */
+ 'alphanumText' : 'This field should only contain letters, numbers and _',
+ /**
+ * The keystroke filter mask to be applied on alphanumeric input. Defaults to:
+ * <tt>/[a-z0-9_]/i</tt>
+ * @type RegExp
+ */
+ 'alphanumMask' : /[a-z0-9_]/i
+ };
+}();
+/**
+ * @class Ext.grid.GridPanel
+ * @extends Ext.Panel
+ * <p>This class represents the primary interface of a component based grid control to represent data
+ * in a tabular format of rows and columns. The GridPanel is composed of the following:</p>
+ * <div class="mdetail-params"><ul>
+ * <li><b>{@link Ext.data.Store Store}</b> : The Model holding the data records (rows)
+ * <div class="sub-desc"></div></li>
+ * <li><b>{@link Ext.grid.ColumnModel Column model}</b> : Column makeup
+ * <div class="sub-desc"></div></li>
+ * <li><b>{@link Ext.grid.GridView View}</b> : Encapsulates the user interface
+ * <div class="sub-desc"></div></li>
+ * <li><b>{@link Ext.grid.AbstractSelectionModel selection model}</b> : Selection behavior
+ * <div class="sub-desc"></div></li>
+ * </ul></div>
+ * <p>Example usage:</p>
+ * <pre><code>
+var grid = new Ext.grid.GridPanel({
+ {@link #store}: new {@link Ext.data.Store}({
+ {@link Ext.data.Store#autoDestroy autoDestroy}: true,
+ {@link Ext.data.Store#reader reader}: reader,
+ {@link Ext.data.Store#data data}: xg.dummyData
+ }),
+ {@link #colModel}: new {@link Ext.grid.ColumnModel}({
+ {@link Ext.grid.ColumnModel#defaults defaults}: {
+ width: 120,
+ sortable: true
+ },
+ {@link Ext.grid.ColumnModel#columns columns}: [
+ {id: 'company', header: 'Company', width: 200, sortable: true, dataIndex: 'company'},
+ {header: 'Price', renderer: Ext.util.Format.usMoney, dataIndex: 'price'},
+ {header: 'Change', dataIndex: 'change'},
+ {header: '% Change', dataIndex: 'pctChange'},
+ // instead of specifying renderer: Ext.util.Format.dateRenderer('m/d/Y') use xtype
+ {
+ header: 'Last Updated', width: 135, dataIndex: 'lastChange',
+ xtype: 'datecolumn', format: 'M d, Y'
+ }
+ ]
+ }),
+ {@link #viewConfig}: {
+ {@link Ext.grid.GridView#forceFit forceFit}: true,
+
+// Return CSS class to apply to rows depending upon data values
+ {@link Ext.grid.GridView#getRowClass getRowClass}: function(record, index) {
+ var c = record.{@link Ext.data.Record#get get}('change');
+ if (c < 0) {
+ return 'price-fall';
+ } else if (c > 0) {
+ return 'price-rise';
+ }
+ }
+ },
+ {@link #sm}: new Ext.grid.RowSelectionModel({singleSelect:true}),
+ width: 600,
+ height: 300,
+ frame: true,
+ title: 'Framed with Row Selection and Horizontal Scrolling',
+ iconCls: 'icon-grid'
+});
+ * </code></pre>
+ * <p><b><u>Notes:</u></b></p>
+ * <div class="mdetail-params"><ul>
+ * <li>Although this class inherits many configuration options from base classes, some of them
+ * (such as autoScroll, autoWidth, layout, items, etc) are not used by this class, and will
+ * have no effect.</li>
+ * <li>A grid <b>requires</b> a width in which to scroll its columns, and a height in which to
+ * scroll its rows. These dimensions can either be set explicitly through the
+ * <tt>{@link Ext.BoxComponent#height height}</tt> and <tt>{@link Ext.BoxComponent#width width}</tt>
+ * configuration options or implicitly set by using the grid as a child item of a
+ * {@link Ext.Container Container} which will have a {@link Ext.Container#layout layout manager}
+ * provide the sizing of its child items (for example the Container of the Grid may specify
+ * <tt>{@link Ext.Container#layout layout}:'fit'</tt>).</li>
+ * <li>To access the data in a Grid, it is necessary to use the data model encapsulated
+ * by the {@link #store Store}. See the {@link #cellclick} event for more details.</li>
+ * </ul></div>
+ * @constructor
+ * @param {Object} config The config object
+ * @xtype grid
+ */
+Ext.grid.GridPanel = Ext.extend(Ext.Panel, {
+ /**
+ * @cfg {String} autoExpandColumn
+ * <p>The <tt>{@link Ext.grid.Column#id id}</tt> of a {@link Ext.grid.Column column} in
+ * this grid that should expand to fill unused space. This value specified here can not
+ * be <tt>0</tt>.</p>
+ * <br><p><b>Note</b>: If the Grid's {@link Ext.grid.GridView view} is configured with
+ * <tt>{@link Ext.grid.GridView#forceFit forceFit}=true</tt> the <tt>autoExpandColumn</tt>
+ * is ignored. See {@link Ext.grid.Column}.<tt>{@link Ext.grid.Column#width width}</tt>
+ * for additional details.</p>
+ * <p>See <tt>{@link #autoExpandMax}</tt> and <tt>{@link #autoExpandMin}</tt> also.</p>
+ */
+ autoExpandColumn : false,
+
+
+ autoExpandMax : 1000,
+
+
+ autoExpandMin : 50,
+
+
+ columnLines : false,
+
+
+
+
+
+
+ ddText : '{0} selected row{1}',
+
+
+
+
+ deferRowRender : true,
+
+
+
+
+ enableColumnHide : true,
+
+
+ enableColumnMove : true,
+
+
+ enableDragDrop : false,
+
+
+ enableHdMenu : true,
+
+
+
+ loadMask : false,
+
+
+
+ minColumnWidth : 25,
+
+
+
+
+
+ stripeRows : false,
+
+
+ trackMouseOver : true,
+
+
+ stateEvents : ['columnmove', 'columnresize', 'sortchange', 'groupchange'],
+
+
+ view : null,
+
+
+ bubbleEvents: [],
+
+
+
+
+ rendered : false,
+
+
+ viewReady : false,
+
+
+ initComponent : function() {
+ Ext.grid.GridPanel.superclass.initComponent.call(this);
+
+ if (this.columnLines) {
+ this.cls = (this.cls || '') + ' x-grid-with-col-lines';
+ }
+
+
+ this.autoScroll = false;
+ this.autoWidth = false;
+
+ if(Ext.isArray(this.columns)){
+ this.colModel = new Ext.grid.ColumnModel(this.columns);
+ delete this.columns;
+ }
+
+
+ if(this.ds){
+ this.store = this.ds;
+ delete this.ds;
+ }
+ if(this.cm){
+ this.colModel = this.cm;
+ delete this.cm;
+ }
+ if(this.sm){
+ this.selModel = this.sm;
+ delete this.sm;
+ }
+ this.store = Ext.StoreMgr.lookup(this.store);
+
+ this.addEvents(
+
+
+ 'click',
+
+ 'dblclick',
+
+ 'contextmenu',
+
+ 'mousedown',
+
+ 'mouseup',
+
+ 'mouseover',
+
+ 'mouseout',
+
+ 'keypress',
+
+ 'keydown',
+
+
+
+ 'cellmousedown',
+
+ 'rowmousedown',
+
+ 'headermousedown',
+
+
+ 'groupmousedown',
+
+
+ 'rowbodymousedown',
+
+
+ 'containermousedown',
+
+
+ 'cellclick',
+
+ 'celldblclick',
+
+ 'rowclick',
+
+ 'rowdblclick',
+
+ 'headerclick',
+
+ 'headerdblclick',
+
+ 'groupclick',
+
+ 'groupdblclick',
+
+ 'containerclick',
+
+ 'containerdblclick',
+
+
+ 'rowbodyclick',
+
+ 'rowbodydblclick',
+
+
+ 'rowcontextmenu',
+
+ 'cellcontextmenu',
+
+ 'headercontextmenu',
+
+ 'groupcontextmenu',
+
+ 'containercontextmenu',
+
+ 'rowbodycontextmenu',
+
+ 'bodyscroll',
+
+ 'columnresize',
+
+ 'columnmove',
+
+ 'sortchange',
+
+ 'groupchange',
+
+ 'reconfigure',
+
+ 'viewready'
+ );
+ },
+
+
+ onRender : function(ct, position){
+ Ext.grid.GridPanel.superclass.onRender.apply(this, arguments);
+
+ var c = this.getGridEl();
+
+ this.el.addClass('x-grid-panel');
+
+ this.mon(c, {
+ scope: this,
+ mousedown: this.onMouseDown,
+ click: this.onClick,
+ dblclick: this.onDblClick,
+ contextmenu: this.onContextMenu
+ });
+
+ this.relayEvents(c, ['mousedown','mouseup','mouseover','mouseout','keypress', 'keydown']);
+
+ var view = this.getView();
+ view.init(this);
+ view.render();
+ this.getSelectionModel().init(this);
+ },
+
+
+ initEvents : function(){
+ Ext.grid.GridPanel.superclass.initEvents.call(this);
+
+ if(this.loadMask){
+ this.loadMask = new Ext.LoadMask(this.bwrap,
+ Ext.apply({store:this.store}, this.loadMask));
+ }
+ },
+
+ initStateEvents : function(){
+ Ext.grid.GridPanel.superclass.initStateEvents.call(this);
+ this.mon(this.colModel, 'hiddenchange', this.saveState, this, {delay: 100});
+ },
+
+ applyState : function(state){
+ var cm = this.colModel,
+ cs = state.columns,
+ store = this.store,
+ s,
+ c,
+ colIndex;
+
+ if(cs){
+ for(var i = 0, len = cs.length; i < len; i++){
+ s = cs[i];
+ c = cm.getColumnById(s.id);
+ if(c){
+ colIndex = cm.getIndexById(s.id);
+ cm.setState(colIndex, {
+ hidden: s.hidden,
+ width: s.width,
+ sortable: c.sortable,
+ editable: c.editable
+ });
+ if(colIndex != i){
+ cm.moveColumn(colIndex, i);
+ }
+ }
+ }
+ }
+ if(store){
+ s = state.sort;
+ if(s){
+ store[store.remoteSort ? 'setDefaultSort' : 'sort'](s.field, s.direction);
+ }
+ s = state.group;
+ if(store.groupBy){
+ if(s){
+ store.groupBy(s);
+ }else{
+ store.clearGrouping();
+ }
+ }
+
+ }
+ var o = Ext.apply({}, state);
+ delete o.columns;
+ delete o.sort;
+ Ext.grid.GridPanel.superclass.applyState.call(this, o);
+ },
+
+ getState : function(){
+ var o = {columns: []},
+ store = this.store,
+ ss,
+ gs;
+
+ for(var i = 0, c; (c = this.colModel.config[i]); i++){
+ o.columns[i] = {
+ id: c.id,
+ width: c.width
+ };
+ if(c.hidden){
+ o.columns[i].hidden = true;
+ }
+ }
+ if(store){
+ ss = store.getSortState();
+ if(ss){
+ o.sort = ss;
+ }
+ if(store.getGroupState){
+ gs = store.getGroupState();
+ if(gs){
+ o.group = gs;
+ }
+ }
+ }
+ return o;
+ },
+
+
+ afterRender : function(){
+ Ext.grid.GridPanel.superclass.afterRender.call(this);
+ var v = this.view;
+ this.on('bodyresize', v.layout, v);
+ v.layout(true);
+ if(this.deferRowRender){
+ if (!this.deferRowRenderTask){
+ this.deferRowRenderTask = new Ext.util.DelayedTask(v.afterRender, this.view);
+ }
+ this.deferRowRenderTask.delay(10);
+ }else{
+ v.afterRender();
+ }
+ this.viewReady = true;
+ },
+
+
+ reconfigure : function(store, colModel){
+ var rendered = this.rendered;
+ if(rendered){
+ if(this.loadMask){
+ this.loadMask.destroy();
+ this.loadMask = new Ext.LoadMask(this.bwrap,
+ Ext.apply({}, {store:store}, this.initialConfig.loadMask));
+ }
+ }
+ if(this.view){
+ this.view.initData(store, colModel);
+ }
+ this.store = store;
+ this.colModel = colModel;
+ if(rendered){
+ this.view.refresh(true);
+ }
+ this.fireEvent('reconfigure', this, store, colModel);
+ },
+
+
+ onDestroy : function(){
+ if (this.deferRowRenderTask && this.deferRowRenderTask.cancel){
+ this.deferRowRenderTask.cancel();
+ }
+ if(this.rendered){
+ Ext.destroy(this.view, this.loadMask);
+ }else if(this.store && this.store.autoDestroy){
+ this.store.destroy();
+ }
+ Ext.destroy(this.colModel, this.selModel);
+ this.store = this.selModel = this.colModel = this.view = this.loadMask = null;
+ Ext.grid.GridPanel.superclass.onDestroy.call(this);
+ },
+
+
+ processEvent : function(name, e){
+ this.view.processEvent(name, e);
+ },
+
+
+ onClick : function(e){
+ this.processEvent('click', e);
+ },
+
+
+ onMouseDown : function(e){
+ this.processEvent('mousedown', e);
+ },
+
+
+ onContextMenu : function(e, t){
+ this.processEvent('contextmenu', e);
+ },
+
+
+ onDblClick : function(e){
+ this.processEvent('dblclick', e);
+ },
+
+
+ walkCells : function(row, col, step, fn, scope){
+ var cm = this.colModel,
+ clen = cm.getColumnCount(),
+ ds = this.store,
+ rlen = ds.getCount(),
+ first = true;
+
+ if(step < 0){
+ if(col < 0){
+ row--;
+ first = false;
+ }
+ while(row >= 0){
+ if(!first){
+ col = clen-1;
+ }
+ first = false;
+ while(col >= 0){
+ if(fn.call(scope || this, row, col, cm) === true){
+ return [row, col];
+ }
+ col--;
+ }
+ row--;
+ }
+ } else {
+ if(col >= clen){
+ row++;
+ first = false;
+ }
+ while(row < rlen){
+ if(!first){
+ col = 0;
+ }
+ first = false;
+ while(col < clen){
+ if(fn.call(scope || this, row, col, cm) === true){
+ return [row, col];
+ }
+ col++;
+ }
+ row++;
+ }
+ }
+ return null;
+ },
+
+
+ getGridEl : function(){
+ return this.body;
+ },
+
+
+ stopEditing : Ext.emptyFn,
+
+
+ getSelectionModel : function(){
+ if(!this.selModel){
+ this.selModel = new Ext.grid.RowSelectionModel(
+ this.disableSelection ? {selectRow: Ext.emptyFn} : null);
+ }
+ return this.selModel;
+ },
+
+
+ getStore : function(){
+ return this.store;
+ },
+
+
+ getColumnModel : function(){
+ return this.colModel;
+ },
+
+
+ getView : function() {
+ if (!this.view) {
+ this.view = new Ext.grid.GridView(this.viewConfig);
+ }
+
+ return this.view;
+ },
+
+ getDragDropText : function(){
+ var count = this.selModel.getCount ? this.selModel.getCount() : 1;
+ return String.format(this.ddText, count, count == 1 ? '' : 's');
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+});
+Ext.reg('grid', Ext.grid.GridPanel);
+Ext.grid.PivotGrid = Ext.extend(Ext.grid.GridPanel, {
+
+
+ aggregator: 'sum',
+
+
+ renderer: undefined,
+
+
+
+
+
+
+
+
+ initComponent: function() {
+ Ext.grid.PivotGrid.superclass.initComponent.apply(this, arguments);
+
+ this.initAxes();
+
+
+ this.enableColumnResize = false;
+
+ this.viewConfig = Ext.apply(this.viewConfig || {}, {
+ forceFit: true
+ });
+
+
+
+ this.colModel = new Ext.grid.ColumnModel({});
+ },
+
+
+ getAggregator: function() {
+ if (typeof this.aggregator == 'string') {
+ return Ext.grid.PivotAggregatorMgr.types[this.aggregator];
+ } else {
+ return this.aggregator;
+ }
+ },
+
+
+ setAggregator: function(aggregator) {
+ this.aggregator = aggregator;
+ },
+
+
+ setMeasure: function(measure) {
+ this.measure = measure;
+ },
+
+
+ setLeftAxis: function(axis, refresh) {
+
+ this.leftAxis = axis;
+
+ if (refresh) {
+ this.view.refresh();
+ }
+ },
+
+
+ setTopAxis: function(axis, refresh) {
+
+ this.topAxis = axis;
+
+ if (refresh) {
+ this.view.refresh();
+ }
+ },
+
+
+ initAxes: function() {
+ var PivotAxis = Ext.grid.PivotAxis;
+
+ if (!(this.leftAxis instanceof PivotAxis)) {
+ this.setLeftAxis(new PivotAxis({
+ orientation: 'vertical',
+ dimensions : this.leftAxis || [],
+ store : this.store
+ }));
+ };
+
+ if (!(this.topAxis instanceof PivotAxis)) {
+ this.setTopAxis(new PivotAxis({
+ orientation: 'horizontal',
+ dimensions : this.topAxis || [],
+ store : this.store
+ }));
+ };
+ },
+
+
+ extractData: function() {
+ var records = this.store.data.items,
+ recCount = records.length,
+ cells = [],
+ record, i, j, k;
+
+ if (recCount == 0) {
+ return [];
+ }
+
+ var leftTuples = this.leftAxis.getTuples(),
+ leftCount = leftTuples.length,
+ topTuples = this.topAxis.getTuples(),
+ topCount = topTuples.length,
+ aggregator = this.getAggregator();
+
+ for (i = 0; i < recCount; i++) {
+ record = records[i];
+
+ for (j = 0; j < leftCount; j++) {
+ cells[j] = cells[j] || [];
+
+ if (leftTuples[j].matcher(record) === true) {
+ for (k = 0; k < topCount; k++) {
+ cells[j][k] = cells[j][k] || [];
+
+ if (topTuples[k].matcher(record)) {
+ cells[j][k].push(record);
+ }
+ }
+ }
+ }
+ }
+
+ var rowCount = cells.length,
+ colCount, row;
+
+ for (i = 0; i < rowCount; i++) {
+ row = cells[i];
+ colCount = row.length;
+
+ for (j = 0; j < colCount; j++) {
+ cells[i][j] = aggregator(cells[i][j], this.measure);
+ }
+ }
+
+ return cells;
+ },
+
+
+ getView: function() {
+ if (!this.view) {
+ this.view = new Ext.grid.PivotGridView(this.viewConfig);
+ }
+
+ return this.view;
+ }
+});
+
+Ext.reg('pivotgrid', Ext.grid.PivotGrid);
+
+
+Ext.grid.PivotAggregatorMgr = new Ext.AbstractManager();
+
+Ext.grid.PivotAggregatorMgr.registerType('sum', function(records, measure) {
+ var length = records.length,
+ total = 0,
+ i;
+
+ for (i = 0; i < length; i++) {
+ total += records[i].get(measure);
+ }
+
+ return total;
+});
+
+Ext.grid.PivotAggregatorMgr.registerType('avg', function(records, measure) {
+ var length = records.length,
+ total = 0,
+ i;
+
+ for (i = 0; i < length; i++) {
+ total += records[i].get(measure);
+ }
+
+ return (total / length) || 'n/a';
+});
+
+Ext.grid.PivotAggregatorMgr.registerType('min', function(records, measure) {
+ var data = [],
+ length = records.length,
+ i;
+
+ for (i = 0; i < length; i++) {
+ data.push(records[i].get(measure));
+ }
+
+ return Math.min.apply(this, data) || 'n/a';
+});
+
+Ext.grid.PivotAggregatorMgr.registerType('max', function(records, measure) {
+ var data = [],
+ length = records.length,
+ i;
+
+ for (i = 0; i < length; i++) {
+ data.push(records[i].get(measure));
+ }
+
+ return Math.max.apply(this, data) || 'n/a';
+});
+
+Ext.grid.PivotAggregatorMgr.registerType('count', function(records, measure) {
+ return records.length;
+});
+Ext.grid.GridView = Ext.extend(Ext.util.Observable, {
+
+
+
+
+
+
+
+
+
+
+
+ deferEmptyText : true,
+
+
+ scrollOffset : undefined,
+
+
+ autoFill : false,
+
+
+ forceFit : false,
+
+
+ sortClasses : ['sort-asc', 'sort-desc'],
+
+
+ sortAscText : 'Sort Ascending',
+
+
+ sortDescText : 'Sort Descending',
+
+
+ hideSortIcons: false,
+
+
+ columnsText : 'Columns',
+
+
+ selectedRowClass : 'x-grid3-row-selected',
+
+
+ borderWidth : 2,
+ tdClass : 'x-grid3-cell',
+ hdCls : 'x-grid3-hd',
+
+
+
+ markDirty : true,
+
+
+ cellSelectorDepth : 4,
+
+
+ rowSelectorDepth : 10,
+
+
+ rowBodySelectorDepth : 10,
+
+
+ cellSelector : 'td.x-grid3-cell',
+
+
+ rowSelector : 'div.x-grid3-row',
+
+
+ rowBodySelector : 'div.x-grid3-row-body',
+
+
+ firstRowCls: 'x-grid3-row-first',
+ lastRowCls: 'x-grid3-row-last',
+ rowClsRe: /(?:^|\s+)x-grid3-row-(first|last|alt)(?:\s+|$)/g,
+
+
+ headerMenuOpenCls: 'x-grid3-hd-menu-open',
+
+
+ rowOverCls: 'x-grid3-row-over',
+
+ constructor : function(config) {
+ Ext.apply(this, config);
+
+
+ this.addEvents(
+
+ 'beforerowremoved',
+
+
+ 'beforerowsinserted',
+
+
+ 'beforerefresh',
+
+
+ 'rowremoved',
+
+
+ 'rowsinserted',
+
+
+ 'rowupdated',
+
+
+ 'refresh'
+ );
+
+ Ext.grid.GridView.superclass.constructor.call(this);
+ },
+
+
+
+
+ masterTpl: new Ext.Template(
+ '<div class="x-grid3" hidefocus="true">',
+ '<div class="x-grid3-viewport">',
+ '<div class="x-grid3-header">',
+ '<div class="x-grid3-header-inner">',
+ '<div class="x-grid3-header-offset" style="{ostyle}">{header}</div>',
+ '</div>',
+ '<div class="x-clear"></div>',
+ '</div>',
+ '<div class="x-grid3-scroller">',
+ '<div class="x-grid3-body" style="{bstyle}">{body}</div>',
+ '<a href="#" class="x-grid3-focus" tabIndex="-1"></a>',
+ '</div>',
+ '</div>',
+ '<div class="x-grid3-resize-marker">&#160;</div>',
+ '<div class="x-grid3-resize-proxy">&#160;</div>',
+ '</div>'
+ ),
+
+
+ headerTpl: new Ext.Template(
+ '<table border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',
+ '<thead>',
+ '<tr class="x-grid3-hd-row">{cells}</tr>',
+ '</thead>',
+ '</table>'
+ ),
+
+
+ bodyTpl: new Ext.Template('{rows}'),
+
+
+ cellTpl: new Ext.Template(
+ '<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} {css}" style="{style}" tabIndex="0" {cellAttr}>',
+ '<div class="x-grid3-cell-inner x-grid3-col-{id} x-unselectable" unselectable="on" {attr}>{value}</div>',
+ '</td>'
+ ),
+
+
+ initTemplates : function() {
+ var templates = this.templates || {},
+ template, name,
+
+ headerCellTpl = new Ext.Template(
+ '<td class="x-grid3-hd x-grid3-cell x-grid3-td-{id} {css}" style="{style}">',
+ '<div {tooltip} {attr} class="x-grid3-hd-inner x-grid3-hd-{id}" unselectable="on" style="{istyle}">',
+ this.grid.enableHdMenu ? '<a class="x-grid3-hd-btn" href="#"></a>' : '',
+ '{value}',
+ '<img alt="" class="x-grid3-sort-icon" src="', Ext.BLANK_IMAGE_URL, '" />',
+ '</div>',
+ '</td>'
+ ),
+
+ rowBodyText = [
+ '<tr class="x-grid3-row-body-tr" style="{bodyStyle}">',
+ '<td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on">',
+ '<div class="x-grid3-row-body">{body}</div>',
+ '</td>',
+ '</tr>'
+ ].join(""),
+
+ innerText = [
+ '<table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',
+ '<tbody>',
+ '<tr>{cells}</tr>',
+ this.enableRowBody ? rowBodyText : '',
+ '</tbody>',
+ '</table>'
+ ].join("");
+
+ Ext.applyIf(templates, {
+ hcell : headerCellTpl,
+ cell : this.cellTpl,
+ body : this.bodyTpl,
+ header : this.headerTpl,
+ master : this.masterTpl,
+ row : new Ext.Template('<div class="x-grid3-row {alt}" style="{tstyle}">' + innerText + '</div>'),
+ rowInner: new Ext.Template(innerText)
+ });
+
+ for (name in templates) {
+ template = templates[name];
+
+ if (template && Ext.isFunction(template.compile) && !template.compiled) {
+ template.disableFormats = true;
+ template.compile();
+ }
+ }
+
+ this.templates = templates;
+ this.colRe = new RegExp('x-grid3-td-([^\\s]+)', '');
+ },
+
+
+ fly : function(el) {
+ if (!this._flyweight) {
+ this._flyweight = new Ext.Element.Flyweight(document.body);
+ }
+ this._flyweight.dom = el;
+ return this._flyweight;
+ },
+
+
+ getEditorParent : function() {
+ return this.scroller.dom;
+ },
+
+
+ initElements : function() {
+ var Element = Ext.Element,
+ el = Ext.get(this.grid.getGridEl().dom.firstChild),
+ mainWrap = new Element(el.child('div.x-grid3-viewport')),
+ mainHd = new Element(mainWrap.child('div.x-grid3-header')),
+ scroller = new Element(mainWrap.child('div.x-grid3-scroller'));
+
+ if (this.grid.hideHeaders) {
+ mainHd.setDisplayed(false);
+ }
+
+ if (this.forceFit) {
+ scroller.setStyle('overflow-x', 'hidden');
+ }
+
+
+
+ Ext.apply(this, {
+ el : el,
+ mainWrap: mainWrap,
+ scroller: scroller,
+ mainHd : mainHd,
+ innerHd : mainHd.child('div.x-grid3-header-inner').dom,
+ mainBody: new Element(Element.fly(scroller).child('div.x-grid3-body')),
+ focusEl : new Element(Element.fly(scroller).child('a')),
+
+ resizeMarker: new Element(el.child('div.x-grid3-resize-marker')),
+ resizeProxy : new Element(el.child('div.x-grid3-resize-proxy'))
+ });
+
+ this.focusEl.swallowEvent('click', true);
+ },
+
+
+ getRows : function() {
+ return this.hasRows() ? this.mainBody.dom.childNodes : [];
+ },
+
+
+
+
+ findCell : function(el) {
+ if (!el) {
+ return false;
+ }
+ return this.fly(el).findParent(this.cellSelector, this.cellSelectorDepth);
+ },
+
+
+ findCellIndex : function(el, requiredCls) {
+ var cell = this.findCell(el),
+ hasCls;
+
+ if (cell) {
+ hasCls = this.fly(cell).hasClass(requiredCls);
+ if (!requiredCls || hasCls) {
+ return this.getCellIndex(cell);
+ }
+ }
+ return false;
+ },
+
+
+ getCellIndex : function(el) {
+ if (el) {
+ var match = el.className.match(this.colRe);
+
+ if (match && match[1]) {
+ return this.cm.getIndexById(match[1]);
+ }
+ }
+ return false;
+ },
+
+
+ findHeaderCell : function(el) {
+ var cell = this.findCell(el);
+ return cell && this.fly(cell).hasClass(this.hdCls) ? cell : null;
+ },
+
+
+ findHeaderIndex : function(el){
+ return this.findCellIndex(el, this.hdCls);
+ },
+
+
+ findRow : function(el) {
+ if (!el) {
+ return false;
+ }
+ return this.fly(el).findParent(this.rowSelector, this.rowSelectorDepth);
+ },
+
+
+ findRowIndex : function(el) {
+ var row = this.findRow(el);
+ return row ? row.rowIndex : false;
+ },
+
+
+ findRowBody : function(el) {
+ if (!el) {
+ return false;
+ }
+
+ return this.fly(el).findParent(this.rowBodySelector, this.rowBodySelectorDepth);
+ },
+
+
+
+
+ getRow : function(row) {
+ return this.getRows()[row];
+ },
+
+
+ getCell : function(row, col) {
+ return Ext.fly(this.getRow(row)).query(this.cellSelector)[col];
+ },
+
+
+ getHeaderCell : function(index) {
+ return this.mainHd.dom.getElementsByTagName('td')[index];
+ },
+
+
+
+
+ addRowClass : function(rowId, cls) {
+ var row = this.getRow(rowId);
+ if (row) {
+ this.fly(row).addClass(cls);
+ }
+ },
+
+
+ removeRowClass : function(row, cls) {
+ var r = this.getRow(row);
+ if(r){
+ this.fly(r).removeClass(cls);
+ }
+ },
+
+
+ removeRow : function(row) {
+ Ext.removeNode(this.getRow(row));
+ this.syncFocusEl(row);
+ },
+
+
+ removeRows : function(firstRow, lastRow) {
+ var bd = this.mainBody.dom,
+ rowIndex;
+
+ for (rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){
+ Ext.removeNode(bd.childNodes[firstRow]);
+ }
+
+ this.syncFocusEl(firstRow);
+ },
+
+
+
+
+ getScrollState : function() {
+ var sb = this.scroller.dom;
+
+ return {
+ left: sb.scrollLeft,
+ top : sb.scrollTop
+ };
+ },
+
+
+ restoreScroll : function(state) {
+ var sb = this.scroller.dom;
+ sb.scrollLeft = state.left;
+ sb.scrollTop = state.top;
+ },
+
+
+ scrollToTop : function() {
+ var dom = this.scroller.dom;
+
+ dom.scrollTop = 0;
+ dom.scrollLeft = 0;
+ },
+
+
+ syncScroll : function() {
+ this.syncHeaderScroll();
+ var mb = this.scroller.dom;
+ this.grid.fireEvent('bodyscroll', mb.scrollLeft, mb.scrollTop);
+ },
+
+
+ syncHeaderScroll : function() {
+ var innerHd = this.innerHd,
+ scrollLeft = this.scroller.dom.scrollLeft;
+
+ innerHd.scrollLeft = scrollLeft;
+ innerHd.scrollLeft = scrollLeft;
+ },
+
+
+ updateSortIcon : function(col, dir) {
+ var sortClasses = this.sortClasses,
+ sortClass = sortClasses[dir == "DESC" ? 1 : 0],
+ headers = this.mainHd.select('td').removeClass(sortClasses);
+
+ headers.item(col).addClass(sortClass);
+ },
+
+
+ updateAllColumnWidths : function() {
+ var totalWidth = this.getTotalWidth(),
+ colCount = this.cm.getColumnCount(),
+ rows = this.getRows(),
+ rowCount = rows.length,
+ widths = [],
+ row, rowFirstChild, trow, i, j;
+
+ for (i = 0; i < colCount; i++) {
+ widths[i] = this.getColumnWidth(i);
+ this.getHeaderCell(i).style.width = widths[i];
+ }
+
+ this.updateHeaderWidth();
+
+ for (i = 0; i < rowCount; i++) {
+ row = rows[i];
+ row.style.width = totalWidth;
+ rowFirstChild = row.firstChild;
+
+ if (rowFirstChild) {
+ rowFirstChild.style.width = totalWidth;
+ trow = rowFirstChild.rows[0];
+
+ for (j = 0; j < colCount; j++) {
+ trow.childNodes[j].style.width = widths[j];
+ }
+ }
+ }
+
+ this.onAllColumnWidthsUpdated(widths, totalWidth);
+ },
+
+
+ updateColumnWidth : function(column, width) {
+ var columnWidth = this.getColumnWidth(column),
+ totalWidth = this.getTotalWidth(),
+ headerCell = this.getHeaderCell(column),
+ nodes = this.getRows(),
+ nodeCount = nodes.length,
+ row, i, firstChild;
+
+ this.updateHeaderWidth();
+ headerCell.style.width = columnWidth;
+
+ for (i = 0; i < nodeCount; i++) {
+ row = nodes[i];
+ firstChild = row.firstChild;
+
+ row.style.width = totalWidth;
+ if (firstChild) {
+ firstChild.style.width = totalWidth;
+ firstChild.rows[0].childNodes[column].style.width = columnWidth;
+ }
+ }
+
+ this.onColumnWidthUpdated(column, columnWidth, totalWidth);
+ },
+
+
+ updateColumnHidden : function(col, hidden) {
+ var totalWidth = this.getTotalWidth(),
+ display = hidden ? 'none' : '',
+ headerCell = this.getHeaderCell(col),
+ nodes = this.getRows(),
+ nodeCount = nodes.length,
+ row, rowFirstChild, i;
+
+ this.updateHeaderWidth();
+ headerCell.style.display = display;
+
+ for (i = 0; i < nodeCount; i++) {
+ row = nodes[i];
+ row.style.width = totalWidth;
+ rowFirstChild = row.firstChild;
+
+ if (rowFirstChild) {
+ rowFirstChild.style.width = totalWidth;
+ rowFirstChild.rows[0].childNodes[col].style.display = display;
+ }
+ }
+
+ this.onColumnHiddenUpdated(col, hidden, totalWidth);
+ delete this.lastViewWidth;
+ this.layout();
+ },
+
+
+ doRender : function(columns, records, store, startRow, colCount, stripe) {
+ var templates = this.templates,
+ cellTemplate = templates.cell,
+ rowTemplate = templates.row,
+ last = colCount - 1,
+ tstyle = 'width:' + this.getTotalWidth() + ';',
+
+ rowBuffer = [],
+ colBuffer = [],
+ rowParams = {tstyle: tstyle},
+ meta = {},
+ len = records.length,
+ alt,
+ column,
+ record, i, j, rowIndex;
+
+
+ for (j = 0; j < len; j++) {
+ record = records[j];
+ colBuffer = [];
+
+ rowIndex = j + startRow;
+
+
+ for (i = 0; i < colCount; i++) {
+ column = columns[i];
+
+ meta.id = column.id;
+ meta.css = i === 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');
+ meta.attr = meta.cellAttr = '';
+ meta.style = column.style;
+ meta.value = column.renderer.call(column.scope, record.data[column.name], meta, record, rowIndex, i, store);
+
+ if (Ext.isEmpty(meta.value)) {
+ meta.value = '&#160;';
+ }
+
+ if (this.markDirty && record.dirty && typeof record.modified[column.name] != 'undefined') {
+ meta.css += ' x-grid3-dirty-cell';
+ }
+
+ colBuffer[colBuffer.length] = cellTemplate.apply(meta);
+ }
+
+ alt = [];
+
+ if (stripe && ((rowIndex + 1) % 2 === 0)) {
+ alt[0] = 'x-grid3-row-alt';
+ }
+
+ if (record.dirty) {
+ alt[1] = ' x-grid3-dirty-row';
+ }
+
+ rowParams.cols = colCount;
+
+ if (this.getRowClass) {
+ alt[2] = this.getRowClass(record, rowIndex, rowParams, store);
+ }
+
+ rowParams.alt = alt.join(' ');
+ rowParams.cells = colBuffer.join('');
+
+ rowBuffer[rowBuffer.length] = rowTemplate.apply(rowParams);
+ }
+
+ return rowBuffer.join('');
+ },
+
+
+ processRows : function(startRow, skipStripe) {
+ if (!this.ds || this.ds.getCount() < 1) {
+ return;
+ }
+
+ var rows = this.getRows(),
+ length = rows.length,
+ row, i;
+
+ skipStripe = skipStripe || !this.grid.stripeRows;
+ startRow = startRow || 0;
+
+ for (i = 0; i < length; i++) {
+ row = rows[i];
+ if (row) {
+ row.rowIndex = i;
+ if (!skipStripe) {
+ row.className = row.className.replace(this.rowClsRe, ' ');
+ if ((i + 1) % 2 === 0){
+ row.className += ' x-grid3-row-alt';
+ }
+ }
+ }
+ }
+
+
+ if (startRow === 0) {
+ Ext.fly(rows[0]).addClass(this.firstRowCls);
+ }
+
+ Ext.fly(rows[length - 1]).addClass(this.lastRowCls);
+ },
+
+
+ afterRender : function() {
+ if (!this.ds || !this.cm) {
+ return;
+ }
+
+ this.mainBody.dom.innerHTML = this.renderBody() || '&#160;';
+ this.processRows(0, true);
+
+ if (this.deferEmptyText !== true) {
+ this.applyEmptyText();
+ }
+
+ this.grid.fireEvent('viewready', this.grid);
+ },
+
+
+ afterRenderUI: function() {
+ var grid = this.grid;
+
+ this.initElements();
+
+
+ Ext.fly(this.innerHd).on('click', this.handleHdDown, this);
+
+ this.mainHd.on({
+ scope : this,
+ mouseover: this.handleHdOver,
+ mouseout : this.handleHdOut,
+ mousemove: this.handleHdMove
+ });
+
+ this.scroller.on('scroll', this.syncScroll, this);
+
+ if (grid.enableColumnResize !== false) {
+ this.splitZone = new Ext.grid.GridView.SplitDragZone(grid, this.mainHd.dom);
+ }
+
+ if (grid.enableColumnMove) {
+ this.columnDrag = new Ext.grid.GridView.ColumnDragZone(grid, this.innerHd);
+ this.columnDrop = new Ext.grid.HeaderDropZone(grid, this.mainHd.dom);
+ }
+
+ if (grid.enableHdMenu !== false) {
+ this.hmenu = new Ext.menu.Menu({id: grid.id + '-hctx'});
+ this.hmenu.add(
+ {itemId:'asc', text: this.sortAscText, cls: 'xg-hmenu-sort-asc'},
+ {itemId:'desc', text: this.sortDescText, cls: 'xg-hmenu-sort-desc'}
+ );
+
+ if (grid.enableColumnHide !== false) {
+ this.colMenu = new Ext.menu.Menu({id:grid.id + '-hcols-menu'});
+ this.colMenu.on({
+ scope : this,
+ beforeshow: this.beforeColMenuShow,
+ itemclick : this.handleHdMenuClick
+ });
+ this.hmenu.add({
+ itemId: 'sortSep',
+ xtype: 'menuseparator'
+ }, {
+ itemId:'columns',
+ hideOnClick: false,
+ text: this.columnsText,
+ menu: this.colMenu,
+ iconCls: 'x-cols-icon'
+ });
+ }
+
+ this.hmenu.on('itemclick', this.handleHdMenuClick, this);
+ }
+
+ if (grid.trackMouseOver) {
+ this.mainBody.on({
+ scope : this,
+ mouseover: this.onRowOver,
+ mouseout : this.onRowOut
+ });
+ }
+
+ if (grid.enableDragDrop || grid.enableDrag) {
+ this.dragZone = new Ext.grid.GridDragZone(grid, {
+ ddGroup : grid.ddGroup || 'GridDD'
+ });
+ }
+
+ this.updateHeaderSortState();
+ },
+
+
+ renderUI : function() {
+ var templates = this.templates;
+
+ return templates.master.apply({
+ body : templates.body.apply({rows:'&#160;'}),
+ header: this.renderHeaders(),
+ ostyle: 'width:' + this.getOffsetWidth() + ';',
+ bstyle: 'width:' + this.getTotalWidth() + ';'
+ });
+ },
+
+
+ processEvent : function(name, e) {
+ var target = e.getTarget(),
+ grid = this.grid,
+ header = this.findHeaderIndex(target),
+ row, cell, col, body;
+
+ grid.fireEvent(name, e);
+
+ if (header !== false) {
+ grid.fireEvent('header' + name, grid, header, e);
+ } else {
+ row = this.findRowIndex(target);
+
+
+
+
+ if (row !== false) {
+ cell = this.findCellIndex(target);
+ if (cell !== false) {
+ col = grid.colModel.getColumnAt(cell);
+ if (grid.fireEvent('cell' + name, grid, row, cell, e) !== false) {
+ if (!col || (col.processEvent && (col.processEvent(name, e, grid, row, cell) !== false))) {
+ grid.fireEvent('row' + name, grid, row, e);
+ }
+ }
+ } else {
+ if (grid.fireEvent('row' + name, grid, row, e) !== false) {
+ (body = this.findRowBody(target)) && grid.fireEvent('rowbody' + name, grid, row, e);
+ }
+ }
+ } else {
+ grid.fireEvent('container' + name, grid, e);
+ }
+ }
+ },
+
+
+ layout : function(initial) {
+ if (!this.mainBody) {
+ return;
+ }
+
+ var grid = this.grid,
+ gridEl = grid.getGridEl(),
+ gridSize = gridEl.getSize(true),
+ gridWidth = gridSize.width,
+ gridHeight = gridSize.height,
+ scroller = this.scroller,
+ scrollStyle, headerHeight, scrollHeight;
+
+ if (gridWidth < 20 || gridHeight < 20) {
+ return;
+ }
+
+ if (grid.autoHeight) {
+ scrollStyle = scroller.dom.style;
+ scrollStyle.overflow = 'visible';
+
+ if (Ext.isWebKit) {
+ scrollStyle.position = 'static';
+ }
+ } else {
+ this.el.setSize(gridWidth, gridHeight);
+
+ headerHeight = this.mainHd.getHeight();
+ scrollHeight = gridHeight - headerHeight;
+
+ scroller.setSize(gridWidth, scrollHeight);
+
+ if (this.innerHd) {
+ this.innerHd.style.width = (gridWidth) + "px";
+ }
+ }
+
+ if (this.forceFit || (initial === true && this.autoFill)) {
+ if (this.lastViewWidth != gridWidth) {
+ this.fitColumns(false, false);
+ this.lastViewWidth = gridWidth;
+ }
+ } else {
+ this.autoExpand();
+ this.syncHeaderScroll();
+ }
+
+ this.onLayout(gridWidth, scrollHeight);
+ },
+
+
+
+ onLayout : function(vw, vh) {
+
+ },
+
+ onColumnWidthUpdated : function(col, w, tw) {
+
+ },
+
+ onAllColumnWidthsUpdated : function(ws, tw) {
+
+ },
+
+ onColumnHiddenUpdated : function(col, hidden, tw) {
+
+ },
+
+ updateColumnText : function(col, text) {
+
+ },
+
+ afterMove : function(colIndex) {
+
+ },
+
+
+
+ init : function(grid) {
+ this.grid = grid;
+
+ this.initTemplates();
+ this.initData(grid.store, grid.colModel);
+ this.initUI(grid);
+ },
+
+
+ getColumnId : function(index){
+ return this.cm.getColumnId(index);
+ },
+
+
+ getOffsetWidth : function() {
+ return (this.cm.getTotalWidth() + this.getScrollOffset()) + 'px';
+ },
+
+
+ getScrollOffset: function() {
+ return Ext.num(this.scrollOffset, Ext.getScrollBarWidth());
+ },
+
+
+ renderHeaders : function() {
+ var colModel = this.cm,
+ templates = this.templates,
+ headerTpl = templates.hcell,
+ properties = {},
+ colCount = colModel.getColumnCount(),
+ last = colCount - 1,
+ cells = [],
+ i, cssCls;
+
+ for (i = 0; i < colCount; i++) {
+ if (i == 0) {
+ cssCls = 'x-grid3-cell-first ';
+ } else {
+ cssCls = i == last ? 'x-grid3-cell-last ' : '';
+ }
+
+ properties = {
+ id : colModel.getColumnId(i),
+ value : colModel.getColumnHeader(i) || '',
+ style : this.getColumnStyle(i, true),
+ css : cssCls,
+ tooltip: this.getColumnTooltip(i)
+ };
+
+ if (colModel.config[i].align == 'right') {
+ properties.istyle = 'padding-right: 16px;';
+ } else {
+ delete properties.istyle;
+ }
+
+ cells[i] = headerTpl.apply(properties);
+ }
+
+ return templates.header.apply({
+ cells : cells.join(""),
+ tstyle: String.format("width: {0};", this.getTotalWidth())
+ });
+ },
+
+
+ getColumnTooltip : function(i) {
+ var tooltip = this.cm.getColumnTooltip(i);
+ if (tooltip) {
+ if (Ext.QuickTips.isEnabled()) {
+ return 'ext:qtip="' + tooltip + '"';
+ } else {
+ return 'title="' + tooltip + '"';
+ }
+ }
+
+ return '';
+ },
+
+
+ beforeUpdate : function() {
+ this.grid.stopEditing(true);
+ },
+
+
+ updateHeaders : function() {
+ this.innerHd.firstChild.innerHTML = this.renderHeaders();
+
+ this.updateHeaderWidth(false);
+ },
+
+
+ updateHeaderWidth: function(updateMain) {
+ var innerHdChild = this.innerHd.firstChild,
+ totalWidth = this.getTotalWidth();
+
+ innerHdChild.style.width = this.getOffsetWidth();
+ innerHdChild.firstChild.style.width = totalWidth;
+
+ if (updateMain !== false) {
+ this.mainBody.dom.style.width = totalWidth;
+ }
+ },
+
+
+ focusRow : function(row) {
+ this.focusCell(row, 0, false);
+ },
+
+
+ focusCell : function(row, col, hscroll) {
+ this.syncFocusEl(this.ensureVisible(row, col, hscroll));
+
+ var focusEl = this.focusEl;
+
+ if (Ext.isGecko) {
+ focusEl.focus();
+ } else {
+ focusEl.focus.defer(1, focusEl);
+ }
+ },
+
+
+ resolveCell : function(row, col, hscroll) {
+ if (!Ext.isNumber(row)) {
+ row = row.rowIndex;
+ }
+
+ if (!this.ds) {
+ return null;
+ }
+
+ if (row < 0 || row >= this.ds.getCount()) {
+ return null;
+ }
+ col = (col !== undefined ? col : 0);
+
+ var rowEl = this.getRow(row),
+ colModel = this.cm,
+ colCount = colModel.getColumnCount(),
+ cellEl;
+
+ if (!(hscroll === false && col === 0)) {
+ while (col < colCount && colModel.isHidden(col)) {
+ col++;
+ }
+
+ cellEl = this.getCell(row, col);
+ }
+
+ return {row: rowEl, cell: cellEl};
+ },
+
+
+ getResolvedXY : function(resolved) {
+ if (!resolved) {
+ return null;
+ }
+
+ var cell = resolved.cell,
+ row = resolved.row;
+
+ if (cell) {
+ return Ext.fly(cell).getXY();
+ } else {
+ return [this.el.getX(), Ext.fly(row).getY()];
+ }
+ },
+
+
+ syncFocusEl : function(row, col, hscroll) {
+ var xy = row;
+
+ if (!Ext.isArray(xy)) {
+ row = Math.min(row, Math.max(0, this.getRows().length-1));
+
+ if (isNaN(row)) {
+ return;
+ }
+
+ xy = this.getResolvedXY(this.resolveCell(row, col, hscroll));
+ }
+
+ this.focusEl.setXY(xy || this.scroller.getXY());
+ },
+
+
+ ensureVisible : function(row, col, hscroll) {
+ var resolved = this.resolveCell(row, col, hscroll);
+
+ if (!resolved || !resolved.row) {
+ return null;
+ }
+
+ var rowEl = resolved.row,
+ cellEl = resolved.cell,
+ c = this.scroller.dom,
+ p = rowEl,
+ ctop = 0,
+ stop = this.el.dom;
+
+ while (p && p != stop) {
+ ctop += p.offsetTop;
+ p = p.offsetParent;
+ }
+
+ ctop -= this.mainHd.dom.offsetHeight;
+ stop = parseInt(c.scrollTop, 10);
+
+ var cbot = ctop + rowEl.offsetHeight,
+ ch = c.clientHeight,
+ sbot = stop + ch;
+
+
+ if (ctop < stop) {
+ c.scrollTop = ctop;
+ } else if(cbot > sbot) {
+ c.scrollTop = cbot-ch;
+ }
+
+ if (hscroll !== false) {
+ var cleft = parseInt(cellEl.offsetLeft, 10),
+ cright = cleft + cellEl.offsetWidth,
+ sleft = parseInt(c.scrollLeft, 10),
+ sright = sleft + c.clientWidth;
+
+ if (cleft < sleft) {
+ c.scrollLeft = cleft;
+ } else if(cright > sright) {
+ c.scrollLeft = cright-c.clientWidth;
+ }
+ }
+
+ return this.getResolvedXY(resolved);
+ },
+
+
+ insertRows : function(dm, firstRow, lastRow, isUpdate) {
+ var last = dm.getCount() - 1;
+ if( !isUpdate && firstRow === 0 && lastRow >= last) {
+ this.fireEvent('beforerowsinserted', this, firstRow, lastRow);
+ this.refresh();
+ this.fireEvent('rowsinserted', this, firstRow, lastRow);
+ } else {
+ if (!isUpdate) {
+ this.fireEvent('beforerowsinserted', this, firstRow, lastRow);
+ }
+ var html = this.renderRows(firstRow, lastRow),
+ before = this.getRow(firstRow);
+ if (before) {
+ if(firstRow === 0){
+ Ext.fly(this.getRow(0)).removeClass(this.firstRowCls);
+ }
+ Ext.DomHelper.insertHtml('beforeBegin', before, html);
+ } else {
+ var r = this.getRow(last - 1);
+ if(r){
+ Ext.fly(r).removeClass(this.lastRowCls);
+ }
+ Ext.DomHelper.insertHtml('beforeEnd', this.mainBody.dom, html);
+ }
+ if (!isUpdate) {
+ this.processRows(firstRow);
+ this.fireEvent('rowsinserted', this, firstRow, lastRow);
+ } else if (firstRow === 0 || firstRow >= last) {
+
+ Ext.fly(this.getRow(firstRow)).addClass(firstRow === 0 ? this.firstRowCls : this.lastRowCls);
+ }
+ }
+ this.syncFocusEl(firstRow);
+ },
+
+
+ deleteRows : function(dm, firstRow, lastRow) {
+ if (dm.getRowCount() < 1) {
+ this.refresh();
+ } else {
+ this.fireEvent('beforerowsdeleted', this, firstRow, lastRow);
+
+ this.removeRows(firstRow, lastRow);
+
+ this.processRows(firstRow);
+ this.fireEvent('rowsdeleted', this, firstRow, lastRow);
+ }
+ },
+
+
+ getColumnStyle : function(colIndex, isHeader) {
+ var colModel = this.cm,
+ colConfig = colModel.config,
+ style = isHeader ? '' : colConfig[colIndex].css || '',
+ align = colConfig[colIndex].align;
+
+ style += String.format("width: {0};", this.getColumnWidth(colIndex));
+
+ if (colModel.isHidden(colIndex)) {
+ style += 'display: none; ';
+ }
+
+ if (align) {
+ style += String.format("text-align: {0};", align);
+ }
+
+ return style;
+ },
+
+
+ getColumnWidth : function(column) {
+ var columnWidth = this.cm.getColumnWidth(column),
+ borderWidth = this.borderWidth;
+
+ if (Ext.isNumber(columnWidth)) {
+ if (Ext.isBorderBox) {
+ return columnWidth + "px";
+ } else {
+ return Math.max(columnWidth - borderWidth, 0) + "px";
+ }
+ } else {
+ return columnWidth;
+ }
+ },
+
+
+ getTotalWidth : function() {
+ return this.cm.getTotalWidth() + 'px';
+ },
+
+
+ fitColumns : function(preventRefresh, onlyExpand, omitColumn) {
+ var grid = this.grid,
+ colModel = this.cm,
+ totalColWidth = colModel.getTotalWidth(false),
+ gridWidth = this.getGridInnerWidth(),
+ extraWidth = gridWidth - totalColWidth,
+ columns = [],
+ extraCol = 0,
+ width = 0,
+ colWidth, fraction, i;
+
+
+ if (gridWidth < 20 || extraWidth === 0) {
+ return false;
+ }
+
+ var visibleColCount = colModel.getColumnCount(true),
+ totalColCount = colModel.getColumnCount(false),
+ adjCount = visibleColCount - (Ext.isNumber(omitColumn) ? 1 : 0);
+
+ if (adjCount === 0) {
+ adjCount = 1;
+ omitColumn = undefined;
+ }
+
+
+ for (i = 0; i < totalColCount; i++) {
+ if (!colModel.isFixed(i) && i !== omitColumn) {
+ colWidth = colModel.getColumnWidth(i);
+ columns.push(i, colWidth);
+
+ if (!colModel.isHidden(i)) {
+ extraCol = i;
+ width += colWidth;
+ }
+ }
+ }
+
+ fraction = (gridWidth - colModel.getTotalWidth()) / width;
+
+ while (columns.length) {
+ colWidth = columns.pop();
+ i = columns.pop();
+
+ colModel.setColumnWidth(i, Math.max(grid.minColumnWidth, Math.floor(colWidth + colWidth * fraction)), true);
+ }
+
+
+ totalColWidth = colModel.getTotalWidth(false);
+
+ if (totalColWidth > gridWidth) {
+ var adjustCol = (adjCount == visibleColCount) ? extraCol : omitColumn,
+ newWidth = Math.max(1, colModel.getColumnWidth(adjustCol) - (totalColWidth - gridWidth));
+
+ colModel.setColumnWidth(adjustCol, newWidth, true);
+ }
+
+ if (preventRefresh !== true) {
+ this.updateAllColumnWidths();
+ }
+
+ return true;
+ },
+
+
+ autoExpand : function(preventUpdate) {
+ var grid = this.grid,
+ colModel = this.cm,
+ gridWidth = this.getGridInnerWidth(),
+ totalColumnWidth = colModel.getTotalWidth(false),
+ autoExpandColumn = grid.autoExpandColumn;
+
+ if (!this.userResized && autoExpandColumn) {
+ if (gridWidth != totalColumnWidth) {
+
+ var colIndex = colModel.getIndexById(autoExpandColumn),
+ currentWidth = colModel.getColumnWidth(colIndex),
+ desiredWidth = gridWidth - totalColumnWidth + currentWidth,
+ newWidth = Math.min(Math.max(desiredWidth, grid.autoExpandMin), grid.autoExpandMax);
+
+ if (currentWidth != newWidth) {
+ colModel.setColumnWidth(colIndex, newWidth, true);
+
+ if (preventUpdate !== true) {
+ this.updateColumnWidth(colIndex, newWidth);
+ }
+ }
+ }
+ }
+ },
+
+
+ getGridInnerWidth: function() {
+ return this.grid.getGridEl().getWidth(true) - this.getScrollOffset();
+ },
+
+
+ getColumnData : function() {
+ var columns = [],
+ colModel = this.cm,
+ colCount = colModel.getColumnCount(),
+ fields = this.ds.fields,
+ i, name;
+
+ for (i = 0; i < colCount; i++) {
+ name = colModel.getDataIndex(i);
+
+ columns[i] = {
+ name : Ext.isDefined(name) ? name : (fields.get(i) ? fields.get(i).name : undefined),
+ renderer: colModel.getRenderer(i),
+ scope : colModel.getRendererScope(i),
+ id : colModel.getColumnId(i),
+ style : this.getColumnStyle(i)
+ };
+ }
+
+ return columns;
+ },
+
+
+ renderRows : function(startRow, endRow) {
+ var grid = this.grid,
+ store = grid.store,
+ stripe = grid.stripeRows,
+ colModel = grid.colModel,
+ colCount = colModel.getColumnCount(),
+ rowCount = store.getCount(),
+ records;
+
+ if (rowCount < 1) {
+ return '';
+ }
+
+ startRow = startRow || 0;
+ endRow = Ext.isDefined(endRow) ? endRow : rowCount - 1;
+ records = store.getRange(startRow, endRow);
+
+ return this.doRender(this.getColumnData(), records, store, startRow, colCount, stripe);
+ },
+
+
+ renderBody : function(){
+ var markup = this.renderRows() || '&#160;';
+ return this.templates.body.apply({rows: markup});
+ },
+
+
+ refreshRow: function(record) {
+ var store = this.ds,
+ colCount = this.cm.getColumnCount(),
+ columns = this.getColumnData(),
+ last = colCount - 1,
+ cls = ['x-grid3-row'],
+ rowParams = {
+ tstyle: String.format("width: {0};", this.getTotalWidth())
+ },
+ colBuffer = [],
+ cellTpl = this.templates.cell,
+ rowIndex, row, column, meta, css, i;
+
+ if (Ext.isNumber(record)) {
+ rowIndex = record;
+ record = store.getAt(rowIndex);
+ } else {
+ rowIndex = store.indexOf(record);
+ }
+
+
+ if (!record || rowIndex < 0) {
+ return;
+ }
+
+
+ for (i = 0; i < colCount; i++) {
+ column = columns[i];
+
+ if (i == 0) {
+ css = 'x-grid3-cell-first';
+ } else {
+ css = (i == last) ? 'x-grid3-cell-last ' : '';
+ }
+
+ meta = {
+ id : column.id,
+ style : column.style,
+ css : css,
+ attr : "",
+ cellAttr: ""
+ };
+
+ meta.value = column.renderer.call(column.scope, record.data[column.name], meta, record, rowIndex, i, store);
+
+ if (Ext.isEmpty(meta.value)) {
+ meta.value = '&#160;';
+ }
+
+ if (this.markDirty && record.dirty && typeof record.modified[column.name] != 'undefined') {
+ meta.css += ' x-grid3-dirty-cell';
+ }
+
+ colBuffer[i] = cellTpl.apply(meta);
+ }
+
+ row = this.getRow(rowIndex);
+ row.className = '';
+
+ if (this.grid.stripeRows && ((rowIndex + 1) % 2 === 0)) {
+ cls.push('x-grid3-row-alt');
+ }
+
+ if (this.getRowClass) {
+ rowParams.cols = colCount;
+ cls.push(this.getRowClass(record, rowIndex, rowParams, store));
+ }
+
+ this.fly(row).addClass(cls).setStyle(rowParams.tstyle);
+ rowParams.cells = colBuffer.join("");
+ row.innerHTML = this.templates.rowInner.apply(rowParams);
+
+ this.fireEvent('rowupdated', this, rowIndex, record);
+ },
+
+
+ refresh : function(headersToo) {
+ this.fireEvent('beforerefresh', this);
+ this.grid.stopEditing(true);
+
+ var result = this.renderBody();
+ this.mainBody.update(result).setWidth(this.getTotalWidth());
+ if (headersToo === true) {
+ this.updateHeaders();
+ this.updateHeaderSortState();
+ }
+ this.processRows(0, true);
+ this.layout();
+ this.applyEmptyText();
+ this.fireEvent('refresh', this);
+ },
+
+
+ applyEmptyText : function() {
+ if (this.emptyText && !this.hasRows()) {
+ this.mainBody.update('<div class="x-grid-empty">' + this.emptyText + '</div>');
+ }
+ },
+
+
+ updateHeaderSortState : function() {
+ var state = this.ds.getSortState();
+ if (!state) {
+ return;
+ }
+
+ if (!this.sortState || (this.sortState.field != state.field || this.sortState.direction != state.direction)) {
+ this.grid.fireEvent('sortchange', this.grid, state);
+ }
+
+ this.sortState = state;
+
+ var sortColumn = this.cm.findColumnIndex(state.field);
+ if (sortColumn != -1) {
+ var sortDir = state.direction;
+ this.updateSortIcon(sortColumn, sortDir);
+ }
+ },
+
+
+ clearHeaderSortState : function() {
+ if (!this.sortState) {
+ return;
+ }
+ this.grid.fireEvent('sortchange', this.grid, null);
+ this.mainHd.select('td').removeClass(this.sortClasses);
+ delete this.sortState;
+ },
+
+
+ destroy : function() {
+ var me = this,
+ grid = me.grid,
+ gridEl = grid.getGridEl(),
+ dragZone = me.dragZone,
+ splitZone = me.splitZone,
+ columnDrag = me.columnDrag,
+ columnDrop = me.columnDrop,
+ scrollToTopTask = me.scrollToTopTask,
+ columnDragData,
+ columnDragProxy;
+
+ if (scrollToTopTask && scrollToTopTask.cancel) {
+ scrollToTopTask.cancel();
+ }
+
+ Ext.destroyMembers(me, 'colMenu', 'hmenu');
+
+ me.initData(null, null);
+ me.purgeListeners();
+
+ Ext.fly(me.innerHd).un("click", me.handleHdDown, me);
+
+ if (grid.enableColumnMove) {
+ columnDragData = columnDrag.dragData;
+ columnDragProxy = columnDrag.proxy;
+ Ext.destroy(
+ columnDrag.el,
+ columnDragProxy.ghost,
+ columnDragProxy.el,
+ columnDrop.el,
+ columnDrop.proxyTop,
+ columnDrop.proxyBottom,
+ columnDragData.ddel,
+ columnDragData.header
+ );
+
+ if (columnDragProxy.anim) {
+ Ext.destroy(columnDragProxy.anim);
+ }
+
+ delete columnDragProxy.ghost;
+ delete columnDragData.ddel;
+ delete columnDragData.header;
+ columnDrag.destroy();
+
+ delete Ext.dd.DDM.locationCache[columnDrag.id];
+ delete columnDrag._domRef;
+
+ delete columnDrop.proxyTop;
+ delete columnDrop.proxyBottom;
+ columnDrop.destroy();
+ delete Ext.dd.DDM.locationCache["gridHeader" + gridEl.id];
+ delete columnDrop._domRef;
+ delete Ext.dd.DDM.ids[columnDrop.ddGroup];
+ }
+
+ if (splitZone) {
+ splitZone.destroy();
+ delete splitZone._domRef;
+ delete Ext.dd.DDM.ids["gridSplitters" + gridEl.id];
+ }
+
+ Ext.fly(me.innerHd).removeAllListeners();
+ Ext.removeNode(me.innerHd);
+ delete me.innerHd;
+
+ Ext.destroy(
+ me.el,
+ me.mainWrap,
+ me.mainHd,
+ me.scroller,
+ me.mainBody,
+ me.focusEl,
+ me.resizeMarker,
+ me.resizeProxy,
+ me.activeHdBtn,
+ me._flyweight,
+ dragZone,
+ splitZone
+ );
+
+ delete grid.container;
+
+ if (dragZone) {
+ dragZone.destroy();
+ }
+
+ Ext.dd.DDM.currentTarget = null;
+ delete Ext.dd.DDM.locationCache[gridEl.id];
+
+ Ext.EventManager.removeResizeListener(me.onWindowResize, me);
+ },
+
+
+ onDenyColumnHide : function() {
+
+ },
+
+
+ render : function() {
+ if (this.autoFill) {
+ var ct = this.grid.ownerCt;
+
+ if (ct && ct.getLayout()) {
+ ct.on('afterlayout', function() {
+ this.fitColumns(true, true);
+ this.updateHeaders();
+ this.updateHeaderSortState();
+ }, this, {single: true});
+ }
+ } else if (this.forceFit) {
+ this.fitColumns(true, false);
+ } else if (this.grid.autoExpandColumn) {
+ this.autoExpand(true);
+ }
+
+ this.grid.getGridEl().dom.innerHTML = this.renderUI();
+
+ this.afterRenderUI();
+ },
+
+
+
+
+ initData : function(newStore, newColModel) {
+ var me = this;
+
+ if (me.ds) {
+ var oldStore = me.ds;
+
+ oldStore.un('add', me.onAdd, me);
+ oldStore.un('load', me.onLoad, me);
+ oldStore.un('clear', me.onClear, me);
+ oldStore.un('remove', me.onRemove, me);
+ oldStore.un('update', me.onUpdate, me);
+ oldStore.un('datachanged', me.onDataChange, me);
+
+ if (oldStore !== newStore && oldStore.autoDestroy) {
+ oldStore.destroy();
+ }
+ }
+
+ if (newStore) {
+ newStore.on({
+ scope : me,
+ load : me.onLoad,
+ add : me.onAdd,
+ remove : me.onRemove,
+ update : me.onUpdate,
+ clear : me.onClear,
+ datachanged: me.onDataChange
+ });
+ }
+
+ if (me.cm) {
+ var oldColModel = me.cm;
+
+ oldColModel.un('configchange', me.onColConfigChange, me);
+ oldColModel.un('widthchange', me.onColWidthChange, me);
+ oldColModel.un('headerchange', me.onHeaderChange, me);
+ oldColModel.un('hiddenchange', me.onHiddenChange, me);
+ oldColModel.un('columnmoved', me.onColumnMove, me);
+ }
+
+ if (newColModel) {
+ delete me.lastViewWidth;
+
+ newColModel.on({
+ scope : me,
+ configchange: me.onColConfigChange,
+ widthchange : me.onColWidthChange,
+ headerchange: me.onHeaderChange,
+ hiddenchange: me.onHiddenChange,
+ columnmoved : me.onColumnMove
+ });
+ }
+
+ me.ds = newStore;
+ me.cm = newColModel;
+ },
+
+
+ onDataChange : function(){
+ this.refresh(true);
+ this.updateHeaderSortState();
+ this.syncFocusEl(0);
+ },
+
+
+ onClear : function() {
+ this.refresh();
+ this.syncFocusEl(0);
+ },
+
+
+ onUpdate : function(store, record) {
+ this.refreshRow(record);
+ },
+
+
+ onAdd : function(store, records, index) {
+ this.insertRows(store, index, index + (records.length-1));
+ },
+
+
+ onRemove : function(store, record, index, isUpdate) {
+ if (isUpdate !== true) {
+ this.fireEvent('beforerowremoved', this, index, record);
+ }
+
+ this.removeRow(index);
+
+ if (isUpdate !== true) {
+ this.processRows(index);
+ this.applyEmptyText();
+ this.fireEvent('rowremoved', this, index, record);
+ }
+ },
+
+
+ onLoad : function() {
+ if (Ext.isGecko) {
+ if (!this.scrollToTopTask) {
+ this.scrollToTopTask = new Ext.util.DelayedTask(this.scrollToTop, this);
+ }
+ this.scrollToTopTask.delay(1);
+ } else {
+ this.scrollToTop();
+ }
+ },
+
+
+ onColWidthChange : function(cm, col, width) {
+ this.updateColumnWidth(col, width);
+ },
+
+
+ onHeaderChange : function(cm, col, text) {
+ this.updateHeaders();
+ },
+
+
+ onHiddenChange : function(cm, col, hidden) {
+ this.updateColumnHidden(col, hidden);
+ },
+
+
+ onColumnMove : function(cm, oldIndex, newIndex) {
+ this.indexMap = null;
+ this.refresh(true);
+ this.restoreScroll(this.getScrollState());
+
+ this.afterMove(newIndex);
+ this.grid.fireEvent('columnmove', oldIndex, newIndex);
+ },
+
+
+ onColConfigChange : function() {
+ delete this.lastViewWidth;
+ this.indexMap = null;
+ this.refresh(true);
+ },
+
+
+
+ initUI : function(grid) {
+ grid.on('headerclick', this.onHeaderClick, this);
+ },
+
+
+ initEvents : Ext.emptyFn,
+
+
+ onHeaderClick : function(g, index) {
+ if (this.headersDisabled || !this.cm.isSortable(index)) {
+ return;
+ }
+ g.stopEditing(true);
+ g.store.sort(this.cm.getDataIndex(index));
+ },
+
+
+ onRowOver : function(e, target) {
+ var row = this.findRowIndex(target);
+
+ if (row !== false) {
+ this.addRowClass(row, this.rowOverCls);
+ }
+ },
+
+
+ onRowOut : function(e, target) {
+ var row = this.findRowIndex(target);
+
+ if (row !== false && !e.within(this.getRow(row), true)) {
+ this.removeRowClass(row, this.rowOverCls);
+ }
+ },
+
+
+ onRowSelect : function(row) {
+ this.addRowClass(row, this.selectedRowClass);
+ },
+
+
+ onRowDeselect : function(row) {
+ this.removeRowClass(row, this.selectedRowClass);
+ },
+
+
+ onCellSelect : function(row, col) {
+ var cell = this.getCell(row, col);
+ if (cell) {
+ this.fly(cell).addClass('x-grid3-cell-selected');
+ }
+ },
+
+
+ onCellDeselect : function(row, col) {
+ var cell = this.getCell(row, col);
+ if (cell) {
+ this.fly(cell).removeClass('x-grid3-cell-selected');
+ }
+ },
+
+
+ handleWheel : function(e) {
+ e.stopPropagation();
+ },
+
+
+ onColumnSplitterMoved : function(cellIndex, width) {
+ this.userResized = true;
+ this.grid.colModel.setColumnWidth(cellIndex, width, true);
+
+ if (this.forceFit) {
+ this.fitColumns(true, false, cellIndex);
+ this.updateAllColumnWidths();
+ } else {
+ this.updateColumnWidth(cellIndex, width);
+ this.syncHeaderScroll();
+ }
+
+ this.grid.fireEvent('columnresize', cellIndex, width);
+ },
+
+
+ beforeColMenuShow : function() {
+ var colModel = this.cm,
+ colCount = colModel.getColumnCount(),
+ colMenu = this.colMenu,
+ i;
+
+ colMenu.removeAll();
+
+ for (i = 0; i < colCount; i++) {
+ if (colModel.config[i].hideable !== false) {
+ colMenu.add(new Ext.menu.CheckItem({
+ text : colModel.getColumnHeader(i),
+ itemId : 'col-' + colModel.getColumnId(i),
+ checked : !colModel.isHidden(i),
+ disabled : colModel.config[i].hideable === false,
+ hideOnClick: false
+ }));
+ }
+ }
+ },
+
+
+ handleHdMenuClick : function(item) {
+ var store = this.ds,
+ dataIndex = this.cm.getDataIndex(this.hdCtxIndex);
+
+ switch (item.getItemId()) {
+ case 'asc':
+ store.sort(dataIndex, 'ASC');
+ break;
+ case 'desc':
+ store.sort(dataIndex, 'DESC');
+ break;
+ default:
+ this.handleHdMenuClickDefault(item);
+ }
+ return true;
+ },
+
+
+ handleHdMenuClickDefault: function(item) {
+ var colModel = this.cm,
+ itemId = item.getItemId(),
+ index = colModel.getIndexById(itemId.substr(4));
+
+ if (index != -1) {
+ if (item.checked && colModel.getColumnsBy(this.isHideableColumn, this).length <= 1) {
+ this.onDenyColumnHide();
+ return;
+ }
+ colModel.setHidden(index, item.checked);
+ }
+ },
+
+
+ handleHdDown : function(e, target) {
+ if (Ext.fly(target).hasClass('x-grid3-hd-btn')) {
+ e.stopEvent();
+
+ var colModel = this.cm,
+ header = this.findHeaderCell(target),
+ index = this.getCellIndex(header),
+ sortable = colModel.isSortable(index),
+ menu = this.hmenu,
+ menuItems = menu.items,
+ menuCls = this.headerMenuOpenCls,
+ sep;
+
+ this.hdCtxIndex = index;
+
+ Ext.fly(header).addClass(menuCls);
+ if (this.hideSortIcons) {
+ menuItems.get('asc').setVisible(sortable);
+ menuItems.get('desc').setVisible(sortable);
+ sep = menuItems.get('sortSep');
+ if (sep) {
+ sep.setVisible(sortable);
+ }
+ } else {
+ menuItems.get('asc').setDisabled(!sortable);
+ menuItems.get('desc').setDisabled(!sortable);
+ }
+
+ menu.on('hide', function() {
+ Ext.fly(header).removeClass(menuCls);
+ }, this, {single:true});
+
+ menu.show(target, 'tl-bl?');
+ }
+ },
+
+
+ handleHdMove : function(e) {
+ var header = this.findHeaderCell(this.activeHdRef);
+
+ if (header && !this.headersDisabled) {
+ var handleWidth = this.splitHandleWidth || 5,
+ activeRegion = this.activeHdRegion,
+ headerStyle = header.style,
+ colModel = this.cm,
+ cursor = '',
+ pageX = e.getPageX();
+
+ if (this.grid.enableColumnResize !== false) {
+ var activeHeaderIndex = this.activeHdIndex,
+ previousVisible = this.getPreviousVisible(activeHeaderIndex),
+ currentResizable = colModel.isResizable(activeHeaderIndex),
+ previousResizable = previousVisible && colModel.isResizable(previousVisible),
+ inLeftResizer = pageX - activeRegion.left <= handleWidth,
+ inRightResizer = activeRegion.right - pageX <= (!this.activeHdBtn ? handleWidth : 2);
+
+ if (inLeftResizer && previousResizable) {
+ cursor = Ext.isAir ? 'move' : Ext.isWebKit ? 'e-resize' : 'col-resize';
+ } else if (inRightResizer && currentResizable) {
+ cursor = Ext.isAir ? 'move' : Ext.isWebKit ? 'w-resize' : 'col-resize';
+ }
+ }
+
+ headerStyle.cursor = cursor;
+ }
+ },
+
+
+ getPreviousVisible: function(index) {
+ while (index > 0) {
+ if (!this.cm.isHidden(index - 1)) {
+ return index;
+ }
+ index--;
+ }
+ return undefined;
+ },
+
+
+ handleHdOver : function(e, target) {
+ var header = this.findHeaderCell(target);
+
+ if (header && !this.headersDisabled) {
+ var fly = this.fly(header);
+
+ this.activeHdRef = target;
+ this.activeHdIndex = this.getCellIndex(header);
+ this.activeHdRegion = fly.getRegion();
+
+ if (!this.isMenuDisabled(this.activeHdIndex, fly)) {
+ fly.addClass('x-grid3-hd-over');
+ this.activeHdBtn = fly.child('.x-grid3-hd-btn');
+
+ if (this.activeHdBtn) {
+ this.activeHdBtn.dom.style.height = (header.firstChild.offsetHeight - 1) + 'px';
+ }
+ }
+ }
+ },
+
+
+ handleHdOut : function(e, target) {
+ var header = this.findHeaderCell(target);
+
+ if (header && (!Ext.isIE9m || !e.within(header, true))) {
+ this.activeHdRef = null;
+ this.fly(header).removeClass('x-grid3-hd-over');
+ header.style.cursor = '';
+ }
+ },
+
+
+ isMenuDisabled: function(cellIndex, el) {
+ return this.cm.isMenuDisabled(cellIndex);
+ },
+
+
+ hasRows : function() {
+ var fc = this.mainBody.dom.firstChild;
+ return fc && fc.nodeType == 1 && fc.className != 'x-grid-empty';
+ },
+
+
+ isHideableColumn : function(c) {
+ return !c.hidden;
+ },
+
+
+ bind : function(d, c) {
+ this.initData(d, c);
+ }
+});
+
+
+
+
+Ext.grid.GridView.SplitDragZone = Ext.extend(Ext.dd.DDProxy, {
+
+ constructor: function(grid, hd){
+ this.grid = grid;
+ this.view = grid.getView();
+ this.marker = this.view.resizeMarker;
+ this.proxy = this.view.resizeProxy;
+ Ext.grid.GridView.SplitDragZone.superclass.constructor.call(this, hd,
+ 'gridSplitters' + this.grid.getGridEl().id, {
+ dragElId : Ext.id(this.proxy.dom), resizeFrame:false
+ });
+ this.scroll = false;
+ this.hw = this.view.splitHandleWidth || 5;
+ },
+
+ b4StartDrag : function(x, y){
+ this.dragHeadersDisabled = this.view.headersDisabled;
+ this.view.headersDisabled = true;
+ var h = this.view.mainWrap.getHeight();
+ this.marker.setHeight(h);
+ this.marker.show();
+ this.marker.alignTo(this.view.getHeaderCell(this.cellIndex), 'tl-tl', [-2, 0]);
+ this.proxy.setHeight(h);
+ var w = this.cm.getColumnWidth(this.cellIndex),
+ minw = Math.max(w-this.grid.minColumnWidth, 0);
+ this.resetConstraints();
+ this.setXConstraint(minw, 1000);
+ this.setYConstraint(0, 0);
+ this.minX = x - minw;
+ this.maxX = x + 1000;
+ this.startPos = x;
+ Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y);
+ },
+
+ allowHeaderDrag : function(e){
+ return true;
+ },
+
+ handleMouseDown : function(e){
+ var t = this.view.findHeaderCell(e.getTarget());
+ if(t && this.allowHeaderDrag(e)){
+ var xy = this.view.fly(t).getXY(),
+ x = xy[0],
+ exy = e.getXY(),
+ ex = exy[0],
+ w = t.offsetWidth,
+ adjust = false;
+
+ if((ex - x) <= this.hw){
+ adjust = -1;
+ }else if((x+w) - ex <= this.hw){
+ adjust = 0;
+ }
+ if(adjust !== false){
+ this.cm = this.grid.colModel;
+ var ci = this.view.getCellIndex(t);
+ if(adjust == -1){
+ if (ci + adjust < 0) {
+ return;
+ }
+ while(this.cm.isHidden(ci+adjust)){
+ --adjust;
+ if(ci+adjust < 0){
+ return;
+ }
+ }
+ }
+ this.cellIndex = ci+adjust;
+ this.split = t.dom;
+ if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){
+ Ext.grid.GridView.SplitDragZone.superclass.handleMouseDown.apply(this, arguments);
+ }
+ }else if(this.view.columnDrag){
+ this.view.columnDrag.callHandleMouseDown(e);
+ }
+ }
+ },
+
+ endDrag : function(e){
+ this.marker.hide();
+ var v = this.view,
+ endX = Math.max(this.minX, e.getPageX()),
+ diff = endX - this.startPos,
+ disabled = this.dragHeadersDisabled;
+
+ v.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff);
+ setTimeout(function(){
+ v.headersDisabled = disabled;
+ }, 50);
+ },
+
+ autoOffset : function(){
+ this.setDelta(0,0);
+ }
+});
+
+Ext.grid.PivotGridView = Ext.extend(Ext.grid.GridView, {
+
+
+ colHeaderCellCls: 'grid-hd-group-cell',
+
+
+ title: '',
+
+
+
+
+ getColumnHeaders: function() {
+ return this.grid.topAxis.buildHeaders();;
+ },
+
+
+ getRowHeaders: function() {
+ return this.grid.leftAxis.buildHeaders();
+ },
+
+
+ renderRows : function(startRow, endRow) {
+ var grid = this.grid,
+ rows = grid.extractData(),
+ rowCount = rows.length,
+ templates = this.templates,
+ renderer = grid.renderer,
+ hasRenderer = typeof renderer == 'function',
+ getCellCls = this.getCellCls,
+ hasGetCellCls = typeof getCellCls == 'function',
+ cellTemplate = templates.cell,
+ rowTemplate = templates.row,
+ rowBuffer = [],
+ meta = {},
+ tstyle = 'width:' + this.getGridInnerWidth() + 'px;',
+ colBuffer, colCount, column, i, row;
+
+ startRow = startRow || 0;
+ endRow = Ext.isDefined(endRow) ? endRow : rowCount - 1;
+
+ for (i = 0; i < rowCount; i++) {
+ row = rows[i];
+ colCount = row.length;
+ colBuffer = [];
+
+
+ for (var j = 0; j < colCount; j++) {
+
+ meta.id = i + '-' + j;
+ meta.css = j === 0 ? 'x-grid3-cell-first ' : (j == (colCount - 1) ? 'x-grid3-cell-last ' : '');
+ meta.attr = meta.cellAttr = '';
+ meta.value = row[j];
+
+ if (Ext.isEmpty(meta.value)) {
+ meta.value = '&#160;';
+ }
+
+ if (hasRenderer) {
+ meta.value = renderer(meta.value);
+ }
+
+ if (hasGetCellCls) {
+ meta.css += getCellCls(meta.value) + ' ';
+ }
+
+ colBuffer[colBuffer.length] = cellTemplate.apply(meta);
+ }
+
+ rowBuffer[rowBuffer.length] = rowTemplate.apply({
+ tstyle: tstyle,
+ cols : colCount,
+ cells : colBuffer.join(""),
+ alt : ''
+ });
+ }
+
+ return rowBuffer.join("");
+ },
+
+
+ masterTpl: new Ext.Template(
+ '<div class="x-grid3 x-pivotgrid" hidefocus="true">',
+ '<div class="x-grid3-viewport">',
+ '<div class="x-grid3-header">',
+ '<div class="x-grid3-header-title"><span>{title}</span></div>',
+ '<div class="x-grid3-header-inner">',
+ '<div class="x-grid3-header-offset" style="{ostyle}"></div>',
+ '</div>',
+ '<div class="x-clear"></div>',
+ '</div>',
+ '<div class="x-grid3-scroller">',
+ '<div class="x-grid3-row-headers"></div>',
+ '<div class="x-grid3-body" style="{bstyle}">{body}</div>',
+ '<a href="#" class="x-grid3-focus" tabIndex="-1"></a>',
+ '</div>',
+ '</div>',
+ '<div class="x-grid3-resize-marker">&#160;</div>',
+ '<div class="x-grid3-resize-proxy">&#160;</div>',
+ '</div>'
+ ),
+
+
+ initTemplates: function() {
+ Ext.grid.PivotGridView.superclass.initTemplates.apply(this, arguments);
+
+ var templates = this.templates || {};
+ if (!templates.gcell) {
+ templates.gcell = new Ext.XTemplate(
+ '<td class="x-grid3-hd x-grid3-gcell x-grid3-td-{id} ux-grid-hd-group-row-{row} ' + this.colHeaderCellCls + '" style="{style}">',
+ '<div {tooltip} class="x-grid3-hd-inner x-grid3-hd-{id} x-unselectable" unselectable="on" style="{istyle}">',
+ this.grid.enableHdMenu ? '<a class="x-grid3-hd-btn" href="#"></a>' : '', '{value}',
+ '</div>',
+ '</td>'
+ );
+ }
+
+ this.templates = templates;
+ this.hrowRe = new RegExp("ux-grid-hd-group-row-(\\d+)", "");
+ },
+
+
+ initElements: function() {
+ Ext.grid.PivotGridView.superclass.initElements.apply(this, arguments);
+
+
+ this.rowHeadersEl = new Ext.Element(this.scroller.child('div.x-grid3-row-headers'));
+
+
+ this.headerTitleEl = new Ext.Element(this.mainHd.child('div.x-grid3-header-title'));
+ },
+
+
+ getGridInnerWidth: function() {
+ var previousWidth = Ext.grid.PivotGridView.superclass.getGridInnerWidth.apply(this, arguments);
+
+ return previousWidth - this.getTotalRowHeaderWidth();
+ },
+
+
+ getTotalRowHeaderWidth: function() {
+ var headers = this.getRowHeaders(),
+ length = headers.length,
+ total = 0,
+ i;
+
+ for (i = 0; i< length; i++) {
+ total += headers[i].width;
+ }
+
+ return total;
+ },
+
+
+ getTotalColumnHeaderHeight: function() {
+ return this.getColumnHeaders().length * 21;
+ },
+
+
+ getCellIndex : function(el) {
+ if (el) {
+ var match = el.className.match(this.colRe),
+ data;
+
+ if (match && (data = match[1])) {
+ return parseInt(data.split('-')[1], 10);
+ }
+ }
+ return false;
+ },
+
+
+
+ renderUI : function() {
+ var templates = this.templates,
+ innerWidth = this.getGridInnerWidth();
+
+ return templates.master.apply({
+ body : templates.body.apply({rows:'&#160;'}),
+ ostyle: 'width:' + innerWidth + 'px',
+ bstyle: 'width:' + innerWidth + 'px'
+ });
+ },
+
+
+ onLayout: function(width, height) {
+ Ext.grid.PivotGridView.superclass.onLayout.apply(this, arguments);
+
+ var width = this.getGridInnerWidth();
+
+ this.resizeColumnHeaders(width);
+ this.resizeAllRows(width);
+ },
+
+
+ refresh : function(headersToo) {
+ this.fireEvent('beforerefresh', this);
+ this.grid.stopEditing(true);
+
+ var result = this.renderBody();
+ this.mainBody.update(result).setWidth(this.getGridInnerWidth());
+ if (headersToo === true) {
+ this.updateHeaders();
+ this.updateHeaderSortState();
+ }
+ this.processRows(0, true);
+ this.layout();
+ this.applyEmptyText();
+ this.fireEvent('refresh', this);
+ },
+
+
+ renderHeaders: Ext.emptyFn,
+
+
+ fitColumns: Ext.emptyFn,
+
+
+ resizeColumnHeaders: function(width) {
+ var topAxis = this.grid.topAxis;
+
+ if (topAxis.rendered) {
+ topAxis.el.setWidth(width);
+ }
+ },
+
+
+ resizeRowHeaders: function() {
+ var rowHeaderWidth = this.getTotalRowHeaderWidth(),
+ marginStyle = String.format("margin-left: {0}px;", rowHeaderWidth);
+
+ this.rowHeadersEl.setWidth(rowHeaderWidth);
+ this.mainBody.applyStyles(marginStyle);
+ Ext.fly(this.innerHd).applyStyles(marginStyle);
+
+ this.headerTitleEl.setWidth(rowHeaderWidth);
+ this.headerTitleEl.setHeight(this.getTotalColumnHeaderHeight());
+ },
+
+
+ resizeAllRows: function(width) {
+ var rows = this.getRows(),
+ length = rows.length,
+ i;
+
+ for (i = 0; i < length; i++) {
+ Ext.fly(rows[i]).setWidth(width);
+ Ext.fly(rows[i]).child('table').setWidth(width);
+ }
+ },
+
+
+ updateHeaders: function() {
+ this.renderGroupRowHeaders();
+ this.renderGroupColumnHeaders();
+ },
+
+
+ renderGroupRowHeaders: function() {
+ var leftAxis = this.grid.leftAxis;
+
+ this.resizeRowHeaders();
+ leftAxis.rendered = false;
+ leftAxis.render(this.rowHeadersEl);
+
+ this.setTitle(this.title);
+ },
+
+
+ setTitle: function(title) {
+ this.headerTitleEl.child('span').dom.innerHTML = title;
+ },
+
+
+ renderGroupColumnHeaders: function() {
+ var topAxis = this.grid.topAxis;
+
+ topAxis.rendered = false;
+ topAxis.render(this.innerHd.firstChild);
+ },
+
+
+ isMenuDisabled: function(cellIndex, el) {
+ return true;
+ }
+});
+Ext.grid.PivotAxis = Ext.extend(Ext.Component, {
+
+ orientation: 'horizontal',
+
+
+ defaultHeaderWidth: 80,
+
+
+ paddingWidth: 7,
+
+
+ setDimensions: function(dimensions) {
+ this.dimensions = dimensions;
+ },
+
+
+ onRender: function(ct, position) {
+ var rows = this.orientation == 'horizontal'
+ ? this.renderHorizontalRows()
+ : this.renderVerticalRows();
+
+ this.el = Ext.DomHelper.overwrite(ct.dom, {tag: 'table', cn: rows}, true);
+ },
+
+
+ renderHorizontalRows: function() {
+ var headers = this.buildHeaders(),
+ rowCount = headers.length,
+ rows = [],
+ cells, cols, colCount, i, j;
+
+ for (i = 0; i < rowCount; i++) {
+ cells = [];
+ cols = headers[i].items;
+ colCount = cols.length;
+
+ for (j = 0; j < colCount; j++) {
+ cells.push({
+ tag: 'td',
+ html: cols[j].header,
+ colspan: cols[j].span
+ });
+ }
+
+ rows[i] = {
+ tag: 'tr',
+ cn: cells
+ };
+ }
+
+ return rows;
+ },
+
+
+ renderVerticalRows: function() {
+ var headers = this.buildHeaders(),
+ colCount = headers.length,
+ rowCells = [],
+ rows = [],
+ rowCount, col, row, colWidth, i, j;
+
+ for (i = 0; i < colCount; i++) {
+ col = headers[i];
+ colWidth = col.width || 80;
+ rowCount = col.items.length;
+
+ for (j = 0; j < rowCount; j++) {
+ row = col.items[j];
+
+ rowCells[row.start] = rowCells[row.start] || [];
+ rowCells[row.start].push({
+ tag : 'td',
+ html : row.header,
+ rowspan: row.span,
+ width : Ext.isBorderBox ? colWidth : colWidth - this.paddingWidth
+ });
+ }
+ }
+
+ rowCount = rowCells.length;
+ for (i = 0; i < rowCount; i++) {
+ rows[i] = {
+ tag: 'tr',
+ cn : rowCells[i]
+ };
+ }
+
+ return rows;
+ },
+
+
+ getTuples: function() {
+ var newStore = new Ext.data.Store({});
+
+ newStore.data = this.store.data.clone();
+ newStore.fields = this.store.fields;
+
+ var sorters = [],
+ dimensions = this.dimensions,
+ length = dimensions.length,
+ i;
+
+ for (i = 0; i < length; i++) {
+ sorters.push({
+ field : dimensions[i].dataIndex,
+ direction: dimensions[i].direction || 'ASC'
+ });
+ }
+
+ newStore.sort(sorters);
+
+ var records = newStore.data.items,
+ hashes = [],
+ tuples = [],
+ recData, hash, info, data, key;
+
+ length = records.length;
+
+ for (i = 0; i < length; i++) {
+ info = this.getRecordInfo(records[i]);
+ data = info.data;
+ hash = "";
+
+ for (key in data) {
+ hash += data[key] + '---';
+ }
+
+ if (hashes.indexOf(hash) == -1) {
+ hashes.push(hash);
+ tuples.push(info);
+ }
+ }
+
+ newStore.destroy();
+
+ return tuples;
+ },
+
+
+ getRecordInfo: function(record) {
+ var dimensions = this.dimensions,
+ length = dimensions.length,
+ data = {},
+ dimension, dataIndex, i;
+
+
+ for (i = 0; i < length; i++) {
+ dimension = dimensions[i];
+ dataIndex = dimension.dataIndex;
+
+ data[dataIndex] = record.get(dataIndex);
+ }
+
+
+
+ var createMatcherFunction = function(data) {
+ return function(record) {
+ for (var dataIndex in data) {
+ if (record.get(dataIndex) != data[dataIndex]) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+ };
+
+ return {
+ data: data,
+ matcher: createMatcherFunction(data)
+ };
+ },
+
+
+ buildHeaders: function() {
+ var tuples = this.getTuples(),
+ rowCount = tuples.length,
+ dimensions = this.dimensions,
+ dimension,
+ colCount = dimensions.length,
+ headers = [],
+ tuple, rows, currentHeader, previousHeader, span, start, isLast, changed, i, j;
+
+ for (i = 0; i < colCount; i++) {
+ dimension = dimensions[i];
+ rows = [];
+ span = 0;
+ start = 0;
+
+ for (j = 0; j < rowCount; j++) {
+ tuple = tuples[j];
+ isLast = j == (rowCount - 1);
+ currentHeader = tuple.data[dimension.dataIndex];
+
+
+ changed = previousHeader != undefined && previousHeader != currentHeader;
+ if (i > 0 && j > 0) {
+ changed = changed || tuple.data[dimensions[i-1].dataIndex] != tuples[j-1].data[dimensions[i-1].dataIndex];
+ }
+
+ if (changed) {
+ rows.push({
+ header: previousHeader,
+ span : span,
+ start : start
+ });
+
+ start += span;
+ span = 0;
+ }
+
+ if (isLast) {
+ rows.push({
+ header: currentHeader,
+ span : span + 1,
+ start : start
+ });
+
+ start += span;
+ span = 0;
+ }
+
+ previousHeader = currentHeader;
+ span++;
+ }
+
+ headers.push({
+ items: rows,
+ width: dimension.width || this.defaultHeaderWidth
+ });
+
+ previousHeader = undefined;
+ }
+
+ return headers;
+ }
+});
+
+
+Ext.grid.HeaderDragZone = Ext.extend(Ext.dd.DragZone, {
+ maxDragWidth: 120,
+
+ constructor : function(grid, hd, hd2){
+ this.grid = grid;
+ this.view = grid.getView();
+ this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
+ Ext.grid.HeaderDragZone.superclass.constructor.call(this, hd);
+ if(hd2){
+ this.setHandleElId(Ext.id(hd));
+ this.setOuterHandleElId(Ext.id(hd2));
+ }
+ this.scroll = false;
+ },
+
+ getDragData : function(e){
+ var t = Ext.lib.Event.getTarget(e),
+ h = this.view.findHeaderCell(t);
+ if(h){
+ return {ddel: h.firstChild, header:h};
+ }
+ return false;
+ },
+
+ onInitDrag : function(e){
+
+ this.dragHeadersDisabled = this.view.headersDisabled;
+ this.view.headersDisabled = true;
+ var clone = this.dragData.ddel.cloneNode(true);
+ clone.id = Ext.id();
+ clone.style.width = Math.min(this.dragData.header.offsetWidth,this.maxDragWidth) + "px";
+ this.proxy.update(clone);
+ return true;
+ },
+
+ afterValidDrop : function(){
+ this.completeDrop();
+ },
+
+ afterInvalidDrop : function(){
+ this.completeDrop();
+ },
+
+ completeDrop: function(){
+ var v = this.view,
+ disabled = this.dragHeadersDisabled;
+ setTimeout(function(){
+ v.headersDisabled = disabled;
+ }, 50);
+ }
+});
+
+
+
+Ext.grid.HeaderDropZone = Ext.extend(Ext.dd.DropZone, {
+ proxyOffsets : [-4, -9],
+ fly: Ext.Element.fly,
+
+ constructor : function(grid, hd, hd2){
+ this.grid = grid;
+ this.view = grid.getView();
+
+ this.proxyTop = Ext.DomHelper.append(document.body, {
+ cls:"col-move-top", html:"&#160;"
+ }, true);
+ this.proxyBottom = Ext.DomHelper.append(document.body, {
+ cls:"col-move-bottom", html:"&#160;"
+ }, true);
+ this.proxyTop.hide = this.proxyBottom.hide = function(){
+ this.setLeftTop(-100,-100);
+ this.setStyle("visibility", "hidden");
+ };
+ this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
+
+
+ Ext.grid.HeaderDropZone.superclass.constructor.call(this, grid.getGridEl().dom);
+ },
+
+ getTargetFromEvent : function(e){
+ var t = Ext.lib.Event.getTarget(e),
+ cindex = this.view.findCellIndex(t);
+ if(cindex !== false){
+ return this.view.getHeaderCell(cindex);
+ }
+ },
+
+ nextVisible : function(h){
+ var v = this.view, cm = this.grid.colModel;
+ h = h.nextSibling;
+ while(h){
+ if(!cm.isHidden(v.getCellIndex(h))){
+ return h;
+ }
+ h = h.nextSibling;
+ }
+ return null;
+ },
+
+ prevVisible : function(h){
+ var v = this.view, cm = this.grid.colModel;
+ h = h.prevSibling;
+ while(h){
+ if(!cm.isHidden(v.getCellIndex(h))){
+ return h;
+ }
+ h = h.prevSibling;
+ }
+ return null;
+ },
+
+ positionIndicator : function(h, n, e){
+ var x = Ext.lib.Event.getPageX(e),
+ r = Ext.lib.Dom.getRegion(n.firstChild),
+ px,
+ pt,
+ py = r.top + this.proxyOffsets[1];
+ if((r.right - x) <= (r.right-r.left)/2){
+ px = r.right+this.view.borderWidth;
+ pt = "after";
+ }else{
+ px = r.left;
+ pt = "before";
+ }
+
+ if(this.grid.colModel.isFixed(this.view.getCellIndex(n))){
+ return false;
+ }
+
+ px += this.proxyOffsets[0];
+ this.proxyTop.setLeftTop(px, py);
+ this.proxyTop.show();
+ if(!this.bottomOffset){
+ this.bottomOffset = this.view.mainHd.getHeight();
+ }
+ this.proxyBottom.setLeftTop(px, py+this.proxyTop.dom.offsetHeight+this.bottomOffset);
+ this.proxyBottom.show();
+ return pt;
+ },
+
+ onNodeEnter : function(n, dd, e, data){
+ if(data.header != n){
+ this.positionIndicator(data.header, n, e);
+ }
+ },
+
+ onNodeOver : function(n, dd, e, data){
+ var result = false;
+ if(data.header != n){
+ result = this.positionIndicator(data.header, n, e);
+ }
+ if(!result){
+ this.proxyTop.hide();
+ this.proxyBottom.hide();
+ }
+ return result ? this.dropAllowed : this.dropNotAllowed;
+ },
+
+ onNodeOut : function(n, dd, e, data){
+ this.proxyTop.hide();
+ this.proxyBottom.hide();
+ },
+
+ onNodeDrop : function(n, dd, e, data){
+ var h = data.header;
+ if(h != n){
+ var cm = this.grid.colModel,
+ x = Ext.lib.Event.getPageX(e),
+ r = Ext.lib.Dom.getRegion(n.firstChild),
+ pt = (r.right - x) <= ((r.right-r.left)/2) ? "after" : "before",
+ oldIndex = this.view.getCellIndex(h),
+ newIndex = this.view.getCellIndex(n);
+ if(pt == "after"){
+ newIndex++;
+ }
+ if(oldIndex < newIndex){
+ newIndex--;
+ }
+ cm.moveColumn(oldIndex, newIndex);
+ return true;
+ }
+ return false;
+ }
+});
+
+Ext.grid.GridView.ColumnDragZone = Ext.extend(Ext.grid.HeaderDragZone, {
+
+ constructor : function(grid, hd){
+ Ext.grid.GridView.ColumnDragZone.superclass.constructor.call(this, grid, hd, null);
+ this.proxy.el.addClass('x-grid3-col-dd');
+ },
+
+ handleMouseDown : function(e){
+ },
+
+ callHandleMouseDown : function(e){
+ Ext.grid.GridView.ColumnDragZone.superclass.handleMouseDown.call(this, e);
+ }
+});
+
+Ext.grid.SplitDragZone = Ext.extend(Ext.dd.DDProxy, {
+ fly: Ext.Element.fly,
+
+ constructor : function(grid, hd, hd2){
+ this.grid = grid;
+ this.view = grid.getView();
+ this.proxy = this.view.resizeProxy;
+ Ext.grid.SplitDragZone.superclass.constructor.call(this, hd,
+ "gridSplitters" + this.grid.getGridEl().id, {
+ dragElId : Ext.id(this.proxy.dom), resizeFrame:false
+ });
+ this.setHandleElId(Ext.id(hd));
+ this.setOuterHandleElId(Ext.id(hd2));
+ this.scroll = false;
+ },
+
+ b4StartDrag : function(x, y){
+ this.view.headersDisabled = true;
+ this.proxy.setHeight(this.view.mainWrap.getHeight());
+ var w = this.cm.getColumnWidth(this.cellIndex);
+ var minw = Math.max(w-this.grid.minColumnWidth, 0);
+ this.resetConstraints();
+ this.setXConstraint(minw, 1000);
+ this.setYConstraint(0, 0);
+ this.minX = x - minw;
+ this.maxX = x + 1000;
+ this.startPos = x;
+ Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y);
+ },
+
+
+ handleMouseDown : function(e){
+ var ev = Ext.EventObject.setEvent(e);
+ var t = this.fly(ev.getTarget());
+ if(t.hasClass("x-grid-split")){
+ this.cellIndex = this.view.getCellIndex(t.dom);
+ this.split = t.dom;
+ this.cm = this.grid.colModel;
+ if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){
+ Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this, arguments);
+ }
+ }
+ },
+
+ endDrag : function(e){
+ this.view.headersDisabled = false;
+ var endX = Math.max(this.minX, Ext.lib.Event.getPageX(e));
+ var diff = endX - this.startPos;
+ this.view.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff);
+ },
+
+ autoOffset : function(){
+ this.setDelta(0,0);
+ }
+});
+Ext.grid.GridDragZone = function(grid, config){
+ this.view = grid.getView();
+ Ext.grid.GridDragZone.superclass.constructor.call(this, this.view.mainBody.dom, config);
+ this.scroll = false;
+ this.grid = grid;
+ this.ddel = document.createElement('div');
+ this.ddel.className = 'x-grid-dd-wrap';
+
+ this.preventDefault = true;
+};
+
+Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, {
+ ddGroup : "GridDD",
+
+
+ getDragData : function(e){
+ var t = Ext.lib.Event.getTarget(e),
+ sm,
+ rowIndex = this.view.findRowIndex(t),
+ cellIndex,
+ selectedCell,
+ selection;
+
+ if (rowIndex !== false){
+ sm = this.grid.selModel;
+
+
+
+ if (sm.getSelectedCell) {
+ cellIndex = this.view.findCellIndex(t);
+ selectedCell = sm.getSelectedCell();
+ if (!selectedCell || selectedCell[0] !== rowIndex || selectedCell[1] !== cellIndex) {
+ sm.handleMouseDown(this.grid, rowIndex, cellIndex, e);
+ }
+ if (this.grid.dragCell) {
+
+ selection = sm.getSelectedCell();
+ if (!this.grid.hasOwnProperty('ddText')) {
+ this.grid.ddText = '{0} selected cell{1}';
+ }
+ } else {
+
+ selection = [this.grid.store.getAt(rowIndex)];
+ }
+ } else {
+ if(!sm.isSelected(rowIndex) || e.hasModifier()){
+ sm.handleMouseDown(this.grid, rowIndex, e);
+ }
+ selection = sm.getSelections();
+ }
+ return {grid: this.grid, ddel: this.ddel, rowIndex: rowIndex, selections: selection};
+ }
+ return false;
+ },
+
+
+ onInitDrag : function(e){
+ var data = this.dragData;
+ this.ddel.innerHTML = this.grid.getDragDropText();
+ this.proxy.update(this.ddel);
+
+ },
+
+
+ afterRepair : function(){
+ this.dragging = false;
+ },
+
+
+ getRepairXY : function(e, data){
+ return false;
+ },
+
+ onEndDrag : function(data, e){
+
+ },
+
+ onValidDrop : function(dd, e, id){
+
+ this.hideProxy();
+ },
+
+ beforeInvalidDrop : function(e, id){
+
+ }
+});
+
+Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, {
+
+ defaultWidth: 100,
+
+
+ defaultSortable: false,
+
+
+
+
+
+ constructor : function(config) {
+
+ if (config.columns) {
+ Ext.apply(this, config);
+ this.setConfig(config.columns, true);
+ } else {
+ this.setConfig(config, true);
+ }
+
+ this.addEvents(
+
+ "widthchange",
+
+
+ "headerchange",
+
+
+ "hiddenchange",
+
+
+ "columnmoved",
+
+
+ "configchange"
+ );
+
+ Ext.grid.ColumnModel.superclass.constructor.call(this);
+ },
+
+
+ getColumnId : function(index) {
+ return this.config[index].id;
+ },
+
+ getColumnAt : function(index) {
+ return this.config[index];
+ },
+
+
+ setConfig : function(config, initial) {
+ var i, c, len;
+
+ if (!initial) {
+ delete this.totalWidth;
+
+ for (i = 0, len = this.config.length; i < len; i++) {
+ c = this.config[i];
+
+ if (c.setEditor) {
+
+ c.setEditor(null);
+ }
+ }
+ }
+
+
+ this.defaults = Ext.apply({
+ width: this.defaultWidth,
+ sortable: this.defaultSortable
+ }, this.defaults);
+
+ this.config = config;
+ this.lookup = {};
+
+ for (i = 0, len = config.length; i < len; i++) {
+ c = Ext.applyIf(config[i], this.defaults);
+
+
+ if (Ext.isEmpty(c.id)) {
+ c.id = i;
+ }
+
+ if (!c.isColumn) {
+ var Cls = Ext.grid.Column.types[c.xtype || 'gridcolumn'];
+ c = new Cls(c);
+ config[i] = c;
+ }
+
+ this.lookup[c.id] = c;
+ }
+
+ if (!initial) {
+ this.fireEvent('configchange', this);
+ }
+ },
+
+
+ getColumnById : function(id) {
+ return this.lookup[id];
+ },
+
+
+ getIndexById : function(id) {
+ for (var i = 0, len = this.config.length; i < len; i++) {
+ if (this.config[i].id == id) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+
+ moveColumn : function(oldIndex, newIndex) {
+ var config = this.config,
+ c = config[oldIndex];
+
+ config.splice(oldIndex, 1);
+ config.splice(newIndex, 0, c);
+ this.dataMap = null;
+ this.fireEvent("columnmoved", this, oldIndex, newIndex);
+ },
+
+
+ getColumnCount : function(visibleOnly) {
+ var length = this.config.length,
+ c = 0,
+ i;
+
+ if (visibleOnly === true) {
+ for (i = 0; i < length; i++) {
+ if (!this.isHidden(i)) {
+ c++;
+ }
+ }
+
+ return c;
+ }
+
+ return length;
+ },
+
+
+ getColumnsBy : function(fn, scope) {
+ var config = this.config,
+ length = config.length,
+ result = [],
+ i, c;
+
+ for (i = 0; i < length; i++){
+ c = config[i];
+
+ if (fn.call(scope || this, c, i) === true) {
+ result[result.length] = c;
+ }
+ }
+
+ return result;
+ },
+
+
+ isSortable : function(col) {
+ return !!this.config[col].sortable;
+ },
+
+
+ isMenuDisabled : function(col) {
+ return !!this.config[col].menuDisabled;
+ },
+
+
+ getRenderer : function(col) {
+ return this.config[col].renderer || Ext.grid.ColumnModel.defaultRenderer;
+ },
+
+ getRendererScope : function(col) {
+ return this.config[col].scope;
+ },
+
+
+ setRenderer : function(col, fn) {
+ this.config[col].renderer = fn;
+ },
+
+
+ getColumnWidth : function(col) {
+ var width = this.config[col].width;
+ if(typeof width != 'number'){
+ width = this.defaultWidth;
+ }
+ return width;
+ },
+
+
+ setColumnWidth : function(col, width, suppressEvent) {
+ this.config[col].width = width;
+ this.totalWidth = null;
+
+ if (!suppressEvent) {
+ this.fireEvent("widthchange", this, col, width);
+ }
+ },
+
+
+ getTotalWidth : function(includeHidden) {
+ if (!this.totalWidth) {
+ this.totalWidth = 0;
+ for (var i = 0, len = this.config.length; i < len; i++) {
+ if (includeHidden || !this.isHidden(i)) {
+ this.totalWidth += this.getColumnWidth(i);
+ }
+ }
+ }
+ return this.totalWidth;
+ },
+
+
+ getColumnHeader : function(col) {
+ return this.config[col].header;
+ },
+
+
+ setColumnHeader : function(col, header) {
+ this.config[col].header = header;
+ this.fireEvent("headerchange", this, col, header);
+ },
+
+
+ getColumnTooltip : function(col) {
+ return this.config[col].tooltip;
+ },
+
+ setColumnTooltip : function(col, tooltip) {
+ this.config[col].tooltip = tooltip;
+ },
+
+
+ getDataIndex : function(col) {
+ return this.config[col].dataIndex;
+ },
+
+
+ setDataIndex : function(col, dataIndex) {
+ this.config[col].dataIndex = dataIndex;
+ },
+
+
+ findColumnIndex : function(dataIndex) {
+ var c = this.config;
+ for(var i = 0, len = c.length; i < len; i++){
+ if(c[i].dataIndex == dataIndex){
+ return i;
+ }
+ }
+ return -1;
+ },
+
+
+ isCellEditable : function(colIndex, rowIndex) {
+ var c = this.config[colIndex],
+ ed = c.editable;
+
+
+ return !!(ed || (!Ext.isDefined(ed) && c.editor));
+ },
+
+
+ getCellEditor : function(colIndex, rowIndex) {
+ return this.config[colIndex].getCellEditor(rowIndex);
+ },
+
+
+ setEditable : function(col, editable) {
+ this.config[col].editable = editable;
+ },
+
+
+ isHidden : function(colIndex) {
+ return !!this.config[colIndex].hidden;
+ },
+
+
+ isFixed : function(colIndex) {
+ return !!this.config[colIndex].fixed;
+ },
+
+
+ isResizable : function(colIndex) {
+ return colIndex >= 0 && this.config[colIndex].resizable !== false && this.config[colIndex].fixed !== true;
+ },
+
+
+ setHidden : function(colIndex, hidden) {
+ var c = this.config[colIndex];
+ if(c.hidden !== hidden){
+ c.hidden = hidden;
+ this.totalWidth = null;
+ this.fireEvent("hiddenchange", this, colIndex, hidden);
+ }
+ },
+
+
+ setEditor : function(col, editor) {
+ this.config[col].setEditor(editor);
+ },
+
+
+ destroy : function() {
+ var length = this.config.length,
+ i = 0;
+
+ for (; i < length; i++){
+ this.config[i].destroy();
+ }
+ delete this.config;
+ delete this.lookup;
+ this.purgeListeners();
+ },
+
+
+ setState : function(col, state) {
+ state = Ext.applyIf(state, this.defaults);
+ Ext.apply(this.config[col], state);
+ }
+});
+
+
+Ext.grid.ColumnModel.defaultRenderer = function(value) {
+ if (typeof value == "string" && value.length < 1) {
+ return "&#160;";
+ }
+ return value;
+};
+Ext.grid.AbstractSelectionModel = Ext.extend(Ext.util.Observable, {
+
+
+ constructor : function(){
+ this.locked = false;
+ Ext.grid.AbstractSelectionModel.superclass.constructor.call(this);
+ },
+
+
+ init : function(grid){
+ this.grid = grid;
+ if(this.lockOnInit){
+ delete this.lockOnInit;
+ this.locked = false;
+ this.lock();
+ }
+ this.initEvents();
+ },
+
+
+ lock : function(){
+ if(!this.locked){
+ this.locked = true;
+
+ var g = this.grid;
+ if(g){
+ g.getView().on({
+ scope: this,
+ beforerefresh: this.sortUnLock,
+ refresh: this.sortLock
+ });
+ }else{
+ this.lockOnInit = true;
+ }
+ }
+ },
+
+
+ sortLock : function() {
+ this.locked = true;
+ },
+
+
+ sortUnLock : function() {
+ this.locked = false;
+ },
+
+
+ unlock : function(){
+ if(this.locked){
+ this.locked = false;
+ var g = this.grid,
+ gv;
+
+
+ if(g){
+ gv = g.getView();
+ gv.un('beforerefresh', this.sortUnLock, this);
+ gv.un('refresh', this.sortLock, this);
+ }else{
+ delete this.lockOnInit;
+ }
+ }
+ },
+
+
+ isLocked : function(){
+ return this.locked;
+ },
+
+ destroy: function(){
+ this.unlock();
+ this.purgeListeners();
+ }
+});
+Ext.grid.RowSelectionModel = Ext.extend(Ext.grid.AbstractSelectionModel, {
+
+ singleSelect : false,
+
+ constructor : function(config){
+ Ext.apply(this, config);
+ this.selections = new Ext.util.MixedCollection(false, function(o){
+ return o.id;
+ });
+
+ this.last = false;
+ this.lastActive = false;
+
+ this.addEvents(
+
+ 'selectionchange',
+
+ 'beforerowselect',
+
+ 'rowselect',
+
+ 'rowdeselect'
+ );
+ Ext.grid.RowSelectionModel.superclass.constructor.call(this);
+ },
+
+
+
+ initEvents : function(){
+
+ if(!this.grid.enableDragDrop && !this.grid.enableDrag){
+ this.grid.on('rowmousedown', this.handleMouseDown, this);
+ }
+
+ this.rowNav = new Ext.KeyNav(this.grid.getGridEl(), {
+ up: this.onKeyPress,
+ down: this.onKeyPress,
+ scope: this
+ });
+
+ this.grid.getView().on({
+ scope: this,
+ refresh: this.onRefresh,
+ rowupdated: this.onRowUpdated,
+ rowremoved: this.onRemove
+ });
+ },
+
+ onKeyPress : function(e, name){
+ var up = name == 'up',
+ method = up ? 'selectPrevious' : 'selectNext',
+ add = up ? -1 : 1,
+ last;
+ if(!e.shiftKey || this.singleSelect){
+ this[method](false);
+ }else if(this.last !== false && this.lastActive !== false){
+ last = this.last;
+ this.selectRange(this.last, this.lastActive + add);
+ this.grid.getView().focusRow(this.lastActive);
+ if(last !== false){
+ this.last = last;
+ }
+ }else{
+ this.selectFirstRow();
+ }
+ },
+
+
+ onRefresh : function(){
+ var ds = this.grid.store,
+ s = this.getSelections(),
+ i = 0,
+ len = s.length,
+ index, r;
+
+ this.silent = true;
+ this.clearSelections(true);
+ for(; i < len; i++){
+ r = s[i];
+ if((index = ds.indexOfId(r.id)) != -1){
+ this.selectRow(index, true);
+ }
+ }
+ if(s.length != this.selections.getCount()){
+ this.fireEvent('selectionchange', this);
+ }
+ this.silent = false;
+ },
+
+
+ onRemove : function(v, index, r){
+ if(this.selections.remove(r) !== false){
+ this.fireEvent('selectionchange', this);
+ }
+ },
+
+
+ onRowUpdated : function(v, index, r){
+ if(this.isSelected(r)){
+ v.onRowSelect(index);
+ }
+ },
+
+
+ selectRecords : function(records, keepExisting){
+ if(!keepExisting){
+ this.clearSelections();
+ }
+ var ds = this.grid.store,
+ i = 0,
+ len = records.length;
+ for(; i < len; i++){
+ this.selectRow(ds.indexOf(records[i]), true);
+ }
+ },
+
+
+ getCount : function(){
+ return this.selections.length;
+ },
+
+
+ selectFirstRow : function(){
+ this.selectRow(0);
+ },
+
+
+ selectLastRow : function(keepExisting){
+ this.selectRow(this.grid.store.getCount() - 1, keepExisting);
+ },
+
+
+ selectNext : function(keepExisting){
+ if(this.hasNext()){
+ this.selectRow(this.last+1, keepExisting);
+ this.grid.getView().focusRow(this.last);
+ return true;
+ }
+ return false;
+ },
+
+
+ selectPrevious : function(keepExisting){
+ if(this.hasPrevious()){
+ this.selectRow(this.last-1, keepExisting);
+ this.grid.getView().focusRow(this.last);
+ return true;
+ }
+ return false;
+ },
+
+
+ hasNext : function(){
+ return this.last !== false && (this.last+1) < this.grid.store.getCount();
+ },
+
+
+ hasPrevious : function(){
+ return !!this.last;
+ },
+
+
+
+ getSelections : function(){
+ return [].concat(this.selections.items);
+ },
+
+
+ getSelected : function(){
+ return this.selections.itemAt(0);
+ },
+
+
+ each : function(fn, scope){
+ var s = this.getSelections(),
+ i = 0,
+ len = s.length;
+
+ for(; i < len; i++){
+ if(fn.call(scope || this, s[i], i) === false){
+ return false;
+ }
+ }
+ return true;
+ },
+
+
+ clearSelections : function(fast){
+ if(this.isLocked()){
+ return;
+ }
+ if(fast !== true){
+ var ds = this.grid.store,
+ s = this.selections;
+ s.each(function(r){
+ this.deselectRow(ds.indexOfId(r.id));
+ }, this);
+ s.clear();
+ }else{
+ this.selections.clear();
+ }
+ this.last = false;
+ },
+
+
+
+ selectAll : function(){
+ if(this.isLocked()){
+ return;
+ }
+ this.selections.clear();
+ for(var i = 0, len = this.grid.store.getCount(); i < len; i++){
+ this.selectRow(i, true);
+ }
+ },
+
+
+ hasSelection : function(){
+ return this.selections.length > 0;
+ },
+
+
+ isSelected : function(index){
+ var r = Ext.isNumber(index) ? this.grid.store.getAt(index) : index;
+ return (r && this.selections.key(r.id) ? true : false);
+ },
+
+
+ isIdSelected : function(id){
+ return (this.selections.key(id) ? true : false);
+ },
+
+
+ handleMouseDown : function(g, rowIndex, e){
+ if(e.button !== 0 || this.isLocked()){
+ return;
+ }
+ var view = this.grid.getView();
+ if(e.shiftKey && !this.singleSelect && this.last !== false){
+ var last = this.last;
+ this.selectRange(last, rowIndex, e.ctrlKey);
+ this.last = last;
+ view.focusRow(rowIndex);
+ }else{
+ var isSelected = this.isSelected(rowIndex);
+ if(e.ctrlKey && isSelected){
+ this.deselectRow(rowIndex);
+ }else if(!isSelected || this.getCount() > 1){
+ this.selectRow(rowIndex, e.ctrlKey || e.shiftKey);
+ view.focusRow(rowIndex);
+ }
+ }
+ },
+
+
+ selectRows : function(rows, keepExisting){
+ if(!keepExisting){
+ this.clearSelections();
+ }
+ for(var i = 0, len = rows.length; i < len; i++){
+ this.selectRow(rows[i], true);
+ }
+ },
+
+
+ selectRange : function(startRow, endRow, keepExisting){
+ var i;
+ if(this.isLocked()){
+ return;
+ }
+ if(!keepExisting){
+ this.clearSelections();
+ }
+ if(startRow <= endRow){
+ for(i = startRow; i <= endRow; i++){
+ this.selectRow(i, true);
+ }
+ }else{
+ for(i = startRow; i >= endRow; i--){
+ this.selectRow(i, true);
+ }
+ }
+ },
+
+
+ deselectRange : function(startRow, endRow, preventViewNotify){
+ if(this.isLocked()){
+ return;
+ }
+ for(var i = startRow; i <= endRow; i++){
+ this.deselectRow(i, preventViewNotify);
+ }
+ },
+
+
+ selectRow : function(index, keepExisting, preventViewNotify){
+ if(this.isLocked() || (index < 0 || index >= this.grid.store.getCount()) || (keepExisting && this.isSelected(index))){
+ return;
+ }
+ var r = this.grid.store.getAt(index);
+ if(r && this.fireEvent('beforerowselect', this, index, keepExisting, r) !== false){
+ if(!keepExisting || this.singleSelect){
+ this.clearSelections();
+ }
+ this.selections.add(r);
+ this.last = this.lastActive = index;
+ if(!preventViewNotify){
+ this.grid.getView().onRowSelect(index);
+ }
+ if(!this.silent){
+ this.fireEvent('rowselect', this, index, r);
+ this.fireEvent('selectionchange', this);
+ }
+ }
+ },
+
+
+ deselectRow : function(index, preventViewNotify){
+ if(this.isLocked()){
+ return;
+ }
+ if(this.last == index){
+ this.last = false;
+ }
+ if(this.lastActive == index){
+ this.lastActive = false;
+ }
+ var r = this.grid.store.getAt(index);
+ if(r){
+ this.selections.remove(r);
+ if(!preventViewNotify){
+ this.grid.getView().onRowDeselect(index);
+ }
+ this.fireEvent('rowdeselect', this, index, r);
+ this.fireEvent('selectionchange', this);
+ }
+ },
+
+
+ acceptsNav : function(row, col, cm){
+ return !cm.isHidden(col) && cm.isCellEditable(col, row);
+ },
+
+
+ onEditorKey : function(field, e){
+ var k = e.getKey(),
+ newCell,
+ g = this.grid,
+ last = g.lastEdit,
+ ed = g.activeEditor,
+ shift = e.shiftKey,
+ ae, last, r, c;
+
+ if(k == e.TAB){
+ e.stopEvent();
+ ed.completeEdit();
+ if(shift){
+ newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this);
+ }else{
+ newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this);
+ }
+ }else if(k == e.ENTER){
+ if(this.moveEditorOnEnter !== false){
+ if(shift){
+ newCell = g.walkCells(last.row - 1, last.col, -1, this.acceptsNav, this);
+ }else{
+ newCell = g.walkCells(last.row + 1, last.col, 1, this.acceptsNav, this);
+ }
+ }
+ }
+ if(newCell){
+ r = newCell[0];
+ c = newCell[1];
+
+ this.onEditorSelect(r, last.row);
+
+ if(g.isEditor && g.editing){
+ ae = g.activeEditor;
+ if(ae && ae.field.triggerBlur){
+
+ ae.field.triggerBlur();
+ }
+ }
+ g.startEditing(r, c);
+ }
+ },
+
+ onEditorSelect: function(row, lastRow){
+ if(lastRow != row){
+ this.selectRow(row);
+ }
+ },
+
+ destroy : function(){
+ Ext.destroy(this.rowNav);
+ this.rowNav = null;
+ Ext.grid.RowSelectionModel.superclass.destroy.call(this);
+ }
+});
+
+Ext.grid.Column = Ext.extend(Ext.util.Observable, {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ isColumn : true,
+
+ constructor : function(config){
+ Ext.apply(this, config);
+
+ if(Ext.isString(this.renderer)){
+ this.renderer = Ext.util.Format[this.renderer];
+ }else if(Ext.isObject(this.renderer)){
+ this.scope = this.renderer.scope;
+ this.renderer = this.renderer.fn;
+ }
+ if(!this.scope){
+ this.scope = this;
+ }
+
+ var ed = this.editor;
+ delete this.editor;
+ this.setEditor(ed);
+ this.addEvents(
+
+ 'click',
+
+ 'contextmenu',
+
+ 'dblclick',
+
+ 'mousedown'
+ );
+ Ext.grid.Column.superclass.constructor.call(this);
+ },
+
+
+ processEvent : function(name, e, grid, rowIndex, colIndex){
+ return this.fireEvent(name, this, grid, rowIndex, e);
+ },
+
+
+ destroy: function() {
+ if(this.setEditor){
+ this.setEditor(null);
+ }
+ this.purgeListeners();
+ },
+
+
+ renderer : function(value){
+ return value;
+ },
+
+
+ getEditor: function(rowIndex){
+ return this.editable !== false ? this.editor : null;
+ },
+
+
+ setEditor : function(editor){
+ var ed = this.editor;
+ if(ed){
+ if(ed.gridEditor){
+ ed.gridEditor.destroy();
+ delete ed.gridEditor;
+ }else{
+ ed.destroy();
+ }
+ }
+ this.editor = null;
+ if(editor){
+
+ if(!editor.isXType){
+ editor = Ext.create(editor, 'textfield');
+ }
+ this.editor = editor;
+ }
+ },
+
+
+ getCellEditor: function(rowIndex){
+ var ed = this.getEditor(rowIndex);
+ if(ed){
+ if(!ed.startEdit){
+ if(!ed.gridEditor){
+ ed.gridEditor = new Ext.grid.GridEditor(ed);
+ }
+ ed = ed.gridEditor;
+ }
+ }
+ return ed;
+ }
+});
+
+
+Ext.grid.BooleanColumn = Ext.extend(Ext.grid.Column, {
+
+ trueText: 'true',
+
+ falseText: 'false',
+
+ undefinedText: '&#160;',
+
+ constructor: function(cfg){
+ Ext.grid.BooleanColumn.superclass.constructor.call(this, cfg);
+ var t = this.trueText, f = this.falseText, u = this.undefinedText;
+ this.renderer = function(v){
+ if(v === undefined){
+ return u;
+ }
+ if(!v || v === 'false'){
+ return f;
+ }
+ return t;
+ };
+ }
+});
+
+
+Ext.grid.NumberColumn = Ext.extend(Ext.grid.Column, {
+
+ format : '0,000.00',
+ constructor: function(cfg){
+ Ext.grid.NumberColumn.superclass.constructor.call(this, cfg);
+ this.renderer = Ext.util.Format.numberRenderer(this.format);
+ }
+});
+
+
+Ext.grid.DateColumn = Ext.extend(Ext.grid.Column, {
+
+ format : 'm/d/Y',
+ constructor: function(cfg){
+ Ext.grid.DateColumn.superclass.constructor.call(this, cfg);
+ this.renderer = Ext.util.Format.dateRenderer(this.format);
+ }
+});
+
+
+Ext.grid.TemplateColumn = Ext.extend(Ext.grid.Column, {
+
+ constructor: function(cfg){
+ Ext.grid.TemplateColumn.superclass.constructor.call(this, cfg);
+ var tpl = (!Ext.isPrimitive(this.tpl) && this.tpl.compile) ? this.tpl : new Ext.XTemplate(this.tpl);
+ this.renderer = function(value, p, r){
+ return tpl.apply(r.data);
+ };
+ this.tpl = tpl;
+ }
+});
+
+
+Ext.grid.ActionColumn = Ext.extend(Ext.grid.Column, {
+
+
+
+
+
+
+
+
+ header: '&#160;',
+
+ actionIdRe: /x-action-col-(\d+)/,
+
+
+ altText: '',
+
+ constructor: function(cfg) {
+ var me = this,
+ items = cfg.items || (me.items = [me]),
+ l = items.length,
+ i,
+ item;
+
+ Ext.grid.ActionColumn.superclass.constructor.call(me, cfg);
+
+
+
+ me.renderer = function(v, meta) {
+
+ v = Ext.isFunction(cfg.renderer) ? cfg.renderer.apply(this, arguments)||'' : '';
+
+ meta.css += ' x-action-col-cell';
+ for (i = 0; i < l; i++) {
+ item = items[i];
+ v += '<img alt="' + (item.altText || me.altText) + '" src="' + (item.icon || Ext.BLANK_IMAGE_URL) +
+ '" class="x-action-col-icon x-action-col-' + String(i) + ' ' + (item.iconCls || '') +
+ ' ' + (Ext.isFunction(item.getClass) ? item.getClass.apply(item.scope||this.scope||this, arguments) : '') + '"' +
+ ((item.tooltip) ? ' ext:qtip="' + item.tooltip + '"' : '') + ' />';
+ }
+ return v;
+ };
+ },
+
+ destroy: function() {
+ delete this.items;
+ delete this.renderer;
+ return Ext.grid.ActionColumn.superclass.destroy.apply(this, arguments);
+ },
+
+
+ processEvent : function(name, e, grid, rowIndex, colIndex){
+ var m = e.getTarget().className.match(this.actionIdRe),
+ item, fn;
+ if (m && (item = this.items[parseInt(m[1], 10)])) {
+ if (name == 'click') {
+ (fn = item.handler || this.handler) && fn.call(item.scope||this.scope||this, grid, rowIndex, colIndex, item, e);
+ } else if ((name == 'mousedown') && (item.stopSelection !== false)) {
+ return false;
+ }
+ }
+ return Ext.grid.ActionColumn.superclass.processEvent.apply(this, arguments);
+ }
+});
+
+
+Ext.grid.Column.types = {
+ gridcolumn : Ext.grid.Column,
+ booleancolumn: Ext.grid.BooleanColumn,
+ numbercolumn: Ext.grid.NumberColumn,
+ datecolumn: Ext.grid.DateColumn,
+ templatecolumn: Ext.grid.TemplateColumn,
+ actioncolumn: Ext.grid.ActionColumn
+};
+Ext.grid.RowNumberer = Ext.extend(Object, {
+
+ header: "",
+
+ width: 23,
+
+ sortable: false,
+
+ constructor : function(config){
+ Ext.apply(this, config);
+ if(this.rowspan){
+ this.renderer = this.renderer.createDelegate(this);
+ }
+ },
+
+
+ fixed:true,
+ hideable: false,
+ menuDisabled:true,
+ dataIndex: '',
+ id: 'numberer',
+ rowspan: undefined,
+
+
+ renderer : function(v, p, record, rowIndex){
+ if(this.rowspan){
+ p.cellAttr = 'rowspan="'+this.rowspan+'"';
+ }
+ return rowIndex+1;
+ }
+});
+Ext.grid.CheckboxSelectionModel = Ext.extend(Ext.grid.RowSelectionModel, {
+
+
+
+ header : '<div class="x-grid3-hd-checker">&#160;</div>',
+
+ width : 20,
+
+ sortable : false,
+
+
+ menuDisabled : true,
+ fixed : true,
+ hideable: false,
+ dataIndex : '',
+ id : 'checker',
+ isColumn: true,
+
+ constructor : function(){
+ Ext.grid.CheckboxSelectionModel.superclass.constructor.apply(this, arguments);
+ if(this.checkOnly){
+ this.handleMouseDown = Ext.emptyFn;
+ }
+ },
+
+
+ initEvents : function(){
+ Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);
+ this.grid.on('render', function(){
+ Ext.fly(this.grid.getView().innerHd).on('mousedown', this.onHdMouseDown, this);
+ }, this);
+ },
+
+
+ processEvent : function(name, e, grid, rowIndex, colIndex){
+ if (name == 'mousedown') {
+ this.onMouseDown(e, e.getTarget());
+ return false;
+ } else {
+ return Ext.grid.Column.prototype.processEvent.apply(this, arguments);
+ }
+ },
+
+
+ onMouseDown : function(e, t){
+ if(e.button === 0 && t.className == 'x-grid3-row-checker'){
+ e.stopEvent();
+ var row = e.getTarget('.x-grid3-row');
+ if(row){
+ var index = row.rowIndex;
+ if(this.isSelected(index)){
+ this.deselectRow(index);
+ }else{
+ this.selectRow(index, true);
+ this.grid.getView().focusRow(index);
+ }
+ }
+ }
+ },
+
+
+ onHdMouseDown : function(e, t) {
+ if(t.className == 'x-grid3-hd-checker'){
+ e.stopEvent();
+ var hd = Ext.fly(t.parentNode);
+ var isChecked = hd.hasClass('x-grid3-hd-checker-on');
+ if(isChecked){
+ hd.removeClass('x-grid3-hd-checker-on');
+ this.clearSelections();
+ }else{
+ hd.addClass('x-grid3-hd-checker-on');
+ this.selectAll();
+ }
+ }
+ },
+
+
+ renderer : function(v, p, record){
+ return '<div class="x-grid3-row-checker">&#160;</div>';
+ },
+
+ onEditorSelect: function(row, lastRow){
+ if(lastRow != row && !this.checkOnly){
+ this.selectRow(row);
+ }
+ }
+});
+Ext.grid.CellSelectionModel = Ext.extend(Ext.grid.AbstractSelectionModel, {
+
+ constructor : function(config){
+ Ext.apply(this, config);
+
+ this.selection = null;
+
+ this.addEvents(
+
+ "beforecellselect",
+
+ "cellselect",
+
+ "selectionchange"
+ );
+
+ Ext.grid.CellSelectionModel.superclass.constructor.call(this);
+ },
+
+
+ initEvents : function(){
+ this.grid.on('cellmousedown', this.handleMouseDown, this);
+ this.grid.on(Ext.EventManager.getKeyEvent(), this.handleKeyDown, this);
+ this.grid.getView().on({
+ scope: this,
+ refresh: this.onViewChange,
+ rowupdated: this.onRowUpdated,
+ beforerowremoved: this.clearSelections,
+ beforerowsinserted: this.clearSelections
+ });
+ if(this.grid.isEditor){
+ this.grid.on('beforeedit', this.beforeEdit, this);
+ }
+ },
+
+
+ beforeEdit : function(e){
+ this.select(e.row, e.column, false, true, e.record);
+ },
+
+
+ onRowUpdated : function(v, index, r){
+ if(this.selection && this.selection.record == r){
+ v.onCellSelect(index, this.selection.cell[1]);
+ }
+ },
+
+
+ onViewChange : function(){
+ this.clearSelections(true);
+ },
+
+
+ getSelectedCell : function(){
+ return this.selection ? this.selection.cell : null;
+ },
+
+
+ clearSelections : function(preventNotify){
+ var s = this.selection;
+ if(s){
+ if(preventNotify !== true){
+ this.grid.view.onCellDeselect(s.cell[0], s.cell[1]);
+ }
+ this.selection = null;
+ this.fireEvent("selectionchange", this, null);
+ }
+ },
+
+
+ hasSelection : function(){
+ return this.selection ? true : false;
+ },
+
+
+ handleMouseDown : function(g, row, cell, e){
+ if(e.button !== 0 || this.isLocked()){
+ return;
+ }
+ this.select(row, cell);
+ },
+
+
+ select : function(rowIndex, colIndex, preventViewNotify, preventFocus, r){
+ if(this.fireEvent("beforecellselect", this, rowIndex, colIndex) !== false){
+ this.clearSelections();
+ r = r || this.grid.store.getAt(rowIndex);
+ this.selection = {
+ record : r,
+ cell : [rowIndex, colIndex]
+ };
+ if(!preventViewNotify){
+ var v = this.grid.getView();
+ v.onCellSelect(rowIndex, colIndex);
+ if(preventFocus !== true){
+ v.focusCell(rowIndex, colIndex);
+ }
+ }
+ this.fireEvent("cellselect", this, rowIndex, colIndex);
+ this.fireEvent("selectionchange", this, this.selection);
+ }
+ },
+
+
+ isSelectable : function(rowIndex, colIndex, cm){
+ return !cm.isHidden(colIndex);
+ },
+
+
+ onEditorKey: function(field, e){
+ if(e.getKey() == e.TAB){
+ this.handleKeyDown(e);
+ }
+ },
+
+
+ handleKeyDown : function(e){
+ if(!e.isNavKeyPress()){
+ return;
+ }
+
+ var k = e.getKey(),
+ g = this.grid,
+ s = this.selection,
+ sm = this,
+ walk = function(row, col, step){
+ return g.walkCells(
+ row,
+ col,
+ step,
+ g.isEditor && g.editing ? sm.acceptsNav : sm.isSelectable,
+ sm
+ );
+ },
+ cell, newCell, r, c, ae;
+
+ switch(k){
+ case e.ESC:
+ case e.PAGE_UP:
+ case e.PAGE_DOWN:
+
+ break;
+ default:
+
+ e.stopEvent();
+ break;
+ }
+
+ if(!s){
+ cell = walk(0, 0, 1);
+ if(cell){
+ this.select(cell[0], cell[1]);
+ }
+ return;
+ }
+
+ cell = s.cell;
+ r = cell[0];
+ c = cell[1];
+
+ switch(k){
+ case e.TAB:
+ if(e.shiftKey){
+ newCell = walk(r, c - 1, -1);
+ }else{
+ newCell = walk(r, c + 1, 1);
+ }
+ break;
+ case e.DOWN:
+ newCell = walk(r + 1, c, 1);
+ break;
+ case e.UP:
+ newCell = walk(r - 1, c, -1);
+ break;
+ case e.RIGHT:
+ newCell = walk(r, c + 1, 1);
+ break;
+ case e.LEFT:
+ newCell = walk(r, c - 1, -1);
+ break;
+ case e.ENTER:
+ if (g.isEditor && !g.editing) {
+ g.startEditing(r, c);
+ return;
+ }
+ break;
+ }
+
+ if(newCell){
+
+ r = newCell[0];
+ c = newCell[1];
+
+ this.select(r, c);
+
+ if(g.isEditor && g.editing){
+ ae = g.activeEditor;
+ if(ae && ae.field.triggerBlur){
+
+ ae.field.triggerBlur();
+ }
+ g.startEditing(r, c);
+ }
+ }
+ },
+
+ acceptsNav : function(row, col, cm){
+ return !cm.isHidden(col) && cm.isCellEditable(col, row);
+ }
+});
+Ext.grid.EditorGridPanel = Ext.extend(Ext.grid.GridPanel, {
+
+ clicksToEdit: 2,
+
+
+ forceValidation: false,
+
+
+ isEditor : true,
+
+ detectEdit: false,
+
+
+ autoEncode : false,
+
+
+
+ trackMouseOver: false,
+
+
+ initComponent : function(){
+ Ext.grid.EditorGridPanel.superclass.initComponent.call(this);
+
+ if(!this.selModel){
+
+ this.selModel = new Ext.grid.CellSelectionModel();
+ }
+
+ this.activeEditor = null;
+
+ this.addEvents(
+
+ "beforeedit",
+
+ "afteredit",
+
+ "validateedit"
+ );
+ },
+
+
+ initEvents : function(){
+ Ext.grid.EditorGridPanel.superclass.initEvents.call(this);
+
+ this.getGridEl().on('mousewheel', this.stopEditing.createDelegate(this, [true]), this);
+ this.on('columnresize', this.stopEditing, this, [true]);
+
+ if(this.clicksToEdit == 1){
+ this.on("cellclick", this.onCellDblClick, this);
+ }else {
+ var view = this.getView();
+ if(this.clicksToEdit == 'auto' && view.mainBody){
+ view.mainBody.on('mousedown', this.onAutoEditClick, this);
+ }
+ this.on('celldblclick', this.onCellDblClick, this);
+ }
+ },
+
+ onResize : function(){
+ Ext.grid.EditorGridPanel.superclass.onResize.apply(this, arguments);
+ var ae = this.activeEditor;
+ if(this.editing && ae){
+ ae.realign(true);
+ }
+ },
+
+
+ onCellDblClick : function(g, row, col){
+ this.startEditing(row, col);
+ },
+
+
+ onAutoEditClick : function(e, t){
+ if(e.button !== 0){
+ return;
+ }
+ var row = this.view.findRowIndex(t),
+ col = this.view.findCellIndex(t);
+ if(row !== false && col !== false){
+ this.stopEditing();
+ if(this.selModel.getSelectedCell){
+ var sc = this.selModel.getSelectedCell();
+ if(sc && sc[0] === row && sc[1] === col){
+ this.startEditing(row, col);
+ }
+ }else{
+ if(this.selModel.isSelected(row)){
+ this.startEditing(row, col);
+ }
+ }
+ }
+ },
+
+
+ onEditComplete : function(ed, value, startValue){
+ this.editing = false;
+ this.lastActiveEditor = this.activeEditor;
+ this.activeEditor = null;
+
+ var r = ed.record,
+ field = this.colModel.getDataIndex(ed.col);
+ value = this.postEditValue(value, startValue, r, field);
+ if(this.forceValidation === true || String(value) !== String(startValue)){
+ var e = {
+ grid: this,
+ record: r,
+ field: field,
+ originalValue: startValue,
+ value: value,
+ row: ed.row,
+ column: ed.col,
+ cancel:false
+ };
+ if(this.fireEvent("validateedit", e) !== false && !e.cancel && String(value) !== String(startValue)){
+ r.set(field, e.value);
+ delete e.cancel;
+ this.fireEvent("afteredit", e);
+ }
+ }
+ this.view.focusCell(ed.row, ed.col);
+ },
+
+
+ startEditing : function(row, col){
+ this.stopEditing();
+ if(this.colModel.isCellEditable(col, row)){
+ this.view.ensureVisible(row, col, true);
+ var r = this.store.getAt(row),
+ field = this.colModel.getDataIndex(col),
+ e = {
+ grid: this,
+ record: r,
+ field: field,
+ value: r.data[field],
+ row: row,
+ column: col,
+ cancel:false
+ };
+ if(this.fireEvent("beforeedit", e) !== false && !e.cancel){
+ this.editing = true;
+ var ed = this.colModel.getCellEditor(col, row);
+ if(!ed){
+ return;
+ }
+ if(!ed.rendered){
+ ed.parentEl = this.view.getEditorParent(ed);
+ ed.on({
+ scope: this,
+ render: {
+ fn: function(c){
+ c.field.focus(false, true);
+ },
+ single: true,
+ scope: this
+ },
+ specialkey: function(field, e){
+ this.getSelectionModel().onEditorKey(field, e);
+ },
+ complete: this.onEditComplete,
+ canceledit: this.stopEditing.createDelegate(this, [true])
+ });
+ }
+ Ext.apply(ed, {
+ row : row,
+ col : col,
+ record : r
+ });
+ this.lastEdit = {
+ row: row,
+ col: col
+ };
+ this.activeEditor = ed;
+ if (ed.field.isXType('checkbox')) {
+ ed.allowBlur = false;
+ this.setupCheckbox(ed.field);
+ }
+
+
+ ed.selectSameEditor = (this.activeEditor == this.lastActiveEditor);
+ var v = this.preEditValue(r, field);
+ ed.startEdit(this.view.getCell(row, col).firstChild, Ext.isDefined(v) ? v : '');
+
+
+ (function(){
+ delete ed.selectSameEditor;
+ }).defer(50);
+ }
+ }
+ },
+
+ setupCheckbox: function(field){
+ var me = this,
+ fn = function() {
+ field.el.on('click', me.onCheckClick, me, {single: true});
+ };
+ if (field.rendered) {
+ fn();
+ } else {
+ field.on('render', fn, null, {single: true});
+ }
+ },
+
+ onCheckClick: function(){
+ var ed = this.activeEditor;
+ ed.allowBlur = true;
+ ed.field.focus(false, 10);
+ },
+
+
+ preEditValue : function(r, field){
+ var value = r.data[field];
+ return this.autoEncode && Ext.isString(value) ? Ext.util.Format.htmlDecode(value) : value;
+ },
+
+
+ postEditValue : function(value, originalValue, r, field){
+ return this.autoEncode && Ext.isString(value) ? Ext.util.Format.htmlEncode(value) : value;
+ },
+
+
+ stopEditing : function(cancel){
+ if(this.editing){
+
+ var ae = this.lastActiveEditor = this.activeEditor;
+ if(ae){
+ ae[cancel === true ? 'cancelEdit' : 'completeEdit']();
+ this.view.focusCell(ae.row, ae.col);
+ }
+ this.activeEditor = null;
+ }
+ this.editing = false;
+ }
+});
+Ext.reg('editorgrid', Ext.grid.EditorGridPanel);
+
+Ext.grid.GridEditor = function(field, config){
+ Ext.grid.GridEditor.superclass.constructor.call(this, field, config);
+ field.monitorTab = false;
+};
+
+Ext.extend(Ext.grid.GridEditor, Ext.Editor, {
+ alignment: "tl-tl",
+ autoSize: "width",
+ hideEl : false,
+ cls: "x-small-editor x-grid-editor",
+ shim:false,
+ shadow:false
+});
+Ext.grid.PropertyRecord = Ext.data.Record.create([
+ {name:'name',type:'string'}, 'value'
+]);
+
+
+Ext.grid.PropertyStore = Ext.extend(Ext.util.Observable, {
+
+ constructor : function(grid, source){
+ this.grid = grid;
+ this.store = new Ext.data.Store({
+ recordType : Ext.grid.PropertyRecord
+ });
+ this.store.on('update', this.onUpdate, this);
+ if(source){
+ this.setSource(source);
+ }
+ Ext.grid.PropertyStore.superclass.constructor.call(this);
+ },
+
+
+ setSource : function(o){
+ this.source = o;
+ this.store.removeAll();
+ var data = [];
+ for(var k in o){
+ if(this.isEditableValue(o[k])){
+ data.push(new Ext.grid.PropertyRecord({name: k, value: o[k]}, k));
+ }
+ }
+ this.store.loadRecords({records: data}, {}, true);
+ },
+
+
+ onUpdate : function(ds, record, type){
+ if(type == Ext.data.Record.EDIT){
+ var v = record.data.value;
+ var oldValue = record.modified.value;
+ if(this.grid.fireEvent('beforepropertychange', this.source, record.id, v, oldValue) !== false){
+ this.source[record.id] = v;
+ record.commit();
+ this.grid.fireEvent('propertychange', this.source, record.id, v, oldValue);
+ }else{
+ record.reject();
+ }
+ }
+ },
+
+
+ getProperty : function(row){
+ return this.store.getAt(row);
+ },
+
+
+ isEditableValue: function(val){
+ return Ext.isPrimitive(val) || Ext.isDate(val);
+ },
+
+
+ setValue : function(prop, value, create){
+ var r = this.getRec(prop);
+ if(r){
+ r.set('value', value);
+ this.source[prop] = value;
+ }else if(create){
+
+ this.source[prop] = value;
+ r = new Ext.grid.PropertyRecord({name: prop, value: value}, prop);
+ this.store.add(r);
+
+ }
+ },
+
+
+ remove : function(prop){
+ var r = this.getRec(prop);
+ if(r){
+ this.store.remove(r);
+ delete this.source[prop];
+ }
+ },
+
+
+ getRec : function(prop){
+ return this.store.getById(prop);
+ },
+
+
+ getSource : function(){
+ return this.source;
+ }
+});
+
+
+Ext.grid.PropertyColumnModel = Ext.extend(Ext.grid.ColumnModel, {
+
+ nameText : 'Name',
+ valueText : 'Value',
+ dateFormat : 'm/j/Y',
+ trueText: 'true',
+ falseText: 'false',
+
+ constructor : function(grid, store){
+ var g = Ext.grid,
+ f = Ext.form;
+
+ this.grid = grid;
+ g.PropertyColumnModel.superclass.constructor.call(this, [
+ {header: this.nameText, width:50, sortable: true, dataIndex:'name', id: 'name', menuDisabled:true},
+ {header: this.valueText, width:50, resizable:false, dataIndex: 'value', id: 'value', menuDisabled:true}
+ ]);
+ this.store = store;
+
+ var bfield = new f.Field({
+ autoCreate: {tag: 'select', children: [
+ {tag: 'option', value: 'true', html: this.trueText},
+ {tag: 'option', value: 'false', html: this.falseText}
+ ]},
+ getValue : function(){
+ return this.el.dom.value == 'true';
+ }
+ });
+ this.editors = {
+ 'date' : new g.GridEditor(new f.DateField({selectOnFocus:true})),
+ 'string' : new g.GridEditor(new f.TextField({selectOnFocus:true})),
+ 'number' : new g.GridEditor(new f.NumberField({selectOnFocus:true, style:'text-align:left;'})),
+ 'boolean' : new g.GridEditor(bfield, {
+ autoSize: 'both'
+ })
+ };
+ this.renderCellDelegate = this.renderCell.createDelegate(this);
+ this.renderPropDelegate = this.renderProp.createDelegate(this);
+ },
+
+
+ renderDate : function(dateVal){
+ return dateVal.dateFormat(this.dateFormat);
+ },
+
+
+ renderBool : function(bVal){
+ return this[bVal ? 'trueText' : 'falseText'];
+ },
+
+
+ isCellEditable : function(colIndex, rowIndex){
+ return colIndex == 1;
+ },
+
+
+ getRenderer : function(col){
+ return col == 1 ?
+ this.renderCellDelegate : this.renderPropDelegate;
+ },
+
+
+ renderProp : function(v){
+ return this.getPropertyName(v);
+ },
+
+
+ renderCell : function(val, meta, rec){
+ var renderer = this.grid.customRenderers[rec.get('name')];
+ if(renderer){
+ return renderer.apply(this, arguments);
+ }
+ var rv = val;
+ if(Ext.isDate(val)){
+ rv = this.renderDate(val);
+ }else if(typeof val == 'boolean'){
+ rv = this.renderBool(val);
+ }
+ return Ext.util.Format.htmlEncode(rv);
+ },
+
+
+ getPropertyName : function(name){
+ var pn = this.grid.propertyNames;
+ return pn && pn[name] ? pn[name] : name;
+ },
+
+
+ getCellEditor : function(colIndex, rowIndex){
+ var p = this.store.getProperty(rowIndex),
+ n = p.data.name,
+ val = p.data.value;
+ if(this.grid.customEditors[n]){
+ return this.grid.customEditors[n];
+ }
+ if(Ext.isDate(val)){
+ return this.editors.date;
+ }else if(typeof val == 'number'){
+ return this.editors.number;
+ }else if(typeof val == 'boolean'){
+ return this.editors['boolean'];
+ }else{
+ return this.editors.string;
+ }
+ },
+
+
+ destroy : function(){
+ Ext.grid.PropertyColumnModel.superclass.destroy.call(this);
+ this.destroyEditors(this.editors);
+ this.destroyEditors(this.grid.customEditors);
+ },
+
+ destroyEditors: function(editors){
+ for(var ed in editors){
+ Ext.destroy(editors[ed]);
+ }
+ }
+});
+
+
+Ext.grid.PropertyGrid = Ext.extend(Ext.grid.EditorGridPanel, {
+
+
+
+
+
+
+ enableColumnMove:false,
+ stripeRows:false,
+ trackMouseOver: false,
+ clicksToEdit:1,
+ enableHdMenu : false,
+ viewConfig : {
+ forceFit:true
+ },
+
+
+ initComponent : function(){
+ this.customRenderers = this.customRenderers || {};
+ this.customEditors = this.customEditors || {};
+ this.lastEditRow = null;
+ var store = new Ext.grid.PropertyStore(this);
+ this.propStore = store;
+ var cm = new Ext.grid.PropertyColumnModel(this, store);
+ store.store.sort('name', 'ASC');
+ this.addEvents(
+
+ 'beforepropertychange',
+
+ 'propertychange'
+ );
+ this.cm = cm;
+ this.ds = store.store;
+ Ext.grid.PropertyGrid.superclass.initComponent.call(this);
+
+ this.mon(this.selModel, 'beforecellselect', function(sm, rowIndex, colIndex){
+ if(colIndex === 0){
+ this.startEditing.defer(200, this, [rowIndex, 1]);
+ return false;
+ }
+ }, this);
+ },
+
+
+ onRender : function(){
+ Ext.grid.PropertyGrid.superclass.onRender.apply(this, arguments);
+
+ this.getGridEl().addClass('x-props-grid');
+ },
+
+
+ afterRender: function(){
+ Ext.grid.PropertyGrid.superclass.afterRender.apply(this, arguments);
+ if(this.source){
+ this.setSource(this.source);
+ }
+ },
+
+
+ setSource : function(source){
+ this.propStore.setSource(source);
+ },
+
+
+ getSource : function(){
+ return this.propStore.getSource();
+ },
+
+
+ setProperty : function(prop, value, create){
+ this.propStore.setValue(prop, value, create);
+ },
+
+
+ removeProperty : function(prop){
+ this.propStore.remove(prop);
+ }
+
+
+
+
+
+});
+Ext.reg("propertygrid", Ext.grid.PropertyGrid);
+
+Ext.grid.GroupingView = Ext.extend(Ext.grid.GridView, {
+
+
+ groupByText : 'Group By This Field',
+
+ showGroupsText : 'Show in Groups',
+
+ hideGroupedColumn : false,
+
+ showGroupName : true,
+
+ startCollapsed : false,
+
+ enableGrouping : true,
+
+ enableGroupingMenu : true,
+
+ enableNoGroups : true,
+
+ emptyGroupText : '(None)',
+
+ ignoreAdd : false,
+
+ groupTextTpl : '{text}',
+
+
+ groupMode: 'value',
+
+
+
+
+ cancelEditOnToggle: true,
+
+
+ initTemplates : function(){
+ Ext.grid.GroupingView.superclass.initTemplates.call(this);
+ this.state = {};
+
+ var sm = this.grid.getSelectionModel();
+ sm.on(sm.selectRow ? 'beforerowselect' : 'beforecellselect',
+ this.onBeforeRowSelect, this);
+
+ if(!this.startGroup){
+ this.startGroup = new Ext.XTemplate(
+ '<div id="{groupId}" class="x-grid-group {cls}">',
+ '<div id="{groupId}-hd" class="x-grid-group-hd" style="{style}"><div class="x-grid-group-title">', this.groupTextTpl ,'</div></div>',
+ '<div id="{groupId}-bd" class="x-grid-group-body">'
+ );
+ }
+ this.startGroup.compile();
+
+ if (!this.endGroup) {
+ this.endGroup = '</div></div>';
+ }
+ },
+
+
+ findGroup : function(el){
+ return Ext.fly(el).up('.x-grid-group', this.mainBody.dom);
+ },
+
+
+ getGroups : function(){
+ return this.hasRows() ? this.mainBody.dom.childNodes : [];
+ },
+
+
+ onAdd : function(ds, records, index) {
+ if (this.canGroup() && !this.ignoreAdd) {
+ var ss = this.getScrollState();
+ this.fireEvent('beforerowsinserted', ds, index, index + (records.length-1));
+ this.refresh();
+ this.restoreScroll(ss);
+ this.fireEvent('rowsinserted', ds, index, index + (records.length-1));
+ } else if (!this.canGroup()) {
+ Ext.grid.GroupingView.superclass.onAdd.apply(this, arguments);
+ }
+ },
+
+
+ onRemove : function(ds, record, index, isUpdate){
+ Ext.grid.GroupingView.superclass.onRemove.apply(this, arguments);
+ var g = document.getElementById(record._groupId);
+ if(g && g.childNodes[1].childNodes.length < 1){
+ Ext.removeNode(g);
+ }
+ this.applyEmptyText();
+ },
+
+
+ refreshRow : function(record){
+ if(this.ds.getCount()==1){
+ this.refresh();
+ }else{
+ this.isUpdating = true;
+ Ext.grid.GroupingView.superclass.refreshRow.apply(this, arguments);
+ this.isUpdating = false;
+ }
+ },
+
+
+ beforeMenuShow : function(){
+ var item, items = this.hmenu.items, disabled = this.cm.config[this.hdCtxIndex].groupable === false;
+ if((item = items.get('groupBy'))){
+ item.setDisabled(disabled);
+ }
+ if((item = items.get('showGroups'))){
+ item.setDisabled(disabled);
+ item.setChecked(this.canGroup(), true);
+ }
+ },
+
+
+ renderUI : function(){
+ var markup = Ext.grid.GroupingView.superclass.renderUI.call(this);
+
+ if(this.enableGroupingMenu && this.hmenu){
+ this.hmenu.add('-',{
+ itemId:'groupBy',
+ text: this.groupByText,
+ handler: this.onGroupByClick,
+ scope: this,
+ iconCls:'x-group-by-icon'
+ });
+ if(this.enableNoGroups){
+ this.hmenu.add({
+ itemId:'showGroups',
+ text: this.showGroupsText,
+ checked: true,
+ checkHandler: this.onShowGroupsClick,
+ scope: this
+ });
+ }
+ this.hmenu.on('beforeshow', this.beforeMenuShow, this);
+ }
+ return markup;
+ },
+
+ processEvent: function(name, e){
+ Ext.grid.GroupingView.superclass.processEvent.call(this, name, e);
+ var hd = e.getTarget('.x-grid-group-hd', this.mainBody);
+ if(hd){
+
+ var field = this.getGroupField(),
+ prefix = this.getPrefix(field),
+ groupValue = hd.id.substring(prefix.length),
+ emptyRe = new RegExp('gp-' + Ext.escapeRe(field) + '--hd');
+
+
+ groupValue = groupValue.substr(0, groupValue.length - 3);
+
+
+ if(groupValue || emptyRe.test(hd.id)){
+ this.grid.fireEvent('group' + name, this.grid, field, groupValue, e);
+ }
+ if(name == 'mousedown' && e.button == 0){
+ this.toggleGroup(hd.parentNode);
+ }
+ }
+
+ },
+
+
+ onGroupByClick : function(){
+ var grid = this.grid;
+ this.enableGrouping = true;
+ grid.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));
+ grid.fireEvent('groupchange', grid, grid.store.getGroupState());
+ this.beforeMenuShow();
+ this.refresh();
+ },
+
+
+ onShowGroupsClick : function(mi, checked){
+ this.enableGrouping = checked;
+ if(checked){
+ this.onGroupByClick();
+ }else{
+ this.grid.store.clearGrouping();
+ this.grid.fireEvent('groupchange', this, null);
+ }
+ },
+
+
+ toggleRowIndex : function(rowIndex, expanded){
+ if(!this.canGroup()){
+ return;
+ }
+ var row = this.getRow(rowIndex);
+ if(row){
+ this.toggleGroup(this.findGroup(row), expanded);
+ }
+ },
+
+
+ toggleGroup : function(group, expanded){
+ var gel = Ext.get(group),
+ id = Ext.util.Format.htmlEncode(gel.id);
+
+ expanded = Ext.isDefined(expanded) ? expanded : gel.hasClass('x-grid-group-collapsed');
+ if(this.state[id] !== expanded){
+ if (this.cancelEditOnToggle !== false) {
+ this.grid.stopEditing(true);
+ }
+ this.state[id] = expanded;
+ gel[expanded ? 'removeClass' : 'addClass']('x-grid-group-collapsed');
+ }
+ },
+
+
+ toggleAllGroups : function(expanded){
+ var groups = this.getGroups();
+ for(var i = 0, len = groups.length; i < len; i++){
+ this.toggleGroup(groups[i], expanded);
+ }
+ },
+
+
+ expandAllGroups : function(){
+ this.toggleAllGroups(true);
+ },
+
+
+ collapseAllGroups : function(){
+ this.toggleAllGroups(false);
+ },
+
+
+ getGroup : function(v, r, groupRenderer, rowIndex, colIndex, ds){
+ var column = this.cm.config[colIndex],
+ g = groupRenderer ? groupRenderer.call(column.scope, v, {}, r, rowIndex, colIndex, ds) : String(v);
+ if(g === '' || g === '&#160;'){
+ g = column.emptyGroupText || this.emptyGroupText;
+ }
+ return g;
+ },
+
+
+ getGroupField : function(){
+ return this.grid.store.getGroupState();
+ },
+
+
+ afterRender : function(){
+ if(!this.ds || !this.cm){
+ return;
+ }
+ Ext.grid.GroupingView.superclass.afterRender.call(this);
+ if(this.grid.deferRowRender){
+ this.updateGroupWidths();
+ }
+ },
+
+ afterRenderUI: function () {
+ Ext.grid.GroupingView.superclass.afterRenderUI.call(this);
+
+ if (this.enableGroupingMenu && this.hmenu) {
+ this.hmenu.add('-',{
+ itemId:'groupBy',
+ text: this.groupByText,
+ handler: this.onGroupByClick,
+ scope: this,
+ iconCls:'x-group-by-icon'
+ });
+
+ if (this.enableNoGroups) {
+ this.hmenu.add({
+ itemId:'showGroups',
+ text: this.showGroupsText,
+ checked: true,
+ checkHandler: this.onShowGroupsClick,
+ scope: this
+ });
+ }
+
+ this.hmenu.on('beforeshow', this.beforeMenuShow, this);
+ }
+ },
+
+
+ renderRows : function(){
+ var groupField = this.getGroupField();
+ var eg = !!groupField;
+
+ if(this.hideGroupedColumn) {
+ var colIndex = this.cm.findColumnIndex(groupField),
+ hasLastGroupField = Ext.isDefined(this.lastGroupField);
+ if(!eg && hasLastGroupField){
+ this.mainBody.update('');
+ this.cm.setHidden(this.cm.findColumnIndex(this.lastGroupField), false);
+ delete this.lastGroupField;
+ }else if (eg && !hasLastGroupField){
+ this.lastGroupField = groupField;
+ this.cm.setHidden(colIndex, true);
+ }else if (eg && hasLastGroupField && groupField !== this.lastGroupField) {
+ this.mainBody.update('');
+ var oldIndex = this.cm.findColumnIndex(this.lastGroupField);
+ this.cm.setHidden(oldIndex, false);
+ this.lastGroupField = groupField;
+ this.cm.setHidden(colIndex, true);
+ }
+ }
+ return Ext.grid.GroupingView.superclass.renderRows.apply(
+ this, arguments);
+ },
+
+
+ doRender : function(cs, rs, ds, startRow, colCount, stripe){
+ if(rs.length < 1){
+ return '';
+ }
+
+ if(!this.canGroup() || this.isUpdating){
+ return Ext.grid.GroupingView.superclass.doRender.apply(this, arguments);
+ }
+
+ var groupField = this.getGroupField(),
+ colIndex = this.cm.findColumnIndex(groupField),
+ g,
+ gstyle = 'width:' + this.getTotalWidth() + ';',
+ cfg = this.cm.config[colIndex],
+ groupRenderer = cfg.groupRenderer || cfg.renderer,
+ prefix = this.showGroupName ? (cfg.groupName || cfg.header)+': ' : '',
+ groups = [],
+ curGroup, i, len, gid;
+
+ for(i = 0, len = rs.length; i < len; i++){
+ var rowIndex = startRow + i,
+ r = rs[i],
+ gvalue = r.data[groupField];
+
+ g = this.getGroup(gvalue, r, groupRenderer, rowIndex, colIndex, ds);
+ if(!curGroup || curGroup.group != g){
+ gid = this.constructId(gvalue, groupField, colIndex);
+
+
+ this.state[gid] = !(Ext.isDefined(this.state[gid]) ? !this.state[gid] : this.startCollapsed);
+ curGroup = {
+ group: g,
+ gvalue: gvalue,
+ text: prefix + g,
+ groupId: gid,
+ startRow: rowIndex,
+ rs: [r],
+ cls: this.state[gid] ? '' : 'x-grid-group-collapsed',
+ style: gstyle
+ };
+ groups.push(curGroup);
+ }else{
+ curGroup.rs.push(r);
+ }
+ r._groupId = gid;
+ }
+
+ var buf = [];
+ for(i = 0, len = groups.length; i < len; i++){
+ g = groups[i];
+ this.doGroupStart(buf, g, cs, ds, colCount);
+ buf[buf.length] = Ext.grid.GroupingView.superclass.doRender.call(
+ this, cs, g.rs, ds, g.startRow, colCount, stripe);
+
+ this.doGroupEnd(buf, g, cs, ds, colCount);
+ }
+ return buf.join('');
+ },
+
+
+ getGroupId : function(value){
+ var field = this.getGroupField();
+ return this.constructId(value, field, this.cm.findColumnIndex(field));
+ },
+
+
+ constructId : function(value, field, idx){
+ var cfg = this.cm.config[idx],
+ groupRenderer = cfg.groupRenderer || cfg.renderer,
+ val = (this.groupMode == 'value') ? value : this.getGroup(value, {data:{}}, groupRenderer, 0, idx, this.ds);
+
+ return this.getPrefix(field) + Ext.util.Format.htmlEncode(val);
+ },
+
+
+ canGroup : function(){
+ return this.enableGrouping && !!this.getGroupField();
+ },
+
+
+ getPrefix: function(field){
+ return this.grid.getGridEl().id + '-gp-' + field + '-';
+ },
+
+
+ doGroupStart : function(buf, g, cs, ds, colCount){
+ buf[buf.length] = this.startGroup.apply(g);
+ },
+
+
+ doGroupEnd : function(buf, g, cs, ds, colCount){
+ buf[buf.length] = this.endGroup;
+ },
+
+
+ getRows : function(){
+ if(!this.canGroup()){
+ return Ext.grid.GroupingView.superclass.getRows.call(this);
+ }
+ var r = [],
+ gs = this.getGroups(),
+ g,
+ i = 0,
+ len = gs.length,
+ j,
+ jlen;
+ for(; i < len; ++i){
+ g = gs[i].childNodes[1];
+ if(g){
+ g = g.childNodes;
+ for(j = 0, jlen = g.length; j < jlen; ++j){
+ r[r.length] = g[j];
+ }
+ }
+ }
+ return r;
+ },
+
+
+ updateGroupWidths : function(){
+ if(!this.canGroup() || !this.hasRows()){
+ return;
+ }
+ var tw = Math.max(this.cm.getTotalWidth(), this.el.dom.offsetWidth-this.getScrollOffset()) +'px';
+ var gs = this.getGroups();
+ for(var i = 0, len = gs.length; i < len; i++){
+ gs[i].firstChild.style.width = tw;
+ }
+ },
+
+
+ onColumnWidthUpdated : function(col, w, tw){
+ Ext.grid.GroupingView.superclass.onColumnWidthUpdated.call(this, col, w, tw);
+ this.updateGroupWidths();
+ },
+
+
+ onAllColumnWidthsUpdated : function(ws, tw){
+ Ext.grid.GroupingView.superclass.onAllColumnWidthsUpdated.call(this, ws, tw);
+ this.updateGroupWidths();
+ },
+
+
+ onColumnHiddenUpdated : function(col, hidden, tw){
+ Ext.grid.GroupingView.superclass.onColumnHiddenUpdated.call(this, col, hidden, tw);
+ this.updateGroupWidths();
+ },
+
+
+ onLayout : function(){
+ this.updateGroupWidths();
+ },
+
+
+ onBeforeRowSelect : function(sm, rowIndex){
+ this.toggleRowIndex(rowIndex, true);
+ }
+});
+
+Ext.grid.GroupingView.GROUP_ID = 1000;
diff --git a/deluge/ui/web/js/extjs/ext-all.js b/deluge/ui/web/js/extjs/ext-all.js
new file mode 100644
index 0000000..5f3e5aa
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-all.js
@@ -0,0 +1,21 @@
+/*
+This file is part of Ext JS 3.4
+
+Copyright (c) 2011-2013 Sencha Inc
+
+Contact: http://www.sencha.com/contact
+
+GNU General Public License Usage
+This file may be used under the terms of the GNU General Public License version 3.0 as
+published by the Free Software Foundation and appearing in the file LICENSE included in the
+packaging of this file.
+
+Please review the following information to ensure the GNU General Public License version 3.0
+requirements will be met: http://www.gnu.org/copyleft/gpl.html.
+
+If you are unsure which license is appropriate for your use, please contact the sales department
+at http://www.sencha.com/contact.
+
+Build date: 2013-04-03 15:07:25
+*/
+(function(){var h=Ext.util,j=Ext.each,g=true,i=false;h.Observable=function(){var k=this,l=k.events;if(k.listeners){k.on(k.listeners);delete k.listeners}k.events=l||{}};h.Observable.prototype={filterOptRe:/^(?:scope|delay|buffer|single)$/,fireEvent:function(){var k=Array.prototype.slice.call(arguments,0),m=k[0].toLowerCase(),n=this,l=g,p=n.events[m],s,o,r;if(n.eventsSuspended===g){if(o=n.eventQueue){o.push(k)}}else{if(typeof p=="object"){if(p.bubble){if(p.fire.apply(p,k.slice(1))===i){return i}r=n.getBubbleTarget&&n.getBubbleTarget();if(r&&r.enableBubble){s=r.events[m];if(!s||typeof s!="object"||!s.bubble){r.enableBubble(m)}return r.fireEvent.apply(r,k)}}else{k.shift();l=p.fire.apply(p,k)}}}return l},addListener:function(k,m,l,r){var n=this,q,s,p;if(typeof k=="object"){r=k;for(q in r){s=r[q];if(!n.filterOptRe.test(q)){n.addListener(q,s.fn||s,s.scope||r.scope,s.fn?s:r)}}}else{k=k.toLowerCase();p=n.events[k]||g;if(typeof p=="boolean"){n.events[k]=p=new h.Event(n,k)}p.addListener(m,l,typeof r=="object"?r:{})}},removeListener:function(k,m,l){var n=this.events[k.toLowerCase()];if(typeof n=="object"){n.removeListener(m,l)}},purgeListeners:function(){var m=this.events,k,l;for(l in m){k=m[l];if(typeof k=="object"){k.clearListeners()}}},addEvents:function(n){var m=this;m.events=m.events||{};if(typeof n=="string"){var k=arguments,l=k.length;while(l--){m.events[k[l]]=m.events[k[l]]||g}}else{Ext.applyIf(m.events,n)}},hasListener:function(k){var l=this.events[k.toLowerCase()];return typeof l=="object"&&l.listeners.length>0},suspendEvents:function(k){this.eventsSuspended=g;if(k&&!this.eventQueue){this.eventQueue=[]}},resumeEvents:function(){var k=this,l=k.eventQueue||[];k.eventsSuspended=i;delete k.eventQueue;j(l,function(m){k.fireEvent.apply(k,m)})}};var d=h.Observable.prototype;d.on=d.addListener;d.un=d.removeListener;h.Observable.releaseCapture=function(k){k.fireEvent=d.fireEvent};function e(l,m,k){return function(){if(m.target==arguments[0]){l.apply(k,Array.prototype.slice.call(arguments,0))}}}function b(n,p,k,m){k.task=new h.DelayedTask();return function(){k.task.delay(p.buffer,n,m,Array.prototype.slice.call(arguments,0))}}function c(m,n,l,k){return function(){n.removeListener(l,k);return m.apply(k,arguments)}}function a(n,p,k,m){return function(){var l=new h.DelayedTask(),o=Array.prototype.slice.call(arguments,0);if(!k.tasks){k.tasks=[]}k.tasks.push(l);l.delay(p.delay||10,function(){k.tasks.remove(l);n.apply(m,o)},m)}}h.Event=function(l,k){this.name=k;this.obj=l;this.listeners=[]};h.Event.prototype={addListener:function(o,n,m){var p=this,k;n=n||p.obj;if(!p.isListening(o,n)){k=p.createListener(o,n,m);if(p.firing){p.listeners=p.listeners.slice(0)}p.listeners.push(k)}},createListener:function(p,n,q){q=q||{};n=n||this.obj;var k={fn:p,scope:n,options:q},m=p;if(q.target){m=e(m,q,n)}if(q.delay){m=a(m,q,k,n)}if(q.single){m=c(m,this,p,n)}if(q.buffer){m=b(m,q,k,n)}k.fireFn=m;return k},findListener:function(o,n){var p=this.listeners,m=p.length,k;n=n||this.obj;while(m--){k=p[m];if(k){if(k.fn==o&&k.scope==n){return m}}}return -1},isListening:function(l,k){return this.findListener(l,k)!=-1},removeListener:function(r,q){var p,m,n,s=this,o=i;if((p=s.findListener(r,q))!=-1){if(s.firing){s.listeners=s.listeners.slice(0)}m=s.listeners[p];if(m.task){m.task.cancel();delete m.task}n=m.tasks&&m.tasks.length;if(n){while(n--){m.tasks[n].cancel()}delete m.tasks}s.listeners.splice(p,1);o=g}return o},clearListeners:function(){var n=this,k=n.listeners,m=k.length;while(m--){n.removeListener(k[m].fn,k[m].scope)}},fire:function(){var q=this,p=q.listeners,k=p.length,o=0,m;if(k>0){q.firing=g;var n=Array.prototype.slice.call(arguments,0);for(;o<k;o++){m=p[o];if(m&&m.fireFn.apply(m.scope||q.obj||window,n)===i){return(q.firing=i)}}}q.firing=i;return g}}})();Ext.DomHelper=function(){var x=null,k=/^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i,m=/^table|tbody|tr|td$/i,d=/tag|children|cn|html$/i,t=/td|tr|tbody/i,o=/([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,v=/end/i,r,n="afterbegin",p="afterend",c="beforebegin",q="beforeend",a="<table>",i="</table>",b=a+"<tbody>",j="</tbody>"+i,l=b+"<tr>",w="</tr>"+j;function h(B,D,C,E,A,y){var z=r.insertHtml(E,Ext.getDom(B),u(D));return C?Ext.get(z,true):z}function u(D){var z="",y,C,B,E;if(typeof D=="string"){z=D}else{if(Ext.isArray(D)){for(var A=0;A<D.length;A++){if(D[A]){z+=u(D[A])}}}else{z+="<"+(D.tag=D.tag||"div");for(y in D){C=D[y];if(!d.test(y)){if(typeof C=="object"){z+=" "+y+'="';for(B in C){z+=B+":"+C[B]+";"}z+='"'}else{z+=" "+({cls:"class",htmlFor:"for"}[y]||y)+'="'+C+'"'}}}if(k.test(D.tag)){z+="/>"}else{z+=">";if((E=D.children||D.cn)){z+=u(E)}else{if(D.html){z+=D.html}}z+="</"+D.tag+">"}}}return z}function g(F,C,B,D){x.innerHTML=[C,B,D].join("");var y=-1,A=x,z;while(++y<F){A=A.firstChild}if(z=A.nextSibling){var E=document.createDocumentFragment();while(A){z=A.nextSibling;E.appendChild(A);A=z}A=E}return A}function e(y,z,B,A){var C,D;x=x||document.createElement("div");if(y=="td"&&(z==n||z==q)||!t.test(y)&&(z==c||z==p)){return}D=z==c?B:z==p?B.nextSibling:z==n?B.firstChild:null;if(z==c||z==p){B=B.parentNode}if(y=="td"||(y=="tr"&&(z==q||z==n))){C=g(4,l,A,w)}else{if((y=="tbody"&&(z==q||z==n))||(y=="tr"&&(z==c||z==p))){C=g(3,b,A,j)}else{C=g(2,a,A,i)}}B.insertBefore(C,D);return C}function s(A){var D=document.createElement("div"),y=document.createDocumentFragment(),z=0,B,C;D.innerHTML=A;C=D.childNodes;B=C.length;for(;z<B;z++){y.appendChild(C[z].cloneNode(true))}return y}r={markup:function(y){return u(y)},applyStyles:function(y,z){if(z){var A;y=Ext.fly(y);if(typeof z=="function"){z=z.call()}if(typeof z=="string"){o.lastIndex=0;while((A=o.exec(z))){y.setStyle(A[1],A[2])}}else{if(typeof z=="object"){y.setStyle(z)}}}},insertHtml:function(D,y,E){var B={},A,F,C,G,H,z;D=D.toLowerCase();B[c]=["BeforeBegin","previousSibling"];B[p]=["AfterEnd","nextSibling"];if(y.insertAdjacentHTML){if(m.test(y.tagName)&&(z=e(y.tagName.toLowerCase(),D,y,E))){return z}B[n]=["AfterBegin","firstChild"];B[q]=["BeforeEnd","lastChild"];if((A=B[D])){y.insertAdjacentHTML(A[0],E);return y[A[1]]}}else{F=y.ownerDocument.createRange();G="setStart"+(v.test(D)?"After":"Before");if(B[D]){F[G](y);if(!F.createContextualFragment){H=s(E)}else{H=F.createContextualFragment(E)}y.parentNode.insertBefore(H,D==c?y:y.nextSibling);return y[(D==c?"previous":"next")+"Sibling"]}else{C=(D==n?"first":"last")+"Child";if(y.firstChild){F[G](y[C]);if(!F.createContextualFragment){H=s(E)}else{H=F.createContextualFragment(E)}if(D==n){y.insertBefore(H,y.firstChild)}else{y.appendChild(H)}}else{y.innerHTML=E}return y[C]}}throw'Illegal insertion point -> "'+D+'"'},insertBefore:function(y,A,z){return h(y,A,z,c)},insertAfter:function(y,A,z){return h(y,A,z,p,"nextSibling")},insertFirst:function(y,A,z){return h(y,A,z,n,"firstChild")},append:function(y,A,z){return h(y,A,z,q,"",true)},overwrite:function(y,A,z){y=Ext.getDom(y);y.innerHTML=u(A);return z?Ext.get(y.firstChild):y.firstChild},createHtml:u};return r}();Ext.Template=function(h){var j=this,c=arguments,e=[],d;if(Ext.isArray(h)){h=h.join("")}else{if(c.length>1){for(var g=0,b=c.length;g<b;g++){d=c[g];if(typeof d=="object"){Ext.apply(j,d)}else{e.push(d)}}h=e.join("")}}j.html=h;if(j.compiled){j.compile()}};Ext.Template.prototype={re:/\{([\w\-]+)\}/g,applyTemplate:function(a){var b=this;return b.compiled?b.compiled(a):b.html.replace(b.re,function(c,d){return a[d]!==undefined?a[d]:""})},set:function(a,c){var b=this;b.html=a;b.compiled=null;return c?b.compile():b},compile:function(){var me=this,sep=Ext.isGecko?"+":",";function fn(m,name){name="values['"+name+"']";return"'"+sep+"("+name+" == undefined ? '' : "+name+")"+sep+"'"}eval("this.compiled = function(values){ return "+(Ext.isGecko?"'":"['")+me.html.replace(/\\/g,"\\\\").replace(/(\r\n|\n)/g,"\\n").replace(/'/g,"\\'").replace(this.re,fn)+(Ext.isGecko?"';};":"'].join('');};"));return me},insertFirst:function(b,a,c){return this.doInsert("afterBegin",b,a,c)},insertBefore:function(b,a,c){return this.doInsert("beforeBegin",b,a,c)},insertAfter:function(b,a,c){return this.doInsert("afterEnd",b,a,c)},append:function(b,a,c){return this.doInsert("beforeEnd",b,a,c)},doInsert:function(c,e,b,a){e=Ext.getDom(e);var d=Ext.DomHelper.insertHtml(c,e,this.applyTemplate(b));return a?Ext.get(d,true):d},overwrite:function(b,a,c){b=Ext.getDom(b);b.innerHTML=this.applyTemplate(a);return c?Ext.get(b.firstChild,true):b.firstChild}};Ext.Template.prototype.apply=Ext.Template.prototype.applyTemplate;Ext.Template.from=function(b,a){b=Ext.getDom(b);return new Ext.Template(b.value||b.innerHTML,a||"")};Ext.DomQuery=function(){var cache={},simpleCache={},valueCache={},nonSpace=/\S/,trimRe=/^\s+|\s+$/g,tplRe=/\{(\d+)\}/g,modeRe=/^(\s?[\/>+~]\s?|\s|$)/,tagTokenRe=/^(#)?([\w\-\*]+)/,nthRe=/(\d*)n\+?(\d*)/,nthRe2=/\D/,isIE=window.ActiveXObject?true:false,key=30803;eval("var batch = 30803;");function child(parent,index){var i=0,n=parent.firstChild;while(n){if(n.nodeType==1){if(++i==index){return n}}n=n.nextSibling}return null}function next(n){while((n=n.nextSibling)&&n.nodeType!=1){}return n}function prev(n){while((n=n.previousSibling)&&n.nodeType!=1){}return n}function children(parent){var n=parent.firstChild,nodeIndex=-1,nextNode;while(n){nextNode=n.nextSibling;if(n.nodeType==3&&!nonSpace.test(n.nodeValue)){parent.removeChild(n)}else{n.nodeIndex=++nodeIndex}n=nextNode}return this}function byClassName(nodeSet,cls){if(!cls){return nodeSet}var result=[],ri=-1;for(var i=0,ci;ci=nodeSet[i];i++){if((" "+ci.className+" ").indexOf(cls)!=-1){result[++ri]=ci}}return result}function attrValue(n,attr){if(!n.tagName&&typeof n.length!="undefined"){n=n[0]}if(!n){return null}if(attr=="for"){return n.htmlFor}if(attr=="class"||attr=="className"){return n.className}return n.getAttribute(attr)||n[attr]}function getNodes(ns,mode,tagName){var result=[],ri=-1,cs;if(!ns){return result}tagName=tagName||"*";if(typeof ns.getElementsByTagName!="undefined"){ns=[ns]}if(!mode){for(var i=0,ni;ni=ns[i];i++){cs=ni.getElementsByTagName(tagName);for(var j=0,ci;ci=cs[j];j++){result[++ri]=ci}}}else{if(mode=="/"||mode==">"){var utag=tagName.toUpperCase();for(var i=0,ni,cn;ni=ns[i];i++){cn=ni.childNodes;for(var j=0,cj;cj=cn[j];j++){if(cj.nodeName==utag||cj.nodeName==tagName||tagName=="*"){result[++ri]=cj}}}}else{if(mode=="+"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(n&&(n.nodeName==utag||n.nodeName==tagName||tagName=="*")){result[++ri]=n}}}else{if(mode=="~"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)){if(n.nodeName==utag||n.nodeName==tagName||tagName=="*"){result[++ri]=n}}}}}}}return result}function concat(a,b){if(b.slice){return a.concat(b)}for(var i=0,l=b.length;i<l;i++){a[a.length]=b[i]}return a}function byTag(cs,tagName){if(cs.tagName||cs==document){cs=[cs]}if(!tagName){return cs}var result=[],ri=-1;tagName=tagName.toLowerCase();for(var i=0,ci;ci=cs[i];i++){if(ci.nodeType==1&&ci.tagName.toLowerCase()==tagName){result[++ri]=ci}}return result}function byId(cs,id){if(cs.tagName||cs==document){cs=[cs]}if(!id){return cs}var result=[],ri=-1;for(var i=0,ci;ci=cs[i];i++){if(ci&&ci.id==id){result[++ri]=ci;return result}}return result}function byAttribute(cs,attr,value,op,custom){var result=[],ri=-1,useGetStyle=custom=="{",fn=Ext.DomQuery.operators[op],a,xml,hasXml;for(var i=0,ci;ci=cs[i];i++){if(ci.nodeType!=1){continue}if(!hasXml){xml=Ext.DomQuery.isXml(ci);hasXml=true}if(!xml){if(useGetStyle){a=Ext.DomQuery.getStyle(ci,attr)}else{if(attr=="class"||attr=="className"){a=ci.className}else{if(attr=="for"){a=ci.htmlFor}else{if(attr=="href"){a=ci.getAttribute("href",2)}else{a=ci.getAttribute(attr)}}}}}else{a=ci.getAttribute(attr)}if((fn&&fn(a,value))||(!fn&&a)){result[++ri]=ci}}return result}function byPseudo(cs,name,value){return Ext.DomQuery.pseudos[name](cs,value)}function nodupIEXml(cs){var d=++key,r;cs[0].setAttribute("_nodup",d);r=[cs[0]];for(var i=1,len=cs.length;i<len;i++){var c=cs[i];if(!c.getAttribute("_nodup")!=d){c.setAttribute("_nodup",d);r[r.length]=c}}for(var i=0,len=cs.length;i<len;i++){cs[i].removeAttribute("_nodup")}return r}function nodup(cs){if(!cs){return[]}var len=cs.length,c,i,r=cs,cj,ri=-1;if(!len||typeof cs.nodeType!="undefined"||len==1){return cs}if(isIE&&typeof cs[0].selectSingleNode!="undefined"){return nodupIEXml(cs)}var d=++key;cs[0]._nodup=d;for(i=1;c=cs[i];i++){if(c._nodup!=d){c._nodup=d}else{r=[];for(var j=0;j<i;j++){r[++ri]=cs[j]}for(j=i+1;cj=cs[j];j++){if(cj._nodup!=d){cj._nodup=d;r[++ri]=cj}}return r}}return r}function quickDiffIEXml(c1,c2){var d=++key,r=[];for(var i=0,len=c1.length;i<len;i++){c1[i].setAttribute("_qdiff",d)}for(var i=0,len=c2.length;i<len;i++){if(c2[i].getAttribute("_qdiff")!=d){r[r.length]=c2[i]}}for(var i=0,len=c1.length;i<len;i++){c1[i].removeAttribute("_qdiff")}return r}function quickDiff(c1,c2){var len1=c1.length,d=++key,r=[];if(!len1){return c2}if(isIE&&typeof c1[0].selectSingleNode!="undefined"){return quickDiffIEXml(c1,c2)}for(var i=0;i<len1;i++){c1[i]._qdiff=d}for(var i=0,len=c2.length;i<len;i++){if(c2[i]._qdiff!=d){r[r.length]=c2[i]}}return r}function quickId(ns,mode,root,id){if(ns==root){var d=root.ownerDocument||root;return d.getElementById(id)}ns=getNodes(ns,mode,"*");return byId(ns,id)}return{getStyle:function(el,name){return Ext.fly(el).getStyle(name)},compile:function(path,type){type=type||"select";var fn=["var f = function(root){\n var mode; ++batch; var n = root || document;\n"],mode,lastPath,matchers=Ext.DomQuery.matchers,matchersLn=matchers.length,modeMatch,lmode=path.match(modeRe);if(lmode&&lmode[1]){fn[fn.length]='mode="'+lmode[1].replace(trimRe,"")+'";';path=path.replace(lmode[1],"")}while(path.substr(0,1)=="/"){path=path.substr(1)}while(path&&lastPath!=path){lastPath=path;var tokenMatch=path.match(tagTokenRe);if(type=="select"){if(tokenMatch){if(tokenMatch[1]=="#"){fn[fn.length]='n = quickId(n, mode, root, "'+tokenMatch[2]+'");'}else{fn[fn.length]='n = getNodes(n, mode, "'+tokenMatch[2]+'");'}path=path.replace(tokenMatch[0],"")}else{if(path.substr(0,1)!="@"){fn[fn.length]='n = getNodes(n, mode, "*");'}}}else{if(tokenMatch){if(tokenMatch[1]=="#"){fn[fn.length]='n = byId(n, "'+tokenMatch[2]+'");'}else{fn[fn.length]='n = byTag(n, "'+tokenMatch[2]+'");'}path=path.replace(tokenMatch[0],"")}}while(!(modeMatch=path.match(modeRe))){var matched=false;for(var j=0;j<matchersLn;j++){var t=matchers[j];var m=path.match(t.re);if(m){fn[fn.length]=t.select.replace(tplRe,function(x,i){return m[i]});path=path.replace(m[0],"");matched=true;break}}if(!matched){throw'Error parsing selector, parsing failed at "'+path+'"'}}if(modeMatch[1]){fn[fn.length]='mode="'+modeMatch[1].replace(trimRe,"")+'";';path=path.replace(modeMatch[1],"")}}fn[fn.length]="return nodup(n);\n}";eval(fn.join(""));return f},jsSelect:function(path,root,type){root=root||document;if(typeof root=="string"){root=document.getElementById(root)}var paths=path.split(","),results=[];for(var i=0,len=paths.length;i<len;i++){var subPath=paths[i].replace(trimRe,"");if(!cache[subPath]){cache[subPath]=Ext.DomQuery.compile(subPath);if(!cache[subPath]){throw subPath+" is not a valid selector"}}var result=cache[subPath](root);if(result&&result!=document){results=results.concat(result)}}if(paths.length>1){return nodup(results)}return results},isXml:function(el){var docEl=(el?el.ownerDocument||el:0).documentElement;return docEl?docEl.nodeName!=="HTML":false},select:document.querySelectorAll?function(path,root,type){root=root||document;if(!Ext.DomQuery.isXml(root)){try{var cs=root.querySelectorAll(path);return Ext.toArray(cs)}catch(ex){}}return Ext.DomQuery.jsSelect.call(this,path,root,type)}:function(path,root,type){return Ext.DomQuery.jsSelect.call(this,path,root,type)},selectNode:function(path,root){return Ext.DomQuery.select(path,root)[0]},selectValue:function(path,root,defaultValue){path=path.replace(trimRe,"");if(!valueCache[path]){valueCache[path]=Ext.DomQuery.compile(path,"select")}var n=valueCache[path](root),v;n=n[0]?n[0]:n;if(typeof n.normalize=="function"){n.normalize()}v=(n&&n.firstChild?n.firstChild.nodeValue:null);return((v===null||v===undefined||v==="")?defaultValue:v)},selectNumber:function(path,root,defaultValue){var v=Ext.DomQuery.selectValue(path,root,defaultValue||0);return parseFloat(v)},is:function(el,ss){if(typeof el=="string"){el=document.getElementById(el)}var isArray=Ext.isArray(el),result=Ext.DomQuery.filter(isArray?el:[el],ss);return isArray?(result.length==el.length):(result.length>0)},filter:function(els,ss,nonMatches){ss=ss.replace(trimRe,"");if(!simpleCache[ss]){simpleCache[ss]=Ext.DomQuery.compile(ss,"simple")}var result=simpleCache[ss](els);return nonMatches?quickDiff(result,els):result},matchers:[{re:/^\.([\w\-]+)/,select:'n = byClassName(n, " {1} ");'},{re:/^\:([\w\-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,select:'n = byPseudo(n, "{1}", "{2}");'},{re:/^(?:([\[\{])(?:@)?([\w\-]+)\s?(?:(=|.=)\s?(["']?)(.*?)\4)?[\]\}])/,select:'n = byAttribute(n, "{2}", "{5}", "{3}", "{1}");'},{re:/^#([\w\-]+)/,select:'n = byId(n, "{1}");'},{re:/^@([\w\-]+)/,select:'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'}],operators:{"=":function(a,v){return a==v},"!=":function(a,v){return a!=v},"^=":function(a,v){return a&&a.substr(0,v.length)==v},"$=":function(a,v){return a&&a.substr(a.length-v.length)==v},"*=":function(a,v){return a&&a.indexOf(v)!==-1},"%=":function(a,v){return(a%v)==0},"|=":function(a,v){return a&&(a==v||a.substr(0,v.length+1)==v+"-")},"~=":function(a,v){return a&&(" "+a+" ").indexOf(" "+v+" ")!=-1}},pseudos:{"first-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.previousSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"last-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"nth-child":function(c,a){var r=[],ri=-1,m=nthRe.exec(a=="even"&&"2n"||a=="odd"&&"2n+1"||!nthRe2.test(a)&&"n+"+a||a),f=(m[1]||1)-0,l=m[2]-0;for(var i=0,n;n=c[i];i++){var pn=n.parentNode;if(batch!=pn._batch){var j=0;for(var cn=pn.firstChild;cn;cn=cn.nextSibling){if(cn.nodeType==1){cn.nodeIndex=++j}}pn._batch=batch}if(f==1){if(l==0||n.nodeIndex==l){r[++ri]=n}}else{if((n.nodeIndex+l)%f==0){r[++ri]=n}}}return r},"only-child":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(!prev(ci)&&!next(ci)){r[++ri]=ci}}return r},empty:function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var cns=ci.childNodes,j=0,cn,empty=true;while(cn=cns[j]){++j;if(cn.nodeType==1||cn.nodeType==3){empty=false;break}}if(empty){r[++ri]=ci}}return r},contains:function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if((ci.textContent||ci.innerText||"").indexOf(v)!=-1){r[++ri]=ci}}return r},nodeValue:function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.firstChild&&ci.firstChild.nodeValue==v){r[++ri]=ci}}return r},checked:function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.checked==true){r[++ri]=ci}}return r},not:function(c,ss){return Ext.DomQuery.filter(c,ss,true)},any:function(c,selectors){var ss=selectors.split("|"),r=[],ri=-1,s;for(var i=0,ci;ci=c[i];i++){for(var j=0;s=ss[j];j++){if(Ext.DomQuery.is(ci,s)){r[++ri]=ci;break}}}return r},odd:function(c){return this["nth-child"](c,"odd")},even:function(c){return this["nth-child"](c,"even")},nth:function(c,a){return c[a-1]||[]},first:function(c){return c[0]||[]},last:function(c){return c[c.length-1]||[]},has:function(c,ss){var s=Ext.DomQuery.select,r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(s(ss,ci).length>0){r[++ri]=ci}}return r},next:function(c,ss){var is=Ext.DomQuery.is,r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=next(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r},prev:function(c,ss){var is=Ext.DomQuery.is,r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=prev(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r}}}}();Ext.query=Ext.DomQuery.select;Ext.util.DelayedTask=function(d,c,a){var e=this,g,b=function(){clearInterval(g);g=null;d.apply(c,a||[])};e.delay=function(i,k,j,h){e.cancel();d=k||d;c=j||c;a=h||a;g=setInterval(b,i)};e.cancel=function(){if(g){clearInterval(g);g=null}}};(function(){var h=document;Ext.Element=function(l,m){var n=typeof l=="string"?h.getElementById(l):l,o;if(!n){return null}o=n.id;if(!m&&o&&Ext.elCache[o]){return Ext.elCache[o].el}this.dom=n;this.id=o||Ext.id(n)};var d=Ext.DomHelper,e=Ext.Element,a=Ext.elCache;e.prototype={set:function(q,m){var n=this.dom,l,p,m=(m!==false)&&!!n.setAttribute;for(l in q){if(q.hasOwnProperty(l)){p=q[l];if(l=="style"){d.applyStyles(n,p)}else{if(l=="cls"){n.className=p}else{if(m){n.setAttribute(l,p)}else{n[l]=p}}}}}return this},defaultUnit:"px",is:function(l){return Ext.DomQuery.is(this.dom,l)},focus:function(o,n){var l=this,n=n||l.dom;try{if(Number(o)){l.focus.defer(o,null,[null,n])}else{n.focus()}}catch(m){}return l},blur:function(){try{this.dom.blur()}catch(l){}return this},getValue:function(l){var m=this.dom.value;return l?parseInt(m,10):m},addListener:function(l,o,n,m){Ext.EventManager.on(this.dom,l,o,n||this,m);return this},removeListener:function(l,n,m){Ext.EventManager.removeListener(this.dom,l,n,m||this);return this},removeAllListeners:function(){Ext.EventManager.removeAll(this.dom);return this},purgeAllListeners:function(){Ext.EventManager.purgeElement(this,true);return this},addUnits:function(l){if(l===""||l=="auto"||l===undefined){l=l||""}else{if(!isNaN(l)||!i.test(l)){l=l+(this.defaultUnit||"px")}}return l},load:function(m,n,l){Ext.Ajax.request(Ext.apply({params:n,url:m.url||m,callback:l,el:this.dom,indicatorText:m.indicatorText||""},Ext.isObject(m)?m:{}));return this},isBorderBox:function(){return Ext.isBorderBox||Ext.isForcedBorderBox||g[(this.dom.tagName||"").toLowerCase()]},remove:function(){var l=this,m=l.dom;if(m){delete l.dom;Ext.removeNode(m)}},hover:function(m,l,o,n){var p=this;p.on("mouseenter",m,o||p.dom,n);p.on("mouseleave",l,o||p.dom,n);return p},contains:function(l){return !l?false:Ext.lib.Dom.isAncestor(this.dom,l.dom?l.dom:l)},getAttributeNS:function(m,l){return this.getAttribute(l,m)},getAttribute:(function(){var p=document.createElement("table"),o=false,m="getAttribute" in p,l=/undefined|unknown/;if(m){try{p.getAttribute("ext:qtip")}catch(n){o=true}return function(q,s){var r=this.dom,t;if(r.getAttributeNS){t=r.getAttributeNS(s,q)||null}if(t==null){if(s){if(o&&r.tagName.toUpperCase()=="TABLE"){try{t=r.getAttribute(s+":"+q)}catch(u){t=""}}else{t=r.getAttribute(s+":"+q)}}else{t=r.getAttribute(q)||r[q]}}return t||""}}else{return function(q,s){var r=this.om,u,t;if(s){t=r[s+":"+q];u=l.test(typeof t)?undefined:t}else{u=r[q]}return u||""}}p=null})(),update:function(l){if(this.dom){this.dom.innerHTML=l}return this}};var k=e.prototype;e.addMethods=function(l){Ext.apply(k,l)};k.on=k.addListener;k.un=k.removeListener;k.autoBoxAdjust=true;var i=/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,c;e.get=function(m){var l,p,o;if(!m){return null}if(typeof m=="string"){if(!(p=h.getElementById(m))){return null}if(a[m]&&a[m].el){l=a[m].el;l.dom=p}else{l=e.addToCache(new e(p))}return l}else{if(m.tagName){if(!(o=m.id)){o=Ext.id(m)}if(a[o]&&a[o].el){l=a[o].el;l.dom=m}else{l=e.addToCache(new e(m))}return l}else{if(m instanceof e){if(m!=c){if(Ext.isIE&&(m.id==undefined||m.id=="")){m.dom=m.dom}else{m.dom=h.getElementById(m.id)||m.dom}}return m}else{if(m.isComposite){return m}else{if(Ext.isArray(m)){return e.select(m)}else{if(m==h){if(!c){var n=function(){};n.prototype=e.prototype;c=new n();c.dom=h}return c}}}}}}return null};e.addToCache=function(l,m){m=m||l.id;a[m]={el:l,data:{},events:{}};return l};e.data=function(m,l,n){m=e.get(m);if(!m){return null}var o=a[m.id].data;if(arguments.length==2){return o[l]}else{return(o[l]=n)}};function j(){if(!Ext.enableGarbageCollector){clearInterval(e.collectorThreadId)}else{var l,n,q,p;for(l in a){p=a[l];if(p.skipGC){Ext.EventManager.removeFromSpecialCache(p.el);continue}n=p.el;q=n.dom;if(!q||!q.parentNode||(!q.offsetParent&&!h.getElementById(l))){if(Ext.enableListenerCollection){Ext.EventManager.removeAll(q)}delete a[l]}}if(Ext.isIE){var m={};for(l in a){m[l]=a[l]}a=Ext.elCache=m}}}e.collectorThreadId=setInterval(j,30000);var b=function(){};b.prototype=e.prototype;e.Flyweight=function(l){this.dom=l};e.Flyweight.prototype=new b();e.Flyweight.prototype.isFlyweight=true;e._flyweights={};e.fly=function(n,l){var m=null;l=l||"_global";if(n=Ext.getDom(n)){(e._flyweights[l]=e._flyweights[l]||new e.Flyweight()).dom=n;m=e._flyweights[l]}return m};Ext.get=e.get;Ext.fly=e.fly;var g=Ext.isStrict?{select:1}:{input:1,select:1,textarea:1};if(Ext.isIE||Ext.isGecko){g.button=1}})();Ext.Element.addMethods(function(){var d="parentNode",b="nextSibling",c="previousSibling",e=Ext.DomQuery,a=Ext.get;return{findParent:function(m,l,h){var j=this.dom,g=document.body,k=0,i;if(Ext.isGecko&&Object.prototype.toString.call(j)=="[object XULElement]"){return null}l=l||50;if(isNaN(l)){i=Ext.getDom(l);l=Number.MAX_VALUE}while(j&&j.nodeType==1&&k<l&&j!=g&&j!=i){if(e.is(j,m)){return h?a(j):j}k++;j=j.parentNode}return null},findParentNode:function(j,i,g){var h=Ext.fly(this.dom.parentNode,"_internal");return h?h.findParent(j,i,g):null},up:function(h,g){return this.findParentNode(h,g,true)},select:function(g){return Ext.Element.select(g,this.dom)},query:function(g){return e.select(g,this.dom)},child:function(g,h){var i=e.selectNode(g,this.dom);return h?i:a(i)},down:function(g,h){var i=e.selectNode(" > "+g,this.dom);return h?i:a(i)},parent:function(g,h){return this.matchNode(d,d,g,h)},next:function(g,h){return this.matchNode(b,b,g,h)},prev:function(g,h){return this.matchNode(c,c,g,h)},first:function(g,h){return this.matchNode(b,"firstChild",g,h)},last:function(g,h){return this.matchNode(c,"lastChild",g,h)},matchNode:function(h,k,g,i){var j=this.dom[k];while(j){if(j.nodeType==1&&(!g||e.is(j,g))){return !i?a(j):j}j=j[h]}return null}}}());Ext.Element.addMethods(function(){var c=Ext.getDom,a=Ext.get,b=Ext.DomHelper;return{appendChild:function(d){return a(d).appendTo(this)},appendTo:function(d){c(d).appendChild(this.dom);return this},insertBefore:function(d){(d=c(d)).parentNode.insertBefore(this.dom,d);return this},insertAfter:function(d){(d=c(d)).parentNode.insertBefore(this.dom,d.nextSibling);return this},insertFirst:function(e,d){e=e||{};if(e.nodeType||e.dom||typeof e=="string"){e=c(e);this.dom.insertBefore(e,this.dom.firstChild);return !d?a(e):e}else{return this.createChild(e,this.dom.firstChild,d)}},replace:function(d){d=a(d);this.insertBefore(d);d.remove();return this},replaceWith:function(d){var e=this;if(d.nodeType||d.dom||typeof d=="string"){d=c(d);e.dom.parentNode.insertBefore(d,e.dom)}else{d=b.insertBefore(e.dom,d)}delete Ext.elCache[e.id];Ext.removeNode(e.dom);e.id=Ext.id(e.dom=d);Ext.Element.addToCache(e.isFlyweight?new Ext.Element(e.dom):e);return e},createChild:function(e,d,g){e=e||{tag:"div"};return d?b.insertBefore(d,e,g!==true):b[!this.dom.firstChild?"overwrite":"append"](this.dom,e,g!==true)},wrap:function(d,e){var g=b.insertBefore(this.dom,d||{tag:"div"},!e);g.dom?g.dom.appendChild(this.dom):g.appendChild(this.dom);return g},insertHtml:function(e,g,d){var h=b.insertHtml(e,this.dom,g);return d?Ext.get(h):h}}}());Ext.Element.addMethods(function(){var A=Ext.supports,h={},x=/(-[a-z])/gi,s=document.defaultView,D=/alpha\(opacity=(.*)\)/i,l=/^\s+|\s+$/g,B=Ext.Element,u=/\s+/,b=/\w/g,d="padding",c="margin",y="border",t="-left",q="-right",w="-top",o="-bottom",j="-width",r=Math,z="hidden",e="isClipped",k="overflow",n="overflow-x",m="overflow-y",C="originalClip",i={l:y+t+j,r:y+q+j,t:y+w+j,b:y+o+j},g={l:d+t,r:d+q,t:d+w,b:d+o},a={l:c+t,r:c+q,t:c+w,b:c+o},E=Ext.Element.data;function p(F,G){return G.charAt(1).toUpperCase()}function v(F){return h[F]||(h[F]=F=="float"?(A.cssFloat?"cssFloat":"styleFloat"):F.replace(x,p))}return{adjustWidth:function(F){var G=this;var H=(typeof F=="number");if(H&&G.autoBoxAdjust&&!G.isBorderBox()){F-=(G.getBorderWidth("lr")+G.getPadding("lr"))}return(H&&F<0)?0:F},adjustHeight:function(F){var G=this;var H=(typeof F=="number");if(H&&G.autoBoxAdjust&&!G.isBorderBox()){F-=(G.getBorderWidth("tb")+G.getPadding("tb"))}return(H&&F<0)?0:F},addClass:function(J){var K=this,I,F,H,G=[];if(!Ext.isArray(J)){if(typeof J=="string"&&!this.hasClass(J)){K.dom.className+=" "+J}}else{for(I=0,F=J.length;I<F;I++){H=J[I];if(typeof H=="string"&&(" "+K.dom.className+" ").indexOf(" "+H+" ")==-1){G.push(H)}}if(G.length){K.dom.className+=" "+G.join(" ")}}return K},removeClass:function(K){var L=this,J,G,F,I,H;if(!Ext.isArray(K)){K=[K]}if(L.dom&&L.dom.className){H=L.dom.className.replace(l,"").split(u);for(J=0,F=K.length;J<F;J++){I=K[J];if(typeof I=="string"){I=I.replace(l,"");G=H.indexOf(I);if(G!=-1){H.splice(G,1)}}}L.dom.className=H.join(" ")}return L},radioClass:function(I){var J=this.dom.parentNode.childNodes,G,H,F;I=Ext.isArray(I)?I:[I];for(H=0,F=J.length;H<F;H++){G=J[H];if(G&&G.nodeType==1){Ext.fly(G,"_internal").removeClass(I)}}return this.addClass(I)},toggleClass:function(F){return this.hasClass(F)?this.removeClass(F):this.addClass(F)},hasClass:function(F){return F&&(" "+this.dom.className+" ").indexOf(" "+F+" ")!=-1},replaceClass:function(G,F){return this.removeClass(G).addClass(F)},isStyle:function(F,G){return this.getStyle(F)==G},getStyle:function(){return s&&s.getComputedStyle?function(K){var I=this.dom,F,H,G,J;if(I==document){return null}K=v(K);G=(F=I.style[K])?F:(H=s.getComputedStyle(I,""))?H[K]:null;if(K=="marginRight"&&G!="0px"&&!A.correctRightMargin){J=I.style.display;I.style.display="inline-block";G=s.getComputedStyle(I,"").marginRight;I.style.display=J}if(K=="backgroundColor"&&G=="rgba(0, 0, 0, 0)"&&!A.correctTransparentColor){G="transparent"}return G}:function(J){var H=this.dom,F,G;if(H==document){return null}if(J=="opacity"){if(H.style.filter.match){if(F=H.style.filter.match(D)){var I=parseFloat(F[1]);if(!isNaN(I)){return I?I/100:0}}}return 1}J=v(J);return H.style[J]||((G=H.currentStyle)?G[J]:null)}}(),getColor:function(F,G,K){var I=this.getStyle(F),H=(typeof K!="undefined")?K:"#",J;if(!I||(/transparent|inherit/.test(I))){return G}if(/^r/.test(I)){Ext.each(I.slice(4,I.length-1).split(","),function(L){J=parseInt(L,10);H+=(J<16?"0":"")+J.toString(16)})}else{I=I.replace("#","");H+=I.length==3?I.replace(/^(\w)(\w)(\w)$/,"$1$1$2$2$3$3"):I}return(H.length>5?H.toLowerCase():G)},setStyle:function(I,H){var F,G;if(typeof I!="object"){F={};F[I]=H;I=F}for(G in I){H=I[G];G=="opacity"?this.setOpacity(H):this.dom.style[v(G)]=H}return this},setOpacity:function(G,F){var J=this,H=J.dom.style;if(!F||!J.anim){if(Ext.isIE9m){var I=G<1?"alpha(opacity="+G*100+")":"",K=H.filter.replace(D,"").replace(l,"");H.zoom=1;H.filter=K+(K.length>0?" ":"")+I}else{H.opacity=G}}else{J.anim({opacity:{to:G}},J.preanim(arguments,1),null,0.35,"easeIn")}return J},clearOpacity:function(){var F=this.dom.style;if(Ext.isIE9m){if(!Ext.isEmpty(F.filter)){F.filter=F.filter.replace(D,"").replace(l,"")}}else{F.opacity=F["-moz-opacity"]=F["-khtml-opacity"]=""}return this},getHeight:function(H){var G=this,J=G.dom,I=Ext.isIE9m&&G.isStyle("display","none"),F=r.max(J.offsetHeight,I?0:J.clientHeight)||0;F=!H?F:F-G.getBorderWidth("tb")-G.getPadding("tb");return F<0?0:F},getWidth:function(G){var H=this,J=H.dom,I=Ext.isIE9m&&H.isStyle("display","none"),F=r.max(J.offsetWidth,I?0:J.clientWidth)||0;F=!G?F:F-H.getBorderWidth("lr")-H.getPadding("lr");return F<0?0:F},setWidth:function(G,F){var H=this;G=H.adjustWidth(G);!F||!H.anim?H.dom.style.width=H.addUnits(G):H.anim({width:{to:G}},H.preanim(arguments,1));return H},setHeight:function(F,G){var H=this;F=H.adjustHeight(F);!G||!H.anim?H.dom.style.height=H.addUnits(F):H.anim({height:{to:F}},H.preanim(arguments,1));return H},getBorderWidth:function(F){return this.addStyles(F,i)},getPadding:function(F){return this.addStyles(F,g)},clip:function(){var F=this,G=F.dom;if(!E(G,e)){E(G,e,true);E(G,C,{o:F.getStyle(k),x:F.getStyle(n),y:F.getStyle(m)});F.setStyle(k,z);F.setStyle(n,z);F.setStyle(m,z)}return F},unclip:function(){var F=this,H=F.dom;if(E(H,e)){E(H,e,false);var G=E(H,C);if(G.o){F.setStyle(k,G.o)}if(G.x){F.setStyle(n,G.x)}if(G.y){F.setStyle(m,G.y)}}return F},addStyles:function(M,L){var J=0,K=M.match(b),I,H,G,F=K.length;for(G=0;G<F;G++){I=K[G];H=I&&parseInt(this.getStyle(L[I]),10);if(H){J+=r.abs(H)}}return J},margins:a}}());(function(){var a=Ext.lib.Dom,b="left",g="right",d="top",i="bottom",h="position",c="static",e="relative",j="auto",k="z-index";Ext.Element.addMethods({getX:function(){return a.getX(this.dom)},getY:function(){return a.getY(this.dom)},getXY:function(){return a.getXY(this.dom)},getOffsetsTo:function(l){var n=this.getXY(),m=Ext.fly(l,"_internal").getXY();return[n[0]-m[0],n[1]-m[1]]},setX:function(l,m){return this.setXY([l,this.getY()],this.animTest(arguments,m,1))},setY:function(m,l){return this.setXY([this.getX(),m],this.animTest(arguments,l,1))},setLeft:function(l){this.setStyle(b,this.addUnits(l));return this},setTop:function(l){this.setStyle(d,this.addUnits(l));return this},setRight:function(l){this.setStyle(g,this.addUnits(l));return this},setBottom:function(l){this.setStyle(i,this.addUnits(l));return this},setXY:function(n,l){var m=this;if(!l||!m.anim){a.setXY(m.dom,n)}else{m.anim({points:{to:n}},m.preanim(arguments,1),"motion")}return m},setLocation:function(l,n,m){return this.setXY([l,n],this.animTest(arguments,m,2))},moveTo:function(l,n,m){return this.setXY([l,n],this.animTest(arguments,m,2))},getLeft:function(l){return !l?this.getX():parseInt(this.getStyle(b),10)||0},getRight:function(l){var m=this;return !l?m.getX()+m.getWidth():(m.getLeft(true)+m.getWidth())||0},getTop:function(l){return !l?this.getY():parseInt(this.getStyle(d),10)||0},getBottom:function(l){var m=this;return !l?m.getY()+m.getHeight():(m.getTop(true)+m.getHeight())||0},position:function(p,o,l,n){var m=this;if(!p&&m.isStyle(h,c)){m.setStyle(h,e)}else{if(p){m.setStyle(h,p)}}if(o){m.setStyle(k,o)}if(l||n){m.setXY([l||false,n||false])}},clearPositioning:function(l){l=l||"";this.setStyle({left:l,right:l,top:l,bottom:l,"z-index":"",position:c});return this},getPositioning:function(){var m=this.getStyle(b);var n=this.getStyle(d);return{position:this.getStyle(h),left:m,right:m?"":this.getStyle(g),top:n,bottom:n?"":this.getStyle(i),"z-index":this.getStyle(k)}},setPositioning:function(l){var n=this,m=n.dom.style;n.setStyle(l);if(l.right==j){m.right=""}if(l.bottom==j){m.bottom=""}return n},translatePoints:function(m,u){u=isNaN(m[1])?u:m[1];m=isNaN(m[0])?m:m[0];var q=this,r=q.isStyle(h,e),s=q.getXY(),n=parseInt(q.getStyle(b),10),p=parseInt(q.getStyle(d),10);n=!isNaN(n)?n:(r?0:q.dom.offsetLeft);p=!isNaN(p)?p:(r?0:q.dom.offsetTop);return{left:(m-s[0]+n),top:(u-s[1]+p)}},animTest:function(m,l,n){return !!l&&this.preanim?this.preanim(m,n):false}})})();Ext.Element.addMethods({isScrollable:function(){var a=this.dom;return a.scrollHeight>a.clientHeight||a.scrollWidth>a.clientWidth},scrollTo:function(a,b){this.dom["scroll"+(/top/i.test(a)?"Top":"Left")]=b;return this},getScroll:function(){var i=this.dom,h=document,a=h.body,c=h.documentElement,b,g,e;if(i==h||i==a){if(Ext.isIE&&Ext.isStrict){b=c.scrollLeft;g=c.scrollTop}else{b=window.pageXOffset;g=window.pageYOffset}e={left:b||(a?a.scrollLeft:0),top:g||(a?a.scrollTop:0)}}else{e={left:i.scrollLeft,top:i.scrollTop}}return e}});Ext.Element.VISIBILITY=1;Ext.Element.DISPLAY=2;Ext.Element.OFFSETS=3;Ext.Element.ASCLASS=4;Ext.Element.visibilityCls="x-hide-nosize";Ext.Element.addMethods(function(){var e=Ext.Element,p="opacity",j="visibility",g="display",d="hidden",n="offsets",k="asclass",m="none",a="nosize",b="originalDisplay",c="visibilityMode",h="isVisible",i=e.data,l=function(r){var q=i(r,b);if(q===undefined){i(r,b,q="")}return q},o=function(r){var q=i(r,c);if(q===undefined){i(r,c,q=1)}return q};return{originalDisplay:"",visibilityMode:1,setVisibilityMode:function(q){i(this.dom,c,q);return this},animate:function(r,t,s,u,q){this.anim(r,{duration:t,callback:s,easing:u},q);return this},anim:function(t,u,r,w,s,q){r=r||"run";u=u||{};var v=this,x=Ext.lib.Anim[r](v.dom,t,(u.duration||w)||0.35,(u.easing||s)||"easeOut",function(){if(q){q.call(v)}if(u.callback){u.callback.call(u.scope||v,v,u)}},v);u.anim=x;return x},preanim:function(q,r){return !q[r]?false:(typeof q[r]=="object"?q[r]:{duration:q[r+1],callback:q[r+2],easing:q[r+3]})},isVisible:function(){var q=this,s=q.dom,r=i(s,h);if(typeof r=="boolean"){return r}r=!q.isStyle(j,d)&&!q.isStyle(g,m)&&!((o(s)==e.ASCLASS)&&q.hasClass(q.visibilityCls||e.visibilityCls));i(s,h,r);return r},setVisible:function(t,q){var w=this,r,y,x,v,u=w.dom,s=o(u);if(typeof q=="string"){switch(q){case g:s=e.DISPLAY;break;case j:s=e.VISIBILITY;break;case n:s=e.OFFSETS;break;case a:case k:s=e.ASCLASS;break}w.setVisibilityMode(s);q=false}if(!q||!w.anim){if(s==e.ASCLASS){w[t?"removeClass":"addClass"](w.visibilityCls||e.visibilityCls)}else{if(s==e.DISPLAY){return w.setDisplayed(t)}else{if(s==e.OFFSETS){if(!t){w.hideModeStyles={position:w.getStyle("position"),top:w.getStyle("top"),left:w.getStyle("left")};w.applyStyles({position:"absolute",top:"-10000px",left:"-10000px"})}else{w.applyStyles(w.hideModeStyles||{position:"",top:"",left:""});delete w.hideModeStyles}}else{w.fixDisplay();u.style.visibility=t?"visible":d}}}}else{if(t){w.setOpacity(0.01);w.setVisible(true)}w.anim({opacity:{to:(t?1:0)}},w.preanim(arguments,1),null,0.35,"easeIn",function(){t||w.setVisible(false).setOpacity(1)})}i(u,h,t);return w},hasMetrics:function(){var q=this.dom;return this.isVisible()||(o(q)==e.VISIBILITY)},toggle:function(q){var r=this;r.setVisible(!r.isVisible(),r.preanim(arguments,0));return r},setDisplayed:function(q){if(typeof q=="boolean"){q=q?l(this.dom):m}this.setStyle(g,q);return this},fixDisplay:function(){var q=this;if(q.isStyle(g,m)){q.setStyle(j,d);q.setStyle(g,l(this.dom));if(q.isStyle(g,m)){q.setStyle(g,"block")}}},hide:function(q){if(typeof q=="string"){this.setVisible(false,q);return this}this.setVisible(false,this.preanim(arguments,0));return this},show:function(q){if(typeof q=="string"){this.setVisible(true,q);return this}this.setVisible(true,this.preanim(arguments,0));return this}}}());(function(){var y=null,A=undefined,k=true,t=false,j="setX",h="setY",a="setXY",n="left",l="bottom",s="top",m="right",q="height",g="width",i="points",w="hidden",z="absolute",u="visible",e="motion",o="position",r="easeOut",d=new Ext.Element.Flyweight(),v={},x=function(B){return B||{}},p=function(B){d.dom=B;d.id=Ext.id(B);return d},c=function(B){if(!v[B]){v[B]=[]}return v[B]},b=function(C,B){v[C]=B};Ext.enableFx=k;Ext.Fx={switchStatements:function(C,D,B){return D.apply(this,B[C])},slideIn:function(H,E){E=x(E);var J=this,G=J.dom,M=G.style,O,B,L,D,C,M,I,N,K,F;H=H||"t";J.queueFx(E,function(){O=p(G).getXY();p(G).fixDisplay();B=p(G).getFxRestore();L={x:O[0],y:O[1],0:O[0],1:O[1],width:G.offsetWidth,height:G.offsetHeight};L.right=L.x+L.width;L.bottom=L.y+L.height;p(G).setWidth(L.width).setHeight(L.height);D=p(G).fxWrap(B.pos,E,w);M.visibility=u;M.position=z;function P(){p(G).fxUnwrap(D,B.pos,E);M.width=B.width;M.height=B.height;p(G).afterFx(E)}N={to:[L.x,L.y]};K={to:L.width};F={to:L.height};function Q(U,R,V,S,X,Z,ac,ab,aa,W,T){var Y={};p(U).setWidth(V).setHeight(S);if(p(U)[X]){p(U)[X](Z)}R[ac]=R[ab]="0";if(aa){Y.width=aa}if(W){Y.height=W}if(T){Y.points=T}return Y}I=p(G).switchStatements(H.toLowerCase(),Q,{t:[D,M,L.width,0,y,y,n,l,y,F,y],l:[D,M,0,L.height,y,y,m,s,K,y,y],r:[D,M,L.width,L.height,j,L.right,n,s,y,y,N],b:[D,M,L.width,L.height,h,L.bottom,n,s,y,F,N],tl:[D,M,0,0,y,y,m,l,K,F,N],bl:[D,M,0,0,h,L.y+L.height,m,s,K,F,N],br:[D,M,0,0,a,[L.right,L.bottom],n,s,K,F,N],tr:[D,M,0,0,j,L.x+L.width,n,l,K,F,N]});M.visibility=u;p(D).show();arguments.callee.anim=p(D).fxanim(I,E,e,0.5,r,P)});return J},slideOut:function(F,D){D=x(D);var H=this,E=H.dom,K=E.style,L=H.getXY(),C,B,I,J,G={to:0};F=F||"t";H.queueFx(D,function(){B=p(E).getFxRestore();I={x:L[0],y:L[1],0:L[0],1:L[1],width:E.offsetWidth,height:E.offsetHeight};I.right=I.x+I.width;I.bottom=I.y+I.height;p(E).setWidth(I.width).setHeight(I.height);C=p(E).fxWrap(B.pos,D,u);K.visibility=u;K.position=z;p(C).setWidth(I.width).setHeight(I.height);function M(){D.useDisplay?p(E).setDisplayed(t):p(E).hide();p(E).fxUnwrap(C,B.pos,D);K.width=B.width;K.height=B.height;p(E).afterFx(D)}function N(O,W,U,X,S,V,R,T,Q){var P={};O[W]=O[U]="0";P[X]=S;if(V){P[V]=R}if(T){P[T]=Q}return P}J=p(E).switchStatements(F.toLowerCase(),N,{t:[K,n,l,q,G],l:[K,m,s,g,G],r:[K,n,s,g,G,i,{to:[I.right,I.y]}],b:[K,n,s,q,G,i,{to:[I.x,I.bottom]}],tl:[K,m,l,g,G,q,G],bl:[K,m,s,g,G,q,G,i,{to:[I.x,I.bottom]}],br:[K,n,s,g,G,q,G,i,{to:[I.x+I.width,I.bottom]}],tr:[K,n,l,g,G,q,G,i,{to:[I.right,I.y]}]});arguments.callee.anim=p(C).fxanim(J,D,e,0.5,r,M)});return H},puff:function(H){H=x(H);var F=this,G=F.dom,C=G.style,D,B,E;F.queueFx(H,function(){D=p(G).getWidth();B=p(G).getHeight();p(G).clearOpacity();p(G).show();E=p(G).getFxRestore();function I(){H.useDisplay?p(G).setDisplayed(t):p(G).hide();p(G).clearOpacity();p(G).setPositioning(E.pos);C.width=E.width;C.height=E.height;C.fontSize="";p(G).afterFx(H)}arguments.callee.anim=p(G).fxanim({width:{to:p(G).adjustWidth(D*2)},height:{to:p(G).adjustHeight(B*2)},points:{by:[-D*0.5,-B*0.5]},opacity:{to:0},fontSize:{to:200,unit:"%"}},H,e,0.5,r,I)});return F},switchOff:function(F){F=x(F);var D=this,E=D.dom,B=E.style,C;D.queueFx(F,function(){p(E).clearOpacity();p(E).clip();C=p(E).getFxRestore();function G(){F.useDisplay?p(E).setDisplayed(t):p(E).hide();p(E).clearOpacity();p(E).setPositioning(C.pos);B.width=C.width;B.height=C.height;p(E).afterFx(F)}p(E).fxanim({opacity:{to:0.3}},y,y,0.1,y,function(){p(E).clearOpacity();(function(){p(E).fxanim({height:{to:1},points:{by:[0,p(E).getHeight()*0.5]}},F,e,0.3,"easeIn",G)}).defer(100)})});return D},highlight:function(D,H){H=x(H);var F=this,G=F.dom,B=H.attr||"backgroundColor",C={},E;F.queueFx(H,function(){p(G).clearOpacity();p(G).show();function I(){G.style[B]=E;p(G).afterFx(H)}E=G.style[B];C[B]={from:D||"ffff9c",to:H.endColor||p(G).getColor(B)||"ffffff"};arguments.callee.anim=p(G).fxanim(C,H,"color",1,"easeIn",I)});return F},frame:function(B,E,H){H=x(H);var D=this,G=D.dom,C,F;D.queueFx(H,function(){B=B||"#C3DAF9";if(B.length==6){B="#"+B}E=E||1;p(G).show();var L=p(G).getXY(),J={x:L[0],y:L[1],0:L[0],1:L[1],width:G.offsetWidth,height:G.offsetHeight},I=function(){C=p(document.body||document.documentElement).createChild({style:{position:z,"z-index":35000,border:"0px solid "+B}});return C.queueFx({},K)};arguments.callee.anim={isAnimated:true,stop:function(){E=0;C.stopFx()}};function K(){var M=Ext.isBorderBox?2:1;F=C.anim({top:{from:J.y,to:J.y-20},left:{from:J.x,to:J.x-20},borderWidth:{from:0,to:10},opacity:{from:1,to:0},height:{from:J.height,to:J.height+20*M},width:{from:J.width,to:J.width+20*M}},{duration:H.duration||1,callback:function(){C.remove();--E>0?I():p(G).afterFx(H)}});arguments.callee.anim={isAnimated:true,stop:function(){F.stop()}}}I()});return D},pause:function(D){var C=this.dom,B;this.queueFx({},function(){B=setTimeout(function(){p(C).afterFx({})},D*1000);arguments.callee.anim={isAnimated:true,stop:function(){clearTimeout(B);p(C).afterFx({})}}});return this},fadeIn:function(D){D=x(D);var B=this,C=B.dom,E=D.endOpacity||1;B.queueFx(D,function(){p(C).setOpacity(0);p(C).fixDisplay();C.style.visibility=u;arguments.callee.anim=p(C).fxanim({opacity:{to:E}},D,y,0.5,r,function(){if(E==1){p(C).clearOpacity()}p(C).afterFx(D)})});return B},fadeOut:function(E){E=x(E);var C=this,D=C.dom,B=D.style,F=E.endOpacity||0;C.queueFx(E,function(){arguments.callee.anim=p(D).fxanim({opacity:{to:F}},E,y,0.5,r,function(){if(F==0){Ext.Element.data(D,"visibilityMode")==Ext.Element.DISPLAY||E.useDisplay?B.display="none":B.visibility=w;p(D).clearOpacity()}p(D).afterFx(E)})});return C},scale:function(B,C,D){this.shift(Ext.apply({},D,{width:B,height:C}));return this},shift:function(D){D=x(D);var C=this.dom,B={};this.queueFx(D,function(){for(var E in D){if(D[E]!=A){B[E]={to:D[E]}}}B.width?B.width.to=p(C).adjustWidth(D.width):B;B.height?B.height.to=p(C).adjustWidth(D.height):B;if(B.x||B.y||B.xy){B.points=B.xy||{to:[B.x?B.x.to:p(C).getX(),B.y?B.y.to:p(C).getY()]}}arguments.callee.anim=p(C).fxanim(B,D,e,0.35,r,function(){p(C).afterFx(D)})});return this},ghost:function(E,C){C=x(C);var G=this,D=G.dom,J=D.style,H={opacity:{to:0},points:{}},K=H.points,B,I,F;E=E||"b";G.queueFx(C,function(){B=p(D).getFxRestore();I=p(D).getWidth();F=p(D).getHeight();function L(){C.useDisplay?p(D).setDisplayed(t):p(D).hide();p(D).clearOpacity();p(D).setPositioning(B.pos);J.width=B.width;J.height=B.height;p(D).afterFx(C)}K.by=p(D).switchStatements(E.toLowerCase(),function(N,M){return[N,M]},{t:[0,-F],l:[-I,0],r:[I,0],b:[0,F],tl:[-I,-F],bl:[-I,F],br:[I,F],tr:[I,-F]});arguments.callee.anim=p(D).fxanim(H,C,e,0.5,r,L)});return G},syncFx:function(){var B=this;B.fxDefaults=Ext.apply(B.fxDefaults||{},{block:t,concurrent:k,stopFx:t});return B},sequenceFx:function(){var B=this;B.fxDefaults=Ext.apply(B.fxDefaults||{},{block:t,concurrent:t,stopFx:t});return B},nextFx:function(){var B=c(this.dom.id)[0];if(B){B.call(this)}},hasActiveFx:function(){return c(this.dom.id)[0]},stopFx:function(B){var C=this,E=C.dom.id;if(C.hasActiveFx()){var D=c(E)[0];if(D&&D.anim){if(D.anim.isAnimated){b(E,[D]);D.anim.stop(B!==undefined?B:k)}else{b(E,[])}}}return C},beforeFx:function(B){if(this.hasActiveFx()&&!B.concurrent){if(B.stopFx){this.stopFx();return k}return t}return k},hasFxBlock:function(){var B=c(this.dom.id);return B&&B[0]&&B[0].block},queueFx:function(E,B){var C=p(this.dom);if(!C.hasFxBlock()){Ext.applyIf(E,C.fxDefaults);if(!E.concurrent){var D=C.beforeFx(E);B.block=E.block;c(C.dom.id).push(B);if(D){C.nextFx()}}else{B.call(C)}}return C},fxWrap:function(H,F,D){var E=this.dom,C,B;if(!F.wrap||!(C=Ext.getDom(F.wrap))){if(F.fixPosition){B=p(E).getXY()}var G=document.createElement("div");G.style.visibility=D;C=E.parentNode.insertBefore(G,E);p(C).setPositioning(H);if(p(C).isStyle(o,"static")){p(C).position("relative")}p(E).clearPositioning("auto");p(C).clip();C.appendChild(E);if(B){p(C).setXY(B)}}return C},fxUnwrap:function(C,F,E){var D=this.dom;p(D).clearPositioning();p(D).setPositioning(F);if(!E.wrap){var B=p(C).dom.parentNode;B.insertBefore(D,C);p(C).remove()}},getFxRestore:function(){var B=this.dom.style;return{pos:this.getPositioning(),width:B.width,height:B.height}},afterFx:function(C){var B=this.dom,D=B.id;if(C.afterStyle){p(B).setStyle(C.afterStyle)}if(C.afterCls){p(B).addClass(C.afterCls)}if(C.remove==k){p(B).remove()}if(C.callback){C.callback.call(C.scope,p(B))}if(!C.concurrent){c(D).shift();p(B).nextFx()}},fxanim:function(E,F,C,G,D,B){C=C||"run";F=F||{};var H=Ext.lib.Anim[C](this.dom,E,(F.duration||G)||0.35,(F.easing||D)||r,B,this);F.anim=H;return H}};Ext.Fx.resize=Ext.Fx.scale;Ext.Element.addMethods(Ext.Fx)})();Ext.CompositeElementLite=function(b,a){this.elements=[];this.add(b,a);this.el=new Ext.Element.Flyweight()};Ext.CompositeElementLite.prototype={isComposite:true,getElement:function(a){var b=this.el;b.dom=a;b.id=a.id;return b},transformElement:function(a){return Ext.getDom(a)},getCount:function(){return this.elements.length},add:function(d,b){var e=this,g=e.elements;if(!d){return this}if(typeof d=="string"){d=Ext.Element.selectorFunction(d,b)}else{if(d.isComposite){d=d.elements}else{if(!Ext.isIterable(d)){d=[d]}}}for(var c=0,a=d.length;c<a;++c){g.push(e.transformElement(d[c]))}return e},invoke:function(g,b){var h=this,d=h.elements,a=d.length,j,c;for(c=0;c<a;c++){j=d[c];if(j){Ext.Element.prototype[g].apply(h.getElement(j),b)}}return h},item:function(b){var d=this,c=d.elements[b],a=null;if(c){a=d.getElement(c)}return a},addListener:function(b,j,h,g){var d=this.elements,a=d.length,c,k;for(c=0;c<a;c++){k=d[c];if(k){Ext.EventManager.on(k,b,j,h||k,g)}}return this},each:function(g,d){var h=this,c=h.elements,a=c.length,b,j;for(b=0;b<a;b++){j=c[b];if(j){j=this.getElement(j);if(g.call(d||j,j,h,b)===false){break}}}return h},fill:function(a){var b=this;b.elements=[];b.add(a);return b},filter:function(a){var b=[],d=this,c=Ext.isFunction(a)?a:function(e){return e.is(a)};d.each(function(h,e,g){if(c(h,g)!==false){b[b.length]=d.transformElement(h)}});d.elements=b;return d},indexOf:function(a){return this.elements.indexOf(this.transformElement(a))},replaceElement:function(e,c,a){var b=!isNaN(e)?e:this.indexOf(e),g;if(b>-1){c=Ext.getDom(c);if(a){g=this.elements[b];g.parentNode.insertBefore(c,g);Ext.removeNode(g)}this.elements.splice(b,1,c)}return this},clear:function(){this.elements=[]}};Ext.CompositeElementLite.prototype.on=Ext.CompositeElementLite.prototype.addListener;Ext.CompositeElementLite.importElementMethods=function(){var c,b=Ext.Element.prototype,a=Ext.CompositeElementLite.prototype;for(c in b){if(typeof b[c]=="function"){(function(d){a[d]=a[d]||function(){return this.invoke(d,arguments)}}).call(a,c)}}};Ext.CompositeElementLite.importElementMethods();if(Ext.DomQuery){Ext.Element.selectorFunction=Ext.DomQuery.select}Ext.Element.select=function(a,b){var c;if(typeof a=="string"){c=Ext.Element.selectorFunction(a,b)}else{if(a.length!==undefined){c=a}else{throw"Invalid selector"}}return new Ext.CompositeElementLite(c)};Ext.select=Ext.Element.select;(function(){var b="beforerequest",e="requestcomplete",d="requestexception",h=undefined,c="load",i="POST",a="GET",g=window;Ext.data.Connection=function(j){Ext.apply(this,j);this.addEvents(b,e,d);Ext.data.Connection.superclass.constructor.call(this)};Ext.extend(Ext.data.Connection,Ext.util.Observable,{timeout:30000,autoAbort:false,disableCaching:true,disableCachingParam:"_dc",request:function(n){var s=this;if(s.fireEvent(b,s,n)){if(n.el){if(!Ext.isEmpty(n.indicatorText)){s.indicatorText='<div class="loading-indicator">'+n.indicatorText+"</div>"}if(s.indicatorText){Ext.getDom(n.el).innerHTML=s.indicatorText}n.success=(Ext.isFunction(n.success)?n.success:function(){}).createInterceptor(function(o){Ext.getDom(n.el).innerHTML=o.responseText})}var l=n.params,k=n.url||s.url,j,q={success:s.handleResponse,failure:s.handleFailure,scope:s,argument:{options:n},timeout:Ext.num(n.timeout,s.timeout)},m,t;if(Ext.isFunction(l)){l=l.call(n.scope||g,n)}l=Ext.urlEncode(s.extraParams,Ext.isObject(l)?Ext.urlEncode(l):l);if(Ext.isFunction(k)){k=k.call(n.scope||g,n)}if((m=Ext.getDom(n.form))){k=k||m.action;if(n.isUpload||(/multipart\/form-data/i.test(m.getAttribute("enctype")))){return s.doFormUpload.call(s,n,l,k)}t=Ext.lib.Ajax.serializeForm(m);l=l?(l+"&"+t):t}j=n.method||s.method||((l||n.xmlData||n.jsonData)?i:a);if(j===a&&(s.disableCaching&&n.disableCaching!==false)||n.disableCaching===true){var r=n.disableCachingParam||s.disableCachingParam;k=Ext.urlAppend(k,r+"="+(new Date().getTime()))}n.headers=Ext.applyIf(n.headers||{},s.defaultHeaders||{});if(n.autoAbort===true||s.autoAbort){s.abort()}if((j==a||n.xmlData||n.jsonData)&&l){k=Ext.urlAppend(k,l);l=""}return(s.transId=Ext.lib.Ajax.request(j,k,q,l,n))}else{return n.callback?n.callback.apply(n.scope,[n,h,h]):null}},isLoading:function(j){return j?Ext.lib.Ajax.isCallInProgress(j):!!this.transId},abort:function(j){if(j||this.isLoading()){Ext.lib.Ajax.abort(j||this.transId)}},handleResponse:function(j){this.transId=false;var k=j.argument.options;j.argument=k?k.argument:null;this.fireEvent(e,this,j,k);if(k.success){k.success.call(k.scope,j,k)}if(k.callback){k.callback.call(k.scope,k,true,j)}},handleFailure:function(j,l){this.transId=false;var k=j.argument.options;j.argument=k?k.argument:null;this.fireEvent(d,this,j,k,l);if(k.failure){k.failure.call(k.scope,j,k)}if(k.callback){k.callback.call(k.scope,k,false,j)}},doFormUpload:function(q,j,k){var l=Ext.id(),v=document,r=v.createElement("iframe"),m=Ext.getDom(q.form),u=[],t,p="multipart/form-data",n={target:m.target,method:m.method,encoding:m.encoding,enctype:m.enctype,action:m.action};Ext.fly(r).set({id:l,name:l,cls:"x-hidden",src:Ext.SSL_SECURE_URL});v.body.appendChild(r);if(Ext.isIE){document.frames[l].name=l}Ext.fly(m).set({target:l,method:i,enctype:p,encoding:p,action:k||n.action});Ext.iterate(Ext.urlDecode(j,false),function(w,o){t=v.createElement("input");Ext.fly(t).set({type:"hidden",value:o,name:w});m.appendChild(t);u.push(t)});function s(){var x=this,w={responseText:"",responseXML:null,argument:q.argument},A,z;try{A=r.contentWindow.document||r.contentDocument||g.frames[l].document;if(A){if(A.body){if(/textarea/i.test((z=A.body.firstChild||{}).tagName)){w.responseText=z.value}else{w.responseText=A.body.innerHTML}}w.responseXML=A.XMLDocument||A}}catch(y){}Ext.EventManager.removeListener(r,c,s,x);x.fireEvent(e,x,w,q);function o(D,C,B){if(Ext.isFunction(D)){D.apply(C,B)}}o(q.success,q.scope,[w,q]);o(q.callback,q.scope,[q,true,w]);if(!x.debugUploads){setTimeout(function(){Ext.removeNode(r)},100)}}Ext.EventManager.on(r,c,s,this);m.submit();Ext.fly(m).set(n);Ext.each(u,function(o){Ext.removeNode(o)})}})})();Ext.Ajax=new Ext.data.Connection({autoAbort:false,serializeForm:function(a){return Ext.lib.Ajax.serializeForm(a)}});Ext.util.JSON=new (function(){var useHasOwn=!!{}.hasOwnProperty,isNative=function(){var useNative=null;return function(){if(useNative===null){useNative=Ext.USE_NATIVE_JSON&&window.JSON&&JSON.toString()=="[object JSON]"}return useNative}}(),pad=function(n){return n<10?"0"+n:n},doDecode=function(json){return json?eval("("+json+")"):""},doEncode=function(o){if(!Ext.isDefined(o)||o===null){return"null"}else{if(Ext.isArray(o)){return encodeArray(o)}else{if(Ext.isDate(o)){return Ext.util.JSON.encodeDate(o)}else{if(Ext.isString(o)){return encodeString(o)}else{if(typeof o=="number"){return isFinite(o)?String(o):"null"}else{if(Ext.isBoolean(o)){return String(o)}else{var a=["{"],b,i,v;for(i in o){if(!o.getElementsByTagName){if(!useHasOwn||o.hasOwnProperty(i)){v=o[i];switch(typeof v){case"undefined":case"function":case"unknown":break;default:if(b){a.push(",")}a.push(doEncode(i),":",v===null?"null":doEncode(v));b=true}}}}a.push("}");return a.join("")}}}}}}},m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},encodeString=function(s){if(/["\\\x00-\x1f]/.test(s)){return'"'+s.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c}c=b.charCodeAt();return"\\u00"+Math.floor(c/16).toString(16)+(c%16).toString(16)})+'"'}return'"'+s+'"'},encodeArray=function(o){var a=["["],b,i,l=o.length,v;for(i=0;i<l;i+=1){v=o[i];switch(typeof v){case"undefined":case"function":case"unknown":break;default:if(b){a.push(",")}a.push(v===null?"null":Ext.util.JSON.encode(v));b=true}}a.push("]");return a.join("")};this.encodeDate=function(o){return'"'+o.getFullYear()+"-"+pad(o.getMonth()+1)+"-"+pad(o.getDate())+"T"+pad(o.getHours())+":"+pad(o.getMinutes())+":"+pad(o.getSeconds())+'"'};this.encode=function(){var ec;return function(o){if(!ec){ec=isNative()?JSON.stringify:doEncode}return ec(o)}}();this.decode=function(){var dc;return function(json){if(!dc){dc=isNative()?JSON.parse:doDecode}return dc(json)}}()})();Ext.encode=Ext.util.JSON.encode;Ext.decode=Ext.util.JSON.decode;Ext.EventManager=function(){var z,p,j=false,l=Ext.isGecko||Ext.isWebKit||Ext.isSafari||Ext.isIE10p,o=Ext.lib.Event,q=Ext.lib.Dom,c=document,A=window,r="DOMContentLoaded",t="complete",g=/^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,u=[];function n(E){var H=false,D=0,C=u.length,F=false,G;if(E){if(E.getElementById||E.navigator){for(;D<C;++D){G=u[D];if(G.el===E){H=G.id;break}}if(!H){H=Ext.id(E);u.push({id:H,el:E});F=true}}else{H=Ext.id(E)}if(!Ext.elCache[H]){Ext.Element.addToCache(new Ext.Element(E),H);if(F){Ext.elCache[H].skipGC=true}}}return H}function m(E,G,J,F,D,L){E=Ext.getDom(E);var C=n(E),K=Ext.elCache[C].events,H;H=o.on(E,G,D);K[G]=K[G]||[];K[G].push([J,D,L,H,F]);if(E.addEventListener&&G=="mousewheel"){var I=["DOMMouseScroll",D,false];E.addEventListener.apply(E,I);Ext.EventManager.addListener(A,"unload",function(){E.removeEventListener.apply(E,I)})}if(E==c&&G=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.addListener(D)}}function d(){if(window!=top){return false}try{c.documentElement.doScroll("left")}catch(C){return false}b();return true}function B(C){if(Ext.isIE9m&&d()){return true}if(c.readyState==t){b();return true}j||(p=setTimeout(arguments.callee,2));return false}var k;function i(C){k||(k=Ext.query("style, link[rel=stylesheet]"));if(k.length==c.styleSheets.length){b();return true}j||(p=setTimeout(arguments.callee,2));return false}function y(C){c.removeEventListener(r,arguments.callee,false);i()}function b(C){if(!j){j=true;if(p){clearTimeout(p)}if(l){c.removeEventListener(r,b,false)}if(Ext.isIE9m&&B.bindIE){c.detachEvent("onreadystatechange",B)}o.un(A,"load",arguments.callee)}if(z&&!Ext.isReady){Ext.isReady=true;z.fire();z.listeners=[]}}function a(){z||(z=new Ext.util.Event());if(l){c.addEventListener(r,b,false)}if(Ext.isIE9m){if(!B()){B.bindIE=true;c.attachEvent("onreadystatechange",B)}}else{if(Ext.isOpera){(c.readyState==t&&i())||c.addEventListener(r,y,false)}else{if(Ext.isWebKit){B()}}}o.on(A,"load",b)}function x(C,D){return function(){var E=Ext.toArray(arguments);if(D.target==Ext.EventObject.setEvent(E[0]).target){C.apply(this,E)}}}function w(D,E,C){return function(F){C.delay(E.buffer,D,null,[new Ext.EventObjectImpl(F)])}}function s(G,F,C,E,D){return function(H){Ext.EventManager.removeListener(F,C,E,D);G(H)}}function e(D,E,C){return function(G){var F=new Ext.util.DelayedTask(D);if(!C.tasks){C.tasks=[]}C.tasks.push(F);F.delay(E.delay||10,D,null,[new Ext.EventObjectImpl(G)])}}function h(H,G,C,J,K){var D=(!C||typeof C=="boolean")?{}:C,E=Ext.getDom(H),F;J=J||D.fn;K=K||D.scope;if(!E){throw'Error listening for "'+G+'". Element "'+H+"\" doesn't exist."}function I(M){if(!Ext){return}M=Ext.EventObject.setEvent(M);var L;if(D.delegate){if(!(L=M.getTarget(D.delegate,E))){return}}else{L=M.target}if(D.stopEvent){M.stopEvent()}if(D.preventDefault){M.preventDefault()}if(D.stopPropagation){M.stopPropagation()}if(D.normalized===false){M=M.browserEvent}J.call(K||E,M,L,D)}if(D.target){I=x(I,D)}if(D.delay){I=e(I,D,J)}if(D.single){I=s(I,E,G,J,K)}if(D.buffer){F=new Ext.util.DelayedTask(I);I=w(I,D,F)}m(E,G,J,F,I,K);return I}var v={addListener:function(E,C,G,F,D){if(typeof C=="object"){var J=C,H,I;for(H in J){I=J[H];if(!g.test(H)){if(Ext.isFunction(I)){h(E,H,J,I,J.scope)}else{h(E,H,I)}}}}else{h(E,C,D,G,F)}},removeListener:function(E,I,M,N){E=Ext.getDom(E);var C=n(E),K=E&&(Ext.elCache[C].events)[I]||[],D,H,F,G,J,L;for(H=0,J=K.length;H<J;H++){if(Ext.isArray(L=K[H])&&L[0]==M&&(!N||L[2]==N)){if(L[4]){L[4].cancel()}G=M.tasks&&M.tasks.length;if(G){while(G--){M.tasks[G].cancel()}delete M.tasks}D=L[1];o.un(E,I,o.extAdapter?L[3]:D);if(D&&E.addEventListener&&I=="mousewheel"){E.removeEventListener("DOMMouseScroll",D,false)}if(D&&E==c&&I=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.removeListener(D)}K.splice(H,1);if(K.length===0){delete Ext.elCache[C].events[I]}for(G in Ext.elCache[C].events){return false}Ext.elCache[C].events={};return false}}},removeAll:function(E){E=Ext.getDom(E);var D=n(E),J=Ext.elCache[D]||{},M=J.events||{},I,H,K,F,L,G,C;for(F in M){if(M.hasOwnProperty(F)){I=M[F];for(H=0,K=I.length;H<K;H++){L=I[H];if(L[4]){L[4].cancel()}if(L[0].tasks&&(G=L[0].tasks.length)){while(G--){L[0].tasks[G].cancel()}delete L.tasks}C=L[1];o.un(E,F,o.extAdapter?L[3]:C);if(E.addEventListener&&C&&F=="mousewheel"){E.removeEventListener("DOMMouseScroll",C,false)}if(C&&E==c&&F=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.removeListener(C)}}}}if(Ext.elCache[D]){Ext.elCache[D].events={}}},getListeners:function(F,C){F=Ext.getDom(F);var H=n(F),D=Ext.elCache[H]||{},G=D.events||{},E=[];if(G&&G[C]){return G[C]}else{return null}},removeFromSpecialCache:function(E){var D=0,C=u.length;for(;D<C;++D){if(u[D].el==E){u.splice(D,1)}}},purgeElement:function(E,C,G){E=Ext.getDom(E);var D=n(E),J=Ext.elCache[D]||{},K=J.events||{},F,I,H;if(G){if(K&&K.hasOwnProperty(G)){I=K[G];for(F=0,H=I.length;F<H;F++){Ext.EventManager.removeListener(E,G,I[F][0])}}}else{Ext.EventManager.removeAll(E)}if(C&&E&&E.childNodes){for(F=0,H=E.childNodes.length;F<H;F++){Ext.EventManager.purgeElement(E.childNodes[F],C,G)}}},_unload:function(){var C;for(C in Ext.elCache){Ext.EventManager.removeAll(C)}delete Ext.elCache;delete Ext.Element._flyweights;var G,D,F,E=Ext.lib.Ajax;(typeof E.conn=="object")?D=E.conn:D={};for(F in D){G=D[F];if(G){E.abort({conn:G,tId:F})}}},onDocumentReady:function(E,D,C){if(Ext.isReady){z||(z=new Ext.util.Event());z.addListener(E,D,C);z.fire();z.listeners=[]}else{if(!z){a()}C=C||{};C.delay=C.delay||1;z.addListener(E,D,C)}},fireDocReady:b};v.on=v.addListener;v.un=v.removeListener;v.stoppedMouseDownEvent=new Ext.util.Event();return v}();Ext.onReady=Ext.EventManager.onDocumentReady;(function(){var a=function(){var c=document.body||document.getElementsByTagName("body")[0];if(!c){return false}var b=[];if(Ext.isIE){if(!Ext.isIE10p){b.push("ext-ie")}if(Ext.isIE6){b.push("ext-ie6")}else{if(Ext.isIE7){b.push("ext-ie7","ext-ie7m")}else{if(Ext.isIE8){b.push("ext-ie8","ext-ie8m")}else{if(Ext.isIE9){b.push("ext-ie9","ext-ie9m")}else{if(Ext.isIE10){b.push("ext-ie10")}}}}}}if(Ext.isGecko){if(Ext.isGecko2){b.push("ext-gecko2")}else{b.push("ext-gecko3")}}if(Ext.isOpera){b.push("ext-opera")}if(Ext.isWebKit){b.push("ext-webkit")}if(Ext.isSafari){b.push("ext-safari "+(Ext.isSafari2?"ext-safari2":(Ext.isSafari3?"ext-safari3":"ext-safari4")))}else{if(Ext.isChrome){b.push("ext-chrome")}}if(Ext.isMac){b.push("ext-mac")}if(Ext.isLinux){b.push("ext-linux")}if(Ext.isStrict||Ext.isBorderBox){var d=c.parentNode;if(d){if(!Ext.isStrict){Ext.fly(d,"_internal").addClass("x-quirks");if(Ext.isIE9m&&!Ext.isStrict){Ext.isIEQuirks=true}}Ext.fly(d,"_internal").addClass(((Ext.isStrict&&Ext.isIE)||(!Ext.enableForcedBoxModel&&!Ext.isIE))?" ext-strict":" ext-border-box")}}if(Ext.enableForcedBoxModel&&!Ext.isIE){Ext.isForcedBorderBox=true;b.push("ext-forced-border-box")}Ext.fly(c,"_internal").addClass(b);return true};if(!a()){Ext.onReady(a)}})();(function(){var b=Ext.apply(Ext.supports,{correctRightMargin:true,correctTransparentColor:true,cssFloat:true});var a=function(){var g=document.createElement("div"),e=document,c,d;g.innerHTML='<div style="height:30px;width:50px;"><div style="height:20px;width:20px;"></div></div><div style="float:left;background-color:transparent;">';e.body.appendChild(g);d=g.lastChild;if((c=e.defaultView)){if(c.getComputedStyle(g.firstChild.firstChild,null).marginRight!="0px"){b.correctRightMargin=false}if(c.getComputedStyle(d,null).backgroundColor!="transparent"){b.correctTransparentColor=false}}b.cssFloat=!!d.style.cssFloat;e.body.removeChild(g)};if(Ext.isReady){a()}else{Ext.onReady(a)}})();Ext.EventObject=function(){var b=Ext.lib.Event,c=/(dbl)?click/,a={3:13,63234:37,63235:39,63232:38,63233:40,63276:33,63277:34,63272:46,63273:36,63275:35},d=Ext.isIE?{1:0,4:1,2:2}:{0:0,1:1,2:2};Ext.EventObjectImpl=function(g){if(g){this.setEvent(g.browserEvent||g)}};Ext.EventObjectImpl.prototype={setEvent:function(h){var g=this;if(h==g||(h&&h.browserEvent)){return h}g.browserEvent=h;if(h){g.button=h.button?d[h.button]:(h.which?h.which-1:-1);if(c.test(h.type)&&g.button==-1){g.button=0}g.type=h.type;g.shiftKey=h.shiftKey;g.ctrlKey=h.ctrlKey||h.metaKey||false;g.altKey=h.altKey;g.keyCode=h.keyCode;g.charCode=h.charCode;g.target=b.getTarget(h);g.xy=b.getXY(h)}else{g.button=-1;g.shiftKey=false;g.ctrlKey=false;g.altKey=false;g.keyCode=0;g.charCode=0;g.target=null;g.xy=[0,0]}return g},stopEvent:function(){var e=this;if(e.browserEvent){if(e.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(e)}b.stopEvent(e.browserEvent)}},preventDefault:function(){if(this.browserEvent){b.preventDefault(this.browserEvent)}},stopPropagation:function(){var e=this;if(e.browserEvent){if(e.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(e)}b.stopPropagation(e.browserEvent)}},getCharCode:function(){return this.charCode||this.keyCode},getKey:function(){return this.normalizeKey(this.keyCode||this.charCode)},normalizeKey:function(e){return Ext.isSafari?(a[e]||e):e},getPageX:function(){return this.xy[0]},getPageY:function(){return this.xy[1]},getXY:function(){return this.xy},getTarget:function(g,h,e){return g?Ext.fly(this.target).findParent(g,h,e):(e?Ext.get(this.target):this.target)},getRelatedTarget:function(){return this.browserEvent?b.getRelatedTarget(this.browserEvent):null},getWheelDelta:function(){var g=this.browserEvent;var h=0;if(g.wheelDelta){h=g.wheelDelta/120}else{if(g.detail){h=-g.detail/3}}return h},within:function(h,i,e){if(h){var g=this[i?"getRelatedTarget":"getTarget"]();return g&&((e?(g==Ext.getDom(h)):false)||Ext.fly(h).contains(g))}return false}};return new Ext.EventObjectImpl()}();Ext.Loader=Ext.apply({},{load:function(j,i,k,c){var k=k||this,g=document.getElementsByTagName("head")[0],b=document.createDocumentFragment(),a=j.length,h=0,e=this;var l=function(m){g.appendChild(e.buildScriptTag(j[m],d))};var d=function(){h++;if(a==h&&typeof i=="function"){i.call(k)}else{if(c===true){l(h)}}};if(c===true){l.call(this,0)}else{Ext.each(j,function(n,m){b.appendChild(this.buildScriptTag(n,d))},this);g.appendChild(b)}},buildScriptTag:function(b,c){var a=document.createElement("script");a.type="text/javascript";a.src=b;if(a.readyState){a.onreadystatechange=function(){if(a.readyState=="loaded"||a.readyState=="complete"){a.onreadystatechange=null;c()}}}else{a.onload=c}return a}});Ext.ns("Ext.grid","Ext.list","Ext.dd","Ext.tree","Ext.form","Ext.menu","Ext.state","Ext.layout.boxOverflow","Ext.app","Ext.ux","Ext.chart","Ext.direct","Ext.slider");Ext.apply(Ext,function(){var c=Ext,a=0,b=null;return{emptyFn:function(){},BLANK_IMAGE_URL:Ext.isIE6||Ext.isIE7||Ext.isAir?"http://www.extjs.com/s.gif":"data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==",extendX:function(d,e){return Ext.extend(d,e(d.prototype))},getDoc:function(){return Ext.get(document)},num:function(e,d){e=Number(Ext.isEmpty(e)||Ext.isArray(e)||typeof e=="boolean"||(typeof e=="string"&&e.trim().length==0)?NaN:e);return isNaN(e)?d:e},value:function(g,d,e){return Ext.isEmpty(g,e)?d:g},escapeRe:function(d){return d.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1")},sequence:function(h,d,g,e){h[d]=h[d].createSequence(g,e)},addBehaviors:function(i){if(!Ext.isReady){Ext.onReady(function(){Ext.addBehaviors(i)})}else{var e={},h,d,g;for(d in i){if((h=d.split("@"))[1]){g=h[0];if(!e[g]){e[g]=Ext.select(g)}e[g].on(h[1],i[d])}}e=null}},getScrollBarWidth:function(g){if(!Ext.isReady){return 0}if(g===true||b===null){var i=Ext.getBody().createChild('<div class="x-hide-offsets" style="width:100px;height:50px;overflow:hidden;"><div style="height:200px;"></div></div>'),h=i.child("div",true);var e=h.offsetWidth;i.setStyle("overflow",(Ext.isWebKit||Ext.isGecko)?"auto":"scroll");var d=h.offsetWidth;i.remove();b=e-d+2}return b},combine:function(){var g=arguments,e=g.length,j=[];for(var h=0;h<e;h++){var d=g[h];if(Ext.isArray(d)){j=j.concat(d)}else{if(d.length!==undefined&&!d.substr){j=j.concat(Array.prototype.slice.call(d,0))}else{j.push(d)}}}return j},copyTo:function(d,e,g){if(typeof g=="string"){g=g.split(/[,;\s]/)}Ext.each(g,function(h){if(e.hasOwnProperty(h)){d[h]=e[h]}},this);return d},destroy:function(){Ext.each(arguments,function(d){if(d){if(Ext.isArray(d)){this.destroy.apply(this,d)}else{if(typeof d.destroy=="function"){d.destroy()}else{if(d.dom){d.remove()}}}}},this)},destroyMembers:function(l,j,g,h){for(var k=1,e=arguments,d=e.length;k<d;k++){Ext.destroy(l[e[k]]);delete l[e[k]]}},clean:function(d){var e=[];Ext.each(d,function(g){if(!!g){e.push(g)}});return e},unique:function(d){var e=[],g={};Ext.each(d,function(h){if(!g[h]){e.push(h)}g[h]=true});return e},flatten:function(d){var g=[];function e(h){Ext.each(h,function(i){if(Ext.isArray(i)){e(i)}else{g.push(i)}});return g}return e(d)},min:function(d,e){var g=d[0];e=e||function(i,h){return i<h?-1:1};Ext.each(d,function(h){g=e(g,h)==-1?g:h});return g},max:function(d,e){var g=d[0];e=e||function(i,h){return i>h?1:-1};Ext.each(d,function(h){g=e(g,h)==1?g:h});return g},mean:function(d){return d.length>0?Ext.sum(d)/d.length:undefined},sum:function(d){var e=0;Ext.each(d,function(g){e+=g});return e},partition:function(d,e){var g=[[],[]];Ext.each(d,function(j,k,h){g[(e&&e(j,k,h))||(!e&&j)?0:1].push(j)});return g},invoke:function(d,e){var h=[],g=Array.prototype.slice.call(arguments,2);Ext.each(d,function(j,k){if(j&&typeof j[e]=="function"){h.push(j[e].apply(j,g))}else{h.push(undefined)}});return h},pluck:function(d,g){var e=[];Ext.each(d,function(h){e.push(h[g])});return e},zip:function(){var n=Ext.partition(arguments,function(i){return typeof i!="function"}),k=n[0],m=n[1][0],d=Ext.max(Ext.pluck(k,"length")),h=[];for(var l=0;l<d;l++){h[l]=[];if(m){h[l]=m.apply(m,Ext.pluck(k,l))}else{for(var g=0,e=k.length;g<e;g++){h[l].push(k[g][l])}}}return h},getCmp:function(d){return Ext.ComponentMgr.get(d)},useShims:c.isIE6||(c.isMac&&c.isGecko2),type:function(e){if(e===undefined||e===null){return false}if(e.htmlElement){return"element"}var d=typeof e;if(d=="object"&&e.nodeName){switch(e.nodeType){case 1:return"element";case 3:return(/\S/).test(e.nodeValue)?"textnode":"whitespace"}}if(d=="object"||d=="function"){switch(e.constructor){case Array:return"array";case RegExp:return"regexp";case Date:return"date"}if(typeof e.length=="number"&&typeof e.item=="function"){return"nodelist"}}return d},intercept:function(h,d,g,e){h[d]=h[d].createInterceptor(g,e)},callback:function(d,h,g,e){if(typeof d=="function"){if(e){d.defer(e,h,g||[])}else{d.apply(h,g||[])}}}}}());Ext.apply(Function.prototype,{createSequence:function(b,a){var c=this;return(typeof b!="function")?this:function(){var d=c.apply(this||window,arguments);b.apply(a||this||window,arguments);return d}}});Ext.applyIf(String,{escape:function(a){return a.replace(/('|\\)/g,"\\$1")},leftPad:function(d,b,c){var a=String(d);if(!c){c=" "}while(a.length<b){a=c+a}return a}});String.prototype.toggle=function(b,a){return this==b?a:b};String.prototype.trim=function(){var a=/^\s+|\s+$/g;return function(){return this.replace(a,"")}}();Date.prototype.getElapsed=function(a){return Math.abs((a||new Date()).getTime()-this.getTime())};Ext.applyIf(Number.prototype,{constrain:function(b,a){return Math.min(Math.max(this,b),a)}});Ext.lib.Dom.getRegion=function(a){return Ext.lib.Region.getRegion(a)};Ext.lib.Region=function(d,g,a,c){var e=this;e.top=d;e[1]=d;e.right=g;e.bottom=a;e.left=c;e[0]=c};Ext.lib.Region.prototype={contains:function(b){var a=this;return(b.left>=a.left&&b.right<=a.right&&b.top>=a.top&&b.bottom<=a.bottom)},getArea:function(){var a=this;return((a.bottom-a.top)*(a.right-a.left))},intersect:function(h){var g=this,d=Math.max(g.top,h.top),e=Math.min(g.right,h.right),a=Math.min(g.bottom,h.bottom),c=Math.max(g.left,h.left);if(a>=d&&e>=c){return new Ext.lib.Region(d,e,a,c)}},union:function(h){var g=this,d=Math.min(g.top,h.top),e=Math.max(g.right,h.right),a=Math.max(g.bottom,h.bottom),c=Math.min(g.left,h.left);return new Ext.lib.Region(d,e,a,c)},constrainTo:function(b){var a=this;a.top=a.top.constrain(b.top,b.bottom);a.bottom=a.bottom.constrain(b.top,b.bottom);a.left=a.left.constrain(b.left,b.right);a.right=a.right.constrain(b.left,b.right);return a},adjust:function(d,c,a,g){var e=this;e.top+=d;e.left+=c;e.right+=g;e.bottom+=a;return e}};Ext.lib.Region.getRegion=function(e){var h=Ext.lib.Dom.getXY(e),d=h[1],g=h[0]+e.offsetWidth,a=h[1]+e.offsetHeight,c=h[0];return new Ext.lib.Region(d,g,a,c)};Ext.lib.Point=function(a,c){if(Ext.isArray(a)){c=a[1];a=a[0]}var b=this;b.x=b.right=b.left=b[0]=a;b.y=b.top=b.bottom=b[1]=c};Ext.lib.Point.prototype=new Ext.lib.Region();Ext.apply(Ext.DomHelper,function(){var e,a="afterbegin",h="afterend",i="beforebegin",d="beforeend",b=/tag|children|cn|html$/i;function g(m,p,n,q,l,j){m=Ext.getDom(m);var k;if(e.useDom){k=c(p,null);if(j){m.appendChild(k)}else{(l=="firstChild"?m:m.parentNode).insertBefore(k,m[l]||m)}}else{k=Ext.DomHelper.insertHtml(q,m,Ext.DomHelper.createHtml(p))}return n?Ext.get(k,true):k}function c(j,r){var k,u=document,p,s,m,t;if(Ext.isArray(j)){k=u.createDocumentFragment();for(var q=0,n=j.length;q<n;q++){c(j[q],k)}}else{if(typeof j=="string"){k=u.createTextNode(j)}else{k=u.createElement(j.tag||"div");p=!!k.setAttribute;for(var s in j){if(!b.test(s)){m=j[s];if(s=="cls"){k.className=m}else{if(p){k.setAttribute(s,m)}else{k[s]=m}}}}Ext.DomHelper.applyStyles(k,j.style);if((t=j.children||j.cn)){c(t,k)}else{if(j.html){k.innerHTML=j.html}}}}if(r){r.appendChild(k)}return k}e={createTemplate:function(k){var j=Ext.DomHelper.createHtml(k);return new Ext.Template(j)},useDom:false,insertBefore:function(j,l,k){return g(j,l,k,i)},insertAfter:function(j,l,k){return g(j,l,k,h,"nextSibling")},insertFirst:function(j,l,k){return g(j,l,k,a,"firstChild")},append:function(j,l,k){return g(j,l,k,d,"",true)},createDom:c};return e}());Ext.apply(Ext.Template.prototype,{disableFormats:false,re:/\{([\w\-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,argsRe:/^\s*['"](.*)["']\s*$/,compileARe:/\\/g,compileBRe:/(\r\n|\n)/g,compileCRe:/'/g,applyTemplate:function(b){var g=this,a=g.disableFormats!==true,e=Ext.util.Format,c=g;if(g.compiled){return g.compiled(b)}function d(j,l,p,k){if(p&&a){if(p.substr(0,5)=="this."){return c.call(p.substr(5),b[l],b)}else{if(k){var o=g.argsRe;k=k.split(",");for(var n=0,h=k.length;n<h;n++){k[n]=k[n].replace(o,"$1")}k=[b[l]].concat(k)}else{k=[b[l]]}return e[p].apply(e,k)}}else{return b[l]!==undefined?b[l]:""}}return g.html.replace(g.re,d)},compile:function(){var me=this,fm=Ext.util.Format,useF=me.disableFormats!==true,sep=Ext.isGecko?"+":",",body;function fn(m,name,format,args){if(format&&useF){args=args?","+args:"";if(format.substr(0,5)!="this."){format="fm."+format+"("}else{format='this.call("'+format.substr(5)+'", ';args=", values"}}else{args="";format="(values['"+name+"'] == undefined ? '' : "}return"'"+sep+format+"values['"+name+"']"+args+")"+sep+"'"}if(Ext.isGecko){body="this.compiled = function(values){ return '"+me.html.replace(me.compileARe,"\\\\").replace(me.compileBRe,"\\n").replace(me.compileCRe,"\\'").replace(me.re,fn)+"';};"}else{body=["this.compiled = function(values){ return ['"];body.push(me.html.replace(me.compileARe,"\\\\").replace(me.compileBRe,"\\n").replace(me.compileCRe,"\\'").replace(me.re,fn));body.push("'].join('');};");body=body.join("")}eval(body);return me},call:function(c,b,a){return this[c](b,a)}});Ext.Template.prototype.apply=Ext.Template.prototype.applyTemplate;Ext.util.Functions={createInterceptor:function(c,b,a){var d=c;if(!Ext.isFunction(b)){return c}else{return function(){var g=this,e=arguments;b.target=g;b.method=c;return(b.apply(a||g||window,e)!==false)?c.apply(g||window,e):null}}},createDelegate:function(c,d,b,a){if(!Ext.isFunction(c)){return c}return function(){var g=b||arguments;if(a===true){g=Array.prototype.slice.call(arguments,0);g=g.concat(b)}else{if(Ext.isNumber(a)){g=Array.prototype.slice.call(arguments,0);var e=[a,0].concat(b);Array.prototype.splice.apply(g,e)}}return c.apply(d||window,g)}},defer:function(d,c,e,b,a){d=Ext.util.Functions.createDelegate(d,e,b,a);if(c>0){return setTimeout(d,c)}d();return 0},createSequence:function(c,b,a){if(!Ext.isFunction(b)){return c}else{return function(){var d=c.apply(this||window,arguments);b.apply(a||this||window,arguments);return d}}}};Ext.defer=Ext.util.Functions.defer;Ext.createInterceptor=Ext.util.Functions.createInterceptor;Ext.createSequence=Ext.util.Functions.createSequence;Ext.createDelegate=Ext.util.Functions.createDelegate;Ext.apply(Ext.util.Observable.prototype,function(){function a(j){var i=(this.methodEvents=this.methodEvents||{})[j],d,c,g,h=this;if(!i){this.methodEvents[j]=i={};i.originalFn=this[j];i.methodName=j;i.before=[];i.after=[];var b=function(l,k,e){if((c=l.apply(k||h,e))!==undefined){if(typeof c=="object"){if(c.returnValue!==undefined){d=c.returnValue}else{d=c}g=!!c.cancel}else{if(c===false){g=true}else{d=c}}}};this[j]=function(){var l=Array.prototype.slice.call(arguments,0),k;d=c=undefined;g=false;for(var m=0,e=i.before.length;m<e;m++){k=i.before[m];b(k.fn,k.scope,l);if(g){return d}}if((c=i.originalFn.apply(h,l))!==undefined){d=c}for(var m=0,e=i.after.length;m<e;m++){k=i.after[m];b(k.fn,k.scope,l);if(g){return d}}return d}}return i}return{beforeMethod:function(d,c,b){a.call(this,d).before.push({fn:c,scope:b})},afterMethod:function(d,c,b){a.call(this,d).after.push({fn:c,scope:b})},removeMethodListener:function(j,g,d){var h=this.getMethodEvent(j);for(var c=0,b=h.before.length;c<b;c++){if(h.before[c].fn==g&&h.before[c].scope==d){h.before.splice(c,1);return}}for(var c=0,b=h.after.length;c<b;c++){if(h.after[c].fn==g&&h.after[c].scope==d){h.after.splice(c,1);return}}},relayEvents:function(j,e){var h=this;function g(i){return function(){return h.fireEvent.apply(h,[i].concat(Array.prototype.slice.call(arguments,0)))}}for(var d=0,b=e.length;d<b;d++){var c=e[d];h.events[c]=h.events[c]||true;j.on(c,g(c),h)}},enableBubble:function(e){var g=this;if(!Ext.isEmpty(e)){e=Ext.isArray(e)?e:Array.prototype.slice.call(arguments,0);for(var d=0,b=e.length;d<b;d++){var c=e[d];c=c.toLowerCase();var h=g.events[c]||true;if(typeof h=="boolean"){h=new Ext.util.Event(g,c);g.events[c]=h}h.bubble=true}}}}}());Ext.util.Observable.capture=function(c,b,a){c.fireEvent=c.fireEvent.createInterceptor(b,a)};Ext.util.Observable.observeClass=function(b,a){if(b){if(!b.fireEvent){Ext.apply(b,new Ext.util.Observable());Ext.util.Observable.capture(b.prototype,b.fireEvent,b)}if(typeof a=="object"){b.on(a)}return b}};Ext.apply(Ext.EventManager,function(){var d,k,g,b,a=Ext.lib.Dom,j=/^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,c=Ext.EventManager._unload,i=0,h=0,e=Ext.isWebKit?Ext.num(navigator.userAgent.match(/AppleWebKit\/(\d+)/)[1])>=525:!((Ext.isGecko&&!Ext.isWindows)||Ext.isOpera);return{_unload:function(){Ext.EventManager.un(window,"resize",this.fireWindowResize,this);c.call(Ext.EventManager)},doResizeEvent:function(){var m=a.getViewHeight(),l=a.getViewWidth();if(h!=m||i!=l){d.fire(i=l,h=m)}},onWindowResize:function(n,m,l){if(!d){d=new Ext.util.Event();k=new Ext.util.DelayedTask(this.doResizeEvent);Ext.EventManager.on(window,"resize",this.fireWindowResize,this)}d.addListener(n,m,l)},fireWindowResize:function(){if(d){k.delay(100)}},onTextResize:function(o,n,l){if(!g){g=new Ext.util.Event();var m=new Ext.Element(document.createElement("div"));m.dom.className="x-text-resize";m.dom.innerHTML="X";m.appendTo(document.body);b=m.dom.offsetHeight;setInterval(function(){if(m.dom.offsetHeight!=b){g.fire(b,b=m.dom.offsetHeight)}},this.textResizeInterval)}g.addListener(o,n,l)},removeResizeListener:function(m,l){if(d){d.removeListener(m,l)}},fireResize:function(){if(d){d.fire(a.getViewWidth(),a.getViewHeight())}},textResizeInterval:50,ieDeferSrc:false,getKeyEvent:function(){return e?"keydown":"keypress"},useKeydown:e}}());Ext.EventManager.on=Ext.EventManager.addListener;Ext.apply(Ext.EventObjectImpl.prototype,{BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,RETURN:13,SHIFT:16,CTRL:17,CONTROL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGEUP:33,PAGE_DOWN:34,PAGEDOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,isNavKeyPress:function(){var b=this,a=this.normalizeKey(b.keyCode);return(a>=33&&a<=40)||a==b.RETURN||a==b.TAB||a==b.ESC},isSpecialKey:function(){var a=this.normalizeKey(this.keyCode);return(this.type=="keypress"&&this.ctrlKey)||this.isNavKeyPress()||(a==this.BACKSPACE)||(a>=16&&a<=20)||(a>=44&&a<=46)},getPoint:function(){return new Ext.lib.Point(this.xy[0],this.xy[1])},hasModifier:function(){return((this.ctrlKey||this.altKey)||this.shiftKey)}});Ext.Element.addMethods({swallowEvent:function(a,b){var d=this;function c(g){g.stopPropagation();if(b){g.preventDefault()}}if(Ext.isArray(a)){Ext.each(a,function(g){d.on(g,c)});return d}d.on(a,c);return d},relayEvent:function(a,b){this.on(a,function(c){b.fireEvent(a,c)})},clean:function(b){var d=this,e=d.dom,g=e.firstChild,c=-1;if(Ext.Element.data(e,"isCleaned")&&b!==true){return d}while(g){var a=g.nextSibling;if(g.nodeType==3&&!(/\S/.test(g.nodeValue))){e.removeChild(g)}else{g.nodeIndex=++c}g=a}Ext.Element.data(e,"isCleaned",true);return d},load:function(){var a=this.getUpdater();a.update.apply(a,arguments);return this},getUpdater:function(){return this.updateManager||(this.updateManager=new Ext.Updater(this))},update:function(html,loadScripts,callback){if(!this.dom){return this}html=html||"";if(loadScripts!==true){this.dom.innerHTML=html;if(typeof callback=="function"){callback()}return this}var id=Ext.id(),dom=this.dom;html+='<span id="'+id+'"></span>';Ext.lib.Event.onAvailable(id,function(){var DOC=document,hd=DOC.getElementsByTagName("head")[0],re=/(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig,srcRe=/\ssrc=([\'\"])(.*?)\1/i,typeRe=/\stype=([\'\"])(.*?)\1/i,match,attrs,srcMatch,typeMatch,el,s;while((match=re.exec(html))){attrs=match[1];srcMatch=attrs?attrs.match(srcRe):false;if(srcMatch&&srcMatch[2]){s=DOC.createElement("script");s.src=srcMatch[2];typeMatch=attrs.match(typeRe);if(typeMatch&&typeMatch[2]){s.type=typeMatch[2]}hd.appendChild(s)}else{if(match[2]&&match[2].length>0){if(window.execScript){window.execScript(match[2])}else{window.eval(match[2])}}}}el=DOC.getElementById(id);if(el){Ext.removeNode(el)}if(typeof callback=="function"){callback()}});dom.innerHTML=html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,"");return this},removeAllListeners:function(){this.removeAnchor();Ext.EventManager.removeAll(this.dom);return this},createProxy:function(a,e,d){a=(typeof a=="object")?a:{tag:"div",cls:a};var c=this,b=e?Ext.DomHelper.append(e,a,true):Ext.DomHelper.insertBefore(c.dom,a,true);if(d&&c.setBox&&c.getBox){b.setBox(c.getBox())}return b}});Ext.Element.prototype.getUpdateManager=Ext.Element.prototype.getUpdater;Ext.Element.addMethods({getAnchorXY:function(e,l,q){e=(e||"tl").toLowerCase();q=q||{};var k=this,b=k.dom==document.body||k.dom==document,n=q.width||b?Ext.lib.Dom.getViewWidth():k.getWidth(),i=q.height||b?Ext.lib.Dom.getViewHeight():k.getHeight(),p,a=Math.round,c=k.getXY(),m=k.getScroll(),j=b?m.left:!l?c[0]:0,g=b?m.top:!l?c[1]:0,d={c:[a(n*0.5),a(i*0.5)],t:[a(n*0.5),0],l:[0,a(i*0.5)],r:[n,a(i*0.5)],b:[a(n*0.5),i],tl:[0,0],bl:[0,i],br:[n,i],tr:[n,0]};p=d[e];return[p[0]+j,p[1]+g]},anchorTo:function(b,h,c,a,k,l){var i=this,e=i.dom,j=!Ext.isEmpty(k),d=function(){Ext.fly(e).alignTo(b,h,c,a);Ext.callback(l,Ext.fly(e))},g=this.getAnchor();this.removeAnchor();Ext.apply(g,{fn:d,scroll:j});Ext.EventManager.onWindowResize(d,null);if(j){Ext.EventManager.on(window,"scroll",d,null,{buffer:!isNaN(k)?k:50})}d.call(i);return i},removeAnchor:function(){var b=this,a=this.getAnchor();if(a&&a.fn){Ext.EventManager.removeResizeListener(a.fn);if(a.scroll){Ext.EventManager.un(window,"scroll",a.fn)}delete a.fn}return b},getAnchor:function(){var b=Ext.Element.data,c=this.dom;if(!c){return}var a=b(c,"_anchor");if(!a){a=b(c,"_anchor",{})}return a},getAlignToXY:function(g,A,B){g=Ext.get(g);if(!g||!g.dom){throw"Element.alignToXY with an element that doesn't exist"}B=B||[0,0];A=(!A||A=="?"?"tl-bl?":(!(/-/).test(A)&&A!==""?"tl-"+A:A||"tl-bl")).toLowerCase();var K=this,H=K.dom,M,L,n,l,s,F,v,t=Ext.lib.Dom.getViewWidth()-10,G=Ext.lib.Dom.getViewHeight()-10,b,i,j,k,u,z,N=document,J=N.documentElement,q=N.body,E=(J.scrollLeft||q.scrollLeft||0)+5,D=(J.scrollTop||q.scrollTop||0)+5,I=false,e="",a="",C=A.match(/^([a-z]+)-([a-z]+)(\?)?$/);if(!C){throw"Element.alignTo with an invalid alignment "+A}e=C[1];a=C[2];I=!!C[3];M=K.getAnchorXY(e,true);L=g.getAnchorXY(a,false);n=L[0]-M[0]+B[0];l=L[1]-M[1]+B[1];if(I){s=K.getWidth();F=K.getHeight();v=g.getRegion();b=e.charAt(0);i=e.charAt(e.length-1);j=a.charAt(0);k=a.charAt(a.length-1);u=((b=="t"&&j=="b")||(b=="b"&&j=="t"));z=((i=="r"&&k=="l")||(i=="l"&&k=="r"));if(n+s>t+E){n=z?v.left-s:t+E-s}if(n<E){n=z?v.right:E}if(l+F>G+D){l=u?v.top-F:G+D-F}if(l<D){l=u?v.bottom:D}}return[n,l]},alignTo:function(c,a,e,b){var d=this;return d.setXY(d.getAlignToXY(c,a,e),d.preanim&&!!b?d.preanim(arguments,3):false)},adjustForConstraints:function(c,a,b){return this.getConstrainToXY(a||document,false,b,c)||c},getConstrainToXY:function(b,a,c,e){var d={top:0,left:0,bottom:0,right:0};return function(i,A,l,n){i=Ext.get(i);l=l?Ext.applyIf(l,d):d;var z,D,v=0,u=0;if(i.dom==document.body||i.dom==document){z=Ext.lib.Dom.getViewWidth();D=Ext.lib.Dom.getViewHeight()}else{z=i.dom.clientWidth;D=i.dom.clientHeight;if(!A){var t=i.getXY();v=t[0];u=t[1]}}var r=i.getScroll();v+=l.left+r.left;u+=l.top+r.top;z-=l.right;D-=l.bottom;var B=v+z,g=u+D,j=n||(!A?this.getXY():[this.getLeft(true),this.getTop(true)]),p=j[0],o=j[1],k=this.getConstrainOffset(),q=this.dom.offsetWidth+k,C=this.dom.offsetHeight+k;var m=false;if((p+q)>B){p=B-q;m=true}if((o+C)>g){o=g-C;m=true}if(p<v){p=v;m=true}if(o<u){o=u;m=true}return m?[p,o]:false}}(),getConstrainOffset:function(){return 0},getCenterXY:function(){return this.getAlignToXY(document,"c-c")},center:function(a){return this.alignTo(a||document,"c-c")}});Ext.Element.addMethods({select:function(a,b){return Ext.Element.select(a,b,this.dom)}});Ext.apply(Ext.Element.prototype,function(){var c=Ext.getDom,a=Ext.get,b=Ext.DomHelper;return{insertSibling:function(i,g,h){var j=this,e,d=(g||"before").toLowerCase()=="after",k;if(Ext.isArray(i)){k=j;Ext.each(i,function(l){e=Ext.fly(k,"_internal").insertSibling(l,g,h);if(d){k=e}});return e}i=i||{};if(i.nodeType||i.dom){e=j.dom.parentNode.insertBefore(c(i),d?j.dom.nextSibling:j.dom);if(!h){e=a(e)}}else{if(d&&!j.dom.nextSibling){e=b.append(j.dom.parentNode,i,!h)}else{e=b[d?"insertAfter":"insertBefore"](j.dom,i,!h)}}return e}}}());Ext.Element.boxMarkup='<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>';Ext.Element.addMethods(function(){var a="_internal",b=/(\d+\.?\d+)px/;return{applyStyles:function(c){Ext.DomHelper.applyStyles(this.dom,c);return this},getStyles:function(){var c={};Ext.each(arguments,function(d){c[d]=this.getStyle(d)},this);return c},setOverflow:function(c){var d=this.dom;if(c=="auto"&&Ext.isMac&&Ext.isGecko2){d.style.overflow="hidden";(function(){d.style.overflow="auto"}).defer(1)}else{d.style.overflow=c}},boxWrap:function(c){c=c||"x-box";var d=Ext.get(this.insertHtml("beforeBegin","<div class='"+c+"'>"+String.format(Ext.Element.boxMarkup,c)+"</div>"));Ext.DomQuery.selectNode("."+c+"-mc",d.dom).appendChild(this.dom);return d},setSize:function(e,c,d){var g=this;if(typeof e=="object"){c=e.height;e=e.width}e=g.adjustWidth(e);c=g.adjustHeight(c);if(!d||!g.anim){g.dom.style.width=g.addUnits(e);g.dom.style.height=g.addUnits(c)}else{g.anim({width:{to:e},height:{to:c}},g.preanim(arguments,2))}return g},getComputedHeight:function(){var d=this,c=Math.max(d.dom.offsetHeight,d.dom.clientHeight);if(!c){c=parseFloat(d.getStyle("height"))||0;if(!d.isBorderBox()){c+=d.getFrameWidth("tb")}}return c},getComputedWidth:function(){var c=Math.max(this.dom.offsetWidth,this.dom.clientWidth);if(!c){c=parseFloat(this.getStyle("width"))||0;if(!this.isBorderBox()){c+=this.getFrameWidth("lr")}}return c},getFrameWidth:function(d,c){return c&&this.isBorderBox()?0:(this.getPadding(d)+this.getBorderWidth(d))},addClassOnOver:function(c){this.hover(function(){Ext.fly(this,a).addClass(c)},function(){Ext.fly(this,a).removeClass(c)});return this},addClassOnFocus:function(c){this.on("focus",function(){Ext.fly(this,a).addClass(c)},this.dom);this.on("blur",function(){Ext.fly(this,a).removeClass(c)},this.dom);return this},addClassOnClick:function(c){var d=this.dom;this.on("mousedown",function(){Ext.fly(d,a).addClass(c);var g=Ext.getDoc(),e=function(){Ext.fly(d,a).removeClass(c);g.removeListener("mouseup",e)};g.on("mouseup",e)});return this},getViewSize:function(){var g=document,h=this.dom,c=(h==g||h==g.body);if(c){var e=Ext.lib.Dom;return{width:e.getViewWidth(),height:e.getViewHeight()}}else{return{width:h.clientWidth,height:h.clientHeight}}},getStyleSize:function(){var j=this,c,i,l=document,m=this.dom,e=(m==l||m==l.body),g=m.style;if(e){var k=Ext.lib.Dom;return{width:k.getViewWidth(),height:k.getViewHeight()}}if(g.width&&g.width!="auto"){c=parseFloat(g.width);if(j.isBorderBox()){c-=j.getFrameWidth("lr")}}if(g.height&&g.height!="auto"){i=parseFloat(g.height);if(j.isBorderBox()){i-=j.getFrameWidth("tb")}}return{width:c||j.getWidth(true),height:i||j.getHeight(true)}},getSize:function(c){return{width:this.getWidth(c),height:this.getHeight(c)}},repaint:function(){var c=this.dom;this.addClass("x-repaint");setTimeout(function(){Ext.fly(c).removeClass("x-repaint")},1);return this},unselectable:function(){this.dom.unselectable="on";return this.swallowEvent("selectstart",true).addClass("x-unselectable")},getMargins:function(d){var e=this,c,g={t:"top",l:"left",r:"right",b:"bottom"},h={};if(!d){for(c in e.margins){h[g[c]]=parseFloat(e.getStyle(e.margins[c]))||0}return h}else{return e.addStyles.call(e,d,e.margins)}}}}());Ext.Element.addMethods({setBox:function(e,g,b){var d=this,a=e.width,c=e.height;if((g&&!d.autoBoxAdjust)&&!d.isBorderBox()){a-=(d.getBorderWidth("lr")+d.getPadding("lr"));c-=(d.getBorderWidth("tb")+d.getPadding("tb"))}d.setBounds(e.x,e.y,a,c,d.animTest.call(d,arguments,b,2));return d},getBox:function(j,p){var m=this,v,e,o,d=m.getBorderWidth,q=m.getPadding,g,a,u,n;if(!p){v=m.getXY()}else{e=parseInt(m.getStyle("left"),10)||0;o=parseInt(m.getStyle("top"),10)||0;v=[e,o]}var c=m.dom,s=c.offsetWidth,i=c.offsetHeight,k;if(!j){k={x:v[0],y:v[1],0:v[0],1:v[1],width:s,height:i}}else{g=d.call(m,"l")+q.call(m,"l");a=d.call(m,"r")+q.call(m,"r");u=d.call(m,"t")+q.call(m,"t");n=d.call(m,"b")+q.call(m,"b");k={x:v[0]+g,y:v[1]+u,0:v[0]+g,1:v[1]+u,width:s-(g+a),height:i-(u+n)}}k.right=k.x+k.width;k.bottom=k.y+k.height;return k},move:function(j,b,c){var g=this,m=g.getXY(),k=m[0],i=m[1],d=[k-b,i],l=[k+b,i],h=[k,i-b],a=[k,i+b],e={l:d,left:d,r:l,right:l,t:h,top:h,up:h,b:a,bottom:a,down:a};j=j.toLowerCase();g.moveTo(e[j][0],e[j][1],g.animTest.call(g,arguments,c,2))},setLeftTop:function(d,c){var b=this,a=b.dom.style;a.left=b.addUnits(d);a.top=b.addUnits(c);return b},getRegion:function(){return Ext.lib.Dom.getRegion(this.dom)},setBounds:function(b,g,d,a,c){var e=this;if(!c||!e.anim){e.setSize(d,a);e.setLocation(b,g)}else{e.anim({points:{to:[b,g]},width:{to:e.adjustWidth(d)},height:{to:e.adjustHeight(a)}},e.preanim(arguments,4),"motion")}return e},setRegion:function(b,a){return this.setBounds(b.left,b.top,b.right-b.left,b.bottom-b.top,this.animTest.call(this,arguments,a,1))}});Ext.Element.addMethods({scrollTo:function(b,d,a){var e=/top/i.test(b),c=this,g=c.dom,h;if(!a||!c.anim){h="scroll"+(e?"Top":"Left");g[h]=d}else{h="scroll"+(e?"Left":"Top");c.anim({scroll:{to:e?[g[h],d]:[d,g[h]]}},c.preanim(arguments,2),"scroll")}return c},scrollIntoView:function(e,i){var p=Ext.getDom(e)||Ext.getBody().dom,h=this.dom,g=this.getOffsetsTo(p),k=g[0]+p.scrollLeft,u=g[1]+p.scrollTop,q=u+h.offsetHeight,d=k+h.offsetWidth,a=p.clientHeight,m=parseInt(p.scrollTop,10),s=parseInt(p.scrollLeft,10),j=m+a,n=s+p.clientWidth;if(h.offsetHeight>a||u<m){p.scrollTop=u}else{if(q>j){p.scrollTop=q-a}}p.scrollTop=p.scrollTop;if(i!==false){if(h.offsetWidth>p.clientWidth||k<s){p.scrollLeft=k}else{if(d>n){p.scrollLeft=d-p.clientWidth}}p.scrollLeft=p.scrollLeft}return this},scrollChildIntoView:function(b,a){Ext.fly(b,"_scrollChildIntoView").scrollIntoView(this,a)},scroll:function(m,b,d){if(!this.isScrollable()){return false}var e=this.dom,g=e.scrollLeft,p=e.scrollTop,n=e.scrollWidth,k=e.scrollHeight,i=e.clientWidth,a=e.clientHeight,c=false,o,j={l:Math.min(g+b,n-i),r:o=Math.max(g-b,0),t:Math.max(p-b,0),b:Math.min(p+b,k-a)};j.d=j.b;j.u=j.t;m=m.substr(0,1);if((o=j[m])>-1){c=true;this.scrollTo(m=="l"||m=="r"?"left":"top",o,this.preanim(arguments,2))}return c}});Ext.Element.addMethods(function(){var d="visibility",b="display",a="hidden",h="none",c="x-masked",g="x-masked-relative",e=Ext.Element.data;return{isVisible:function(i){var j=!this.isStyle(d,a)&&!this.isStyle(b,h),k=this.dom.parentNode;if(i!==true||!j){return j}while(k&&!(/^body/i.test(k.tagName))){if(!Ext.fly(k,"_isVisible").isVisible()){return false}k=k.parentNode}return true},isDisplayed:function(){return !this.isStyle(b,h)},enableDisplayMode:function(i){this.setVisibilityMode(Ext.Element.DISPLAY);if(!Ext.isEmpty(i)){e(this.dom,"originalDisplay",i)}return this},mask:function(j,n){var p=this,l=p.dom,o=Ext.DomHelper,m="ext-el-mask-msg",i,q;if(!/^body/i.test(l.tagName)&&p.getStyle("position")=="static"){p.addClass(g)}if(i=e(l,"maskMsg")){i.remove()}if(i=e(l,"mask")){i.remove()}q=o.append(l,{cls:"ext-el-mask"},true);e(l,"mask",q);p.addClass(c);q.setDisplayed(true);if(typeof j=="string"){var k=o.append(l,{cls:m,cn:{tag:"div"}},true);e(l,"maskMsg",k);k.dom.className=n?m+" "+n:m;k.dom.firstChild.innerHTML=j;k.setDisplayed(true);k.center(p)}if(Ext.isIE&&!(Ext.isIE7&&Ext.isStrict)&&p.getStyle("height")=="auto"){q.setSize(undefined,p.getHeight())}return q},unmask:function(){var k=this,l=k.dom,i=e(l,"mask"),j=e(l,"maskMsg");if(i){if(j){j.remove();e(l,"maskMsg",undefined)}i.remove();e(l,"mask",undefined);k.removeClass([c,g])}},isMasked:function(){var i=e(this.dom,"mask");return i&&i.isVisible()},createShim:function(){var i=document.createElement("iframe"),j;i.frameBorder="0";i.className="ext-shim";i.src=Ext.SSL_SECURE_URL;j=Ext.get(this.dom.parentNode.insertBefore(i,this.dom));j.autoBoxAdjust=false;return j}}}());Ext.Element.addMethods({addKeyListener:function(b,d,c){var a;if(typeof b!="object"||Ext.isArray(b)){a={key:b,fn:d,scope:c}}else{a={key:b.key,shift:b.shift,ctrl:b.ctrl,alt:b.alt,fn:d,scope:c}}return new Ext.KeyMap(this,a)},addKeyMap:function(a){return new Ext.KeyMap(this,a)}});Ext.CompositeElementLite.importElementMethods();Ext.apply(Ext.CompositeElementLite.prototype,{addElements:function(c,a){if(!c){return this}if(typeof c=="string"){c=Ext.Element.selectorFunction(c,a)}var b=this.elements;Ext.each(c,function(d){b.push(Ext.get(d))});return this},first:function(){return this.item(0)},last:function(){return this.item(this.getCount()-1)},contains:function(a){return this.indexOf(a)!=-1},removeElement:function(d,e){var c=this,a=this.elements,b;Ext.each(d,function(g){if((b=(a[g]||a[g=c.indexOf(g)]))){if(e){if(b.dom){b.remove()}else{Ext.removeNode(b)}}a.splice(g,1)}});return this}});Ext.CompositeElement=Ext.extend(Ext.CompositeElementLite,{constructor:function(b,a){this.elements=[];this.add(b,a)},getElement:function(a){return a},transformElement:function(a){return Ext.get(a)}});Ext.Element.select=function(a,d,b){var c;if(typeof a=="string"){c=Ext.Element.selectorFunction(a,b)}else{if(a.length!==undefined){c=a}else{throw"Invalid selector"}}return(d===true)?new Ext.CompositeElement(c):new Ext.CompositeElementLite(c)};Ext.select=Ext.Element.select;Ext.UpdateManager=Ext.Updater=Ext.extend(Ext.util.Observable,function(){var b="beforeupdate",d="update",c="failure";function a(h){var i=this;i.transaction=null;if(h.argument.form&&h.argument.reset){try{h.argument.form.reset()}catch(j){}}if(i.loadScripts){i.renderer.render(i.el,h,i,g.createDelegate(i,[h]))}else{i.renderer.render(i.el,h,i);g.call(i,h)}}function g(h,i,j){this.fireEvent(i||d,this.el,h);if(Ext.isFunction(h.argument.callback)){h.argument.callback.call(h.argument.scope,this.el,Ext.isEmpty(j)?true:false,h,h.argument.options)}}function e(h){g.call(this,h,c,!!(this.transaction=null))}return{constructor:function(i,h){var j=this;i=Ext.get(i);if(!h&&i.updateManager){return i.updateManager}j.el=i;j.defaultUrl=null;j.addEvents(b,d,c);Ext.apply(j,Ext.Updater.defaults);j.transaction=null;j.refreshDelegate=j.refresh.createDelegate(j);j.updateDelegate=j.update.createDelegate(j);j.formUpdateDelegate=(j.formUpdate||function(){}).createDelegate(j);j.renderer=j.renderer||j.getDefaultRenderer();Ext.Updater.superclass.constructor.call(j)},setRenderer:function(h){this.renderer=h},getRenderer:function(){return this.renderer},getDefaultRenderer:function(){return new Ext.Updater.BasicRenderer()},setDefaultUrl:function(h){this.defaultUrl=h},getEl:function(){return this.el},update:function(i,n,p,l){var k=this,h,j;if(k.fireEvent(b,k.el,i,n)!==false){if(Ext.isObject(i)){h=i;i=h.url;n=n||h.params;p=p||h.callback;l=l||h.discardUrl;j=h.scope;if(!Ext.isEmpty(h.nocache)){k.disableCaching=h.nocache}if(!Ext.isEmpty(h.text)){k.indicatorText='<div class="loading-indicator">'+h.text+"</div>"}if(!Ext.isEmpty(h.scripts)){k.loadScripts=h.scripts}if(!Ext.isEmpty(h.timeout)){k.timeout=h.timeout}}k.showLoading();if(!l){k.defaultUrl=i}if(Ext.isFunction(i)){i=i.call(k)}var m=Ext.apply({},{url:i,params:(Ext.isFunction(n)&&j)?n.createDelegate(j):n,success:a,failure:e,scope:k,callback:undefined,timeout:(k.timeout*1000),disableCaching:k.disableCaching,argument:{options:h,url:i,form:null,callback:p,scope:j||window,params:n}},h);k.transaction=Ext.Ajax.request(m)}},formUpdate:function(k,h,j,l){var i=this;if(i.fireEvent(b,i.el,k,h)!==false){if(Ext.isFunction(h)){h=h.call(i)}k=Ext.getDom(k);i.transaction=Ext.Ajax.request({form:k,url:h,success:a,failure:e,scope:i,timeout:(i.timeout*1000),argument:{url:h,form:k,callback:l,reset:j}});i.showLoading.defer(1,i)}},startAutoRefresh:function(i,j,l,m,h){var k=this;if(h){k.update(j||k.defaultUrl,l,m,true)}if(k.autoRefreshProcId){clearInterval(k.autoRefreshProcId)}k.autoRefreshProcId=setInterval(k.update.createDelegate(k,[j||k.defaultUrl,l,m,true]),i*1000)},stopAutoRefresh:function(){if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);delete this.autoRefreshProcId}},isAutoRefreshing:function(){return !!this.autoRefreshProcId},showLoading:function(){if(this.showLoadIndicator){this.el.dom.innerHTML=this.indicatorText}},abort:function(){if(this.transaction){Ext.Ajax.abort(this.transaction)}},isUpdating:function(){return this.transaction?Ext.Ajax.isLoading(this.transaction):false},refresh:function(h){if(this.defaultUrl){this.update(this.defaultUrl,null,h,true)}}}}());Ext.Updater.defaults={timeout:30,disableCaching:false,showLoadIndicator:true,indicatorText:'<div class="loading-indicator">Loading...</div>',loadScripts:false,sslBlankUrl:Ext.SSL_SECURE_URL};Ext.Updater.updateElement=function(d,c,e,b){var a=Ext.get(d).getUpdater();Ext.apply(a,b);a.update(c,e,b?b.callback:null)};Ext.Updater.BasicRenderer=function(){};Ext.Updater.BasicRenderer.prototype={render:function(c,a,b,d){c.update(a.responseText,b.loadScripts,d)}};(function(){Date.useStrict=false;function b(d){var c=Array.prototype.slice.call(arguments,1);return d.replace(/\{(\d+)\}/g,function(e,g){return c[g]})}Date.formatCodeToRegex=function(d,c){var e=Date.parseCodes[d];if(e){e=typeof e=="function"?e():e;Date.parseCodes[d]=e}return e?Ext.applyIf({c:e.c?b(e.c,c||"{0}"):e.c},e):{g:0,c:null,s:Ext.escapeRe(d)}};var a=Date.formatCodeToRegex;Ext.apply(Date,{parseFunctions:{"M$":function(d,c){var e=new RegExp("\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/");var g=(d||"").match(e);return g?new Date(((g[1]||"")+g[2])*1):null}},parseRegexes:[],formatFunctions:{"M$":function(){return"\\/Date("+this.getTime()+")\\/"}},y2kYear:50,MILLI:"ms",SECOND:"s",MINUTE:"mi",HOUR:"h",DAY:"d",MONTH:"mo",YEAR:"y",defaults:{},dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNumbers:{Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11},getShortMonthName:function(c){return Date.monthNames[c].substring(0,3)},getShortDayName:function(c){return Date.dayNames[c].substring(0,3)},getMonthNumber:function(c){return Date.monthNumbers[c.substring(0,1).toUpperCase()+c.substring(1,3).toLowerCase()]},formatContainsHourInfo:(function(){var d=/(\\.)/g,c=/([gGhHisucUOPZ]|M\$)/;return function(e){return c.test(e.replace(d,""))}})(),formatCodes:{d:"String.leftPad(this.getDate(), 2, '0')",D:"Date.getShortDayName(this.getDay())",j:"this.getDate()",l:"Date.dayNames[this.getDay()]",N:"(this.getDay() ? this.getDay() : 7)",S:"this.getSuffix()",w:"this.getDay()",z:"this.getDayOfYear()",W:"String.leftPad(this.getWeekOfYear(), 2, '0')",F:"Date.monthNames[this.getMonth()]",m:"String.leftPad(this.getMonth() + 1, 2, '0')",M:"Date.getShortMonthName(this.getMonth())",n:"(this.getMonth() + 1)",t:"this.getDaysInMonth()",L:"(this.isLeapYear() ? 1 : 0)",o:"(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"String.leftPad(this.getFullYear(), 4, '0')",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"String.leftPad(this.getHours(), 2, '0')",i:"String.leftPad(this.getMinutes(), 2, '0')",s:"String.leftPad(this.getSeconds(), 2, '0')",u:"String.leftPad(this.getMilliseconds(), 3, '0')",O:"this.getGMTOffset()",P:"this.getGMTOffset(true)",T:"this.getTimezone()",Z:"(this.getTimezoneOffset() * -60)",c:function(){for(var k="Y-m-dTH:i:sP",h=[],g=0,d=k.length;g<d;++g){var j=k.charAt(g);h.push(j=="T"?"'T'":Date.getFormatCode(j))}return h.join(" + ")},U:"Math.round(this.getTime() / 1000)"},isValid:function(o,c,n,k,g,j,e){k=k||0;g=g||0;j=j||0;e=e||0;var l=new Date(o<100?100:o,c-1,n,k,g,j,e).add(Date.YEAR,o<100?o-100:0);return o==l.getFullYear()&&c==l.getMonth()+1&&n==l.getDate()&&k==l.getHours()&&g==l.getMinutes()&&j==l.getSeconds()&&e==l.getMilliseconds()},parseDate:function(d,g,c){var e=Date.parseFunctions;if(e[g]==null){Date.createParser(g)}return e[g](d,Ext.isDefined(c)?c:Date.useStrict)},getFormatCode:function(d){var c=Date.formatCodes[d];if(c){c=typeof c=="function"?c():c;Date.formatCodes[d]=c}return c||("'"+String.escape(d)+"'")},createFormat:function(h){var g=[],c=false,e="";for(var d=0;d<h.length;++d){e=h.charAt(d);if(!c&&e=="\\"){c=true}else{if(c){c=false;g.push("'"+String.escape(e)+"'")}else{g.push(Date.getFormatCode(e))}}}Date.formatFunctions[h]=new Function("return "+g.join("+"))},createParser:function(){var c=["var dt, y, m, d, h, i, s, ms, o, z, zz, u, v,","def = Date.defaults,","results = String(input).match(Date.parseRegexes[{0}]);","if(results){","{1}","if(u != null){","v = new Date(u * 1000);","}else{","dt = (new Date()).clearTime();","y = Ext.num(y, Ext.num(def.y, dt.getFullYear()));","m = Ext.num(m, Ext.num(def.m - 1, dt.getMonth()));","d = Ext.num(d, Ext.num(def.d, dt.getDate()));","h = Ext.num(h, Ext.num(def.h, dt.getHours()));","i = Ext.num(i, Ext.num(def.i, dt.getMinutes()));","s = Ext.num(s, Ext.num(def.s, dt.getSeconds()));","ms = Ext.num(ms, Ext.num(def.ms, dt.getMilliseconds()));","if(z >= 0 && y >= 0){","v = new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);","v = !strict? v : (strict === true && (z <= 364 || (v.isLeapYear() && z <= 365))? v.add(Date.DAY, z) : null);","}else if(strict === true && !Date.isValid(y, m + 1, d, h, i, s, ms)){","v = null;","}else{","v = new Date(y < 100 ? 100 : y, m, d, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);","}","}","}","if(v){","if(zz != null){","v = v.add(Date.SECOND, -v.getTimezoneOffset() * 60 - zz);","}else if(o){","v = v.add(Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));","}","}","return v;"].join("\n");return function(m){var e=Date.parseRegexes.length,o=1,g=[],l=[],k=false,d="",j=0,h,n;for(;j<m.length;++j){d=m.charAt(j);if(!k&&d=="\\"){k=true}else{if(k){k=false;l.push(String.escape(d))}else{h=a(d,o);o+=h.g;l.push(h.s);if(h.g&&h.c){if(h.calcLast){n=h.c}else{g.push(h.c)}}}}}if(n){g.push(n)}Date.parseRegexes[e]=new RegExp("^"+l.join("")+"$","i");Date.parseFunctions[m]=new Function("input","strict",b(c,e,g.join("")))}}(),parseCodes:{d:{g:1,c:"d = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},j:{g:1,c:"d = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},D:function(){for(var c=[],d=0;d<7;c.push(Date.getShortDayName(d)),++d){}return{g:0,c:null,s:"(?:"+c.join("|")+")"}},l:function(){return{g:0,c:null,s:"(?:"+Date.dayNames.join("|")+")"}},N:{g:0,c:null,s:"[1-7]"},S:{g:0,c:null,s:"(?:st|nd|rd|th)"},w:{g:0,c:null,s:"[0-6]"},z:{g:1,c:"z = parseInt(results[{0}], 10);\n",s:"(\\d{1,3})"},W:{g:0,c:null,s:"(?:\\d{2})"},F:function(){return{g:1,c:"m = parseInt(Date.getMonthNumber(results[{0}]), 10);\n",s:"("+Date.monthNames.join("|")+")"}},M:function(){for(var c=[],d=0;d<12;c.push(Date.getShortMonthName(d)),++d){}return Ext.applyIf({s:"("+c.join("|")+")"},a("F"))},m:{g:1,c:"m = parseInt(results[{0}], 10) - 1;\n",s:"(\\d{2})"},n:{g:1,c:"m = parseInt(results[{0}], 10) - 1;\n",s:"(\\d{1,2})"},t:{g:0,c:null,s:"(?:\\d{2})"},L:{g:0,c:null,s:"(?:1|0)"},o:function(){return a("Y")},Y:{g:1,c:"y = parseInt(results[{0}], 10);\n",s:"(\\d{4})"},y:{g:1,c:"var ty = parseInt(results[{0}], 10);\ny = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:function(){return a("A")},A:{calcLast:true,g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(AM|PM|am|pm)"},g:function(){return a("G")},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},h:function(){return a("H")},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),","mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),","mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,4}"},Z:{g:1,c:"zz = results[{0}] * 1;\nzz = (-43200 <= zz && zz <= 50400)? zz : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var e=[],c=[a("Y",1),a("m",2),a("d",3),a("h",4),a("i",5),a("s",6),{c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:["if(results[8]) {","if(results[8] == 'Z'){","zz = 0;","}else if (results[8].indexOf(':') > -1){",a("P",8).c,"}else{",a("O",8).c,"}","}"].join("\n")}];for(var g=0,d=c.length;g<d;++g){e.push(c[g].c)}return{g:1,c:e.join(""),s:[c[0].s,"(?:","-",c[1].s,"(?:","-",c[2].s,"(?:","(?:T| )?",c[3].s,":",c[4].s,"(?::",c[5].s,")?","(?:(?:\\.|,)(\\d+))?","(Z|(?:[-+]\\d{2}(?::)?\\d{2}))?",")?",")?",")?"].join("")}},U:{g:1,c:"u = parseInt(results[{0}], 10);\n",s:"(-?\\d+)"}}})}());Ext.apply(Date.prototype,{dateFormat:function(a){if(Date.formatFunctions[a]==null){Date.createFormat(a)}return Date.formatFunctions[a].call(this)},getTimezone:function(){return this.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/,"$1$2").replace(/[^A-Z]/g,"")},getGMTOffset:function(a){return(this.getTimezoneOffset()>0?"-":"+")+String.leftPad(Math.floor(Math.abs(this.getTimezoneOffset())/60),2,"0")+(a?":":"")+String.leftPad(Math.abs(this.getTimezoneOffset()%60),2,"0")},getDayOfYear:function(){var b=0,e=this.clone(),a=this.getMonth(),c;for(c=0,e.setDate(1),e.setMonth(0);c<a;e.setMonth(++c)){b+=e.getDaysInMonth()}return b+this.getDate()-1},getWeekOfYear:function(){var a=86400000,b=7*a;return function(){var d=Date.UTC(this.getFullYear(),this.getMonth(),this.getDate()+3)/a,c=Math.floor(d/7),e=new Date(c*b).getUTCFullYear();return c-Math.floor(Date.UTC(e,0,7)/b)+1}}(),isLeapYear:function(){var a=this.getFullYear();return !!((a&3)==0&&(a%100||(a%400==0&&a)))},getFirstDayOfMonth:function(){var a=(this.getDay()-(this.getDate()-1))%7;return(a<0)?(a+7):a},getLastDayOfMonth:function(){return this.getLastDateOfMonth().getDay()},getFirstDateOfMonth:function(){return new Date(this.getFullYear(),this.getMonth(),1)},getLastDateOfMonth:function(){return new Date(this.getFullYear(),this.getMonth(),this.getDaysInMonth())},getDaysInMonth:function(){var a=[31,28,31,30,31,30,31,31,30,31,30,31];return function(){var b=this.getMonth();return b==1&&this.isLeapYear()?29:a[b]}}(),getSuffix:function(){switch(this.getDate()){case 1:case 21:case 31:return"st";case 2:case 22:return"nd";case 3:case 23:return"rd";default:return"th"}},clone:function(){return new Date(this.getTime())},isDST:function(){return new Date(this.getFullYear(),0,1).getTimezoneOffset()!=this.getTimezoneOffset()},clearTime:function(g){if(g){return this.clone().clearTime()}var b=this.getDate();this.setHours(0);this.setMinutes(0);this.setSeconds(0);this.setMilliseconds(0);if(this.getDate()!=b){for(var a=1,e=this.add(Date.HOUR,a);e.getDate()!=b;a++,e=this.add(Date.HOUR,a)){}this.setDate(b);this.setHours(e.getHours())}return this},add:function(b,c){var e=this.clone();if(!b||c===0){return e}switch(b.toLowerCase()){case Date.MILLI:e.setMilliseconds(this.getMilliseconds()+c);break;case Date.SECOND:e.setSeconds(this.getSeconds()+c);break;case Date.MINUTE:e.setMinutes(this.getMinutes()+c);break;case Date.HOUR:e.setHours(this.getHours()+c);break;case Date.DAY:e.setDate(this.getDate()+c);break;case Date.MONTH:var a=this.getDate();if(a>28){a=Math.min(a,this.getFirstDateOfMonth().add("mo",c).getLastDateOfMonth().getDate())}e.setDate(a);e.setMonth(this.getMonth()+c);break;case Date.YEAR:e.setFullYear(this.getFullYear()+c);break}return e},between:function(c,a){var b=this.getTime();return c.getTime()<=b&&b<=a.getTime()}});Date.prototype.format=Date.prototype.dateFormat;if(Ext.isSafari&&(navigator.userAgent.match(/WebKit\/(\d+)/)[1]||NaN)<420){Ext.apply(Date.prototype,{_xMonth:Date.prototype.setMonth,_xDate:Date.prototype.setDate,setMonth:function(a){if(a<=-1){var d=Math.ceil(-a),c=Math.ceil(d/12),b=(d%12)?12-d%12:0;this.setFullYear(this.getFullYear()-c);return this._xMonth(b)}else{return this._xMonth(a)}},setDate:function(a){return this.setTime(this.getTime()-(this.getDate()-a)*86400000)}})}Ext.util.MixedCollection=function(b,a){this.items=[];this.map={};this.keys=[];this.length=0;this.addEvents("clear","add","replace","remove","sort");this.allowFunctions=b===true;if(a){this.getKey=a}Ext.util.MixedCollection.superclass.constructor.call(this)};Ext.extend(Ext.util.MixedCollection,Ext.util.Observable,{allowFunctions:false,add:function(b,c){if(arguments.length==1){c=arguments[0];b=this.getKey(c)}if(typeof b!="undefined"&&b!==null){var a=this.map[b];if(typeof a!="undefined"){return this.replace(b,c)}this.map[b]=c}this.length++;this.items.push(c);this.keys.push(b);this.fireEvent("add",this.length-1,c,b);return c},getKey:function(a){return a.id},replace:function(c,d){if(arguments.length==1){d=arguments[0];c=this.getKey(d)}var a=this.map[c];if(typeof c=="undefined"||c===null||typeof a=="undefined"){return this.add(c,d)}var b=this.indexOfKey(c);this.items[b]=d;this.map[c]=d;this.fireEvent("replace",c,a,d);return d},addAll:function(e){if(arguments.length>1||Ext.isArray(e)){var b=arguments.length>1?arguments:e;for(var d=0,a=b.length;d<a;d++){this.add(b[d])}}else{for(var c in e){if(this.allowFunctions||typeof e[c]!="function"){this.add(c,e[c])}}}},each:function(e,d){var b=[].concat(this.items);for(var c=0,a=b.length;c<a;c++){if(e.call(d||b[c],b[c],c,a)===false){break}}},eachKey:function(d,c){for(var b=0,a=this.keys.length;b<a;b++){d.call(c||window,this.keys[b],this.items[b],b,a)}},find:function(d,c){for(var b=0,a=this.items.length;b<a;b++){if(d.call(c||window,this.items[b],this.keys[b])){return this.items[b]}}return null},insert:function(a,b,c){if(arguments.length==2){c=arguments[1];b=this.getKey(c)}if(this.containsKey(b)){this.suspendEvents();this.removeKey(b);this.resumeEvents()}if(a>=this.length){return this.add(b,c)}this.length++;this.items.splice(a,0,c);if(typeof b!="undefined"&&b!==null){this.map[b]=c}this.keys.splice(a,0,b);this.fireEvent("add",a,c,b);return c},remove:function(a){return this.removeAt(this.indexOf(a))},removeAt:function(a){if(a<this.length&&a>=0){this.length--;var c=this.items[a];this.items.splice(a,1);var b=this.keys[a];if(typeof b!="undefined"){delete this.map[b]}this.keys.splice(a,1);this.fireEvent("remove",c,b);return c}return false},removeKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(a){return this.items.indexOf(a)},indexOfKey:function(a){return this.keys.indexOf(a)},item:function(b){var a=this.map[b],c=a!==undefined?a:(typeof b=="number")?this.items[b]:undefined;return typeof c!="function"||this.allowFunctions?c:null},itemAt:function(a){return this.items[a]},key:function(a){return this.map[a]},contains:function(a){return this.indexOf(a)!=-1},containsKey:function(a){return typeof this.map[a]!="undefined"},clear:function(){this.length=0;this.items=[];this.keys=[];this.map={};this.fireEvent("clear")},first:function(){return this.items[0]},last:function(){return this.items[this.length-1]},_sort:function(k,a,j){var d,e,b=String(a).toUpperCase()=="DESC"?-1:1,h=[],l=this.keys,g=this.items;j=j||function(i,c){return i-c};for(d=0,e=g.length;d<e;d++){h[h.length]={key:l[d],value:g[d],index:d}}h.sort(function(i,c){var m=j(i[k],c[k])*b;if(m===0){m=(i.index<c.index?-1:1)}return m});for(d=0,e=h.length;d<e;d++){g[d]=h[d].value;l[d]=h[d].key}this.fireEvent("sort",this)},sort:function(a,b){this._sort("value",a,b)},reorder:function(d){this.suspendEvents();var b=this.items,c=0,g=b.length,a=[],e=[],h;for(h in d){a[d[h]]=b[h]}for(c=0;c<g;c++){if(d[c]==undefined){e.push(b[c])}}for(c=0;c<g;c++){if(a[c]==undefined){a[c]=e.shift()}}this.clear();this.addAll(a);this.resumeEvents();this.fireEvent("sort",this)},keySort:function(a,b){this._sort("key",a,b||function(d,c){var g=String(d).toUpperCase(),e=String(c).toUpperCase();return g>e?1:(g<e?-1:0)})},getRange:function(e,a){var b=this.items;if(b.length<1){return[]}e=e||0;a=Math.min(typeof a=="undefined"?this.length-1:a,this.length-1);var c,d=[];if(e<=a){for(c=e;c<=a;c++){d[d.length]=b[c]}}else{for(c=e;c>=a;c--){d[d.length]=b[c]}}return d},filter:function(c,b,d,a){if(Ext.isEmpty(b,false)){return this.clone()}b=this.createValueMatcher(b,d,a);return this.filterBy(function(e){return e&&b.test(e[c])})},filterBy:function(g,e){var h=new Ext.util.MixedCollection();h.getKey=this.getKey;var b=this.keys,d=this.items;for(var c=0,a=d.length;c<a;c++){if(g.call(e||this,d[c],b[c])){h.add(b[c],d[c])}}return h},findIndex:function(c,b,e,d,a){if(Ext.isEmpty(b,false)){return -1}b=this.createValueMatcher(b,d,a);return this.findIndexBy(function(g){return g&&b.test(g[c])},null,e)},findIndexBy:function(g,e,h){var b=this.keys,d=this.items;for(var c=(h||0),a=d.length;c<a;c++){if(g.call(e||this,d[c],b[c])){return c}}return -1},createValueMatcher:function(c,e,a,b){if(!c.exec){var d=Ext.escapeRe;c=String(c);if(e===true){c=d(c)}else{c="^"+d(c);if(b===true){c+="$"}}c=new RegExp(c,a?"":"i")}return c},clone:function(){var e=new Ext.util.MixedCollection();var b=this.keys,d=this.items;for(var c=0,a=d.length;c<a;c++){e.add(b[c],d[c])}e.getKey=this.getKey;return e}});Ext.util.MixedCollection.prototype.get=Ext.util.MixedCollection.prototype.item;Ext.AbstractManager=Ext.extend(Object,{typeName:"type",constructor:function(a){Ext.apply(this,a||{});this.all=new Ext.util.MixedCollection();this.types={}},get:function(a){return this.all.get(a)},register:function(a){this.all.add(a)},unregister:function(a){this.all.remove(a)},registerType:function(b,a){this.types[b]=a;a[this.typeName]=b},isRegistered:function(a){return this.types[a]!==undefined},create:function(a,d){var b=a[this.typeName]||a.type||d,c=this.types[b];if(c==undefined){throw new Error(String.format("The '{0}' type has not been registered with this manager",b))}return new c(a)},onAvailable:function(d,c,b){var a=this.all;a.on("add",function(e,g){if(g.id==d){c.call(b||g,g);a.un("add",c,b)}})}});Ext.util.Format=function(){var trimRe=/^\s+|\s+$/g,stripTagsRE=/<\/?[^>]+>/gi,stripScriptsRe=/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,nl2brRe=/\r?\n/g;return{ellipsis:function(value,len,word){if(value&&value.length>len){if(word){var vs=value.substr(0,len-2),index=Math.max(vs.lastIndexOf(" "),vs.lastIndexOf("."),vs.lastIndexOf("!"),vs.lastIndexOf("?"));if(index==-1||index<(len-15)){return value.substr(0,len-3)+"..."}else{return vs.substr(0,index)+"..."}}else{return value.substr(0,len-3)+"..."}}return value},undef:function(value){return value!==undefined?value:""},defaultValue:function(value,defaultValue){if(!defaultValue&&defaultValue!==0){defaultValue=""}return value!==undefined&&value!==""?value:defaultValue},htmlEncode:function(value){return !value?value:String(value).replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;").replace(/"/g,"&quot;")},htmlDecode:function(value){return !value?value:String(value).replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&quot;/g,'"').replace(/&amp;/g,"&")},trim:function(value){return String(value).replace(trimRe,"")},substr:function(value,start,length){return String(value).substr(start,length)},lowercase:function(value){return String(value).toLowerCase()},uppercase:function(value){return String(value).toUpperCase()},capitalize:function(value){return !value?value:value.charAt(0).toUpperCase()+value.substr(1).toLowerCase()},call:function(value,fn){if(arguments.length>2){var args=Array.prototype.slice.call(arguments,2);args.unshift(value);return eval(fn).apply(window,args)}else{return eval(fn).call(window,value)}},usMoney:function(v){v=(Math.round((v-0)*100))/100;v=(v==Math.floor(v))?v+".00":((v*10==Math.floor(v*10))?v+"0":v);v=String(v);var ps=v.split("."),whole=ps[0],sub=ps[1]?"."+ps[1]:".00",r=/(\d+)(\d{3})/;while(r.test(whole)){whole=whole.replace(r,"$1,$2")}v=whole+sub;if(v.charAt(0)=="-"){return"-$"+v.substr(1)}return"$"+v},date:function(v,format){if(!v){return""}if(!Ext.isDate(v)){v=new Date(Date.parse(v))}return v.dateFormat(format||"m/d/Y")},dateRenderer:function(format){return function(v){return Ext.util.Format.date(v,format)}},stripTags:function(v){return !v?v:String(v).replace(stripTagsRE,"")},stripScripts:function(v){return !v?v:String(v).replace(stripScriptsRe,"")},fileSize:function(size){if(size<1024){return size+" bytes"}else{if(size<1048576){return(Math.round(((size*10)/1024))/10)+" KB"}else{return(Math.round(((size*10)/1048576))/10)+" MB"}}},math:function(){var fns={};return function(v,a){if(!fns[a]){fns[a]=new Function("v","return v "+a+";")}return fns[a](v)}}(),round:function(value,precision){var result=Number(value);if(typeof precision=="number"){precision=Math.pow(10,precision);result=Math.round(value*precision)/precision}return result},number:function(v,format){if(!format){return v}v=Ext.num(v,NaN);if(isNaN(v)){return""}var comma=",",dec=".",i18n=false,neg=v<0;v=Math.abs(v);if(format.substr(format.length-2)=="/i"){format=format.substr(0,format.length-2);i18n=true;comma=".";dec=","}var hasComma=format.indexOf(comma)!=-1,psplit=(i18n?format.replace(/[^\d\,]/g,""):format.replace(/[^\d\.]/g,"")).split(dec);if(1<psplit.length){v=v.toFixed(psplit[1].length)}else{if(2<psplit.length){throw ("NumberFormatException: invalid format, formats should have no more than 1 period: "+format)}else{v=v.toFixed(0)}}var fnum=v.toString();psplit=fnum.split(".");if(hasComma){var cnum=psplit[0],parr=[],j=cnum.length,m=Math.floor(j/3),n=cnum.length%3||3,i;for(i=0;i<j;i+=n){if(i!=0){n=3}parr[parr.length]=cnum.substr(i,n);m-=1}fnum=parr.join(comma);if(psplit[1]){fnum+=dec+psplit[1]}}else{if(psplit[1]){fnum=psplit[0]+dec+psplit[1]}}return(neg?"-":"")+format.replace(/[\d,?\.?]+/,fnum)},numberRenderer:function(format){return function(v){return Ext.util.Format.number(v,format)}},plural:function(v,s,p){return v+" "+(v==1?s:(p?p:s+"s"))},nl2br:function(v){return Ext.isEmpty(v)?"":v.replace(nl2brRe,"<br/>")}}}();Ext.XTemplate=function(){Ext.XTemplate.superclass.constructor.apply(this,arguments);var y=this,j=y.html,q=/<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/,d=/^<tpl\b[^>]*?for="(.*?)"/,v=/^<tpl\b[^>]*?if="(.*?)"/,x=/^<tpl\b[^>]*?exec="(.*?)"/,r,p=0,k=[],o="values",w="parent",l="xindex",n="xcount",e="return ",c="with(values){ ";j=["<tpl>",j,"</tpl>"].join("");while((r=j.match(q))){var b=r[0].match(d),a=r[0].match(v),A=r[0].match(x),g=null,h=null,t=null,z=b&&b[1]?b[1]:"";if(a){g=a&&a[1]?a[1]:null;if(g){h=new Function(o,w,l,n,c+e+(Ext.util.Format.htmlDecode(g))+"; }")}}if(A){g=A&&A[1]?A[1]:null;if(g){t=new Function(o,w,l,n,c+(Ext.util.Format.htmlDecode(g))+"; }")}}if(z){switch(z){case".":z=new Function(o,w,c+e+o+"; }");break;case"..":z=new Function(o,w,c+e+w+"; }");break;default:z=new Function(o,w,c+e+z+"; }")}}k.push({id:p,target:z,exec:t,test:h,body:r[1]||""});j=j.replace(r[0],"{xtpl"+p+"}");++p}for(var u=k.length-1;u>=0;--u){y.compileTpl(k[u])}y.master=k[k.length-1];y.tpls=k};Ext.extend(Ext.XTemplate,Ext.Template,{re:/\{([\w\-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,codeRe:/\{\[((?:\\\]|.|\n)*?)\]\}/g,applySubTemplate:function(a,k,j,d,c){var h=this,g,m=h.tpls[a],l,b=[];if((m.test&&!m.test.call(h,k,j,d,c))||(m.exec&&m.exec.call(h,k,j,d,c))){return""}l=m.target?m.target.call(h,k,j):k;g=l.length;j=m.target?k:j;if(m.target&&Ext.isArray(l)){for(var e=0,g=l.length;e<g;e++){b[b.length]=m.compiled.call(h,l[e],j,e+1,g)}return b.join("")}return m.compiled.call(h,l,j,d,c)},compileTpl:function(tpl){var fm=Ext.util.Format,useF=this.disableFormats!==true,sep=Ext.isGecko?"+":",",body;function fn(m,name,format,args,math){if(name.substr(0,4)=="xtpl"){return"'"+sep+"this.applySubTemplate("+name.substr(4)+", values, parent, xindex, xcount)"+sep+"'"}var v;if(name==="."){v="values"}else{if(name==="#"){v="xindex"}else{if(name.indexOf(".")!=-1){v=name}else{v="values['"+name+"']"}}}if(math){v="("+v+math+")"}if(format&&useF){args=args?","+args:"";if(format.substr(0,5)!="this."){format="fm."+format+"("}else{format='this.call("'+format.substr(5)+'", ';args=", values"}}else{args="";format="("+v+" === undefined ? '' : "}return"'"+sep+format+v+args+")"+sep+"'"}function codeFn(m,code){return"'"+sep+"("+code.replace(/\\'/g,"'")+")"+sep+"'"}if(Ext.isGecko){body="tpl.compiled = function(values, parent, xindex, xcount){ return '"+tpl.body.replace(/(\r\n|\n)/g,"\\n").replace(/'/g,"\\'").replace(this.re,fn).replace(this.codeRe,codeFn)+"';};"}else{body=["tpl.compiled = function(values, parent, xindex, xcount){ return ['"];body.push(tpl.body.replace(/(\r\n|\n)/g,"\\n").replace(/'/g,"\\'").replace(this.re,fn).replace(this.codeRe,codeFn));body.push("'].join('');};");body=body.join("")}eval(body);return this},applyTemplate:function(a){return this.master.compiled.call(this,a,{},1,1)},compile:function(){return this}});Ext.XTemplate.prototype.apply=Ext.XTemplate.prototype.applyTemplate;Ext.XTemplate.from=function(a){a=Ext.getDom(a);return new Ext.XTemplate(a.value||a.innerHTML)};Ext.util.CSS=function(){var d=null;var c=document;var b=/(-[a-z])/gi;var a=function(e,g){return g.charAt(1).toUpperCase()};return{createStyleSheet:function(i,l){var h;var g=c.getElementsByTagName("head")[0];var k=c.createElement("style");k.setAttribute("type","text/css");if(l){k.setAttribute("id",l)}if(Ext.isIE){g.appendChild(k);h=k.styleSheet;h.cssText=i}else{try{k.appendChild(c.createTextNode(i))}catch(j){k.cssText=i}g.appendChild(k);h=k.styleSheet?k.styleSheet:(k.sheet||c.styleSheets[c.styleSheets.length-1])}this.cacheStyleSheet(h);return h},removeStyleSheet:function(g){var e=c.getElementById(g);if(e){e.parentNode.removeChild(e)}},swapStyleSheet:function(h,e){this.removeStyleSheet(h);var g=c.createElement("link");g.setAttribute("rel","stylesheet");g.setAttribute("type","text/css");g.setAttribute("id",h);g.setAttribute("href",e);c.getElementsByTagName("head")[0].appendChild(g)},refreshCache:function(){return this.getRules(true)},cacheStyleSheet:function(h){if(!d){d={}}try{var k=h.cssRules||h.rules;for(var g=k.length-1;g>=0;--g){d[k[g].selectorText.toLowerCase()]=k[g]}}catch(i){}},getRules:function(h){if(d===null||h){d={};var k=c.styleSheets;for(var j=0,g=k.length;j<g;j++){try{this.cacheStyleSheet(k[j])}catch(l){}}}return d},getRule:function(e,h){var g=this.getRules(h);if(!Ext.isArray(e)){return g[e.toLowerCase()]}for(var j=0;j<e.length;j++){if(g[e[j]]){return g[e[j].toLowerCase()]}}return null},updateRule:function(e,j,h){if(!Ext.isArray(e)){var k=this.getRule(e);if(k){k.style[j.replace(b,a)]=h;return true}}else{for(var g=0;g<e.length;g++){if(this.updateRule(e[g],j,h)){return true}}}return false}}}();Ext.util.ClickRepeater=Ext.extend(Ext.util.Observable,{constructor:function(b,a){this.el=Ext.get(b);this.el.unselectable();Ext.apply(this,a);this.addEvents("mousedown","click","mouseup");if(!this.disabled){this.disabled=true;this.enable()}if(this.handler){this.on("click",this.handler,this.scope||this)}Ext.util.ClickRepeater.superclass.constructor.call(this)},interval:20,delay:250,preventDefault:true,stopDefault:false,timer:0,enable:function(){if(this.disabled){this.el.on("mousedown",this.handleMouseDown,this);if(Ext.isIE){this.el.on("dblclick",this.handleDblClick,this)}if(this.preventDefault||this.stopDefault){this.el.on("click",this.eventOptions,this)}}this.disabled=false},disable:function(a){if(a||!this.disabled){clearTimeout(this.timer);if(this.pressClass){this.el.removeClass(this.pressClass)}Ext.getDoc().un("mouseup",this.handleMouseUp,this);this.el.removeAllListeners()}this.disabled=true},setDisabled:function(a){this[a?"disable":"enable"]()},eventOptions:function(a){if(this.preventDefault){a.preventDefault()}if(this.stopDefault){a.stopEvent()}},destroy:function(){this.disable(true);Ext.destroy(this.el);this.purgeListeners()},handleDblClick:function(a){clearTimeout(this.timer);this.el.blur();this.fireEvent("mousedown",this,a);this.fireEvent("click",this,a)},handleMouseDown:function(a){clearTimeout(this.timer);this.el.blur();if(this.pressClass){this.el.addClass(this.pressClass)}this.mousedownTime=new Date();Ext.getDoc().on("mouseup",this.handleMouseUp,this);this.el.on("mouseout",this.handleMouseOut,this);this.fireEvent("mousedown",this,a);this.fireEvent("click",this,a);if(this.accelerate){this.delay=400}this.timer=this.click.defer(this.delay||this.interval,this,[a])},click:function(a){this.fireEvent("click",this,a);this.timer=this.click.defer(this.accelerate?this.easeOutExpo(this.mousedownTime.getElapsed(),400,-390,12000):this.interval,this,[a])},easeOutExpo:function(e,a,h,g){return(e==g)?a+h:h*(-Math.pow(2,-10*e/g)+1)+a},handleMouseOut:function(){clearTimeout(this.timer);if(this.pressClass){this.el.removeClass(this.pressClass)}this.el.on("mouseover",this.handleMouseReturn,this)},handleMouseReturn:function(){this.el.un("mouseover",this.handleMouseReturn,this);if(this.pressClass){this.el.addClass(this.pressClass)}this.click()},handleMouseUp:function(a){clearTimeout(this.timer);this.el.un("mouseover",this.handleMouseReturn,this);this.el.un("mouseout",this.handleMouseOut,this);Ext.getDoc().un("mouseup",this.handleMouseUp,this);this.el.removeClass(this.pressClass);this.fireEvent("mouseup",this,a)}});Ext.KeyNav=function(b,a){this.el=Ext.get(b);Ext.apply(this,a);if(!this.disabled){this.disabled=true;this.enable()}};Ext.KeyNav.prototype={disabled:false,defaultEventAction:"stopEvent",forceKeyDown:false,relay:function(c){var a=c.getKey(),b=this.keyToHandler[a];if(b&&this[b]){if(this.doRelay(c,this[b],b)!==true){c[this.defaultEventAction]()}}},doRelay:function(c,b,a){return b.call(this.scope||this,c,a)},enter:false,left:false,right:false,up:false,down:false,tab:false,esc:false,pageUp:false,pageDown:false,del:false,home:false,end:false,space:false,keyToHandler:{37:"left",39:"right",38:"up",40:"down",33:"pageUp",34:"pageDown",46:"del",36:"home",35:"end",13:"enter",27:"esc",9:"tab",32:"space"},stopKeyUp:function(b){var a=b.getKey();if(a>=37&&a<=40){b.stopEvent()}},destroy:function(){this.disable()},enable:function(){if(this.disabled){if(Ext.isSafari2){this.el.on("keyup",this.stopKeyUp,this)}this.el.on(this.isKeydown()?"keydown":"keypress",this.relay,this);this.disabled=false}},disable:function(){if(!this.disabled){if(Ext.isSafari2){this.el.un("keyup",this.stopKeyUp,this)}this.el.un(this.isKeydown()?"keydown":"keypress",this.relay,this);this.disabled=true}},setDisabled:function(a){this[a?"disable":"enable"]()},isKeydown:function(){return this.forceKeyDown||Ext.EventManager.useKeydown}};Ext.KeyMap=function(c,b,a){this.el=Ext.get(c);this.eventName=a||"keydown";this.bindings=[];if(b){this.addBinding(b)}this.enable()};Ext.KeyMap.prototype={stopEvent:false,addBinding:function(b){if(Ext.isArray(b)){Ext.each(b,function(j){this.addBinding(j)},this);return}var k=b.key,g=b.fn||b.handler,l=b.scope;if(b.stopEvent){this.stopEvent=b.stopEvent}if(typeof k=="string"){var h=[];var e=k.toUpperCase();for(var c=0,d=e.length;c<d;c++){h.push(e.charCodeAt(c))}k=h}var a=Ext.isArray(k);var i=function(o){if(this.checkModifiers(b,o)){var m=o.getKey();if(a){for(var n=0,j=k.length;n<j;n++){if(k[n]==m){if(this.stopEvent){o.stopEvent()}g.call(l||window,m,o);return}}}else{if(m==k){if(this.stopEvent){o.stopEvent()}g.call(l||window,m,o)}}}};this.bindings.push(i)},checkModifiers:function(b,h){var j,d,g=["shift","ctrl","alt"];for(var c=0,a=g.length;c<a;++c){d=g[c];j=b[d];if(!(j===undefined||(j===h[d+"Key"]))){return false}}return true},on:function(b,d,c){var h,a,e,g;if(typeof b=="object"&&!Ext.isArray(b)){h=b.key;a=b.shift;e=b.ctrl;g=b.alt}else{h=b}this.addBinding({key:h,shift:a,ctrl:e,alt:g,fn:d,scope:c})},handleKeyDown:function(g){if(this.enabled){var c=this.bindings;for(var d=0,a=c.length;d<a;d++){c[d].call(this,g)}}},isEnabled:function(){return this.enabled},enable:function(){if(!this.enabled){this.el.on(this.eventName,this.handleKeyDown,this);this.enabled=true}},disable:function(){if(this.enabled){this.el.removeListener(this.eventName,this.handleKeyDown,this);this.enabled=false}},setDisabled:function(a){this[a?"disable":"enable"]()}};Ext.util.TextMetrics=function(){var a;return{measure:function(b,c,d){if(!a){a=Ext.util.TextMetrics.Instance(b,d)}a.bind(b);a.setFixedWidth(d||"auto");return a.getSize(c)},createInstance:function(b,c){return Ext.util.TextMetrics.Instance(b,c)}}}();Ext.util.TextMetrics.Instance=function(b,d){var c=new Ext.Element(document.createElement("div"));document.body.appendChild(c.dom);c.position("absolute");c.setLeftTop(-1000,-1000);c.hide();if(d){c.setWidth(d)}var a={getSize:function(g){c.update(g);var e=c.getSize();c.update("");return e},bind:function(e){c.setStyle(Ext.fly(e).getStyles("font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"))},setFixedWidth:function(e){c.setWidth(e)},getWidth:function(e){c.dom.style.width="auto";return this.getSize(e).width},getHeight:function(e){return this.getSize(e).height}};a.bind(b);return a};Ext.Element.addMethods({getTextWidth:function(c,b,a){return(Ext.util.TextMetrics.measure(this.dom,Ext.value(c,this.dom.innerHTML,true)).width).constrain(b||0,a||1000000)}});Ext.util.Cookies={set:function(c,e){var a=arguments;var i=arguments.length;var b=(i>2)?a[2]:null;var h=(i>3)?a[3]:"/";var d=(i>4)?a[4]:null;var g=(i>5)?a[5]:false;document.cookie=c+"="+escape(e)+((b===null)?"":("; expires="+b.toGMTString()))+((h===null)?"":("; path="+h))+((d===null)?"":("; domain="+d))+((g===true)?"; secure":"")},get:function(d){var b=d+"=";var g=b.length;var a=document.cookie.length;var e=0;var c=0;while(e<a){c=e+g;if(document.cookie.substring(e,c)==b){return Ext.util.Cookies.getCookieVal(c)}e=document.cookie.indexOf(" ",e)+1;if(e===0){break}}return null},clear:function(a){if(Ext.util.Cookies.get(a)){document.cookie=a+"=; expires=Thu, 01-Jan-70 00:00:01 GMT"}},getCookieVal:function(b){var a=document.cookie.indexOf(";",b);if(a==-1){a=document.cookie.length}return unescape(document.cookie.substring(b,a))}};Ext.handleError=function(a){throw a};Ext.Error=function(a){this.message=(this.lang[a])?this.lang[a]:a};Ext.Error.prototype=new Error();Ext.apply(Ext.Error.prototype,{lang:{},name:"Ext.Error",getName:function(){return this.name},getMessage:function(){return this.message},toJson:function(){return Ext.encode(this)}});Ext.ComponentMgr=function(){var c=new Ext.util.MixedCollection();var b={};var a={};return{register:function(d){c.add(d)},unregister:function(d){c.remove(d)},get:function(d){return c.get(d)},onAvailable:function(g,e,d){c.on("add",function(h,i){if(i.id==g){e.call(d||i,i);c.un("add",e,d)}})},all:c,types:b,ptypes:a,isRegistered:function(d){return b[d]!==undefined},isPluginRegistered:function(d){return a[d]!==undefined},registerType:function(e,d){b[e]=d;d.xtype=e},create:function(d,e){return d.render?d:new b[d.xtype||e](d)},registerPlugin:function(e,d){a[e]=d;d.ptype=e},createPlugin:function(e,g){var d=a[e.ptype||g];if(d.init){return d}else{return new d(e)}}}}();Ext.reg=Ext.ComponentMgr.registerType;Ext.preg=Ext.ComponentMgr.registerPlugin;Ext.create=Ext.ComponentMgr.create;Ext.Component=function(b){b=b||{};if(b.initialConfig){if(b.isAction){this.baseAction=b}b=b.initialConfig}else{if(b.tagName||b.dom||Ext.isString(b)){b={applyTo:b,id:b.id||b}}}this.initialConfig=b;Ext.apply(this,b);this.addEvents("added","disable","enable","beforeshow","show","beforehide","hide","removed","beforerender","render","afterrender","beforedestroy","destroy","beforestaterestore","staterestore","beforestatesave","statesave");this.getId();Ext.ComponentMgr.register(this);Ext.Component.superclass.constructor.call(this);if(this.baseAction){this.baseAction.addComponent(this)}this.initComponent();if(this.plugins){if(Ext.isArray(this.plugins)){for(var c=0,a=this.plugins.length;c<a;c++){this.plugins[c]=this.initPlugin(this.plugins[c])}}else{this.plugins=this.initPlugin(this.plugins)}}if(this.stateful!==false){this.initState()}if(this.applyTo){this.applyToMarkup(this.applyTo);delete this.applyTo}else{if(this.renderTo){this.render(this.renderTo);delete this.renderTo}}};Ext.Component.AUTO_ID=1000;Ext.extend(Ext.Component,Ext.util.Observable,{disabled:false,hidden:false,autoEl:"div",disabledClass:"x-item-disabled",allowDomMove:true,autoShow:false,hideMode:"display",hideParent:false,rendered:false,tplWriteMode:"overwrite",bubbleEvents:[],ctype:"Ext.Component",actionMode:"el",getActionEl:function(){return this[this.actionMode]},initPlugin:function(a){if(a.ptype&&!Ext.isFunction(a.init)){a=Ext.ComponentMgr.createPlugin(a)}else{if(Ext.isString(a)){a=Ext.ComponentMgr.createPlugin({ptype:a})}}a.init(this);return a},initComponent:function(){if(this.listeners){this.on(this.listeners);delete this.listeners}this.enableBubble(this.bubbleEvents)},render:function(b,a){if(!this.rendered&&this.fireEvent("beforerender",this)!==false){if(!b&&this.el){this.el=Ext.get(this.el);b=this.el.dom.parentNode;this.allowDomMove=false}this.container=Ext.get(b);if(this.ctCls){this.container.addClass(this.ctCls)}this.rendered=true;if(a!==undefined){if(Ext.isNumber(a)){a=this.container.dom.childNodes[a]}else{a=Ext.getDom(a)}}this.onRender(this.container,a||null);if(this.autoShow){this.el.removeClass(["x-hidden","x-hide-"+this.hideMode])}if(this.cls){this.el.addClass(this.cls);delete this.cls}if(this.style){this.el.applyStyles(this.style);delete this.style}if(this.overCls){this.el.addClassOnOver(this.overCls)}this.fireEvent("render",this);var c=this.getContentTarget();if(this.html){c.update(Ext.DomHelper.markup(this.html));delete this.html}if(this.contentEl){var d=Ext.getDom(this.contentEl);Ext.fly(d).removeClass(["x-hidden","x-hide-display"]);c.appendChild(d)}if(this.tpl){if(!this.tpl.compile){this.tpl=new Ext.XTemplate(this.tpl)}if(this.data){this.tpl[this.tplWriteMode](c,this.data);delete this.data}}this.afterRender(this.container);if(this.hidden){this.doHide()}if(this.disabled){this.disable(true)}if(this.stateful!==false){this.initStateEvents()}this.fireEvent("afterrender",this)}return this},update:function(b,d,a){var c=this.getContentTarget();if(this.tpl&&typeof b!=="string"){this.tpl[this.tplWriteMode](c,b||{})}else{var e=Ext.isObject(b)?Ext.DomHelper.markup(b):b;c.update(e,d,a)}},onAdded:function(a,b){this.ownerCt=a;this.initRef();this.fireEvent("added",this,a,b)},onRemoved:function(){this.removeRef();this.fireEvent("removed",this,this.ownerCt);delete this.ownerCt},initRef:function(){if(this.ref&&!this.refOwner){var d=this.ref.split("/"),c=d.length,b=0,a=this;while(a&&b<c){a=a.ownerCt;++b}if(a){a[this.refName=d[--b]]=this;this.refOwner=a}}},removeRef:function(){if(this.refOwner&&this.refName){delete this.refOwner[this.refName];delete this.refOwner}},initState:function(){if(Ext.state.Manager){var b=this.getStateId();if(b){var a=Ext.state.Manager.get(b);if(a){if(this.fireEvent("beforestaterestore",this,a)!==false){this.applyState(Ext.apply({},a));this.fireEvent("staterestore",this,a)}}}}},getStateId:function(){return this.stateId||((/^(ext-comp-|ext-gen)/).test(String(this.id))?null:this.id)},initStateEvents:function(){if(this.stateEvents){for(var a=0,b;b=this.stateEvents[a];a++){this.on(b,this.saveState,this,{delay:100})}}},applyState:function(a){if(a){Ext.apply(this,a)}},getState:function(){return null},saveState:function(){if(Ext.state.Manager&&this.stateful!==false){var b=this.getStateId();if(b){var a=this.getState();if(this.fireEvent("beforestatesave",this,a)!==false){Ext.state.Manager.set(b,a);this.fireEvent("statesave",this,a)}}}},applyToMarkup:function(a){this.allowDomMove=false;this.el=Ext.get(a);this.render(this.el.dom.parentNode)},addClass:function(a){if(this.el){this.el.addClass(a)}else{this.cls=this.cls?this.cls+" "+a:a}return this},removeClass:function(a){if(this.el){this.el.removeClass(a)}else{if(this.cls){this.cls=this.cls.split(" ").remove(a).join(" ")}}return this},onRender:function(b,a){if(!this.el&&this.autoEl){if(Ext.isString(this.autoEl)){this.el=document.createElement(this.autoEl)}else{var c=document.createElement("div");Ext.DomHelper.overwrite(c,this.autoEl);this.el=c.firstChild}if(!this.el.id){this.el.id=this.getId()}}if(this.el){this.el=Ext.get(this.el);if(this.allowDomMove!==false){b.dom.insertBefore(this.el.dom,a);if(c){Ext.removeNode(c);c=null}}}},getAutoCreate:function(){var a=Ext.isObject(this.autoCreate)?this.autoCreate:Ext.apply({},this.defaultAutoCreate);if(this.id&&!a.id){a.id=this.id}return a},afterRender:Ext.emptyFn,destroy:function(){if(!this.isDestroyed){if(this.fireEvent("beforedestroy",this)!==false){this.destroying=true;this.beforeDestroy();if(this.ownerCt&&this.ownerCt.remove){this.ownerCt.remove(this,false)}if(this.rendered){this.el.remove();if(this.actionMode=="container"||this.removeMode=="container"){this.container.remove()}}if(this.focusTask&&this.focusTask.cancel){this.focusTask.cancel()}this.onDestroy();Ext.ComponentMgr.unregister(this);this.fireEvent("destroy",this);this.purgeListeners();this.destroying=false;this.isDestroyed=true}}},deleteMembers:function(){var b=arguments;for(var c=0,a=b.length;c<a;++c){delete this[b[c]]}},beforeDestroy:Ext.emptyFn,onDestroy:Ext.emptyFn,getEl:function(){return this.el},getContentTarget:function(){return this.el},getId:function(){return this.id||(this.id="ext-comp-"+(++Ext.Component.AUTO_ID))},getItemId:function(){return this.itemId||this.getId()},focus:function(b,a){if(a){this.focusTask=new Ext.util.DelayedTask(this.focus,this,[b,false]);this.focusTask.delay(Ext.isNumber(a)?a:10);return this}if(this.rendered&&!this.isDestroyed){this.el.focus();if(b===true){this.el.dom.select()}}return this},blur:function(){if(this.rendered){this.el.blur()}return this},disable:function(a){if(this.rendered){this.onDisable()}this.disabled=true;if(a!==true){this.fireEvent("disable",this)}return this},onDisable:function(){this.getActionEl().addClass(this.disabledClass);this.el.dom.disabled=true},enable:function(){if(this.rendered){this.onEnable()}this.disabled=false;this.fireEvent("enable",this);return this},onEnable:function(){this.getActionEl().removeClass(this.disabledClass);this.el.dom.disabled=false},setDisabled:function(a){return this[a?"disable":"enable"]()},show:function(){if(this.fireEvent("beforeshow",this)!==false){this.hidden=false;if(this.autoRender){this.render(Ext.isBoolean(this.autoRender)?Ext.getBody():this.autoRender)}if(this.rendered){this.onShow()}this.fireEvent("show",this)}return this},onShow:function(){this.getVisibilityEl().removeClass("x-hide-"+this.hideMode)},hide:function(){if(this.fireEvent("beforehide",this)!==false){this.doHide();this.fireEvent("hide",this)}return this},doHide:function(){this.hidden=true;if(this.rendered){this.onHide()}},onHide:function(){this.getVisibilityEl().addClass("x-hide-"+this.hideMode)},getVisibilityEl:function(){return this.hideParent?this.container:this.getActionEl()},setVisible:function(a){return this[a?"show":"hide"]()},isVisible:function(){return this.rendered&&this.getVisibilityEl().isVisible()},cloneConfig:function(b){b=b||{};var c=b.id||Ext.id();var a=Ext.applyIf(b,this.initialConfig);a.id=c;return new this.constructor(a)},getXType:function(){return this.constructor.xtype},isXType:function(b,a){if(Ext.isFunction(b)){b=b.xtype}else{if(Ext.isObject(b)){b=b.constructor.xtype}}return !a?("/"+this.getXTypes()+"/").indexOf("/"+b+"/")!=-1:this.constructor.xtype==b},getXTypes:function(){var a=this.constructor;if(!a.xtypes){var d=[],b=this;while(b&&b.constructor.xtype){d.unshift(b.constructor.xtype);b=b.constructor.superclass}a.xtypeChain=d;a.xtypes=d.join("/")}return a.xtypes},findParentBy:function(a){for(var b=this.ownerCt;(b!=null)&&!a(b,this);b=b.ownerCt){}return b||null},findParentByType:function(b,a){return this.findParentBy(function(d){return d.isXType(b,a)})},bubble:function(c,b,a){var d=this;while(d){if(c.apply(b||d,a||[d])===false){break}d=d.ownerCt}return this},getPositionEl:function(){return this.positionEl||this.el},purgeListeners:function(){Ext.Component.superclass.purgeListeners.call(this);if(this.mons){this.on("beforedestroy",this.clearMons,this,{single:true})}},clearMons:function(){Ext.each(this.mons,function(a){a.item.un(a.ename,a.fn,a.scope)},this);this.mons=[]},createMons:function(){if(!this.mons){this.mons=[];this.on("beforedestroy",this.clearMons,this,{single:true})}},mon:function(g,b,d,c,a){this.createMons();if(Ext.isObject(b)){var j=/^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;var i=b;for(var h in i){if(j.test(h)){continue}if(Ext.isFunction(i[h])){this.mons.push({item:g,ename:h,fn:i[h],scope:i.scope});g.on(h,i[h],i.scope,i)}else{this.mons.push({item:g,ename:h,fn:i[h],scope:i.scope});g.on(h,i[h])}}return}this.mons.push({item:g,ename:b,fn:d,scope:c});g.on(b,d,c,a)},mun:function(h,c,g,e){var j,d;this.createMons();for(var b=0,a=this.mons.length;b<a;++b){d=this.mons[b];if(h===d.item&&c==d.ename&&g===d.fn&&e===d.scope){this.mons.splice(b,1);h.un(c,g,e);j=true;break}}return j},nextSibling:function(){if(this.ownerCt){var a=this.ownerCt.items.indexOf(this);if(a!=-1&&a+1<this.ownerCt.items.getCount()){return this.ownerCt.items.itemAt(a+1)}}return null},previousSibling:function(){if(this.ownerCt){var a=this.ownerCt.items.indexOf(this);if(a>0){return this.ownerCt.items.itemAt(a-1)}}return null},getBubbleTarget:function(){return this.ownerCt}});Ext.reg("component",Ext.Component);Ext.Action=Ext.extend(Object,{constructor:function(a){this.initialConfig=a;this.itemId=a.itemId=(a.itemId||a.id||Ext.id());this.items=[]},isAction:true,setText:function(a){this.initialConfig.text=a;this.callEach("setText",[a])},getText:function(){return this.initialConfig.text},setIconClass:function(a){this.initialConfig.iconCls=a;this.callEach("setIconClass",[a])},getIconClass:function(){return this.initialConfig.iconCls},setDisabled:function(a){this.initialConfig.disabled=a;this.callEach("setDisabled",[a])},enable:function(){this.setDisabled(false)},disable:function(){this.setDisabled(true)},isDisabled:function(){return this.initialConfig.disabled},setHidden:function(a){this.initialConfig.hidden=a;this.callEach("setVisible",[!a])},show:function(){this.setHidden(false)},hide:function(){this.setHidden(true)},isHidden:function(){return this.initialConfig.hidden},setHandler:function(b,a){this.initialConfig.handler=b;this.initialConfig.scope=a;this.callEach("setHandler",[b,a])},each:function(b,a){Ext.each(this.items,b,a)},callEach:function(e,b){var d=this.items;for(var c=0,a=d.length;c<a;c++){d[c][e].apply(d[c],b)}},addComponent:function(a){this.items.push(a);a.on("destroy",this.removeComponent,this)},removeComponent:function(a){this.items.remove(a)},execute:function(){this.initialConfig.handler.apply(this.initialConfig.scope||window,arguments)}});(function(){Ext.Layer=function(d,c){d=d||{};var e=Ext.DomHelper,h=d.parentEl,g=h?Ext.getDom(h):document.body;if(c){this.dom=Ext.getDom(c)}if(!this.dom){var i=d.dh||{tag:"div",cls:"x-layer"};this.dom=e.append(g,i)}if(d.cls){this.addClass(d.cls)}this.constrain=d.constrain!==false;this.setVisibilityMode(Ext.Element.VISIBILITY);if(d.id){this.id=this.dom.id=d.id}else{this.id=Ext.id(this.dom)}this.zindex=d.zindex||this.getZIndex();this.position("absolute",this.zindex);if(d.shadow){this.shadowOffset=d.shadowOffset||4;this.shadow=new Ext.Shadow({offset:this.shadowOffset,mode:d.shadow})}else{this.shadowOffset=0}this.useShim=d.shim!==false&&Ext.useShims;this.useDisplay=d.useDisplay;this.hide()};var a=Ext.Element.prototype;var b=[];Ext.extend(Ext.Layer,Ext.Element,{getZIndex:function(){return this.zindex||parseInt((this.getShim()||this).getStyle("z-index"),10)||11000},getShim:function(){if(!this.useShim){return null}if(this.shim){return this.shim}var d=b.shift();if(!d){d=this.createShim();d.enableDisplayMode("block");d.dom.style.display="none";d.dom.style.visibility="visible"}var c=this.dom.parentNode;if(d.dom.parentNode!=c){c.insertBefore(d.dom,this.dom)}d.setStyle("z-index",this.getZIndex()-2);this.shim=d;return d},hideShim:function(){if(this.shim){this.shim.setDisplayed(false);b.push(this.shim);delete this.shim}},disableShadow:function(){if(this.shadow){this.shadowDisabled=true;this.shadow.hide();this.lastShadowOffset=this.shadowOffset;this.shadowOffset=0}},enableShadow:function(c){if(this.shadow){this.shadowDisabled=false;if(Ext.isDefined(this.lastShadowOffset)){this.shadowOffset=this.lastShadowOffset;delete this.lastShadowOffset}if(c){this.sync(true)}}},sync:function(d){var n=this.shadow;if(!this.updating&&this.isVisible()&&(n||this.useShim)){var i=this.getShim(),m=this.getWidth(),j=this.getHeight(),e=this.getLeft(true),o=this.getTop(true);if(n&&!this.shadowDisabled){if(d&&!n.isVisible()){n.show(this)}else{n.realign(e,o,m,j)}if(i){if(d){i.show()}var k=n.el.getXY(),g=i.dom.style,c=n.el.getSize();g.left=(k[0])+"px";g.top=(k[1])+"px";g.width=(c.width)+"px";g.height=(c.height)+"px"}}else{if(i){if(d){i.show()}i.setSize(m,j);i.setLeftTop(e,o)}}}},destroy:function(){this.hideShim();if(this.shadow){this.shadow.hide()}this.removeAllListeners();Ext.removeNode(this.dom);delete this.dom},remove:function(){this.destroy()},beginUpdate:function(){this.updating=true},endUpdate:function(){this.updating=false;this.sync(true)},hideUnders:function(c){if(this.shadow){this.shadow.hide()}this.hideShim()},constrainXY:function(){if(this.constrain){var j=Ext.lib.Dom.getViewWidth(),d=Ext.lib.Dom.getViewHeight();var o=Ext.getDoc().getScroll();var n=this.getXY();var k=n[0],i=n[1];var c=this.shadowOffset;var l=this.dom.offsetWidth+c,e=this.dom.offsetHeight+c;var g=false;if((k+l)>j+o.left){k=j-l-c;g=true}if((i+e)>d+o.top){i=d-e-c;g=true}if(k<o.left){k=o.left;g=true}if(i<o.top){i=o.top;g=true}if(g){if(this.avoidY){var m=this.avoidY;if(i<=m&&(i+e)>=m){i=m-e-5}}n=[k,i];this.storeXY(n);a.setXY.call(this,n);this.sync()}}return this},getConstrainOffset:function(){return this.shadowOffset},isVisible:function(){return this.visible},showAction:function(){this.visible=true;if(this.useDisplay===true){this.setDisplayed("")}else{if(this.lastXY){a.setXY.call(this,this.lastXY)}else{if(this.lastLT){a.setLeftTop.call(this,this.lastLT[0],this.lastLT[1])}}}},hideAction:function(){this.visible=false;if(this.useDisplay===true){this.setDisplayed(false)}else{this.setLeftTop(-10000,-10000)}},setVisible:function(i,h,k,l,j){if(i){this.showAction()}if(h&&i){var g=function(){this.sync(true);if(l){l()}}.createDelegate(this);a.setVisible.call(this,true,true,k,g,j)}else{if(!i){this.hideUnders(true)}var g=l;if(h){g=function(){this.hideAction();if(l){l()}}.createDelegate(this)}a.setVisible.call(this,i,h,k,g,j);if(i){this.sync(true)}else{if(!h){this.hideAction()}}}return this},storeXY:function(c){delete this.lastLT;this.lastXY=c},storeLeftTop:function(d,c){delete this.lastXY;this.lastLT=[d,c]},beforeFx:function(){this.beforeAction();return Ext.Layer.superclass.beforeFx.apply(this,arguments)},afterFx:function(){Ext.Layer.superclass.afterFx.apply(this,arguments);this.sync(this.isVisible())},beforeAction:function(){if(!this.updating&&this.shadow){this.shadow.hide()}},setLeft:function(c){this.storeLeftTop(c,this.getTop(true));a.setLeft.apply(this,arguments);this.sync();return this},setTop:function(c){this.storeLeftTop(this.getLeft(true),c);a.setTop.apply(this,arguments);this.sync();return this},setLeftTop:function(d,c){this.storeLeftTop(d,c);a.setLeftTop.apply(this,arguments);this.sync();return this},setXY:function(j,h,k,l,i){this.fixDisplay();this.beforeAction();this.storeXY(j);var g=this.createCB(l);a.setXY.call(this,j,h,k,g,i);if(!h){g()}return this},createCB:function(e){var d=this;return function(){d.constrainXY();d.sync(true);if(e){e()}}},setX:function(g,h,j,k,i){this.setXY([g,this.getY()],h,j,k,i);return this},setY:function(k,g,i,j,h){this.setXY([this.getX(),k],g,i,j,h);return this},setSize:function(j,k,i,m,n,l){this.beforeAction();var g=this.createCB(n);a.setSize.call(this,j,k,i,m,g,l);if(!i){g()}return this},setWidth:function(i,h,k,l,j){this.beforeAction();var g=this.createCB(l);a.setWidth.call(this,i,h,k,g,j);if(!h){g()}return this},setHeight:function(j,i,l,m,k){this.beforeAction();var g=this.createCB(m);a.setHeight.call(this,j,i,l,g,k);if(!i){g()}return this},setBounds:function(o,m,p,i,n,k,l,j){this.beforeAction();var g=this.createCB(l);if(!n){this.storeXY([o,m]);a.setXY.call(this,[o,m]);a.setSize.call(this,p,i,n,k,g,j);g()}else{a.setBounds.call(this,o,m,p,i,n,k,g,j)}return this},setZIndex:function(c){this.zindex=c;this.setStyle("z-index",c+2);if(this.shadow){this.shadow.setZIndex(c+1)}if(this.shim){this.shim.setStyle("z-index",c)}return this}})})();Ext.Shadow=function(d){Ext.apply(this,d);if(typeof this.mode!="string"){this.mode=this.defaultMode}var e=this.offset,c={h:0},b=Math.floor(this.offset/2);switch(this.mode.toLowerCase()){case"drop":c.w=0;c.l=c.t=e;c.t-=1;if(Ext.isIE9m){c.l-=this.offset+b;c.t-=this.offset+b;c.w-=b;c.h-=b;c.t+=1}break;case"sides":c.w=(e*2);c.l=-e;c.t=e-1;if(Ext.isIE9m){c.l-=(this.offset-b);c.t-=this.offset+b;c.l+=1;c.w-=(this.offset-b)*2;c.w-=b+1;c.h-=1}break;case"frame":c.w=c.h=(e*2);c.l=c.t=-e;c.t+=1;c.h-=2;if(Ext.isIE9m){c.l-=(this.offset-b);c.t-=(this.offset-b);c.l+=1;c.w-=(this.offset+b+1);c.h-=(this.offset+b);c.h+=1}break}this.adjusts=c};Ext.Shadow.prototype={offset:4,defaultMode:"drop",show:function(a){a=Ext.get(a);if(!this.el){this.el=Ext.Shadow.Pool.pull();if(this.el.dom.nextSibling!=a.dom){this.el.insertBefore(a)}}this.el.setStyle("z-index",this.zIndex||parseInt(a.getStyle("z-index"),10)-1);if(Ext.isIE9m){this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+(this.offset)+")"}this.realign(a.getLeft(true),a.getTop(true),a.getWidth(),a.getHeight());this.el.dom.style.display="block"},isVisible:function(){return this.el?true:false},realign:function(b,r,q,g){if(!this.el){return}var n=this.adjusts,k=this.el.dom,u=k.style,i=0,p=(q+n.w),e=(g+n.h),j=p+"px",o=e+"px",m,c;u.left=(b+n.l)+"px";u.top=(r+n.t)+"px";if(u.width!=j||u.height!=o){u.width=j;u.height=o;if(!Ext.isIE9m){m=k.childNodes;c=Math.max(0,(p-12))+"px";m[0].childNodes[1].style.width=c;m[1].childNodes[1].style.width=c;m[2].childNodes[1].style.width=c;m[1].style.height=Math.max(0,(e-12))+"px"}}},hide:function(){if(this.el){this.el.dom.style.display="none";Ext.Shadow.Pool.push(this.el);delete this.el}},setZIndex:function(a){this.zIndex=a;if(this.el){this.el.setStyle("z-index",a)}}};Ext.Shadow.Pool=function(){var b=[],a=Ext.isIE9m?'<div class="x-ie-shadow"></div>':'<div class="x-shadow"><div class="xst"><div class="xstl"></div><div class="xstc"></div><div class="xstr"></div></div><div class="xsc"><div class="xsml"></div><div class="xsmc"></div><div class="xsmr"></div></div><div class="xsb"><div class="xsbl"></div><div class="xsbc"></div><div class="xsbr"></div></div></div>';return{pull:function(){var c=b.shift();if(!c){c=Ext.get(Ext.DomHelper.insertHtml("beforeBegin",document.body.firstChild,a));c.autoBoxAdjust=false}return c},push:function(c){b.push(c)}}}();Ext.BoxComponent=Ext.extend(Ext.Component,{initComponent:function(){Ext.BoxComponent.superclass.initComponent.call(this);this.addEvents("resize","move")},boxReady:false,deferHeight:false,setSize:function(b,d){if(typeof b=="object"){d=b.height;b=b.width}if(Ext.isDefined(b)&&Ext.isDefined(this.boxMinWidth)&&(b<this.boxMinWidth)){b=this.boxMinWidth}if(Ext.isDefined(d)&&Ext.isDefined(this.boxMinHeight)&&(d<this.boxMinHeight)){d=this.boxMinHeight}if(Ext.isDefined(b)&&Ext.isDefined(this.boxMaxWidth)&&(b>this.boxMaxWidth)){b=this.boxMaxWidth}if(Ext.isDefined(d)&&Ext.isDefined(this.boxMaxHeight)&&(d>this.boxMaxHeight)){d=this.boxMaxHeight}if(!this.boxReady){this.width=b;this.height=d;return this}if(this.cacheSizes!==false&&this.lastSize&&this.lastSize.width==b&&this.lastSize.height==d){return this}this.lastSize={width:b,height:d};var c=this.adjustSize(b,d),g=c.width,a=c.height,e;if(g!==undefined||a!==undefined){e=this.getResizeEl();if(!this.deferHeight&&g!==undefined&&a!==undefined){e.setSize(g,a)}else{if(!this.deferHeight&&a!==undefined){e.setHeight(a)}else{if(g!==undefined){e.setWidth(g)}}}this.onResize(g,a,b,d);this.fireEvent("resize",this,g,a,b,d)}return this},setWidth:function(a){return this.setSize(a)},setHeight:function(a){return this.setSize(undefined,a)},getSize:function(){return this.getResizeEl().getSize()},getWidth:function(){return this.getResizeEl().getWidth()},getHeight:function(){return this.getResizeEl().getHeight()},getOuterSize:function(){var a=this.getResizeEl();return{width:a.getWidth()+a.getMargins("lr"),height:a.getHeight()+a.getMargins("tb")}},getPosition:function(a){var b=this.getPositionEl();if(a===true){return[b.getLeft(true),b.getTop(true)]}return this.xy||b.getXY()},getBox:function(a){var c=this.getPosition(a);var b=this.getSize();b.x=c[0];b.y=c[1];return b},updateBox:function(a){this.setSize(a.width,a.height);this.setPagePosition(a.x,a.y);return this},getResizeEl:function(){return this.resizeEl||this.el},setAutoScroll:function(a){if(this.rendered){this.getContentTarget().setOverflow(a?"auto":"")}this.autoScroll=a;return this},setPosition:function(a,g){if(a&&typeof a[1]=="number"){g=a[1];a=a[0]}this.x=a;this.y=g;if(!this.boxReady){return this}var b=this.adjustPosition(a,g);var e=b.x,d=b.y;var c=this.getPositionEl();if(e!==undefined||d!==undefined){if(e!==undefined&&d!==undefined){c.setLeftTop(e,d)}else{if(e!==undefined){c.setLeft(e)}else{if(d!==undefined){c.setTop(d)}}}this.onPosition(e,d);this.fireEvent("move",this,e,d)}return this},setPagePosition:function(a,c){if(a&&typeof a[1]=="number"){c=a[1];a=a[0]}this.pageX=a;this.pageY=c;if(!this.boxReady){return}if(a===undefined||c===undefined){return}var b=this.getPositionEl().translatePoints(a,c);this.setPosition(b.left,b.top);return this},afterRender:function(){Ext.BoxComponent.superclass.afterRender.call(this);if(this.resizeEl){this.resizeEl=Ext.get(this.resizeEl)}if(this.positionEl){this.positionEl=Ext.get(this.positionEl)}this.boxReady=true;Ext.isDefined(this.autoScroll)&&this.setAutoScroll(this.autoScroll);this.setSize(this.width,this.height);if(this.x||this.y){this.setPosition(this.x,this.y)}else{if(this.pageX||this.pageY){this.setPagePosition(this.pageX,this.pageY)}}},syncSize:function(){delete this.lastSize;this.setSize(this.autoWidth?undefined:this.getResizeEl().getWidth(),this.autoHeight?undefined:this.getResizeEl().getHeight());return this},onResize:function(d,b,a,c){},onPosition:function(a,b){},adjustSize:function(a,b){if(this.autoWidth){a="auto"}if(this.autoHeight){b="auto"}return{width:a,height:b}},adjustPosition:function(a,b){return{x:a,y:b}}});Ext.reg("box",Ext.BoxComponent);Ext.Spacer=Ext.extend(Ext.BoxComponent,{autoEl:"div"});Ext.reg("spacer",Ext.Spacer);Ext.SplitBar=function(c,e,b,d,a){this.el=Ext.get(c,true);this.el.unselectable();this.resizingEl=Ext.get(e,true);this.orientation=b||Ext.SplitBar.HORIZONTAL;this.minSize=0;this.maxSize=2000;this.animate=false;this.useShim=false;this.shim=null;if(!a){this.proxy=Ext.SplitBar.createProxy(this.orientation)}else{this.proxy=Ext.get(a).dom}this.dd=new Ext.dd.DDProxy(this.el.dom.id,"XSplitBars",{dragElId:this.proxy.id});this.dd.b4StartDrag=this.onStartProxyDrag.createDelegate(this);this.dd.endDrag=this.onEndProxyDrag.createDelegate(this);this.dragSpecs={};this.adapter=new Ext.SplitBar.BasicLayoutAdapter();this.adapter.init(this);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.placement=d||(this.el.getX()>this.resizingEl.getX()?Ext.SplitBar.LEFT:Ext.SplitBar.RIGHT);this.el.addClass("x-splitbar-h")}else{this.placement=d||(this.el.getY()>this.resizingEl.getY()?Ext.SplitBar.TOP:Ext.SplitBar.BOTTOM);this.el.addClass("x-splitbar-v")}this.addEvents("resize","moved","beforeresize","beforeapply");Ext.SplitBar.superclass.constructor.call(this)};Ext.extend(Ext.SplitBar,Ext.util.Observable,{onStartProxyDrag:function(a,e){this.fireEvent("beforeresize",this);this.overlay=Ext.DomHelper.append(document.body,{cls:"x-drag-overlay",html:"&#160;"},true);this.overlay.unselectable();this.overlay.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.overlay.show();Ext.get(this.proxy).setDisplayed("block");var c=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();this.activeMaxSize=this.getMaximumSize();var d=c-this.activeMinSize;var b=Math.max(this.activeMaxSize-c,0);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==Ext.SplitBar.LEFT?d:b,this.placement==Ext.SplitBar.LEFT?b:d,this.tickSize);this.dd.setYConstraint(0,0)}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==Ext.SplitBar.TOP?d:b,this.placement==Ext.SplitBar.TOP?b:d,this.tickSize)}this.dragSpecs.startSize=c;this.dragSpecs.startPoint=[a,e];Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd,a,e)},onEndProxyDrag:function(c){Ext.get(this.proxy).setDisplayed(false);var b=Ext.lib.Event.getXY(c);if(this.overlay){Ext.destroy(this.overlay);delete this.overlay}var a;if(this.orientation==Ext.SplitBar.HORIZONTAL){a=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.LEFT?b[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-b[0])}else{a=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.TOP?b[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-b[1])}a=Math.min(Math.max(a,this.activeMinSize),this.activeMaxSize);if(a!=this.dragSpecs.startSize){if(this.fireEvent("beforeapply",this,a)!==false){this.adapter.setElementSize(this,a);this.fireEvent("moved",this,a);this.fireEvent("resize",this,a)}}},getAdapter:function(){return this.adapter},setAdapter:function(a){this.adapter=a;this.adapter.init(this)},getMinimumSize:function(){return this.minSize},setMinimumSize:function(a){this.minSize=a},getMaximumSize:function(){return this.maxSize},setMaximumSize:function(a){this.maxSize=a},setCurrentSize:function(b){var a=this.animate;this.animate=false;this.adapter.setElementSize(this,b);this.animate=a},destroy:function(a){Ext.destroy(this.shim,Ext.get(this.proxy));this.dd.unreg();if(a){this.el.remove()}this.purgeListeners()}});Ext.SplitBar.createProxy=function(b){var c=new Ext.Element(document.createElement("div"));document.body.appendChild(c.dom);c.unselectable();var a="x-splitbar-proxy";c.addClass(a+" "+(b==Ext.SplitBar.HORIZONTAL?a+"-h":a+"-v"));return c.dom};Ext.SplitBar.BasicLayoutAdapter=function(){};Ext.SplitBar.BasicLayoutAdapter.prototype={init:function(a){},getElementSize:function(a){if(a.orientation==Ext.SplitBar.HORIZONTAL){return a.resizingEl.getWidth()}else{return a.resizingEl.getHeight()}},setElementSize:function(b,a,c){if(b.orientation==Ext.SplitBar.HORIZONTAL){if(!b.animate){b.resizingEl.setWidth(a);if(c){c(b,a)}}else{b.resizingEl.setWidth(a,true,0.1,c,"easeOut")}}else{if(!b.animate){b.resizingEl.setHeight(a);if(c){c(b,a)}}else{b.resizingEl.setHeight(a,true,0.1,c,"easeOut")}}}};Ext.SplitBar.AbsoluteLayoutAdapter=function(a){this.basic=new Ext.SplitBar.BasicLayoutAdapter();this.container=Ext.get(a)};Ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(a){this.basic.init(a)},getElementSize:function(a){return this.basic.getElementSize(a)},setElementSize:function(b,a,c){this.basic.setElementSize(b,a,this.moveSplitter.createDelegate(this,[b]))},moveSplitter:function(a){var b=Ext.SplitBar;switch(a.placement){case b.LEFT:a.el.setX(a.resizingEl.getRight());break;case b.RIGHT:a.el.setStyle("right",(this.container.getWidth()-a.resizingEl.getLeft())+"px");break;case b.TOP:a.el.setY(a.resizingEl.getBottom());break;case b.BOTTOM:a.el.setY(a.resizingEl.getTop()-a.el.getHeight());break}}};Ext.SplitBar.VERTICAL=1;Ext.SplitBar.HORIZONTAL=2;Ext.SplitBar.LEFT=1;Ext.SplitBar.RIGHT=2;Ext.SplitBar.TOP=3;Ext.SplitBar.BOTTOM=4;Ext.Container=Ext.extend(Ext.BoxComponent,{bufferResize:50,autoDestroy:true,forceLayout:false,defaultType:"panel",resizeEvent:"resize",bubbleEvents:["add","remove"],initComponent:function(){Ext.Container.superclass.initComponent.call(this);this.addEvents("afterlayout","beforeadd","beforeremove","add","remove");var a=this.items;if(a){delete this.items;this.add(a)}},initItems:function(){if(!this.items){this.items=new Ext.util.MixedCollection(false,this.getComponentId);this.getLayout()}},setLayout:function(a){if(this.layout&&this.layout!=a){this.layout.setContainer(null)}this.layout=a;this.initItems();a.setContainer(this)},afterRender:function(){Ext.Container.superclass.afterRender.call(this);if(!this.layout){this.layout="auto"}if(Ext.isObject(this.layout)&&!this.layout.layout){this.layoutConfig=this.layout;this.layout=this.layoutConfig.type}if(Ext.isString(this.layout)){this.layout=new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig)}this.setLayout(this.layout);if(this.activeItem!==undefined&&this.layout.setActiveItem){var a=this.activeItem;delete this.activeItem;this.layout.setActiveItem(a)}if(!this.ownerCt){this.doLayout(false,true)}if(this.monitorResize===true){Ext.EventManager.onWindowResize(this.doLayout,this,[false])}},getLayoutTarget:function(){return this.el},getComponentId:function(a){return a.getItemId()},add:function(b){this.initItems();var e=arguments.length>1;if(e||Ext.isArray(b)){var a=[];Ext.each(e?arguments:b,function(h){a.push(this.add(h))},this);return a}var g=this.lookupComponent(this.applyDefaults(b));var d=this.items.length;if(this.fireEvent("beforeadd",this,g,d)!==false&&this.onBeforeAdd(g)!==false){this.items.add(g);g.onAdded(this,d);this.onAdd(g);this.fireEvent("add",this,g,d)}return g},onAdd:function(a){},onAdded:function(a,b){this.ownerCt=a;this.initRef();this.cascade(function(d){d.initRef()});this.fireEvent("added",this,a,b)},insert:function(e,b){var d=arguments,h=d.length,a=[],g,j;this.initItems();if(h>2){for(g=h-1;g>=1;--g){a.push(this.insert(e,d[g]))}return a}j=this.lookupComponent(this.applyDefaults(b));e=Math.min(e,this.items.length);if(this.fireEvent("beforeadd",this,j,e)!==false&&this.onBeforeAdd(j)!==false){if(j.ownerCt==this){this.items.remove(j)}this.items.insert(e,j);j.onAdded(this,e);this.onAdd(j);this.fireEvent("add",this,j,e)}return j},applyDefaults:function(b){var a=this.defaults;if(a){if(Ext.isFunction(a)){a=a.call(this,b)}if(Ext.isString(b)){b=Ext.ComponentMgr.get(b);Ext.apply(b,a)}else{if(!b.events){Ext.applyIf(b.isAction?b.initialConfig:b,a)}else{Ext.apply(b,a)}}}return b},onBeforeAdd:function(a){if(a.ownerCt){a.ownerCt.remove(a,false)}if(this.hideBorders===true){a.border=(a.border===true)}},remove:function(a,b){this.initItems();var d=this.getComponent(a);if(d&&this.fireEvent("beforeremove",this,d)!==false){this.doRemove(d,b);this.fireEvent("remove",this,d)}return d},onRemove:function(a){},doRemove:function(e,d){var b=this.layout,a=b&&this.rendered;if(a){b.onRemove(e)}this.items.remove(e);e.onRemoved();this.onRemove(e);if(d===true||(d!==false&&this.autoDestroy)){e.destroy()}if(a){b.afterRemove(e)}},removeAll:function(c){this.initItems();var e,g=[],b=[];this.items.each(function(h){g.push(h)});for(var d=0,a=g.length;d<a;++d){e=g[d];this.remove(e,c);if(e.ownerCt!==this){b.push(e)}}return b},getComponent:function(a){if(Ext.isObject(a)){a=a.getItemId()}return this.items.get(a)},lookupComponent:function(a){if(Ext.isString(a)){return Ext.ComponentMgr.get(a)}else{if(!a.events){return this.createComponent(a)}}return a},createComponent:function(a,d){if(a.render){return a}var b=Ext.create(Ext.apply({ownerCt:this},a),d||this.defaultType);delete b.initialConfig.ownerCt;delete b.ownerCt;return b},canLayout:function(){var a=this.getVisibilityEl();return a&&a.dom&&!a.isStyle("display","none")},doLayout:function(g,e){var k=this.rendered,j=e||this.forceLayout;if(this.collapsed||!this.canLayout()){this.deferLayout=this.deferLayout||!g;if(!j){return}g=g&&!this.deferLayout}else{delete this.deferLayout}if(k&&this.layout){this.layout.layout()}if(g!==true&&this.items){var d=this.items.items;for(var b=0,a=d.length;b<a;b++){var h=d[b];if(h.doLayout){h.doLayout(false,j)}}}if(k){this.onLayout(g,j)}this.hasLayout=true;delete this.forceLayout},onLayout:Ext.emptyFn,shouldBufferLayout:function(){var a=this.hasLayout;if(this.ownerCt){return a?!this.hasLayoutPending():false}return a},hasLayoutPending:function(){var a=false;this.ownerCt.bubble(function(b){if(b.layoutPending){a=true;return false}});return a},onShow:function(){Ext.Container.superclass.onShow.call(this);if(Ext.isDefined(this.deferLayout)){delete this.deferLayout;this.doLayout(true)}},getLayout:function(){if(!this.layout){var a=new Ext.layout.AutoLayout(this.layoutConfig);this.setLayout(a)}return this.layout},beforeDestroy:function(){var a;if(this.items){while(a=this.items.first()){this.doRemove(a,true)}}if(this.monitorResize){Ext.EventManager.removeResizeListener(this.doLayout,this)}Ext.destroy(this.layout);Ext.Container.superclass.beforeDestroy.call(this)},cascade:function(g,e,b){if(g.apply(e||this,b||[this])!==false){if(this.items){var d=this.items.items;for(var c=0,a=d.length;c<a;c++){if(d[c].cascade){d[c].cascade(g,e,b)}else{g.apply(e||d[c],b||[d[c]])}}}}return this},findById:function(c){var a=null,b=this;this.cascade(function(d){if(b!=d&&d.id===c){a=d;return false}});return a},findByType:function(b,a){return this.findBy(function(d){return d.isXType(b,a)})},find:function(b,a){return this.findBy(function(d){return d[b]===a})},findBy:function(d,c){var a=[],b=this;this.cascade(function(e){if(b!=e&&d.call(c||e,e,b)===true){a.push(e)}});return a},get:function(a){return this.getComponent(a)}});Ext.Container.LAYOUTS={};Ext.reg("container",Ext.Container);Ext.layout.ContainerLayout=Ext.extend(Object,{monitorResize:false,activeItem:null,constructor:function(a){this.id=Ext.id(null,"ext-layout-");Ext.apply(this,a)},type:"container",IEMeasureHack:function(k,g){var a=k.dom.childNodes,b=a.length,n,m=[],l,h,j;for(h=0;h<b;h++){n=a[h];l=Ext.get(n);if(l){m[h]=l.getStyle("display");l.setStyle({display:"none"})}}j=k?k.getViewSize(g):{};for(h=0;h<b;h++){n=a[h];l=Ext.get(n);if(l){l.setStyle({display:m[h]})}}return j},getLayoutTargetSize:Ext.EmptyFn,layout:function(){var a=this.container,b=a.getLayoutTarget();if(!(this.hasLayout||Ext.isEmpty(this.targetCls))){b.addClass(this.targetCls)}this.onLayout(a,b);a.fireEvent("afterlayout",a,this)},onLayout:function(a,b){this.renderAll(a,b)},isValidParent:function(b,a){return a&&b.getPositionEl().dom.parentNode==(a.dom||a)},renderAll:function(e,g){var b=e.items.items,d,h,a=b.length;for(d=0;d<a;d++){h=b[d];if(h&&(!h.rendered||!this.isValidParent(h,g))){this.renderItem(h,d,g)}}},renderItem:function(d,a,b){if(d){if(!d.rendered){d.render(b,a);this.configureItem(d)}else{if(!this.isValidParent(d,b)){if(Ext.isNumber(a)){a=b.dom.childNodes[a]}b.dom.insertBefore(d.getPositionEl().dom,a||null);d.container=b;this.configureItem(d)}}}},getRenderedItems:function(g){var e=g.getLayoutTarget(),h=g.items.items,a=h.length,d,j,b=[];for(d=0;d<a;d++){if((j=h[d]).rendered&&this.isValidParent(j,e)&&j.shouldLayout!==false){b.push(j)}}return b},configureItem:function(b){if(this.extraCls){var a=b.getPositionEl?b.getPositionEl():b;a.addClass(this.extraCls)}if(b.doLayout&&this.forceLayout){b.doLayout()}if(this.renderHidden&&b!=this.activeItem){b.hide()}},onRemove:function(b){if(this.activeItem==b){delete this.activeItem}if(b.rendered&&this.extraCls){var a=b.getPositionEl?b.getPositionEl():b;a.removeClass(this.extraCls)}},afterRemove:function(a){if(a.removeRestore){a.removeMode="container";delete a.removeRestore}},onResize:function(){var c=this.container,a;if(c.collapsed){return}if(a=c.bufferResize&&c.shouldBufferLayout()){if(!this.resizeTask){this.resizeTask=new Ext.util.DelayedTask(this.runLayout,this);this.resizeBuffer=Ext.isNumber(a)?a:50}c.layoutPending=true;this.resizeTask.delay(this.resizeBuffer)}else{this.runLayout()}},runLayout:function(){var a=this.container;this.layout();a.onLayout();delete a.layoutPending},setContainer:function(b){if(this.monitorResize&&b!=this.container){var a=this.container;if(a){a.un(a.resizeEvent,this.onResize,this)}if(b){b.on(b.resizeEvent,this.onResize,this)}}this.container=b},parseMargins:function(b){if(Ext.isNumber(b)){b=b.toString()}var c=b.split(" "),a=c.length;if(a==1){c[1]=c[2]=c[3]=c[0]}else{if(a==2){c[2]=c[0];c[3]=c[1]}else{if(a==3){c[3]=c[1]}}}return{top:parseInt(c[0],10)||0,right:parseInt(c[1],10)||0,bottom:parseInt(c[2],10)||0,left:parseInt(c[3],10)||0}},fieldTpl:(function(){var a=new Ext.Template('<div class="x-form-item {itemCls}" tabIndex="-1">','<label for="{id}" style="{labelStyle}" class="x-form-item-label">{label}{labelSeparator}</label>','<div class="x-form-element" id="x-form-el-{id}" style="{elementStyle}">','</div><div class="{clearCls}"></div>',"</div>");a.disableFormats=true;return a.compile()})(),destroy:function(){if(this.resizeTask&&this.resizeTask.cancel){this.resizeTask.cancel()}if(this.container){this.container.un(this.container.resizeEvent,this.onResize,this)}if(!Ext.isEmpty(this.targetCls)){var a=this.container.getLayoutTarget();if(a){a.removeClass(this.targetCls)}}}});Ext.layout.AutoLayout=Ext.extend(Ext.layout.ContainerLayout,{type:"auto",monitorResize:true,onLayout:function(d,g){Ext.layout.AutoLayout.superclass.onLayout.call(this,d,g);var e=this.getRenderedItems(d),a=e.length,b,h;for(b=0;b<a;b++){h=e[b];if(h.doLayout){h.doLayout(true)}}}});Ext.Container.LAYOUTS.auto=Ext.layout.AutoLayout;Ext.layout.FitLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,type:"fit",getLayoutTargetSize:function(){var a=this.container.getLayoutTarget();if(!a){return{}}return a.getStyleSize()},onLayout:function(a,b){Ext.layout.FitLayout.superclass.onLayout.call(this,a,b);if(!a.collapsed){this.setItemSize(this.activeItem||a.items.itemAt(0),this.getLayoutTargetSize())}},setItemSize:function(b,a){if(b&&a.height>0){b.setSize(a)}}});Ext.Container.LAYOUTS.fit=Ext.layout.FitLayout;Ext.layout.CardLayout=Ext.extend(Ext.layout.FitLayout,{deferredRender:false,layoutOnCardChange:false,renderHidden:true,type:"card",setActiveItem:function(d){var a=this.activeItem,b=this.container;d=b.getComponent(d);if(d&&a!=d){if(a){a.hide();if(a.hidden!==true){return false}a.fireEvent("deactivate",a)}var c=d.doLayout&&(this.layoutOnCardChange||!d.rendered);this.activeItem=d;delete d.deferLayout;d.show();this.layout();if(c){d.doLayout()}d.fireEvent("activate",d)}},renderAll:function(a,b){if(this.deferredRender){this.renderItem(this.activeItem,undefined,b)}else{Ext.layout.CardLayout.superclass.renderAll.call(this,a,b)}}});Ext.Container.LAYOUTS.card=Ext.layout.CardLayout;Ext.layout.AnchorLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,type:"anchor",defaultAnchor:"100%",parseAnchorRE:/^(r|right|b|bottom)$/i,getLayoutTargetSize:function(){var b=this.container.getLayoutTarget(),a={};if(b){a=b.getViewSize();if(Ext.isIE9m&&Ext.isStrict&&a.width==0){a=b.getStyleSize()}a.width-=b.getPadding("lr");a.height-=b.getPadding("tb")}return a},onLayout:function(m,w){Ext.layout.AnchorLayout.superclass.onLayout.call(this,m,w);var p=this.getLayoutTargetSize(),k=p.width,o=p.height,q=w.getStyle("overflow"),n=this.getRenderedItems(m),t=n.length,g=[],j,a,v,l,h,c,e,d,u=0,s,b;if(k<20&&o<20){return}if(m.anchorSize){if(typeof m.anchorSize=="number"){a=m.anchorSize}else{a=m.anchorSize.width;v=m.anchorSize.height}}else{a=m.initialConfig.width;v=m.initialConfig.height}for(s=0;s<t;s++){l=n[s];b=l.getPositionEl();if(!l.anchor&&l.items&&!Ext.isNumber(l.width)&&!(Ext.isIE6&&Ext.isStrict)){l.anchor=this.defaultAnchor}if(l.anchor){h=l.anchorSpec;if(!h){d=l.anchor.split(" ");l.anchorSpec=h={right:this.parseAnchor(d[0],l.initialConfig.width,a),bottom:this.parseAnchor(d[1],l.initialConfig.height,v)}}c=h.right?this.adjustWidthAnchor(h.right(k)-b.getMargins("lr"),l):undefined;e=h.bottom?this.adjustHeightAnchor(h.bottom(o)-b.getMargins("tb"),l):undefined;if(c||e){g.push({component:l,width:c||undefined,height:e||undefined})}}}for(s=0,t=g.length;s<t;s++){j=g[s];j.component.setSize(j.width,j.height)}if(q&&q!="hidden"&&!this.adjustmentPass){var r=this.getLayoutTargetSize();if(r.width!=p.width||r.height!=p.height){this.adjustmentPass=true;this.onLayout(m,w)}}delete this.adjustmentPass},parseAnchor:function(c,h,b){if(c&&c!="none"){var e;if(this.parseAnchorRE.test(c)){var g=b-h;return function(a){if(a!==e){e=a;return a-g}}}else{if(c.indexOf("%")!=-1){var d=parseFloat(c.replace("%",""))*0.01;return function(a){if(a!==e){e=a;return Math.floor(a*d)}}}else{c=parseInt(c,10);if(!isNaN(c)){return function(a){if(a!==e){e=a;return a+c}}}}}}return false},adjustWidthAnchor:function(b,a){return b},adjustHeightAnchor:function(b,a){return b}});Ext.Container.LAYOUTS.anchor=Ext.layout.AnchorLayout;Ext.layout.ColumnLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,type:"column",extraCls:"x-column",scrollOffset:0,targetCls:"x-column-layout-ct",isValidParent:function(b,a){return this.innerCt&&b.getPositionEl().dom.parentNode==this.innerCt.dom},getLayoutTargetSize:function(){var b=this.container.getLayoutTarget(),a;if(b){a=b.getViewSize();if(Ext.isIE9m&&Ext.isStrict&&a.width==0){a=b.getStyleSize()}a.width-=b.getPadding("lr");a.height-=b.getPadding("tb")}return a},renderAll:function(a,b){if(!this.innerCt){this.innerCt=b.createChild({cls:"x-column-inner"});this.innerCt.createChild({cls:"x-clear"})}Ext.layout.ColumnLayout.superclass.renderAll.call(this,a,this.innerCt)},onLayout:function(e,k){var g=e.items.items,j=g.length,n,b,a,o=[];this.renderAll(e,k);var r=this.getLayoutTargetSize();if(Ext.isIE9m&&(r.width<1&&r.height<1)){return}var p=r.width-this.scrollOffset,d=r.height,q=p;this.innerCt.setWidth(p);for(b=0;b<j;b++){n=g[b];a=n.getPositionEl().getMargins("lr");o[b]=a;if(!n.columnWidth){q-=(n.getWidth()+a)}}q=q<0?0:q;for(b=0;b<j;b++){n=g[b];a=o[b];if(n.columnWidth){n.setSize(Math.floor(n.columnWidth*q)-a)}}if(Ext.isIE9m){if(b=k.getStyle("overflow")&&b!="hidden"&&!this.adjustmentPass){var l=this.getLayoutTargetSize();if(l.width!=r.width){this.adjustmentPass=true;this.onLayout(e,k)}}}delete this.adjustmentPass}});Ext.Container.LAYOUTS.column=Ext.layout.ColumnLayout;Ext.layout.BorderLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,rendered:false,type:"border",targetCls:"x-border-layout-ct",getLayoutTargetSize:function(){var a=this.container.getLayoutTarget();return a?a.getViewSize():{}},onLayout:function(g,I){var j,B,F,o,x=g.items.items,C=x.length;if(!this.rendered){j=[];for(B=0;B<C;B++){F=x[B];o=F.region;if(F.collapsed){j.push(F)}F.collapsed=false;if(!F.rendered){F.render(I,B);F.getPositionEl().addClass("x-border-panel")}this[o]=o!="center"&&F.split?new Ext.layout.BorderLayout.SplitRegion(this,F.initialConfig,o):new Ext.layout.BorderLayout.Region(this,F.initialConfig,o);this[o].render(I,F)}this.rendered=true}var v=this.getLayoutTargetSize();if(v.width<20||v.height<20){if(j){this.restoreCollapsed=j}return}else{if(this.restoreCollapsed){j=this.restoreCollapsed;delete this.restoreCollapsed}}var t=v.width,D=v.height,r=t,A=D,p=0,q=0,y=this.north,u=this.south,l=this.west,E=this.east,F=this.center,H,z,d,G;if(!F&&Ext.layout.BorderLayout.WARN!==false){throw"No center region defined in BorderLayout "+g.id}if(y&&y.isVisible()){H=y.getSize();z=y.getMargins();H.width=t-(z.left+z.right);H.x=z.left;H.y=z.top;p=H.height+H.y+z.bottom;A-=p;y.applyLayout(H)}if(u&&u.isVisible()){H=u.getSize();z=u.getMargins();H.width=t-(z.left+z.right);H.x=z.left;G=(H.height+z.top+z.bottom);H.y=D-G+z.top;A-=G;u.applyLayout(H)}if(l&&l.isVisible()){H=l.getSize();z=l.getMargins();H.height=A-(z.top+z.bottom);H.x=z.left;H.y=p+z.top;d=(H.width+z.left+z.right);q+=d;r-=d;l.applyLayout(H)}if(E&&E.isVisible()){H=E.getSize();z=E.getMargins();H.height=A-(z.top+z.bottom);d=(H.width+z.left+z.right);H.x=t-d+z.left;H.y=p+z.top;r-=d;E.applyLayout(H)}if(F){z=F.getMargins();var k={x:q+z.left,y:p+z.top,width:r-(z.left+z.right),height:A-(z.top+z.bottom)};F.applyLayout(k)}if(j){for(B=0,C=j.length;B<C;B++){j[B].collapse(false)}}if(Ext.isIE9m&&Ext.isStrict){I.repaint()}if(B=I.getStyle("overflow")&&B!="hidden"&&!this.adjustmentPass){var a=this.getLayoutTargetSize();if(a.width!=v.width||a.height!=v.height){this.adjustmentPass=true;this.onLayout(g,I)}}delete this.adjustmentPass},destroy:function(){var b=["north","south","east","west"],a,c;for(a=0;a<b.length;a++){c=this[b[a]];if(c){if(c.destroy){c.destroy()}else{if(c.split){c.split.destroy(true)}}}}Ext.layout.BorderLayout.superclass.destroy.call(this)}});Ext.layout.BorderLayout.Region=function(b,a,c){Ext.apply(this,a);this.layout=b;this.position=c;this.state={};if(typeof this.margins=="string"){this.margins=this.layout.parseMargins(this.margins)}this.margins=Ext.applyIf(this.margins||{},this.defaultMargins);if(this.collapsible){if(typeof this.cmargins=="string"){this.cmargins=this.layout.parseMargins(this.cmargins)}if(this.collapseMode=="mini"&&!this.cmargins){this.cmargins={left:0,top:0,right:0,bottom:0}}else{this.cmargins=Ext.applyIf(this.cmargins||{},c=="north"||c=="south"?this.defaultNSCMargins:this.defaultEWCMargins)}}};Ext.layout.BorderLayout.Region.prototype={collapsible:false,split:false,floatable:true,minWidth:50,minHeight:50,defaultMargins:{left:0,top:0,right:0,bottom:0},defaultNSCMargins:{left:5,top:5,right:5,bottom:5},defaultEWCMargins:{left:5,top:0,right:5,bottom:0},floatingZIndex:100,isCollapsed:false,render:function(b,c){this.panel=c;c.el.enableDisplayMode();this.targetEl=b;this.el=c.el;var a=c.getState,d=this.position;c.getState=function(){return Ext.apply(a.call(c)||{},this.state)}.createDelegate(this);if(d!="center"){c.allowQueuedExpand=false;c.on({beforecollapse:this.beforeCollapse,collapse:this.onCollapse,beforeexpand:this.beforeExpand,expand:this.onExpand,hide:this.onHide,show:this.onShow,scope:this});if(this.collapsible||this.floatable){c.collapseEl="el";c.slideAnchor=this.getSlideAnchor()}if(c.tools&&c.tools.toggle){c.tools.toggle.addClass("x-tool-collapse-"+d);c.tools.toggle.addClassOnOver("x-tool-collapse-"+d+"-over")}}},getCollapsedEl:function(){if(!this.collapsedEl){if(!this.toolTemplate){var b=new Ext.Template('<div class="x-tool x-tool-{id}">&#160;</div>');b.disableFormats=true;b.compile();Ext.layout.BorderLayout.Region.prototype.toolTemplate=b}this.collapsedEl=this.targetEl.createChild({cls:"x-layout-collapsed x-layout-collapsed-"+this.position,id:this.panel.id+"-xcollapsed"});this.collapsedEl.enableDisplayMode("block");if(this.collapseMode=="mini"){this.collapsedEl.addClass("x-layout-cmini-"+this.position);this.miniCollapsedEl=this.collapsedEl.createChild({cls:"x-layout-mini x-layout-mini-"+this.position,html:"&#160;"});this.miniCollapsedEl.addClassOnOver("x-layout-mini-over");this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this.onExpandClick,this,{stopEvent:true})}else{if(this.collapsible!==false&&!this.hideCollapseTool){var a=this.expandToolEl=this.toolTemplate.append(this.collapsedEl.dom,{id:"expand-"+this.position},true);a.addClassOnOver("x-tool-expand-"+this.position+"-over");a.on("click",this.onExpandClick,this,{stopEvent:true})}if(this.floatable!==false||this.titleCollapse){this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this[this.floatable?"collapseClick":"onExpandClick"],this)}}}return this.collapsedEl},onExpandClick:function(a){if(this.isSlid){this.panel.expand(false)}else{this.panel.expand()}},onCollapseClick:function(a){this.panel.collapse()},beforeCollapse:function(c,a){this.lastAnim=a;if(this.splitEl){this.splitEl.hide()}this.getCollapsedEl().show();var b=this.panel.getEl();this.originalZIndex=b.getStyle("z-index");b.setStyle("z-index",100);this.isCollapsed=true;this.layout.layout()},onCollapse:function(a){this.panel.el.setStyle("z-index",1);if(this.lastAnim===false||this.panel.animCollapse===false){this.getCollapsedEl().dom.style.visibility="visible"}else{this.getCollapsedEl().slideIn(this.panel.slideAnchor,{duration:0.2})}this.state.collapsed=true;this.panel.saveState()},beforeExpand:function(a){if(this.isSlid){this.afterSlideIn()}var b=this.getCollapsedEl();this.el.show();if(this.position=="east"||this.position=="west"){this.panel.setSize(undefined,b.getHeight())}else{this.panel.setSize(b.getWidth(),undefined)}b.hide();b.dom.style.visibility="hidden";this.panel.el.setStyle("z-index",this.floatingZIndex)},onExpand:function(){this.isCollapsed=false;if(this.splitEl){this.splitEl.show()}this.layout.layout();this.panel.el.setStyle("z-index",this.originalZIndex);this.state.collapsed=false;this.panel.saveState()},collapseClick:function(a){if(this.isSlid){a.stopPropagation();this.slideIn()}else{a.stopPropagation();this.slideOut()}},onHide:function(){if(this.isCollapsed){this.getCollapsedEl().hide()}else{if(this.splitEl){this.splitEl.hide()}}},onShow:function(){if(this.isCollapsed){this.getCollapsedEl().show()}else{if(this.splitEl){this.splitEl.show()}}},isVisible:function(){return !this.panel.hidden},getMargins:function(){return this.isCollapsed&&this.cmargins?this.cmargins:this.margins},getSize:function(){return this.isCollapsed?this.getCollapsedEl().getSize():this.panel.getSize()},setPanel:function(a){this.panel=a},getMinWidth:function(){return this.minWidth},getMinHeight:function(){return this.minHeight},applyLayoutCollapsed:function(a){var b=this.getCollapsedEl();b.setLeftTop(a.x,a.y);b.setSize(a.width,a.height)},applyLayout:function(a){if(this.isCollapsed){this.applyLayoutCollapsed(a)}else{this.panel.setPosition(a.x,a.y);this.panel.setSize(a.width,a.height)}},beforeSlide:function(){this.panel.beforeEffect()},afterSlide:function(){this.panel.afterEffect()},initAutoHide:function(){if(this.autoHide!==false){if(!this.autoHideHd){this.autoHideSlideTask=new Ext.util.DelayedTask(this.slideIn,this);this.autoHideHd={mouseout:function(a){if(!a.within(this.el,true)){this.autoHideSlideTask.delay(500)}},mouseover:function(a){this.autoHideSlideTask.cancel()},scope:this}}this.el.on(this.autoHideHd);this.collapsedEl.on(this.autoHideHd)}},clearAutoHide:function(){if(this.autoHide!==false){this.el.un("mouseout",this.autoHideHd.mouseout);this.el.un("mouseover",this.autoHideHd.mouseover);this.collapsedEl.un("mouseout",this.autoHideHd.mouseout);this.collapsedEl.un("mouseover",this.autoHideHd.mouseover)}},clearMonitor:function(){Ext.getDoc().un("click",this.slideInIf,this)},slideOut:function(){if(this.isSlid||this.el.hasActiveFx()){return}this.isSlid=true;var b=this.panel.tools,c,a;if(b&&b.toggle){b.toggle.hide()}this.el.show();a=this.panel.collapsed;this.panel.collapsed=false;if(this.position=="east"||this.position=="west"){c=this.panel.deferHeight;this.panel.deferHeight=false;this.panel.setSize(undefined,this.collapsedEl.getHeight());this.panel.deferHeight=c}else{this.panel.setSize(this.collapsedEl.getWidth(),undefined)}this.panel.collapsed=a;this.restoreLT=[this.el.dom.style.left,this.el.dom.style.top];this.el.alignTo(this.collapsedEl,this.getCollapseAnchor());this.el.setStyle("z-index",this.floatingZIndex+2);this.panel.el.replaceClass("x-panel-collapsed","x-panel-floating");if(this.animFloat!==false){this.beforeSlide();this.el.slideIn(this.getSlideAnchor(),{callback:function(){this.afterSlide();this.initAutoHide();Ext.getDoc().on("click",this.slideInIf,this)},scope:this,block:true})}else{this.initAutoHide();Ext.getDoc().on("click",this.slideInIf,this)}},afterSlideIn:function(){this.clearAutoHide();this.isSlid=false;this.clearMonitor();this.el.setStyle("z-index","");this.panel.el.replaceClass("x-panel-floating","x-panel-collapsed");this.el.dom.style.left=this.restoreLT[0];this.el.dom.style.top=this.restoreLT[1];var a=this.panel.tools;if(a&&a.toggle){a.toggle.show()}},slideIn:function(a){if(!this.isSlid||this.el.hasActiveFx()){Ext.callback(a);return}this.isSlid=false;if(this.animFloat!==false){this.beforeSlide();this.el.slideOut(this.getSlideAnchor(),{callback:function(){this.el.hide();this.afterSlide();this.afterSlideIn();Ext.callback(a)},scope:this,block:true})}else{this.el.hide();this.afterSlideIn()}},slideInIf:function(a){if(!a.within(this.el)){this.slideIn()}},anchors:{west:"left",east:"right",north:"top",south:"bottom"},sanchors:{west:"l",east:"r",north:"t",south:"b"},canchors:{west:"tl-tr",east:"tr-tl",north:"tl-bl",south:"bl-tl"},getAnchor:function(){return this.anchors[this.position]},getCollapseAnchor:function(){return this.canchors[this.position]},getSlideAnchor:function(){return this.sanchors[this.position]},getAlignAdj:function(){var a=this.cmargins;switch(this.position){case"west":return[0,0];break;case"east":return[0,0];break;case"north":return[0,0];break;case"south":return[0,0];break}},getExpandAdj:function(){var b=this.collapsedEl,a=this.cmargins;switch(this.position){case"west":return[-(a.right+b.getWidth()+a.left),0];break;case"east":return[a.right+b.getWidth()+a.left,0];break;case"north":return[0,-(a.top+a.bottom+b.getHeight())];break;case"south":return[0,a.top+a.bottom+b.getHeight()];break}},destroy:function(){if(this.autoHideSlideTask&&this.autoHideSlideTask.cancel){this.autoHideSlideTask.cancel()}Ext.destroyMembers(this,"miniCollapsedEl","collapsedEl","expandToolEl")}};Ext.layout.BorderLayout.SplitRegion=function(b,a,c){Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this,b,a,c);this.applyLayout=this.applyFns[c]};Ext.extend(Ext.layout.BorderLayout.SplitRegion,Ext.layout.BorderLayout.Region,{splitTip:"Drag to resize.",collapsibleSplitTip:"Drag to resize. Double click to hide.",useSplitTips:false,splitSettings:{north:{orientation:Ext.SplitBar.VERTICAL,placement:Ext.SplitBar.TOP,maxFn:"getVMaxSize",minProp:"minHeight",maxProp:"maxHeight"},south:{orientation:Ext.SplitBar.VERTICAL,placement:Ext.SplitBar.BOTTOM,maxFn:"getVMaxSize",minProp:"minHeight",maxProp:"maxHeight"},east:{orientation:Ext.SplitBar.HORIZONTAL,placement:Ext.SplitBar.RIGHT,maxFn:"getHMaxSize",minProp:"minWidth",maxProp:"maxWidth"},west:{orientation:Ext.SplitBar.HORIZONTAL,placement:Ext.SplitBar.LEFT,maxFn:"getHMaxSize",minProp:"minWidth",maxProp:"maxWidth"}},applyFns:{west:function(c){if(this.isCollapsed){return this.applyLayoutCollapsed(c)}var d=this.splitEl.dom,b=d.style;this.panel.setPosition(c.x,c.y);var a=d.offsetWidth;b.left=(c.x+c.width-a)+"px";b.top=(c.y)+"px";b.height=Math.max(0,c.height)+"px";this.panel.setSize(c.width-a,c.height)},east:function(c){if(this.isCollapsed){return this.applyLayoutCollapsed(c)}var d=this.splitEl.dom,b=d.style;var a=d.offsetWidth;this.panel.setPosition(c.x+a,c.y);b.left=(c.x)+"px";b.top=(c.y)+"px";b.height=Math.max(0,c.height)+"px";this.panel.setSize(c.width-a,c.height)},north:function(c){if(this.isCollapsed){return this.applyLayoutCollapsed(c)}var d=this.splitEl.dom,b=d.style;var a=d.offsetHeight;this.panel.setPosition(c.x,c.y);b.left=(c.x)+"px";b.top=(c.y+c.height-a)+"px";b.width=Math.max(0,c.width)+"px";this.panel.setSize(c.width,c.height-a)},south:function(c){if(this.isCollapsed){return this.applyLayoutCollapsed(c)}var d=this.splitEl.dom,b=d.style;var a=d.offsetHeight;this.panel.setPosition(c.x,c.y+a);b.left=(c.x)+"px";b.top=(c.y)+"px";b.width=Math.max(0,c.width)+"px";this.panel.setSize(c.width,c.height-a)}},render:function(a,c){Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this,a,c);var d=this.position;this.splitEl=a.createChild({cls:"x-layout-split x-layout-split-"+d,html:"&#160;",id:this.panel.id+"-xsplit"});if(this.collapseMode=="mini"){this.miniSplitEl=this.splitEl.createChild({cls:"x-layout-mini x-layout-mini-"+d,html:"&#160;"});this.miniSplitEl.addClassOnOver("x-layout-mini-over");this.miniSplitEl.on("click",this.onCollapseClick,this,{stopEvent:true})}var b=this.splitSettings[d];this.split=new Ext.SplitBar(this.splitEl.dom,c.el,b.orientation);this.split.tickSize=this.tickSize;this.split.placement=b.placement;this.split.getMaximumSize=this[b.maxFn].createDelegate(this);this.split.minSize=this.minSize||this[b.minProp];this.split.on("beforeapply",this.onSplitMove,this);this.split.useShim=this.useShim===true;this.maxSize=this.maxSize||this[b.maxProp];if(c.hidden){this.splitEl.hide()}if(this.useSplitTips){this.splitEl.dom.title=this.collapsible?this.collapsibleSplitTip:this.splitTip}if(this.collapsible){this.splitEl.on("dblclick",this.onCollapseClick,this)}},getSize:function(){if(this.isCollapsed){return this.collapsedEl.getSize()}var a=this.panel.getSize();if(this.position=="north"||this.position=="south"){a.height+=this.splitEl.dom.offsetHeight}else{a.width+=this.splitEl.dom.offsetWidth}return a},getHMaxSize:function(){var b=this.maxSize||10000;var a=this.layout.center;return Math.min(b,(this.el.getWidth()+a.el.getWidth())-a.getMinWidth())},getVMaxSize:function(){var b=this.maxSize||10000;var a=this.layout.center;return Math.min(b,(this.el.getHeight()+a.el.getHeight())-a.getMinHeight())},onSplitMove:function(b,a){var c=this.panel.getSize();this.lastSplitSize=a;if(this.position=="north"||this.position=="south"){this.panel.setSize(c.width,a);this.state.height=a}else{this.panel.setSize(a,c.height);this.state.width=a}this.layout.layout();this.panel.saveState();return false},getSplitBar:function(){return this.split},destroy:function(){Ext.destroy(this.miniSplitEl,this.split,this.splitEl);Ext.layout.BorderLayout.SplitRegion.superclass.destroy.call(this)}});Ext.Container.LAYOUTS.border=Ext.layout.BorderLayout;Ext.layout.FormLayout=Ext.extend(Ext.layout.AnchorLayout,{labelSeparator:":",trackLabels:true,type:"form",onRemove:function(d){Ext.layout.FormLayout.superclass.onRemove.call(this,d);if(this.trackLabels){d.un("show",this.onFieldShow,this);d.un("hide",this.onFieldHide,this)}var b=d.getPositionEl(),a=d.getItemCt&&d.getItemCt();if(d.rendered&&a){if(b&&b.dom){b.insertAfter(a)}Ext.destroy(a);Ext.destroyMembers(d,"label","itemCt");if(d.customItemCt){Ext.destroyMembers(d,"getItemCt","customItemCt")}}},setContainer:function(a){Ext.layout.FormLayout.superclass.setContainer.call(this,a);a.labelAlign=a.labelAlign||this.labelAlign;if(a.labelAlign){a.addClass("x-form-label-"+a.labelAlign)}if(a.hideLabels||this.hideLabels){Ext.apply(this,{labelStyle:"display:none",elementStyle:"padding-left:0;",labelAdjust:0})}else{this.labelSeparator=Ext.isDefined(a.labelSeparator)?a.labelSeparator:this.labelSeparator;a.labelWidth=a.labelWidth||this.labelWidth||100;if(Ext.isNumber(a.labelWidth)){var b=a.labelPad||this.labelPad;b=Ext.isNumber(b)?b:5;Ext.apply(this,{labelAdjust:a.labelWidth+b,labelStyle:"width:"+a.labelWidth+"px;",elementStyle:"padding-left:"+(a.labelWidth+b)+"px"})}if(a.labelAlign=="top"){Ext.apply(this,{labelStyle:"width:auto;",labelAdjust:0,elementStyle:"padding-left:0;"})}}},isHide:function(a){return a.hideLabel||this.container.hideLabels},onFieldShow:function(a){a.getItemCt().removeClass("x-hide-"+a.hideMode);if(a.isComposite){a.doLayout()}},onFieldHide:function(a){a.getItemCt().addClass("x-hide-"+a.hideMode)},getLabelStyle:function(e){var b="",c=[this.labelStyle,e];for(var d=0,a=c.length;d<a;++d){if(c[d]){b+=c[d];if(b.substr(-1,1)!=";"){b+=";"}}}return b},renderItem:function(e,a,d){if(e&&(e.isFormField||e.fieldLabel)&&e.inputType!="hidden"){var b=this.getTemplateArgs(e);if(Ext.isNumber(a)){a=d.dom.childNodes[a]||null}if(a){e.itemCt=this.fieldTpl.insertBefore(a,b,true)}else{e.itemCt=this.fieldTpl.append(d,b,true)}if(!e.getItemCt){Ext.apply(e,{getItemCt:function(){return e.itemCt},customItemCt:true})}e.label=e.getItemCt().child("label.x-form-item-label");if(!e.rendered){e.render("x-form-el-"+e.id)}else{if(!this.isValidParent(e,d)){Ext.fly("x-form-el-"+e.id).appendChild(e.getPositionEl())}}if(this.trackLabels){if(e.hidden){this.onFieldHide(e)}e.on({scope:this,show:this.onFieldShow,hide:this.onFieldHide})}this.configureItem(e)}else{Ext.layout.FormLayout.superclass.renderItem.apply(this,arguments)}},getTemplateArgs:function(c){var a=!c.fieldLabel||c.hideLabel,b=(c.itemCls||this.container.itemCls||"")+(c.hideLabel?" x-hide-label":"");if(Ext.isIE9&&Ext.isIEQuirks&&c instanceof Ext.form.TextField){b+=" x-input-wrapper"}return{id:c.id,label:c.fieldLabel,itemCls:b,clearCls:c.clearCls||"x-form-clear-left",labelStyle:this.getLabelStyle(c.labelStyle),elementStyle:this.elementStyle||"",labelSeparator:a?"":(Ext.isDefined(c.labelSeparator)?c.labelSeparator:this.labelSeparator)}},adjustWidthAnchor:function(a,d){if(d.label&&!this.isHide(d)&&(this.container.labelAlign!="top")){var b=Ext.isIE6||Ext.isIEQuirks;return a-this.labelAdjust+(b?-3:0)}return a},adjustHeightAnchor:function(a,b){if(b.label&&!this.isHide(b)&&(this.container.labelAlign=="top")){return a-b.label.getHeight()}return a},isValidParent:function(b,a){return a&&this.container.getEl().contains(b.getPositionEl())}});Ext.Container.LAYOUTS.form=Ext.layout.FormLayout;Ext.layout.AccordionLayout=Ext.extend(Ext.layout.FitLayout,{fill:true,autoWidth:true,titleCollapse:true,hideCollapseTool:false,collapseFirst:false,animate:false,sequence:false,activeOnTop:false,type:"accordion",renderItem:function(a){if(this.animate===false){a.animCollapse=false}a.collapsible=true;if(this.autoWidth){a.autoWidth=true}if(this.titleCollapse){a.titleCollapse=true}if(this.hideCollapseTool){a.hideCollapseTool=true}if(this.collapseFirst!==undefined){a.collapseFirst=this.collapseFirst}if(!this.activeItem&&!a.collapsed){this.setActiveItem(a,true)}else{if(this.activeItem&&this.activeItem!=a){a.collapsed=true}}Ext.layout.AccordionLayout.superclass.renderItem.apply(this,arguments);a.header.addClass("x-accordion-hd");a.on("beforeexpand",this.beforeExpand,this)},onRemove:function(a){Ext.layout.AccordionLayout.superclass.onRemove.call(this,a);if(a.rendered){a.header.removeClass("x-accordion-hd")}a.un("beforeexpand",this.beforeExpand,this)},beforeExpand:function(c,b){var a=this.activeItem;if(a){if(this.sequence){delete this.activeItem;if(!a.collapsed){a.collapse({callback:function(){c.expand(b||true)},scope:this});return false}}else{a.collapse(this.animate)}}this.setActive(c);if(this.activeOnTop){c.el.dom.parentNode.insertBefore(c.el.dom,c.el.dom.parentNode.firstChild)}this.layout()},setItemSize:function(g,e){if(this.fill&&g){var d=0,c,b=this.getRenderedItems(this.container),a=b.length,h;for(c=0;c<a;c++){if((h=b[c])!=g&&!h.hidden){d+=h.header.getHeight()}}e.height-=d;g.setSize(e)}},setActiveItem:function(a){this.setActive(a,true)},setActive:function(c,b){var a=this.activeItem;c=this.container.getComponent(c);if(a!=c){if(c.rendered&&c.collapsed&&b){c.expand()}else{if(a){a.fireEvent("deactivate",a)}this.activeItem=c;c.fireEvent("activate",c)}}}});Ext.Container.LAYOUTS.accordion=Ext.layout.AccordionLayout;Ext.layout.Accordion=Ext.layout.AccordionLayout;Ext.layout.TableLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:false,type:"table",targetCls:"x-table-layout-ct",tableAttrs:null,setContainer:function(a){Ext.layout.TableLayout.superclass.setContainer.call(this,a);this.currentRow=0;this.currentColumn=0;this.cells=[]},onLayout:function(d,g){var e=d.items.items,a=e.length,h,b;if(!this.table){g.addClass("x-table-layout-ct");this.table=g.createChild(Ext.apply({tag:"table",cls:"x-table-layout",cellspacing:0,cn:{tag:"tbody"}},this.tableAttrs),null,true)}this.renderAll(d,g)},getRow:function(a){var b=this.table.tBodies[0].childNodes[a];if(!b){b=document.createElement("tr");this.table.tBodies[0].appendChild(b)}return b},getNextCell:function(j){var a=this.getNextNonSpan(this.currentColumn,this.currentRow);var g=this.currentColumn=a[0],e=this.currentRow=a[1];for(var i=e;i<e+(j.rowspan||1);i++){if(!this.cells[i]){this.cells[i]=[]}for(var d=g;d<g+(j.colspan||1);d++){this.cells[i][d]=true}}var h=document.createElement("td");if(j.cellId){h.id=j.cellId}var b="x-table-layout-cell";if(j.cellCls){b+=" "+j.cellCls}h.className=b;if(j.colspan){h.colSpan=j.colspan}if(j.rowspan){h.rowSpan=j.rowspan}this.getRow(e).appendChild(h);return h},getNextNonSpan:function(a,c){var b=this.columns;while((b&&a>=b)||(this.cells[c]&&this.cells[c][a])){if(b&&a>=b){c++;a=0}else{a++}}return[a,c]},renderItem:function(e,a,d){if(!this.table){this.table=d.createChild(Ext.apply({tag:"table",cls:"x-table-layout",cellspacing:0,cn:{tag:"tbody"}},this.tableAttrs),null,true)}if(e&&!e.rendered){e.render(this.getNextCell(e));this.configureItem(e)}else{if(e&&!this.isValidParent(e,d)){var b=this.getNextCell(e);b.insertBefore(e.getPositionEl().dom,null);e.container=Ext.get(b);this.configureItem(e)}}},isValidParent:function(b,a){return b.getPositionEl().up("table",5).dom.parentNode===(a.dom||a)},destroy:function(){delete this.table;Ext.layout.TableLayout.superclass.destroy.call(this)}});Ext.Container.LAYOUTS.table=Ext.layout.TableLayout;Ext.layout.AbsoluteLayout=Ext.extend(Ext.layout.AnchorLayout,{extraCls:"x-abs-layout-item",type:"absolute",onLayout:function(a,b){b.position();this.paddingLeft=b.getPadding("l");this.paddingTop=b.getPadding("t");Ext.layout.AbsoluteLayout.superclass.onLayout.call(this,a,b)},adjustWidthAnchor:function(b,a){return b?b-a.getPosition(true)[0]+this.paddingLeft:b},adjustHeightAnchor:function(b,a){return b?b-a.getPosition(true)[1]+this.paddingTop:b}});Ext.Container.LAYOUTS.absolute=Ext.layout.AbsoluteLayout;Ext.layout.BoxLayout=Ext.extend(Ext.layout.ContainerLayout,{defaultMargins:{left:0,top:0,right:0,bottom:0},padding:"0",pack:"start",monitorResize:true,type:"box",scrollOffset:0,extraCls:"x-box-item",targetCls:"x-box-layout-ct",innerCls:"x-box-inner",constructor:function(a){Ext.layout.BoxLayout.superclass.constructor.call(this,a);if(Ext.isString(this.defaultMargins)){this.defaultMargins=this.parseMargins(this.defaultMargins)}var d=this.overflowHandler;if(typeof d=="string"){d={type:d}}var c="none";if(d&&d.type!=undefined){c=d.type}var b=Ext.layout.boxOverflow[c];if(b[this.type]){b=b[this.type]}this.overflowHandler=new b(this,d)},onLayout:function(b,h){Ext.layout.BoxLayout.superclass.onLayout.call(this,b,h);var d=this.getLayoutTargetSize(),i=this.getVisibleItems(b),c=this.calculateChildBoxes(i,d),g=c.boxes,j=c.meta;if(d.width>0){var k=this.overflowHandler,a=j.tooNarrow?"handleOverflow":"clearOverflow";var e=k[a](c,d);if(e){if(e.targetSize){d=e.targetSize}if(e.recalculate){i=this.getVisibleItems(b);c=this.calculateChildBoxes(i,d);g=c.boxes}}}this.layoutTargetLastSize=d;this.childBoxCache=c;this.updateInnerCtSize(d,c);this.updateChildBoxes(g);this.handleTargetOverflow(d,b,h)},updateChildBoxes:function(c){for(var b=0,e=c.length;b<e;b++){var d=c[b],a=d.component;if(d.dirtySize){a.setSize(d.width,d.height)}if(isNaN(d.left)||isNaN(d.top)){continue}a.setPosition(d.left,d.top)}},updateInnerCtSize:function(c,h){var i=this.align,g=this.padding,e=c.width,a=c.height;if(this.type=="hbox"){var b=e,d=h.meta.maxHeight+g.top+g.bottom;if(i=="stretch"){d=a}else{if(i=="middle"){d=Math.max(a,d)}}}else{var d=a,b=h.meta.maxWidth+g.left+g.right;if(i=="stretch"){b=e}else{if(i=="center"){b=Math.max(e,b)}}}this.innerCt.setSize(b||undefined,d||undefined)},handleTargetOverflow:function(d,a,c){var e=c.getStyle("overflow");if(e&&e!="hidden"&&!this.adjustmentPass){var b=this.getLayoutTargetSize();if(b.width!=d.width||b.height!=d.height){this.adjustmentPass=true;this.onLayout(a,c)}}delete this.adjustmentPass},isValidParent:function(b,a){return this.innerCt&&b.getPositionEl().dom.parentNode==this.innerCt.dom},getVisibleItems:function(g){var g=g||this.container,e=g.getLayoutTarget(),h=g.items.items,a=h.length,d,j,b=[];for(d=0;d<a;d++){if((j=h[d]).rendered&&this.isValidParent(j,e)&&j.hidden!==true&&j.collapsed!==true&&j.shouldLayout!==false){b.push(j)}}return b},renderAll:function(a,b){if(!this.innerCt){this.innerCt=b.createChild({cls:this.innerCls});this.padding=this.parseMargins(this.padding)}Ext.layout.BoxLayout.superclass.renderAll.call(this,a,this.innerCt)},getLayoutTargetSize:function(){var b=this.container.getLayoutTarget(),a;if(b){a=b.getViewSize();if(Ext.isIE9m&&Ext.isStrict&&a.width==0){a=b.getStyleSize()}a.width-=b.getPadding("lr");a.height-=b.getPadding("tb")}return a},renderItem:function(a){if(Ext.isString(a.margins)){a.margins=this.parseMargins(a.margins)}else{if(!a.margins){a.margins=this.defaultMargins}}Ext.layout.BoxLayout.superclass.renderItem.apply(this,arguments)},destroy:function(){Ext.destroy(this.overflowHandler);Ext.layout.BoxLayout.superclass.destroy.apply(this,arguments)}});Ext.layout.boxOverflow.None=Ext.extend(Object,{constructor:function(b,a){this.layout=b;Ext.apply(this,a||{})},handleOverflow:Ext.emptyFn,clearOverflow:Ext.emptyFn});Ext.layout.boxOverflow.none=Ext.layout.boxOverflow.None;Ext.layout.boxOverflow.Menu=Ext.extend(Ext.layout.boxOverflow.None,{afterCls:"x-strip-right",noItemsMenuText:'<div class="x-toolbar-no-items">(None)</div>',constructor:function(a){Ext.layout.boxOverflow.Menu.superclass.constructor.apply(this,arguments);this.menuItems=[]},createInnerElements:function(){if(!this.afterCt){this.afterCt=this.layout.innerCt.insertSibling({cls:this.afterCls},"before")}},clearOverflow:function(a,g){var e=g.width+(this.afterCt?this.afterCt.getWidth():0),b=this.menuItems;this.hideTrigger();for(var c=0,d=b.length;c<d;c++){b.pop().component.show()}return{targetSize:{height:g.height,width:e}}},showTrigger:function(){this.createMenu();this.menuTrigger.show()},hideTrigger:function(){if(this.menuTrigger!=undefined){this.menuTrigger.hide()}},beforeMenuShow:function(h){var b=this.menuItems,a=b.length,g,e;var c=function(j,i){return j.isXType("buttongroup")&&!(i instanceof Ext.Toolbar.Separator)};this.clearMenu();h.removeAll();for(var d=0;d<a;d++){g=b[d].component;if(e&&(c(g,e)||c(e,g))){h.add("-")}this.addComponentToMenu(h,g);e=g}if(h.items.length<1){h.add(this.noItemsMenuText)}},createMenuConfig:function(c,a){var b=Ext.apply({},c.initialConfig),d=c.toggleGroup;Ext.copyTo(b,c,["iconCls","icon","itemId","disabled","handler","scope","menu"]);Ext.apply(b,{text:c.overflowText||c.text,hideOnClick:a});if(d||c.enableToggle){Ext.apply(b,{group:d,checked:c.pressed,listeners:{checkchange:function(g,e){c.toggle(e)}}})}delete b.ownerCt;delete b.xtype;delete b.id;return b},addComponentToMenu:function(b,a){if(a instanceof Ext.Toolbar.Separator){b.add("-")}else{if(Ext.isFunction(a.isXType)){if(a.isXType("splitbutton")){b.add(this.createMenuConfig(a,true))}else{if(a.isXType("button")){b.add(this.createMenuConfig(a,!a.menu))}else{if(a.isXType("buttongroup")){a.items.each(function(c){this.addComponentToMenu(b,c)},this)}}}}}},clearMenu:function(){var a=this.moreMenu;if(a&&a.items){a.items.each(function(b){delete b.menu})}},createMenu:function(){if(!this.menuTrigger){this.createInnerElements();this.menu=new Ext.menu.Menu({ownerCt:this.layout.container,listeners:{scope:this,beforeshow:this.beforeMenuShow}});this.menuTrigger=new Ext.Button({iconCls:"x-toolbar-more-icon",cls:"x-toolbar-more",menu:this.menu,renderTo:this.afterCt})}},destroy:function(){Ext.destroy(this.menu,this.menuTrigger)}});Ext.layout.boxOverflow.menu=Ext.layout.boxOverflow.Menu;Ext.layout.boxOverflow.HorizontalMenu=Ext.extend(Ext.layout.boxOverflow.Menu,{constructor:function(){Ext.layout.boxOverflow.HorizontalMenu.superclass.constructor.apply(this,arguments);var c=this,b=c.layout,a=b.calculateChildBoxes;b.calculateChildBoxes=function(d,i){var l=a.apply(b,arguments),k=l.meta,e=c.menuItems;var j=0;for(var g=0,h=e.length;g<h;g++){j+=e[g].width}k.minimumWidth+=j;k.tooNarrow=k.minimumWidth>i.width;return l}},handleOverflow:function(d,h){this.showTrigger();var k=h.width-this.afterCt.getWidth(),l=d.boxes,e=0,r=false;for(var o=0,c=l.length;o<c;o++){e+=l[o].width}var a=k-e,g=0;for(var o=0,c=this.menuItems.length;o<c;o++){var n=this.menuItems[o],m=n.component,b=n.width;if(b<a){m.show();a-=b;g++;r=true}else{break}}if(r){this.menuItems=this.menuItems.slice(g)}else{for(var j=l.length-1;j>=0;j--){var q=l[j].component,p=l[j].left+l[j].width;if(p>=k){this.menuItems.unshift({component:q,width:l[j].width});q.hide()}else{break}}}if(this.menuItems.length==0){this.hideTrigger()}return{targetSize:{height:h.height,width:k},recalculate:r}}});Ext.layout.boxOverflow.menu.hbox=Ext.layout.boxOverflow.HorizontalMenu;Ext.layout.boxOverflow.Scroller=Ext.extend(Ext.layout.boxOverflow.None,{animateScroll:true,scrollIncrement:100,wheelIncrement:3,scrollRepeatInterval:400,scrollDuration:0.4,beforeCls:"x-strip-left",afterCls:"x-strip-right",scrollerCls:"x-strip-scroller",beforeScrollerCls:"x-strip-scroller-left",afterScrollerCls:"x-strip-scroller-right",createWheelListener:function(){this.layout.innerCt.on({scope:this,mousewheel:function(a){a.stopEvent();this.scrollBy(a.getWheelDelta()*this.wheelIncrement*-1,false)}})},handleOverflow:function(a,b){this.createInnerElements();this.showScrollers()},clearOverflow:function(){this.hideScrollers()},showScrollers:function(){this.createScrollers();this.beforeScroller.show();this.afterScroller.show();this.updateScrollButtons()},hideScrollers:function(){if(this.beforeScroller!=undefined){this.beforeScroller.hide();this.afterScroller.hide()}},createScrollers:function(){if(!this.beforeScroller&&!this.afterScroller){var a=this.beforeCt.createChild({cls:String.format("{0} {1} ",this.scrollerCls,this.beforeScrollerCls)});var b=this.afterCt.createChild({cls:String.format("{0} {1}",this.scrollerCls,this.afterScrollerCls)});a.addClassOnOver(this.beforeScrollerCls+"-hover");b.addClassOnOver(this.afterScrollerCls+"-hover");a.setVisibilityMode(Ext.Element.DISPLAY);b.setVisibilityMode(Ext.Element.DISPLAY);this.beforeRepeater=new Ext.util.ClickRepeater(a,{interval:this.scrollRepeatInterval,handler:this.scrollLeft,scope:this});this.afterRepeater=new Ext.util.ClickRepeater(b,{interval:this.scrollRepeatInterval,handler:this.scrollRight,scope:this});this.beforeScroller=a;this.afterScroller=b}},destroy:function(){Ext.destroy(this.beforeScroller,this.afterScroller,this.beforeRepeater,this.afterRepeater,this.beforeCt,this.afterCt)},scrollBy:function(b,a){this.scrollTo(this.getScrollPosition()+b,a)},getItem:function(a){if(Ext.isString(a)){a=Ext.getCmp(a)}else{if(Ext.isNumber(a)){a=this.items[a]}}return a},getScrollAnim:function(){return{duration:this.scrollDuration,callback:this.updateScrollButtons,scope:this}},updateScrollButtons:function(){if(this.beforeScroller==undefined||this.afterScroller==undefined){return}var d=this.atExtremeBefore()?"addClass":"removeClass",c=this.atExtremeAfter()?"addClass":"removeClass",a=this.beforeScrollerCls+"-disabled",b=this.afterScrollerCls+"-disabled";this.beforeScroller[d](a);this.afterScroller[c](b);this.scrolling=false},atExtremeBefore:function(){return this.getScrollPosition()===0},scrollLeft:function(a){this.scrollBy(-this.scrollIncrement,a)},scrollRight:function(a){this.scrollBy(this.scrollIncrement,a)},scrollToItem:function(d,b){d=this.getItem(d);if(d!=undefined){var a=this.getItemVisibility(d);if(!a.fullyVisible){var c=d.getBox(true,true),e=c.x;if(a.hiddenRight){e-=(this.layout.innerCt.getWidth()-c.width)}this.scrollTo(e,b)}}},getItemVisibility:function(e){var d=this.getItem(e).getBox(true,true),a=d.x,c=d.x+d.width,g=this.getScrollPosition(),b=this.layout.innerCt.getWidth()+g;return{hiddenLeft:a<g,hiddenRight:c>b,fullyVisible:a>g&&c<b}}});Ext.layout.boxOverflow.scroller=Ext.layout.boxOverflow.Scroller;Ext.layout.boxOverflow.VerticalScroller=Ext.extend(Ext.layout.boxOverflow.Scroller,{scrollIncrement:75,wheelIncrement:2,handleOverflow:function(a,b){Ext.layout.boxOverflow.VerticalScroller.superclass.handleOverflow.apply(this,arguments);return{targetSize:{height:b.height-(this.beforeCt.getHeight()+this.afterCt.getHeight()),width:b.width}}},createInnerElements:function(){var a=this.layout.innerCt;if(!this.beforeCt){this.beforeCt=a.insertSibling({cls:this.beforeCls},"before");this.afterCt=a.insertSibling({cls:this.afterCls},"after");this.createWheelListener()}},scrollTo:function(a,b){var d=this.getScrollPosition(),c=a.constrain(0,this.getMaxScrollBottom());if(c!=d&&!this.scrolling){if(b==undefined){b=this.animateScroll}this.layout.innerCt.scrollTo("top",c,b?this.getScrollAnim():false);if(b){this.scrolling=true}else{this.scrolling=false;this.updateScrollButtons()}}},getScrollPosition:function(){return parseInt(this.layout.innerCt.dom.scrollTop,10)||0},getMaxScrollBottom:function(){return this.layout.innerCt.dom.scrollHeight-this.layout.innerCt.getHeight()},atExtremeAfter:function(){return this.getScrollPosition()>=this.getMaxScrollBottom()}});Ext.layout.boxOverflow.scroller.vbox=Ext.layout.boxOverflow.VerticalScroller;Ext.layout.boxOverflow.HorizontalScroller=Ext.extend(Ext.layout.boxOverflow.Scroller,{handleOverflow:function(a,b){Ext.layout.boxOverflow.HorizontalScroller.superclass.handleOverflow.apply(this,arguments);return{targetSize:{height:b.height,width:b.width-(this.beforeCt.getWidth()+this.afterCt.getWidth())}}},createInnerElements:function(){var a=this.layout.innerCt;if(!this.beforeCt){this.afterCt=a.insertSibling({cls:this.afterCls},"before");this.beforeCt=a.insertSibling({cls:this.beforeCls},"before");this.createWheelListener()}},scrollTo:function(a,b){var d=this.getScrollPosition(),c=a.constrain(0,this.getMaxScrollRight());if(c!=d&&!this.scrolling){if(b==undefined){b=this.animateScroll}this.layout.innerCt.scrollTo("left",c,b?this.getScrollAnim():false);if(b){this.scrolling=true}else{this.scrolling=false;this.updateScrollButtons()}}},getScrollPosition:function(){return parseInt(this.layout.innerCt.dom.scrollLeft,10)||0},getMaxScrollRight:function(){return this.layout.innerCt.dom.scrollWidth-this.layout.innerCt.getWidth()},atExtremeAfter:function(){return this.getScrollPosition()>=this.getMaxScrollRight()}});Ext.layout.boxOverflow.scroller.hbox=Ext.layout.boxOverflow.HorizontalScroller;Ext.layout.HBoxLayout=Ext.extend(Ext.layout.BoxLayout,{align:"top",type:"hbox",calculateChildBoxes:function(r,b){var F=r.length,R=this.padding,D=R.top,U=R.left,y=D+R.bottom,O=U+R.right,a=b.width-this.scrollOffset,e=b.height,o=Math.max(0,e-y),P=this.pack=="start",W=this.pack=="center",A=this.pack=="end",L=0,Q=0,T=0,l=0,X=0,H=[],k,J,M,V,w,j,S,I,c,x,q,N;for(S=0;S<F;S++){k=r[S];M=k.height;J=k.width;j=!k.hasLayout&&typeof k.doLayout=="function";if(typeof J!="number"){if(k.flex&&!J){T+=k.flex}else{if(!J&&j){k.doLayout()}V=k.getSize();J=V.width;M=V.height}}w=k.margins;x=w.left+w.right;L+=x+(J||0);l+=x+(k.flex?k.minWidth||0:J);X+=x+(k.minWidth||J||0);if(typeof M!="number"){if(j){k.doLayout()}M=k.getHeight()}Q=Math.max(Q,M+w.top+w.bottom);H.push({component:k,height:M||undefined,width:J||undefined})}var K=l-a,p=X>a;var n=Math.max(0,a-L-O);if(p){for(S=0;S<F;S++){H[S].width=r[S].minWidth||r[S].width||H[S].width}}else{if(K>0){var C=[];for(var E=0,v=F;E<v;E++){var B=r[E],t=B.minWidth||0;if(B.flex){H[E].width=t}else{C.push({minWidth:t,available:H[E].width-t,index:E})}}C.sort(function(Y,i){return Y.available>i.available?1:-1});for(var S=0,v=C.length;S<v;S++){var G=C[S].index;if(G==undefined){continue}var B=r[G],m=H[G],u=m.width,t=B.minWidth,d=Math.max(t,u-Math.ceil(K/(v-S))),g=u-d;H[G].width=d;K-=g}}else{var h=n,s=T;for(S=0;S<F;S++){k=r[S];I=H[S];w=k.margins;q=w.top+w.bottom;if(P&&k.flex&&!k.width){c=Math.ceil((k.flex/s)*h);h-=c;s-=k.flex;I.width=c;I.dirtySize=true}}}}if(W){U+=n/2}else{if(A){U+=n}}for(S=0;S<F;S++){k=r[S];I=H[S];w=k.margins;U+=w.left;q=w.top+w.bottom;I.left=U;I.top=D+w.top;switch(this.align){case"stretch":N=o-q;I.height=N.constrain(k.minHeight||0,k.maxHeight||1000000);I.dirtySize=true;break;case"stretchmax":N=Q-q;I.height=N.constrain(k.minHeight||0,k.maxHeight||1000000);I.dirtySize=true;break;case"middle":var z=o-I.height-q;if(z>0){I.top=D+q+(z/2)}}U+=I.width+w.right}return{boxes:H,meta:{maxHeight:Q,nonFlexWidth:L,desiredWidth:l,minimumWidth:X,shortfall:l-a,tooNarrow:p}}}});Ext.Container.LAYOUTS.hbox=Ext.layout.HBoxLayout;Ext.layout.VBoxLayout=Ext.extend(Ext.layout.BoxLayout,{align:"left",type:"vbox",calculateChildBoxes:function(o,b){var E=o.length,R=this.padding,C=R.top,V=R.left,x=C+R.bottom,O=V+R.right,a=b.width-this.scrollOffset,c=b.height,K=Math.max(0,a-O),P=this.pack=="start",X=this.pack=="center",z=this.pack=="end",k=0,u=0,U=0,L=0,m=0,G=[],h,I,N,W,t,g,T,H,S,w,n,d,r;for(T=0;T<E;T++){h=o[T];N=h.height;I=h.width;g=!h.hasLayout&&typeof h.doLayout=="function";if(typeof N!="number"){if(h.flex&&!N){U+=h.flex}else{if(!N&&g){h.doLayout()}W=h.getSize();I=W.width;N=W.height}}t=h.margins;n=t.top+t.bottom;k+=n+(N||0);L+=n+(h.flex?h.minHeight||0:N);m+=n+(h.minHeight||N||0);if(typeof I!="number"){if(g){h.doLayout()}I=h.getWidth()}u=Math.max(u,I+t.left+t.right);G.push({component:h,height:N||undefined,width:I||undefined})}var M=L-c,l=m>c;var q=Math.max(0,(c-k-x));if(l){for(T=0,r=E;T<r;T++){G[T].height=o[T].minHeight||o[T].height||G[T].height}}else{if(M>0){var J=[];for(var D=0,r=E;D<r;D++){var A=o[D],s=A.minHeight||0;if(A.flex){G[D].height=s}else{J.push({minHeight:s,available:G[D].height-s,index:D})}}J.sort(function(Y,i){return Y.available>i.available?1:-1});for(var T=0,r=J.length;T<r;T++){var F=J[T].index;if(F==undefined){continue}var A=o[F],j=G[F],v=j.height,s=A.minHeight,B=Math.max(s,v-Math.ceil(M/(r-T))),e=v-B;G[F].height=B;M-=e}}else{var Q=q,p=U;for(T=0;T<E;T++){h=o[T];H=G[T];t=h.margins;w=t.left+t.right;if(P&&h.flex&&!h.height){S=Math.ceil((h.flex/p)*Q);Q-=S;p-=h.flex;H.height=S;H.dirtySize=true}}}}if(X){C+=q/2}else{if(z){C+=q}}for(T=0;T<E;T++){h=o[T];H=G[T];t=h.margins;C+=t.top;w=t.left+t.right;H.left=V+t.left;H.top=C;switch(this.align){case"stretch":d=K-w;H.width=d.constrain(h.minWidth||0,h.maxWidth||1000000);H.dirtySize=true;break;case"stretchmax":d=u-w;H.width=d.constrain(h.minWidth||0,h.maxWidth||1000000);H.dirtySize=true;break;case"center":var y=K-H.width-w;if(y>0){H.left=V+w+(y/2)}}C+=H.height+t.bottom}return{boxes:G,meta:{maxWidth:u,nonFlexHeight:k,desiredHeight:L,minimumHeight:m,shortfall:L-c,tooNarrow:l}}}});Ext.Container.LAYOUTS.vbox=Ext.layout.VBoxLayout;Ext.layout.ToolbarLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,type:"toolbar",triggerWidth:18,noItemsMenuText:'<div class="x-toolbar-no-items">(None)</div>',lastOverflow:false,tableHTML:['<table cellspacing="0" class="x-toolbar-ct">',"<tbody>","<tr>",'<td class="x-toolbar-left" align="{0}">','<table cellspacing="0">',"<tbody>",'<tr class="x-toolbar-left-row"></tr>',"</tbody>","</table>","</td>",'<td class="x-toolbar-right" align="right">','<table cellspacing="0" class="x-toolbar-right-ct">',"<tbody>","<tr>","<td>",'<table cellspacing="0">',"<tbody>",'<tr class="x-toolbar-right-row"></tr>',"</tbody>","</table>","</td>","<td>",'<table cellspacing="0">',"<tbody>",'<tr class="x-toolbar-extras-row"></tr>',"</tbody>","</table>","</td>","</tr>","</tbody>","</table>","</td>","</tr>","</tbody>","</table>"].join(""),onLayout:function(e,j){if(!this.leftTr){var h=e.buttonAlign=="center"?"center":"left";j.addClass("x-toolbar-layout-ct");j.insertHtml("beforeEnd",String.format(this.tableHTML,h));this.leftTr=j.child("tr.x-toolbar-left-row",true);this.rightTr=j.child("tr.x-toolbar-right-row",true);this.extrasTr=j.child("tr.x-toolbar-extras-row",true);if(this.hiddenItem==undefined){this.hiddenItems=[]}}var k=e.buttonAlign=="right"?this.rightTr:this.leftTr,l=e.items.items,d=0;for(var b=0,g=l.length,m;b<g;b++,d++){m=l[b];if(m.isFill){k=this.rightTr;d=-1}else{if(!m.rendered){m.render(this.insertCell(m,k,d));this.configureItem(m)}else{if(!m.xtbHidden&&!this.isValidParent(m,k.childNodes[d])){var a=this.insertCell(m,k,d);a.appendChild(m.getPositionEl().dom);m.container=Ext.get(a)}}}}this.cleanup(this.leftTr);this.cleanup(this.rightTr);this.cleanup(this.extrasTr);this.fitToSize(j)},cleanup:function(b){var e=b.childNodes,a,d;for(a=e.length-1;a>=0&&(d=e[a]);a--){if(!d.firstChild){b.removeChild(d)}}},insertCell:function(e,b,a){var d=document.createElement("td");d.className="x-toolbar-cell";b.insertBefore(d,b.childNodes[a]||null);return d},hideItem:function(a){this.hiddenItems.push(a);a.xtbHidden=true;a.xtbWidth=a.getPositionEl().dom.parentNode.offsetWidth;a.hide()},unhideItem:function(a){a.show();a.xtbHidden=false;this.hiddenItems.remove(a)},getItemWidth:function(a){return a.hidden?(a.xtbWidth||0):a.getPositionEl().dom.parentNode.offsetWidth},fitToSize:function(k){if(this.container.enableOverflow===false){return}var b=k.dom.clientWidth,j=k.dom.firstChild.offsetWidth,m=b-this.triggerWidth,a=this.lastWidth||0,c=this.hiddenItems,e=c.length!=0,n=b>=a;this.lastWidth=b;if(j>b||(e&&n)){var l=this.container.items.items,h=l.length,d=0,o;for(var g=0;g<h;g++){o=l[g];if(!o.isFill){d+=this.getItemWidth(o);if(d>m){if(!(o.hidden||o.xtbHidden)){this.hideItem(o)}}else{if(o.xtbHidden){this.unhideItem(o)}}}}}e=c.length!=0;if(e){this.initMore();if(!this.lastOverflow){this.container.fireEvent("overflowchange",this.container,true);this.lastOverflow=true}}else{if(this.more){this.clearMenu();this.more.destroy();delete this.more;if(this.lastOverflow){this.container.fireEvent("overflowchange",this.container,false);this.lastOverflow=false}}}},createMenuConfig:function(c,a){var b=Ext.apply({},c.initialConfig),d=c.toggleGroup;Ext.copyTo(b,c,["iconCls","icon","itemId","disabled","handler","scope","menu"]);Ext.apply(b,{text:c.overflowText||c.text,hideOnClick:a});if(d||c.enableToggle){Ext.apply(b,{group:d,checked:c.pressed,listeners:{checkchange:function(g,e){c.toggle(e)}}})}delete b.ownerCt;delete b.xtype;delete b.id;return b},addComponentToMenu:function(b,a){if(a instanceof Ext.Toolbar.Separator){b.add("-")}else{if(Ext.isFunction(a.isXType)){if(a.isXType("splitbutton")){b.add(this.createMenuConfig(a,true))}else{if(a.isXType("button")){b.add(this.createMenuConfig(a,!a.menu))}else{if(a.isXType("buttongroup")){a.items.each(function(c){this.addComponentToMenu(b,c)},this)}}}}}},clearMenu:function(){var a=this.moreMenu;if(a&&a.items){a.items.each(function(b){delete b.menu})}},beforeMoreShow:function(h){var b=this.container.items.items,a=b.length,g,e;var c=function(j,i){return j.isXType("buttongroup")&&!(i instanceof Ext.Toolbar.Separator)};this.clearMenu();h.removeAll();for(var d=0;d<a;d++){g=b[d];if(g.xtbHidden){if(e&&(c(g,e)||c(e,g))){h.add("-")}this.addComponentToMenu(h,g);e=g}}if(h.items.length<1){h.add(this.noItemsMenuText)}},initMore:function(){if(!this.more){this.moreMenu=new Ext.menu.Menu({ownerCt:this.container,listeners:{beforeshow:this.beforeMoreShow,scope:this}});this.more=new Ext.Button({iconCls:"x-toolbar-more-icon",cls:"x-toolbar-more",menu:this.moreMenu,ownerCt:this.container});var a=this.insertCell(this.more,this.extrasTr,100);this.more.render(a)}},destroy:function(){Ext.destroy(this.more,this.moreMenu);delete this.leftTr;delete this.rightTr;delete this.extrasTr;Ext.layout.ToolbarLayout.superclass.destroy.call(this)}});Ext.Container.LAYOUTS.toolbar=Ext.layout.ToolbarLayout;Ext.layout.MenuLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,type:"menu",setContainer:function(a){this.monitorResize=!a.floating;a.on("autosize",this.doAutoSize,this);Ext.layout.MenuLayout.superclass.setContainer.call(this,a)},renderItem:function(g,b,e){if(!this.itemTpl){this.itemTpl=Ext.layout.MenuLayout.prototype.itemTpl=new Ext.XTemplate('<li id="{itemId}" class="{itemCls}">','<tpl if="needsIcon">','<img alt="{altText}" src="{icon}" class="{iconCls}"/>',"</tpl>","</li>")}if(g&&!g.rendered){if(Ext.isNumber(b)){b=e.dom.childNodes[b]}var d=this.getItemArgs(g);g.render(g.positionEl=b?this.itemTpl.insertBefore(b,d,true):this.itemTpl.append(e,d,true));g.positionEl.menuItemId=g.getItemId();if(!d.isMenuItem&&d.needsIcon){g.positionEl.addClass("x-menu-list-item-indent")}this.configureItem(g)}else{if(g&&!this.isValidParent(g,e)){if(Ext.isNumber(b)){b=e.dom.childNodes[b]}e.dom.insertBefore(g.getActionEl().dom,b||null)}}},getItemArgs:function(d){var a=d instanceof Ext.menu.Item,b=!(a||d instanceof Ext.menu.Separator);return{isMenuItem:a,needsIcon:b&&(d.icon||d.iconCls),icon:d.icon||Ext.BLANK_IMAGE_URL,iconCls:"x-menu-item-icon "+(d.iconCls||""),itemId:"x-menu-el-"+d.id,itemCls:"x-menu-list-item ",altText:d.altText||""}},isValidParent:function(b,a){return b.el.up("li.x-menu-list-item",5).dom.parentNode===(a.dom||a)},onLayout:function(a,b){Ext.layout.MenuLayout.superclass.onLayout.call(this,a,b);this.doAutoSize()},doAutoSize:function(){var c=this.container,a=c.width;if(c.floating){if(a){c.setWidth(a)}else{if(Ext.isIE9m){c.setWidth(Ext.isStrict&&(Ext.isIE7||Ext.isIE8||Ext.isIE9)?"auto":c.minWidth);var d=c.getEl(),b=d.dom.offsetWidth;c.setWidth(c.getLayoutTarget().getWidth()+d.getFrameWidth("lr"))}}}}});Ext.Container.LAYOUTS.menu=Ext.layout.MenuLayout;Ext.Viewport=Ext.extend(Ext.Container,{initComponent:function(){Ext.Viewport.superclass.initComponent.call(this);document.getElementsByTagName("html")[0].className+=" x-viewport";this.el=Ext.getBody();this.el.setHeight=Ext.emptyFn;this.el.setWidth=Ext.emptyFn;this.el.setSize=Ext.emptyFn;this.el.dom.scroll="no";this.allowDomMove=false;this.autoWidth=true;this.autoHeight=true;Ext.EventManager.onWindowResize(this.fireResize,this);this.renderTo=this.el},fireResize:function(a,b){this.fireEvent("resize",this,a,b,a,b)}});Ext.reg("viewport",Ext.Viewport);Ext.Panel=Ext.extend(Ext.Container,{baseCls:"x-panel",collapsedCls:"x-panel-collapsed",maskDisabled:true,animCollapse:Ext.enableFx,headerAsText:true,buttonAlign:"right",collapsed:false,collapseFirst:true,minButtonWidth:75,elements:"body",preventBodyReset:false,padding:undefined,resizeEvent:"bodyresize",toolTarget:"header",collapseEl:"bwrap",slideAnchor:"t",disabledClass:"",deferHeight:true,expandDefaults:{duration:0.25},collapseDefaults:{duration:0.25},initComponent:function(){Ext.Panel.superclass.initComponent.call(this);this.addEvents("bodyresize","titlechange","iconchange","collapse","expand","beforecollapse","beforeexpand","beforeclose","close","activate","deactivate");if(this.unstyled){this.baseCls="x-plain"}this.toolbars=[];if(this.tbar){this.elements+=",tbar";this.topToolbar=this.createToolbar(this.tbar);this.tbar=null}if(this.bbar){this.elements+=",bbar";this.bottomToolbar=this.createToolbar(this.bbar);this.bbar=null}if(this.header===true){this.elements+=",header";this.header=null}else{if(this.headerCfg||(this.title&&this.header!==false)){this.elements+=",header"}}if(this.footerCfg||this.footer===true){this.elements+=",footer";this.footer=null}if(this.buttons){this.fbar=this.buttons;this.buttons=null}if(this.fbar){this.createFbar(this.fbar)}if(this.autoLoad){this.on("render",this.doAutoLoad,this,{delay:10})}},createFbar:function(b){var a=this.minButtonWidth;this.elements+=",footer";this.fbar=this.createToolbar(b,{buttonAlign:this.buttonAlign,toolbarCls:"x-panel-fbar",enableOverflow:false,defaults:function(d){return{minWidth:d.minWidth||a}}});this.fbar.items.each(function(d){d.minWidth=d.minWidth||this.minButtonWidth},this);this.buttons=this.fbar.items.items},createToolbar:function(b,c){var a;if(Ext.isArray(b)){b={items:b}}a=b.events?Ext.apply(b,c):this.createComponent(Ext.apply({},b,c),"toolbar");this.toolbars.push(a);return a},createElement:function(a,c){if(this[a]){c.appendChild(this[a].dom);return}if(a==="bwrap"||this.elements.indexOf(a)!=-1){if(this[a+"Cfg"]){this[a]=Ext.fly(c).createChild(this[a+"Cfg"])}else{var b=document.createElement("div");b.className=this[a+"Cls"];this[a]=Ext.get(c.appendChild(b))}if(this[a+"CssClass"]){this[a].addClass(this[a+"CssClass"])}if(this[a+"Style"]){this[a].applyStyles(this[a+"Style"])}}},onRender:function(g,e){Ext.Panel.superclass.onRender.call(this,g,e);this.createClasses();var a=this.el,h=a.dom,k,i;if(this.collapsible&&!this.hideCollapseTool){this.tools=this.tools?this.tools.slice(0):[];this.tools[this.collapseFirst?"unshift":"push"]({id:"toggle",handler:this.toggleCollapse,scope:this})}if(this.tools){i=this.tools;this.elements+=(this.header!==false)?",header":""}this.tools={};a.addClass(this.baseCls);if(h.firstChild){this.header=a.down("."+this.headerCls);this.bwrap=a.down("."+this.bwrapCls);var j=this.bwrap?this.bwrap:a;this.tbar=j.down("."+this.tbarCls);this.body=j.down("."+this.bodyCls);this.bbar=j.down("."+this.bbarCls);this.footer=j.down("."+this.footerCls);this.fromMarkup=true}if(this.preventBodyReset===true){a.addClass("x-panel-reset")}if(this.cls){a.addClass(this.cls)}if(this.buttons){this.elements+=",footer"}if(this.frame){a.insertHtml("afterBegin",String.format(Ext.Element.boxMarkup,this.baseCls));this.createElement("header",h.firstChild.firstChild.firstChild);this.createElement("bwrap",h);k=this.bwrap.dom;var c=h.childNodes[1],b=h.childNodes[2];k.appendChild(c);k.appendChild(b);var l=k.firstChild.firstChild.firstChild;this.createElement("tbar",l);this.createElement("body",l);this.createElement("bbar",l);this.createElement("footer",k.lastChild.firstChild.firstChild);if(!this.footer){this.bwrap.dom.lastChild.className+=" x-panel-nofooter"}this.ft=Ext.get(this.bwrap.dom.lastChild);this.mc=Ext.get(l)}else{this.createElement("header",h);this.createElement("bwrap",h);k=this.bwrap.dom;this.createElement("tbar",k);this.createElement("body",k);this.createElement("bbar",k);this.createElement("footer",k);if(!this.header){this.body.addClass(this.bodyCls+"-noheader");if(this.tbar){this.tbar.addClass(this.tbarCls+"-noheader")}}}if(Ext.isDefined(this.padding)){this.body.setStyle("padding",this.body.addUnits(this.padding))}if(this.border===false){this.el.addClass(this.baseCls+"-noborder");this.body.addClass(this.bodyCls+"-noborder");if(this.header){this.header.addClass(this.headerCls+"-noborder")}if(this.footer){this.footer.addClass(this.footerCls+"-noborder")}if(this.tbar){this.tbar.addClass(this.tbarCls+"-noborder")}if(this.bbar){this.bbar.addClass(this.bbarCls+"-noborder")}}if(this.bodyBorder===false){this.body.addClass(this.bodyCls+"-noborder")}this.bwrap.enableDisplayMode("block");if(this.header){this.header.unselectable();if(this.headerAsText){this.header.dom.innerHTML='<span class="'+this.headerTextCls+'">'+this.header.dom.innerHTML+"</span>";if(this.iconCls){this.setIconClass(this.iconCls)}}}if(this.floating){this.makeFloating(this.floating)}if(this.collapsible&&this.titleCollapse&&this.header){this.mon(this.header,"click",this.toggleCollapse,this);this.header.setStyle("cursor","pointer")}if(i){this.addTool.apply(this,i)}if(this.fbar){this.footer.addClass("x-panel-btns");this.fbar.ownerCt=this;this.fbar.render(this.footer);this.footer.createChild({cls:"x-clear"})}if(this.tbar&&this.topToolbar){this.topToolbar.ownerCt=this;this.topToolbar.render(this.tbar)}if(this.bbar&&this.bottomToolbar){this.bottomToolbar.ownerCt=this;this.bottomToolbar.render(this.bbar)}},setIconClass:function(b){var a=this.iconCls;this.iconCls=b;if(this.rendered&&this.header){if(this.frame){this.header.addClass("x-panel-icon");this.header.replaceClass(a,this.iconCls)}else{var e=this.header,c=e.child("img.x-panel-inline-icon");if(c){Ext.fly(c).replaceClass(a,this.iconCls)}else{var d=e.child("span."+this.headerTextCls);if(d){Ext.DomHelper.insertBefore(d.dom,{tag:"img",alt:"",src:Ext.BLANK_IMAGE_URL,cls:"x-panel-inline-icon "+this.iconCls})}}}}this.fireEvent("iconchange",this,b,a)},makeFloating:function(a){this.floating=true;this.el=new Ext.Layer(Ext.apply({},a,{shadow:Ext.isDefined(this.shadow)?this.shadow:"sides",shadowOffset:this.shadowOffset,constrain:false,shim:this.shim===false?false:undefined}),this.el)},getTopToolbar:function(){return this.topToolbar},getBottomToolbar:function(){return this.bottomToolbar},getFooterToolbar:function(){return this.fbar},addButton:function(a,c,b){if(!this.fbar){this.createFbar([])}if(c){if(Ext.isString(a)){a={text:a}}a=Ext.apply({handler:c,scope:b},a)}return this.fbar.add(a)},addTool:function(){if(!this.rendered){if(!this.tools){this.tools=[]}Ext.each(arguments,function(a){this.tools.push(a)},this);return}if(!this[this.toolTarget]){return}if(!this.toolTemplate){var h=new Ext.Template('<div class="x-tool x-tool-{id}">&#160;</div>');h.disableFormats=true;h.compile();Ext.Panel.prototype.toolTemplate=h}for(var g=0,d=arguments,c=d.length;g<c;g++){var b=d[g];if(!this.tools[b.id]){var j="x-tool-"+b.id+"-over";var e=this.toolTemplate.insertFirst(this[this.toolTarget],b,true);this.tools[b.id]=e;e.enableDisplayMode("block");this.mon(e,"click",this.createToolHandler(e,b,j,this));if(b.on){this.mon(e,b.on)}if(b.hidden){e.hide()}if(b.qtip){if(Ext.isObject(b.qtip)){Ext.QuickTips.register(Ext.apply({target:e.id},b.qtip))}else{e.dom.qtip=b.qtip}}e.addClassOnOver(j)}}},onLayout:function(b,a){Ext.Panel.superclass.onLayout.apply(this,arguments);if(this.hasLayout&&this.toolbars.length>0){Ext.each(this.toolbars,function(c){c.doLayout(undefined,a)});this.syncHeight()}},syncHeight:function(){var b=this.toolbarHeight,c=this.body,a=this.lastSize.height,d;if(this.autoHeight||!Ext.isDefined(a)||a=="auto"){return}if(b!=this.getToolbarHeight()){b=Math.max(0,a-this.getFrameHeight());c.setHeight(b);d=c.getSize();this.toolbarHeight=this.getToolbarHeight();this.onBodyResize(d.width,d.height)}},onShow:function(){if(this.floating){return this.el.show()}Ext.Panel.superclass.onShow.call(this)},onHide:function(){if(this.floating){return this.el.hide()}Ext.Panel.superclass.onHide.call(this)},createToolHandler:function(c,a,d,b){return function(g){c.removeClass(d);if(a.stopEvent!==false){g.stopEvent()}if(a.handler){a.handler.call(a.scope||c,g,c,b,a)}}},afterRender:function(){if(this.floating&&!this.hidden){this.el.show()}if(this.title){this.setTitle(this.title)}Ext.Panel.superclass.afterRender.call(this);if(this.collapsed){this.collapsed=false;this.collapse(false)}this.initEvents()},getKeyMap:function(){if(!this.keyMap){this.keyMap=new Ext.KeyMap(this.el,this.keys)}return this.keyMap},initEvents:function(){if(this.keys){this.getKeyMap()}if(this.draggable){this.initDraggable()}if(this.toolbars.length>0){Ext.each(this.toolbars,function(a){a.doLayout();a.on({scope:this,afterlayout:this.syncHeight,remove:this.syncHeight})},this);this.syncHeight()}},initDraggable:function(){this.dd=new Ext.Panel.DD(this,Ext.isBoolean(this.draggable)?null:this.draggable)},beforeEffect:function(a){if(this.floating){this.el.beforeAction()}if(a!==false){this.el.addClass("x-panel-animated")}},afterEffect:function(a){this.syncShadow();this.el.removeClass("x-panel-animated")},createEffect:function(c,b,d){var e={scope:d,block:true};if(c===true){e.callback=b;return e}else{if(!c.callback){e.callback=b}else{e.callback=function(){b.call(d);Ext.callback(c.callback,c.scope)}}}return Ext.applyIf(e,c)},collapse:function(b){if(this.collapsed||this.el.hasFxBlock()||this.fireEvent("beforecollapse",this,b)===false){return}var a=b===true||(b!==false&&this.animCollapse);this.beforeEffect(a);this.onCollapse(a,b);return this},onCollapse:function(a,b){if(a){this[this.collapseEl].slideOut(this.slideAnchor,Ext.apply(this.createEffect(b||true,this.afterCollapse,this),this.collapseDefaults))}else{this[this.collapseEl].hide(this.hideMode);this.afterCollapse(false)}},afterCollapse:function(a){this.collapsed=true;this.el.addClass(this.collapsedCls);if(a!==false){this[this.collapseEl].hide(this.hideMode)}this.afterEffect(a);this.cascade(function(b){if(b.lastSize){b.lastSize={width:undefined,height:undefined}}});this.fireEvent("collapse",this)},expand:function(b){if(!this.collapsed||this.el.hasFxBlock()||this.fireEvent("beforeexpand",this,b)===false){return}var a=b===true||(b!==false&&this.animCollapse);this.el.removeClass(this.collapsedCls);this.beforeEffect(a);this.onExpand(a,b);return this},onExpand:function(a,b){if(a){this[this.collapseEl].slideIn(this.slideAnchor,Ext.apply(this.createEffect(b||true,this.afterExpand,this),this.expandDefaults))}else{this[this.collapseEl].show(this.hideMode);this.afterExpand(false)}},afterExpand:function(a){this.collapsed=false;if(a!==false){this[this.collapseEl].show(this.hideMode)}this.afterEffect(a);if(this.deferLayout){delete this.deferLayout;this.doLayout(true)}this.fireEvent("expand",this)},toggleCollapse:function(a){this[this.collapsed?"expand":"collapse"](a);return this},onDisable:function(){if(this.rendered&&this.maskDisabled){this.el.mask()}Ext.Panel.superclass.onDisable.call(this)},onEnable:function(){if(this.rendered&&this.maskDisabled){this.el.unmask()}Ext.Panel.superclass.onEnable.call(this)},onResize:function(g,d,c,e){var a=g,b=d;if(Ext.isDefined(a)||Ext.isDefined(b)){if(!this.collapsed){if(Ext.isNumber(a)){this.body.setWidth(a=this.adjustBodyWidth(a-this.getFrameWidth()))}else{if(a=="auto"){a=this.body.setWidth("auto").dom.offsetWidth}else{a=this.body.dom.offsetWidth}}if(this.tbar){this.tbar.setWidth(a);if(this.topToolbar){this.topToolbar.setSize(a)}}if(this.bbar){this.bbar.setWidth(a);if(this.bottomToolbar){this.bottomToolbar.setSize(a);if(Ext.isIE9m){this.bbar.setStyle("position","static");this.bbar.setStyle("position","")}}}if(this.footer){this.footer.setWidth(a);if(this.fbar){this.fbar.setSize(Ext.isIE9m?(a-this.footer.getFrameWidth("lr")):"auto")}}if(Ext.isNumber(b)){b=Math.max(0,b-this.getFrameHeight());this.body.setHeight(b)}else{if(b=="auto"){this.body.setHeight(b)}}if(this.disabled&&this.el._mask){this.el._mask.setSize(this.el.dom.clientWidth,this.el.getHeight())}}else{this.queuedBodySize={width:a,height:b};if(!this.queuedExpand&&this.allowQueuedExpand!==false){this.queuedExpand=true;this.on("expand",function(){delete this.queuedExpand;this.onResize(this.queuedBodySize.width,this.queuedBodySize.height)},this,{single:true})}}this.onBodyResize(a,b)}this.syncShadow();Ext.Panel.superclass.onResize.call(this,g,d,c,e)},onBodyResize:function(a,b){this.fireEvent("bodyresize",this,a,b)},getToolbarHeight:function(){var a=0;if(this.rendered){Ext.each(this.toolbars,function(b){a+=b.getHeight()},this)}return a},adjustBodyHeight:function(a){return a},adjustBodyWidth:function(a){return a},onPosition:function(){this.syncShadow()},getFrameWidth:function(){var b=this.el.getFrameWidth("lr")+this.bwrap.getFrameWidth("lr");if(this.frame){var a=this.bwrap.dom.firstChild;b+=(Ext.fly(a).getFrameWidth("l")+Ext.fly(a.firstChild).getFrameWidth("r"));b+=this.mc.getFrameWidth("lr")}return b},getFrameHeight:function(){var a=this.el.getFrameWidth("tb")+this.bwrap.getFrameWidth("tb");a+=(this.tbar?this.tbar.getHeight():0)+(this.bbar?this.bbar.getHeight():0);if(this.frame){a+=this.el.dom.firstChild.offsetHeight+this.ft.dom.offsetHeight+this.mc.getFrameWidth("tb")}else{a+=(this.header?this.header.getHeight():0)+(this.footer?this.footer.getHeight():0)}return a},getInnerWidth:function(){return this.getSize().width-this.getFrameWidth()},getInnerHeight:function(){return this.body.getHeight()},syncShadow:function(){if(this.floating){this.el.sync(true)}},getLayoutTarget:function(){return this.body},getContentTarget:function(){return this.body},setTitle:function(b,a){this.title=b;if(this.header&&this.headerAsText){this.header.child("span").update(b)}if(a){this.setIconClass(a)}this.fireEvent("titlechange",this,b);return this},getUpdater:function(){return this.body.getUpdater()},load:function(){var a=this.body.getUpdater();a.update.apply(a,arguments);return this},beforeDestroy:function(){Ext.Panel.superclass.beforeDestroy.call(this);if(this.header){this.header.removeAllListeners()}if(this.tools){for(var a in this.tools){Ext.destroy(this.tools[a])}}if(this.toolbars.length>0){Ext.each(this.toolbars,function(b){b.un("afterlayout",this.syncHeight,this);b.un("remove",this.syncHeight,this)},this)}if(Ext.isArray(this.buttons)){while(this.buttons.length){Ext.destroy(this.buttons[0])}}if(this.rendered){Ext.destroy(this.ft,this.header,this.footer,this.tbar,this.bbar,this.body,this.mc,this.bwrap,this.dd);if(this.fbar){Ext.destroy(this.fbar,this.fbar.el)}}Ext.destroy(this.toolbars)},createClasses:function(){this.headerCls=this.baseCls+"-header";this.headerTextCls=this.baseCls+"-header-text";this.bwrapCls=this.baseCls+"-bwrap";this.tbarCls=this.baseCls+"-tbar";this.bodyCls=this.baseCls+"-body";this.bbarCls=this.baseCls+"-bbar";this.footerCls=this.baseCls+"-footer"},createGhost:function(a,e,b){var d=document.createElement("div");d.className="x-panel-ghost "+(a?a:"");if(this.header){d.appendChild(this.el.dom.firstChild.cloneNode(true))}Ext.fly(d.appendChild(document.createElement("ul"))).setHeight(this.bwrap.getHeight());d.style.width=this.el.dom.offsetWidth+"px";if(!b){this.container.dom.appendChild(d)}else{Ext.getDom(b).appendChild(d)}if(e!==false&&this.el.useShim!==false){var c=new Ext.Layer({shadow:false,useDisplay:true,constrain:false},d);c.show();return c}else{return new Ext.Element(d)}},doAutoLoad:function(){var a=this.body.getUpdater();if(this.renderer){a.setRenderer(this.renderer)}a.update(Ext.isObject(this.autoLoad)?this.autoLoad:{url:this.autoLoad})},getTool:function(a){return this.tools[a]}});Ext.reg("panel",Ext.Panel);Ext.Editor=function(b,a){if(b.field){this.field=Ext.create(b.field,"textfield");a=Ext.apply({},b);delete a.field}else{this.field=b}Ext.Editor.superclass.constructor.call(this,a)};Ext.extend(Ext.Editor,Ext.Component,{allowBlur:true,value:"",alignment:"c-c?",offsets:[0,0],shadow:"frame",constrain:false,swallowKeys:true,completeOnEnter:true,cancelOnEsc:true,updateEl:false,initComponent:function(){Ext.Editor.superclass.initComponent.call(this);this.addEvents("beforestartedit","startedit","beforecomplete","complete","canceledit","specialkey")},onRender:function(b,a){this.el=new Ext.Layer({shadow:this.shadow,cls:"x-editor",parentEl:b,shim:this.shim,shadowOffset:this.shadowOffset||4,id:this.id,constrain:this.constrain});if(this.zIndex){this.el.setZIndex(this.zIndex)}this.el.setStyle("overflow",Ext.isGecko?"auto":"hidden");if(this.field.msgTarget!="title"){this.field.msgTarget="qtip"}this.field.inEditor=true;this.mon(this.field,{scope:this,blur:this.onBlur,specialkey:this.onSpecialKey});if(this.field.grow){this.mon(this.field,"autosize",this.el.sync,this.el,{delay:1})}this.field.render(this.el).show();this.field.getEl().dom.name="";if(this.swallowKeys){this.field.el.swallowEvent(["keypress","keydown"])}},onSpecialKey:function(g,d){var b=d.getKey(),a=this.completeOnEnter&&b==d.ENTER,c=this.cancelOnEsc&&b==d.ESC;if(a||c){d.stopEvent();if(a){this.completeEdit()}else{this.cancelEdit()}if(g.triggerBlur){g.triggerBlur()}}this.fireEvent("specialkey",g,d)},startEdit:function(b,c){if(this.editing){this.completeEdit()}this.boundEl=Ext.get(b);var a=c!==undefined?c:this.boundEl.dom.innerHTML;if(!this.rendered){this.render(this.parentEl||document.body)}if(this.fireEvent("beforestartedit",this,this.boundEl,a)!==false){this.startValue=a;this.field.reset();this.field.setValue(a);this.realign(true);this.editing=true;this.show()}},doAutoSize:function(){if(this.autoSize){var b=this.boundEl.getSize(),a=this.field.getSize();switch(this.autoSize){case"width":this.setSize(b.width,a.height);break;case"height":this.setSize(a.width,b.height);break;case"none":this.setSize(a.width,a.height);break;default:this.setSize(b.width,b.height)}}},setSize:function(a,b){delete this.field.lastSize;this.field.setSize(a,b);if(this.el){if(Ext.isGecko2||Ext.isOpera||(Ext.isIE7&&Ext.isStrict)){this.el.setSize(a,b)}this.el.sync()}},realign:function(a){if(a===true){this.doAutoSize()}this.el.alignTo(this.boundEl,this.alignment,this.offsets)},completeEdit:function(a){if(!this.editing){return}if(this.field.assertValue){this.field.assertValue()}var b=this.getValue();if(!this.field.isValid()){if(this.revertInvalid!==false){this.cancelEdit(a)}return}if(String(b)===String(this.startValue)&&this.ignoreNoChange){this.hideEdit(a);return}if(this.fireEvent("beforecomplete",this,b,this.startValue)!==false){b=this.getValue();if(this.updateEl&&this.boundEl){this.boundEl.update(b)}this.hideEdit(a);this.fireEvent("complete",this,b,this.startValue)}},onShow:function(){this.el.show();if(this.hideEl!==false){this.boundEl.hide()}this.field.show().focus(false,true);this.fireEvent("startedit",this.boundEl,this.startValue)},cancelEdit:function(a){if(this.editing){var b=this.getValue();this.setValue(this.startValue);this.hideEdit(a);this.fireEvent("canceledit",this,b,this.startValue)}},hideEdit:function(a){if(a!==true){this.editing=false;this.hide()}},onBlur:function(){if(this.allowBlur===true&&this.editing&&this.selectSameEditor!==true){this.completeEdit()}},onHide:function(){if(this.editing){this.completeEdit();return}this.field.blur();if(this.field.collapse){this.field.collapse()}this.el.hide();if(this.hideEl!==false){this.boundEl.show()}},setValue:function(a){this.field.setValue(a)},getValue:function(){return this.field.getValue()},beforeDestroy:function(){Ext.destroyMembers(this,"field");delete this.parentEl;delete this.boundEl}});Ext.reg("editor",Ext.Editor);Ext.ColorPalette=Ext.extend(Ext.Component,{itemCls:"x-color-palette",value:null,clickEvent:"click",ctype:"Ext.ColorPalette",allowReselect:false,colors:["000000","993300","333300","003300","003366","000080","333399","333333","800000","FF6600","808000","008000","008080","0000FF","666699","808080","FF0000","FF9900","99CC00","339966","33CCCC","3366FF","800080","969696","FF00FF","FFCC00","FFFF00","00FF00","00FFFF","00CCFF","993366","C0C0C0","FF99CC","FFCC99","FFFF99","CCFFCC","CCFFFF","99CCFF","CC99FF","FFFFFF"],initComponent:function(){Ext.ColorPalette.superclass.initComponent.call(this);this.addEvents("select");if(this.handler){this.on("select",this.handler,this.scope,true)}},onRender:function(b,a){this.autoEl={tag:"div",cls:this.itemCls};Ext.ColorPalette.superclass.onRender.call(this,b,a);var c=this.tpl||new Ext.XTemplate('<tpl for="."><a href="#" class="color-{.}" hidefocus="on"><em><span style="background:#{.}" class="x-unselectable" unselectable="on">&#160;</span></em></a></tpl>');c.overwrite(this.el,this.colors);this.mon(this.el,this.clickEvent,this.handleClick,this,{delegate:"a"});if(this.clickEvent!="click"){this.mon(this.el,"click",Ext.emptyFn,this,{delegate:"a",preventDefault:true})}},afterRender:function(){Ext.ColorPalette.superclass.afterRender.call(this);if(this.value){var a=this.value;this.value=null;this.select(a,true)}},handleClick:function(b,a){b.preventDefault();if(!this.disabled){var d=a.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];this.select(d.toUpperCase())}},select:function(b,a){b=b.replace("#","");if(b!=this.value||this.allowReselect){var c=this.el;if(this.value){c.child("a.color-"+this.value).removeClass("x-color-palette-sel")}c.child("a.color-"+b).addClass("x-color-palette-sel");this.value=b;if(a!==true){this.fireEvent("select",this,b)}}}});Ext.reg("colorpalette",Ext.ColorPalette);Ext.DatePicker=Ext.extend(Ext.BoxComponent,{todayText:"Today",okText:"&#160;OK&#160;",cancelText:"Cancel",todayTip:"{0} (Spacebar)",minText:"This date is before the minimum date",maxText:"This date is after the maximum date",format:"m/d/y",disabledDaysText:"Disabled",disabledDatesText:"Disabled",monthNames:Date.monthNames,dayNames:Date.dayNames,nextText:"Next Month (Control+Right)",prevText:"Previous Month (Control+Left)",monthYearText:"Choose a month (Control+Up/Down to move years)",startDay:0,showToday:true,focusOnSelect:true,initHour:12,initComponent:function(){Ext.DatePicker.superclass.initComponent.call(this);this.value=this.value?this.value.clearTime(true):new Date().clearTime();this.addEvents("select");if(this.handler){this.on("select",this.handler,this.scope||this)}this.initDisabledDays()},initDisabledDays:function(){if(!this.disabledDatesRE&&this.disabledDates){var b=this.disabledDates,a=b.length-1,c="(?:";Ext.each(b,function(g,e){c+=Ext.isDate(g)?"^"+Ext.escapeRe(g.dateFormat(this.format))+"$":b[e];if(e!=a){c+="|"}},this);this.disabledDatesRE=new RegExp(c+")")}},setDisabledDates:function(a){if(Ext.isArray(a)){this.disabledDates=a;this.disabledDatesRE=null}else{this.disabledDatesRE=a}this.initDisabledDays();this.update(this.value,true)},setDisabledDays:function(a){this.disabledDays=a;this.update(this.value,true)},setMinDate:function(a){this.minDate=a;this.update(this.value,true)},setMaxDate:function(a){this.maxDate=a;this.update(this.value,true)},setValue:function(a){this.value=a.clearTime(true);this.update(this.value)},getValue:function(){return this.value},focus:function(){this.update(this.activeDate)},onEnable:function(a){Ext.DatePicker.superclass.onEnable.call(this);this.doDisabled(false);this.update(a?this.value:this.activeDate);if(Ext.isIE9m){this.el.repaint()}},onDisable:function(){Ext.DatePicker.superclass.onDisable.call(this);this.doDisabled(true);if(Ext.isIE9m&&!Ext.isIE8){Ext.each([].concat(this.textNodes,this.el.query("th span")),function(a){Ext.fly(a).repaint()})}},doDisabled:function(a){this.keyNav.setDisabled(a);this.prevRepeater.setDisabled(a);this.nextRepeater.setDisabled(a);if(this.showToday){this.todayKeyListener.setDisabled(a);this.todayBtn.setDisabled(a)}},onRender:function(e,b){var a=['<table cellspacing="0">','<tr><td class="x-date-left"><a href="#" title="',this.prevText,'">&#160;</a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="',this.nextText,'">&#160;</a></td></tr>','<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>'],c=this.dayNames,h;for(h=0;h<7;h++){var k=this.startDay+h;if(k>6){k=k-7}a.push("<th><span>",c[k].substr(0,1),"</span></th>")}a[a.length]="</tr></thead><tbody><tr>";for(h=0;h<42;h++){if(h%7===0&&h!==0){a[a.length]="</tr><tr>"}a[a.length]='<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>'}a.push("</tr></tbody></table></td></tr>",this.showToday?'<tr><td colspan="3" class="x-date-bottom" align="center"></td></tr>':"",'</table><div class="x-date-mp"></div>');var j=document.createElement("div");j.className="x-date-picker";j.innerHTML=a.join("");e.dom.insertBefore(j,b);this.el=Ext.get(j);this.eventEl=Ext.get(j.firstChild);this.prevRepeater=new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"),{handler:this.showPrevMonth,scope:this,preventDefault:true,stopDefault:true});this.nextRepeater=new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"),{handler:this.showNextMonth,scope:this,preventDefault:true,stopDefault:true});this.monthPicker=this.el.down("div.x-date-mp");this.monthPicker.enableDisplayMode("block");this.keyNav=new Ext.KeyNav(this.eventEl,{left:function(d){if(d.ctrlKey){this.showPrevMonth()}else{this.update(this.activeDate.add("d",-1))}},right:function(d){if(d.ctrlKey){this.showNextMonth()}else{this.update(this.activeDate.add("d",1))}},up:function(d){if(d.ctrlKey){this.showNextYear()}else{this.update(this.activeDate.add("d",-7))}},down:function(d){if(d.ctrlKey){this.showPrevYear()}else{this.update(this.activeDate.add("d",7))}},pageUp:function(d){this.showNextMonth()},pageDown:function(d){this.showPrevMonth()},enter:function(d){d.stopPropagation();return true},scope:this});this.el.unselectable();this.cells=this.el.select("table.x-date-inner tbody td");this.textNodes=this.el.query("table.x-date-inner tbody span");this.mbtn=new Ext.Button({text:"&#160;",tooltip:this.monthYearText,renderTo:this.el.child("td.x-date-middle",true)});this.mbtn.el.child("em").addClass("x-btn-arrow");if(this.showToday){this.todayKeyListener=this.eventEl.addKeyListener(Ext.EventObject.SPACE,this.selectToday,this);var g=(new Date()).dateFormat(this.format);this.todayBtn=new Ext.Button({renderTo:this.el.child("td.x-date-bottom",true),text:String.format(this.todayText,g),tooltip:String.format(this.todayTip,g),handler:this.selectToday,scope:this})}this.mon(this.eventEl,"mousewheel",this.handleMouseWheel,this);this.mon(this.eventEl,"click",this.handleDateClick,this,{delegate:"a.x-date-date"});this.mon(this.mbtn,"click",this.showMonthPicker,this);this.onEnable(true)},createMonthPicker:function(){if(!this.monthPicker.dom.firstChild){var a=['<table border="0" cellspacing="0">'];for(var b=0;b<6;b++){a.push('<tr><td class="x-date-mp-month"><a href="#">',Date.getShortMonthName(b),"</a></td>",'<td class="x-date-mp-month x-date-mp-sep"><a href="#">',Date.getShortMonthName(b+6),"</a></td>",b===0?'<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>':'<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>')}a.push('<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">',this.okText,'</button><button type="button" class="x-date-mp-cancel">',this.cancelText,"</button></td></tr>","</table>");this.monthPicker.update(a.join(""));this.mon(this.monthPicker,"click",this.onMonthClick,this);this.mon(this.monthPicker,"dblclick",this.onMonthDblClick,this);this.mpMonths=this.monthPicker.select("td.x-date-mp-month");this.mpYears=this.monthPicker.select("td.x-date-mp-year");this.mpMonths.each(function(c,d,e){e+=1;if((e%2)===0){c.dom.xmonth=5+Math.round(e*0.5)}else{c.dom.xmonth=Math.round((e-1)*0.5)}})}},showMonthPicker:function(){if(!this.disabled){this.createMonthPicker();var a=this.el.getSize();this.monthPicker.setSize(a);this.monthPicker.child("table").setSize(a);this.mpSelMonth=(this.activeDate||this.value).getMonth();this.updateMPMonth(this.mpSelMonth);this.mpSelYear=(this.activeDate||this.value).getFullYear();this.updateMPYear(this.mpSelYear);this.monthPicker.slideIn("t",{duration:0.2})}},updateMPYear:function(e){this.mpyear=e;var c=this.mpYears.elements;for(var b=1;b<=10;b++){var d=c[b-1],a;if((b%2)===0){a=e+Math.round(b*0.5);d.firstChild.innerHTML=a;d.xyear=a}else{a=e-(5-Math.round(b*0.5));d.firstChild.innerHTML=a;d.xyear=a}this.mpYears.item(b-1)[a==this.mpSelYear?"addClass":"removeClass"]("x-date-mp-sel")}},updateMPMonth:function(a){this.mpMonths.each(function(b,c,d){b[b.dom.xmonth==a?"addClass":"removeClass"]("x-date-mp-sel")})},selectMPMonth:function(a){},onMonthClick:function(g,b){g.stopEvent();var c=new Ext.Element(b),a;if(c.is("button.x-date-mp-cancel")){this.hideMonthPicker()}else{if(c.is("button.x-date-mp-ok")){var h=new Date(this.mpSelYear,this.mpSelMonth,(this.activeDate||this.value).getDate());if(h.getMonth()!=this.mpSelMonth){h=new Date(this.mpSelYear,this.mpSelMonth,1).getLastDateOfMonth()}this.update(h);this.hideMonthPicker()}else{if((a=c.up("td.x-date-mp-month",2))){this.mpMonths.removeClass("x-date-mp-sel");a.addClass("x-date-mp-sel");this.mpSelMonth=a.dom.xmonth}else{if((a=c.up("td.x-date-mp-year",2))){this.mpYears.removeClass("x-date-mp-sel");a.addClass("x-date-mp-sel");this.mpSelYear=a.dom.xyear}else{if(c.is("a.x-date-mp-prev")){this.updateMPYear(this.mpyear-10)}else{if(c.is("a.x-date-mp-next")){this.updateMPYear(this.mpyear+10)}}}}}}},onMonthDblClick:function(d,b){d.stopEvent();var c=new Ext.Element(b),a;if((a=c.up("td.x-date-mp-month",2))){this.update(new Date(this.mpSelYear,a.dom.xmonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker()}else{if((a=c.up("td.x-date-mp-year",2))){this.update(new Date(a.dom.xyear,this.mpSelMonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker()}}},hideMonthPicker:function(a){if(this.monthPicker){if(a===true){this.monthPicker.hide()}else{this.monthPicker.slideOut("t",{duration:0.2})}}},showPrevMonth:function(a){this.update(this.activeDate.add("mo",-1))},showNextMonth:function(a){this.update(this.activeDate.add("mo",1))},showPrevYear:function(){this.update(this.activeDate.add("y",-1))},showNextYear:function(){this.update(this.activeDate.add("y",1))},handleMouseWheel:function(a){a.stopEvent();if(!this.disabled){var b=a.getWheelDelta();if(b>0){this.showPrevMonth()}else{if(b<0){this.showNextMonth()}}}},handleDateClick:function(b,a){b.stopEvent();if(!this.disabled&&a.dateValue&&!Ext.fly(a.parentNode).hasClass("x-date-disabled")){this.cancelFocus=this.focusOnSelect===false;this.setValue(new Date(a.dateValue));delete this.cancelFocus;this.fireEvent("select",this,this.value)}},selectToday:function(){if(this.todayBtn&&!this.todayBtn.disabled){this.setValue(new Date().clearTime());this.fireEvent("select",this,this.value)}},update:function(G,A){if(this.rendered){var a=this.activeDate,p=this.isVisible();this.activeDate=G;if(!A&&a&&this.el){var o=G.getTime();if(a.getMonth()==G.getMonth()&&a.getFullYear()==G.getFullYear()){this.cells.removeClass("x-date-selected");this.cells.each(function(d){if(d.dom.firstChild.dateValue==o){d.addClass("x-date-selected");if(p&&!this.cancelFocus){Ext.fly(d.dom.firstChild).focus(50)}return false}},this);return}}var k=G.getDaysInMonth(),q=G.getFirstDateOfMonth(),g=q.getDay()-this.startDay;if(g<0){g+=7}k+=g;var B=G.add("mo",-1),h=B.getDaysInMonth()-g,e=this.cells.elements,r=this.textNodes,D=(new Date(B.getFullYear(),B.getMonth(),h,this.initHour)),C=new Date().clearTime().getTime(),v=G.clearTime(true).getTime(),u=this.minDate?this.minDate.clearTime(true):Number.NEGATIVE_INFINITY,y=this.maxDate?this.maxDate.clearTime(true):Number.POSITIVE_INFINITY,F=this.disabledDatesRE,s=this.disabledDatesText,I=this.disabledDays?this.disabledDays.join(""):false,E=this.disabledDaysText,z=this.format;if(this.showToday){var m=new Date().clearTime(),c=(m<u||m>y||(F&&z&&F.test(m.dateFormat(z)))||(I&&I.indexOf(m.getDay())!=-1));if(!this.disabled){this.todayBtn.setDisabled(c);this.todayKeyListener[c?"disable":"enable"]()}}var l=function(J,d){d.title="";var i=D.clearTime(true).getTime();d.firstChild.dateValue=i;if(i==C){d.className+=" x-date-today";d.title=J.todayText}if(i==v){d.className+=" x-date-selected";if(p){Ext.fly(d.firstChild).focus(50)}}if(i<u){d.className=" x-date-disabled";d.title=J.minText;return}if(i>y){d.className=" x-date-disabled";d.title=J.maxText;return}if(I){if(I.indexOf(D.getDay())!=-1){d.title=E;d.className=" x-date-disabled"}}if(F&&z){var w=D.dateFormat(z);if(F.test(w)){d.title=s.replace("%0",w);d.className=" x-date-disabled"}}};var x=0;for(;x<g;x++){r[x].innerHTML=(++h);D.setDate(D.getDate()+1);e[x].className="x-date-prevday";l(this,e[x])}for(;x<k;x++){var b=x-g+1;r[x].innerHTML=(b);D.setDate(D.getDate()+1);e[x].className="x-date-active";l(this,e[x])}var H=0;for(;x<42;x++){r[x].innerHTML=(++H);D.setDate(D.getDate()+1);e[x].className="x-date-nextday";l(this,e[x])}this.mbtn.setText(this.monthNames[G.getMonth()]+" "+G.getFullYear());if(!this.internalRender){var j=this.el.dom.firstChild,n=j.offsetWidth;this.el.setWidth(n+this.el.getBorderWidth("lr"));Ext.fly(j).setWidth(n);this.internalRender=true;if(Ext.isOpera&&!this.secondPass){j.rows[0].cells[1].style.width=(n-(j.rows[0].cells[0].offsetWidth+j.rows[0].cells[2].offsetWidth))+"px";this.secondPass=true;this.update.defer(10,this,[G])}}}},beforeDestroy:function(){if(this.rendered){Ext.destroy(this.keyNav,this.monthPicker,this.eventEl,this.mbtn,this.nextRepeater,this.prevRepeater,this.cells.el,this.todayBtn);delete this.textNodes;delete this.cells.elements}}});Ext.reg("datepicker",Ext.DatePicker);Ext.LoadMask=function(c,b){this.el=Ext.get(c);Ext.apply(this,b);if(this.store){this.store.on({scope:this,beforeload:this.onBeforeLoad,load:this.onLoad,exception:this.onLoad});this.removeMask=Ext.value(this.removeMask,false)}else{var a=this.el.getUpdater();a.showLoadIndicator=false;a.on({scope:this,beforeupdate:this.onBeforeLoad,update:this.onLoad,failure:this.onLoad});this.removeMask=Ext.value(this.removeMask,true)}};Ext.LoadMask.prototype={msg:"Loading...",msgCls:"x-mask-loading",disabled:false,disable:function(){this.disabled=true},enable:function(){this.disabled=false},onLoad:function(){this.el.unmask(this.removeMask)},onBeforeLoad:function(){if(!this.disabled){this.el.mask(this.msg,this.msgCls)}},show:function(){this.onBeforeLoad()},hide:function(){this.onLoad()},destroy:function(){if(this.store){this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("exception",this.onLoad,this)}else{var a=this.el.getUpdater();a.un("beforeupdate",this.onBeforeLoad,this);a.un("update",this.onLoad,this);a.un("failure",this.onLoad,this)}}};Ext.slider.Thumb=Ext.extend(Object,{dragging:false,constructor:function(a){Ext.apply(this,a||{},{cls:"x-slider-thumb",constrain:false});Ext.slider.Thumb.superclass.constructor.call(this,a);if(this.slider.vertical){Ext.apply(this,Ext.slider.Thumb.Vertical)}},render:function(){this.el=this.slider.innerEl.insertFirst({cls:this.cls});this.initEvents()},enable:function(){this.disabled=false;this.el.removeClass(this.slider.disabledClass)},disable:function(){this.disabled=true;this.el.addClass(this.slider.disabledClass)},initEvents:function(){var a=this.el;a.addClassOnOver("x-slider-thumb-over");this.tracker=new Ext.dd.DragTracker({onBeforeStart:this.onBeforeDragStart.createDelegate(this),onStart:this.onDragStart.createDelegate(this),onDrag:this.onDrag.createDelegate(this),onEnd:this.onDragEnd.createDelegate(this),tolerance:3,autoStart:300});this.tracker.initEl(a)},onBeforeDragStart:function(a){if(this.disabled){return false}else{this.slider.promoteThumb(this);return true}},onDragStart:function(a){this.el.addClass("x-slider-thumb-drag");this.dragging=true;this.dragStartValue=this.value;this.slider.fireEvent("dragstart",this.slider,a,this)},onDrag:function(g){var c=this.slider,b=this.index,d=this.getNewValue();if(this.constrain){var a=c.thumbs[b+1],h=c.thumbs[b-1];if(h!=undefined&&d<=h.value){d=h.value}if(a!=undefined&&d>=a.value){d=a.value}}c.setValue(b,d,false);c.fireEvent("drag",c,g,this)},getNewValue:function(){var a=this.slider,b=a.innerEl.translatePoints(this.tracker.getXY());return Ext.util.Format.round(a.reverseValue(b.left),a.decimalPrecision)},onDragEnd:function(c){var a=this.slider,b=this.value;this.el.removeClass("x-slider-thumb-drag");this.dragging=false;a.fireEvent("dragend",a,c);if(this.dragStartValue!=b){a.fireEvent("changecomplete",a,b,this)}},destroy:function(){Ext.destroyMembers(this,"tracker","el")}});Ext.slider.MultiSlider=Ext.extend(Ext.BoxComponent,{vertical:false,minValue:0,maxValue:100,decimalPrecision:0,keyIncrement:1,increment:0,clickRange:[5,15],clickToChange:true,animate:true,constrainThumbs:true,topThumbZIndex:10000,initComponent:function(){if(!Ext.isDefined(this.value)){this.value=this.minValue}this.thumbs=[];Ext.slider.MultiSlider.superclass.initComponent.call(this);this.keyIncrement=Math.max(this.increment,this.keyIncrement);this.addEvents("beforechange","change","changecomplete","dragstart","drag","dragend");if(this.values==undefined||Ext.isEmpty(this.values)){this.values=[0]}var a=this.values;for(var b=0;b<a.length;b++){this.addThumb(a[b])}if(this.vertical){Ext.apply(this,Ext.slider.Vertical)}},addThumb:function(b){var a=new Ext.slider.Thumb({value:b,slider:this,index:this.thumbs.length,constrain:this.constrainThumbs});this.thumbs.push(a);if(this.rendered){a.render()}},promoteThumb:function(d){var a=this.thumbs,g,b;for(var e=0,c=a.length;e<c;e++){b=a[e];if(b==d){g=this.topThumbZIndex}else{g=""}b.el.setStyle("zIndex",g)}},onRender:function(){this.autoEl={cls:"x-slider "+(this.vertical?"x-slider-vert":"x-slider-horz"),cn:{cls:"x-slider-end",cn:{cls:"x-slider-inner",cn:[{tag:"a",cls:"x-slider-focus",href:"#",tabIndex:"-1",hidefocus:"on"}]}}};Ext.slider.MultiSlider.superclass.onRender.apply(this,arguments);this.endEl=this.el.first();this.innerEl=this.endEl.first();this.focusEl=this.innerEl.child(".x-slider-focus");for(var b=0;b<this.thumbs.length;b++){this.thumbs[b].render()}var a=this.innerEl.child(".x-slider-thumb");this.halfThumb=(this.vertical?a.getHeight():a.getWidth())/2;this.initEvents()},initEvents:function(){this.mon(this.el,{scope:this,mousedown:this.onMouseDown,keydown:this.onKeyDown});this.focusEl.swallowEvent("click",true)},onMouseDown:function(d){if(this.disabled){return}var c=false;for(var b=0;b<this.thumbs.length;b++){c=c||d.target==this.thumbs[b].el.dom}if(this.clickToChange&&!c){var a=this.innerEl.translatePoints(d.getXY());this.onClickChange(a)}this.focus()},onClickChange:function(c){if(c.top>this.clickRange[0]&&c.top<this.clickRange[1]){var a=this.getNearest(c,"left"),b=a.index;this.setValue(b,Ext.util.Format.round(this.reverseValue(c.left),this.decimalPrecision),undefined,true)}},getNearest:function(k,b){var m=b=="top"?this.innerEl.getHeight()-k[b]:k[b],g=this.reverseValue(m),j=(this.maxValue-this.minValue)+5,e=0,c=null;for(var d=0;d<this.thumbs.length;d++){var a=this.thumbs[d],l=a.value,h=Math.abs(l-g);if(Math.abs(h<=j)){c=a;e=d;j=h}}return c},onKeyDown:function(b){if(this.disabled||this.thumbs.length!==1){b.preventDefault();return}var a=b.getKey(),c;switch(a){case b.UP:case b.RIGHT:b.stopEvent();c=b.ctrlKey?this.maxValue:this.getValue(0)+this.keyIncrement;this.setValue(0,c,undefined,true);break;case b.DOWN:case b.LEFT:b.stopEvent();c=b.ctrlKey?this.minValue:this.getValue(0)-this.keyIncrement;this.setValue(0,c,undefined,true);break;default:b.preventDefault()}},doSnap:function(b){if(!(this.increment&&b)){return b}var d=b,c=this.increment,a=b%c;if(a!=0){d-=a;if(a*2>=c){d+=c}else{if(a*2<-c){d-=c}}}return d.constrain(this.minValue,this.maxValue)},afterRender:function(){Ext.slider.MultiSlider.superclass.afterRender.apply(this,arguments);for(var c=0;c<this.thumbs.length;c++){var b=this.thumbs[c];if(b.value!==undefined){var a=this.normalizeValue(b.value);if(a!==b.value){this.setValue(c,a,false)}else{this.moveThumb(c,this.translateValue(a),false)}}}},getRatio:function(){var a=this.innerEl.getWidth(),b=this.maxValue-this.minValue;return b==0?a:(a/b)},normalizeValue:function(a){a=this.doSnap(a);a=Ext.util.Format.round(a,this.decimalPrecision);a=a.constrain(this.minValue,this.maxValue);return a},setMinValue:function(e){this.minValue=e;var d=0,b=this.thumbs,a=b.length,c;for(;d<a;++d){c=b[d];c.value=c.value<e?e:c.value}this.syncThumb()},setMaxValue:function(e){this.maxValue=e;var d=0,b=this.thumbs,a=b.length,c;for(;d<a;++d){c=b[d];c.value=c.value>e?e:c.value}this.syncThumb()},setValue:function(d,c,b,g){var a=this.thumbs[d],e=a.el;c=this.normalizeValue(c);if(c!==a.value&&this.fireEvent("beforechange",this,c,a.value,a)!==false){a.value=c;if(this.rendered){this.moveThumb(d,this.translateValue(c),b!==false);this.fireEvent("change",this,c,a);if(g){this.fireEvent("changecomplete",this,c,a)}}}},translateValue:function(a){var b=this.getRatio();return(a*b)-(this.minValue*b)-this.halfThumb},reverseValue:function(b){var a=this.getRatio();return(b+(this.minValue*a))/a},moveThumb:function(d,c,b){var a=this.thumbs[d].el;if(!b||this.animate===false){a.setLeft(c)}else{a.shift({left:c,stopFx:true,duration:0.35})}},focus:function(){this.focusEl.focus(10)},onResize:function(c,e){var b=this.thumbs,a=b.length,d=0;for(;d<a;++d){b[d].el.stopFx()}if(Ext.isNumber(c)){this.innerEl.setWidth(c-(this.el.getPadding("l")+this.endEl.getPadding("r")))}this.syncThumb();Ext.slider.MultiSlider.superclass.onResize.apply(this,arguments)},onDisable:function(){Ext.slider.MultiSlider.superclass.onDisable.call(this);for(var b=0;b<this.thumbs.length;b++){var a=this.thumbs[b],c=a.el;a.disable();if(Ext.isIE){var d=c.getXY();c.hide();this.innerEl.addClass(this.disabledClass).dom.disabled=true;if(!this.thumbHolder){this.thumbHolder=this.endEl.createChild({cls:"x-slider-thumb "+this.disabledClass})}this.thumbHolder.show().setXY(d)}}},onEnable:function(){Ext.slider.MultiSlider.superclass.onEnable.call(this);for(var b=0;b<this.thumbs.length;b++){var a=this.thumbs[b],c=a.el;a.enable();if(Ext.isIE){this.innerEl.removeClass(this.disabledClass).dom.disabled=false;if(this.thumbHolder){this.thumbHolder.hide()}c.show();this.syncThumb()}}},syncThumb:function(){if(this.rendered){for(var a=0;a<this.thumbs.length;a++){this.moveThumb(a,this.translateValue(this.thumbs[a].value))}}},getValue:function(a){return this.thumbs[a].value},getValues:function(){var a=[];for(var b=0;b<this.thumbs.length;b++){a.push(this.thumbs[b].value)}return a},beforeDestroy:function(){var b=this.thumbs;for(var c=0,a=b.length;c<a;++c){b[c].destroy();b[c]=null}Ext.destroyMembers(this,"endEl","innerEl","focusEl","thumbHolder");Ext.slider.MultiSlider.superclass.beforeDestroy.call(this)}});Ext.reg("multislider",Ext.slider.MultiSlider);Ext.slider.SingleSlider=Ext.extend(Ext.slider.MultiSlider,{constructor:function(a){a=a||{};Ext.applyIf(a,{values:[a.value||0]});Ext.slider.SingleSlider.superclass.constructor.call(this,a)},getValue:function(){return Ext.slider.SingleSlider.superclass.getValue.call(this,0)},setValue:function(d,b){var c=Ext.toArray(arguments),a=c.length;if(a==1||(a<=3&&typeof arguments[1]!="number")){c.unshift(0)}return Ext.slider.SingleSlider.superclass.setValue.apply(this,c)},syncThumb:function(){return Ext.slider.SingleSlider.superclass.syncThumb.apply(this,[0].concat(arguments))},getNearest:function(){return this.thumbs[0]}});Ext.Slider=Ext.slider.SingleSlider;Ext.reg("slider",Ext.slider.SingleSlider);Ext.slider.Vertical={onResize:function(a,b){this.innerEl.setHeight(b-(this.el.getPadding("t")+this.endEl.getPadding("b")));this.syncThumb()},getRatio:function(){var b=this.innerEl.getHeight(),a=this.maxValue-this.minValue;return b/a},moveThumb:function(d,c,b){var a=this.thumbs[d],e=a.el;if(!b||this.animate===false){e.setBottom(c)}else{e.shift({bottom:c,stopFx:true,duration:0.35})}},onClickChange:function(c){if(c.left>this.clickRange[0]&&c.left<this.clickRange[1]){var a=this.getNearest(c,"top"),b=a.index,d=this.minValue+this.reverseValue(this.innerEl.getHeight()-c.top);this.setValue(b,Ext.util.Format.round(d,this.decimalPrecision),undefined,true)}}};Ext.slider.Thumb.Vertical={getNewValue:function(){var b=this.slider,c=b.innerEl,d=c.translatePoints(this.tracker.getXY()),a=c.getHeight()-d.top;return b.minValue+Ext.util.Format.round(a/b.getRatio(),b.decimalPrecision)}};Ext.ProgressBar=Ext.extend(Ext.BoxComponent,{baseCls:"x-progress",animate:false,waitTimer:null,initComponent:function(){Ext.ProgressBar.superclass.initComponent.call(this);this.addEvents("update")},onRender:function(d,a){var c=new Ext.Template('<div class="{cls}-wrap">','<div class="{cls}-inner">','<div class="{cls}-bar">','<div class="{cls}-text">',"<div>&#160;</div>","</div>","</div>",'<div class="{cls}-text {cls}-text-back">',"<div>&#160;</div>","</div>","</div>","</div>");this.el=a?c.insertBefore(a,{cls:this.baseCls},true):c.append(d,{cls:this.baseCls},true);if(this.id){this.el.dom.id=this.id}var b=this.el.dom.firstChild;this.progressBar=Ext.get(b.firstChild);if(this.textEl){this.textEl=Ext.get(this.textEl);delete this.textTopEl}else{this.textTopEl=Ext.get(this.progressBar.dom.firstChild);var e=Ext.get(b.childNodes[1]);this.textTopEl.setStyle("z-index",99).addClass("x-hidden");this.textEl=new Ext.CompositeElement([this.textTopEl.dom.firstChild,e.dom.firstChild]);this.textEl.setWidth(b.offsetWidth)}this.progressBar.setHeight(b.offsetHeight)},afterRender:function(){Ext.ProgressBar.superclass.afterRender.call(this);if(this.value){this.updateProgress(this.value,this.text)}else{this.updateText(this.text)}},updateProgress:function(c,d,b){this.value=c||0;if(d){this.updateText(d)}if(this.rendered&&!this.isDestroyed){var a=Math.floor(c*this.el.dom.firstChild.offsetWidth);this.progressBar.setWidth(a,b===true||(b!==false&&this.animate));if(this.textTopEl){this.textTopEl.removeClass("x-hidden").setWidth(a)}}this.fireEvent("update",this,c,d);return this},wait:function(b){if(!this.waitTimer){var a=this;b=b||{};this.updateText(b.text);this.waitTimer=Ext.TaskMgr.start({run:function(c){var d=b.increment||10;c-=1;this.updateProgress(((((c+d)%d)+1)*(100/d))*0.01,null,b.animate)},interval:b.interval||1000,duration:b.duration,onStop:function(){if(b.fn){b.fn.apply(b.scope||this)}this.reset()},scope:a})}return this},isWaiting:function(){return this.waitTimer!==null},updateText:function(a){this.text=a||"&#160;";if(this.rendered){this.textEl.update(this.text)}return this},syncProgressBar:function(){if(this.value){this.updateProgress(this.value,this.text)}return this},setSize:function(a,c){Ext.ProgressBar.superclass.setSize.call(this,a,c);if(this.textTopEl){var b=this.el.dom.firstChild;this.textEl.setSize(b.offsetWidth,b.offsetHeight)}this.syncProgressBar();return this},reset:function(a){this.updateProgress(0);if(this.textTopEl){this.textTopEl.addClass("x-hidden")}this.clearTimer();if(a===true){this.hide()}return this},clearTimer:function(){if(this.waitTimer){this.waitTimer.onStop=null;Ext.TaskMgr.stop(this.waitTimer);this.waitTimer=null}},onDestroy:function(){this.clearTimer();if(this.rendered){if(this.textEl.isComposite){this.textEl.clear()}Ext.destroyMembers(this,"textEl","progressBar","textTopEl")}Ext.ProgressBar.superclass.onDestroy.call(this)}});Ext.reg("progress",Ext.ProgressBar);(function(){var a=Ext.EventManager;var b=Ext.lib.Dom;Ext.dd.DragDrop=function(e,c,d){if(e){this.init(e,c,d)}};Ext.dd.DragDrop.prototype={id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:false,lock:function(){this.locked=true},moveOnly:false,unlock:function(){this.locked=false},isTarget:true,padding:null,_domRef:null,__ygDragDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,available:false,hasOuterHandles:false,b4StartDrag:function(c,d){},startDrag:function(c,d){},b4Drag:function(c){},onDrag:function(c){},onDragEnter:function(c,d){},b4DragOver:function(c){},onDragOver:function(c,d){},b4DragOut:function(c){},onDragOut:function(c,d){},b4DragDrop:function(c){},onDragDrop:function(c,d){},onInvalidDrop:function(c){},b4EndDrag:function(c){},endDrag:function(c){},b4MouseDown:function(c){},onMouseDown:function(c){},onMouseUp:function(c){},onAvailable:function(){},defaultPadding:{left:0,right:0,top:0,bottom:0},constrainTo:function(j,h,o){if(Ext.isNumber(h)){h={left:h,right:h,top:h,bottom:h}}h=h||this.defaultPadding;var l=Ext.get(this.getEl()).getBox(),d=Ext.get(j),n=d.getScroll(),k,e=d.dom;if(e==document.body){k={x:n.left,y:n.top,width:Ext.lib.Dom.getViewWidth(),height:Ext.lib.Dom.getViewHeight()}}else{var m=d.getXY();k={x:m[0],y:m[1],width:e.clientWidth,height:e.clientHeight}}var i=l.y-k.y,g=l.x-k.x;this.resetConstraints();this.setXConstraint(g-(h.left||0),k.width-g-l.width-(h.right||0),this.xTickSize);this.setYConstraint(i-(h.top||0),k.height-i-l.height-(h.bottom||0),this.yTickSize)},getEl:function(){if(!this._domRef){this._domRef=Ext.getDom(this.id)}return this._domRef},getDragEl:function(){return Ext.getDom(this.dragElId)},init:function(e,c,d){this.initTarget(e,c,d);a.on(this.id,"mousedown",this.handleMouseDown,this)},initTarget:function(e,c,d){this.config=d||{};this.DDM=Ext.dd.DDM;this.groups={};if(typeof e!=="string"){e=Ext.id(e)}this.id=e;this.addToGroup((c)?c:"default");this.handleElId=e;this.setDragElId(e);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig();this.handleOnAvailable()},applyConfig:function(){this.padding=this.config.padding||[0,0,0,0];this.isTarget=(this.config.isTarget!==false);this.maintainOffset=(this.config.maintainOffset);this.primaryButtonOnly=(this.config.primaryButtonOnly!==false)},handleOnAvailable:function(){this.available=true;this.resetConstraints();this.onAvailable()},setPadding:function(e,c,g,d){if(!c&&0!==c){this.padding=[e,e,e,e]}else{if(!g&&0!==g){this.padding=[e,c,e,c]}else{this.padding=[e,c,g,d]}}},setInitPosition:function(g,e){var h=this.getEl();if(!this.DDM.verifyEl(h)){return}var d=g||0;var c=e||0;var i=b.getXY(h);this.initPageX=i[0]-d;this.initPageY=i[1]-c;this.lastPageX=i[0];this.lastPageY=i[1];this.setStartPosition(i)},setStartPosition:function(d){var c=d||b.getXY(this.getEl());this.deltaSetXY=null;this.startPageX=c[0];this.startPageY=c[1]},addToGroup:function(c){this.groups[c]=true;this.DDM.regDragDrop(this,c)},removeFromGroup:function(c){if(this.groups[c]){delete this.groups[c]}this.DDM.removeDDFromGroup(this,c)},setDragElId:function(c){this.dragElId=c},setHandleElId:function(c){if(typeof c!=="string"){c=Ext.id(c)}this.handleElId=c;this.DDM.regHandle(this.id,c)},setOuterHandleElId:function(c){if(typeof c!=="string"){c=Ext.id(c)}a.on(c,"mousedown",this.handleMouseDown,this);this.setHandleElId(c);this.hasOuterHandles=true},unreg:function(){a.un(this.id,"mousedown",this.handleMouseDown);this._domRef=null;this.DDM._remove(this)},destroy:function(){this.unreg()},isLocked:function(){return(this.DDM.isLocked()||this.locked)},handleMouseDown:function(g,d){if(this.primaryButtonOnly&&g.button!=0){return}if(this.isLocked()){return}this.DDM.refreshCache(this.groups);var c=new Ext.lib.Point(Ext.lib.Event.getPageX(g),Ext.lib.Event.getPageY(g));if(!this.hasOuterHandles&&!this.DDM.isOverTarget(c,this)){}else{if(this.clickValidator(g)){this.setStartPosition();this.b4MouseDown(g);this.onMouseDown(g);this.DDM.handleMouseDown(g,this);if(this.preventDefault||this.stopPropagation){if(this.preventDefault){g.preventDefault()}if(this.stopPropagation){g.stopPropagation()}}else{this.DDM.stopEvent(g)}}else{}}},clickValidator:function(d){var c=d.getTarget();return(this.isValidHandleChild(c)&&(this.id==this.handleElId||this.DDM.handleWasClicked(c,this.id)))},addInvalidHandleType:function(c){var d=c.toUpperCase();this.invalidHandleTypes[d]=d},addInvalidHandleId:function(c){if(typeof c!=="string"){c=Ext.id(c)}this.invalidHandleIds[c]=c},addInvalidHandleClass:function(c){this.invalidHandleClasses.push(c)},removeInvalidHandleType:function(c){var d=c.toUpperCase();delete this.invalidHandleTypes[d]},removeInvalidHandleId:function(c){if(typeof c!=="string"){c=Ext.id(c)}delete this.invalidHandleIds[c]},removeInvalidHandleClass:function(d){for(var e=0,c=this.invalidHandleClasses.length;e<c;++e){if(this.invalidHandleClasses[e]==d){delete this.invalidHandleClasses[e]}}},isValidHandleChild:function(h){var g=true;var k;try{k=h.nodeName.toUpperCase()}catch(j){k=h.nodeName}g=g&&!this.invalidHandleTypes[k];g=g&&!this.invalidHandleIds[h.id];for(var d=0,c=this.invalidHandleClasses.length;g&&d<c;++d){g=!Ext.fly(h).hasClass(this.invalidHandleClasses[d])}return g},setXTicks:function(g,c){this.xTicks=[];this.xTickSize=c;var e={};for(var d=this.initPageX;d>=this.minX;d=d-c){if(!e[d]){this.xTicks[this.xTicks.length]=d;e[d]=true}}for(d=this.initPageX;d<=this.maxX;d=d+c){if(!e[d]){this.xTicks[this.xTicks.length]=d;e[d]=true}}this.xTicks.sort(this.DDM.numericSort)},setYTicks:function(g,c){this.yTicks=[];this.yTickSize=c;var e={};for(var d=this.initPageY;d>=this.minY;d=d-c){if(!e[d]){this.yTicks[this.yTicks.length]=d;e[d]=true}}for(d=this.initPageY;d<=this.maxY;d=d+c){if(!e[d]){this.yTicks[this.yTicks.length]=d;e[d]=true}}this.yTicks.sort(this.DDM.numericSort)},setXConstraint:function(e,d,c){this.leftConstraint=e;this.rightConstraint=d;this.minX=this.initPageX-e;this.maxX=this.initPageX+d;if(c){this.setXTicks(this.initPageX,c)}this.constrainX=true},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks()},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0},setYConstraint:function(c,e,d){this.topConstraint=c;this.bottomConstraint=e;this.minY=this.initPageY-c;this.maxY=this.initPageY+e;if(d){this.setYTicks(this.initPageY,d)}this.constrainY=true},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var d=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var c=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(d,c)}else{this.setInitPosition()}if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize)}if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize)}},getTick:function(k,g){if(!g){return k}else{if(g[0]>=k){return g[0]}else{for(var d=0,c=g.length;d<c;++d){var e=d+1;if(g[e]&&g[e]>=k){var j=k-g[d];var h=g[e]-k;return(h>j)?g[d]:g[e]}}return g[g.length-1]}}},toString:function(){return("DragDrop "+this.id)}}})();if(!Ext.dd.DragDropMgr){Ext.dd.DragDropMgr=function(){var a=Ext.EventManager;return{ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initialized:false,locked:false,init:function(){this.initialized=true},POINT:0,INTERSECT:1,mode:0,notifyOccluded:false,_execOnAll:function(d,c){for(var e in this.ids){for(var b in this.ids[e]){var g=this.ids[e][b];if(!this.isTypeOfDD(g)){continue}g[d].apply(g,c)}}},_onLoad:function(){this.init();a.on(document,"mouseup",this.handleMouseUp,this,true);a.on(document,"mousemove",this.handleMouseMove,this,true);a.on(window,"unload",this._onUnload,this,true);a.on(window,"resize",this._onResize,this,true)},_onResize:function(b){this._execOnAll("resetConstraints",[])},lock:function(){this.locked=true},unlock:function(){this.locked=false},isLocked:function(){return this.locked},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:350,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDragDrop:function(c,b){if(!this.initialized){this.init()}if(!this.ids[b]){this.ids[b]={}}this.ids[b][c.id]=c},removeDDFromGroup:function(d,b){if(!this.ids[b]){this.ids[b]={}}var c=this.ids[b];if(c&&c[d.id]){delete c[d.id]}},_remove:function(c){for(var b in c.groups){if(b&&this.ids[b]&&this.ids[b][c.id]){delete this.ids[b][c.id]}}delete this.handleIds[c.id]},regHandle:function(c,b){if(!this.handleIds[c]){this.handleIds[c]={}}this.handleIds[c][b]=b},isDragDrop:function(b){return(this.getDDById(b))?true:false},getRelated:function(h,c){var g=[];for(var e in h.groups){for(var d in this.ids[e]){var b=this.ids[e][d];if(!this.isTypeOfDD(b)){continue}if(!c||b.isTarget){g[g.length]=b}}}return g},isLegalTarget:function(g,e){var c=this.getRelated(g,true);for(var d=0,b=c.length;d<b;++d){if(c[d].id==e.id){return true}}return false},isTypeOfDD:function(b){return(b&&b.__ygDragDrop)},isHandle:function(c,b){return(this.handleIds[c]&&this.handleIds[c][b])},getDDById:function(c){for(var b in this.ids){if(this.ids[b][c]){return this.ids[b][c]}}return null},handleMouseDown:function(d,c){if(Ext.QuickTips){Ext.QuickTips.ddDisable()}if(this.dragCurrent){this.handleMouseUp(d)}this.currentTarget=d.getTarget();this.dragCurrent=c;var b=c.getEl();this.startX=d.getPageX();this.startY=d.getPageY();this.deltaX=this.startX-b.offsetLeft;this.deltaY=this.startY-b.offsetTop;this.dragThreshMet=false;this.clickTimeout=setTimeout(function(){var e=Ext.dd.DDM;e.startDrag(e.startX,e.startY)},this.clickTimeThresh)},startDrag:function(b,c){clearTimeout(this.clickTimeout);if(this.dragCurrent){this.dragCurrent.b4StartDrag(b,c);this.dragCurrent.startDrag(b,c)}this.dragThreshMet=true},handleMouseUp:function(b){if(Ext.QuickTips){Ext.QuickTips.ddEnable()}if(!this.dragCurrent){return}clearTimeout(this.clickTimeout);if(this.dragThreshMet){this.fireEvents(b,true)}else{}this.stopDrag(b);this.stopEvent(b)},stopEvent:function(b){if(this.stopPropagation){b.stopPropagation()}if(this.preventDefault){b.preventDefault()}},stopDrag:function(b){if(this.dragCurrent){if(this.dragThreshMet){this.dragCurrent.b4EndDrag(b);this.dragCurrent.endDrag(b)}this.dragCurrent.onMouseUp(b)}this.dragCurrent=null;this.dragOvers={}},handleMouseMove:function(d){if(!this.dragCurrent){return true}if(Ext.isIE&&(d.button!==0&&d.button!==1&&d.button!==2)){this.stopEvent(d);return this.handleMouseUp(d)}if(!this.dragThreshMet){var c=Math.abs(this.startX-d.getPageX());var b=Math.abs(this.startY-d.getPageY());if(c>this.clickPixelThresh||b>this.clickPixelThresh){this.startDrag(this.startX,this.startY)}}if(this.dragThreshMet){this.dragCurrent.b4Drag(d);this.dragCurrent.onDrag(d);if(!this.dragCurrent.moveOnly){this.fireEvents(d,false)}}this.stopEvent(d);return true},fireEvents:function(o,r){var q=this,l=q.dragCurrent,s=o.getPoint(),c,u,g=[],b=[],h=[],m=[],k=[],d=[],p,j,n,t;if(!l||l.isLocked()){return}for(j in q.dragOvers){c=q.dragOvers[j];if(!q.isTypeOfDD(c)){continue}if(!this.isOverTarget(s,c,q.mode)){h.push(c)}b[j]=true;delete q.dragOvers[j]}for(t in l.groups){if("string"!=typeof t){continue}for(j in q.ids[t]){c=q.ids[t][j];if(q.isTypeOfDD(c)&&(u=c.getEl())&&(c.isTarget)&&(!c.isLocked())&&((c!=l)||(l.ignoreSelf===false))){if((c.zIndex=q.getZIndex(u))!==-1){p=true}g.push(c)}}}if(p){g.sort(q.byZIndex)}for(j=0,n=g.length;j<n;j++){c=g[j];if(q.isOverTarget(s,c,q.mode)){if(r){k.push(c)}else{if(!b[c.id]){d.push(c)}else{m.push(c)}q.dragOvers[c.id]=c}if(!q.notifyOccluded){break}}}if(q.mode){if(h.length){l.b4DragOut(o,h);l.onDragOut(o,h)}if(d.length){l.onDragEnter(o,d)}if(m.length){l.b4DragOver(o,m);l.onDragOver(o,m)}if(k.length){l.b4DragDrop(o,k);l.onDragDrop(o,k)}}else{for(j=0,n=h.length;j<n;++j){l.b4DragOut(o,h[j].id);l.onDragOut(o,h[j].id)}for(j=0,n=d.length;j<n;++j){l.onDragEnter(o,d[j].id)}for(j=0,n=m.length;j<n;++j){l.b4DragOver(o,m[j].id);l.onDragOver(o,m[j].id)}for(j=0,n=k.length;j<n;++j){l.b4DragDrop(o,k[j].id);l.onDragDrop(o,k[j].id)}}if(r&&!k.length){l.onInvalidDrop(o)}},getZIndex:function(c){var b=document.body,d,e=-1;c=Ext.getDom(c);while(c!==b){if(!isNaN(d=Number(Ext.fly(c).getStyle("zIndex")))){e=d}c=c.parentNode}return e},byZIndex:function(c,b){return c.zIndex<b.zIndex},getBestMatch:function(d){var g=null;var c=d.length;if(c==1){g=d[0]}else{for(var e=0;e<c;++e){var b=d[e];if(b.cursorIsOver){g=b;break}else{if(!g||g.overlap.getArea()<b.overlap.getArea()){g=b}}}}return g},refreshCache:function(c){for(var b in c){if("string"!=typeof b){continue}for(var d in this.ids[b]){var e=this.ids[b][d];if(this.isTypeOfDD(e)){var g=this.getLocation(e);if(g){this.locationCache[e.id]=g}else{delete this.locationCache[e.id]}}}}},verifyEl:function(c){if(c){var b;if(Ext.isIE){try{b=c.offsetParent}catch(d){}}else{b=c.offsetParent}if(b){return true}}return false},getLocation:function(j){if(!this.isTypeOfDD(j)){return null}var h=j.getEl(),o,g,d,q,p,s,c,n,i,m;try{o=Ext.lib.Dom.getXY(h)}catch(k){}if(!o){return null}g=o[0];d=g+h.offsetWidth;q=o[1];p=q+h.offsetHeight;s=q-j.padding[0];c=d+j.padding[1];n=p+j.padding[2];i=g-j.padding[3];return new Ext.lib.Region(s,c,n,i)},isOverTarget:function(k,b,d){var g=this.locationCache[b.id];if(!g||!this.useCache){g=this.getLocation(b);this.locationCache[b.id]=g}if(!g){return false}b.cursorIsOver=g.contains(k);var j=this.dragCurrent;if(!j||!j.getTargetCoord||(!d&&!j.constrainX&&!j.constrainY)){return b.cursorIsOver}b.overlap=null;var h=j.getTargetCoord(k.x,k.y);var c=j.getDragEl();var e=new Ext.lib.Region(h.y,h.x+c.offsetWidth,h.y+c.offsetHeight,h.x);var i=e.intersect(g);if(i){b.overlap=i;return(d)?true:b.cursorIsOver}else{return false}},_onUnload:function(c,b){a.removeListener(document,"mouseup",this.handleMouseUp,this);a.removeListener(document,"mousemove",this.handleMouseMove,this);a.removeListener(window,"resize",this._onResize,this);Ext.dd.DragDropMgr.unregAll()},unregAll:function(){if(this.dragCurrent){this.stopDrag();this.dragCurrent=null}this._execOnAll("unreg",[]);for(var b in this.elementCache){delete this.elementCache[b]}this.elementCache={};this.ids={}},elementCache:{},getElWrapper:function(c){var b=this.elementCache[c];if(!b||!b.el){b=this.elementCache[c]=new this.ElementWrapper(Ext.getDom(c))}return b},getElement:function(b){return Ext.getDom(b)},getCss:function(c){var b=Ext.getDom(c);return(b)?b.style:null},ElementWrapper:function(b){this.el=b||null;this.id=this.el&&b.id;this.css=this.el&&b.style},getPosX:function(b){return Ext.lib.Dom.getX(b)},getPosY:function(b){return Ext.lib.Dom.getY(b)},swapNode:function(d,b){if(d.swapNode){d.swapNode(b)}else{var e=b.parentNode;var c=b.nextSibling;if(c==d){e.insertBefore(d,b)}else{if(b==d.nextSibling){e.insertBefore(b,d)}else{d.parentNode.replaceChild(b,d);e.insertBefore(d,c)}}}},getScroll:function(){var d,b,e=document.documentElement,c=document.body;if(e&&(e.scrollTop||e.scrollLeft)){d=e.scrollTop;b=e.scrollLeft}else{if(c){d=c.scrollTop;b=c.scrollLeft}else{}}return{top:d,left:b}},getStyle:function(c,b){return Ext.fly(c).getStyle(b)},getScrollTop:function(){return this.getScroll().top},getScrollLeft:function(){return this.getScroll().left},moveToEl:function(b,d){var c=Ext.lib.Dom.getXY(d);Ext.lib.Dom.setXY(b,c)},numericSort:function(d,c){return(d-c)},_timeoutCount:0,_addListeners:function(){var b=Ext.dd.DDM;if(Ext.lib.Event&&document){b._onLoad()}else{if(b._timeoutCount>2000){}else{setTimeout(b._addListeners,10);if(document&&document.body){b._timeoutCount+=1}}}},handleWasClicked:function(b,d){if(this.isHandle(d,b.id)){return true}else{var c=b.parentNode;while(c){if(this.isHandle(d,c.id)){return true}else{c=c.parentNode}}}return false}}}();Ext.dd.DDM=Ext.dd.DragDropMgr;Ext.dd.DDM._addListeners()}Ext.dd.DD=function(c,a,b){if(c){this.init(c,a,b)}};Ext.extend(Ext.dd.DD,Ext.dd.DragDrop,{scroll:true,autoOffset:function(c,b){var a=c-this.startPageX;var d=b-this.startPageY;this.setDelta(a,d)},setDelta:function(b,a){this.deltaX=b;this.deltaY=a},setDragElPos:function(c,b){var a=this.getDragEl();this.alignElWithMouse(a,c,b)},alignElWithMouse:function(c,h,g){var e=this.getTargetCoord(h,g);var b=c.dom?c:Ext.fly(c,"_dd");if(!this.deltaSetXY){var i=[e.x,e.y];b.setXY(i);var d=b.getLeft(true);var a=b.getTop(true);this.deltaSetXY=[d-e.x,a-e.y]}else{b.setLeftTop(e.x+this.deltaSetXY[0],e.y+this.deltaSetXY[1])}this.cachePosition(e.x,e.y);this.autoScroll(e.x,e.y,c.offsetHeight,c.offsetWidth);return e},cachePosition:function(b,a){if(b){this.lastPageX=b;this.lastPageY=a}else{var c=Ext.lib.Dom.getXY(this.getEl());this.lastPageX=c[0];this.lastPageY=c[1]}},autoScroll:function(l,k,e,m){if(this.scroll){var n=Ext.lib.Dom.getViewHeight();var b=Ext.lib.Dom.getViewWidth();var p=this.DDM.getScrollTop();var d=this.DDM.getScrollLeft();var j=e+k;var o=m+l;var i=(n+p-k-this.deltaY);var g=(b+d-l-this.deltaX);var c=40;var a=(document.all)?80:30;if(j>n&&i<c){window.scrollTo(d,p+a)}if(k<p&&p>0&&k-p<c){window.scrollTo(d,p-a)}if(o>b&&g<c){window.scrollTo(d+a,p)}if(l<d&&d>0&&l-d<c){window.scrollTo(d-a,p)}}},getTargetCoord:function(c,b){var a=c-this.deltaX;var d=b-this.deltaY;if(this.constrainX){if(a<this.minX){a=this.minX}if(a>this.maxX){a=this.maxX}}if(this.constrainY){if(d<this.minY){d=this.minY}if(d>this.maxY){d=this.maxY}}a=this.getTick(a,this.xTicks);d=this.getTick(d,this.yTicks);return{x:a,y:d}},applyConfig:function(){Ext.dd.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false)},b4MouseDown:function(a){this.autoOffset(a.getPageX(),a.getPageY())},b4Drag:function(a){this.setDragElPos(a.getPageX(),a.getPageY())},toString:function(){return("DD "+this.id)}});Ext.dd.DDProxy=function(c,a,b){if(c){this.init(c,a,b);this.initFrame()}};Ext.dd.DDProxy.dragElId="ygddfdiv";Ext.extend(Ext.dd.DDProxy,Ext.dd.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var b=this;var a=document.body;if(!a||!a.firstChild){setTimeout(function(){b.createFrame()},50);return}var d=this.getDragEl();if(!d){d=document.createElement("div");d.id=this.dragElId;var c=d.style;c.position="absolute";c.visibility="hidden";c.cursor="move";c.border="2px solid #aaa";c.zIndex=999;a.insertBefore(d,a.firstChild)}},initFrame:function(){this.createFrame()},applyConfig:function(){Ext.dd.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||Ext.dd.DDProxy.dragElId)},showFrame:function(e,d){var c=this.getEl();var a=this.getDragEl();var b=a.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(b.width,10)/2),Math.round(parseInt(b.height,10)/2))}this.setDragElPos(e,d);Ext.fly(a).show()},_resizeProxy:function(){if(this.resizeFrame){var a=this.getEl();Ext.fly(this.getDragEl()).setSize(a.offsetWidth,a.offsetHeight)}},b4MouseDown:function(b){var a=b.getPageX();var c=b.getPageY();this.autoOffset(a,c);this.setDragElPos(a,c)},b4StartDrag:function(a,b){this.showFrame(a,b)},b4EndDrag:function(a){Ext.fly(this.getDragEl()).hide()},endDrag:function(c){var b=this.getEl();var a=this.getDragEl();a.style.visibility="";this.beforeMove();b.style.visibility="hidden";Ext.dd.DDM.moveToEl(b,a);a.style.visibility="hidden";b.style.visibility="";this.afterDrag()},beforeMove:function(){},afterDrag:function(){},toString:function(){return("DDProxy "+this.id)}});Ext.dd.DDTarget=function(c,a,b){if(c){this.initTarget(c,a,b)}};Ext.extend(Ext.dd.DDTarget,Ext.dd.DragDrop,{getDragEl:Ext.emptyFn,isValidHandleChild:Ext.emptyFn,startDrag:Ext.emptyFn,endDrag:Ext.emptyFn,onDrag:Ext.emptyFn,onDragDrop:Ext.emptyFn,onDragEnter:Ext.emptyFn,onDragOut:Ext.emptyFn,onDragOver:Ext.emptyFn,onInvalidDrop:Ext.emptyFn,onMouseDown:Ext.emptyFn,onMouseUp:Ext.emptyFn,setXConstraint:Ext.emptyFn,setYConstraint:Ext.emptyFn,resetConstraints:Ext.emptyFn,clearConstraints:Ext.emptyFn,clearTicks:Ext.emptyFn,setInitPosition:Ext.emptyFn,setDragElId:Ext.emptyFn,setHandleElId:Ext.emptyFn,setOuterHandleElId:Ext.emptyFn,addInvalidHandleClass:Ext.emptyFn,addInvalidHandleId:Ext.emptyFn,addInvalidHandleType:Ext.emptyFn,removeInvalidHandleClass:Ext.emptyFn,removeInvalidHandleId:Ext.emptyFn,removeInvalidHandleType:Ext.emptyFn,toString:function(){return("DDTarget "+this.id)}});Ext.dd.DragTracker=Ext.extend(Ext.util.Observable,{active:false,tolerance:5,autoStart:false,constructor:function(a){Ext.apply(this,a);this.addEvents("mousedown","mouseup","mousemove","dragstart","dragend","drag");this.dragRegion=new Ext.lib.Region(0,0,0,0);if(this.el){this.initEl(this.el)}Ext.dd.DragTracker.superclass.constructor.call(this,a)},initEl:function(a){this.el=Ext.get(a);a.on("mousedown",this.onMouseDown,this,this.delegate?{delegate:this.delegate}:undefined)},destroy:function(){this.el.un("mousedown",this.onMouseDown,this);delete this.el},onMouseDown:function(b,a){if(this.fireEvent("mousedown",this,b)!==false&&this.onBeforeStart(b)!==false){this.startXY=this.lastXY=b.getXY();this.dragTarget=this.delegate?a:this.el.dom;if(this.preventDefault!==false){b.preventDefault()}Ext.getDoc().on({scope:this,mouseup:this.onMouseUp,mousemove:this.onMouseMove,selectstart:this.stopSelect});if(this.autoStart){this.timer=this.triggerStart.defer(this.autoStart===true?1000:this.autoStart,this,[b])}}},onMouseMove:function(g,d){var b=Ext.isIE6||Ext.isIE7||Ext.isIE8;if(this.active&&b&&!g.browserEvent.button){g.preventDefault();this.onMouseUp(g);return}g.preventDefault();var c=g.getXY(),a=this.startXY;this.lastXY=c;if(!this.active){if(Math.abs(a[0]-c[0])>this.tolerance||Math.abs(a[1]-c[1])>this.tolerance){this.triggerStart(g)}else{return}}this.fireEvent("mousemove",this,g);this.onDrag(g);this.fireEvent("drag",this,g)},onMouseUp:function(c){var b=Ext.getDoc(),a=this.active;b.un("mousemove",this.onMouseMove,this);b.un("mouseup",this.onMouseUp,this);b.un("selectstart",this.stopSelect,this);c.preventDefault();this.clearStart();this.active=false;delete this.elRegion;this.fireEvent("mouseup",this,c);if(a){this.onEnd(c);this.fireEvent("dragend",this,c)}},triggerStart:function(a){this.clearStart();this.active=true;this.onStart(a);this.fireEvent("dragstart",this,a)},clearStart:function(){if(this.timer){clearTimeout(this.timer);delete this.timer}},stopSelect:function(a){a.stopEvent();return false},onBeforeStart:function(a){},onStart:function(a){},onDrag:function(a){},onEnd:function(a){},getDragTarget:function(){return this.dragTarget},getDragCt:function(){return this.el},getXY:function(a){return a?this.constrainModes[a].call(this,this.lastXY):this.lastXY},getOffset:function(c){var b=this.getXY(c),a=this.startXY;return[a[0]-b[0],a[1]-b[1]]},constrainModes:{point:function(b){if(!this.elRegion){this.elRegion=this.getDragCt().getRegion()}var a=this.dragRegion;a.left=b[0];a.top=b[1];a.right=b[0];a.bottom=b[1];a.constrainTo(this.elRegion);return[a.left,a.top]}}});Ext.dd.ScrollManager=function(){var c=Ext.dd.DragDropMgr;var e={};var b=null;var i={};var h=function(l){b=null;a()};var j=function(){if(c.dragCurrent){c.refreshCache(c.dragCurrent.groups)}};var d=function(){if(c.dragCurrent){var l=Ext.dd.ScrollManager;var m=i.el.ddScrollConfig?i.el.ddScrollConfig.increment:l.increment;if(!l.animate){if(i.el.scroll(i.dir,m)){j()}}else{i.el.scroll(i.dir,m,true,l.animDuration,j)}}};var a=function(){if(i.id){clearInterval(i.id)}i.id=0;i.el=null;i.dir=""};var g=function(m,l){a();i.el=m;i.dir=l;var o=m.ddScrollConfig?m.ddScrollConfig.ddGroup:undefined,n=(m.ddScrollConfig&&m.ddScrollConfig.frequency)?m.ddScrollConfig.frequency:Ext.dd.ScrollManager.frequency;if(o===undefined||c.dragCurrent.ddGroup==o){i.id=setInterval(d,n)}};var k=function(o,q){if(q||!c.dragCurrent){return}var s=Ext.dd.ScrollManager;if(!b||b!=c.dragCurrent){b=c.dragCurrent;s.refreshCache()}var t=Ext.lib.Event.getXY(o);var u=new Ext.lib.Point(t[0],t[1]);for(var m in e){var n=e[m],l=n._region;var p=n.ddScrollConfig?n.ddScrollConfig:s;if(l&&l.contains(u)&&n.isScrollable()){if(l.bottom-u.y<=p.vthresh){if(i.el!=n){g(n,"down")}return}else{if(l.right-u.x<=p.hthresh){if(i.el!=n){g(n,"left")}return}else{if(u.y-l.top<=p.vthresh){if(i.el!=n){g(n,"up")}return}else{if(u.x-l.left<=p.hthresh){if(i.el!=n){g(n,"right")}return}}}}}}a()};c.fireEvents=c.fireEvents.createSequence(k,c);c.stopDrag=c.stopDrag.createSequence(h,c);return{register:function(n){if(Ext.isArray(n)){for(var m=0,l=n.length;m<l;m++){this.register(n[m])}}else{n=Ext.get(n);e[n.id]=n}},unregister:function(n){if(Ext.isArray(n)){for(var m=0,l=n.length;m<l;m++){this.unregister(n[m])}}else{n=Ext.get(n);delete e[n.id]}},vthresh:25,hthresh:25,increment:100,frequency:500,animate:true,animDuration:0.4,ddGroup:undefined,refreshCache:function(){for(var l in e){if(typeof e[l]=="object"){e[l]._region=e[l].getRegion()}}}}}();Ext.dd.Registry=function(){var d={};var b={};var a=0;var c=function(g,e){if(typeof g=="string"){return g}var h=g.id;if(!h&&e!==false){h="extdd-"+(++a);g.id=h}return h};return{register:function(j,k){k=k||{};if(typeof j=="string"){j=document.getElementById(j)}k.ddel=j;d[c(j)]=k;if(k.isHandle!==false){b[k.ddel.id]=k}if(k.handles){var h=k.handles;for(var g=0,e=h.length;g<e;g++){b[c(h[g])]=k}}},unregister:function(j){var l=c(j,false);var k=d[l];if(k){delete d[l];if(k.handles){var h=k.handles;for(var g=0,e=h.length;g<e;g++){delete b[c(h[g],false)]}}}},getHandle:function(e){if(typeof e!="string"){e=e.id}return b[e]},getHandleFromEvent:function(h){var g=Ext.lib.Event.getTarget(h);return g?b[g.id]:null},getTarget:function(e){if(typeof e!="string"){e=e.id}return d[e]},getTargetFromEvent:function(h){var g=Ext.lib.Event.getTarget(h);return g?d[g.id]||b[g.id]:null}}}();Ext.dd.StatusProxy=function(a){Ext.apply(this,a);this.id=this.id||Ext.id();this.el=new Ext.Layer({dh:{id:this.id,tag:"div",cls:"x-dd-drag-proxy "+this.dropNotAllowed,children:[{tag:"div",cls:"x-dd-drop-icon"},{tag:"div",cls:"x-dd-drag-ghost"}]},shadow:!a||a.shadow!==false});this.ghost=Ext.get(this.el.dom.childNodes[1]);this.dropStatus=this.dropNotAllowed};Ext.dd.StatusProxy.prototype={dropAllowed:"x-dd-drop-ok",dropNotAllowed:"x-dd-drop-nodrop",setStatus:function(a){a=a||this.dropNotAllowed;if(this.dropStatus!=a){this.el.replaceClass(this.dropStatus,a);this.dropStatus=a}},reset:function(a){this.el.dom.className="x-dd-drag-proxy "+this.dropNotAllowed;this.dropStatus=this.dropNotAllowed;if(a){this.ghost.update("")}},update:function(a){if(typeof a=="string"){this.ghost.update(a)}else{this.ghost.update("");a.style.margin="0";this.ghost.dom.appendChild(a)}var b=this.ghost.dom.firstChild;if(b){Ext.fly(b).setStyle("float","none")}},getEl:function(){return this.el},getGhost:function(){return this.ghost},hide:function(a){this.el.hide();if(a){this.reset(true)}},stop:function(){if(this.anim&&this.anim.isAnimated&&this.anim.isAnimated()){this.anim.stop()}},show:function(){this.el.show()},sync:function(){this.el.sync()},repair:function(b,c,a){this.callback=c;this.scope=a;if(b&&this.animRepair!==false){this.el.addClass("x-dd-drag-repair");this.el.hideUnders(true);this.anim=this.el.shift({duration:this.repairDuration||0.5,easing:"easeOut",xy:b,stopFx:true,callback:this.afterRepair,scope:this})}else{this.afterRepair()}},afterRepair:function(){this.hide(true);if(typeof this.callback=="function"){this.callback.call(this.scope||this)}this.callback=null;this.scope=null},destroy:function(){Ext.destroy(this.ghost,this.el)}};Ext.dd.DragSource=function(b,a){this.el=Ext.get(b);if(!this.dragData){this.dragData={}}Ext.apply(this,a);if(!this.proxy){this.proxy=new Ext.dd.StatusProxy()}Ext.dd.DragSource.superclass.constructor.call(this,this.el.dom,this.ddGroup||this.group,{dragElId:this.proxy.id,resizeFrame:false,isTarget:false,scroll:this.scroll===true});this.dragging=false};Ext.extend(Ext.dd.DragSource,Ext.dd.DDProxy,{dropAllowed:"x-dd-drop-ok",dropNotAllowed:"x-dd-drop-nodrop",getDragData:function(a){return this.dragData},onDragEnter:function(c,d){var b=Ext.dd.DragDropMgr.getDDById(d);this.cachedTarget=b;if(this.beforeDragEnter(b,c,d)!==false){if(b.isNotifyTarget){var a=b.notifyEnter(this,c,this.dragData);this.proxy.setStatus(a)}else{this.proxy.setStatus(this.dropAllowed)}if(this.afterDragEnter){this.afterDragEnter(b,c,d)}}},beforeDragEnter:function(b,a,c){return true},alignElWithMouse:function(){Ext.dd.DragSource.superclass.alignElWithMouse.apply(this,arguments);this.proxy.sync()},onDragOver:function(c,d){var b=this.cachedTarget||Ext.dd.DragDropMgr.getDDById(d);if(this.beforeDragOver(b,c,d)!==false){if(b.isNotifyTarget){var a=b.notifyOver(this,c,this.dragData);this.proxy.setStatus(a)}if(this.afterDragOver){this.afterDragOver(b,c,d)}}},beforeDragOver:function(b,a,c){return true},onDragOut:function(b,c){var a=this.cachedTarget||Ext.dd.DragDropMgr.getDDById(c);if(this.beforeDragOut(a,b,c)!==false){if(a.isNotifyTarget){a.notifyOut(this,b,this.dragData)}this.proxy.reset();if(this.afterDragOut){this.afterDragOut(a,b,c)}}this.cachedTarget=null},beforeDragOut:function(b,a,c){return true},onDragDrop:function(b,c){var a=this.cachedTarget||Ext.dd.DragDropMgr.getDDById(c);if(this.beforeDragDrop(a,b,c)!==false){if(a.isNotifyTarget){if(a.notifyDrop(this,b,this.dragData)){this.onValidDrop(a,b,c)}else{this.onInvalidDrop(a,b,c)}}else{this.onValidDrop(a,b,c)}if(this.afterDragDrop){this.afterDragDrop(a,b,c)}}delete this.cachedTarget},beforeDragDrop:function(b,a,c){return true},onValidDrop:function(b,a,c){this.hideProxy();if(this.afterValidDrop){this.afterValidDrop(b,a,c)}},getRepairXY:function(b,a){return this.el.getXY()},onInvalidDrop:function(b,a,c){this.beforeInvalidDrop(b,a,c);if(this.cachedTarget){if(this.cachedTarget.isNotifyTarget){this.cachedTarget.notifyOut(this,a,this.dragData)}this.cacheTarget=null}this.proxy.repair(this.getRepairXY(a,this.dragData),this.afterRepair,this);if(this.afterInvalidDrop){this.afterInvalidDrop(a,c)}},afterRepair:function(){if(Ext.enableFx){this.el.highlight(this.hlColor||"c3daf9")}this.dragging=false},beforeInvalidDrop:function(b,a,c){return true},handleMouseDown:function(b){if(this.dragging){return}var a=this.getDragData(b);if(a&&this.onBeforeDrag(a,b)!==false){this.dragData=a;this.proxy.stop();Ext.dd.DragSource.superclass.handleMouseDown.apply(this,arguments)}},onBeforeDrag:function(a,b){return true},onStartDrag:Ext.emptyFn,startDrag:function(a,b){this.proxy.reset();this.dragging=true;this.proxy.update("");this.onInitDrag(a,b);this.proxy.show()},onInitDrag:function(a,c){var b=this.el.dom.cloneNode(true);b.id=Ext.id();this.proxy.update(b);this.onStartDrag(a,c);return true},getProxy:function(){return this.proxy},hideProxy:function(){this.proxy.hide();this.proxy.reset(true);this.dragging=false},triggerCacheRefresh:function(){Ext.dd.DDM.refreshCache(this.groups)},b4EndDrag:function(a){},endDrag:function(a){this.onEndDrag(this.dragData,a)},onEndDrag:function(a,b){},autoOffset:function(a,b){this.setDelta(-12,-20)},destroy:function(){Ext.dd.DragSource.superclass.destroy.call(this);Ext.destroy(this.proxy)}});Ext.dd.DropTarget=Ext.extend(Ext.dd.DDTarget,{constructor:function(b,a){this.el=Ext.get(b);Ext.apply(this,a);if(this.containerScroll){Ext.dd.ScrollManager.register(this.el)}Ext.dd.DropTarget.superclass.constructor.call(this,this.el.dom,this.ddGroup||this.group,{isTarget:true})},dropAllowed:"x-dd-drop-ok",dropNotAllowed:"x-dd-drop-nodrop",isTarget:true,isNotifyTarget:true,notifyEnter:function(a,c,b){if(this.overClass){this.el.addClass(this.overClass)}return this.dropAllowed},notifyOver:function(a,c,b){return this.dropAllowed},notifyOut:function(a,c,b){if(this.overClass){this.el.removeClass(this.overClass)}},notifyDrop:function(a,c,b){return false},destroy:function(){Ext.dd.DropTarget.superclass.destroy.call(this);if(this.containerScroll){Ext.dd.ScrollManager.unregister(this.el)}}});Ext.dd.DragZone=Ext.extend(Ext.dd.DragSource,{constructor:function(b,a){Ext.dd.DragZone.superclass.constructor.call(this,b,a);if(this.containerScroll){Ext.dd.ScrollManager.register(this.el)}},getDragData:function(a){return Ext.dd.Registry.getHandleFromEvent(a)},onInitDrag:function(a,b){this.proxy.update(this.dragData.ddel.cloneNode(true));this.onStartDrag(a,b);return true},afterRepair:function(){if(Ext.enableFx){Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor||"c3daf9")}this.dragging=false},getRepairXY:function(a){return Ext.Element.fly(this.dragData.ddel).getXY()},destroy:function(){Ext.dd.DragZone.superclass.destroy.call(this);if(this.containerScroll){Ext.dd.ScrollManager.unregister(this.el)}}});Ext.dd.DropZone=function(b,a){Ext.dd.DropZone.superclass.constructor.call(this,b,a)};Ext.extend(Ext.dd.DropZone,Ext.dd.DropTarget,{getTargetFromEvent:function(a){return Ext.dd.Registry.getTargetFromEvent(a)},onNodeEnter:function(d,a,c,b){},onNodeOver:function(d,a,c,b){return this.dropAllowed},onNodeOut:function(d,a,c,b){},onNodeDrop:function(d,a,c,b){return false},onContainerOver:function(a,c,b){return this.dropNotAllowed},onContainerDrop:function(a,c,b){return false},notifyEnter:function(a,c,b){return this.dropNotAllowed},notifyOver:function(a,c,b){var d=this.getTargetFromEvent(c);if(!d){if(this.lastOverNode){this.onNodeOut(this.lastOverNode,a,c,b);this.lastOverNode=null}return this.onContainerOver(a,c,b)}if(this.lastOverNode!=d){if(this.lastOverNode){this.onNodeOut(this.lastOverNode,a,c,b)}this.onNodeEnter(d,a,c,b);this.lastOverNode=d}return this.onNodeOver(d,a,c,b)},notifyOut:function(a,c,b){if(this.lastOverNode){this.onNodeOut(this.lastOverNode,a,c,b);this.lastOverNode=null}},notifyDrop:function(a,c,b){if(this.lastOverNode){this.onNodeOut(this.lastOverNode,a,c,b);this.lastOverNode=null}var d=this.getTargetFromEvent(c);return d?this.onNodeDrop(d,a,c,b):this.onContainerDrop(a,c,b)},triggerCacheRefresh:function(){Ext.dd.DDM.refreshCache(this.groups)}});Ext.Element.addMethods({initDD:function(c,b,d){var a=new Ext.dd.DD(Ext.id(this.dom),c,b);return Ext.apply(a,d)},initDDProxy:function(c,b,d){var a=new Ext.dd.DDProxy(Ext.id(this.dom),c,b);return Ext.apply(a,d)},initDDTarget:function(c,b,d){var a=new Ext.dd.DDTarget(Ext.id(this.dom),c,b);return Ext.apply(a,d)}});Ext.data.Api=(function(){var a={};return{actions:{create:"create",read:"read",update:"update",destroy:"destroy"},restActions:{create:"POST",read:"GET",update:"PUT",destroy:"DELETE"},isAction:function(b){return(Ext.data.Api.actions[b])?true:false},getVerb:function(b){if(a[b]){return a[b]}for(var c in this.actions){if(this.actions[c]===b){a[b]=c;break}}return(a[b]!==undefined)?a[b]:null},isValid:function(b){var e=[];var d=this.actions;for(var c in b){if(!(c in d)){e.push(c)}}return(!e.length)?true:e},hasUniqueUrl:function(c,g){var b=(c.api[g])?c.api[g].url:null;var e=true;for(var d in c.api){if((e=(d===g)?true:(c.api[d].url!=b)?true:false)===false){break}}return e},prepare:function(b){if(!b.api){b.api={}}for(var d in this.actions){var c=this.actions[d];b.api[c]=b.api[c]||b.url||b.directFn;if(typeof(b.api[c])=="string"){b.api[c]={url:b.api[c],method:(b.restful===true)?Ext.data.Api.restActions[c]:undefined}}}},restify:function(b){b.restful=true;for(var c in this.restActions){b.api[this.actions[c]].method||(b.api[this.actions[c]].method=this.restActions[c])}b.onWrite=b.onWrite.createInterceptor(function(i,j,g,e){var d=j.reader;var h=new Ext.data.Response({action:i,raw:g});switch(g.status){case 200:return true;break;case 201:if(Ext.isEmpty(h.raw.responseText)){h.success=true}else{return true}break;case 204:h.success=true;h.data=null;break;default:return true;break}if(h.success===true){this.fireEvent("write",this,i,h.data,h,e,j.request.arg)}else{this.fireEvent("exception",this,"remote",i,j,h,e)}j.request.callback.call(j.request.scope,h.data,h,h.success);return false},b)}}})();Ext.data.Response=function(b,a){Ext.apply(this,b,{raw:a})};Ext.data.Response.prototype={message:null,success:false,status:null,root:null,raw:null,getMessage:function(){return this.message},getSuccess:function(){return this.success},getStatus:function(){return this.status},getRoot:function(){return this.root},getRawResponse:function(){return this.raw}};Ext.data.Api.Error=Ext.extend(Ext.Error,{constructor:function(b,a){this.arg=a;Ext.Error.call(this,b)},name:"Ext.data.Api"});Ext.apply(Ext.data.Api.Error.prototype,{lang:{"action-url-undefined":"No fallback url defined for this action. When defining a DataProxy api, please be sure to define an url for each CRUD action in Ext.data.Api.actions or define a default url in addition to your api-configuration.",invalid:"received an invalid API-configuration. Please ensure your proxy API-configuration contains only the actions defined in Ext.data.Api.actions","invalid-url":"Invalid url. Please review your proxy configuration.",execute:'Attempted to execute an unknown action. Valid API actions are defined in Ext.data.Api.actions"'}});Ext.data.SortTypes={none:function(a){return a},stripTagsRE:/<\/?[^>]+>/gi,asText:function(a){return String(a).replace(this.stripTagsRE,"")},asUCText:function(a){return String(a).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(a){return String(a).toUpperCase()},asDate:function(a){if(!a){return 0}if(Ext.isDate(a)){return a.getTime()}return Date.parse(String(a))},asFloat:function(a){var b=parseFloat(String(a).replace(/,/g,""));return isNaN(b)?0:b},asInt:function(a){var b=parseInt(String(a).replace(/,/g,""),10);return isNaN(b)?0:b}};Ext.data.Record=function(a,b){this.id=(b||b===0)?b:Ext.data.Record.id(this);this.data=a||{}};Ext.data.Record.create=function(e){var c=Ext.extend(Ext.data.Record,{});var d=c.prototype;d.fields=new Ext.util.MixedCollection(false,function(g){return g.name});for(var b=0,a=e.length;b<a;b++){d.fields.add(new Ext.data.Field(e[b]))}c.getField=function(g){return d.fields.get(g)};return c};Ext.data.Record.PREFIX="ext-record";Ext.data.Record.AUTO_ID=1;Ext.data.Record.EDIT="edit";Ext.data.Record.REJECT="reject";Ext.data.Record.COMMIT="commit";Ext.data.Record.id=function(a){a.phantom=true;return[Ext.data.Record.PREFIX,"-",Ext.data.Record.AUTO_ID++].join("")};Ext.data.Record.prototype={dirty:false,editing:false,error:null,modified:null,phantom:false,join:function(a){this.store=a},set:function(a,c){var b=Ext.isPrimitive(c)?String:Ext.encode;if(b(this.data[a])==b(c)){return}this.dirty=true;if(!this.modified){this.modified={}}if(this.modified[a]===undefined){this.modified[a]=this.data[a]}this.data[a]=c;if(!this.editing){this.afterEdit()}},afterEdit:function(){if(this.store!=undefined&&typeof this.store.afterEdit=="function"){this.store.afterEdit(this)}},afterReject:function(){if(this.store){this.store.afterReject(this)}},afterCommit:function(){if(this.store){this.store.afterCommit(this)}},get:function(a){return this.data[a]},beginEdit:function(){this.editing=true;this.modified=this.modified||{}},cancelEdit:function(){this.editing=false;delete this.modified},endEdit:function(){this.editing=false;if(this.dirty){this.afterEdit()}},reject:function(b){var a=this.modified;for(var c in a){if(typeof a[c]!="function"){this.data[c]=a[c]}}this.dirty=false;delete this.modified;this.editing=false;if(b!==true){this.afterReject()}},commit:function(a){this.dirty=false;delete this.modified;this.editing=false;if(a!==true){this.afterCommit()}},getChanges:function(){var a=this.modified,b={};for(var c in a){if(a.hasOwnProperty(c)){b[c]=this.data[c]}}return b},hasError:function(){return this.error!==null},clearError:function(){this.error=null},copy:function(a){return new this.constructor(Ext.apply({},this.data),a||this.id)},isModified:function(a){return !!(this.modified&&this.modified.hasOwnProperty(a))},isValid:function(){return this.fields.find(function(a){return(a.allowBlank===false&&Ext.isEmpty(this.data[a.name]))?true:false},this)?false:true},markDirty:function(){this.dirty=true;if(!this.modified){this.modified={}}this.fields.each(function(a){this.modified[a.name]=this.data[a.name]},this)}};Ext.StoreMgr=Ext.apply(new Ext.util.MixedCollection(),{register:function(){for(var a=0,b;(b=arguments[a]);a++){this.add(b)}},unregister:function(){for(var a=0,b;(b=arguments[a]);a++){this.remove(this.lookup(b))}},lookup:function(e){if(Ext.isArray(e)){var b=["field1"],d=!Ext.isArray(e[0]);if(!d){for(var c=2,a=e[0].length;c<=a;++c){b.push("field"+c)}}return new Ext.data.ArrayStore({fields:b,data:e,expandData:d,autoDestroy:true,autoCreated:true})}return Ext.isObject(e)?(e.events?e:Ext.create(e,"store")):this.get(e)},getKey:function(a){return a.storeId}});Ext.data.Store=Ext.extend(Ext.util.Observable,{writer:undefined,remoteSort:false,autoDestroy:false,pruneModifiedRecords:false,lastOptions:null,autoSave:true,batch:true,restful:false,paramNames:undefined,defaultParamNames:{start:"start",limit:"limit",sort:"sort",dir:"dir"},isDestroyed:false,hasMultiSort:false,batchKey:"_ext_batch_",constructor:function(a){this.data=new Ext.util.MixedCollection(false);this.data.getKey=function(b){return b.id};this.removed=[];if(a&&a.data){this.inlineData=a.data;delete a.data}Ext.apply(this,a);this.baseParams=Ext.isObject(this.baseParams)?this.baseParams:{};this.paramNames=Ext.applyIf(this.paramNames||{},this.defaultParamNames);if((this.url||this.api)&&!this.proxy){this.proxy=new Ext.data.HttpProxy({url:this.url,api:this.api})}if(this.restful===true&&this.proxy){this.batch=false;Ext.data.Api.restify(this.proxy)}if(this.reader){if(!this.recordType){this.recordType=this.reader.recordType}if(this.reader.onMetaChange){this.reader.onMetaChange=this.reader.onMetaChange.createSequence(this.onMetaChange,this)}if(this.writer){if(this.writer instanceof (Ext.data.DataWriter)===false){this.writer=this.buildWriter(this.writer)}this.writer.meta=this.reader.meta;this.pruneModifiedRecords=true}}if(this.recordType){this.fields=this.recordType.prototype.fields}this.modified=[];this.addEvents("datachanged","metachange","add","remove","update","clear","exception","beforeload","load","loadexception","beforewrite","write","beforesave","save");if(this.proxy){this.relayEvents(this.proxy,["loadexception","exception"])}if(this.writer){this.on({scope:this,add:this.createRecords,remove:this.destroyRecord,update:this.updateRecord,clear:this.onClear})}this.sortToggle={};if(this.sortField){this.setDefaultSort(this.sortField,this.sortDir)}else{if(this.sortInfo){this.setDefaultSort(this.sortInfo.field,this.sortInfo.direction)}}Ext.data.Store.superclass.constructor.call(this);if(this.id){this.storeId=this.id;delete this.id}if(this.storeId){Ext.StoreMgr.register(this)}if(this.inlineData){this.loadData(this.inlineData);delete this.inlineData}else{if(this.autoLoad){this.load.defer(10,this,[typeof this.autoLoad=="object"?this.autoLoad:undefined])}}this.batchCounter=0;this.batches={}},buildWriter:function(b){var a=undefined,c=(b.format||"json").toLowerCase();switch(c){case"json":a=Ext.data.JsonWriter;break;case"xml":a=Ext.data.XmlWriter;break;default:a=Ext.data.JsonWriter}return new a(b)},destroy:function(){if(!this.isDestroyed){if(this.storeId){Ext.StoreMgr.unregister(this)}this.clearData();this.data=null;Ext.destroy(this.proxy);this.reader=this.writer=null;this.purgeListeners();this.isDestroyed=true}},add:function(c){var e,a,b,d;c=[].concat(c);if(c.length<1){return}for(e=0,a=c.length;e<a;e++){b=c[e];b.join(this);if(b.dirty||b.phantom){this.modified.push(b)}}d=this.data.length;this.data.addAll(c);if(this.snapshot){this.snapshot.addAll(c)}this.fireEvent("add",this,c,d)},addSorted:function(a){var b=this.findInsertIndex(a);this.insert(b,a)},doUpdate:function(a){var b=a.id;this.getById(b).join(null);this.data.replace(b,a);if(this.snapshot){this.snapshot.replace(b,a)}a.join(this);this.fireEvent("update",this,a,Ext.data.Record.COMMIT)},remove:function(a){if(Ext.isArray(a)){Ext.each(a,function(c){this.remove(c)},this);return}var b=this.data.indexOf(a);if(b>-1){a.join(null);this.data.removeAt(b)}if(this.pruneModifiedRecords){this.modified.remove(a)}if(this.snapshot){this.snapshot.remove(a)}if(b>-1){this.fireEvent("remove",this,a,b)}},removeAt:function(a){this.remove(this.getAt(a))},removeAll:function(b){var a=[];this.each(function(c){a.push(c)});this.clearData();if(this.snapshot){this.snapshot.clear()}if(this.pruneModifiedRecords){this.modified=[]}if(b!==true){this.fireEvent("clear",this,a)}},onClear:function(b,a){Ext.each(a,function(d,c){this.destroyRecord(this,d,c)},this)},insert:function(d,c){var e,a,b;c=[].concat(c);for(e=0,a=c.length;e<a;e++){b=c[e];this.data.insert(d+e,b);b.join(this);if(b.dirty||b.phantom){this.modified.push(b)}}if(this.snapshot){this.snapshot.addAll(c)}this.fireEvent("add",this,c,d)},indexOf:function(a){return this.data.indexOf(a)},indexOfId:function(a){return this.data.indexOfKey(a)},getById:function(a){return(this.snapshot||this.data).key(a)},getAt:function(a){return this.data.itemAt(a)},getRange:function(b,a){return this.data.getRange(b,a)},storeOptions:function(a){a=Ext.apply({},a);delete a.callback;delete a.scope;this.lastOptions=a},clearData:function(){this.data.each(function(a){a.join(null)});this.data.clear()},load:function(b){b=Ext.apply({},b);this.storeOptions(b);if(this.sortInfo&&this.remoteSort){var a=this.paramNames;b.params=Ext.apply({},b.params);b.params[a.sort]=this.sortInfo.field;b.params[a.dir]=this.sortInfo.direction}try{return this.execute("read",null,b)}catch(c){this.handleException(c);return false}},updateRecord:function(b,a,c){if(c==Ext.data.Record.EDIT&&this.autoSave===true&&(!a.phantom||(a.phantom&&a.isValid()))){this.save()}},createRecords:function(c,b,e){var d=this.modified,h=b.length,a,g;for(g=0;g<h;g++){a=b[g];if(a.phantom&&a.isValid()){a.markDirty();if(d.indexOf(a)==-1){d.push(a)}}}if(this.autoSave===true){this.save()}},destroyRecord:function(b,a,c){if(this.modified.indexOf(a)!=-1){this.modified.remove(a)}if(!a.phantom){this.removed.push(a);a.lastIndex=c;if(this.autoSave===true){this.save()}}},execute:function(e,a,c,b){if(!Ext.data.Api.isAction(e)){throw new Ext.data.Api.Error("execute",e)}c=Ext.applyIf(c||{},{params:{}});if(b!==undefined){this.addToBatch(b)}var d=true;if(e==="read"){d=this.fireEvent("beforeload",this,c);Ext.applyIf(c.params,this.baseParams)}else{if(this.writer.listful===true&&this.restful!==true){a=(Ext.isArray(a))?a:[a]}else{if(Ext.isArray(a)&&a.length==1){a=a.shift()}}if((d=this.fireEvent("beforewrite",this,e,a,c))!==false){this.writer.apply(c.params,this.baseParams,e,a)}}if(d!==false){if(this.writer&&this.proxy.url&&!this.proxy.restful&&!Ext.data.Api.hasUniqueUrl(this.proxy,e)){c.params.xaction=e}this.proxy.request(Ext.data.Api.actions[e],a,c.params,this.reader,this.createCallback(e,a,b),this,c)}return d},save:function(){if(!this.writer){throw new Ext.data.Store.Error("writer-undefined")}var h=[],j,k,e,c={},d;if(this.removed.length){h.push(["destroy",this.removed])}var b=[].concat(this.getModifiedRecords());if(b.length){var g=[];for(d=b.length-1;d>=0;d--){if(b[d].phantom===true){var a=b.splice(d,1).shift();if(a.isValid()){g.push(a)}}else{if(!b[d].isValid()){b.splice(d,1)}}}if(g.length){h.push(["create",g])}if(b.length){h.push(["update",b])}}j=h.length;if(j){e=++this.batchCounter;for(d=0;d<j;++d){k=h[d];c[k[0]]=k[1]}if(this.fireEvent("beforesave",this,c)!==false){for(d=0;d<j;++d){k=h[d];this.doTransaction(k[0],k[1],e)}return e}}return -1},doTransaction:function(e,b,c){function g(h){try{this.execute(e,h,undefined,c)}catch(i){this.handleException(i)}}if(this.batch===false){for(var d=0,a=b.length;d<a;d++){g.call(this,b[d])}}else{g.call(this,b)}},addToBatch:function(c){var a=this.batches,d=this.batchKey+c,e=a[d];if(!e){a[d]=e={id:c,count:0,data:{}}}++e.count},removeFromBatch:function(d,h,g){var c=this.batches,e=this.batchKey+d,i=c[e],a;if(i){a=i.data[h]||[];i.data[h]=a.concat(g);if(i.count===1){g=i.data;delete c[e];this.fireEvent("save",this,d,g)}else{--i.count}}},createCallback:function(c,a,b){var d=Ext.data.Api.actions;return(c=="read")?this.loadRecords:function(g,e,h){this["on"+Ext.util.Format.capitalize(c)+"Records"](h,a,[].concat(g));if(h===true){this.fireEvent("write",this,c,g,e,a)}this.removeFromBatch(b,c,g)}},clearModified:function(a){if(Ext.isArray(a)){for(var b=a.length-1;b>=0;b--){this.modified.splice(this.modified.indexOf(a[b]),1)}}else{this.modified.splice(this.modified.indexOf(a),1)}},reMap:function(b){if(Ext.isArray(b)){for(var d=0,a=b.length;d<a;d++){this.reMap(b[d])}}else{delete this.data.map[b._phid];this.data.map[b.id]=b;var c=this.data.keys.indexOf(b._phid);this.data.keys.splice(c,1,b.id);delete b._phid}},onCreateRecords:function(d,a,b){if(d===true){try{this.reader.realize(a,b)}catch(c){this.handleException(c);if(Ext.isArray(a)){this.onCreateRecords(d,a,b)}}}},onUpdateRecords:function(d,a,b){if(d===true){try{this.reader.update(a,b)}catch(c){this.handleException(c);if(Ext.isArray(a)){this.onUpdateRecords(d,a,b)}}}},onDestroyRecords:function(e,b,d){b=(b instanceof Ext.data.Record)?[b]:[].concat(b);for(var c=0,a=b.length;c<a;c++){this.removed.splice(this.removed.indexOf(b[c]),1)}if(e===false){for(c=b.length-1;c>=0;c--){this.insert(b[c].lastIndex,b[c])}}},handleException:function(a){Ext.handleError(a)},reload:function(a){this.load(Ext.applyIf(a||{},this.lastOptions))},loadRecords:function(b,l,h){var e,g;if(this.isDestroyed===true){return}if(!b||h===false){if(h!==false){this.fireEvent("load",this,[],l)}if(l.callback){l.callback.call(l.scope||this,[],l,false,b)}return}var a=b.records,j=b.totalRecords||a.length;if(!l||l.add!==true){if(this.pruneModifiedRecords){this.modified=[]}for(e=0,g=a.length;e<g;e++){a[e].join(this)}if(this.snapshot){this.data=this.snapshot;delete this.snapshot}this.clearData();this.data.addAll(a);this.totalLength=j;this.applySort();this.fireEvent("datachanged",this)}else{var k=[],d,c=0;for(e=0,g=a.length;e<g;++e){d=a[e];if(this.indexOfId(d.id)>-1){this.doUpdate(d)}else{k.push(d);++c}}this.totalLength=Math.max(j,this.data.length+c);this.add(k)}this.fireEvent("load",this,a,l);if(l.callback){l.callback.call(l.scope||this,a,l,true)}},loadData:function(c,a){var b=this.reader.readRecords(c);this.loadRecords(b,{add:a},true)},getCount:function(){return this.data.length||0},getTotalCount:function(){return this.totalLength||0},getSortState:function(){return this.sortInfo},applySort:function(){if((this.sortInfo||this.multiSortInfo)&&!this.remoteSort){this.sortData()}},sortData:function(){var a=this.hasMultiSort?this.multiSortInfo:this.sortInfo,k=a.direction||"ASC",h=a.sorters,c=[];if(!this.hasMultiSort){h=[{direction:k,field:a.field}]}for(var d=0,b=h.length;d<b;d++){c.push(this.createSortFunction(h[d].field,h[d].direction))}if(c.length==0){return}var g=k.toUpperCase()=="DESC"?-1:1;var e=function(n,m){var l=c[0].call(this,n,m);if(c.length>1){for(var p=1,o=c.length;p<o;p++){l=l||c[p].call(this,n,m)}}return g*l};this.data.sort(k,e);if(this.snapshot&&this.snapshot!=this.data){this.snapshot.sort(k,e)}},createSortFunction:function(c,b){b=b||"ASC";var a=b.toUpperCase()=="DESC"?-1:1;var d=this.fields.get(c).sortType;return function(g,e){var i=d(g.data[c]),h=d(e.data[c]);return a*(i>h?1:(i<h?-1:0))}},setDefaultSort:function(b,a){a=a?a.toUpperCase():"ASC";this.sortInfo={field:b,direction:a};this.sortToggle[b]=a},sort:function(b,a){if(Ext.isArray(arguments[0])){return this.multiSort.call(this,b,a)}else{return this.singleSort(b,a)}},singleSort:function(g,c){var e=this.fields.get(g);if(!e){return false}var b=e.name,a=this.sortInfo||null,d=this.sortToggle?this.sortToggle[b]:null;if(!c){if(a&&a.field==b){c=(this.sortToggle[b]||"ASC").toggle("ASC","DESC")}else{c=e.sortDir}}this.sortToggle[b]=c;this.sortInfo={field:b,direction:c};this.hasMultiSort=false;if(this.remoteSort){if(!this.load(this.lastOptions)){if(d){this.sortToggle[b]=d}if(a){this.sortInfo=a}}}else{this.applySort();this.fireEvent("datachanged",this)}return true},multiSort:function(b,a){this.hasMultiSort=true;a=a||"ASC";if(this.multiSortInfo&&a==this.multiSortInfo.direction){a=a.toggle("ASC","DESC")}this.multiSortInfo={sorters:b,direction:a};if(this.remoteSort){this.singleSort(b[0].field,b[0].direction)}else{this.applySort();this.fireEvent("datachanged",this)}},each:function(b,a){this.data.each(b,a)},getModifiedRecords:function(){return this.modified},sum:function(e,g,a){var c=this.data.items,b=0;g=g||0;a=(a||a===0)?a:c.length-1;for(var d=g;d<=a;d++){b+=(c[d].data[e]||0)}return b},createFilterFn:function(d,c,e,a,b){if(Ext.isEmpty(c,false)){return false}c=this.data.createValueMatcher(c,e,a,b);return function(g){return c.test(g.data[d])}},createMultipleFilterFn:function(a){return function(b){var k=true;for(var d=0,c=a.length;d<c;d++){var h=a[d],g=h.fn,e=h.scope;k=k&&g.call(e,b)}return k}},filter:function(n,m,h,k,e){var l;if(Ext.isObject(n)){n=[n]}if(Ext.isArray(n)){var b=[];for(var g=0,d=n.length;g<d;g++){var a=n[g],c=a.fn,o=a.scope||this;if(!Ext.isFunction(c)){c=this.createFilterFn(a.property,a.value,a.anyMatch,a.caseSensitive,a.exactMatch)}b.push({fn:c,scope:o})}l=this.createMultipleFilterFn(b)}else{l=this.createFilterFn(n,m,h,k,e)}return l?this.filterBy(l):this.clearFilter()},filterBy:function(b,a){this.snapshot=this.snapshot||this.data;this.data=this.queryBy(b,a||this);this.fireEvent("datachanged",this)},clearFilter:function(a){if(this.isFiltered()){this.data=this.snapshot;delete this.snapshot;if(a!==true){this.fireEvent("datachanged",this)}}},isFiltered:function(){return !!this.snapshot&&this.snapshot!=this.data},query:function(d,c,e,a){var b=this.createFilterFn(d,c,e,a);return b?this.queryBy(b):this.data.clone()},queryBy:function(b,a){var c=this.snapshot||this.data;return c.filterBy(b,a||this)},find:function(d,c,g,e,a){var b=this.createFilterFn(d,c,e,a);return b?this.data.findIndexBy(b,null,g):-1},findExact:function(b,a,c){return this.data.findIndexBy(function(d){return d.get(b)===a},this,c)},findBy:function(b,a,c){return this.data.findIndexBy(b,a,c)},collect:function(j,k,b){var h=(b===true&&this.snapshot)?this.snapshot.items:this.data.items;var m,n,a=[],c={};for(var e=0,g=h.length;e<g;e++){m=h[e].data[j];n=String(m);if((k||!Ext.isEmpty(m))&&!c[n]){c[n]=true;a[a.length]=m}}return a},afterEdit:function(a){if(this.modified.indexOf(a)==-1){this.modified.push(a)}this.fireEvent("update",this,a,Ext.data.Record.EDIT)},afterReject:function(a){this.modified.remove(a);this.fireEvent("update",this,a,Ext.data.Record.REJECT)},afterCommit:function(a){this.modified.remove(a);this.fireEvent("update",this,a,Ext.data.Record.COMMIT)},commitChanges:function(){var a=this.modified.slice(0),c=a.length,b;for(b=0;b<c;b++){a[b].commit()}this.modified=[];this.removed=[]},rejectChanges:function(){var a=this.modified.slice(0),e=this.removed.slice(0).reverse(),c=a.length,d=e.length,b;for(b=0;b<c;b++){a[b].reject()}for(b=0;b<d;b++){this.insert(e[b].lastIndex||0,e[b]);e[b].reject()}this.modified=[];this.removed=[]},onMetaChange:function(a){this.recordType=this.reader.recordType;this.fields=this.recordType.prototype.fields;delete this.snapshot;if(this.reader.meta.sortInfo){this.sortInfo=this.reader.meta.sortInfo}else{if(this.sortInfo&&!this.fields.get(this.sortInfo.field)){delete this.sortInfo}}if(this.writer){this.writer.meta=this.reader.meta}this.modified=[];this.fireEvent("metachange",this,this.reader.meta)},findInsertIndex:function(a){this.suspendEvents();var c=this.data.clone();this.data.add(a);this.applySort();var b=this.data.indexOf(a);this.data=c;this.resumeEvents();return b},setBaseParam:function(a,b){this.baseParams=this.baseParams||{};this.baseParams[a]=b}});Ext.reg("store",Ext.data.Store);Ext.data.Store.Error=Ext.extend(Ext.Error,{name:"Ext.data.Store"});Ext.apply(Ext.data.Store.Error.prototype,{lang:{"writer-undefined":"Attempted to execute a write-action without a DataWriter installed."}});Ext.data.Field=Ext.extend(Object,{constructor:function(b){if(Ext.isString(b)){b={name:b}}Ext.apply(this,b);var d=Ext.data.Types,a=this.sortType,c;if(this.type){if(Ext.isString(this.type)){this.type=Ext.data.Types[this.type.toUpperCase()]||d.AUTO}}else{this.type=d.AUTO}if(Ext.isString(a)){this.sortType=Ext.data.SortTypes[a]}else{if(Ext.isEmpty(a)){this.sortType=this.type.sortType}}if(!this.convert){this.convert=this.type.convert}},dateFormat:null,useNull:false,defaultValue:"",mapping:null,sortType:null,sortDir:"ASC",allowBlank:true});Ext.data.DataReader=function(a,b){this.meta=a;this.recordType=Ext.isArray(b)?Ext.data.Record.create(b):b;if(this.recordType){this.buildExtractors()}};Ext.data.DataReader.prototype={getTotal:Ext.emptyFn,getRoot:Ext.emptyFn,getMessage:Ext.emptyFn,getSuccess:Ext.emptyFn,getId:Ext.emptyFn,buildExtractors:Ext.emptyFn,extractValues:Ext.emptyFn,realize:function(a,c){if(Ext.isArray(a)){for(var b=a.length-1;b>=0;b--){if(Ext.isArray(c)){this.realize(a.splice(b,1).shift(),c.splice(b,1).shift())}else{this.realize(a.splice(b,1).shift(),c)}}}else{if(Ext.isArray(c)&&c.length==1){c=c.shift()}if(!this.isData(c)){throw new Ext.data.DataReader.Error("realize",a)}a.phantom=false;a._phid=a.id;a.id=this.getId(c);a.data=c;a.commit();a.store.reMap(a)}},update:function(a,c){if(Ext.isArray(a)){for(var b=a.length-1;b>=0;b--){if(Ext.isArray(c)){this.update(a.splice(b,1).shift(),c.splice(b,1).shift())}else{this.update(a.splice(b,1).shift(),c)}}}else{if(Ext.isArray(c)&&c.length==1){c=c.shift()}if(this.isData(c)){a.data=Ext.apply(a.data,c)}a.commit()}},extractData:function(k,a){var j=(this instanceof Ext.data.JsonReader)?"json":"node";var c=[];if(this.isData(k)&&!(this instanceof Ext.data.XmlReader)){k=[k]}var h=this.recordType.prototype.fields,o=h.items,m=h.length,c=[];if(a===true){var l=this.recordType;for(var e=0;e<k.length;e++){var b=k[e];var g=new l(this.extractValues(b,o,m),this.getId(b));g[j]=b;c.push(g)}}else{for(var e=0;e<k.length;e++){var d=this.extractValues(k[e],o,m);d[this.meta.idProperty]=this.getId(k[e]);c.push(d)}}return c},isData:function(a){return(a&&Ext.isObject(a)&&!Ext.isEmpty(this.getId(a)))?true:false},onMetaChange:function(a){delete this.ef;this.meta=a;this.recordType=Ext.data.Record.create(a.fields);this.buildExtractors()}};Ext.data.DataReader.Error=Ext.extend(Ext.Error,{constructor:function(b,a){this.arg=a;Ext.Error.call(this,b)},name:"Ext.data.DataReader"});Ext.apply(Ext.data.DataReader.Error.prototype,{lang:{update:"#update received invalid data from server. Please see docs for DataReader#update and review your DataReader configuration.",realize:"#realize was called with invalid remote-data. Please see the docs for DataReader#realize and review your DataReader configuration.","invalid-response":"#readResponse received an invalid response from the server."}});Ext.data.DataWriter=function(a){Ext.apply(this,a)};Ext.data.DataWriter.prototype={writeAllFields:false,listful:false,apply:function(e,g,d,a){var c=[],b=d+"Record";if(Ext.isArray(a)){Ext.each(a,function(h){c.push(this[b](h))},this)}else{if(a instanceof Ext.data.Record){c=this[b](a)}}this.render(e,g,c)},render:Ext.emptyFn,updateRecord:Ext.emptyFn,createRecord:Ext.emptyFn,destroyRecord:Ext.emptyFn,toHash:function(g,c){var e=g.fields.map,d={},b=(this.writeAllFields===false&&g.phantom===false)?g.getChanges():g.data,a;Ext.iterate(b,function(i,h){if((a=e[i])){d[a.mapping?a.mapping:a.name]=h}});if(g.phantom){if(g.fields.containsKey(this.meta.idProperty)&&Ext.isEmpty(g.data[this.meta.idProperty])){delete d[this.meta.idProperty]}}else{d[this.meta.idProperty]=g.id}return d},toArray:function(b){var a=[];Ext.iterate(b,function(d,c){a.push({name:d,value:c})},this);return a}};Ext.data.DataProxy=function(a){a=a||{};this.api=a.api;this.url=a.url;this.restful=a.restful;this.listeners=a.listeners;this.prettyUrls=a.prettyUrls;this.addEvents("exception","beforeload","load","loadexception","beforewrite","write");Ext.data.DataProxy.superclass.constructor.call(this);try{Ext.data.Api.prepare(this)}catch(b){if(b instanceof Ext.data.Api.Error){b.toConsole()}}Ext.data.DataProxy.relayEvents(this,["beforewrite","write","exception"])};Ext.extend(Ext.data.DataProxy,Ext.util.Observable,{restful:false,setApi:function(){if(arguments.length==1){var a=Ext.data.Api.isValid(arguments[0]);if(a===true){this.api=arguments[0]}else{throw new Ext.data.Api.Error("invalid",a)}}else{if(arguments.length==2){if(!Ext.data.Api.isAction(arguments[0])){throw new Ext.data.Api.Error("invalid",arguments[0])}this.api[arguments[0]]=arguments[1]}}Ext.data.Api.prepare(this)},isApiAction:function(a){return(this.api[a])?true:false},request:function(e,b,g,a,h,d,c){if(!this.api[e]&&!this.load){throw new Ext.data.DataProxy.Error("action-undefined",e)}g=g||{};if((e===Ext.data.Api.actions.read)?this.fireEvent("beforeload",this,g):this.fireEvent("beforewrite",this,e,b,g)!==false){this.doRequest.apply(this,arguments)}else{h.call(d||this,null,c,false)}},load:null,doRequest:function(e,b,g,a,h,d,c){this.load(g,a,h,d,c)},onRead:Ext.emptyFn,onWrite:Ext.emptyFn,buildUrl:function(d,b){b=b||null;var c=(this.conn&&this.conn.url)?this.conn.url:(this.api[d])?this.api[d].url:this.url;if(!c){throw new Ext.data.Api.Error("invalid-url",d)}var e=null;var a=c.match(/(.*)(\.json|\.xml|\.html)$/);if(a){e=a[2];c=a[1]}if((this.restful===true||this.prettyUrls===true)&&b instanceof Ext.data.Record&&!b.phantom){c+="/"+b.id}return(e===null)?c:c+e},destroy:function(){this.purgeListeners()}});Ext.apply(Ext.data.DataProxy,Ext.util.Observable.prototype);Ext.util.Observable.call(Ext.data.DataProxy);Ext.data.DataProxy.Error=Ext.extend(Ext.Error,{constructor:function(b,a){this.arg=a;Ext.Error.call(this,b)},name:"Ext.data.DataProxy"});Ext.apply(Ext.data.DataProxy.Error.prototype,{lang:{"action-undefined":"DataProxy attempted to execute an API-action but found an undefined url / function. Please review your Proxy url/api-configuration.","api-invalid":"Recieved an invalid API-configuration. Please ensure your proxy API-configuration contains only the actions from Ext.data.Api.actions."}});Ext.data.Request=function(a){Ext.apply(this,a)};Ext.data.Request.prototype={action:undefined,rs:undefined,params:undefined,callback:Ext.emptyFn,scope:undefined,reader:undefined};Ext.data.Response=function(a){Ext.apply(this,a)};Ext.data.Response.prototype={action:undefined,success:undefined,message:undefined,data:undefined,raw:undefined,records:undefined};Ext.data.ScriptTagProxy=function(a){Ext.apply(this,a);Ext.data.ScriptTagProxy.superclass.constructor.call(this,a);this.head=document.getElementsByTagName("head")[0]};Ext.data.ScriptTagProxy.TRANS_ID=1000;Ext.extend(Ext.data.ScriptTagProxy,Ext.data.DataProxy,{timeout:30000,callbackParam:"callback",nocache:true,doRequest:function(e,g,d,h,j,k,l){var c=Ext.urlEncode(Ext.apply(d,this.extraParams));var b=this.buildUrl(e,g);if(!b){throw new Ext.data.Api.Error("invalid-url",b)}b=Ext.urlAppend(b,c);if(this.nocache){b=Ext.urlAppend(b,"_dc="+(new Date().getTime()))}var a=++Ext.data.ScriptTagProxy.TRANS_ID;var m={id:a,action:e,cb:"stcCallback"+a,scriptId:"stcScript"+a,params:d,arg:l,url:b,callback:j,scope:k,reader:h};window[m.cb]=this.createCallback(e,g,m);b+=String.format("&{0}={1}",this.callbackParam,m.cb);if(this.autoAbort!==false){this.abort()}m.timeoutId=this.handleFailure.defer(this.timeout,this,[m]);var i=document.createElement("script");i.setAttribute("src",b);i.setAttribute("type","text/javascript");i.setAttribute("id",m.scriptId);this.head.appendChild(i);this.trans=m},createCallback:function(d,b,c){var a=this;return function(e){a.trans=false;a.destroyTrans(c,true);if(d===Ext.data.Api.actions.read){a.onRead.call(a,d,c,e)}else{a.onWrite.call(a,d,c,e,b)}}},onRead:function(d,c,b){var a;try{a=c.reader.readRecords(b)}catch(g){this.fireEvent("loadexception",this,c,b,g);this.fireEvent("exception",this,"response",d,c,b,g);c.callback.call(c.scope||window,null,c.arg,false);return}if(a.success===false){this.fireEvent("loadexception",this,c,b);this.fireEvent("exception",this,"remote",d,c,b,null)}else{this.fireEvent("load",this,b,c.arg)}c.callback.call(c.scope||window,a,c.arg,a.success)},onWrite:function(h,g,c,b){var a=g.reader;try{var d=a.readResponse(h,c)}catch(i){this.fireEvent("exception",this,"response",h,g,d,i);g.callback.call(g.scope||window,null,d,false);return}if(!d.success===true){this.fireEvent("exception",this,"remote",h,g,d,b);g.callback.call(g.scope||window,null,d,false);return}this.fireEvent("write",this,h,d.data,d,b,g.arg);g.callback.call(g.scope||window,d.data,d,true)},isLoading:function(){return this.trans?true:false},abort:function(){if(this.isLoading()){this.destroyTrans(this.trans)}},destroyTrans:function(b,a){this.head.removeChild(document.getElementById(b.scriptId));clearTimeout(b.timeoutId);if(a){window[b.cb]=undefined;try{delete window[b.cb]}catch(c){}}else{window[b.cb]=function(){window[b.cb]=undefined;try{delete window[b.cb]}catch(d){}}}},handleFailure:function(a){this.trans=false;this.destroyTrans(a,false);if(a.action===Ext.data.Api.actions.read){this.fireEvent("loadexception",this,null,a.arg)}this.fireEvent("exception",this,"response",a.action,{response:null,options:a.arg});a.callback.call(a.scope||window,null,a.arg,false)},destroy:function(){this.abort();Ext.data.ScriptTagProxy.superclass.destroy.call(this)}});Ext.data.HttpProxy=function(a){Ext.data.HttpProxy.superclass.constructor.call(this,a);this.conn=a;this.conn.url=null;this.useAjax=!a||!a.events;var c=Ext.data.Api.actions;this.activeRequest={};for(var b in c){this.activeRequest[c[b]]=undefined}};Ext.extend(Ext.data.HttpProxy,Ext.data.DataProxy,{getConnection:function(){return this.useAjax?Ext.Ajax:this.conn},setUrl:function(a,b){this.conn.url=a;if(b===true){this.url=a;this.api=null;Ext.data.Api.prepare(this)}},doRequest:function(g,d,i,c,b,e,a){var h={method:(this.api[g])?this.api[g]["method"]:undefined,request:{callback:b,scope:e,arg:a},reader:c,callback:this.createCallback(g,d),scope:this};if(i.jsonData){h.jsonData=i.jsonData}else{if(i.xmlData){h.xmlData=i.xmlData}else{h.params=i||{}}}this.conn.url=this.buildUrl(g,d);if(this.useAjax){Ext.applyIf(h,this.conn);if(g==Ext.data.Api.actions.read&&this.activeRequest[g]){Ext.Ajax.abort(this.activeRequest[g])}this.activeRequest[g]=Ext.Ajax.request(h)}else{this.conn.request(h)}this.conn.url=null},createCallback:function(b,a){return function(e,d,c){this.activeRequest[b]=undefined;if(!d){if(b===Ext.data.Api.actions.read){this.fireEvent("loadexception",this,e,c)}this.fireEvent("exception",this,"response",b,e,c);e.request.callback.call(e.request.scope,null,e.request.arg,false);return}if(b===Ext.data.Api.actions.read){this.onRead(b,e,c)}else{this.onWrite(b,e,c,a)}}},onRead:function(d,h,b){var a;try{a=h.reader.read(b)}catch(g){this.fireEvent("loadexception",this,h,b,g);this.fireEvent("exception",this,"response",d,h,b,g);h.request.callback.call(h.request.scope,null,h.request.arg,false);return}if(a.success===false){this.fireEvent("loadexception",this,h,b);var c=h.reader.readResponse(d,b);this.fireEvent("exception",this,"remote",d,h,c,null)}else{this.fireEvent("load",this,h,h.request.arg)}h.request.callback.call(h.request.scope,a,h.request.arg,a.success)},onWrite:function(g,i,c,b){var a=i.reader;var d;try{d=a.readResponse(g,c)}catch(h){this.fireEvent("exception",this,"response",g,i,c,h);i.request.callback.call(i.request.scope,null,i.request.arg,false);return}if(d.success===true){this.fireEvent("write",this,g,d.data,d,b,i.request.arg)}else{this.fireEvent("exception",this,"remote",g,i,d,b)}i.request.callback.call(i.request.scope,d.data,d,d.success)},destroy:function(){if(!this.useAjax){this.conn.abort()}else{if(this.activeRequest){var b=Ext.data.Api.actions;for(var a in b){if(this.activeRequest[b[a]]){Ext.Ajax.abort(this.activeRequest[b[a]])}}}}Ext.data.HttpProxy.superclass.destroy.call(this)}});Ext.data.MemoryProxy=function(b){var a={};a[Ext.data.Api.actions.read]=true;Ext.data.MemoryProxy.superclass.constructor.call(this,{api:a});this.data=b};Ext.extend(Ext.data.MemoryProxy,Ext.data.DataProxy,{doRequest:function(b,c,a,d,h,i,j){a=a||{};var k;try{k=d.readRecords(this.data)}catch(g){this.fireEvent("loadexception",this,null,j,g);this.fireEvent("exception",this,"response",b,j,null,g);h.call(i,null,j,false);return}h.call(i,k,j,true)}});Ext.data.Types=new function(){var a=Ext.data.SortTypes;Ext.apply(this,{stripRe:/[\$,%]/g,AUTO:{convert:function(b){return b},sortType:a.none,type:"auto"},STRING:{convert:function(b){return(b===undefined||b===null)?"":String(b)},sortType:a.asUCString,type:"string"},INT:{convert:function(b){return b!==undefined&&b!==null&&b!==""?parseInt(String(b).replace(Ext.data.Types.stripRe,""),10):(this.useNull?null:0)},sortType:a.none,type:"int"},FLOAT:{convert:function(b){return b!==undefined&&b!==null&&b!==""?parseFloat(String(b).replace(Ext.data.Types.stripRe,""),10):(this.useNull?null:0)},sortType:a.none,type:"float"},BOOL:{convert:function(b){return b===true||b==="true"||b==1},sortType:a.none,type:"bool"},DATE:{convert:function(c){var d=this.dateFormat;if(!c){return null}if(Ext.isDate(c)){return c}if(d){if(d=="timestamp"){return new Date(c*1000)}if(d=="time"){return new Date(parseInt(c,10))}return Date.parseDate(c,d)}var b=Date.parse(c);return b?new Date(b):null},sortType:a.asDate,type:"date"}});Ext.apply(this,{BOOLEAN:this.BOOL,INTEGER:this.INT,NUMBER:this.FLOAT})};Ext.data.JsonWriter=Ext.extend(Ext.data.DataWriter,{encode:true,encodeDelete:false,constructor:function(a){Ext.data.JsonWriter.superclass.constructor.call(this,a)},render:function(c,d,b){if(this.encode===true){Ext.apply(c,d);c[this.meta.root]=Ext.encode(b)}else{var a=Ext.apply({},d);a[this.meta.root]=b;c.jsonData=a}},createRecord:function(a){return this.toHash(a)},updateRecord:function(a){return this.toHash(a)},destroyRecord:function(b){if(this.encodeDelete){var a={};a[this.meta.idProperty]=b.id;return a}else{return b.id}}});Ext.data.JsonReader=function(a,b){a=a||{};Ext.applyIf(a,{idProperty:"id",successProperty:"success",totalProperty:"total"});Ext.data.JsonReader.superclass.constructor.call(this,a,b||a.fields)};Ext.extend(Ext.data.JsonReader,Ext.data.DataReader,{read:function(a){var b=a.responseText;var c=Ext.decode(b);if(!c){throw {message:"JsonReader.read: Json object not found"}}return this.readRecords(c)},readResponse:function(e,b){var h=(b.responseText!==undefined)?Ext.decode(b.responseText):b;if(!h){throw new Ext.data.JsonReader.Error("response")}var a=this.getRoot(h),g=this.getSuccess(h);if(g&&e===Ext.data.Api.actions.create){var d=Ext.isDefined(a);if(d&&Ext.isEmpty(a)){throw new Ext.data.JsonReader.Error("root-empty",this.meta.root)}else{if(!d){throw new Ext.data.JsonReader.Error("root-undefined-response",this.meta.root)}}}var c=new Ext.data.Response({action:e,success:g,data:(a)?this.extractData(a,false):[],message:this.getMessage(h),raw:h});if(Ext.isEmpty(c.success)){throw new Ext.data.JsonReader.Error("successProperty-response",this.meta.successProperty)}return c},readRecords:function(a){this.jsonData=a;if(a.metaData){this.onMetaChange(a.metaData)}var m=this.meta,h=this.recordType,b=h.prototype.fields,l=b.items,i=b.length,j;var g=this.getRoot(a),e=g.length,d=e,k=true;if(m.totalProperty){j=parseInt(this.getTotal(a),10);if(!isNaN(j)){d=j}}if(m.successProperty){j=this.getSuccess(a);if(j===false||j==="false"){k=false}}return{success:k,records:this.extractData(g,true),totalRecords:d}},buildExtractors:function(){if(this.ef){return}var l=this.meta,h=this.recordType,e=h.prototype.fields,k=e.items,j=e.length;if(l.totalProperty){this.getTotal=this.createAccessor(l.totalProperty)}if(l.successProperty){this.getSuccess=this.createAccessor(l.successProperty)}if(l.messageProperty){this.getMessage=this.createAccessor(l.messageProperty)}this.getRoot=l.root?this.createAccessor(l.root):function(g){return g};if(l.id||l.idProperty){var d=this.createAccessor(l.id||l.idProperty);this.getId=function(i){var g=d(i);return(g===undefined||g==="")?null:g}}else{this.getId=function(){return null}}var c=[];for(var b=0;b<j;b++){e=k[b];var a=(e.mapping!==undefined&&e.mapping!==null)?e.mapping:e.name;c.push(this.createAccessor(a))}this.ef=c},simpleAccess:function(b,a){return b[a]},createAccessor:function(){var a=/[\[\.]/;return function(c){if(Ext.isEmpty(c)){return Ext.emptyFn}if(Ext.isFunction(c)){return c}var b=String(c).search(a);if(b>=0){return new Function("obj","return obj"+(b>0?".":"")+c)}return function(d){return d[c]}}}(),extractValues:function(h,d,a){var g,c={};for(var e=0;e<a;e++){g=d[e];var b=this.ef[e](h);c[g.name]=g.convert((b!==undefined)?b:g.defaultValue,h)}return c}});Ext.data.JsonReader.Error=Ext.extend(Ext.Error,{constructor:function(b,a){this.arg=a;Ext.Error.call(this,b)},name:"Ext.data.JsonReader"});Ext.apply(Ext.data.JsonReader.Error.prototype,{lang:{response:"An error occurred while json-decoding your server response","successProperty-response":'Could not locate your "successProperty" in your server response. Please review your JsonReader config to ensure the config-property "successProperty" matches the property in your server-response. See the JsonReader docs.',"root-undefined-config":'Your JsonReader was configured without a "root" property. Please review your JsonReader config and make sure to define the root property. See the JsonReader docs.',"idProperty-undefined":'Your JsonReader was configured without an "idProperty" Please review your JsonReader configuration and ensure the "idProperty" is set (e.g.: "id"). See the JsonReader docs.',"root-empty":'Data was expected to be returned by the server in the "root" property of the response. Please review your JsonReader configuration to ensure the "root" property matches that returned in the server-response. See JsonReader docs.'}});Ext.data.ArrayReader=Ext.extend(Ext.data.JsonReader,{readRecords:function(r){this.arrayData=r;var l=this.meta,d=l?Ext.num(l.idIndex,l.id):null,b=this.recordType,q=b.prototype.fields,z=[],e=true,g;var u=this.getRoot(r);for(var y=0,A=u.length;y<A;y++){var t=u[y],a={},p=((d||d===0)&&t[d]!==undefined&&t[d]!==""?t[d]:null);for(var x=0,m=q.length;x<m;x++){var B=q.items[x],w=B.mapping!==undefined&&B.mapping!==null?B.mapping:x;g=t[w]!==undefined?t[w]:B.defaultValue;g=B.convert(g,t);a[B.name]=g}var c=new b(a,p);c.json=t;z[z.length]=c}var h=z.length;if(l.totalProperty){g=parseInt(this.getTotal(r),10);if(!isNaN(g)){h=g}}if(l.successProperty){g=this.getSuccess(r);if(g===false||g==="false"){e=false}}return{success:e,records:z,totalRecords:h}}});Ext.data.ArrayStore=Ext.extend(Ext.data.Store,{constructor:function(a){Ext.data.ArrayStore.superclass.constructor.call(this,Ext.apply(a,{reader:new Ext.data.ArrayReader(a)}))},loadData:function(e,b){if(this.expandData===true){var d=[];for(var c=0,a=e.length;c<a;c++){d[d.length]=[e[c]]}e=d}Ext.data.ArrayStore.superclass.loadData.call(this,e,b)}});Ext.reg("arraystore",Ext.data.ArrayStore);Ext.data.SimpleStore=Ext.data.ArrayStore;Ext.reg("simplestore",Ext.data.SimpleStore);Ext.data.JsonStore=Ext.extend(Ext.data.Store,{constructor:function(a){Ext.data.JsonStore.superclass.constructor.call(this,Ext.apply(a,{reader:new Ext.data.JsonReader(a)}))}});Ext.reg("jsonstore",Ext.data.JsonStore);Ext.data.XmlWriter=function(a){Ext.data.XmlWriter.superclass.constructor.apply(this,arguments);this.tpl=(typeof(this.tpl)==="string")?new Ext.XTemplate(this.tpl).compile():this.tpl.compile()};Ext.extend(Ext.data.XmlWriter,Ext.data.DataWriter,{documentRoot:"xrequest",forceDocumentRoot:false,root:"records",xmlVersion:"1.0",xmlEncoding:"ISO-8859-15",tpl:'<tpl for="."><\u003fxml version="{version}" encoding="{encoding}"\u003f><tpl if="documentRoot"><{documentRoot}><tpl for="baseParams"><tpl for="."><{name}>{value}</{name}></tpl></tpl></tpl><tpl if="records.length&gt;1"><{root}></tpl><tpl for="records"><{parent.record}><tpl for="."><{name}>{value}</{name}></tpl></{parent.record}></tpl><tpl if="records.length&gt;1"></{root}></tpl><tpl if="documentRoot"></{documentRoot}></tpl></tpl>',render:function(b,c,a){c=this.toArray(c);b.xmlData=this.tpl.applyTemplate({version:this.xmlVersion,encoding:this.xmlEncoding,documentRoot:(c.length>0||this.forceDocumentRoot===true)?this.documentRoot:false,record:this.meta.record,root:this.root,baseParams:c,records:(Ext.isArray(a[0]))?a:[a]})},createRecord:function(a){return this.toArray(this.toHash(a))},updateRecord:function(a){return this.toArray(this.toHash(a))},destroyRecord:function(b){var a={};a[this.meta.idProperty]=b.id;return this.toArray(a)}});Ext.data.XmlReader=function(a,b){a=a||{};Ext.applyIf(a,{idProperty:a.idProperty||a.idPath||a.id,successProperty:a.successProperty||a.success});Ext.data.XmlReader.superclass.constructor.call(this,a,b||a.fields)};Ext.extend(Ext.data.XmlReader,Ext.data.DataReader,{read:function(a){var b=a.responseXML;if(!b){throw {message:"XmlReader.read: XML Document not available"}}return this.readRecords(b)},readRecords:function(d){this.xmlData=d;var a=d.documentElement||d,c=Ext.DomQuery,g=0,e=true;if(this.meta.totalProperty){g=this.getTotal(a,0)}if(this.meta.successProperty){e=this.getSuccess(a)}var b=this.extractData(c.select(this.meta.record,a),true);return{success:e,records:b,totalRecords:g||b.length}},readResponse:function(g,b){var e=Ext.DomQuery,h=b.responseXML,a=h.documentElement||h;var c=new Ext.data.Response({action:g,success:this.getSuccess(a),message:this.getMessage(a),data:this.extractData(e.select(this.meta.record,a)||e.select(this.meta.root,a),false),raw:h});if(Ext.isEmpty(c.success)){throw new Ext.data.DataReader.Error("successProperty-response",this.meta.successProperty)}if(g===Ext.data.Api.actions.create){var d=Ext.isDefined(c.data);if(d&&Ext.isEmpty(c.data)){throw new Ext.data.JsonReader.Error("root-empty",this.meta.root)}else{if(!d){throw new Ext.data.JsonReader.Error("root-undefined-response",this.meta.root)}}}return c},getSuccess:function(){return true},buildExtractors:function(){if(this.ef){return}var l=this.meta,h=this.recordType,e=h.prototype.fields,k=e.items,j=e.length;if(l.totalProperty){this.getTotal=this.createAccessor(l.totalProperty)}if(l.successProperty){this.getSuccess=this.createAccessor(l.successProperty)}if(l.messageProperty){this.getMessage=this.createAccessor(l.messageProperty)}this.getRoot=function(g){return(!Ext.isEmpty(g[this.meta.record]))?g[this.meta.record]:g[this.meta.root]};if(l.idPath||l.idProperty){var d=this.createAccessor(l.idPath||l.idProperty);this.getId=function(g){var i=d(g)||g.id;return(i===undefined||i==="")?null:i}}else{this.getId=function(){return null}}var c=[];for(var b=0;b<j;b++){e=k[b];var a=(e.mapping!==undefined&&e.mapping!==null)?e.mapping:e.name;c.push(this.createAccessor(a))}this.ef=c},createAccessor:function(){var a=Ext.DomQuery;return function(b){if(Ext.isFunction(b)){return b}switch(b){case this.meta.totalProperty:return function(c,d){return a.selectNumber(b,c,d)};break;case this.meta.successProperty:return function(d,e){var c=a.selectValue(b,d,true);var g=c!==false&&c!=="false";return g};break;default:return function(c,d){return a.selectValue(b,c,d)};break}}}(),extractValues:function(h,d,a){var g,c={};for(var e=0;e<a;e++){g=d[e];var b=this.ef[e](h);c[g.name]=g.convert((b!==undefined)?b:g.defaultValue,h)}return c}});Ext.data.XmlStore=Ext.extend(Ext.data.Store,{constructor:function(a){Ext.data.XmlStore.superclass.constructor.call(this,Ext.apply(a,{reader:new Ext.data.XmlReader(a)}))}});Ext.reg("xmlstore",Ext.data.XmlStore);Ext.data.GroupingStore=Ext.extend(Ext.data.Store,{constructor:function(d){d=d||{};this.hasMultiSort=true;this.multiSortInfo=this.multiSortInfo||{sorters:[]};var e=this.multiSortInfo.sorters,c=d.groupField||this.groupField,b=d.sortInfo||this.sortInfo,a=d.groupDir||this.groupDir;if(c){e.push({field:c,direction:a})}if(b){e.push(b)}Ext.data.GroupingStore.superclass.constructor.call(this,d);this.addEvents("groupchange");this.applyGroupField()},remoteGroup:false,groupOnSort:false,groupDir:"ASC",clearGrouping:function(){this.groupField=false;if(this.remoteGroup){if(this.baseParams){delete this.baseParams.groupBy;delete this.baseParams.groupDir}var a=this.lastOptions;if(a&&a.params){delete a.params.groupBy;delete a.params.groupDir}this.reload()}else{this.sort();this.fireEvent("datachanged",this)}},groupBy:function(e,a,d){d=d?(String(d).toUpperCase()=="DESC"?"DESC":"ASC"):this.groupDir;if(this.groupField==e&&this.groupDir==d&&!a){return}var c=this.multiSortInfo.sorters;if(c.length>0&&c[0].field==this.groupField){c.shift()}this.groupField=e;this.groupDir=d;this.applyGroupField();var b=function(){this.fireEvent("groupchange",this,this.getGroupState())};if(this.groupOnSort){this.sort(e,d);b.call(this);return}if(this.remoteGroup){this.on("load",b,this,{single:true});this.reload()}else{this.sort(c);b.call(this)}},sort:function(h,c){if(this.remoteSort){return Ext.data.GroupingStore.superclass.sort.call(this,h,c)}var g=[];if(Ext.isArray(arguments[0])){g=arguments[0]}else{if(h==undefined){g=this.sortInfo?[this.sortInfo]:[]}else{var e=this.fields.get(h);if(!e){return false}var b=e.name,a=this.sortInfo||null,d=this.sortToggle?this.sortToggle[b]:null;if(!c){if(a&&a.field==b){c=(this.sortToggle[b]||"ASC").toggle("ASC","DESC")}else{c=e.sortDir}}this.sortToggle[b]=c;this.sortInfo={field:b,direction:c};g=[this.sortInfo]}}if(this.groupField){g.unshift({direction:this.groupDir,field:this.groupField})}return this.multiSort.call(this,g,c)},applyGroupField:function(){if(this.remoteGroup){if(!this.baseParams){this.baseParams={}}Ext.apply(this.baseParams,{groupBy:this.groupField,groupDir:this.groupDir});var a=this.lastOptions;if(a&&a.params){a.params.groupDir=this.groupDir;delete a.params.groupBy}}},applyGrouping:function(a){if(this.groupField!==false){this.groupBy(this.groupField,true,this.groupDir);return true}else{if(a===true){this.fireEvent("datachanged",this)}return false}},getGroupState:function(){return this.groupOnSort&&this.groupField!==false?(this.sortInfo?this.sortInfo.field:undefined):this.groupField}});Ext.reg("groupingstore",Ext.data.GroupingStore);Ext.data.DirectProxy=function(a){Ext.apply(this,a);if(typeof this.paramOrder=="string"){this.paramOrder=this.paramOrder.split(/[\s,|]/)}Ext.data.DirectProxy.superclass.constructor.call(this,a)};Ext.extend(Ext.data.DirectProxy,Ext.data.DataProxy,{paramOrder:undefined,paramsAsHash:true,directFn:undefined,doRequest:function(b,c,a,e,k,l,n){var j=[],h=this.api[b]||this.directFn;switch(b){case Ext.data.Api.actions.create:j.push(a.jsonData);break;case Ext.data.Api.actions.read:if(h.directCfg.method.len>0){if(this.paramOrder){for(var d=0,g=this.paramOrder.length;d<g;d++){j.push(a[this.paramOrder[d]])}}else{if(this.paramsAsHash){j.push(a)}}}break;case Ext.data.Api.actions.update:j.push(a.jsonData);break;case Ext.data.Api.actions.destroy:j.push(a.jsonData);break}var m={params:a||{},request:{callback:k,scope:l,arg:n},reader:e};j.push(this.createCallback(b,c,m),this);h.apply(window,j)},createCallback:function(d,a,b){var c=this;return function(e,g){if(!g.status){if(d===Ext.data.Api.actions.read){c.fireEvent("loadexception",c,b,g,null)}c.fireEvent("exception",c,"remote",d,b,g,null);b.request.callback.call(b.request.scope,null,b.request.arg,false);return}if(d===Ext.data.Api.actions.read){c.onRead(d,b,e,g)}else{c.onWrite(d,b,e,g,a)}}},onRead:function(g,e,a,d){var b;try{b=e.reader.readRecords(a)}catch(c){this.fireEvent("loadexception",this,e,d,c);this.fireEvent("exception",this,"response",g,e,d,c);e.request.callback.call(e.request.scope,null,e.request.arg,false);return}this.fireEvent("load",this,d,e.request.arg);e.request.callback.call(e.request.scope,b,e.request.arg,true)},onWrite:function(g,d,a,c,b){var e=d.reader.extractData(d.reader.getRoot(a),false);var h=d.reader.getSuccess(a);h=(h!==false);if(h){this.fireEvent("write",this,g,e,c,b,d.request.arg)}else{this.fireEvent("exception",this,"remote",g,d,a,b)}d.request.callback.call(d.request.scope,e,c,h)}});Ext.data.DirectStore=Ext.extend(Ext.data.Store,{constructor:function(a){var b=Ext.apply({},{batchTransactions:false},a);Ext.data.DirectStore.superclass.constructor.call(this,Ext.apply(b,{proxy:Ext.isDefined(b.proxy)?b.proxy:new Ext.data.DirectProxy(Ext.copyTo({},b,"paramOrder,paramsAsHash,directFn,api")),reader:(!Ext.isDefined(b.reader)&&b.fields)?new Ext.data.JsonReader(Ext.copyTo({},b,"totalProperty,root,idProperty"),b.fields):b.reader}))}});Ext.reg("directstore",Ext.data.DirectStore);Ext.Direct=Ext.extend(Ext.util.Observable,{exceptions:{TRANSPORT:"xhr",PARSE:"parse",LOGIN:"login",SERVER:"exception"},constructor:function(){this.addEvents("event","exception");this.transactions={};this.providers={}},addProvider:function(e){var c=arguments;if(c.length>1){for(var d=0,b=c.length;d<b;d++){this.addProvider(c[d])}return}if(!e.events){e=new Ext.Direct.PROVIDERS[e.type](e)}e.id=e.id||Ext.id();this.providers[e.id]=e;e.on("data",this.onProviderData,this);e.on("exception",this.onProviderException,this);if(!e.isConnected()){e.connect()}return e},getProvider:function(a){return this.providers[a]},removeProvider:function(b){var a=b.id?b:this.providers[b];a.un("data",this.onProviderData,this);a.un("exception",this.onProviderException,this);delete this.providers[a.id];return a},addTransaction:function(a){this.transactions[a.tid]=a;return a},removeTransaction:function(a){delete this.transactions[a.tid||a];return a},getTransaction:function(a){return this.transactions[a.tid||a]},onProviderData:function(d,c){if(Ext.isArray(c)){for(var b=0,a=c.length;b<a;b++){this.onProviderData(d,c[b])}return}if(c.name&&c.name!="event"&&c.name!="exception"){this.fireEvent(c.name,c)}else{if(c.type=="exception"){this.fireEvent("exception",c)}}this.fireEvent("event",c,d)},createEvent:function(a,b){return new Ext.Direct.eventTypes[a.type](Ext.apply(a,b))}});Ext.Direct=new Ext.Direct();Ext.Direct.TID=1;Ext.Direct.PROVIDERS={};Ext.Direct.Transaction=function(a){Ext.apply(this,a);this.tid=++Ext.Direct.TID;this.retryCount=0};Ext.Direct.Transaction.prototype={send:function(){this.provider.queueTransaction(this)},retry:function(){this.retryCount++;this.send()},getProvider:function(){return this.provider}};Ext.Direct.Event=function(a){Ext.apply(this,a)};Ext.Direct.Event.prototype={status:true,getData:function(){return this.data}};Ext.Direct.RemotingEvent=Ext.extend(Ext.Direct.Event,{type:"rpc",getTransaction:function(){return this.transaction||Ext.Direct.getTransaction(this.tid)}});Ext.Direct.ExceptionEvent=Ext.extend(Ext.Direct.RemotingEvent,{status:false,type:"exception"});Ext.Direct.eventTypes={rpc:Ext.Direct.RemotingEvent,event:Ext.Direct.Event,exception:Ext.Direct.ExceptionEvent};Ext.direct.Provider=Ext.extend(Ext.util.Observable,{priority:1,constructor:function(a){Ext.apply(this,a);this.addEvents("connect","disconnect","data","exception");Ext.direct.Provider.superclass.constructor.call(this,a)},isConnected:function(){return false},connect:Ext.emptyFn,disconnect:Ext.emptyFn});Ext.direct.JsonProvider=Ext.extend(Ext.direct.Provider,{parseResponse:function(a){if(!Ext.isEmpty(a.responseText)){if(typeof a.responseText=="object"){return a.responseText}return Ext.decode(a.responseText)}return null},getEvents:function(j){var g=null;try{g=this.parseResponse(j)}catch(h){var d=new Ext.Direct.ExceptionEvent({data:h,xhr:j,code:Ext.Direct.exceptions.PARSE,message:"Error parsing json response: \n\n "+g});return[d]}var c=[];if(Ext.isArray(g)){for(var b=0,a=g.length;b<a;b++){c.push(Ext.Direct.createEvent(g[b]))}}else{c.push(Ext.Direct.createEvent(g))}return c}});Ext.direct.PollingProvider=Ext.extend(Ext.direct.JsonProvider,{priority:3,interval:3000,constructor:function(a){Ext.direct.PollingProvider.superclass.constructor.call(this,a);this.addEvents("beforepoll","poll")},isConnected:function(){return !!this.pollTask},connect:function(){if(this.url&&!this.pollTask){this.pollTask=Ext.TaskMgr.start({run:function(){if(this.fireEvent("beforepoll",this)!==false){if(typeof this.url=="function"){this.url(this.baseParams)}else{Ext.Ajax.request({url:this.url,callback:this.onData,scope:this,params:this.baseParams})}}},interval:this.interval,scope:this});this.fireEvent("connect",this)}else{if(!this.url){throw"Error initializing PollingProvider, no url configured."}}},disconnect:function(){if(this.pollTask){Ext.TaskMgr.stop(this.pollTask);delete this.pollTask;this.fireEvent("disconnect",this)}},onData:function(d,j,h){if(j){var c=this.getEvents(h);for(var b=0,a=c.length;b<a;b++){var g=c[b];this.fireEvent("data",this,g)}}else{var g=new Ext.Direct.ExceptionEvent({data:g,code:Ext.Direct.exceptions.TRANSPORT,message:"Unable to connect to the server.",xhr:h});this.fireEvent("data",this,g)}}});Ext.Direct.PROVIDERS.polling=Ext.direct.PollingProvider;Ext.direct.RemotingProvider=Ext.extend(Ext.direct.JsonProvider,{enableBuffer:10,maxRetries:1,timeout:undefined,constructor:function(a){Ext.direct.RemotingProvider.superclass.constructor.call(this,a);this.addEvents("beforecall","call");this.namespace=(Ext.isString(this.namespace))?Ext.ns(this.namespace):this.namespace||window;this.transactions={};this.callBuffer=[]},initAPI:function(){var h=this.actions;for(var j in h){var d=this.namespace[j]||(this.namespace[j]={}),e=h[j];for(var g=0,b=e.length;g<b;g++){var a=e[g];d[a.name]=this.createMethod(j,a)}}},isConnected:function(){return !!this.connected},connect:function(){if(this.url){this.initAPI();this.connected=true;this.fireEvent("connect",this)}else{if(!this.url){throw"Error initializing RemotingProvider, no url configured."}}},disconnect:function(){if(this.connected){this.connected=false;this.fireEvent("disconnect",this)}},onData:function(a,h,j){if(h){var k=this.getEvents(j);for(var b=0,c=k.length;b<c;b++){var d=k[b],l=this.getTransaction(d);this.fireEvent("data",this,d);if(l){this.doCallback(l,d,true);Ext.Direct.removeTransaction(l)}}}else{var g=[].concat(a.ts);for(var b=0,c=g.length;b<c;b++){var l=this.getTransaction(g[b]);if(l&&l.retryCount<this.maxRetries){l.retry()}else{var d=new Ext.Direct.ExceptionEvent({data:d,transaction:l,code:Ext.Direct.exceptions.TRANSPORT,message:"Unable to connect to the server.",xhr:j});this.fireEvent("data",this,d);if(l){this.doCallback(l,d,false);Ext.Direct.removeTransaction(l)}}}}},getCallData:function(a){return{action:a.action,method:a.method,data:a.data,type:"rpc",tid:a.tid}},doSend:function(d){var g={url:this.url,callback:this.onData,scope:this,ts:d,timeout:this.timeout},b;if(Ext.isArray(d)){b=[];for(var c=0,a=d.length;c<a;c++){b.push(this.getCallData(d[c]))}}else{b=this.getCallData(d)}if(this.enableUrlEncode){var e={};e[Ext.isString(this.enableUrlEncode)?this.enableUrlEncode:"data"]=Ext.encode(b);g.params=e}else{g.jsonData=b}Ext.Ajax.request(g)},combineAndSend:function(){var a=this.callBuffer.length;if(a>0){this.doSend(a==1?this.callBuffer[0]:this.callBuffer);this.callBuffer=[]}},queueTransaction:function(a){if(a.form){this.processForm(a);return}this.callBuffer.push(a);if(this.enableBuffer){if(!this.callTask){this.callTask=new Ext.util.DelayedTask(this.combineAndSend,this)}this.callTask.delay(Ext.isNumber(this.enableBuffer)?this.enableBuffer:10)}else{this.combineAndSend()}},doCall:function(i,a,b){var h=null,e=b[a.len],g=b[a.len+1];if(a.len!==0){h=b.slice(0,a.len)}var d=new Ext.Direct.Transaction({provider:this,args:b,action:i,method:a.name,data:h,cb:g&&Ext.isFunction(e)?e.createDelegate(g):e});if(this.fireEvent("beforecall",this,d,a)!==false){Ext.Direct.addTransaction(d);this.queueTransaction(d);this.fireEvent("call",this,d,a)}},doForm:function(j,b,g,i,e){var d=new Ext.Direct.Transaction({provider:this,action:j,method:b.name,args:[g,i,e],cb:e&&Ext.isFunction(i)?i.createDelegate(e):i,isForm:true});if(this.fireEvent("beforecall",this,d,b)!==false){Ext.Direct.addTransaction(d);var a=String(g.getAttribute("enctype")).toLowerCase()=="multipart/form-data",h={extTID:d.tid,extAction:j,extMethod:b.name,extType:"rpc",extUpload:String(a)};Ext.apply(d,{form:Ext.getDom(g),isUpload:a,params:i&&Ext.isObject(i.params)?Ext.apply(h,i.params):h});this.fireEvent("call",this,d,b);this.processForm(d)}},processForm:function(a){Ext.Ajax.request({url:this.url,params:a.params,callback:this.onData,scope:this,form:a.form,isUpload:a.isUpload,ts:a})},createMethod:function(d,a){var b;if(!a.formHandler){b=function(){this.doCall(d,a,Array.prototype.slice.call(arguments,0))}.createDelegate(this)}else{b=function(e,g,c){this.doForm(d,a,e,g,c)}.createDelegate(this)}b.directCfg={action:d,method:a};return b},getTransaction:function(a){return a&&a.tid?Ext.Direct.getTransaction(a.tid):null},doCallback:function(c,g){var d=g.status?"success":"failure";if(c&&c.cb){var b=c.cb,a=Ext.isDefined(g.result)?g.result:g.data;if(Ext.isFunction(b)){b(a,g)}else{Ext.callback(b[d],b.scope,[a,g]);Ext.callback(b.callback,b.scope,[a,g])}}}});Ext.Direct.PROVIDERS.remoting=Ext.direct.RemotingProvider;Ext.Resizable=Ext.extend(Ext.util.Observable,{constructor:function(d,e){this.el=Ext.get(d);if(e&&e.wrap){e.resizeChild=this.el;this.el=this.el.wrap(typeof e.wrap=="object"?e.wrap:{cls:"xresizable-wrap"});this.el.id=this.el.dom.id=e.resizeChild.id+"-rzwrap";this.el.setStyle("overflow","hidden");this.el.setPositioning(e.resizeChild.getPositioning());e.resizeChild.clearPositioning();if(!e.width||!e.height){var g=e.resizeChild.getSize();this.el.setSize(g.width,g.height)}if(e.pinned&&!e.adjustments){e.adjustments="auto"}}this.proxy=this.el.createProxy({tag:"div",cls:"x-resizable-proxy",id:this.el.id+"-rzproxy"},Ext.getBody());this.proxy.unselectable();this.proxy.enableDisplayMode("block");Ext.apply(this,e);if(this.pinned){this.disableTrackOver=true;this.el.addClass("x-resizable-pinned")}var k=this.el.getStyle("position");if(k!="absolute"&&k!="fixed"){this.el.setStyle("position","relative")}if(!this.handles){this.handles="s,e,se";if(this.multiDirectional){this.handles+=",n,w"}}if(this.handles=="all"){this.handles="n s e w ne nw se sw"}var o=this.handles.split(/\s*?[,;]\s*?| /);var c=Ext.Resizable.positions;for(var j=0,l=o.length;j<l;j++){if(o[j]&&c[o[j]]){var n=c[o[j]];this[n]=new Ext.Resizable.Handle(this,n,this.disableTrackOver,this.transparent,this.handleCls)}}this.corner=this.southeast;if(this.handles.indexOf("n")!=-1||this.handles.indexOf("w")!=-1){this.updateBox=true}this.activeHandle=null;if(this.resizeChild){if(typeof this.resizeChild=="boolean"){this.resizeChild=Ext.get(this.el.dom.firstChild,true)}else{this.resizeChild=Ext.get(this.resizeChild,true)}}if(this.adjustments=="auto"){var b=this.resizeChild;var m=this.west,h=this.east,a=this.north,o=this.south;if(b&&(m||a)){b.position("relative");b.setLeft(m?m.el.getWidth():0);b.setTop(a?a.el.getHeight():0)}this.adjustments=[(h?-h.el.getWidth():0)+(m?-m.el.getWidth():0),(a?-a.el.getHeight():0)+(o?-o.el.getHeight():0)-1]}if(this.draggable){this.dd=this.dynamic?this.el.initDD(null):this.el.initDDProxy(null,{dragElId:this.proxy.id});this.dd.setHandleElId(this.resizeChild?this.resizeChild.id:this.el.id);if(this.constrainTo){this.dd.constrainTo(this.constrainTo)}}this.addEvents("beforeresize","resize");if(this.width!==null&&this.height!==null){this.resizeTo(this.width,this.height)}else{this.updateChildSize()}if(Ext.isIE){this.el.dom.style.zoom=1}Ext.Resizable.superclass.constructor.call(this)},adjustments:[0,0],animate:false,disableTrackOver:false,draggable:false,duration:0.35,dynamic:false,easing:"easeOutStrong",enabled:true,handles:false,multiDirectional:false,height:null,width:null,heightIncrement:0,widthIncrement:0,minHeight:5,minWidth:5,maxHeight:10000,maxWidth:10000,minX:0,minY:0,pinned:false,preserveRatio:false,resizeChild:false,transparent:false,resizeTo:function(b,a){this.el.setSize(b,a);this.updateChildSize();this.fireEvent("resize",this,b,a,null)},startSizing:function(c,b){this.fireEvent("beforeresize",this,c);if(this.enabled){if(!this.overlay){this.overlay=this.el.createProxy({tag:"div",cls:"x-resizable-overlay",html:"&#160;"},Ext.getBody());this.overlay.unselectable();this.overlay.enableDisplayMode("block");this.overlay.on({scope:this,mousemove:this.onMouseMove,mouseup:this.onMouseUp})}this.overlay.setStyle("cursor",b.el.getStyle("cursor"));this.resizing=true;this.startBox=this.el.getBox();this.startPoint=c.getXY();this.offsets=[(this.startBox.x+this.startBox.width)-this.startPoint[0],(this.startBox.y+this.startBox.height)-this.startPoint[1]];this.overlay.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.overlay.show();if(this.constrainTo){var a=Ext.get(this.constrainTo);this.resizeRegion=a.getRegion().adjust(a.getFrameWidth("t"),a.getFrameWidth("l"),-a.getFrameWidth("b"),-a.getFrameWidth("r"))}this.proxy.setStyle("visibility","hidden");this.proxy.show();this.proxy.setBox(this.startBox);if(!this.dynamic){this.proxy.setStyle("visibility","visible")}}},onMouseDown:function(a,b){if(this.enabled){b.stopEvent();this.activeHandle=a;this.startSizing(b,a)}},onMouseUp:function(b){this.activeHandle=null;var a=this.resizeElement();this.resizing=false;this.handleOut();this.overlay.hide();this.proxy.hide();this.fireEvent("resize",this,a.width,a.height,b)},updateChildSize:function(){if(this.resizeChild){var d=this.el;var e=this.resizeChild;var c=this.adjustments;if(d.dom.offsetWidth){var a=d.getSize(true);e.setSize(a.width+c[0],a.height+c[1])}if(Ext.isIE9m){setTimeout(function(){if(d.dom.offsetWidth){var g=d.getSize(true);e.setSize(g.width+c[0],g.height+c[1])}},10)}}},snap:function(c,e,b){if(!e||!c){return c}var d=c;var a=c%e;if(a>0){if(a>(e/2)){d=c+(e-a)}else{d=c-a}}return Math.max(b,d)},resizeElement:function(){var a=this.proxy.getBox();if(this.updateBox){this.el.setBox(a,false,this.animate,this.duration,null,this.easing)}else{this.el.setSize(a.width,a.height,this.animate,this.duration,null,this.easing)}this.updateChildSize();if(!this.dynamic){this.proxy.hide()}if(this.draggable&&this.constrainTo){this.dd.resetConstraints();this.dd.constrainTo(this.constrainTo)}return a},constrain:function(b,c,a,d){if(b-c<a){c=b-a}else{if(b-c>d){c=b-d}}return c},onMouseMove:function(z){if(this.enabled&&this.activeHandle){try{if(this.resizeRegion&&!this.resizeRegion.contains(z.getPoint())){return}var t=this.curSize||this.startBox,l=this.startBox.x,k=this.startBox.y,c=l,b=k,m=t.width,u=t.height,d=m,o=u,n=this.minWidth,A=this.minHeight,s=this.maxWidth,D=this.maxHeight,i=this.widthIncrement,a=this.heightIncrement,B=z.getXY(),r=-(this.startPoint[0]-Math.max(this.minX,B[0])),p=-(this.startPoint[1]-Math.max(this.minY,B[1])),j=this.activeHandle.position,E,g;switch(j){case"east":m+=r;m=Math.min(Math.max(n,m),s);break;case"south":u+=p;u=Math.min(Math.max(A,u),D);break;case"southeast":m+=r;u+=p;m=Math.min(Math.max(n,m),s);u=Math.min(Math.max(A,u),D);break;case"north":p=this.constrain(u,p,A,D);k+=p;u-=p;break;case"west":r=this.constrain(m,r,n,s);l+=r;m-=r;break;case"northeast":m+=r;m=Math.min(Math.max(n,m),s);p=this.constrain(u,p,A,D);k+=p;u-=p;break;case"northwest":r=this.constrain(m,r,n,s);p=this.constrain(u,p,A,D);k+=p;u-=p;l+=r;m-=r;break;case"southwest":r=this.constrain(m,r,n,s);u+=p;u=Math.min(Math.max(A,u),D);l+=r;m-=r;break}var q=this.snap(m,i,n);var C=this.snap(u,a,A);if(q!=m||C!=u){switch(j){case"northeast":k-=C-u;break;case"north":k-=C-u;break;case"southwest":l-=q-m;break;case"west":l-=q-m;break;case"northwest":l-=q-m;k-=C-u;break}m=q;u=C}if(this.preserveRatio){switch(j){case"southeast":case"east":u=o*(m/d);u=Math.min(Math.max(A,u),D);m=d*(u/o);break;case"south":m=d*(u/o);m=Math.min(Math.max(n,m),s);u=o*(m/d);break;case"northeast":m=d*(u/o);m=Math.min(Math.max(n,m),s);u=o*(m/d);break;case"north":E=m;m=d*(u/o);m=Math.min(Math.max(n,m),s);u=o*(m/d);l+=(E-m)/2;break;case"southwest":u=o*(m/d);u=Math.min(Math.max(A,u),D);E=m;m=d*(u/o);l+=E-m;break;case"west":g=u;u=o*(m/d);u=Math.min(Math.max(A,u),D);k+=(g-u)/2;E=m;m=d*(u/o);l+=E-m;break;case"northwest":E=m;g=u;u=o*(m/d);u=Math.min(Math.max(A,u),D);m=d*(u/o);k+=g-u;l+=E-m;break}}this.proxy.setBounds(l,k,m,u);if(this.dynamic){this.resizeElement()}}catch(v){}}},handleOver:function(){if(this.enabled){this.el.addClass("x-resizable-over")}},handleOut:function(){if(!this.resizing){this.el.removeClass("x-resizable-over")}},getEl:function(){return this.el},getResizeChild:function(){return this.resizeChild},destroy:function(b){Ext.destroy(this.dd,this.overlay,this.proxy);this.overlay=null;this.proxy=null;var c=Ext.Resizable.positions;for(var a in c){if(typeof c[a]!="function"&&this[c[a]]){this[c[a]].destroy()}}if(b){this.el.update("");Ext.destroy(this.el);this.el=null}this.purgeListeners()},syncHandleHeight:function(){var a=this.el.getHeight(true);if(this.west){this.west.el.setHeight(a)}if(this.east){this.east.el.setHeight(a)}}});Ext.Resizable.positions={n:"north",s:"south",e:"east",w:"west",se:"southeast",sw:"southwest",nw:"northwest",ne:"northeast"};Ext.Resizable.Handle=Ext.extend(Object,{constructor:function(d,g,c,e,a){if(!this.tpl){var b=Ext.DomHelper.createTemplate({tag:"div",cls:"x-resizable-handle x-resizable-handle-{0}"});b.compile();Ext.Resizable.Handle.prototype.tpl=b}this.position=g;this.rz=d;this.el=this.tpl.append(d.el.dom,[this.position],true);this.el.unselectable();if(e){this.el.setOpacity(0)}if(!Ext.isEmpty(a)){this.el.addClass(a)}this.el.on("mousedown",this.onMouseDown,this);if(!c){this.el.on({scope:this,mouseover:this.onMouseOver,mouseout:this.onMouseOut})}},afterResize:function(a){},onMouseDown:function(a){this.rz.onMouseDown(this,a)},onMouseOver:function(a){this.rz.handleOver(this,a)},onMouseOut:function(a){this.rz.handleOut(this,a)},destroy:function(){Ext.destroy(this.el);this.el=null}});Ext.Window=Ext.extend(Ext.Panel,{baseCls:"x-window",resizable:true,draggable:true,closable:true,closeAction:"close",constrain:false,constrainHeader:false,plain:false,minimizable:false,maximizable:false,minHeight:100,minWidth:200,expandOnShow:true,showAnimDuration:0.25,hideAnimDuration:0.25,collapsible:false,initHidden:undefined,hidden:true,elements:"header,body",frame:true,floating:true,initComponent:function(){this.initTools();Ext.Window.superclass.initComponent.call(this);this.addEvents("resize","maximize","minimize","restore");if(Ext.isDefined(this.initHidden)){this.hidden=this.initHidden}if(this.hidden===false){this.hidden=true;this.show()}},getState:function(){return Ext.apply(Ext.Window.superclass.getState.call(this)||{},this.getBox(true))},onRender:function(b,a){Ext.Window.superclass.onRender.call(this,b,a);if(this.plain){this.el.addClass("x-window-plain")}this.focusEl=this.el.createChild({tag:"a",href:"#",cls:"x-dlg-focus",tabIndex:"-1",html:"&#160;"});this.focusEl.swallowEvent("click",true);this.proxy=this.el.createProxy("x-window-proxy");this.proxy.enableDisplayMode("block");if(this.modal){this.mask=this.container.createChild({cls:"ext-el-mask"},this.el.dom);this.mask.enableDisplayMode("block");this.mask.hide();this.mon(this.mask,"click",this.focus,this)}if(this.maximizable){this.mon(this.header,"dblclick",this.toggleMaximize,this)}},initEvents:function(){Ext.Window.superclass.initEvents.call(this);if(this.animateTarget){this.setAnimateTarget(this.animateTarget)}if(this.resizable){this.resizer=new Ext.Resizable(this.el,{minWidth:this.minWidth,minHeight:this.minHeight,handles:this.resizeHandles||"all",pinned:true,resizeElement:this.resizerAction,handleCls:"x-window-handle"});this.resizer.window=this;this.mon(this.resizer,"beforeresize",this.beforeResize,this)}if(this.draggable){this.header.addClass("x-window-draggable")}this.mon(this.el,"mousedown",this.toFront,this);this.manager=this.manager||Ext.WindowMgr;this.manager.register(this);if(this.maximized){this.maximized=false;this.maximize()}if(this.closable){var a=this.getKeyMap();a.on(27,this.onEsc,this);a.disable()}},initDraggable:function(){this.dd=new Ext.Window.DD(this)},onEsc:function(a,b){if(this.activeGhost){this.unghost()}b.stopEvent();this[this.closeAction]()},beforeDestroy:function(){if(this.rendered){this.hide();this.clearAnchor();Ext.destroy(this.focusEl,this.resizer,this.dd,this.proxy,this.mask)}Ext.Window.superclass.beforeDestroy.call(this)},onDestroy:function(){if(this.manager){this.manager.unregister(this)}Ext.Window.superclass.onDestroy.call(this)},initTools:function(){if(this.minimizable){this.addTool({id:"minimize",handler:this.minimize.createDelegate(this,[])})}if(this.maximizable){this.addTool({id:"maximize",handler:this.maximize.createDelegate(this,[])});this.addTool({id:"restore",handler:this.restore.createDelegate(this,[]),hidden:true})}if(this.closable){this.addTool({id:"close",handler:this[this.closeAction].createDelegate(this,[])})}},resizerAction:function(){var a=this.proxy.getBox();this.proxy.hide();this.window.handleResize(a);return a},beforeResize:function(){this.resizer.minHeight=Math.max(this.minHeight,this.getFrameHeight()+40);this.resizer.minWidth=Math.max(this.minWidth,this.getFrameWidth()+40);this.resizeBox=this.el.getBox()},updateHandles:function(){if(Ext.isIE9m&&this.resizer){this.resizer.syncHandleHeight();this.el.repaint()}},handleResize:function(b){var a=this.resizeBox;if(a.x!=b.x||a.y!=b.y){this.updateBox(b)}else{this.setSize(b);if(Ext.isIE6&&Ext.isStrict){this.doLayout()}}this.focus();this.updateHandles();this.saveState()},focus:function(){var e=this.focusEl,a=this.defaultButton,c=typeof a,d,b;if(Ext.isDefined(a)){if(Ext.isNumber(a)&&this.fbar){e=this.fbar.items.get(a)}else{if(Ext.isString(a)){e=Ext.getCmp(a)}else{e=a}}d=e.getEl();b=Ext.getDom(this.container);if(d&&b){if(b!=document.body&&!Ext.lib.Region.getRegion(b).contains(Ext.lib.Region.getRegion(d.dom))){return}}}e=e||this.focusEl;e.focus.defer(10,e)},setAnimateTarget:function(a){a=Ext.get(a);this.animateTarget=a},beforeShow:function(){delete this.el.lastXY;delete this.el.lastLT;if(this.x===undefined||this.y===undefined){var a=this.el.getAlignToXY(this.container,"c-c");var b=this.el.translatePoints(a[0],a[1]);this.x=this.x===undefined?b.left:this.x;this.y=this.y===undefined?b.top:this.y}this.el.setLeftTop(this.x,this.y);if(this.expandOnShow){this.expand(false)}if(this.modal){Ext.getBody().addClass("x-body-masked");this.mask.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.mask.show()}},show:function(c,a,b){if(!this.rendered){this.render(Ext.getBody())}if(this.hidden===false){this.toFront();return this}if(this.fireEvent("beforeshow",this)===false){return this}if(a){this.on("show",a,b,{single:true})}this.hidden=false;if(Ext.isDefined(c)){this.setAnimateTarget(c)}this.beforeShow();if(this.animateTarget){this.animShow()}else{this.afterShow()}return this},afterShow:function(b){if(this.isDestroyed){return false}this.proxy.hide();this.el.setStyle("display","block");this.el.show();if(this.maximized){this.fitContainer()}if(Ext.isMac&&Ext.isGecko2){this.cascade(this.setAutoScroll)}if(this.monitorResize||this.modal||this.constrain||this.constrainHeader){Ext.EventManager.onWindowResize(this.onWindowResize,this)}this.doConstrain();this.doLayout();if(this.keyMap){this.keyMap.enable()}this.toFront();this.updateHandles();if(b&&(Ext.isIE||Ext.isWebKit)){var a=this.getSize();this.onResize(a.width,a.height)}this.onShow();this.fireEvent("show",this)},animShow:function(){this.proxy.show();this.proxy.setBox(this.animateTarget.getBox());this.proxy.setOpacity(0);var a=this.getBox();this.el.setStyle("display","none");this.proxy.shift(Ext.apply(a,{callback:this.afterShow.createDelegate(this,[true],false),scope:this,easing:"easeNone",duration:this.showAnimDuration,opacity:0.5}))},hide:function(c,a,b){if(this.hidden||this.fireEvent("beforehide",this)===false){return this}if(a){this.on("hide",a,b,{single:true})}this.hidden=true;if(c!==undefined){this.setAnimateTarget(c)}if(this.modal){this.mask.hide();Ext.getBody().removeClass("x-body-masked")}if(this.animateTarget){this.animHide()}else{this.el.hide();this.afterHide()}return this},afterHide:function(){this.proxy.hide();if(this.monitorResize||this.modal||this.constrain||this.constrainHeader){Ext.EventManager.removeResizeListener(this.onWindowResize,this)}if(this.keyMap){this.keyMap.disable()}this.onHide();this.fireEvent("hide",this)},animHide:function(){this.proxy.setOpacity(0.5);this.proxy.show();var a=this.getBox(false);this.proxy.setBox(a);this.el.hide();this.proxy.shift(Ext.apply(this.animateTarget.getBox(),{callback:this.afterHide,scope:this,duration:this.hideAnimDuration,easing:"easeNone",opacity:0}))},onShow:Ext.emptyFn,onHide:Ext.emptyFn,onWindowResize:function(){if(this.maximized){this.fitContainer()}if(this.modal){this.mask.setSize("100%","100%");var a=this.mask.dom.offsetHeight;this.mask.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true))}this.doConstrain()},doConstrain:function(){if(this.constrain||this.constrainHeader){var b;if(this.constrain){b={right:this.el.shadowOffset,left:this.el.shadowOffset,bottom:this.el.shadowOffset}}else{var a=this.getSize();b={right:-(a.width-100),bottom:-(a.height-25+this.el.getConstrainOffset())}}var c=this.el.getConstrainToXY(this.container,true,b);if(c){this.setPosition(c[0],c[1])}}},ghost:function(a){var c=this.createGhost(a);var b=this.getBox(true);c.setLeftTop(b.x,b.y);c.setWidth(b.width);this.el.hide();this.activeGhost=c;return c},unghost:function(b,a){if(!this.activeGhost){return}if(b!==false){this.el.show();this.focus.defer(10,this);if(Ext.isMac&&Ext.isGecko2){this.cascade(this.setAutoScroll)}}if(a!==false){this.setPosition(this.activeGhost.getLeft(true),this.activeGhost.getTop(true))}this.activeGhost.hide();this.activeGhost.remove();delete this.activeGhost},minimize:function(){this.fireEvent("minimize",this);return this},close:function(){if(this.fireEvent("beforeclose",this)!==false){if(this.hidden){this.doClose()}else{this.hide(null,this.doClose,this)}}},doClose:function(){this.fireEvent("close",this);this.destroy()},maximize:function(){if(!this.maximized){this.expand(false);this.restoreSize=this.getSize();this.restorePos=this.getPosition(true);if(this.maximizable){this.tools.maximize.hide();this.tools.restore.show()}this.maximized=true;this.el.disableShadow();if(this.dd){this.dd.lock()}if(this.collapsible){this.tools.toggle.hide()}this.el.addClass("x-window-maximized");this.container.addClass("x-window-maximized-ct");this.setPosition(0,0);this.fitContainer();this.fireEvent("maximize",this)}return this},restore:function(){if(this.maximized){var a=this.tools;this.el.removeClass("x-window-maximized");if(a.restore){a.restore.hide()}if(a.maximize){a.maximize.show()}this.setPosition(this.restorePos[0],this.restorePos[1]);this.setSize(this.restoreSize.width,this.restoreSize.height);delete this.restorePos;delete this.restoreSize;this.maximized=false;this.el.enableShadow(true);if(this.dd){this.dd.unlock()}if(this.collapsible&&a.toggle){a.toggle.show()}this.container.removeClass("x-window-maximized-ct");this.doConstrain();this.fireEvent("restore",this)}return this},toggleMaximize:function(){return this[this.maximized?"restore":"maximize"]()},fitContainer:function(){var a=this.container.getViewSize(false);this.setSize(a.width,a.height)},setZIndex:function(a){if(this.modal){this.mask.setStyle("z-index",a)}this.el.setZIndex(++a);a+=5;if(this.resizer){this.resizer.proxy.setStyle("z-index",++a)}this.lastZIndex=a},alignTo:function(b,a,c){var d=this.el.getAlignToXY(b,a,c);this.setPagePosition(d[0],d[1]);return this},anchorTo:function(c,e,d,b){this.clearAnchor();this.anchorTarget={el:c,alignment:e,offsets:d};Ext.EventManager.onWindowResize(this.doAnchor,this);var a=typeof b;if(a!="undefined"){Ext.EventManager.on(window,"scroll",this.doAnchor,this,{buffer:a=="number"?b:50})}return this.doAnchor()},doAnchor:function(){var a=this.anchorTarget;this.alignTo(a.el,a.alignment,a.offsets);return this},clearAnchor:function(){if(this.anchorTarget){Ext.EventManager.removeResizeListener(this.doAnchor,this);Ext.EventManager.un(window,"scroll",this.doAnchor,this);delete this.anchorTarget}return this},toFront:function(a){if(this.manager.bringToFront(this)){if(!a||!a.getTarget().focus){this.focus()}}return this},setActive:function(a){if(a){if(!this.maximized){this.el.enableShadow(true)}this.fireEvent("activate",this)}else{this.el.disableShadow();this.fireEvent("deactivate",this)}},toBack:function(){this.manager.sendToBack(this);return this},center:function(){var a=this.el.getAlignToXY(this.container,"c-c");this.setPagePosition(a[0],a[1]);return this}});Ext.reg("window",Ext.Window);Ext.Window.DD=Ext.extend(Ext.dd.DD,{constructor:function(a){this.win=a;Ext.Window.DD.superclass.constructor.call(this,a.el.id,"WindowDD-"+a.id);this.setHandleElId(a.header.id);this.scroll=false},moveOnly:true,headerOffsets:[100,25],startDrag:function(){var a=this.win;this.proxy=a.ghost(a.initialConfig.cls);if(a.constrain!==false){var c=a.el.shadowOffset;this.constrainTo(a.container,{right:c,left:c,bottom:c})}else{if(a.constrainHeader!==false){var b=this.proxy.getSize();this.constrainTo(a.container,{right:-(b.width-this.headerOffsets[0]),bottom:-(b.height-this.headerOffsets[1])})}}},b4Drag:Ext.emptyFn,onDrag:function(a){this.alignElWithMouse(this.proxy,a.getPageX(),a.getPageY())},endDrag:function(a){this.win.unghost();this.win.saveState()}});Ext.WindowGroup=function(){var g={};var d=[];var e=null;var c=function(j,i){return(!j._lastAccess||j._lastAccess<i._lastAccess)?-1:1};var h=function(){var l=d,j=l.length;if(j>0){l.sort(c);var k=l[0].manager.zseed;for(var m=0;m<j;m++){var n=l[m];if(n&&!n.hidden){n.setZIndex(k+(m*10))}}}a()};var b=function(i){if(i!=e){if(e){e.setActive(false)}e=i;if(i){i.setActive(true)}}};var a=function(){for(var j=d.length-1;j>=0;--j){if(!d[j].hidden){b(d[j]);return}}b(null)};return{zseed:9000,register:function(i){if(i.manager){i.manager.unregister(i)}i.manager=this;g[i.id]=i;d.push(i);i.on("hide",a)},unregister:function(i){delete i.manager;delete g[i.id];i.un("hide",a);d.remove(i)},get:function(i){return typeof i=="object"?i:g[i]},bringToFront:function(i){i=this.get(i);if(i!=e){i._lastAccess=new Date().getTime();h();return true}return false},sendToBack:function(i){i=this.get(i);i._lastAccess=-(new Date().getTime());h();return i},hideAll:function(){for(var i in g){if(g[i]&&typeof g[i]!="function"&&g[i].isVisible()){g[i].hide()}}},getActive:function(){return e},getBy:function(l,k){var m=[];for(var j=d.length-1;j>=0;--j){var n=d[j];if(l.call(k||n,n)!==false){m.push(n)}}return m},each:function(j,i){for(var k in g){if(g[k]&&typeof g[k]!="function"){if(j.call(i||g[k],g[k])===false){return}}}}}};Ext.WindowMgr=new Ext.WindowGroup();Ext.MessageBox=function(){var u,b,q,t,h,l,s,a,n,p,j,g,r,v,o,i="",d="",m=["ok","yes","no","cancel"];var c=function(x){r[x].blur();if(u.isVisible()){u.hide();w();Ext.callback(b.fn,b.scope||window,[x,v.dom.value,b],1)}};var w=function(){if(b&&b.cls){u.el.removeClass(b.cls)}n.reset()};var e=function(z,x,y){if(b&&b.closable!==false){u.hide();w()}if(y){y.stopEvent()}};var k=function(x){var z=0,y;if(!x){Ext.each(m,function(A){r[A].hide()});return z}u.footer.dom.style.display="";Ext.iterate(r,function(A,B){y=x[A];if(y){B.show();B.setText(Ext.isString(y)?y:Ext.MessageBox.buttonText[A]);z+=B.getEl().getWidth()+15}else{B.hide()}});return z};return{getDialog:function(x){if(!u){var z=[];r={};Ext.each(m,function(A){z.push(r[A]=new Ext.Button({text:this.buttonText[A],handler:c.createCallback(A),hideMode:"offsets"}))},this);u=new Ext.Window({autoCreate:true,title:x,resizable:false,constrain:true,constrainHeader:true,minimizable:false,maximizable:false,stateful:false,modal:true,shim:true,buttonAlign:"center",width:400,height:100,minHeight:80,plain:true,footer:true,closable:true,close:function(){if(b&&b.buttons&&b.buttons.no&&!b.buttons.cancel){c("no")}else{c("cancel")}},fbar:new Ext.Toolbar({items:z,enableOverflow:false})});u.render(document.body);u.getEl().addClass("x-window-dlg");q=u.mask;h=u.body.createChild({html:'<div class="ext-mb-icon"></div><div class="ext-mb-content"><span class="ext-mb-text"></span><br /><div class="ext-mb-fix-cursor"><input type="text" class="ext-mb-input" /><textarea class="ext-mb-textarea"></textarea></div></div>'});j=Ext.get(h.dom.firstChild);var y=h.dom.childNodes[1];l=Ext.get(y.firstChild);s=Ext.get(y.childNodes[2].firstChild);s.enableDisplayMode();s.addKeyListener([10,13],function(){if(u.isVisible()&&b&&b.buttons){if(b.buttons.ok){c("ok")}else{if(b.buttons.yes){c("yes")}}}});a=Ext.get(y.childNodes[2].childNodes[1]);a.enableDisplayMode();n=new Ext.ProgressBar({renderTo:h});h.createChild({cls:"x-clear"})}return u},updateText:function(A){if(!u.isVisible()&&!b.width){u.setSize(this.maxWidth,100)}l.update(A?A+" ":"&#160;");var y=d!=""?(j.getWidth()+j.getMargins("lr")):0,C=l.getWidth()+l.getMargins("lr"),z=u.getFrameWidth("lr"),B=u.body.getFrameWidth("lr"),x;x=Math.max(Math.min(b.width||y+C+z+B,b.maxWidth||this.maxWidth),Math.max(b.minWidth||this.minWidth,o||0));if(b.prompt===true){v.setWidth(x-y-z-B)}if(b.progress===true||b.wait===true){n.setSize(x-y-z-B)}if(Ext.isIE9m&&x==o){x+=4}l.update(A||"&#160;");u.setSize(x,"auto").center();return this},updateProgress:function(y,x,z){n.updateProgress(y,x);if(z){this.updateText(z)}return this},isVisible:function(){return u&&u.isVisible()},hide:function(){var x=u?u.activeGhost:null;if(this.isVisible()||x){u.hide();w();if(x){u.unghost(false,false)}}return this},show:function(A){if(this.isVisible()){this.hide()}b=A;var B=this.getDialog(b.title||"&#160;");B.setTitle(b.title||"&#160;");var x=(b.closable!==false&&b.progress!==true&&b.wait!==true);B.tools.close.setDisplayed(x);v=s;b.prompt=b.prompt||(b.multiline?true:false);if(b.prompt){if(b.multiline){s.hide();a.show();a.setHeight(Ext.isNumber(b.multiline)?b.multiline:this.defaultTextHeight);v=a}else{s.show();a.hide()}}else{s.hide();a.hide()}v.dom.value=b.value||"";if(b.prompt){B.focusEl=v}else{var z=b.buttons;var y=null;if(z&&z.ok){y=r.ok}else{if(z&&z.yes){y=r.yes}}if(y){B.focusEl=y}}if(Ext.isDefined(b.iconCls)){B.setIconClass(b.iconCls)}this.setIcon(Ext.isDefined(b.icon)?b.icon:i);o=k(b.buttons);n.setVisible(b.progress===true||b.wait===true);this.updateProgress(0,b.progressText);this.updateText(b.msg);if(b.cls){B.el.addClass(b.cls)}B.proxyDrag=b.proxyDrag===true;B.modal=b.modal!==false;B.mask=b.modal!==false?q:false;if(!B.isVisible()){document.body.appendChild(u.el.dom);B.setAnimateTarget(b.animEl);B.on("show",function(){if(x===true){B.keyMap.enable()}else{B.keyMap.disable()}},this,{single:true});B.show(b.animEl)}if(b.wait===true){n.wait(b.waitConfig)}return this},setIcon:function(x){if(!u){i=x;return}i=undefined;if(x&&x!=""){j.removeClass("x-hidden");j.replaceClass(d,x);h.addClass("x-dlg-icon");d=x}else{j.replaceClass(d,"x-hidden");h.removeClass("x-dlg-icon");d=""}return this},progress:function(z,y,x){this.show({title:z,msg:y,buttons:false,progress:true,closable:false,minWidth:this.minProgressWidth,progressText:x});return this},wait:function(z,y,x){this.show({title:y,msg:z,buttons:false,closable:false,wait:true,modal:true,minWidth:this.minProgressWidth,waitConfig:x});return this},alert:function(A,z,y,x){this.show({title:A,msg:z,buttons:this.OK,fn:y,scope:x,minWidth:this.minWidth});return this},confirm:function(A,z,y,x){this.show({title:A,msg:z,buttons:this.YESNO,fn:y,scope:x,icon:this.QUESTION,minWidth:this.minWidth});return this},prompt:function(C,B,z,y,x,A){this.show({title:C,msg:B,buttons:this.OKCANCEL,fn:z,minWidth:this.minPromptWidth,scope:y,prompt:true,multiline:x,value:A});return this},OK:{ok:true},CANCEL:{cancel:true},OKCANCEL:{ok:true,cancel:true},YESNO:{yes:true,no:true},YESNOCANCEL:{yes:true,no:true,cancel:true},INFO:"ext-mb-info",WARNING:"ext-mb-warning",QUESTION:"ext-mb-question",ERROR:"ext-mb-error",defaultTextHeight:75,maxWidth:600,minWidth:100,minProgressWidth:250,minPromptWidth:250,buttonText:{ok:"OK",cancel:"Cancel",yes:"Yes",no:"No"}}}();Ext.Msg=Ext.MessageBox;Ext.dd.PanelProxy=Ext.extend(Object,{constructor:function(a,b){this.panel=a;this.id=this.panel.id+"-ddproxy";Ext.apply(this,b)},insertProxy:true,setStatus:Ext.emptyFn,reset:Ext.emptyFn,update:Ext.emptyFn,stop:Ext.emptyFn,sync:Ext.emptyFn,getEl:function(){return this.ghost},getGhost:function(){return this.ghost},getProxy:function(){return this.proxy},hide:function(){if(this.ghost){if(this.proxy){this.proxy.remove();delete this.proxy}this.panel.el.dom.style.display="";this.ghost.remove();delete this.ghost}},show:function(){if(!this.ghost){this.ghost=this.panel.createGhost(this.panel.initialConfig.cls,undefined,Ext.getBody());this.ghost.setXY(this.panel.el.getXY());if(this.insertProxy){this.proxy=this.panel.el.insertSibling({cls:"x-panel-dd-spacer"});this.proxy.setSize(this.panel.getSize())}this.panel.el.dom.style.display="none"}},repair:function(b,c,a){this.hide();if(typeof c=="function"){c.call(a||this)}},moveProxy:function(a,b){if(this.proxy){a.insertBefore(this.proxy.dom,b)}}});Ext.Panel.DD=Ext.extend(Ext.dd.DragSource,{constructor:function(b,a){this.panel=b;this.dragData={panel:b};this.proxy=new Ext.dd.PanelProxy(b,a);Ext.Panel.DD.superclass.constructor.call(this,b.el,a);var d=b.header,c=b.body;if(d){this.setHandleElId(d.id);c=b.header}c.setStyle("cursor","move");this.scroll=false},showFrame:Ext.emptyFn,startDrag:Ext.emptyFn,b4StartDrag:function(a,b){this.proxy.show()},b4MouseDown:function(b){var a=b.getPageX(),c=b.getPageY();this.autoOffset(a,c)},onInitDrag:function(a,b){this.onStartDrag(a,b);return true},createFrame:Ext.emptyFn,getDragEl:function(a){return this.proxy.ghost.dom},endDrag:function(a){this.proxy.hide();this.panel.saveState()},autoOffset:function(a,b){a-=this.startPageX;b-=this.startPageY;this.setDelta(a,b)}});Ext.state.Provider=Ext.extend(Ext.util.Observable,{constructor:function(){this.addEvents("statechange");this.state={};Ext.state.Provider.superclass.constructor.call(this)},get:function(b,a){return typeof this.state[b]=="undefined"?a:this.state[b]},clear:function(a){delete this.state[a];this.fireEvent("statechange",this,a,null)},set:function(a,b){this.state[a]=b;this.fireEvent("statechange",this,a,b)},decodeValue:function(b){var e=/^(a|n|d|b|s|o|e)\:(.*)$/,h=e.exec(unescape(b)),d,c,a,g;if(!h||!h[1]){return}c=h[1];a=h[2];switch(c){case"e":return null;case"n":return parseFloat(a);case"d":return new Date(Date.parse(a));case"b":return(a=="1");case"a":d=[];if(a!=""){Ext.each(a.split("^"),function(i){d.push(this.decodeValue(i))},this)}return d;case"o":d={};if(a!=""){Ext.each(a.split("^"),function(i){g=i.split("=");d[g[0]]=this.decodeValue(g[1])},this)}return d;default:return a}},encodeValue:function(c){var b,g="",e=0,a,d;if(c==null){return"e:1"}else{if(typeof c=="number"){b="n:"+c}else{if(typeof c=="boolean"){b="b:"+(c?"1":"0")}else{if(Ext.isDate(c)){b="d:"+c.toGMTString()}else{if(Ext.isArray(c)){for(a=c.length;e<a;e++){g+=this.encodeValue(c[e]);if(e!=a-1){g+="^"}}b="a:"+g}else{if(typeof c=="object"){for(d in c){if(typeof c[d]!="function"&&c[d]!==undefined){g+=d+"="+this.encodeValue(c[d])+"^"}}b="o:"+g.substring(0,g.length-1)}else{b="s:"+c}}}}}}return escape(b)}});Ext.state.Manager=function(){var a=new Ext.state.Provider();return{setProvider:function(b){a=b},get:function(c,b){return a.get(c,b)},set:function(b,c){a.set(b,c)},clear:function(b){a.clear(b)},getProvider:function(){return a}}}();Ext.state.CookieProvider=Ext.extend(Ext.state.Provider,{constructor:function(a){Ext.state.CookieProvider.superclass.constructor.call(this);this.path="/";this.expires=new Date(new Date().getTime()+(1000*60*60*24*7));this.domain=null;this.secure=false;Ext.apply(this,a);this.state=this.readCookies()},set:function(a,b){if(typeof b=="undefined"||b===null){this.clear(a);return}this.setCookie(a,b);Ext.state.CookieProvider.superclass.set.call(this,a,b)},clear:function(a){this.clearCookie(a);Ext.state.CookieProvider.superclass.clear.call(this,a)},readCookies:function(){var d={},h=document.cookie+";",b=/\s?(.*?)=(.*?);/g,g,a,e;while((g=b.exec(h))!=null){a=g[1];e=g[2];if(a&&a.substring(0,3)=="ys-"){d[a.substr(3)]=this.decodeValue(e)}}return d},setCookie:function(a,b){document.cookie="ys-"+a+"="+this.encodeValue(b)+((this.expires==null)?"":("; expires="+this.expires.toGMTString()))+((this.path==null)?"":("; path="+this.path))+((this.domain==null)?"":("; domain="+this.domain))+((this.secure==true)?"; secure":"")},clearCookie:function(a){document.cookie="ys-"+a+"=null; expires=Thu, 01-Jan-70 00:00:01 GMT"+((this.path==null)?"":("; path="+this.path))+((this.domain==null)?"":("; domain="+this.domain))+((this.secure==true)?"; secure":"")}});Ext.DataView=Ext.extend(Ext.BoxComponent,{selectedClass:"x-view-selected",emptyText:"",deferEmptyText:true,trackOver:false,blockRefresh:false,last:false,initComponent:function(){Ext.DataView.superclass.initComponent.call(this);if(Ext.isString(this.tpl)||Ext.isArray(this.tpl)){this.tpl=new Ext.XTemplate(this.tpl)}this.addEvents("beforeclick","click","mouseenter","mouseleave","containerclick","dblclick","contextmenu","containercontextmenu","selectionchange","beforeselect");this.store=Ext.StoreMgr.lookup(this.store);this.all=new Ext.CompositeElementLite();this.selected=new Ext.CompositeElementLite()},afterRender:function(){Ext.DataView.superclass.afterRender.call(this);this.mon(this.getTemplateTarget(),{click:this.onClick,dblclick:this.onDblClick,contextmenu:this.onContextMenu,scope:this});if(this.overClass||this.trackOver){this.mon(this.getTemplateTarget(),{mouseover:this.onMouseOver,mouseout:this.onMouseOut,scope:this})}if(this.store){this.bindStore(this.store,true)}},refresh:function(){this.clearSelections(false,true);var b=this.getTemplateTarget(),a=this.store.getRange();b.update("");if(a.length<1){if(!this.deferEmptyText||this.hasSkippedEmptyText){b.update(this.emptyText)}this.all.clear()}else{this.tpl.overwrite(b,this.collectData(a,0));this.all.fill(Ext.query(this.itemSelector,b.dom));this.updateIndexes(0)}this.hasSkippedEmptyText=true},getTemplateTarget:function(){return this.el},prepareData:function(a){return a},collectData:function(b,e){var d=[],c=0,a=b.length;for(;c<a;c++){d[d.length]=this.prepareData(b[c].data,e+c,b[c])}return d},bufferRender:function(a,b){var c=document.createElement("div");this.tpl.overwrite(c,this.collectData(a,b));return Ext.query(this.itemSelector,c)},onUpdate:function(g,a){var b=this.store.indexOf(a);if(b>-1){var e=this.isSelected(b),c=this.all.elements[b],d=this.bufferRender([a],b)[0];this.all.replaceElement(b,d,true);if(e){this.selected.replaceElement(c,d);this.all.item(b).addClass(this.selectedClass)}this.updateIndexes(b,b)}},onAdd:function(g,d,e){if(this.all.getCount()===0){this.refresh();return}var c=this.bufferRender(d,e),h,b=this.all.elements;if(e<this.all.getCount()){h=this.all.item(e).insertSibling(c,"before",true);b.splice.apply(b,[e,0].concat(c))}else{h=this.all.last().insertSibling(c,"after",true);b.push.apply(b,c)}this.updateIndexes(e)},onRemove:function(c,a,b){this.deselect(b);this.all.removeElement(b,true);this.updateIndexes(b);if(this.store.getCount()===0){this.refresh()}},refreshNode:function(a){this.onUpdate(this.store,this.store.getAt(a))},updateIndexes:function(d,c){var b=this.all.elements;d=d||0;c=c||((c===0)?0:(b.length-1));for(var a=d;a<=c;a++){b[a].viewIndex=a}},getStore:function(){return this.store},bindStore:function(a,b){if(!b&&this.store){if(a!==this.store&&this.store.autoDestroy){this.store.destroy()}else{this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("datachanged",this.onDataChanged,this);this.store.un("add",this.onAdd,this);this.store.un("remove",this.onRemove,this);this.store.un("update",this.onUpdate,this);this.store.un("clear",this.refresh,this)}if(!a){this.store=null}}if(a){a=Ext.StoreMgr.lookup(a);a.on({scope:this,beforeload:this.onBeforeLoad,datachanged:this.onDataChanged,add:this.onAdd,remove:this.onRemove,update:this.onUpdate,clear:this.refresh})}this.store=a;if(a){this.refresh()}},onDataChanged:function(){if(this.blockRefresh!==true){this.refresh.apply(this,arguments)}},findItemFromChild:function(a){return Ext.fly(a).findParent(this.itemSelector,this.getTemplateTarget())},onClick:function(c){var b=c.getTarget(this.itemSelector,this.getTemplateTarget()),a;if(b){a=this.indexOf(b);if(this.onItemClick(b,a,c)!==false){this.fireEvent("click",this,a,b,c)}}else{if(this.fireEvent("containerclick",this,c)!==false){this.onContainerClick(c)}}},onContainerClick:function(a){this.clearSelections()},onContextMenu:function(b){var a=b.getTarget(this.itemSelector,this.getTemplateTarget());if(a){this.fireEvent("contextmenu",this,this.indexOf(a),a,b)}else{this.fireEvent("containercontextmenu",this,b)}},onDblClick:function(b){var a=b.getTarget(this.itemSelector,this.getTemplateTarget());if(a){this.fireEvent("dblclick",this,this.indexOf(a),a,b)}},onMouseOver:function(b){var a=b.getTarget(this.itemSelector,this.getTemplateTarget());if(a&&a!==this.lastItem){this.lastItem=a;Ext.fly(a).addClass(this.overClass);this.fireEvent("mouseenter",this,this.indexOf(a),a,b)}},onMouseOut:function(a){if(this.lastItem){if(!a.within(this.lastItem,true,true)){Ext.fly(this.lastItem).removeClass(this.overClass);this.fireEvent("mouseleave",this,this.indexOf(this.lastItem),this.lastItem,a);delete this.lastItem}}},onItemClick:function(b,a,c){if(this.fireEvent("beforeclick",this,a,b,c)===false){return false}if(this.multiSelect){this.doMultiSelection(b,a,c);c.preventDefault()}else{if(this.singleSelect){this.doSingleSelection(b,a,c);c.preventDefault()}}return true},doSingleSelection:function(b,a,c){if(c.ctrlKey&&this.isSelected(a)){this.deselect(a)}else{this.select(a,false)}},doMultiSelection:function(c,a,d){if(d.shiftKey&&this.last!==false){var b=this.last;this.selectRange(b,a,d.ctrlKey);this.last=b}else{if((d.ctrlKey||this.simpleSelect)&&this.isSelected(a)){this.deselect(a)}else{this.select(a,d.ctrlKey||d.shiftKey||this.simpleSelect)}}},getSelectionCount:function(){return this.selected.getCount()},getSelectedNodes:function(){return this.selected.elements},getSelectedIndexes:function(){var b=[],d=this.selected.elements,c=0,a=d.length;for(;c<a;c++){b.push(d[c].viewIndex)}return b},getSelectedRecords:function(){return this.getRecords(this.selected.elements)},getRecords:function(c){var b=[],d=0,a=c.length;for(;d<a;d++){b[b.length]=this.store.getAt(c[d].viewIndex)}return b},getRecord:function(a){return this.store.getAt(a.viewIndex)},clearSelections:function(a,b){if((this.multiSelect||this.singleSelect)&&this.selected.getCount()>0){if(!b){this.selected.removeClass(this.selectedClass)}this.selected.clear();this.last=false;if(!a){this.fireEvent("selectionchange",this,this.selected.elements)}}},isSelected:function(a){return this.selected.contains(this.getNode(a))},deselect:function(a){if(this.isSelected(a)){a=this.getNode(a);this.selected.removeElement(a);if(this.last==a.viewIndex){this.last=false}Ext.fly(a).removeClass(this.selectedClass);this.fireEvent("selectionchange",this,this.selected.elements)}},select:function(d,g,b){if(Ext.isArray(d)){if(!g){this.clearSelections(true)}for(var c=0,a=d.length;c<a;c++){this.select(d[c],true,true)}if(!b){this.fireEvent("selectionchange",this,this.selected.elements)}}else{var e=this.getNode(d);if(!g){this.clearSelections(true)}if(e&&!this.isSelected(e)){if(this.fireEvent("beforeselect",this,e,this.selected.elements)!==false){Ext.fly(e).addClass(this.selectedClass);this.selected.add(e);this.last=e.viewIndex;if(!b){this.fireEvent("selectionchange",this,this.selected.elements)}}}}},selectRange:function(c,a,b){if(!b){this.clearSelections(true)}this.select(this.getNodes(c,a),true)},getNode:function(b){if(Ext.isString(b)){return document.getElementById(b)}else{if(Ext.isNumber(b)){return this.all.elements[b]}else{if(b instanceof Ext.data.Record){var a=this.store.indexOf(b);return this.all.elements[a]}}}return b},getNodes:function(e,a){var d=this.all.elements,b=[],c;e=e||0;a=!Ext.isDefined(a)?Math.max(d.length-1,0):a;if(e<=a){for(c=e;c<=a&&d[c];c++){b.push(d[c])}}else{for(c=e;c>=a&&d[c];c--){b.push(d[c])}}return b},indexOf:function(a){a=this.getNode(a);if(Ext.isNumber(a.viewIndex)){return a.viewIndex}return this.all.indexOf(a)},onBeforeLoad:function(){if(this.loadingText){this.clearSelections(false,true);this.getTemplateTarget().update('<div class="loading-indicator">'+this.loadingText+"</div>");this.all.clear()}},onDestroy:function(){this.all.clear();this.selected.clear();Ext.DataView.superclass.onDestroy.call(this);this.bindStore(null)}});Ext.DataView.prototype.setStore=Ext.DataView.prototype.bindStore;Ext.reg("dataview",Ext.DataView);Ext.list.ListView=Ext.extend(Ext.DataView,{itemSelector:"dl",selectedClass:"x-list-selected",overClass:"x-list-over",scrollOffset:undefined,columnResize:true,columnSort:true,maxColumnWidth:Ext.isIE9m?99:100,initComponent:function(){if(this.columnResize){this.colResizer=new Ext.list.ColumnResizer(this.colResizer);this.colResizer.init(this)}if(this.columnSort){this.colSorter=new Ext.list.Sorter(this.columnSort);this.colSorter.init(this)}if(!this.internalTpl){this.internalTpl=new Ext.XTemplate('<div class="x-list-header"><div class="x-list-header-inner">','<tpl for="columns">','<div style="width:{[values.width*100]}%;text-align:{align};"><em class="x-unselectable" unselectable="on" id="',this.id,'-xlhd-{#}">',"{header}","</em></div>","</tpl>",'<div class="x-clear"></div>',"</div></div>",'<div class="x-list-body"><div class="x-list-body-inner">',"</div></div>")}if(!this.tpl){this.tpl=new Ext.XTemplate('<tpl for="rows">',"<dl>",'<tpl for="parent.columns">','<dt style="width:{[values.width*100]}%;text-align:{align};">','<em unselectable="on"<tpl if="cls"> class="{cls}</tpl>">',"{[values.tpl.apply(parent)]}","</em></dt>","</tpl>",'<div class="x-clear"></div>',"</dl>","</tpl>")}var l=this.columns,h=0,k=0,m=l.length,b=[];for(var g=0;g<m;g++){var n=l[g];if(!n.isColumn){n.xtype=n.xtype?(/^lv/.test(n.xtype)?n.xtype:"lv"+n.xtype):"lvcolumn";n=Ext.create(n)}if(n.width){h+=n.width*100;if(h>this.maxColumnWidth){n.width-=(h-this.maxColumnWidth)/100}k++}b.push(n)}l=this.columns=b;if(k<m){var d=m-k;if(h<this.maxColumnWidth){var a=((this.maxColumnWidth-h)/d)/100;for(var e=0;e<m;e++){var n=l[e];if(!n.width){n.width=a}}}}Ext.list.ListView.superclass.initComponent.call(this)},onRender:function(){this.autoEl={cls:"x-list-wrap"};Ext.list.ListView.superclass.onRender.apply(this,arguments);this.internalTpl.overwrite(this.el,{columns:this.columns});this.innerBody=Ext.get(this.el.dom.childNodes[1].firstChild);this.innerHd=Ext.get(this.el.dom.firstChild.firstChild);if(this.hideHeaders){this.el.dom.firstChild.style.display="none"}},getTemplateTarget:function(){return this.innerBody},collectData:function(){var a=Ext.list.ListView.superclass.collectData.apply(this,arguments);return{columns:this.columns,rows:a}},verifyInternalSize:function(){if(this.lastSize){this.onResize(this.lastSize.width,this.lastSize.height)}},onResize:function(c,e){var b=this.innerBody.dom,g=this.innerHd.dom,d=c-Ext.num(this.scrollOffset,Ext.getScrollBarWidth())+"px",a;if(!b){return}a=b.parentNode;if(Ext.isNumber(c)){if(this.reserveScrollOffset||((a.offsetWidth-a.clientWidth)>10)){b.style.width=d;g.style.width=d}else{b.style.width=c+"px";g.style.width=c+"px";setTimeout(function(){if((a.offsetWidth-a.clientWidth)>10){b.style.width=d;g.style.width=d}},10)}}if(Ext.isNumber(e)){a.style.height=Math.max(0,e-g.parentNode.offsetHeight)+"px"}},updateIndexes:function(){Ext.list.ListView.superclass.updateIndexes.apply(this,arguments);this.verifyInternalSize()},findHeaderIndex:function(g){g=g.dom||g;var a=g.parentNode,d=a.parentNode.childNodes,b=0,e;for(;e=d[b];b++){if(e==a){return b}}return -1},setHdWidths:function(){var d=this.innerHd.dom.getElementsByTagName("div"),c=0,b=this.columns,a=b.length;for(;c<a;c++){d[c].style.width=(b[c].width*100)+"%"}}});Ext.reg("listview",Ext.list.ListView);Ext.ListView=Ext.list.ListView;Ext.list.Column=Ext.extend(Object,{isColumn:true,align:"left",header:"",width:null,cls:"",constructor:function(a){if(!a.tpl){a.tpl=new Ext.XTemplate("{"+a.dataIndex+"}")}else{if(Ext.isString(a.tpl)){a.tpl=new Ext.XTemplate(a.tpl)}}Ext.apply(this,a)}});Ext.reg("lvcolumn",Ext.list.Column);Ext.list.NumberColumn=Ext.extend(Ext.list.Column,{format:"0,000.00",constructor:function(a){a.tpl=a.tpl||new Ext.XTemplate("{"+a.dataIndex+':number("'+(a.format||this.format)+'")}');Ext.list.NumberColumn.superclass.constructor.call(this,a)}});Ext.reg("lvnumbercolumn",Ext.list.NumberColumn);Ext.list.DateColumn=Ext.extend(Ext.list.Column,{format:"m/d/Y",constructor:function(a){a.tpl=a.tpl||new Ext.XTemplate("{"+a.dataIndex+':date("'+(a.format||this.format)+'")}');Ext.list.DateColumn.superclass.constructor.call(this,a)}});Ext.reg("lvdatecolumn",Ext.list.DateColumn);Ext.list.BooleanColumn=Ext.extend(Ext.list.Column,{trueText:"true",falseText:"false",undefinedText:"&#160;",constructor:function(e){e.tpl=e.tpl||new Ext.XTemplate("{"+e.dataIndex+":this.format}");var b=this.trueText,d=this.falseText,a=this.undefinedText;e.tpl.format=function(c){if(c===undefined){return a}if(!c||c==="false"){return d}return b};Ext.list.DateColumn.superclass.constructor.call(this,e)}});Ext.reg("lvbooleancolumn",Ext.list.BooleanColumn);Ext.list.ColumnResizer=Ext.extend(Ext.util.Observable,{minPct:0.05,constructor:function(a){Ext.apply(this,a);Ext.list.ColumnResizer.superclass.constructor.call(this)},init:function(a){this.view=a;a.on("render",this.initEvents,this)},initEvents:function(a){a.mon(a.innerHd,"mousemove",this.handleHdMove,this);this.tracker=new Ext.dd.DragTracker({onBeforeStart:this.onBeforeStart.createDelegate(this),onStart:this.onStart.createDelegate(this),onDrag:this.onDrag.createDelegate(this),onEnd:this.onEnd.createDelegate(this),tolerance:3,autoStart:300});this.tracker.initEl(a.innerHd);a.on("beforedestroy",this.tracker.destroy,this.tracker)},handleHdMove:function(i,d){var c=5,b=i.getPageX(),j=i.getTarget("em",3,true);if(j){var h=j.getRegion(),g=j.dom.style,a=j.dom.parentNode;if(b-h.left<=c&&a!=a.parentNode.firstChild){this.activeHd=Ext.get(a.previousSibling.firstChild);g.cursor=Ext.isWebKit?"e-resize":"col-resize"}else{if(h.right-b<=c&&a!=a.parentNode.lastChild.previousSibling){this.activeHd=j;g.cursor=Ext.isWebKit?"w-resize":"col-resize"}else{delete this.activeHd;g.cursor=""}}}},onBeforeStart:function(a){this.dragHd=this.activeHd;return !!this.dragHd},onStart:function(g){var d=this,b=d.view,c=d.dragHd,a=d.tracker.getXY()[0];d.proxy=b.el.createChild({cls:"x-list-resizer"});d.dragX=c.getX();d.headerIndex=b.findHeaderIndex(c);d.headersDisabled=b.disableHeaders;b.disableHeaders=true;d.proxy.setHeight(b.el.getHeight());d.proxy.setX(d.dragX);d.proxy.setWidth(a-d.dragX);this.setBoundaries()},setBoundaries:function(j){var k=this.view,h=this.headerIndex,c=k.innerHd.getWidth(),j=k.innerHd.getX(),b=Math.ceil(c*this.minPct),l=c-b,e=k.columns.length,d=k.innerHd.select("em",true),g=b+j,a=l+j,i;if(e==2){this.minX=g;this.maxX=a}else{i=d.item(h+2);this.minX=d.item(h).getX()+b;this.maxX=i?i.getX()-b:a;if(h==0){this.minX=g}else{if(h==e-2){this.maxX=a}}}},onDrag:function(c){var b=this,a=b.tracker.getXY()[0].constrain(b.minX,b.maxX);b.proxy.setWidth(a-this.dragX)},onEnd:function(i){var g=this.proxy.getWidth(),h=this.headerIndex,l=this.view,c=l.columns,b=l.innerHd.getWidth(),k=Math.ceil(g*l.maxColumnWidth/b)/100,d=this.headersDisabled,m=c[h],j=c[h+1],a=m.width+j.width;this.proxy.remove();m.width=k;j.width=a-k;delete this.dragHd;l.setHdWidths();l.refresh();setTimeout(function(){l.disableHeaders=d},100)}});Ext.ListView.ColumnResizer=Ext.list.ColumnResizer;Ext.list.Sorter=Ext.extend(Ext.util.Observable,{sortClasses:["sort-asc","sort-desc"],constructor:function(a){Ext.apply(this,a);Ext.list.Sorter.superclass.constructor.call(this)},init:function(a){this.view=a;a.on("render",this.initEvents,this)},initEvents:function(a){a.mon(a.innerHd,"click",this.onHdClick,this);a.innerHd.setStyle("cursor","pointer");a.mon(a.store,"datachanged",this.updateSortState,this);this.updateSortState.defer(10,this,[a.store])},updateSortState:function(c){var g=c.getSortState();if(!g){return}this.sortState=g;var e=this.view.columns,h=-1;for(var d=0,a=e.length;d<a;d++){if(e[d].dataIndex==g.field){h=d;break}}if(h!=-1){var b=g.direction;this.updateSortIcon(h,b)}},updateSortIcon:function(b,a){var d=this.sortClasses;var c=this.view.innerHd.select("em").removeClass(d);c.item(b).addClass(d[a=="DESC"?1:0])},onHdClick:function(c){var b=c.getTarget("em",3);if(b&&!this.view.disableHeaders){var a=this.view.findHeaderIndex(b);this.view.store.sort(this.view.columns[a].dataIndex)}}});Ext.ListView.Sorter=Ext.list.Sorter;Ext.TabPanel=Ext.extend(Ext.Panel,{deferredRender:true,tabWidth:120,minTabWidth:30,resizeTabs:false,enableTabScroll:false,scrollIncrement:0,scrollRepeatInterval:400,scrollDuration:0.35,animScroll:true,tabPosition:"top",baseCls:"x-tab-panel",autoTabs:false,autoTabSelector:"div.x-tab",activeTab:undefined,tabMargin:2,plain:false,wheelIncrement:20,idDelimiter:"__",itemCls:"x-tab-item",elements:"body",headerAsText:false,frame:false,hideBorders:true,initComponent:function(){this.frame=false;Ext.TabPanel.superclass.initComponent.call(this);this.addEvents("beforetabchange","tabchange","contextmenu");this.setLayout(new Ext.layout.CardLayout(Ext.apply({layoutOnCardChange:this.layoutOnTabChange,deferredRender:this.deferredRender},this.layoutConfig)));if(this.tabPosition=="top"){this.elements+=",header";this.stripTarget="header"}else{this.elements+=",footer";this.stripTarget="footer"}if(!this.stack){this.stack=Ext.TabPanel.AccessStack()}this.initItems()},onRender:function(c,a){Ext.TabPanel.superclass.onRender.call(this,c,a);if(this.plain){var g=this.tabPosition=="top"?"header":"footer";this[g].addClass("x-tab-panel-"+g+"-plain")}var b=this[this.stripTarget];this.stripWrap=b.createChild({cls:"x-tab-strip-wrap",cn:{tag:"ul",cls:"x-tab-strip x-tab-strip-"+this.tabPosition}});var e=(this.tabPosition=="bottom"?this.stripWrap:null);b.createChild({cls:"x-tab-strip-spacer"},e);this.strip=new Ext.Element(this.stripWrap.dom.firstChild);this.edge=this.strip.createChild({tag:"li",cls:"x-tab-edge",cn:[{tag:"span",cls:"x-tab-strip-text",cn:"&#160;"}]});this.strip.createChild({cls:"x-clear"});this.body.addClass("x-tab-panel-body-"+this.tabPosition);if(!this.itemTpl){var d=new Ext.Template('<li class="{cls}" id="{id}"><a class="x-tab-strip-close"></a>','<a class="x-tab-right" href="#"><em class="x-tab-left">','<span class="x-tab-strip-inner"><span class="x-tab-strip-text {iconCls}">{text}</span></span>',"</em></a></li>");d.disableFormats=true;d.compile();Ext.TabPanel.prototype.itemTpl=d}this.items.each(this.initTab,this)},afterRender:function(){Ext.TabPanel.superclass.afterRender.call(this);if(this.autoTabs){this.readTabs(false)}if(this.activeTab!==undefined){var a=Ext.isObject(this.activeTab)?this.activeTab:this.items.get(this.activeTab);delete this.activeTab;this.setActiveTab(a)}},initEvents:function(){Ext.TabPanel.superclass.initEvents.call(this);this.mon(this.strip,{scope:this,mousedown:this.onStripMouseDown,contextmenu:this.onStripContextMenu});if(this.enableTabScroll){this.mon(this.strip,"mousewheel",this.onWheel,this)}},findTargets:function(c){var b=null,a=c.getTarget("li:not(.x-tab-edge)",this.strip);if(a){b=this.getComponent(a.id.split(this.idDelimiter)[1]);if(b.disabled){return{close:null,item:null,el:null}}}return{close:c.getTarget(".x-tab-strip-close",this.strip),item:b,el:a}},onStripMouseDown:function(b){if(b.button!==0){return}b.preventDefault();var a=this.findTargets(b);if(a.close){if(a.item.fireEvent("beforeclose",a.item)!==false){a.item.fireEvent("close",a.item);this.remove(a.item)}return}if(a.item&&a.item!=this.activeTab){this.setActiveTab(a.item)}},onStripContextMenu:function(b){b.preventDefault();var a=this.findTargets(b);if(a.item){this.fireEvent("contextmenu",this,a.item,b)}},readTabs:function(d){if(d===true){this.items.each(function(h){this.remove(h)},this)}var c=this.el.query(this.autoTabSelector);for(var b=0,a=c.length;b<a;b++){var e=c[b],g=e.getAttribute("title");e.removeAttribute("title");this.add({title:g,contentEl:e})}},initTab:function(d,b){var e=this.strip.dom.childNodes[b],g=this.getTemplateArgs(d),c=e?this.itemTpl.insertBefore(e,g):this.itemTpl.append(this.strip,g),a="x-tab-strip-over",h=Ext.get(c);h.hover(function(){if(!d.disabled){h.addClass(a)}},function(){h.removeClass(a)});if(d.tabTip){h.child("span.x-tab-strip-text",true).qtip=d.tabTip}d.tabEl=c;h.select("a").on("click",function(i){if(!i.getPageX()){this.onStripMouseDown(i)}},this,{preventDefault:true});d.on({scope:this,disable:this.onItemDisabled,enable:this.onItemEnabled,titlechange:this.onItemTitleChanged,iconchange:this.onItemIconChanged,beforeshow:this.onBeforeShowItem})},getTemplateArgs:function(b){var a=b.closable?"x-tab-strip-closable":"";if(b.disabled){a+=" x-item-disabled"}if(b.iconCls){a+=" x-tab-with-icon"}if(b.tabCls){a+=" "+b.tabCls}return{id:this.id+this.idDelimiter+b.getItemId(),text:b.title,cls:a,iconCls:b.iconCls||""}},onAdd:function(b){Ext.TabPanel.superclass.onAdd.call(this,b);if(this.rendered){var a=this.items;this.initTab(b,a.indexOf(b));this.delegateUpdates()}},onBeforeAdd:function(b){var a=b.events?(this.items.containsKey(b.getItemId())?b:null):this.items.get(b);if(a){this.setActiveTab(b);return false}Ext.TabPanel.superclass.onBeforeAdd.apply(this,arguments);var c=b.elements;b.elements=c?c.replace(",header",""):c;b.border=(b.border===true)},onRemove:function(d){var b=Ext.get(d.tabEl);if(b){b.select("a").removeAllListeners();Ext.destroy(b)}Ext.TabPanel.superclass.onRemove.call(this,d);this.stack.remove(d);delete d.tabEl;d.un("disable",this.onItemDisabled,this);d.un("enable",this.onItemEnabled,this);d.un("titlechange",this.onItemTitleChanged,this);d.un("iconchange",this.onItemIconChanged,this);d.un("beforeshow",this.onBeforeShowItem,this);if(d==this.activeTab){var a=this.stack.next();if(a){this.setActiveTab(a)}else{if(this.items.getCount()>0){this.setActiveTab(0)}else{this.setActiveTab(null)}}}if(!this.destroying){this.delegateUpdates()}},onBeforeShowItem:function(a){if(a!=this.activeTab){this.setActiveTab(a);return false}},onItemDisabled:function(b){var a=this.getTabEl(b);if(a){Ext.fly(a).addClass("x-item-disabled")}this.stack.remove(b)},onItemEnabled:function(b){var a=this.getTabEl(b);if(a){Ext.fly(a).removeClass("x-item-disabled")}},onItemTitleChanged:function(b){var a=this.getTabEl(b);if(a){Ext.fly(a).child("span.x-tab-strip-text",true).innerHTML=b.title;this.delegateUpdates()}},onItemIconChanged:function(d,a,c){var b=this.getTabEl(d);if(b){b=Ext.get(b);b.child("span.x-tab-strip-text").replaceClass(c,a);b[Ext.isEmpty(a)?"removeClass":"addClass"]("x-tab-with-icon");this.delegateUpdates()}},getTabEl:function(a){var b=this.getComponent(a);return b?b.tabEl:null},onResize:function(){Ext.TabPanel.superclass.onResize.apply(this,arguments);this.delegateUpdates()},beginUpdate:function(){this.suspendUpdates=true},endUpdate:function(){this.suspendUpdates=false;this.delegateUpdates()},hideTabStripItem:function(b){b=this.getComponent(b);var a=this.getTabEl(b);if(a){a.style.display="none";this.delegateUpdates()}this.stack.remove(b)},unhideTabStripItem:function(b){b=this.getComponent(b);var a=this.getTabEl(b);if(a){a.style.display="";this.delegateUpdates()}},delegateUpdates:function(){var a=this.rendered;if(this.suspendUpdates){return}if(this.resizeTabs&&a){this.autoSizeTabs()}if(this.enableTabScroll&&a){this.autoScrollTabs()}},autoSizeTabs:function(){var h=this.items.length,b=this.tabPosition!="bottom"?"header":"footer",c=this[b].dom.offsetWidth,a=this[b].dom.clientWidth;if(!this.resizeTabs||h<1||!a){return}var k=Math.max(Math.min(Math.floor((a-4)/h)-this.tabMargin,this.tabWidth),this.minTabWidth);this.lastTabWidth=k;var m=this.strip.query("li:not(.x-tab-edge)");for(var e=0,j=m.length;e<j;e++){var l=m[e],n=Ext.fly(l).child(".x-tab-strip-inner",true),g=l.offsetWidth,d=n.offsetWidth;n.style.width=(k-(g-d))+"px"}},adjustBodyWidth:function(a){if(this.header){this.header.setWidth(a)}if(this.footer){this.footer.setWidth(a)}return a},setActiveTab:function(c){c=this.getComponent(c);if(this.fireEvent("beforetabchange",this,c,this.activeTab)===false){return}if(!this.rendered){this.activeTab=c;return}if(this.activeTab!=c){if(this.activeTab){var a=this.getTabEl(this.activeTab);if(a){Ext.fly(a).removeClass("x-tab-strip-active")}}this.activeTab=c;if(c){var b=this.getTabEl(c);Ext.fly(b).addClass("x-tab-strip-active");this.stack.add(c);this.layout.setActiveItem(c);this.delegateUpdates();if(this.scrolling){this.scrollToTab(c,this.animScroll)}}this.fireEvent("tabchange",this,c)}},getActiveTab:function(){return this.activeTab||null},getItem:function(a){return this.getComponent(a)},autoScrollTabs:function(){this.pos=this.tabPosition=="bottom"?this.footer:this.header;var h=this.items.length,d=this.pos.dom.offsetWidth,c=this.pos.dom.clientWidth,g=this.stripWrap,e=g.dom,b=e.offsetWidth,i=this.getScrollPos(),a=this.edge.getOffsetsTo(this.stripWrap)[0]+i;if(!this.enableTabScroll||b<20){return}if(h==0||a<=c){e.scrollLeft=0;g.setWidth(c);if(this.scrolling){this.scrolling=false;this.pos.removeClass("x-tab-scrolling");this.scrollLeft.hide();this.scrollRight.hide();if(Ext.isAir||Ext.isWebKit){e.style.marginLeft="";e.style.marginRight=""}}}else{if(!this.scrolling){this.pos.addClass("x-tab-scrolling");if(Ext.isAir||Ext.isWebKit){e.style.marginLeft="18px";e.style.marginRight="18px"}}c-=g.getMargins("lr");g.setWidth(c>20?c:20);if(!this.scrolling){if(!this.scrollLeft){this.createScrollers()}else{this.scrollLeft.show();this.scrollRight.show()}}this.scrolling=true;if(i>(a-c)){e.scrollLeft=a-c}else{this.scrollToTab(this.activeTab,false)}this.updateScrollButtons()}},createScrollers:function(){this.pos.addClass("x-tab-scrolling-"+this.tabPosition);var c=this.stripWrap.dom.offsetHeight;var a=this.pos.insertFirst({cls:"x-tab-scroller-left"});a.setHeight(c);a.addClassOnOver("x-tab-scroller-left-over");this.leftRepeater=new Ext.util.ClickRepeater(a,{interval:this.scrollRepeatInterval,handler:this.onScrollLeft,scope:this});this.scrollLeft=a;var b=this.pos.insertFirst({cls:"x-tab-scroller-right"});b.setHeight(c);b.addClassOnOver("x-tab-scroller-right-over");this.rightRepeater=new Ext.util.ClickRepeater(b,{interval:this.scrollRepeatInterval,handler:this.onScrollRight,scope:this});this.scrollRight=b},getScrollWidth:function(){return this.edge.getOffsetsTo(this.stripWrap)[0]+this.getScrollPos()},getScrollPos:function(){return parseInt(this.stripWrap.dom.scrollLeft,10)||0},getScrollArea:function(){return parseInt(this.stripWrap.dom.clientWidth,10)||0},getScrollAnim:function(){return{duration:this.scrollDuration,callback:this.updateScrollButtons,scope:this}},getScrollIncrement:function(){return this.scrollIncrement||(this.resizeTabs?this.lastTabWidth+2:100)},scrollToTab:function(e,a){if(!e){return}var c=this.getTabEl(e),h=this.getScrollPos(),d=this.getScrollArea(),g=Ext.fly(c).getOffsetsTo(this.stripWrap)[0]+h,b=g+c.offsetWidth;if(g<h){this.scrollTo(g,a)}else{if(b>(h+d)){this.scrollTo(b-d,a)}}},scrollTo:function(b,a){this.stripWrap.scrollTo("left",b,a?this.getScrollAnim():false);if(!a){this.updateScrollButtons()}},onWheel:function(g){var h=g.getWheelDelta()*this.wheelIncrement*-1;g.stopEvent();var i=this.getScrollPos(),c=i+h,a=this.getScrollWidth()-this.getScrollArea();var b=Math.max(0,Math.min(a,c));if(b!=i){this.scrollTo(b,false)}},onScrollRight:function(){var a=this.getScrollWidth()-this.getScrollArea(),c=this.getScrollPos(),b=Math.min(a,c+this.getScrollIncrement());if(b!=c){this.scrollTo(b,this.animScroll)}},onScrollLeft:function(){var b=this.getScrollPos(),a=Math.max(0,b-this.getScrollIncrement());if(a!=b){this.scrollTo(a,this.animScroll)}},updateScrollButtons:function(){var a=this.getScrollPos();this.scrollLeft[a===0?"addClass":"removeClass"]("x-tab-scroller-left-disabled");this.scrollRight[a>=(this.getScrollWidth()-this.getScrollArea())?"addClass":"removeClass"]("x-tab-scroller-right-disabled")},beforeDestroy:function(){Ext.destroy(this.leftRepeater,this.rightRepeater);this.deleteMembers("strip","edge","scrollLeft","scrollRight","stripWrap");this.activeTab=null;Ext.TabPanel.superclass.beforeDestroy.apply(this)}});Ext.reg("tabpanel",Ext.TabPanel);Ext.TabPanel.prototype.activate=Ext.TabPanel.prototype.setActiveTab;Ext.TabPanel.AccessStack=function(){var a=[];return{add:function(b){a.push(b);if(a.length>10){a.shift()}},remove:function(e){var d=[];for(var c=0,b=a.length;c<b;c++){if(a[c]!=e){d.push(a[c])}}a=d},next:function(){return a.pop()}}};Ext.Button=Ext.extend(Ext.BoxComponent,{hidden:false,disabled:false,pressed:false,enableToggle:false,menuAlign:"tl-bl?",type:"button",menuClassTarget:"tr:nth(2)",clickEvent:"click",handleMouseEvents:true,tooltipType:"qtip",buttonSelector:"button:first-child",scale:"small",iconAlign:"left",arrowAlign:"right",initComponent:function(){if(this.menu){if(Ext.isArray(this.menu)){this.menu={items:this.menu}}if(Ext.isObject(this.menu)){this.menu.ownerCt=this}this.menu=Ext.menu.MenuMgr.get(this.menu);this.menu.ownerCt=undefined}Ext.Button.superclass.initComponent.call(this);this.addEvents("click","toggle","mouseover","mouseout","menushow","menuhide","menutriggerover","menutriggerout");if(Ext.isString(this.toggleGroup)){this.enableToggle=true}},getTemplateArgs:function(){return[this.type,"x-btn-"+this.scale+" x-btn-icon-"+this.scale+"-"+this.iconAlign,this.getMenuClass(),this.cls,this.id]},setButtonClass:function(){if(this.useSetClass){if(!Ext.isEmpty(this.oldCls)){this.el.removeClass([this.oldCls,"x-btn-pressed"])}this.oldCls=(this.iconCls||this.icon)?(this.text?"x-btn-text-icon":"x-btn-icon"):"x-btn-noicon";this.el.addClass([this.oldCls,this.pressed?"x-btn-pressed":null])}},getMenuClass:function(){return this.menu?(this.arrowAlign!="bottom"?"x-btn-arrow":"x-btn-arrow-bottom"):""},onRender:function(c,a){if(!this.template){if(!Ext.Button.buttonTemplate){Ext.Button.buttonTemplate=new Ext.Template('<table id="{4}" cellspacing="0" class="x-btn {3}"><tbody class="{1}">','<tr><td class="x-btn-tl"><i>&#160;</i></td><td class="x-btn-tc"></td><td class="x-btn-tr"><i>&#160;</i></td></tr>','<tr><td class="x-btn-ml"><i>&#160;</i></td><td class="x-btn-mc"><em class="{2} x-unselectable" unselectable="on"><button type="{0}"></button></em></td><td class="x-btn-mr"><i>&#160;</i></td></tr>','<tr><td class="x-btn-bl"><i>&#160;</i></td><td class="x-btn-bc"></td><td class="x-btn-br"><i>&#160;</i></td></tr>',"</tbody></table>");Ext.Button.buttonTemplate.compile()}this.template=Ext.Button.buttonTemplate}var b,d=this.getTemplateArgs();if(a){b=this.template.insertBefore(a,d,true)}else{b=this.template.append(c,d,true)}this.btnEl=b.child(this.buttonSelector);this.mon(this.btnEl,{scope:this,focus:this.onFocus,blur:this.onBlur});this.initButtonEl(b,this.btnEl);Ext.ButtonToggleMgr.register(this)},initButtonEl:function(b,c){this.el=b;this.setIcon(this.icon);this.setText(this.text);this.setIconClass(this.iconCls);if(Ext.isDefined(this.tabIndex)){c.dom.tabIndex=this.tabIndex}if(this.tooltip){this.setTooltip(this.tooltip,true)}if(this.handleMouseEvents){this.mon(b,{scope:this,mouseover:this.onMouseOver,mousedown:this.onMouseDown})}if(this.menu){this.mon(this.menu,{scope:this,show:this.onMenuShow,hide:this.onMenuHide})}if(this.repeat){var a=new Ext.util.ClickRepeater(b,Ext.isObject(this.repeat)?this.repeat:{});this.mon(a,"click",this.onRepeatClick,this)}else{this.mon(b,this.clickEvent,this.onClick,this)}},afterRender:function(){Ext.Button.superclass.afterRender.call(this);this.useSetClass=true;this.setButtonClass();this.doc=Ext.getDoc();this.doAutoWidth()},setIconClass:function(a){this.iconCls=a;if(this.el){this.btnEl.dom.className="";this.btnEl.addClass(["x-btn-text",a||""]);this.setButtonClass()}return this},setTooltip:function(b,a){if(this.rendered){if(!a){this.clearTip()}if(Ext.isObject(b)){Ext.QuickTips.register(Ext.apply({target:this.btnEl.id},b));this.tooltip=b}else{this.btnEl.dom[this.tooltipType]=b}}else{this.tooltip=b}return this},clearTip:function(){if(Ext.isObject(this.tooltip)){Ext.QuickTips.unregister(this.btnEl)}},beforeDestroy:function(){if(this.rendered){this.clearTip()}if(this.menu&&this.destroyMenu!==false){Ext.destroy(this.btnEl,this.menu)}Ext.destroy(this.repeater)},onDestroy:function(){if(this.rendered){this.doc.un("mouseover",this.monitorMouseOver,this);this.doc.un("mouseup",this.onMouseUp,this);delete this.doc;delete this.btnEl;Ext.ButtonToggleMgr.unregister(this)}Ext.Button.superclass.onDestroy.call(this)},doAutoWidth:function(){if(this.autoWidth!==false&&this.el&&this.text&&this.width===undefined){this.el.setWidth("auto");if(Ext.isIE7&&Ext.isStrict){var a=this.btnEl;if(a&&a.getWidth()>20){a.clip();a.setWidth(Ext.util.TextMetrics.measure(a,this.text).width+a.getFrameWidth("lr"))}}if(this.minWidth){if(this.el.getWidth()<this.minWidth){this.el.setWidth(this.minWidth)}}}},setHandler:function(b,a){this.handler=b;this.scope=a;return this},setText:function(a){this.text=a;if(this.el){this.btnEl.update(a||"&#160;");this.setButtonClass()}this.doAutoWidth();return this},setIcon:function(a){this.icon=a;if(this.el){this.btnEl.setStyle("background-image",a?"url("+a+")":"");this.setButtonClass()}return this},getText:function(){return this.text},toggle:function(b,a){b=b===undefined?!this.pressed:!!b;if(b!=this.pressed){if(this.rendered){this.el[b?"addClass":"removeClass"]("x-btn-pressed")}this.pressed=b;if(!a){this.fireEvent("toggle",this,b);if(this.toggleHandler){this.toggleHandler.call(this.scope||this,this,b)}}}return this},onDisable:function(){this.onDisableChange(true)},onEnable:function(){this.onDisableChange(false)},onDisableChange:function(a){if(this.el){if(!Ext.isIE6||!this.text){this.el[a?"addClass":"removeClass"](this.disabledClass)}this.el.dom.disabled=a}this.disabled=a},showMenu:function(){if(this.rendered&&this.menu){if(this.tooltip){Ext.QuickTips.getQuickTip().cancelShow(this.btnEl)}if(this.menu.isVisible()){this.menu.hide()}this.menu.ownerCt=this;this.menu.show(this.el,this.menuAlign)}return this},hideMenu:function(){if(this.hasVisibleMenu()){this.menu.hide()}return this},hasVisibleMenu:function(){return this.menu&&this.menu.ownerCt==this&&this.menu.isVisible()},onRepeatClick:function(a,b){this.onClick(b)},onClick:function(a){if(a){a.preventDefault()}if(a.button!==0){return}if(!this.disabled){this.doToggle();if(this.menu&&!this.hasVisibleMenu()&&!this.ignoreNextClick){this.showMenu()}this.fireEvent("click",this,a);if(this.handler){this.handler.call(this.scope||this,this,a)}}},doToggle:function(){if(this.enableToggle&&(this.allowDepress!==false||!this.pressed)){this.toggle()}},isMenuTriggerOver:function(b,a){return this.menu&&!a},isMenuTriggerOut:function(b,a){return this.menu&&!a},onMouseOver:function(b){if(!this.disabled){var a=b.within(this.el,true);if(!a){this.el.addClass("x-btn-over");if(!this.monitoringMouseOver){this.doc.on("mouseover",this.monitorMouseOver,this);this.monitoringMouseOver=true}this.fireEvent("mouseover",this,b)}if(this.isMenuTriggerOver(b,a)){this.fireEvent("menutriggerover",this,this.menu,b)}}},monitorMouseOver:function(a){if(a.target!=this.el.dom&&!a.within(this.el)){if(this.monitoringMouseOver){this.doc.un("mouseover",this.monitorMouseOver,this);this.monitoringMouseOver=false}this.onMouseOut(a)}},onMouseOut:function(b){var a=b.within(this.el)&&b.target!=this.el.dom;this.el.removeClass("x-btn-over");this.fireEvent("mouseout",this,b);if(this.isMenuTriggerOut(b,a)){this.fireEvent("menutriggerout",this,this.menu,b)}},focus:function(){this.btnEl.focus()},blur:function(){this.btnEl.blur()},onFocus:function(a){if(!this.disabled){this.el.addClass("x-btn-focus")}},onBlur:function(a){this.el.removeClass("x-btn-focus")},getClickEl:function(b,a){return this.el},onMouseDown:function(a){if(!this.disabled&&a.button===0){this.getClickEl(a).addClass("x-btn-click");this.doc.on("mouseup",this.onMouseUp,this)}},onMouseUp:function(a){if(a.button===0){this.getClickEl(a,true).removeClass("x-btn-click");this.doc.un("mouseup",this.onMouseUp,this)}},onMenuShow:function(a){if(this.menu.ownerCt==this){this.menu.ownerCt=this;this.ignoreNextClick=0;this.el.addClass("x-btn-menu-active");this.fireEvent("menushow",this,this.menu)}},onMenuHide:function(a){if(this.menu.ownerCt==this){this.el.removeClass("x-btn-menu-active");this.ignoreNextClick=this.restoreClick.defer(250,this);this.fireEvent("menuhide",this,this.menu);delete this.menu.ownerCt}},restoreClick:function(){this.ignoreNextClick=0}});Ext.reg("button",Ext.Button);Ext.ButtonToggleMgr=function(){var a={};function b(e,j){if(j){var h=a[e.toggleGroup];for(var d=0,c=h.length;d<c;d++){if(h[d]!=e){h[d].toggle(false)}}}}return{register:function(c){if(!c.toggleGroup){return}var d=a[c.toggleGroup];if(!d){d=a[c.toggleGroup]=[]}d.push(c);c.on("toggle",b)},unregister:function(c){if(!c.toggleGroup){return}var d=a[c.toggleGroup];if(d){d.remove(c);c.un("toggle",b)}},getPressed:function(h){var e=a[h];if(e){for(var d=0,c=e.length;d<c;d++){if(e[d].pressed===true){return e[d]}}}return null}}}();Ext.SplitButton=Ext.extend(Ext.Button,{arrowSelector:"em",split:true,initComponent:function(){Ext.SplitButton.superclass.initComponent.call(this);this.addEvents("arrowclick")},onRender:function(){Ext.SplitButton.superclass.onRender.apply(this,arguments);if(this.arrowTooltip){this.el.child(this.arrowSelector).dom[this.tooltipType]=this.arrowTooltip}},setArrowHandler:function(b,a){this.arrowHandler=b;this.scope=a},getMenuClass:function(){return"x-btn-split"+(this.arrowAlign=="bottom"?"-bottom":"")},isClickOnArrow:function(c){if(this.arrowAlign!="bottom"){var b=this.el.child("em.x-btn-split");var a=b.getRegion().right-b.getPadding("r");return c.getPageX()>a}else{return c.getPageY()>this.btnEl.getRegion().bottom}},onClick:function(b,a){b.preventDefault();if(!this.disabled){if(this.isClickOnArrow(b)){if(this.menu&&!this.menu.isVisible()&&!this.ignoreNextClick){this.showMenu()}this.fireEvent("arrowclick",this,b);if(this.arrowHandler){this.arrowHandler.call(this.scope||this,this,b)}}else{this.doToggle();this.fireEvent("click",this,b);if(this.handler){this.handler.call(this.scope||this,this,b)}}}},isMenuTriggerOver:function(a){return this.menu&&a.target.tagName==this.arrowSelector},isMenuTriggerOut:function(b,a){return this.menu&&b.target.tagName!=this.arrowSelector}});Ext.reg("splitbutton",Ext.SplitButton);Ext.CycleButton=Ext.extend(Ext.SplitButton,{getItemText:function(a){if(a&&this.showText===true){var b="";if(this.prependText){b+=this.prependText}b+=a.text;return b}return undefined},setActiveItem:function(c,a){if(!Ext.isObject(c)){c=this.menu.getComponent(c)}if(c){if(!this.rendered){this.text=this.getItemText(c);this.iconCls=c.iconCls}else{var b=this.getItemText(c);if(b){this.setText(b)}this.setIconClass(c.iconCls)}this.activeItem=c;if(!c.checked){c.setChecked(true,a)}if(this.forceIcon){this.setIconClass(this.forceIcon)}if(!a){this.fireEvent("change",this,c)}}},getActiveItem:function(){return this.activeItem},initComponent:function(){this.addEvents("change");if(this.changeHandler){this.on("change",this.changeHandler,this.scope||this);delete this.changeHandler}this.itemCount=this.items.length;this.menu={cls:"x-cycle-menu",items:[]};var a=0;Ext.each(this.items,function(c,b){Ext.apply(c,{group:c.group||this.id,itemIndex:b,checkHandler:this.checkHandler,scope:this,checked:c.checked||false});this.menu.items.push(c);if(c.checked){a=b}},this);Ext.CycleButton.superclass.initComponent.call(this);this.on("click",this.toggleSelected,this);this.setActiveItem(a,true)},checkHandler:function(a,b){if(b){this.setActiveItem(a)}},toggleSelected:function(){var a=this.menu;a.render();if(!a.hasLayout){a.doLayout()}var d,b;for(var c=1;c<this.itemCount;c++){d=(this.activeItem.itemIndex+c)%this.itemCount;b=a.items.itemAt(d);if(!b.disabled){b.setChecked(true);break}}}});Ext.reg("cycle",Ext.CycleButton);Ext.Toolbar=function(a){if(Ext.isArray(a)){a={items:a,layout:"toolbar"}}else{a=Ext.apply({layout:"toolbar"},a);if(a.buttons){a.items=a.buttons}}Ext.Toolbar.superclass.constructor.call(this,a)};(function(){var a=Ext.Toolbar;Ext.extend(a,Ext.Container,{defaultType:"button",enableOverflow:false,trackMenus:true,internalDefaults:{removeMode:"container",hideParent:true},toolbarCls:"x-toolbar",initComponent:function(){a.superclass.initComponent.call(this);this.addEvents("overflowchange")},onRender:function(c,b){if(!this.el){if(!this.autoCreate){this.autoCreate={cls:this.toolbarCls+" x-small-editor"}}this.el=c.createChild(Ext.apply({id:this.id},this.autoCreate),b);Ext.Toolbar.superclass.onRender.apply(this,arguments)}},lookupComponent:function(b){if(Ext.isString(b)){if(b=="-"){b=new a.Separator()}else{if(b==" "){b=new a.Spacer()}else{if(b=="->"){b=new a.Fill()}else{b=new a.TextItem(b)}}}this.applyDefaults(b)}else{if(b.isFormField||b.render){b=this.createComponent(b)}else{if(b.tag){b=new a.Item({autoEl:b})}else{if(b.tagName){b=new a.Item({el:b})}else{if(Ext.isObject(b)){b=b.xtype?this.createComponent(b):this.constructButton(b)}}}}}return b},applyDefaults:function(e){if(!Ext.isString(e)){e=Ext.Toolbar.superclass.applyDefaults.call(this,e);var b=this.internalDefaults;if(e.events){Ext.applyIf(e.initialConfig,b);Ext.apply(e,b)}else{Ext.applyIf(e,b)}}return e},addSeparator:function(){return this.add(new a.Separator())},addSpacer:function(){return this.add(new a.Spacer())},addFill:function(){this.add(new a.Fill())},addElement:function(b){return this.addItem(new a.Item({el:b}))},addItem:function(b){return this.add.apply(this,arguments)},addButton:function(c){if(Ext.isArray(c)){var e=[];for(var d=0,b=c.length;d<b;d++){e.push(this.addButton(c[d]))}return e}return this.add(this.constructButton(c))},addText:function(b){return this.addItem(new a.TextItem(b))},addDom:function(b){return this.add(new a.Item({autoEl:b}))},addField:function(b){return this.add(b)},insertButton:function(c,g){if(Ext.isArray(g)){var e=[];for(var d=0,b=g.length;d<b;d++){e.push(this.insertButton(c+d,g[d]))}return e}return Ext.Toolbar.superclass.insert.call(this,c,g)},trackMenu:function(c,b){if(this.trackMenus&&c.menu){var d=b?"mun":"mon";this[d](c,"menutriggerover",this.onButtonTriggerOver,this);this[d](c,"menushow",this.onButtonMenuShow,this);this[d](c,"menuhide",this.onButtonMenuHide,this)}},constructButton:function(d){var c=d.events?d:this.createComponent(d,d.split?"splitbutton":this.defaultType);return c},onAdd:function(b){Ext.Toolbar.superclass.onAdd.call(this);this.trackMenu(b);if(this.disabled){b.disable()}},onRemove:function(b){Ext.Toolbar.superclass.onRemove.call(this);if(b==this.activeMenuBtn){delete this.activeMenuBtn}this.trackMenu(b,true)},onDisable:function(){this.items.each(function(b){if(b.disable){b.disable()}})},onEnable:function(){this.items.each(function(b){if(b.enable){b.enable()}})},onButtonTriggerOver:function(b){if(this.activeMenuBtn&&this.activeMenuBtn!=b){this.activeMenuBtn.hideMenu();b.showMenu();this.activeMenuBtn=b}},onButtonMenuShow:function(b){this.activeMenuBtn=b},onButtonMenuHide:function(b){delete this.activeMenuBtn}});Ext.reg("toolbar",Ext.Toolbar);a.Item=Ext.extend(Ext.BoxComponent,{hideParent:true,enable:Ext.emptyFn,disable:Ext.emptyFn,focus:Ext.emptyFn});Ext.reg("tbitem",a.Item);a.Separator=Ext.extend(a.Item,{onRender:function(c,b){this.el=c.createChild({tag:"span",cls:"xtb-sep"},b)}});Ext.reg("tbseparator",a.Separator);a.Spacer=Ext.extend(a.Item,{onRender:function(c,b){this.el=c.createChild({tag:"div",cls:"xtb-spacer",style:this.width?"width:"+this.width+"px":""},b)}});Ext.reg("tbspacer",a.Spacer);a.Fill=Ext.extend(a.Item,{render:Ext.emptyFn,isFill:true});Ext.reg("tbfill",a.Fill);a.TextItem=Ext.extend(a.Item,{constructor:function(b){a.TextItem.superclass.constructor.call(this,Ext.isString(b)?{text:b}:b)},onRender:function(c,b){this.autoEl={cls:"xtb-text",html:this.text||""};a.TextItem.superclass.onRender.call(this,c,b)},setText:function(b){if(this.rendered){this.el.update(b)}else{this.text=b}}});Ext.reg("tbtext",a.TextItem);a.Button=Ext.extend(Ext.Button,{});a.SplitButton=Ext.extend(Ext.SplitButton,{});Ext.reg("tbbutton",a.Button);Ext.reg("tbsplit",a.SplitButton)})();Ext.ButtonGroup=Ext.extend(Ext.Panel,{baseCls:"x-btn-group",layout:"table",defaultType:"button",frame:true,internalDefaults:{removeMode:"container",hideParent:true},initComponent:function(){this.layoutConfig=this.layoutConfig||{};Ext.applyIf(this.layoutConfig,{columns:this.columns});if(!this.title){this.addClass("x-btn-group-notitle")}this.on("afterlayout",this.onAfterLayout,this);Ext.ButtonGroup.superclass.initComponent.call(this)},applyDefaults:function(b){b=Ext.ButtonGroup.superclass.applyDefaults.call(this,b);var a=this.internalDefaults;if(b.events){Ext.applyIf(b.initialConfig,a);Ext.apply(b,a)}else{Ext.applyIf(b,a)}return b},onAfterLayout:function(){var a=this.body.getFrameWidth("lr")+this.body.dom.firstChild.offsetWidth;this.body.setWidth(a);this.el.setWidth(a+this.getFrameWidth())}});Ext.reg("buttongroup",Ext.ButtonGroup);(function(){var a=Ext.Toolbar;Ext.PagingToolbar=Ext.extend(Ext.Toolbar,{pageSize:20,displayMsg:"Displaying {0} - {1} of {2}",emptyMsg:"No data to display",beforePageText:"Page",afterPageText:"of {0}",firstText:"First Page",prevText:"Previous Page",nextText:"Next Page",lastText:"Last Page",refreshText:"Refresh",initComponent:function(){var c=[this.first=new a.Button({tooltip:this.firstText,overflowText:this.firstText,iconCls:"x-tbar-page-first",disabled:true,handler:this.moveFirst,scope:this}),this.prev=new a.Button({tooltip:this.prevText,overflowText:this.prevText,iconCls:"x-tbar-page-prev",disabled:true,handler:this.movePrevious,scope:this}),"-",this.beforePageText,this.inputItem=new Ext.form.NumberField({cls:"x-tbar-page-number",allowDecimals:false,allowNegative:false,enableKeyEvents:true,selectOnFocus:true,submitValue:false,listeners:{scope:this,keydown:this.onPagingKeyDown,blur:this.onPagingBlur}}),this.afterTextItem=new a.TextItem({text:String.format(this.afterPageText,1)}),"-",this.next=new a.Button({tooltip:this.nextText,overflowText:this.nextText,iconCls:"x-tbar-page-next",disabled:true,handler:this.moveNext,scope:this}),this.last=new a.Button({tooltip:this.lastText,overflowText:this.lastText,iconCls:"x-tbar-page-last",disabled:true,handler:this.moveLast,scope:this}),"-",this.refresh=new a.Button({tooltip:this.refreshText,overflowText:this.refreshText,iconCls:"x-tbar-loading",handler:this.doRefresh,scope:this})];var b=this.items||this.buttons||[];if(this.prependButtons){this.items=b.concat(c)}else{this.items=c.concat(b)}delete this.buttons;if(this.displayInfo){this.items.push("->");this.items.push(this.displayItem=new a.TextItem({}))}Ext.PagingToolbar.superclass.initComponent.call(this);this.addEvents("change","beforechange");this.on("afterlayout",this.onFirstLayout,this,{single:true});this.cursor=0;this.bindStore(this.store,true)},onFirstLayout:function(){if(this.dsLoaded){this.onLoad.apply(this,this.dsLoaded)}},updateInfo:function(){if(this.displayItem){var b=this.store.getCount();var c=b==0?this.emptyMsg:String.format(this.displayMsg,this.cursor+1,this.cursor+b,this.store.getTotalCount());this.displayItem.setText(c)}},onLoad:function(b,e,j){if(!this.rendered){this.dsLoaded=[b,e,j];return}var g=this.getParams();this.cursor=(j.params&&j.params[g.start])?j.params[g.start]:0;var i=this.getPageData(),c=i.activePage,h=i.pages;this.afterTextItem.setText(String.format(this.afterPageText,i.pages));this.inputItem.setValue(c);this.first.setDisabled(c==1);this.prev.setDisabled(c==1);this.next.setDisabled(c==h);this.last.setDisabled(c==h);this.refresh.enable();this.updateInfo();this.fireEvent("change",this,i)},getPageData:function(){var b=this.store.getTotalCount();return{total:b,activePage:Math.ceil((this.cursor+this.pageSize)/this.pageSize),pages:b<this.pageSize?1:Math.ceil(b/this.pageSize)}},changePage:function(b){this.doLoad(((b-1)*this.pageSize).constrain(0,this.store.getTotalCount()))},onLoadError:function(){if(!this.rendered){return}this.refresh.enable()},readPage:function(e){var b=this.inputItem.getValue(),c;if(!b||isNaN(c=parseInt(b,10))){this.inputItem.setValue(e.activePage);return false}return c},onPagingFocus:function(){this.inputItem.select()},onPagingBlur:function(b){this.inputItem.setValue(this.getPageData().activePage)},onPagingKeyDown:function(i,h){var c=h.getKey(),j=this.getPageData(),g;if(c==h.RETURN){h.stopEvent();g=this.readPage(j);if(g!==false){g=Math.min(Math.max(1,g),j.pages)-1;this.doLoad(g*this.pageSize)}}else{if(c==h.HOME||c==h.END){h.stopEvent();g=c==h.HOME?1:j.pages;i.setValue(g)}else{if(c==h.UP||c==h.PAGEUP||c==h.DOWN||c==h.PAGEDOWN){h.stopEvent();if((g=this.readPage(j))){var b=h.shiftKey?10:1;if(c==h.DOWN||c==h.PAGEDOWN){b*=-1}g+=b;if(g>=1&g<=j.pages){i.setValue(g)}}}}}},getParams:function(){return this.paramNames||this.store.paramNames},beforeLoad:function(){if(this.rendered&&this.refresh){this.refresh.disable()}},doLoad:function(d){var c={},b=this.getParams();c[b.start]=d;c[b.limit]=this.pageSize;if(this.fireEvent("beforechange",this,c)!==false){this.store.load({params:c})}},moveFirst:function(){this.doLoad(0)},movePrevious:function(){this.doLoad(Math.max(0,this.cursor-this.pageSize))},moveNext:function(){this.doLoad(this.cursor+this.pageSize)},moveLast:function(){var c=this.store.getTotalCount(),b=c%this.pageSize;this.doLoad(b?(c-b):c-this.pageSize)},doRefresh:function(){this.doLoad(this.cursor)},bindStore:function(c,d){var b;if(!d&&this.store){if(c!==this.store&&this.store.autoDestroy){this.store.destroy()}else{this.store.un("beforeload",this.beforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("exception",this.onLoadError,this)}if(!c){this.store=null}}if(c){c=Ext.StoreMgr.lookup(c);c.on({scope:this,beforeload:this.beforeLoad,load:this.onLoad,exception:this.onLoadError});b=true}this.store=c;if(b){this.onLoad(c,null,{})}},unbind:function(b){this.bindStore(null)},bind:function(b){this.bindStore(b)},onDestroy:function(){this.bindStore(null);Ext.PagingToolbar.superclass.onDestroy.call(this)}})})();Ext.reg("paging",Ext.PagingToolbar);Ext.History=(function(){var e,c;var k=false;var d;function g(){var l=location.href,m=l.indexOf("#"),n=m>=0?l.substr(m+1):null;if(Ext.isGecko){n=decodeURIComponent(n)}return n}function a(){c.value=d}function h(l){d=l;Ext.History.fireEvent("change",l)}function i(m){var l=['<html><body><div id="state">',Ext.util.Format.htmlEncode(m),"</div></body></html>"].join("");try{var o=e.contentWindow.document;o.open();o.write(l);o.close();return true}catch(n){return false}}function b(){if(!e.contentWindow||!e.contentWindow.document){setTimeout(b,10);return}var o=e.contentWindow.document;var m=o.getElementById("state");var l=m?m.innerText:null;var n=g();setInterval(function(){o=e.contentWindow.document;m=o.getElementById("state");var q=m?m.innerText:null;var p=g();if(q!==l){l=q;h(l);location.hash=l;n=l;a()}else{if(p!==n){n=p;i(p)}}},50);k=true;Ext.History.fireEvent("ready",Ext.History)}function j(){d=c.value?c.value:g();if(Ext.isIE){b()}else{var l=g();setInterval(function(){var m=g();if(m!==l){l=m;h(l);a()}},50);k=true;Ext.History.fireEvent("ready",Ext.History)}}return{fieldId:"x-history-field",iframeId:"x-history-frame",events:{},init:function(m,l){if(k){Ext.callback(m,l,[this]);return}if(!Ext.isReady){Ext.onReady(function(){Ext.History.init(m,l)});return}c=Ext.getDom(Ext.History.fieldId);if(Ext.isIE){e=Ext.getDom(Ext.History.iframeId)}this.addEvents("ready","change");if(m){this.on("ready",m,l,{single:true})}j()},add:function(l,m){if(m!==false){if(this.getToken()==l){return true}}if(Ext.isIE){return i(l)}else{location.hash=l;return true}},back:function(){history.go(-1)},forward:function(){history.go(1)},getToken:function(){return k?d:g()}}})();Ext.apply(Ext.History,new Ext.util.Observable());Ext.Tip=Ext.extend(Ext.Panel,{minWidth:40,maxWidth:300,shadow:"sides",defaultAlign:"tl-bl?",autoRender:true,quickShowInterval:250,frame:true,hidden:true,baseCls:"x-tip",floating:{shadow:true,shim:true,useDisplay:true,constrain:false},autoHeight:true,closeAction:"hide",initComponent:function(){Ext.Tip.superclass.initComponent.call(this);if(this.closable&&!this.title){this.elements+=",header"}},afterRender:function(){Ext.Tip.superclass.afterRender.call(this);if(this.closable){this.addTool({id:"close",handler:this[this.closeAction],scope:this})}},showAt:function(a){Ext.Tip.superclass.show.call(this);if(this.measureWidth!==false&&(!this.initialConfig||typeof this.initialConfig.width!="number")){this.doAutoWidth()}if(this.constrainPosition){a=this.el.adjustForConstraints(a)}this.setPagePosition(a[0],a[1])},doAutoWidth:function(a){a=a||0;var b=this.body.getTextWidth();if(this.title){b=Math.max(b,this.header.child("span").getTextWidth(this.title))}b+=this.getFrameWidth()+(this.closable?20:0)+this.body.getPadding("lr")+a;this.setWidth(b.constrain(this.minWidth,this.maxWidth));if(Ext.isIE7&&!this.repainted){this.el.repaint();this.repainted=true}},showBy:function(a,b){if(!this.rendered){this.render(Ext.getBody())}this.showAt(this.el.getAlignToXY(a,b||this.defaultAlign))},initDraggable:function(){this.dd=new Ext.Tip.DD(this,typeof this.draggable=="boolean"?null:this.draggable);this.header.addClass("x-tip-draggable")}});Ext.reg("tip",Ext.Tip);Ext.Tip.DD=function(b,a){Ext.apply(this,a);this.tip=b;Ext.Tip.DD.superclass.constructor.call(this,b.el.id,"WindowDD-"+b.id);this.setHandleElId(b.header.id);this.scroll=false};Ext.extend(Ext.Tip.DD,Ext.dd.DD,{moveOnly:true,scroll:false,headerOffsets:[100,25],startDrag:function(){this.tip.el.disableShadow()},endDrag:function(a){this.tip.el.enableShadow(true)}});Ext.ToolTip=Ext.extend(Ext.Tip,{showDelay:500,hideDelay:200,dismissDelay:5000,trackMouse:false,anchorToTarget:true,anchorOffset:0,targetCounter:0,constrainPosition:false,initComponent:function(){Ext.ToolTip.superclass.initComponent.call(this);this.lastActive=new Date();this.initTarget(this.target);this.origAnchor=this.anchor},onRender:function(b,a){Ext.ToolTip.superclass.onRender.call(this,b,a);this.anchorCls="x-tip-anchor-"+this.getAnchorPosition();this.anchorEl=this.el.createChild({cls:"x-tip-anchor "+this.anchorCls})},afterRender:function(){Ext.ToolTip.superclass.afterRender.call(this);this.anchorEl.setStyle("z-index",this.el.getZIndex()+1).setVisibilityMode(Ext.Element.DISPLAY)},initTarget:function(c){var a;if((a=Ext.get(c))){if(this.target){var b=Ext.get(this.target);this.mun(b,"mouseover",this.onTargetOver,this);this.mun(b,"mouseout",this.onTargetOut,this);this.mun(b,"mousemove",this.onMouseMove,this)}this.mon(a,{mouseover:this.onTargetOver,mouseout:this.onTargetOut,mousemove:this.onMouseMove,scope:this});this.target=a}if(this.anchor){this.anchorTarget=this.target}},onMouseMove:function(b){var a=this.delegate?b.getTarget(this.delegate):this.triggerElement=true;if(a){this.targetXY=b.getXY();if(a===this.triggerElement){if(!this.hidden&&this.trackMouse){this.setPagePosition(this.getTargetXY())}}else{this.hide();this.lastActive=new Date(0);this.onTargetOver(b)}}else{if(!this.closable&&this.isVisible()){this.hide()}}},getTargetXY:function(){if(this.delegate){this.anchorTarget=this.triggerElement}if(this.anchor){this.targetCounter++;var c=this.getOffsets(),l=(this.anchorToTarget&&!this.trackMouse)?this.el.getAlignToXY(this.anchorTarget,this.getAnchorAlign()):this.targetXY,a=Ext.lib.Dom.getViewWidth()-5,h=Ext.lib.Dom.getViewHeight()-5,i=document.documentElement,e=document.body,k=(i.scrollLeft||e.scrollLeft||0)+5,j=(i.scrollTop||e.scrollTop||0)+5,b=[l[0]+c[0],l[1]+c[1]],g=this.getSize();this.anchorEl.removeClass(this.anchorCls);if(this.targetCounter<2){if(b[0]<k){if(this.anchorToTarget){this.defaultAlign="l-r";if(this.mouseOffset){this.mouseOffset[0]*=-1}}this.anchor="left";return this.getTargetXY()}if(b[0]+g.width>a){if(this.anchorToTarget){this.defaultAlign="r-l";if(this.mouseOffset){this.mouseOffset[0]*=-1}}this.anchor="right";return this.getTargetXY()}if(b[1]<j){if(this.anchorToTarget){this.defaultAlign="t-b";if(this.mouseOffset){this.mouseOffset[1]*=-1}}this.anchor="top";return this.getTargetXY()}if(b[1]+g.height>h){if(this.anchorToTarget){this.defaultAlign="b-t";if(this.mouseOffset){this.mouseOffset[1]*=-1}}this.anchor="bottom";return this.getTargetXY()}}this.anchorCls="x-tip-anchor-"+this.getAnchorPosition();this.anchorEl.addClass(this.anchorCls);this.targetCounter=0;return b}else{var d=this.getMouseOffset();return[this.targetXY[0]+d[0],this.targetXY[1]+d[1]]}},getMouseOffset:function(){var a=this.anchor?[0,0]:[15,18];if(this.mouseOffset){a[0]+=this.mouseOffset[0];a[1]+=this.mouseOffset[1]}return a},getAnchorPosition:function(){if(this.anchor){this.tipAnchor=this.anchor.charAt(0)}else{var a=this.defaultAlign.match(/^([a-z]+)-([a-z]+)(\?)?$/);if(!a){throw"AnchorTip.defaultAlign is invalid"}this.tipAnchor=a[1].charAt(0)}switch(this.tipAnchor){case"t":return"top";case"b":return"bottom";case"r":return"right"}return"left"},getAnchorAlign:function(){switch(this.anchor){case"top":return"tl-bl";case"left":return"tl-tr";case"right":return"tr-tl";default:return"bl-tl"}},getOffsets:function(){var b,a=this.getAnchorPosition().charAt(0);if(this.anchorToTarget&&!this.trackMouse){switch(a){case"t":b=[0,9];break;case"b":b=[0,-13];break;case"r":b=[-13,0];break;default:b=[9,0];break}}else{switch(a){case"t":b=[-15-this.anchorOffset,30];break;case"b":b=[-19-this.anchorOffset,-13-this.el.dom.offsetHeight];break;case"r":b=[-15-this.el.dom.offsetWidth,-13-this.anchorOffset];break;default:b=[25,-13-this.anchorOffset];break}}var c=this.getMouseOffset();b[0]+=c[0];b[1]+=c[1];return b},onTargetOver:function(b){if(this.disabled||b.within(this.target.dom,true)){return}var a=b.getTarget(this.delegate);if(a){this.triggerElement=a;this.clearTimer("hide");this.targetXY=b.getXY();this.delayShow()}},delayShow:function(){if(this.hidden&&!this.showTimer){if(this.lastActive.getElapsed()<this.quickShowInterval){this.show()}else{this.showTimer=this.show.defer(this.showDelay,this)}}else{if(!this.hidden&&this.autoHide!==false){this.show()}}},onTargetOut:function(a){if(this.disabled||a.within(this.target.dom,true)){return}this.clearTimer("show");if(this.autoHide!==false){this.delayHide()}},delayHide:function(){if(!this.hidden&&!this.hideTimer){this.hideTimer=this.hide.defer(this.hideDelay,this)}},hide:function(){this.clearTimer("dismiss");this.lastActive=new Date();if(this.anchorEl){this.anchorEl.hide()}Ext.ToolTip.superclass.hide.call(this);delete this.triggerElement},show:function(){if(this.anchor){this.showAt([-1000,-1000]);this.origConstrainPosition=this.constrainPosition;this.constrainPosition=false;this.anchor=this.origAnchor}this.showAt(this.getTargetXY());if(this.anchor){this.anchorEl.show();this.syncAnchor();this.constrainPosition=this.origConstrainPosition}else{this.anchorEl.hide()}},showAt:function(a){this.lastActive=new Date();this.clearTimers();Ext.ToolTip.superclass.showAt.call(this,a);if(this.dismissDelay&&this.autoHide!==false){this.dismissTimer=this.hide.defer(this.dismissDelay,this)}if(this.anchor&&!this.anchorEl.isVisible()){this.syncAnchor();this.anchorEl.show()}else{this.anchorEl.hide()}},syncAnchor:function(){var a,b,c;switch(this.tipAnchor.charAt(0)){case"t":a="b";b="tl";c=[20+this.anchorOffset,2];break;case"r":a="l";b="tr";c=[-2,11+this.anchorOffset];break;case"b":a="t";b="bl";c=[20+this.anchorOffset,-2];break;default:a="r";b="tl";c=[2,11+this.anchorOffset];break}this.anchorEl.alignTo(this.el,a+"-"+b,c)},setPagePosition:function(a,b){Ext.ToolTip.superclass.setPagePosition.call(this,a,b);if(this.anchor){this.syncAnchor()}},clearTimer:function(a){a=a+"Timer";clearTimeout(this[a]);delete this[a]},clearTimers:function(){this.clearTimer("show");this.clearTimer("dismiss");this.clearTimer("hide")},onShow:function(){Ext.ToolTip.superclass.onShow.call(this);Ext.getDoc().on("mousedown",this.onDocMouseDown,this)},onHide:function(){Ext.ToolTip.superclass.onHide.call(this);Ext.getDoc().un("mousedown",this.onDocMouseDown,this)},onDocMouseDown:function(a){if(this.autoHide!==true&&!this.closable&&!a.within(this.el.dom)){this.disable();this.doEnable.defer(100,this)}},doEnable:function(){if(!this.isDestroyed){this.enable()}},onDisable:function(){this.clearTimers();this.hide()},adjustPosition:function(a,d){if(this.constrainPosition){var c=this.targetXY[1],b=this.getSize().height;if(d<=c&&(d+b)>=c){d=c-b-5}}return{x:a,y:d}},beforeDestroy:function(){this.clearTimers();Ext.destroy(this.anchorEl);delete this.anchorEl;delete this.target;delete this.anchorTarget;delete this.triggerElement;Ext.ToolTip.superclass.beforeDestroy.call(this)},onDestroy:function(){Ext.getDoc().un("mousedown",this.onDocMouseDown,this);Ext.ToolTip.superclass.onDestroy.call(this)}});Ext.reg("tooltip",Ext.ToolTip);Ext.QuickTip=Ext.extend(Ext.ToolTip,{interceptTitles:false,tagConfig:{namespace:"ext",attribute:"qtip",width:"qwidth",target:"target",title:"qtitle",hide:"hide",cls:"qclass",align:"qalign",anchor:"anchor"},initComponent:function(){this.target=this.target||Ext.getDoc();this.targets=this.targets||{};Ext.QuickTip.superclass.initComponent.call(this)},register:function(e){var h=Ext.isArray(e)?e:arguments;for(var g=0,a=h.length;g<a;g++){var l=h[g];var k=l.target;if(k){if(Ext.isArray(k)){for(var d=0,b=k.length;d<b;d++){this.targets[Ext.id(k[d])]=l}}else{this.targets[Ext.id(k)]=l}}}},unregister:function(a){delete this.targets[Ext.id(a)]},cancelShow:function(b){var a=this.activeTarget;b=Ext.get(b).dom;if(this.isVisible()){if(a&&a.el==b){this.hide()}}else{if(a&&a.el==b){this.clearTimer("show")}}},getTipCfg:function(d){var b=d.getTarget(),c,a;if(this.interceptTitles&&b.title&&Ext.isString(b.title)){c=b.title;b.qtip=c;b.removeAttribute("title");d.preventDefault()}else{a=this.tagConfig;c=b.qtip||Ext.fly(b).getAttribute(a.attribute,a.namespace)}return c},onTargetOver:function(i){if(this.disabled){return}this.targetXY=i.getXY();var c=i.getTarget();if(!c||c.nodeType!==1||c==document||c==document.body){return}if(this.activeTarget&&((c==this.activeTarget.el)||Ext.fly(this.activeTarget.el).contains(c))){this.clearTimer("hide");this.show();return}if(c&&this.targets[c.id]){this.activeTarget=this.targets[c.id];this.activeTarget.el=c;this.anchor=this.activeTarget.anchor;if(this.anchor){this.anchorTarget=c}this.delayShow();return}var g,h=Ext.fly(c),b=this.tagConfig,d=b.namespace;if(g=this.getTipCfg(i)){var a=h.getAttribute(b.hide,d);this.activeTarget={el:c,text:g,width:h.getAttribute(b.width,d),autoHide:a!="user"&&a!=="false",title:h.getAttribute(b.title,d),cls:h.getAttribute(b.cls,d),align:h.getAttribute(b.align,d)};this.anchor=h.getAttribute(b.anchor,d);if(this.anchor){this.anchorTarget=c}this.delayShow()}},onTargetOut:function(a){if(this.activeTarget&&a.within(this.activeTarget.el)&&!this.getTipCfg(a)){return}this.clearTimer("show");if(this.autoHide!==false){this.delayHide()}},showAt:function(b){var a=this.activeTarget;if(a){if(!this.rendered){this.render(Ext.getBody());this.activeTarget=a}if(a.width){this.setWidth(a.width);this.body.setWidth(this.adjustBodyWidth(a.width-this.getFrameWidth()));this.measureWidth=false}else{this.measureWidth=true}this.setTitle(a.title||"");this.body.update(a.text);this.autoHide=a.autoHide;this.dismissDelay=a.dismissDelay||this.dismissDelay;if(this.lastCls){this.el.removeClass(this.lastCls);delete this.lastCls}if(a.cls){this.el.addClass(a.cls);this.lastCls=a.cls}if(this.anchor){this.constrainPosition=false}else{if(a.align){b=this.el.getAlignToXY(a.el,a.align);this.constrainPosition=false}else{this.constrainPosition=true}}}Ext.QuickTip.superclass.showAt.call(this,b)},hide:function(){delete this.activeTarget;Ext.QuickTip.superclass.hide.call(this)}});Ext.reg("quicktip",Ext.QuickTip);Ext.QuickTips=function(){var b,a=false;return{init:function(c){if(!b){if(!Ext.isReady){Ext.onReady(function(){Ext.QuickTips.init(c)});return}b=new Ext.QuickTip({elements:"header,body",disabled:a});if(c!==false){b.render(Ext.getBody())}}},ddDisable:function(){if(b&&!a){b.disable()}},ddEnable:function(){if(b&&!a){b.enable()}},enable:function(){if(b){b.enable()}a=false},disable:function(){if(b){b.disable()}a=true},isEnabled:function(){return b!==undefined&&!b.disabled},getQuickTip:function(){return b},register:function(){b.register.apply(b,arguments)},unregister:function(){b.unregister.apply(b,arguments)},tips:function(){b.register.apply(b,arguments)}}}();Ext.slider.Tip=Ext.extend(Ext.Tip,{minWidth:10,offsets:[0,-10],init:function(a){a.on({scope:this,dragstart:this.onSlide,drag:this.onSlide,dragend:this.hide,destroy:this.destroy})},onSlide:function(b,c,a){this.show();this.body.update(this.getText(a));this.doAutoWidth();this.el.alignTo(a.el,"b-t?",this.offsets)},getText:function(a){return String(a.value)}});Ext.ux.SliderTip=Ext.slider.Tip;Ext.tree.TreePanel=Ext.extend(Ext.Panel,{rootVisible:true,animate:Ext.enableFx,lines:true,enableDD:false,hlDrop:Ext.enableFx,pathSeparator:"/",bubbleEvents:[],initComponent:function(){Ext.tree.TreePanel.superclass.initComponent.call(this);if(!this.eventModel){this.eventModel=new Ext.tree.TreeEventModel(this)}var a=this.loader;if(!a){a=new Ext.tree.TreeLoader({dataUrl:this.dataUrl,requestMethod:this.requestMethod})}else{if(Ext.isObject(a)&&!a.load){a=new Ext.tree.TreeLoader(a)}}this.loader=a;this.nodeHash={};if(this.root){var b=this.root;delete this.root;this.setRootNode(b)}this.addEvents("append","remove","movenode","insert","beforeappend","beforeremove","beforemovenode","beforeinsert","beforeload","load","textchange","beforeexpandnode","beforecollapsenode","expandnode","disabledchange","collapsenode","beforeclick","click","containerclick","checkchange","beforedblclick","dblclick","containerdblclick","contextmenu","containercontextmenu","beforechildrenrendered","startdrag","enddrag","dragdrop","beforenodedrop","nodedrop","nodedragover");if(this.singleExpand){this.on("beforeexpandnode",this.restrictExpand,this)}},proxyNodeEvent:function(c,b,a,h,g,e,d){if(c=="collapse"||c=="expand"||c=="beforecollapse"||c=="beforeexpand"||c=="move"||c=="beforemove"){c=c+"node"}return this.fireEvent(c,b,a,h,g,e,d)},getRootNode:function(){return this.root},setRootNode:function(b){this.destroyRoot();if(!b.render){b=this.loader.createNode(b)}this.root=b;b.ownerTree=this;b.isRoot=true;this.registerNode(b);if(!this.rootVisible){var a=b.attributes.uiProvider;b.ui=a?new a(b):new Ext.tree.RootTreeNodeUI(b)}if(this.innerCt){this.clearInnerCt();this.renderRoot()}return b},clearInnerCt:function(){this.innerCt.update("")},renderRoot:function(){this.root.render();if(!this.rootVisible){this.root.renderChildren()}},getNodeById:function(a){return this.nodeHash[a]},registerNode:function(a){this.nodeHash[a.id]=a},unregisterNode:function(a){delete this.nodeHash[a.id]},toString:function(){return"[Tree"+(this.id?" "+this.id:"")+"]"},restrictExpand:function(a){var b=a.parentNode;if(b){if(b.expandedChild&&b.expandedChild.parentNode==b){b.expandedChild.collapse()}b.expandedChild=a}},getChecked:function(b,c){c=c||this.root;var d=[];var e=function(){if(this.attributes.checked){d.push(!b?this:(b=="id"?this.id:this.attributes[b]))}};c.cascade(e);return d},getLoader:function(){return this.loader},expandAll:function(){this.root.expand(true)},collapseAll:function(){this.root.collapse(true)},getSelectionModel:function(){if(!this.selModel){this.selModel=new Ext.tree.DefaultSelectionModel()}return this.selModel},expandPath:function(g,a,h){if(Ext.isEmpty(g)){if(h){h(false,undefined)}return}a=a||"id";var d=g.split(this.pathSeparator);var c=this.root;if(c.attributes[a]!=d[1]){if(h){h(false,null)}return}var b=1;var e=function(){if(++b==d.length){if(h){h(true,c)}return}var i=c.findChild(a,d[b]);if(!i){if(h){h(false,c)}return}c=i;i.expand(false,false,e)};c.expand(false,false,e)},selectPath:function(e,a,g){if(Ext.isEmpty(e)){if(g){g(false,undefined)}return}a=a||"id";var c=e.split(this.pathSeparator),b=c.pop();if(c.length>1){var d=function(i,h){if(i&&h){var j=h.findChild(a,b);if(j){j.select();if(g){g(true,j)}}else{if(g){g(false,j)}}}else{if(g){g(false,j)}}};this.expandPath(c.join(this.pathSeparator),a,d)}else{this.root.select();if(g){g(true,this.root)}}},getTreeEl:function(){return this.body},onRender:function(b,a){Ext.tree.TreePanel.superclass.onRender.call(this,b,a);this.el.addClass("x-tree");this.innerCt=this.body.createChild({tag:"ul",cls:"x-tree-root-ct "+(this.useArrows?"x-tree-arrows":this.lines?"x-tree-lines":"x-tree-no-lines")})},initEvents:function(){Ext.tree.TreePanel.superclass.initEvents.call(this);if(this.containerScroll){Ext.dd.ScrollManager.register(this.body)}if((this.enableDD||this.enableDrop)&&!this.dropZone){this.dropZone=new Ext.tree.TreeDropZone(this,this.dropConfig||{ddGroup:this.ddGroup||"TreeDD",appendOnly:this.ddAppendOnly===true})}if((this.enableDD||this.enableDrag)&&!this.dragZone){this.dragZone=new Ext.tree.TreeDragZone(this,this.dragConfig||{ddGroup:this.ddGroup||"TreeDD",scroll:this.ddScroll})}this.getSelectionModel().init(this)},afterRender:function(){Ext.tree.TreePanel.superclass.afterRender.call(this);this.renderRoot()},beforeDestroy:function(){if(this.rendered){Ext.dd.ScrollManager.unregister(this.body);Ext.destroy(this.dropZone,this.dragZone)}this.destroyRoot();Ext.destroy(this.loader);this.nodeHash=this.root=this.loader=null;Ext.tree.TreePanel.superclass.beforeDestroy.call(this)},destroyRoot:function(){if(this.root&&this.root.destroy){this.root.destroy(true)}}});Ext.tree.TreePanel.nodeTypes={};Ext.reg("treepanel",Ext.tree.TreePanel);Ext.tree.TreeEventModel=function(a){this.tree=a;this.tree.on("render",this.initEvents,this)};Ext.tree.TreeEventModel.prototype={initEvents:function(){var a=this.tree;if(a.trackMouseOver!==false){a.mon(a.innerCt,{scope:this,mouseover:this.delegateOver,mouseout:this.delegateOut})}a.mon(a.getTreeEl(),{scope:this,click:this.delegateClick,dblclick:this.delegateDblClick,contextmenu:this.delegateContextMenu})},getNode:function(b){var a;if(a=b.getTarget(".x-tree-node-el",10)){var c=Ext.fly(a,"_treeEvents").getAttribute("tree-node-id","ext");if(c){return this.tree.getNodeById(c)}}return null},getNodeTarget:function(b){var a=b.getTarget(".x-tree-node-icon",1);if(!a){a=b.getTarget(".x-tree-node-el",6)}return a},delegateOut:function(b,a){if(!this.beforeEvent(b)){return}if(b.getTarget(".x-tree-ec-icon",1)){var c=this.getNode(b);this.onIconOut(b,c);if(c==this.lastEcOver){delete this.lastEcOver}}if((a=this.getNodeTarget(b))&&!b.within(a,true)){this.onNodeOut(b,this.getNode(b))}},delegateOver:function(b,a){if(!this.beforeEvent(b)){return}if(Ext.isGecko&&!this.trackingDoc){Ext.getBody().on("mouseover",this.trackExit,this);this.trackingDoc=true}if(this.lastEcOver){this.onIconOut(b,this.lastEcOver);delete this.lastEcOver}if(b.getTarget(".x-tree-ec-icon",1)){this.lastEcOver=this.getNode(b);this.onIconOver(b,this.lastEcOver)}if(a=this.getNodeTarget(b)){this.onNodeOver(b,this.getNode(b))}},trackExit:function(a){if(this.lastOverNode){if(this.lastOverNode.ui&&!a.within(this.lastOverNode.ui.getEl())){this.onNodeOut(a,this.lastOverNode)}delete this.lastOverNode;Ext.getBody().un("mouseover",this.trackExit,this);this.trackingDoc=false}},delegateClick:function(b,a){if(this.beforeEvent(b)){if(b.getTarget("input[type=checkbox]",1)){this.onCheckboxClick(b,this.getNode(b))}else{if(b.getTarget(".x-tree-ec-icon",1)){this.onIconClick(b,this.getNode(b))}else{if(this.getNodeTarget(b)){this.onNodeClick(b,this.getNode(b))}}}}else{this.checkContainerEvent(b,"click")}},delegateDblClick:function(b,a){if(this.beforeEvent(b)){if(this.getNodeTarget(b)){this.onNodeDblClick(b,this.getNode(b))}}else{this.checkContainerEvent(b,"dblclick")}},delegateContextMenu:function(b,a){if(this.beforeEvent(b)){if(this.getNodeTarget(b)){this.onNodeContextMenu(b,this.getNode(b))}}else{this.checkContainerEvent(b,"contextmenu")}},checkContainerEvent:function(b,a){if(this.disabled){b.stopEvent();return false}this.onContainerEvent(b,a)},onContainerEvent:function(b,a){this.tree.fireEvent("container"+a,this.tree,b)},onNodeClick:function(b,a){a.ui.onClick(b)},onNodeOver:function(b,a){this.lastOverNode=a;a.ui.onOver(b)},onNodeOut:function(b,a){a.ui.onOut(b)},onIconOver:function(b,a){a.ui.addClass("x-tree-ec-over")},onIconOut:function(b,a){a.ui.removeClass("x-tree-ec-over")},onIconClick:function(b,a){a.ui.ecClick(b)},onCheckboxClick:function(b,a){a.ui.onCheckChange(b)},onNodeDblClick:function(b,a){a.ui.onDblClick(b)},onNodeContextMenu:function(b,a){a.ui.onContextMenu(b)},beforeEvent:function(b){var a=this.getNode(b);if(this.disabled||!a||!a.ui){b.stopEvent();return false}return true},disable:function(){this.disabled=true},enable:function(){this.disabled=false}};Ext.tree.DefaultSelectionModel=Ext.extend(Ext.util.Observable,{constructor:function(a){this.selNode=null;this.addEvents("selectionchange","beforeselect");Ext.apply(this,a);Ext.tree.DefaultSelectionModel.superclass.constructor.call(this)},init:function(a){this.tree=a;a.mon(a.getTreeEl(),"keydown",this.onKeyDown,this);a.on("click",this.onNodeClick,this)},onNodeClick:function(a,b){this.select(a)},select:function(c,a){if(!Ext.fly(c.ui.wrap).isVisible()&&a){return a.call(this,c)}var b=this.selNode;if(c==b){c.ui.onSelectedChange(true)}else{if(this.fireEvent("beforeselect",this,c,b)!==false){if(b&&b.ui){b.ui.onSelectedChange(false)}this.selNode=c;c.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,c,b)}}return c},unselect:function(b,a){if(this.selNode==b){this.clearSelections(a)}},clearSelections:function(a){var b=this.selNode;if(b){b.ui.onSelectedChange(false);this.selNode=null;if(a!==true){this.fireEvent("selectionchange",this,null)}}return b},getSelectedNode:function(){return this.selNode},isSelected:function(a){return this.selNode==a},selectPrevious:function(a){if(!(a=a||this.selNode||this.lastSelNode)){return null}var c=a.previousSibling;if(c){if(!c.isExpanded()||c.childNodes.length<1){return this.select(c,this.selectPrevious)}else{var b=c.lastChild;while(b&&b.isExpanded()&&Ext.fly(b.ui.wrap).isVisible()&&b.childNodes.length>0){b=b.lastChild}return this.select(b,this.selectPrevious)}}else{if(a.parentNode&&(this.tree.rootVisible||!a.parentNode.isRoot)){return this.select(a.parentNode,this.selectPrevious)}}return null},selectNext:function(b){if(!(b=b||this.selNode||this.lastSelNode)){return null}if(b.firstChild&&b.isExpanded()&&Ext.fly(b.ui.wrap).isVisible()){return this.select(b.firstChild,this.selectNext)}else{if(b.nextSibling){return this.select(b.nextSibling,this.selectNext)}else{if(b.parentNode){var a=null;b.parentNode.bubble(function(){if(this.nextSibling){a=this.getOwnerTree().selModel.select(this.nextSibling,this.selectNext);return false}});return a}}}return null},onKeyDown:function(c){var b=this.selNode||this.lastSelNode;var d=this;if(!b){return}var a=c.getKey();switch(a){case c.DOWN:c.stopEvent();this.selectNext();break;case c.UP:c.stopEvent();this.selectPrevious();break;case c.RIGHT:c.preventDefault();if(b.hasChildNodes()){if(!b.isExpanded()){b.expand()}else{if(b.firstChild){this.select(b.firstChild,c)}}}break;case c.LEFT:c.preventDefault();if(b.hasChildNodes()&&b.isExpanded()){b.collapse()}else{if(b.parentNode&&(this.tree.rootVisible||b.parentNode!=this.tree.getRootNode())){this.select(b.parentNode,c)}}break}}});Ext.tree.MultiSelectionModel=Ext.extend(Ext.util.Observable,{constructor:function(a){this.selNodes=[];this.selMap={};this.addEvents("selectionchange");Ext.apply(this,a);Ext.tree.MultiSelectionModel.superclass.constructor.call(this)},init:function(a){this.tree=a;a.mon(a.getTreeEl(),"keydown",this.onKeyDown,this);a.on("click",this.onNodeClick,this)},onNodeClick:function(a,b){if(b.ctrlKey&&this.isSelected(a)){this.unselect(a)}else{this.select(a,b,b.ctrlKey)}},select:function(a,c,b){if(b!==true){this.clearSelections(true)}if(this.isSelected(a)){this.lastSelNode=a;return a}this.selNodes.push(a);this.selMap[a.id]=a;this.lastSelNode=a;a.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,this.selNodes);return a},unselect:function(b){if(this.selMap[b.id]){b.ui.onSelectedChange(false);var c=this.selNodes;var a=c.indexOf(b);if(a!=-1){this.selNodes.splice(a,1)}delete this.selMap[b.id];this.fireEvent("selectionchange",this,this.selNodes)}},clearSelections:function(b){var d=this.selNodes;if(d.length>0){for(var c=0,a=d.length;c<a;c++){d[c].ui.onSelectedChange(false)}this.selNodes=[];this.selMap={};if(b!==true){this.fireEvent("selectionchange",this,this.selNodes)}}},isSelected:function(a){return this.selMap[a.id]?true:false},getSelectedNodes:function(){return this.selNodes.concat([])},onKeyDown:Ext.tree.DefaultSelectionModel.prototype.onKeyDown,selectNext:Ext.tree.DefaultSelectionModel.prototype.selectNext,selectPrevious:Ext.tree.DefaultSelectionModel.prototype.selectPrevious});Ext.data.Tree=Ext.extend(Ext.util.Observable,{constructor:function(a){this.nodeHash={};this.root=null;if(a){this.setRootNode(a)}this.addEvents("append","remove","move","insert","beforeappend","beforeremove","beforemove","beforeinsert");Ext.data.Tree.superclass.constructor.call(this)},pathSeparator:"/",proxyNodeEvent:function(){return this.fireEvent.apply(this,arguments)},getRootNode:function(){return this.root},setRootNode:function(a){this.root=a;a.ownerTree=this;a.isRoot=true;this.registerNode(a);return a},getNodeById:function(a){return this.nodeHash[a]},registerNode:function(a){this.nodeHash[a.id]=a},unregisterNode:function(a){delete this.nodeHash[a.id]},toString:function(){return"[Tree"+(this.id?" "+this.id:"")+"]"}});Ext.data.Node=Ext.extend(Ext.util.Observable,{constructor:function(a){this.attributes=a||{};this.leaf=this.attributes.leaf;this.id=this.attributes.id;if(!this.id){this.id=Ext.id(null,"xnode-");this.attributes.id=this.id}this.childNodes=[];this.parentNode=null;this.firstChild=null;this.lastChild=null;this.previousSibling=null;this.nextSibling=null;this.addEvents({append:true,remove:true,move:true,insert:true,beforeappend:true,beforeremove:true,beforemove:true,beforeinsert:true});this.listeners=this.attributes.listeners;Ext.data.Node.superclass.constructor.call(this)},fireEvent:function(b){if(Ext.data.Node.superclass.fireEvent.apply(this,arguments)===false){return false}var a=this.getOwnerTree();if(a){if(a.proxyNodeEvent.apply(a,arguments)===false){return false}}return true},isLeaf:function(){return this.leaf===true},setFirstChild:function(a){this.firstChild=a},setLastChild:function(a){this.lastChild=a},isLast:function(){return(!this.parentNode?true:this.parentNode.lastChild==this)},isFirst:function(){return(!this.parentNode?true:this.parentNode.firstChild==this)},hasChildNodes:function(){return !this.isLeaf()&&this.childNodes.length>0},isExpandable:function(){return this.attributes.expandable||this.hasChildNodes()},appendChild:function(e){var g=false;if(Ext.isArray(e)){g=e}else{if(arguments.length>1){g=arguments}}if(g){for(var d=0,a=g.length;d<a;d++){this.appendChild(g[d])}}else{if(this.fireEvent("beforeappend",this.ownerTree,this,e)===false){return false}var b=this.childNodes.length;var c=e.parentNode;if(c){if(e.fireEvent("beforemove",e.getOwnerTree(),e,c,this,b)===false){return false}c.removeChild(e)}b=this.childNodes.length;if(b===0){this.setFirstChild(e)}this.childNodes.push(e);e.parentNode=this;var h=this.childNodes[b-1];if(h){e.previousSibling=h;h.nextSibling=e}else{e.previousSibling=null}e.nextSibling=null;this.setLastChild(e);e.setOwnerTree(this.getOwnerTree());this.fireEvent("append",this.ownerTree,this,e,b);if(c){e.fireEvent("move",this.ownerTree,e,c,this,b)}return e}},removeChild:function(c,b){var a=this.childNodes.indexOf(c);if(a==-1){return false}if(this.fireEvent("beforeremove",this.ownerTree,this,c)===false){return false}this.childNodes.splice(a,1);if(c.previousSibling){c.previousSibling.nextSibling=c.nextSibling}if(c.nextSibling){c.nextSibling.previousSibling=c.previousSibling}if(this.firstChild==c){this.setFirstChild(c.nextSibling)}if(this.lastChild==c){this.setLastChild(c.previousSibling)}this.fireEvent("remove",this.ownerTree,this,c);if(b){c.destroy(true)}else{c.clear()}return c},clear:function(a){this.setOwnerTree(null,a);this.parentNode=this.previousSibling=this.nextSibling=null;if(a){this.firstChild=this.lastChild=null}},destroy:function(a){if(a===true){this.purgeListeners();this.clear(true);Ext.each(this.childNodes,function(b){b.destroy(true)});this.childNodes=null}else{this.remove(true)}},insertBefore:function(d,a){if(!a){return this.appendChild(d)}if(d==a){return false}if(this.fireEvent("beforeinsert",this.ownerTree,this,d,a)===false){return false}var b=this.childNodes.indexOf(a);var c=d.parentNode;var e=b;if(c==this&&this.childNodes.indexOf(d)<b){e--}if(c){if(d.fireEvent("beforemove",d.getOwnerTree(),d,c,this,b,a)===false){return false}c.removeChild(d)}if(e===0){this.setFirstChild(d)}this.childNodes.splice(e,0,d);d.parentNode=this;var g=this.childNodes[e-1];if(g){d.previousSibling=g;g.nextSibling=d}else{d.previousSibling=null}d.nextSibling=a;a.previousSibling=d;d.setOwnerTree(this.getOwnerTree());this.fireEvent("insert",this.ownerTree,this,d,a);if(c){d.fireEvent("move",this.ownerTree,d,c,this,e,a)}return d},remove:function(a){if(this.parentNode){this.parentNode.removeChild(this,a)}return this},removeAll:function(a){var c=this.childNodes,b;while((b=c[0])){this.removeChild(b,a)}return this},item:function(a){return this.childNodes[a]},replaceChild:function(a,c){var b=c?c.nextSibling:null;this.removeChild(c);this.insertBefore(a,b);return c},indexOf:function(a){return this.childNodes.indexOf(a)},getOwnerTree:function(){if(!this.ownerTree){var a=this;while(a){if(a.ownerTree){this.ownerTree=a.ownerTree;break}a=a.parentNode}}return this.ownerTree},getDepth:function(){var b=0;var a=this;while(a.parentNode){++b;a=a.parentNode}return b},setOwnerTree:function(a,b){if(a!=this.ownerTree){if(this.ownerTree){this.ownerTree.unregisterNode(this)}this.ownerTree=a;if(b!==true){Ext.each(this.childNodes,function(c){c.setOwnerTree(a)})}if(a){a.registerNode(this)}}},setId:function(b){if(b!==this.id){var a=this.ownerTree;if(a){a.unregisterNode(this)}this.id=this.attributes.id=b;if(a){a.registerNode(this)}this.onIdChange(b)}},onIdChange:Ext.emptyFn,getPath:function(c){c=c||"id";var e=this.parentNode;var a=[this.attributes[c]];while(e){a.unshift(e.attributes[c]);e=e.parentNode}var d=this.getOwnerTree().pathSeparator;return d+a.join(d)},bubble:function(c,b,a){var d=this;while(d){if(c.apply(b||d,a||[d])===false){break}d=d.parentNode}},cascade:function(g,e,b){if(g.apply(e||this,b||[this])!==false){var d=this.childNodes;for(var c=0,a=d.length;c<a;c++){d[c].cascade(g,e,b)}}},eachChild:function(g,e,b){var d=this.childNodes;for(var c=0,a=d.length;c<a;c++){if(g.apply(e||d[c],b||[d[c]])===false){break}}},findChild:function(b,c,a){return this.findChildBy(function(){return this.attributes[b]==c},null,a)},findChildBy:function(h,g,b){var e=this.childNodes,a=e.length,d=0,j,c;for(;d<a;d++){j=e[d];if(h.call(g||j,j)===true){return j}else{if(b){c=j.findChildBy(h,g,b);if(c!=null){return c}}}}return null},sort:function(e,d){var c=this.childNodes;var a=c.length;if(a>0){var g=d?function(){e.apply(d,arguments)}:e;c.sort(g);for(var b=0;b<a;b++){var h=c[b];h.previousSibling=c[b-1];h.nextSibling=c[b+1];if(b===0){this.setFirstChild(h)}if(b==a-1){this.setLastChild(h)}}}},contains:function(a){return a.isAncestor(this)},isAncestor:function(a){var b=this.parentNode;while(b){if(b==a){return true}b=b.parentNode}return false},toString:function(){return"[Node"+(this.id?" "+this.id:"")+"]"}});Ext.tree.TreeNode=Ext.extend(Ext.data.Node,{constructor:function(a){a=a||{};if(Ext.isString(a)){a={text:a}}this.childrenRendered=false;this.rendered=false;Ext.tree.TreeNode.superclass.constructor.call(this,a);this.expanded=a.expanded===true;this.isTarget=a.isTarget!==false;this.draggable=a.draggable!==false&&a.allowDrag!==false;this.allowChildren=a.allowChildren!==false&&a.allowDrop!==false;this.text=a.text;this.disabled=a.disabled===true;this.hidden=a.hidden===true;this.addEvents("textchange","beforeexpand","beforecollapse","expand","disabledchange","collapse","beforeclick","click","checkchange","beforedblclick","dblclick","contextmenu","beforechildrenrendered");var b=this.attributes.uiProvider||this.defaultUI||Ext.tree.TreeNodeUI;this.ui=new b(this)},preventHScroll:true,isExpanded:function(){return this.expanded},getUI:function(){return this.ui},getLoader:function(){var a;return this.loader||((a=this.getOwnerTree())&&a.loader?a.loader:(this.loader=new Ext.tree.TreeLoader()))},setFirstChild:function(a){var b=this.firstChild;Ext.tree.TreeNode.superclass.setFirstChild.call(this,a);if(this.childrenRendered&&b&&a!=b){b.renderIndent(true,true)}if(this.rendered){this.renderIndent(true,true)}},setLastChild:function(b){var a=this.lastChild;Ext.tree.TreeNode.superclass.setLastChild.call(this,b);if(this.childrenRendered&&a&&b!=a){a.renderIndent(true,true)}if(this.rendered){this.renderIndent(true,true)}},appendChild:function(b){if(!b.render&&!Ext.isArray(b)){b=this.getLoader().createNode(b)}var a=Ext.tree.TreeNode.superclass.appendChild.call(this,b);if(a&&this.childrenRendered){a.render()}this.ui.updateExpandIcon();return a},removeChild:function(b,a){this.ownerTree.getSelectionModel().unselect(b);Ext.tree.TreeNode.superclass.removeChild.apply(this,arguments);if(!a){var c=b.ui.rendered;if(c){b.ui.remove()}if(c&&this.childNodes.length<1){this.collapse(false,false)}else{this.ui.updateExpandIcon()}if(!this.firstChild&&!this.isHiddenRoot()){this.childrenRendered=false}}return b},insertBefore:function(c,a){if(!c.render){c=this.getLoader().createNode(c)}var b=Ext.tree.TreeNode.superclass.insertBefore.call(this,c,a);if(b&&a&&this.childrenRendered){c.render()}this.ui.updateExpandIcon();return b},setText:function(b){var a=this.text;this.text=this.attributes.text=b;if(this.rendered){this.ui.onTextChange(this,b,a)}this.fireEvent("textchange",this,b,a)},setIconCls:function(b){var a=this.attributes.iconCls;this.attributes.iconCls=b;if(this.rendered){this.ui.onIconClsChange(this,b,a)}},setTooltip:function(a,b){this.attributes.qtip=a;this.attributes.qtipTitle=b;if(this.rendered){this.ui.onTipChange(this,a,b)}},setIcon:function(a){this.attributes.icon=a;if(this.rendered){this.ui.onIconChange(this,a)}},setHref:function(a,b){this.attributes.href=a;this.attributes.hrefTarget=b;if(this.rendered){this.ui.onHrefChange(this,a,b)}},setCls:function(b){var a=this.attributes.cls;this.attributes.cls=b;if(this.rendered){this.ui.onClsChange(this,b,a)}},select:function(){var a=this.getOwnerTree();if(a){a.getSelectionModel().select(this)}},unselect:function(a){var b=this.getOwnerTree();if(b){b.getSelectionModel().unselect(this,a)}},isSelected:function(){var a=this.getOwnerTree();return a?a.getSelectionModel().isSelected(this):false},expand:function(a,c,d,b){if(!this.expanded){if(this.fireEvent("beforeexpand",this,a,c)===false){return}if(!this.childrenRendered){this.renderChildren()}this.expanded=true;if(!this.isHiddenRoot()&&(this.getOwnerTree().animate&&c!==false)||c){this.ui.animExpand(function(){this.fireEvent("expand",this);this.runCallback(d,b||this,[this]);if(a===true){this.expandChildNodes(true,true)}}.createDelegate(this));return}else{this.ui.expand();this.fireEvent("expand",this);this.runCallback(d,b||this,[this])}}else{this.runCallback(d,b||this,[this])}if(a===true){this.expandChildNodes(true)}},runCallback:function(a,c,b){if(Ext.isFunction(a)){a.apply(c,b)}},isHiddenRoot:function(){return this.isRoot&&!this.getOwnerTree().rootVisible},collapse:function(b,g,h,e){if(this.expanded&&!this.isHiddenRoot()){if(this.fireEvent("beforecollapse",this,b,g)===false){return}this.expanded=false;if((this.getOwnerTree().animate&&g!==false)||g){this.ui.animCollapse(function(){this.fireEvent("collapse",this);this.runCallback(h,e||this,[this]);if(b===true){this.collapseChildNodes(true)}}.createDelegate(this));return}else{this.ui.collapse();this.fireEvent("collapse",this);this.runCallback(h,e||this,[this])}}else{if(!this.expanded){this.runCallback(h,e||this,[this])}}if(b===true){var d=this.childNodes;for(var c=0,a=d.length;c<a;c++){d[c].collapse(true,false)}}},delayedExpand:function(a){if(!this.expandProcId){this.expandProcId=this.expand.defer(a,this)}},cancelExpand:function(){if(this.expandProcId){clearTimeout(this.expandProcId)}this.expandProcId=false},toggle:function(){if(this.expanded){this.collapse()}else{this.expand()}},ensureVisible:function(c,b){var a=this.getOwnerTree();a.expandPath(this.parentNode?this.parentNode.getPath():this.getPath(),false,function(){var d=a.getNodeById(this.id);a.getTreeEl().scrollChildIntoView(d.ui.anchor);this.runCallback(c,b||this,[this])}.createDelegate(this))},expandChildNodes:function(b,e){var d=this.childNodes,c,a=d.length;for(c=0;c<a;c++){d[c].expand(b,e)}},collapseChildNodes:function(b){var d=this.childNodes;for(var c=0,a=d.length;c<a;c++){d[c].collapse(b)}},disable:function(){this.disabled=true;this.unselect();if(this.rendered&&this.ui.onDisableChange){this.ui.onDisableChange(this,true)}this.fireEvent("disabledchange",this,true)},enable:function(){this.disabled=false;if(this.rendered&&this.ui.onDisableChange){this.ui.onDisableChange(this,false)}this.fireEvent("disabledchange",this,false)},renderChildren:function(b){if(b!==false){this.fireEvent("beforechildrenrendered",this)}var d=this.childNodes;for(var c=0,a=d.length;c<a;c++){d[c].render(true)}this.childrenRendered=true},sort:function(e,d){Ext.tree.TreeNode.superclass.sort.apply(this,arguments);if(this.childrenRendered){var c=this.childNodes;for(var b=0,a=c.length;b<a;b++){c[b].render(true)}}},render:function(a){this.ui.render(a);if(!this.rendered){this.getOwnerTree().registerNode(this);this.rendered=true;if(this.expanded){this.expanded=false;this.expand(false,false)}}},renderIndent:function(b,e){if(e){this.ui.childIndent=null}this.ui.renderIndent();if(b===true&&this.childrenRendered){var d=this.childNodes;for(var c=0,a=d.length;c<a;c++){d[c].renderIndent(true,e)}}},beginUpdate:function(){this.childrenRendered=false},endUpdate:function(){if(this.expanded&&this.rendered){this.renderChildren()}},destroy:function(a){if(a===true){this.unselect(true)}Ext.tree.TreeNode.superclass.destroy.call(this,a);Ext.destroy(this.ui,this.loader);this.ui=this.loader=null},onIdChange:function(a){this.ui.onIdChange(a)}});Ext.tree.TreePanel.nodeTypes.node=Ext.tree.TreeNode;Ext.tree.AsyncTreeNode=function(a){this.loaded=a&&a.loaded===true;this.loading=false;Ext.tree.AsyncTreeNode.superclass.constructor.apply(this,arguments);this.addEvents("beforeload","load")};Ext.extend(Ext.tree.AsyncTreeNode,Ext.tree.TreeNode,{expand:function(b,e,h,c){if(this.loading){var g;var d=function(){if(!this.loading){clearInterval(g);this.expand(b,e,h,c)}}.createDelegate(this);g=setInterval(d,200);return}if(!this.loaded){if(this.fireEvent("beforeload",this)===false){return}this.loading=true;this.ui.beforeLoad(this);var a=this.loader||this.attributes.loader||this.getOwnerTree().getLoader();if(a){a.load(this,this.loadComplete.createDelegate(this,[b,e,h,c]),this);return}}Ext.tree.AsyncTreeNode.superclass.expand.call(this,b,e,h,c)},isLoading:function(){return this.loading},loadComplete:function(a,c,d,b){this.loading=false;this.loaded=true;this.ui.afterLoad(this);this.fireEvent("load",this);this.expand(a,c,d,b)},isLoaded:function(){return this.loaded},hasChildNodes:function(){if(!this.isLeaf()&&!this.loaded){return true}else{return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this)}},reload:function(b,a){this.collapse(false,false);while(this.firstChild){this.removeChild(this.firstChild).destroy()}this.childrenRendered=false;this.loaded=false;if(this.isHiddenRoot()){this.expanded=false}this.expand(false,false,b,a)}});Ext.tree.TreePanel.nodeTypes.async=Ext.tree.AsyncTreeNode;Ext.tree.TreeNodeUI=Ext.extend(Object,{constructor:function(a){Ext.apply(this,{node:a,rendered:false,animating:false,wasLeaf:true,ecc:"x-tree-ec-icon x-tree-elbow",emptyIcon:Ext.BLANK_IMAGE_URL})},removeChild:function(a){if(this.rendered){this.ctNode.removeChild(a.ui.getEl())}},beforeLoad:function(){this.addClass("x-tree-node-loading")},afterLoad:function(){this.removeClass("x-tree-node-loading")},onTextChange:function(b,c,a){if(this.rendered){this.textNode.innerHTML=c}},onIconClsChange:function(c,a,b){if(this.rendered){Ext.fly(this.iconNode).replaceClass(b,a)}},onIconChange:function(b,a){if(this.rendered){var c=Ext.isEmpty(a);this.iconNode.src=c?this.emptyIcon:a;Ext.fly(this.iconNode)[c?"removeClass":"addClass"]("x-tree-node-inline-icon")}},onTipChange:function(b,c,d){if(this.rendered){var a=Ext.isDefined(d);if(this.textNode.setAttributeNS){this.textNode.setAttributeNS("ext","qtip",c);if(a){this.textNode.setAttributeNS("ext","qtitle",d)}}else{this.textNode.setAttribute("ext:qtip",c);if(a){this.textNode.setAttribute("ext:qtitle",d)}}}},onHrefChange:function(b,a,c){if(this.rendered){this.anchor.href=this.getHref(a);if(Ext.isDefined(c)){this.anchor.target=c}}},onClsChange:function(c,a,b){if(this.rendered){Ext.fly(this.elNode).replaceClass(b,a)}},onDisableChange:function(a,b){this.disabled=b;if(this.checkbox){this.checkbox.disabled=b}this[b?"addClass":"removeClass"]("x-tree-node-disabled")},onSelectedChange:function(a){if(a){this.focus();this.addClass("x-tree-selected")}else{this.removeClass("x-tree-selected")}},onMove:function(a,h,e,g,d,b){this.childIndent=null;if(this.rendered){var i=g.ui.getContainer();if(!i){this.holder=document.createElement("div");this.holder.appendChild(this.wrap);return}var c=b?b.ui.getEl():null;if(c){i.insertBefore(this.wrap,c)}else{i.appendChild(this.wrap)}this.node.renderIndent(true,e!=g)}},addClass:function(a){if(this.elNode){Ext.fly(this.elNode).addClass(a)}},removeClass:function(a){if(this.elNode){Ext.fly(this.elNode).removeClass(a)}},remove:function(){if(this.rendered){this.holder=document.createElement("div");this.holder.appendChild(this.wrap)}},fireEvent:function(){return this.node.fireEvent.apply(this.node,arguments)},initEvents:function(){this.node.on("move",this.onMove,this);if(this.node.disabled){this.onDisableChange(this.node,true)}if(this.node.hidden){this.hide()}var b=this.node.getOwnerTree();var a=b.enableDD||b.enableDrag||b.enableDrop;if(a&&(!this.node.isRoot||b.rootVisible)){Ext.dd.Registry.register(this.elNode,{node:this.node,handles:this.getDDHandles(),isHandle:false})}},getDDHandles:function(){return[this.iconNode,this.textNode,this.elNode]},hide:function(){this.node.hidden=true;if(this.wrap){this.wrap.style.display="none"}},show:function(){this.node.hidden=false;if(this.wrap){this.wrap.style.display=""}},onContextMenu:function(a){if(this.node.hasListener("contextmenu")||this.node.getOwnerTree().hasListener("contextmenu")){a.preventDefault();this.focus();this.fireEvent("contextmenu",this.node,a)}},onClick:function(c){if(this.dropping){c.stopEvent();return}if(this.fireEvent("beforeclick",this.node,c)!==false){var b=c.getTarget("a");if(!this.disabled&&this.node.attributes.href&&b){this.fireEvent("click",this.node,c);return}else{if(b&&c.ctrlKey){c.stopEvent()}}c.preventDefault();if(this.disabled){return}if(this.node.attributes.singleClickExpand&&!this.animating&&this.node.isExpandable()){this.node.toggle()}this.fireEvent("click",this.node,c)}else{c.stopEvent()}},onDblClick:function(a){a.preventDefault();if(this.disabled){return}if(this.fireEvent("beforedblclick",this.node,a)!==false){if(this.checkbox){this.toggleCheck()}if(!this.animating&&this.node.isExpandable()){this.node.toggle()}this.fireEvent("dblclick",this.node,a)}},onOver:function(a){this.addClass("x-tree-node-over")},onOut:function(a){this.removeClass("x-tree-node-over")},onCheckChange:function(){var a=this.checkbox.checked;this.checkbox.defaultChecked=a;this.node.attributes.checked=a;this.fireEvent("checkchange",this.node,a)},ecClick:function(a){if(!this.animating&&this.node.isExpandable()){this.node.toggle()}},startDrop:function(){this.dropping=true},endDrop:function(){setTimeout(function(){this.dropping=false}.createDelegate(this),50)},expand:function(){this.updateExpandIcon();this.ctNode.style.display=""},focus:function(){if(!this.node.preventHScroll){try{this.anchor.focus()}catch(c){}}else{try{var b=this.node.getOwnerTree().getTreeEl().dom;var a=b.scrollLeft;this.anchor.focus();b.scrollLeft=a}catch(c){}}},toggleCheck:function(b){var a=this.checkbox;if(a){a.checked=(b===undefined?!a.checked:b);this.onCheckChange()}},blur:function(){try{this.anchor.blur()}catch(a){}},animExpand:function(b){var a=Ext.get(this.ctNode);a.stopFx();if(!this.node.isExpandable()){this.updateExpandIcon();this.ctNode.style.display="";Ext.callback(b);return}this.animating=true;this.updateExpandIcon();a.slideIn("t",{callback:function(){this.animating=false;Ext.callback(b)},scope:this,duration:this.node.ownerTree.duration||0.25})},highlight:function(){var a=this.node.getOwnerTree();Ext.fly(this.wrap).highlight(a.hlColor||"C3DAF9",{endColor:a.hlBaseColor})},collapse:function(){this.updateExpandIcon();this.ctNode.style.display="none"},animCollapse:function(b){var a=Ext.get(this.ctNode);a.enableDisplayMode("block");a.stopFx();this.animating=true;this.updateExpandIcon();a.slideOut("t",{callback:function(){this.animating=false;Ext.callback(b)},scope:this,duration:this.node.ownerTree.duration||0.25})},getContainer:function(){return this.ctNode},getEl:function(){return this.wrap},appendDDGhost:function(a){a.appendChild(this.elNode.cloneNode(true))},getDDRepairXY:function(){return Ext.lib.Dom.getXY(this.iconNode)},onRender:function(){this.render()},render:function(c){var e=this.node,b=e.attributes;var d=e.parentNode?e.parentNode.ui.getContainer():e.ownerTree.innerCt.dom;if(!this.rendered){this.rendered=true;this.renderElements(e,b,d,c);if(b.qtip){this.onTipChange(e,b.qtip,b.qtipTitle)}else{if(b.qtipCfg){b.qtipCfg.target=Ext.id(this.textNode);Ext.QuickTips.register(b.qtipCfg)}}this.initEvents();if(!this.node.expanded){this.updateExpandIcon(true)}}else{if(c===true){d.appendChild(this.wrap)}}},renderElements:function(e,k,j,l){this.indentMarkup=e.parentNode?e.parentNode.ui.getChildIndent():"";var g=Ext.isBoolean(k.checked),b,c=this.getHref(k.href),d=['<li class="x-tree-node"><div ext:tree-node-id="',e.id,'" class="x-tree-node-el x-tree-node-leaf x-unselectable ',k.cls,'" unselectable="on">','<span class="x-tree-node-indent">',this.indentMarkup,"</span>",'<img alt="" src="',this.emptyIcon,'" class="x-tree-ec-icon x-tree-elbow" />','<img alt="" src="',k.icon||this.emptyIcon,'" class="x-tree-node-icon',(k.icon?" x-tree-node-inline-icon":""),(k.iconCls?" "+k.iconCls:""),'" unselectable="on" />',g?('<input class="x-tree-node-cb" type="checkbox" '+(k.checked?'checked="checked" />':"/>")):"",'<a hidefocus="on" class="x-tree-node-anchor" href="',c,'" tabIndex="1" ',k.hrefTarget?' target="'+k.hrefTarget+'"':"",'><span unselectable="on">',e.text,"</span></a></div>",'<ul class="x-tree-node-ct" style="display:none;"></ul>',"</li>"].join("");if(l!==true&&e.nextSibling&&(b=e.nextSibling.ui.getEl())){this.wrap=Ext.DomHelper.insertHtml("beforeBegin",b,d)}else{this.wrap=Ext.DomHelper.insertHtml("beforeEnd",j,d)}this.elNode=this.wrap.childNodes[0];this.ctNode=this.wrap.childNodes[1];var i=this.elNode.childNodes;this.indentNode=i[0];this.ecNode=i[1];this.iconNode=i[2];var h=3;if(g){this.checkbox=i[3];this.checkbox.defaultChecked=this.checkbox.checked;h++}this.anchor=i[h];this.textNode=i[h].firstChild},getHref:function(a){return Ext.isEmpty(a)?(Ext.isGecko?"":"#"):a},getAnchor:function(){return this.anchor},getTextEl:function(){return this.textNode},getIconEl:function(){return this.iconNode},isChecked:function(){return this.checkbox?this.checkbox.checked:false},updateExpandIcon:function(){if(this.rendered){var g=this.node,d,c,a=g.isLast()?"x-tree-elbow-end":"x-tree-elbow",e=g.hasChildNodes();if(e||g.attributes.expandable){if(g.expanded){a+="-minus";d="x-tree-node-collapsed";c="x-tree-node-expanded"}else{a+="-plus";d="x-tree-node-expanded";c="x-tree-node-collapsed"}if(this.wasLeaf){this.removeClass("x-tree-node-leaf");this.wasLeaf=false}if(this.c1!=d||this.c2!=c){Ext.fly(this.elNode).replaceClass(d,c);this.c1=d;this.c2=c}}else{if(!this.wasLeaf){Ext.fly(this.elNode).replaceClass("x-tree-node-expanded","x-tree-node-collapsed");delete this.c1;delete this.c2;this.wasLeaf=true}}var b="x-tree-ec-icon "+a;if(this.ecc!=b){this.ecNode.className=b;this.ecc=b}}},onIdChange:function(a){if(this.rendered){this.elNode.setAttribute("ext:tree-node-id",a)}},getChildIndent:function(){if(!this.childIndent){var a=[],b=this.node;while(b){if(!b.isRoot||(b.isRoot&&b.ownerTree.rootVisible)){if(!b.isLast()){a.unshift('<img alt="" src="'+this.emptyIcon+'" class="x-tree-elbow-line" />')}else{a.unshift('<img alt="" src="'+this.emptyIcon+'" class="x-tree-icon" />')}}b=b.parentNode}this.childIndent=a.join("")}return this.childIndent},renderIndent:function(){if(this.rendered){var a="",b=this.node.parentNode;if(b){a=b.ui.getChildIndent()}if(this.indentMarkup!=a){this.indentNode.innerHTML=a;this.indentMarkup=a}this.updateExpandIcon()}},destroy:function(){if(this.elNode){Ext.dd.Registry.unregister(this.elNode.id)}Ext.each(["textnode","anchor","checkbox","indentNode","ecNode","iconNode","elNode","ctNode","wrap","holder"],function(a){if(this[a]){Ext.fly(this[a]).remove();delete this[a]}},this);delete this.node}});Ext.tree.RootTreeNodeUI=Ext.extend(Ext.tree.TreeNodeUI,{render:function(){if(!this.rendered){var a=this.node.ownerTree.innerCt.dom;this.node.expanded=true;a.innerHTML='<div class="x-tree-root-node"></div>';this.wrap=this.ctNode=a.firstChild}},collapse:Ext.emptyFn,expand:Ext.emptyFn});Ext.tree.TreeLoader=function(a){this.baseParams={};Ext.apply(this,a);this.addEvents("beforeload","load","loadexception");Ext.tree.TreeLoader.superclass.constructor.call(this);if(Ext.isString(this.paramOrder)){this.paramOrder=this.paramOrder.split(/[\s,|]/)}};Ext.extend(Ext.tree.TreeLoader,Ext.util.Observable,{uiProviders:{},clearOnLoad:true,paramOrder:undefined,paramsAsHash:false,nodeParameter:"node",directFn:undefined,load:function(b,c,a){if(this.clearOnLoad){while(b.firstChild){b.removeChild(b.firstChild)}}if(this.doPreload(b)){this.runCallback(c,a||b,[b])}else{if(this.directFn||this.dataUrl||this.url){this.requestData(b,c,a||b)}}},doPreload:function(d){if(d.attributes.children){if(d.childNodes.length<1){var c=d.attributes.children;d.beginUpdate();for(var b=0,a=c.length;b<a;b++){var e=d.appendChild(this.createNode(c[b]));if(this.preloadChildren){this.doPreload(e)}}d.endUpdate()}return true}return false},getParams:function(g){var e=Ext.apply({},this.baseParams),h=this.nodeParameter,b=this.paramOrder;h&&(e[h]=g.id);if(this.directFn){var c=[g.id];if(b){if(h&&b.indexOf(h)>-1){c=[]}for(var d=0,a=b.length;d<a;d++){c.push(e[b[d]])}}else{if(this.paramsAsHash){c=[e]}}return c}else{return e}},requestData:function(c,d,b){if(this.fireEvent("beforeload",this,c,d)!==false){if(this.directFn){var a=this.getParams(c);a.push(this.processDirectResponse.createDelegate(this,[{callback:d,node:c,scope:b}],true));this.directFn.apply(window,a)}else{this.transId=Ext.Ajax.request({method:this.requestMethod,url:this.dataUrl||this.url,success:this.handleResponse,failure:this.handleFailure,scope:this,argument:{callback:d,node:c,scope:b},params:this.getParams(c)})}}else{this.runCallback(d,b||c,[])}},processDirectResponse:function(a,b,c){if(b.status){this.handleResponse({responseData:Ext.isArray(a)?a:null,responseText:a,argument:c})}else{this.handleFailure({argument:c})}},runCallback:function(a,c,b){if(Ext.isFunction(a)){a.apply(c,b)}},isLoading:function(){return !!this.transId},abort:function(){if(this.isLoading()){Ext.Ajax.abort(this.transId)}},createNode:function(attr){if(this.baseAttrs){Ext.applyIf(attr,this.baseAttrs)}if(this.applyLoader!==false&&!attr.loader){attr.loader=this}if(Ext.isString(attr.uiProvider)){attr.uiProvider=this.uiProviders[attr.uiProvider]||eval(attr.uiProvider)}if(attr.nodeType){return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr)}else{return attr.leaf?new Ext.tree.TreeNode(attr):new Ext.tree.AsyncTreeNode(attr)}},processResponse:function(d,c,k,l){var m=d.responseText;try{var a=d.responseData||Ext.decode(m);c.beginUpdate();for(var g=0,h=a.length;g<h;g++){var b=this.createNode(a[g]);if(b){c.appendChild(b)}}c.endUpdate();this.runCallback(k,l||c,[c])}catch(j){this.handleFailure(d)}},handleResponse:function(c){this.transId=false;var b=c.argument;this.processResponse(c,b.node,b.callback,b.scope);this.fireEvent("load",this,b.node,c)},handleFailure:function(c){this.transId=false;var b=c.argument;this.fireEvent("loadexception",this,b.node,c);this.runCallback(b.callback,b.scope||b.node,[b.node])},destroy:function(){this.abort();this.purgeListeners()}});Ext.tree.TreeFilter=function(a,b){this.tree=a;this.filtered={};Ext.apply(this,b)};Ext.tree.TreeFilter.prototype={clearBlank:false,reverse:false,autoClear:false,remove:false,filter:function(d,a,b){a=a||"text";var c;if(typeof d=="string"){var e=d.length;if(e==0&&this.clearBlank){this.clear();return}d=d.toLowerCase();c=function(g){return g.attributes[a].substr(0,e).toLowerCase()==d}}else{if(d.exec){c=function(g){return d.test(g.attributes[a])}}else{throw"Illegal filter type, must be string or regex"}}this.filterBy(c,null,b)},filterBy:function(d,c,b){b=b||this.tree.root;if(this.autoClear){this.clear()}var a=this.filtered,i=this.reverse;var e=function(k){if(k==b){return true}if(a[k.id]){return false}var j=d.call(c||k,k);if(!j||i){a[k.id]=k;k.ui.hide();return false}return true};b.cascade(e);if(this.remove){for(var h in a){if(typeof h!="function"){var g=a[h];if(g&&g.parentNode){g.parentNode.removeChild(g)}}}}},clear:function(){var b=this.tree;var a=this.filtered;for(var d in a){if(typeof d!="function"){var c=a[d];if(c){c.ui.show()}}}this.filtered={}}};Ext.tree.TreeSorter=Ext.extend(Object,{constructor:function(a,c){Ext.apply(this,c);a.on({scope:this,beforechildrenrendered:this.doSort,append:this.updateSort,insert:this.updateSort,textchange:this.updateSortParent});var e=this.dir&&this.dir.toLowerCase()=="desc",i=this.property||"text",d=this.sortType,h=this.folderSort,b=this.caseSensitive===true,g=this.leafAttr||"leaf";if(Ext.isString(d)){d=Ext.data.SortTypes[d]}this.sortFn=function(o,m){var k=o.attributes,j=m.attributes;if(h){if(k[g]&&!j[g]){return 1}if(!k[g]&&j[g]){return -1}}var n=k[i],l=j[i],q=d?d(n,o):(b?n:n.toUpperCase()),p=d?d(l,m):(b?l:l.toUpperCase());if(q<p){return e?1:-1}else{if(q>p){return e?-1:1}}return 0}},doSort:function(a){a.sort(this.sortFn)},updateSort:function(a,b){if(b.childrenRendered){this.doSort.defer(1,this,[b])}},updateSortParent:function(a){var b=a.parentNode;if(b&&b.childrenRendered){this.doSort.defer(1,this,[b])}}});if(Ext.dd.DropZone){Ext.tree.TreeDropZone=function(a,b){this.allowParentInsert=b.allowParentInsert||false;this.allowContainerDrop=b.allowContainerDrop||false;this.appendOnly=b.appendOnly||false;Ext.tree.TreeDropZone.superclass.constructor.call(this,a.getTreeEl(),b);this.tree=a;this.dragOverData={};this.lastInsertClass="x-tree-no-status"};Ext.extend(Ext.tree.TreeDropZone,Ext.dd.DropZone,{ddGroup:"TreeDD",expandDelay:1000,expandNode:function(a){if(a.hasChildNodes()&&!a.isExpanded()){a.expand(false,null,this.triggerCacheRefresh.createDelegate(this))}},queueExpand:function(a){this.expandProcId=this.expandNode.defer(this.expandDelay,this,[a])},cancelExpand:function(){if(this.expandProcId){clearTimeout(this.expandProcId);this.expandProcId=false}},isValidDropPoint:function(a,k,i,d,c){if(!a||!c){return false}var g=a.node;var h=c.node;if(!(g&&g.isTarget&&k)){return false}if(k=="append"&&g.allowChildren===false){return false}if((k=="above"||k=="below")&&(g.parentNode&&g.parentNode.allowChildren===false)){return false}if(h&&(g==h||h.contains(g))){return false}var b=this.dragOverData;b.tree=this.tree;b.target=g;b.data=c;b.point=k;b.source=i;b.rawEvent=d;b.dropNode=h;b.cancel=false;var j=this.tree.fireEvent("nodedragover",b);return b.cancel===false&&j!==false},getDropPoint:function(h,g,l){var m=g.node;if(m.isRoot){return m.allowChildren!==false?"append":false}var c=g.ddel;var o=Ext.lib.Dom.getY(c),j=o+c.offsetHeight;var i=Ext.lib.Event.getPageY(h);var k=m.allowChildren===false||m.isLeaf();if(this.appendOnly||m.parentNode.allowChildren===false){return k?false:"append"}var d=false;if(!this.allowParentInsert){d=m.hasChildNodes()&&m.isExpanded()}var a=(j-o)/(k?2:3);if(i>=o&&i<(o+a)){return"above"}else{if(!d&&(k||i>=j-a&&i<=j)){return"below"}else{return"append"}}},onNodeEnter:function(d,a,c,b){this.cancelExpand()},onContainerOver:function(a,c,b){if(this.allowContainerDrop&&this.isValidDropPoint({ddel:this.tree.getRootNode().ui.elNode,node:this.tree.getRootNode()},"append",a,c,b)){return this.dropAllowed}return this.dropNotAllowed},onNodeOver:function(b,i,h,g){var k=this.getDropPoint(h,b,i);var c=b.node;if(!this.expandProcId&&k=="append"&&c.hasChildNodes()&&!b.node.isExpanded()){this.queueExpand(c)}else{if(k!="append"){this.cancelExpand()}}var d=this.dropNotAllowed;if(this.isValidDropPoint(b,k,i,h,g)){if(k){var a=b.ddel;var j;if(k=="above"){d=b.node.isFirst()?"x-tree-drop-ok-above":"x-tree-drop-ok-between";j="x-tree-drag-insert-above"}else{if(k=="below"){d=b.node.isLast()?"x-tree-drop-ok-below":"x-tree-drop-ok-between";j="x-tree-drag-insert-below"}else{d="x-tree-drop-ok-append";j="x-tree-drag-append"}}if(this.lastInsertClass!=j){Ext.fly(a).replaceClass(this.lastInsertClass,j);this.lastInsertClass=j}}}return d},onNodeOut:function(d,a,c,b){this.cancelExpand();this.removeDropIndicators(d)},onNodeDrop:function(i,b,h,d){var a=this.getDropPoint(h,i,b);var g=i.node;g.ui.startDrop();if(!this.isValidDropPoint(i,a,b,h,d)){g.ui.endDrop();return false}var c=d.node||(b.getTreeNode?b.getTreeNode(d,g,a,h):null);return this.processDrop(g,d,a,b,h,c)},onContainerDrop:function(a,g,c){if(this.allowContainerDrop&&this.isValidDropPoint({ddel:this.tree.getRootNode().ui.elNode,node:this.tree.getRootNode()},"append",a,g,c)){var d=this.tree.getRootNode();d.ui.startDrop();var b=c.node||(a.getTreeNode?a.getTreeNode(c,d,"append",g):null);return this.processDrop(d,c,"append",a,g,b)}return false},processDrop:function(j,h,b,a,i,d){var g={tree:this.tree,target:j,data:h,point:b,source:a,rawEvent:i,dropNode:d,cancel:!d,dropStatus:false};var c=this.tree.fireEvent("beforenodedrop",g);if(c===false||g.cancel===true||!g.dropNode){j.ui.endDrop();return g.dropStatus}j=g.target;if(b=="append"&&!j.isExpanded()){j.expand(false,null,function(){this.completeDrop(g)}.createDelegate(this))}else{this.completeDrop(g)}return true},completeDrop:function(h){var d=h.dropNode,e=h.point,c=h.target;if(!Ext.isArray(d)){d=[d]}var g;for(var b=0,a=d.length;b<a;b++){g=d[b];if(e=="above"){c.parentNode.insertBefore(g,c)}else{if(e=="below"){c.parentNode.insertBefore(g,c.nextSibling)}else{c.appendChild(g)}}}g.ui.focus();if(Ext.enableFx&&this.tree.hlDrop){g.ui.highlight()}c.ui.endDrop();this.tree.fireEvent("nodedrop",h)},afterNodeMoved:function(a,c,g,d,b){if(Ext.enableFx&&this.tree.hlDrop){b.ui.focus();b.ui.highlight()}this.tree.fireEvent("nodedrop",this.tree,d,c,a,g)},getTree:function(){return this.tree},removeDropIndicators:function(b){if(b&&b.ddel){var a=b.ddel;Ext.fly(a).removeClass(["x-tree-drag-insert-above","x-tree-drag-insert-below","x-tree-drag-append"]);this.lastInsertClass="_noclass"}},beforeDragDrop:function(b,a,c){this.cancelExpand();return true},afterRepair:function(a){if(a&&Ext.enableFx){a.node.ui.highlight()}this.hideProxy()}})}if(Ext.dd.DragZone){Ext.tree.TreeDragZone=function(a,b){Ext.tree.TreeDragZone.superclass.constructor.call(this,a.innerCt,b);this.tree=a};Ext.extend(Ext.tree.TreeDragZone,Ext.dd.DragZone,{ddGroup:"TreeDD",onBeforeDrag:function(a,b){var c=a.node;return c&&c.draggable&&!c.disabled},onInitDrag:function(b){var a=this.dragData;this.tree.getSelectionModel().select(a.node);this.tree.eventModel.disable();this.proxy.update("");a.node.ui.appendDDGhost(this.proxy.ghost.dom);this.tree.fireEvent("startdrag",this.tree,a.node,b)},getRepairXY:function(b,a){return a.node.ui.getDDRepairXY()},onEndDrag:function(a,b){this.tree.eventModel.enable.defer(100,this.tree.eventModel);this.tree.fireEvent("enddrag",this.tree,a.node,b)},onValidDrop:function(a,b,c){this.tree.fireEvent("dragdrop",this.tree,this.dragData.node,a,b);this.hideProxy()},beforeInvalidDrop:function(a,c){var b=this.tree.getSelectionModel();b.clearSelections();b.select(this.dragData.node)},afterRepair:function(){if(Ext.enableFx&&this.tree.hlDrop){Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor||"c3daf9")}this.dragging=false}})}Ext.tree.TreeEditor=function(a,c,b){c=c||{};var d=c.events?c:new Ext.form.TextField(c);Ext.tree.TreeEditor.superclass.constructor.call(this,d,b);this.tree=a;if(!a.rendered){a.on("render",this.initEditor,this)}else{this.initEditor(a)}};Ext.extend(Ext.tree.TreeEditor,Ext.Editor,{alignment:"l-l",autoSize:false,hideEl:false,cls:"x-small-editor x-tree-editor",shim:false,shadow:"frame",maxWidth:250,editDelay:350,initEditor:function(a){a.on({scope:this,beforeclick:this.beforeNodeClick,dblclick:this.onNodeDblClick});this.on({scope:this,complete:this.updateNode,beforestartedit:this.fitToTree,specialkey:this.onSpecialKey});this.on("startedit",this.bindScroll,this,{delay:10})},fitToTree:function(b,c){var e=this.tree.getTreeEl().dom,d=c.dom;if(e.scrollLeft>d.offsetLeft){e.scrollLeft=d.offsetLeft}var a=Math.min(this.maxWidth,(e.clientWidth>20?e.clientWidth:e.offsetWidth)-Math.max(0,d.offsetLeft-e.scrollLeft)-5);this.setSize(a,"")},triggerEdit:function(a,c){this.completeEdit();if(a.attributes.editable!==false){this.editNode=a;if(this.tree.autoScroll){Ext.fly(a.ui.getEl()).scrollIntoView(this.tree.body)}var b=a.text||"";if(!Ext.isGecko&&Ext.isEmpty(a.text)){a.setText("&#160;")}this.autoEditTimer=this.startEdit.defer(this.editDelay,this,[a.ui.textNode,b]);return false}},bindScroll:function(){this.tree.getTreeEl().on("scroll",this.cancelEdit,this)},beforeNodeClick:function(a,b){clearTimeout(this.autoEditTimer);if(this.tree.getSelectionModel().isSelected(a)){b.stopEvent();return this.triggerEdit(a)}},onNodeDblClick:function(a,b){clearTimeout(this.autoEditTimer)},updateNode:function(a,b){this.tree.getTreeEl().un("scroll",this.cancelEdit,this);this.editNode.setText(b)},onHide:function(){Ext.tree.TreeEditor.superclass.onHide.call(this);if(this.editNode){this.editNode.ui.focus.defer(50,this.editNode.ui)}},onSpecialKey:function(c,b){var a=b.getKey();if(a==b.ESC){b.stopEvent();this.cancelEdit()}else{if(a==b.ENTER&&!b.hasModifier()){b.stopEvent();this.completeEdit()}}},onDestroy:function(){clearTimeout(this.autoEditTimer);Ext.tree.TreeEditor.superclass.onDestroy.call(this);var a=this.tree;a.un("beforeclick",this.beforeNodeClick,this);a.un("dblclick",this.onNodeDblClick,this)}});var swfobject=function(){var E="undefined",s="object",T="Shockwave Flash",X="ShockwaveFlash.ShockwaveFlash",r="application/x-shockwave-flash",S="SWFObjectExprInst",y="onreadystatechange",P=window,k=document,u=navigator,U=false,V=[i],p=[],O=[],J=[],m,R,F,C,K=false,a=false,o,H,n=true,N=function(){var ab=typeof k.getElementById!=E&&typeof k.getElementsByTagName!=E&&typeof k.createElement!=E,ai=u.userAgent.toLowerCase(),Z=u.platform.toLowerCase(),af=Z?(/win/).test(Z):/win/.test(ai),ad=Z?(/mac/).test(Z):/mac/.test(ai),ag=/webkit/.test(ai)?parseFloat(ai.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,Y=!+"\v1",ah=[0,0,0],ac=null;if(typeof u.plugins!=E&&typeof u.plugins[T]==s){ac=u.plugins[T].description;if(ac&&!(typeof u.mimeTypes!=E&&u.mimeTypes[r]&&!u.mimeTypes[r].enabledPlugin)){U=true;Y=false;ac=ac.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ah[0]=parseInt(ac.replace(/^(.*)\..*$/,"$1"),10);ah[1]=parseInt(ac.replace(/^.*\.(.*)\s.*$/,"$1"),10);ah[2]=/[a-zA-Z]/.test(ac)?parseInt(ac.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof P.ActiveXObject!=E){try{var ae=new ActiveXObject(X);if(ae){ac=ae.GetVariable("$version");if(ac){Y=true;ac=ac.split(" ")[1].split(",");ah=[parseInt(ac[0],10),parseInt(ac[1],10),parseInt(ac[2],10)]}}}catch(aa){}}}return{w3:ab,pv:ah,wk:ag,ie:Y,win:af,mac:ad}}(),l=function(){if(!N.w3){return}if((typeof k.readyState!=E&&k.readyState=="complete")||(typeof k.readyState==E&&(k.getElementsByTagName("body")[0]||k.body))){g()}if(!K){if(typeof k.addEventListener!=E){k.addEventListener("DOMContentLoaded",g,false)}if(N.ie&&N.win){k.attachEvent(y,function(){if(k.readyState=="complete"){k.detachEvent(y,arguments.callee);g()}});if(P==top){(function(){if(K){return}try{k.documentElement.doScroll("left")}catch(Y){setTimeout(arguments.callee,0);return}g()})()}}if(N.wk){(function(){if(K){return}if(!(/loaded|complete/).test(k.readyState)){setTimeout(arguments.callee,0);return}g()})()}t(g)}}();function g(){if(K){return}try{var aa=k.getElementsByTagName("body")[0].appendChild(D("span"));aa.parentNode.removeChild(aa)}catch(ab){return}K=true;var Y=V.length;for(var Z=0;Z<Y;Z++){V[Z]()}}function L(Y){if(K){Y()}else{V[V.length]=Y}}function t(Z){if(typeof P.addEventListener!=E){P.addEventListener("load",Z,false)}else{if(typeof k.addEventListener!=E){k.addEventListener("load",Z,false)}else{if(typeof P.attachEvent!=E){j(P,"onload",Z)}else{if(typeof P.onload=="function"){var Y=P.onload;P.onload=function(){Y();Z()}}else{P.onload=Z}}}}}function i(){I()}function W(){var Y=k.getElementsByTagName("body")[0];var ab=D(s);ab.setAttribute("type",r);var aa=Y.appendChild(ab);if(aa){var Z=0;(function(){if(typeof aa.GetVariable!=E){var ac=aa.GetVariable("$version");if(ac){ac=ac.split(" ")[1].split(",");N.pv=[parseInt(ac[0],10),parseInt(ac[1],10),parseInt(ac[2],10)]}}else{if(Z<10){Z++;setTimeout(arguments.callee,10);return}}Y.removeChild(ab);aa=null;I()})()}else{I()}}function I(){var ah=p.length;if(ah>0){for(var ag=0;ag<ah;ag++){var Z=p[ag].id;var ac=p[ag].callbackFn;var ab={success:false,id:Z};if(N.pv[0]>0){var af=c(Z);if(af){if(G(p[ag].swfVersion)&&!(N.wk&&N.wk<312)){x(Z,true);if(ac){ab.success=true;ab.ref=A(Z);ac(ab)}}else{if(p[ag].expressInstall&&B()){var aj={};aj.data=p[ag].expressInstall;aj.width=af.getAttribute("width")||"0";aj.height=af.getAttribute("height")||"0";if(af.getAttribute("class")){aj.styleclass=af.getAttribute("class")}if(af.getAttribute("align")){aj.align=af.getAttribute("align")}var ai={};var Y=af.getElementsByTagName("param");var ad=Y.length;for(var ae=0;ae<ad;ae++){if(Y[ae].getAttribute("name").toLowerCase()!="movie"){ai[Y[ae].getAttribute("name")]=Y[ae].getAttribute("value")}}Q(aj,ai,Z,ac)}else{q(af);if(ac){ac(ab)}}}}}else{x(Z,true);if(ac){var aa=A(Z);if(aa&&typeof aa.SetVariable!=E){ab.success=true;ab.ref=aa}ac(ab)}}}}}function A(ab){var Y=null;var Z=c(ab);if(Z&&Z.nodeName=="OBJECT"){if(typeof Z.SetVariable!=E){Y=Z}else{var aa=Z.getElementsByTagName(s)[0];if(aa){Y=aa}}}return Y}function B(){return !a&&G("6.0.65")&&(N.win||N.mac)&&!(N.wk&&N.wk<312)}function Q(ab,ac,Y,aa){a=true;F=aa||null;C={success:false,id:Y};var af=c(Y);if(af){if(af.nodeName=="OBJECT"){m=h(af);R=null}else{m=af;R=Y}ab.id=S;if(typeof ab.width==E||(!(/%$/).test(ab.width)&&parseInt(ab.width,10)<310)){ab.width="310"}if(typeof ab.height==E||(!(/%$/).test(ab.height)&&parseInt(ab.height,10)<137)){ab.height="137"}k.title=k.title.slice(0,47)+" - Flash Player Installation";var ae=N.ie&&N.win?"ActiveX":"PlugIn",ad="MMredirectURL="+P.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ae+"&MMdoctitle="+k.title;if(typeof ac.flashvars!=E){ac.flashvars+="&"+ad}else{ac.flashvars=ad}if(N.ie&&N.win&&af.readyState!=4){var Z=D("div");Y+="SWFObjectNew";Z.setAttribute("id",Y);af.parentNode.insertBefore(Z,af);af.style.display="none";(function(){if(af.readyState==4){af.parentNode.removeChild(af)}else{setTimeout(arguments.callee,10)}})()}v(ab,ac,Y)}}function q(Z){if(N.ie&&N.win&&Z.readyState!=4){var Y=D("div");Z.parentNode.insertBefore(Y,Z);Y.parentNode.replaceChild(h(Z),Y);Z.style.display="none";(function(){if(Z.readyState==4){Z.parentNode.removeChild(Z)}else{setTimeout(arguments.callee,10)}})()}else{Z.parentNode.replaceChild(h(Z),Z)}}function h(ad){var ab=D("div");if(N.win&&N.ie){ab.innerHTML=ad.innerHTML}else{var Z=ad.getElementsByTagName(s)[0];if(Z){var ae=Z.childNodes;if(ae){var Y=ae.length;for(var aa=0;aa<Y;aa++){if(!(ae[aa].nodeType==1&&ae[aa].nodeName=="PARAM")&&!(ae[aa].nodeType==8)){ab.appendChild(ae[aa].cloneNode(true))}}}}}return ab}function v(aj,ah,Z){var Y,ab=c(Z);if(N.wk&&N.wk<312){return Y}if(ab){if(typeof aj.id==E){aj.id=Z}if(N.ie&&N.win){var ai="";for(var af in aj){if(aj[af]!=Object.prototype[af]){if(af.toLowerCase()=="data"){ah.movie=aj[af]}else{if(af.toLowerCase()=="styleclass"){ai+=' class="'+aj[af]+'"'}else{if(af.toLowerCase()!="classid"){ai+=" "+af+'="'+aj[af]+'"'}}}}}var ag="";for(var ae in ah){if(ah[ae]!=Object.prototype[ae]){ag+='<param name="'+ae+'" value="'+ah[ae]+'" />'}}ab.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ai+">"+ag+"</object>";O[O.length]=aj.id;Y=c(aj.id)}else{var aa=D(s);aa.setAttribute("type",r);for(var ad in aj){if(aj[ad]!=Object.prototype[ad]){if(ad.toLowerCase()=="styleclass"){aa.setAttribute("class",aj[ad])}else{if(ad.toLowerCase()!="classid"){aa.setAttribute(ad,aj[ad])}}}}for(var ac in ah){if(ah[ac]!=Object.prototype[ac]&&ac.toLowerCase()!="movie"){e(aa,ac,ah[ac])}}ab.parentNode.replaceChild(aa,ab);Y=aa}}return Y}function e(aa,Y,Z){var ab=D("param");ab.setAttribute("name",Y);ab.setAttribute("value",Z);aa.appendChild(ab)}function z(Z){var Y=c(Z);if(Y&&Y.nodeName=="OBJECT"){if(N.ie&&N.win){Y.style.display="none";(function(){if(Y.readyState==4){b(Z)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.removeChild(Y)}}}function b(aa){var Z=c(aa);if(Z){for(var Y in Z){if(typeof Z[Y]=="function"){Z[Y]=null}}Z.parentNode.removeChild(Z)}}function c(aa){var Y=null;try{Y=k.getElementById(aa)}catch(Z){}return Y}function D(Y){return k.createElement(Y)}function j(aa,Y,Z){aa.attachEvent(Y,Z);J[J.length]=[aa,Y,Z]}function G(aa){var Z=N.pv,Y=aa.split(".");Y[0]=parseInt(Y[0],10);Y[1]=parseInt(Y[1],10)||0;Y[2]=parseInt(Y[2],10)||0;return(Z[0]>Y[0]||(Z[0]==Y[0]&&Z[1]>Y[1])||(Z[0]==Y[0]&&Z[1]==Y[1]&&Z[2]>=Y[2]))?true:false}function w(ad,Z,ae,ac){if(N.ie&&N.mac){return}var ab=k.getElementsByTagName("head")[0];if(!ab){return}var Y=(ae&&typeof ae=="string")?ae:"screen";if(ac){o=null;H=null}if(!o||H!=Y){var aa=D("style");aa.setAttribute("type","text/css");aa.setAttribute("media",Y);o=ab.appendChild(aa);if(N.ie&&N.win&&typeof k.styleSheets!=E&&k.styleSheets.length>0){o=k.styleSheets[k.styleSheets.length-1]}H=Y}if(N.ie&&N.win){if(o&&typeof o.addRule==s){o.addRule(ad,Z)}}else{if(o&&typeof k.createTextNode!=E){o.appendChild(k.createTextNode(ad+" {"+Z+"}"))}}}function x(aa,Y){if(!n){return}var Z=Y?"visible":"hidden";if(K&&c(aa)){c(aa).style.visibility=Z}else{w("#"+aa,"visibility:"+Z)}}function M(Z){var aa=/[\\\"<>\.;]/;var Y=aa.exec(Z)!=null;return Y&&typeof encodeURIComponent!=E?encodeURIComponent(Z):Z}var d=function(){if(N.ie&&N.win){window.attachEvent("onunload",function(){var ad=J.length;for(var ac=0;ac<ad;ac++){J[ac][0].detachEvent(J[ac][1],J[ac][2])}var aa=O.length;for(var ab=0;ab<aa;ab++){z(O[ab])}for(var Z in N){N[Z]=null}N=null;for(var Y in swfobject){swfobject[Y]=null}swfobject=null;window.detachEvent("onunload",arguments.callee)})}}();return{registerObject:function(ac,Y,ab,aa){if(N.w3&&ac&&Y){var Z={};Z.id=ac;Z.swfVersion=Y;Z.expressInstall=ab;Z.callbackFn=aa;p[p.length]=Z;x(ac,false)}else{if(aa){aa({success:false,id:ac})}}},getObjectById:function(Y){if(N.w3){return A(Y)}},embedSWF:function(ac,ai,af,ah,Z,ab,aa,ae,ag,ad){var Y={success:false,id:ai};if(N.w3&&!(N.wk&&N.wk<312)&&ac&&ai&&af&&ah&&Z){x(ai,false);L(function(){af+="";ah+="";var ak={};if(ag&&typeof ag===s){for(var am in ag){ak[am]=ag[am]}}ak.data=ac;ak.width=af;ak.height=ah;var an={};if(ae&&typeof ae===s){for(var al in ae){an[al]=ae[al]}}if(aa&&typeof aa===s){for(var aj in aa){if(typeof an.flashvars!=E){an.flashvars+="&"+aj+"="+aa[aj]}else{an.flashvars=aj+"="+aa[aj]}}}if(G(Z)){var ao=v(ak,an,ai);if(ak.id==ai){x(ai,true)}Y.success=true;Y.ref=ao}else{if(ab&&B()){ak.data=ab;Q(ak,an,ai,ad);return}else{x(ai,true)}}if(ad){ad(Y)}})}else{if(ad){ad(Y)}}},switchOffAutoHideShow:function(){n=false},ua:N,getFlashPlayerVersion:function(){return{major:N.pv[0],minor:N.pv[1],release:N.pv[2]}},hasFlashPlayerVersion:G,createSWF:function(aa,Z,Y){if(N.w3){return v(aa,Z,Y)}else{return undefined}},showExpressInstall:function(aa,ab,Y,Z){if(N.w3&&B()){Q(aa,ab,Y,Z)}},removeSWF:function(Y){if(N.w3){z(Y)}},createCSS:function(ab,aa,Z,Y){if(N.w3){w(ab,aa,Z,Y)}},addDomLoadEvent:L,addLoadEvent:t,getQueryParamValue:function(ab){var aa=k.location.search||k.location.hash;if(aa){if(/\?/.test(aa)){aa=aa.split("?")[1]}if(ab==null){return M(aa)}var Z=aa.split("&");for(var Y=0;Y<Z.length;Y++){if(Z[Y].substring(0,Z[Y].indexOf("="))==ab){return M(Z[Y].substring((Z[Y].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var Y=c(S);if(Y&&m){Y.parentNode.replaceChild(m,Y);if(R){x(R,true);if(N.ie&&N.win){m.style.display="block"}}if(F){F(C)}}a=false}}}}();Ext.FlashComponent=Ext.extend(Ext.BoxComponent,{flashVersion:"9.0.115",backgroundColor:"#ffffff",wmode:"opaque",flashVars:undefined,flashParams:undefined,url:undefined,swfId:undefined,swfWidth:"100%",swfHeight:"100%",expressInstall:false,initComponent:function(){Ext.FlashComponent.superclass.initComponent.call(this);this.addEvents("initialize")},onRender:function(){Ext.FlashComponent.superclass.onRender.apply(this,arguments);var b=Ext.apply({allowScriptAccess:"always",bgcolor:this.backgroundColor,wmode:this.wmode},this.flashParams),a=Ext.apply({allowedDomain:document.location.hostname,YUISwfId:this.getId(),YUIBridgeCallback:"Ext.FlashEventProxy.onEvent"},this.flashVars);new swfobject.embedSWF(this.url,this.id,this.swfWidth,this.swfHeight,this.flashVersion,this.expressInstall?Ext.FlashComponent.EXPRESS_INSTALL_URL:undefined,a,b);this.swf=Ext.getDom(this.id);this.el=Ext.get(this.swf)},getSwfId:function(){return this.swfId||(this.swfId="extswf"+(++Ext.Component.AUTO_ID))},getId:function(){return this.id||(this.id="extflashcmp"+(++Ext.Component.AUTO_ID))},onFlashEvent:function(a){switch(a.type){case"swfReady":this.initSwf();return;case"log":return}a.component=this;this.fireEvent(a.type.toLowerCase().replace(/event$/,""),a)},initSwf:function(){this.onSwfReady(!!this.isInitialized);this.isInitialized=true;this.fireEvent("initialize",this)},beforeDestroy:function(){if(this.rendered){swfobject.removeSWF(this.swf.id)}Ext.FlashComponent.superclass.beforeDestroy.call(this)},onSwfReady:Ext.emptyFn});Ext.FlashComponent.EXPRESS_INSTALL_URL="http://swfobject.googlecode.com/svn/trunk/swfobject/expressInstall.swf";Ext.reg("flash",Ext.FlashComponent);Ext.FlashEventProxy={onEvent:function(c,b){var a=Ext.getCmp(c);if(a){a.onFlashEvent(b)}else{arguments.callee.defer(10,this,[c,b])}}};Ext.chart.Chart=Ext.extend(Ext.FlashComponent,{refreshBuffer:100,chartStyle:{padding:10,animationEnabled:true,font:{name:"Tahoma",color:4473924,size:11},dataTip:{padding:5,border:{color:10075112,size:1},background:{color:14346230,alpha:0.9},font:{name:"Tahoma",color:1393291,size:10,bold:true}}},extraStyle:null,seriesStyles:null,disableCaching:Ext.isIE||Ext.isOpera,disableCacheParam:"_dc",initComponent:function(){Ext.chart.Chart.superclass.initComponent.call(this);if(!this.url){this.url=Ext.chart.Chart.CHART_URL}if(this.disableCaching){this.url=Ext.urlAppend(this.url,String.format("{0}={1}",this.disableCacheParam,new Date().getTime()))}this.addEvents("itemmouseover","itemmouseout","itemclick","itemdoubleclick","itemdragstart","itemdrag","itemdragend","beforerefresh","refresh");this.store=Ext.StoreMgr.lookup(this.store)},setStyle:function(a,b){this.swf.setStyle(a,Ext.encode(b))},setStyles:function(a){this.swf.setStyles(Ext.encode(a))},setSeriesStyles:function(b){this.seriesStyles=b;var a=[];Ext.each(b,function(c){a.push(Ext.encode(c))});this.swf.setSeriesStyles(a)},setCategoryNames:function(a){this.swf.setCategoryNames(a)},setLegendRenderer:function(c,b){var a=this;b=b||a;a.removeFnProxy(a.legendFnName);a.legendFnName=a.createFnProxy(function(d){return c.call(b,d)});a.swf.setLegendLabelFunction(a.legendFnName)},setTipRenderer:function(c,b){var a=this;b=b||a;a.removeFnProxy(a.tipFnName);a.tipFnName=a.createFnProxy(function(h,e,g){var d=a.store.getAt(e);return c.call(b,a,d,e,g)});a.swf.setDataTipFunction(a.tipFnName)},setSeries:function(a){this.series=a;this.refresh()},bindStore:function(a,b){if(!b&&this.store){if(a!==this.store&&this.store.autoDestroy){this.store.destroy()}else{this.store.un("datachanged",this.refresh,this);this.store.un("add",this.delayRefresh,this);this.store.un("remove",this.delayRefresh,this);this.store.un("update",this.delayRefresh,this);this.store.un("clear",this.refresh,this)}}if(a){a=Ext.StoreMgr.lookup(a);a.on({scope:this,datachanged:this.refresh,add:this.delayRefresh,remove:this.delayRefresh,update:this.delayRefresh,clear:this.refresh})}this.store=a;if(a&&!b){this.refresh()}},onSwfReady:function(b){Ext.chart.Chart.superclass.onSwfReady.call(this,b);var a;this.swf.setType(this.type);if(this.chartStyle){this.setStyles(Ext.apply({},this.extraStyle,this.chartStyle))}if(this.categoryNames){this.setCategoryNames(this.categoryNames)}if(this.tipRenderer){a=this.getFunctionRef(this.tipRenderer);this.setTipRenderer(a.fn,a.scope)}if(this.legendRenderer){a=this.getFunctionRef(this.legendRenderer);this.setLegendRenderer(a.fn,a.scope)}if(!b){this.bindStore(this.store,true)}this.refresh.defer(10,this)},delayRefresh:function(){if(!this.refreshTask){this.refreshTask=new Ext.util.DelayedTask(this.refresh,this)}this.refreshTask.delay(this.refreshBuffer)},refresh:function(){if(this.fireEvent("beforerefresh",this)!==false){var m=false;var k=[],c=this.store.data.items;for(var g=0,l=c.length;g<l;g++){k[g]=c[g].data}var e=[];var d=0;var n=null;var h=0;if(this.series){d=this.series.length;for(h=0;h<d;h++){n=this.series[h];var b={};for(var a in n){if(a=="style"&&n.style!==null){b.style=Ext.encode(n.style);m=true}else{b[a]=n[a]}}e.push(b)}}if(d>0){for(h=0;h<d;h++){n=e[h];if(!n.type){n.type=this.type}n.dataProvider=k}}else{e.push({type:this.type,dataProvider:k})}this.swf.setDataProvider(e);if(this.seriesStyles){this.setSeriesStyles(this.seriesStyles)}this.fireEvent("refresh",this)}},createFnProxy:function(a){var b="extFnProxy"+(++Ext.chart.Chart.PROXY_FN_ID);Ext.chart.Chart.proxyFunction[b]=a;return"Ext.chart.Chart.proxyFunction."+b},removeFnProxy:function(a){if(!Ext.isEmpty(a)){a=a.replace("Ext.chart.Chart.proxyFunction.","");delete Ext.chart.Chart.proxyFunction[a]}},getFunctionRef:function(a){if(Ext.isFunction(a)){return{fn:a,scope:this}}else{return{fn:a.fn,scope:a.scope||this}}},onDestroy:function(){if(this.refreshTask&&this.refreshTask.cancel){this.refreshTask.cancel()}Ext.chart.Chart.superclass.onDestroy.call(this);this.bindStore(null);this.removeFnProxy(this.tipFnName);this.removeFnProxy(this.legendFnName)}});Ext.reg("chart",Ext.chart.Chart);Ext.chart.Chart.PROXY_FN_ID=0;Ext.chart.Chart.proxyFunction={};Ext.chart.Chart.CHART_URL="http://yui.yahooapis.com/2.8.2/build/charts/assets/charts.swf";Ext.chart.PieChart=Ext.extend(Ext.chart.Chart,{type:"pie",onSwfReady:function(a){Ext.chart.PieChart.superclass.onSwfReady.call(this,a);this.setDataField(this.dataField);this.setCategoryField(this.categoryField)},setDataField:function(a){this.dataField=a;this.swf.setDataField(a)},setCategoryField:function(a){this.categoryField=a;this.swf.setCategoryField(a)}});Ext.reg("piechart",Ext.chart.PieChart);Ext.chart.CartesianChart=Ext.extend(Ext.chart.Chart,{onSwfReady:function(a){Ext.chart.CartesianChart.superclass.onSwfReady.call(this,a);this.labelFn=[];if(this.xField){this.setXField(this.xField)}if(this.yField){this.setYField(this.yField)}if(this.xAxis){this.setXAxis(this.xAxis)}if(this.xAxes){this.setXAxes(this.xAxes)}if(this.yAxis){this.setYAxis(this.yAxis)}if(this.yAxes){this.setYAxes(this.yAxes)}if(Ext.isDefined(this.constrainViewport)){this.swf.setConstrainViewport(this.constrainViewport)}},setXField:function(a){this.xField=a;this.swf.setHorizontalField(a)},setYField:function(a){this.yField=a;this.swf.setVerticalField(a)},setXAxis:function(a){this.xAxis=this.createAxis("xAxis",a);this.swf.setHorizontalAxis(this.xAxis)},setXAxes:function(c){var b;for(var a=0;a<c.length;a++){b=this.createAxis("xAxis"+a,c[a]);this.swf.setHorizontalAxis(b)}},setYAxis:function(a){this.yAxis=this.createAxis("yAxis",a);this.swf.setVerticalAxis(this.yAxis)},setYAxes:function(c){var b;for(var a=0;a<c.length;a++){b=this.createAxis("yAxis"+a,c[a]);this.swf.setVerticalAxis(b)}},createAxis:function(b,d){var e=Ext.apply({},d),c,a;if(this[b]){a=this[b].labelFunction;this.removeFnProxy(a);this.labelFn.remove(a)}if(e.labelRenderer){c=this.getFunctionRef(e.labelRenderer);e.labelFunction=this.createFnProxy(function(g){return c.fn.call(c.scope,g)});delete e.labelRenderer;this.labelFn.push(e.labelFunction)}if(b.indexOf("xAxis")>-1&&e.position=="left"){e.position="bottom"}return e},onDestroy:function(){Ext.chart.CartesianChart.superclass.onDestroy.call(this);Ext.each(this.labelFn,function(a){this.removeFnProxy(a)},this)}});Ext.reg("cartesianchart",Ext.chart.CartesianChart);Ext.chart.LineChart=Ext.extend(Ext.chart.CartesianChart,{type:"line"});Ext.reg("linechart",Ext.chart.LineChart);Ext.chart.ColumnChart=Ext.extend(Ext.chart.CartesianChart,{type:"column"});Ext.reg("columnchart",Ext.chart.ColumnChart);Ext.chart.StackedColumnChart=Ext.extend(Ext.chart.CartesianChart,{type:"stackcolumn"});Ext.reg("stackedcolumnchart",Ext.chart.StackedColumnChart);Ext.chart.BarChart=Ext.extend(Ext.chart.CartesianChart,{type:"bar"});Ext.reg("barchart",Ext.chart.BarChart);Ext.chart.StackedBarChart=Ext.extend(Ext.chart.CartesianChart,{type:"stackbar"});Ext.reg("stackedbarchart",Ext.chart.StackedBarChart);Ext.chart.Axis=function(a){Ext.apply(this,a)};Ext.chart.Axis.prototype={type:null,orientation:"horizontal",reverse:false,labelFunction:null,hideOverlappingLabels:true,labelSpacing:2};Ext.chart.NumericAxis=Ext.extend(Ext.chart.Axis,{type:"numeric",minimum:NaN,maximum:NaN,majorUnit:NaN,minorUnit:NaN,snapToUnits:true,alwaysShowZero:true,scale:"linear",roundMajorUnit:true,calculateByLabelSize:true,position:"left",adjustMaximumByMajorUnit:true,adjustMinimumByMajorUnit:true});Ext.chart.TimeAxis=Ext.extend(Ext.chart.Axis,{type:"time",minimum:null,maximum:null,majorUnit:NaN,majorTimeUnit:null,minorUnit:NaN,minorTimeUnit:null,snapToUnits:true,stackingEnabled:false,calculateByLabelSize:true});Ext.chart.CategoryAxis=Ext.extend(Ext.chart.Axis,{type:"category",categoryNames:null,calculateCategoryCount:false});Ext.chart.Series=function(a){Ext.apply(this,a)};Ext.chart.Series.prototype={type:null,displayName:null};Ext.chart.CartesianSeries=Ext.extend(Ext.chart.Series,{xField:null,yField:null,showInLegend:true,axis:"primary"});Ext.chart.ColumnSeries=Ext.extend(Ext.chart.CartesianSeries,{type:"column"});Ext.chart.LineSeries=Ext.extend(Ext.chart.CartesianSeries,{type:"line"});Ext.chart.BarSeries=Ext.extend(Ext.chart.CartesianSeries,{type:"bar"});Ext.chart.PieSeries=Ext.extend(Ext.chart.Series,{type:"pie",dataField:null,categoryField:null});Ext.menu.Menu=Ext.extend(Ext.Container,{minWidth:120,shadow:"sides",subMenuAlign:"tl-tr?",defaultAlign:"tl-bl?",allowOtherMenus:false,ignoreParentClicks:false,enableScrolling:true,maxHeight:null,scrollIncrement:24,showSeparator:true,defaultOffsets:[0,0],plain:false,floating:true,zIndex:15000,hidden:true,layout:"menu",hideMode:"offsets",scrollerHeight:8,autoLayout:true,defaultType:"menuitem",bufferResize:false,initComponent:function(){if(Ext.isArray(this.initialConfig)){Ext.apply(this,{items:this.initialConfig})}this.addEvents("click","mouseover","mouseout","itemclick");Ext.menu.MenuMgr.register(this);if(this.floating){Ext.EventManager.onWindowResize(this.hide,this)}else{if(this.initialConfig.hidden!==false){this.hidden=false}this.internalDefaults={hideOnClick:false}}Ext.menu.Menu.superclass.initComponent.call(this);if(this.autoLayout){var a=this.doLayout.createDelegate(this,[]);this.on({add:a,remove:a})}},getLayoutTarget:function(){return this.ul},onRender:function(b,a){if(!b){b=Ext.getBody()}var c={id:this.getId(),cls:"x-menu "+((this.floating)?"x-menu-floating x-layer ":"")+(this.cls||"")+(this.plain?" x-menu-plain":"")+(this.showSeparator?"":" x-menu-nosep"),style:this.style,cn:[{tag:"a",cls:"x-menu-focus",href:"#",onclick:"return false;",tabIndex:"-1"},{tag:"ul",cls:"x-menu-list"}]};if(this.floating){this.el=new Ext.Layer({shadow:this.shadow,dh:c,constrain:false,parentEl:b,zindex:this.zIndex})}else{this.el=b.createChild(c)}Ext.menu.Menu.superclass.onRender.call(this,b,a);if(!this.keyNav){this.keyNav=new Ext.menu.MenuNav(this)}this.focusEl=this.el.child("a.x-menu-focus");this.ul=this.el.child("ul.x-menu-list");this.mon(this.ul,{scope:this,click:this.onClick,mouseover:this.onMouseOver,mouseout:this.onMouseOut});if(this.enableScrolling){this.mon(this.el,{scope:this,delegate:".x-menu-scroller",click:this.onScroll,mouseover:this.deactivateActive})}},findTargetItem:function(b){var a=b.getTarget(".x-menu-list-item",this.ul,true);if(a&&a.menuItemId){return this.items.get(a.menuItemId)}},onClick:function(b){var a=this.findTargetItem(b);if(a){if(a.isFormField){this.setActiveItem(a)}else{if(a instanceof Ext.menu.BaseItem){if(a.menu&&this.ignoreParentClicks){a.expandMenu();b.preventDefault()}else{if(a.onClick){a.onClick(b);this.fireEvent("click",this,a,b)}}}}}},setActiveItem:function(a,b){if(a!=this.activeItem){this.deactivateActive();if((this.activeItem=a).isFormField){a.focus()}else{a.activate(b)}}else{if(b){a.expandMenu()}}},deactivateActive:function(){var b=this.activeItem;if(b){if(b.isFormField){if(b.collapse){b.collapse()}}else{b.deactivate()}delete this.activeItem}},tryActivate:function(g,e){var b=this.items;for(var c=g,a=b.length;c>=0&&c<a;c+=e){var d=b.get(c);if(d.isVisible()&&!d.disabled&&(d.canActivate||d.isFormField)){this.setActiveItem(d,false);return d}}return false},onMouseOver:function(b){var a=this.findTargetItem(b);if(a){if(a.canActivate&&!a.disabled){this.setActiveItem(a,true)}}this.over=true;this.fireEvent("mouseover",this,b,a)},onMouseOut:function(b){var a=this.findTargetItem(b);if(a){if(a==this.activeItem&&a.shouldDeactivate&&a.shouldDeactivate(b)){this.activeItem.deactivate();delete this.activeItem}}this.over=false;this.fireEvent("mouseout",this,b,a)},onScroll:function(d,b){if(d){d.stopEvent()}var a=this.ul.dom,c=Ext.fly(b).is(".x-menu-scroller-top");a.scrollTop+=this.scrollIncrement*(c?-1:1);if(c?a.scrollTop<=0:a.scrollTop+this.activeMax>=a.scrollHeight){this.onScrollerOut(null,b)}},onScrollerIn:function(d,b){var a=this.ul.dom,c=Ext.fly(b).is(".x-menu-scroller-top");if(c?a.scrollTop>0:a.scrollTop+this.activeMax<a.scrollHeight){Ext.fly(b).addClass(["x-menu-item-active","x-menu-scroller-active"])}},onScrollerOut:function(b,a){Ext.fly(a).removeClass(["x-menu-item-active","x-menu-scroller-active"])},show:function(b,c,a){if(this.floating){this.parentMenu=a;if(!this.el){this.render();this.doLayout(false,true)}this.showAt(this.el.getAlignToXY(b,c||this.defaultAlign,this.defaultOffsets),a)}else{Ext.menu.Menu.superclass.show.call(this)}},showAt:function(b,a){if(this.fireEvent("beforeshow",this)!==false){this.parentMenu=a;if(!this.el){this.render()}if(this.enableScrolling){this.el.setXY(b);b[1]=this.constrainScroll(b[1]);b=[this.el.adjustForConstraints(b)[0],b[1]]}else{b=this.el.adjustForConstraints(b)}this.el.setXY(b);this.el.show();Ext.menu.Menu.superclass.onShow.call(this);if(Ext.isIE9m){this.fireEvent("autosize",this);if(!Ext.isIE8){this.el.repaint()}}this.hidden=false;this.focus();this.fireEvent("show",this)}},constrainScroll:function(i){var b,d=this.ul.setHeight("auto").getHeight(),a=i,h,e,g,c;if(this.floating){e=Ext.fly(this.el.dom.parentNode);g=e.getScroll().top;c=e.getViewSize().height;h=i-g;b=this.maxHeight?this.maxHeight:c-h;if(d>c){b=c;a=i-h}else{if(b<d){a=i-(d-b);b=d}}}else{b=this.getHeight()}if(this.maxHeight){b=Math.min(this.maxHeight,b)}if(d>b&&b>0){this.activeMax=b-this.scrollerHeight*2-this.el.getFrameWidth("tb")-Ext.num(this.el.shadowOffset,0);this.ul.setHeight(this.activeMax);this.createScrollers();this.el.select(".x-menu-scroller").setDisplayed("")}else{this.ul.setHeight(d);this.el.select(".x-menu-scroller").setDisplayed("none")}this.ul.dom.scrollTop=0;return a},createScrollers:function(){if(!this.scroller){this.scroller={pos:0,top:this.el.insertFirst({tag:"div",cls:"x-menu-scroller x-menu-scroller-top",html:"&#160;"}),bottom:this.el.createChild({tag:"div",cls:"x-menu-scroller x-menu-scroller-bottom",html:"&#160;"})};this.scroller.top.hover(this.onScrollerIn,this.onScrollerOut,this);this.scroller.topRepeater=new Ext.util.ClickRepeater(this.scroller.top,{listeners:{click:this.onScroll.createDelegate(this,[null,this.scroller.top],false)}});this.scroller.bottom.hover(this.onScrollerIn,this.onScrollerOut,this);this.scroller.bottomRepeater=new Ext.util.ClickRepeater(this.scroller.bottom,{listeners:{click:this.onScroll.createDelegate(this,[null,this.scroller.bottom],false)}})}},onLayout:function(){if(this.isVisible()){if(this.enableScrolling){this.constrainScroll(this.el.getTop())}if(this.floating){this.el.sync()}}},focus:function(){if(!this.hidden){this.doFocus.defer(50,this)}},doFocus:function(){if(!this.hidden){this.focusEl.focus()}},hide:function(a){if(!this.isDestroyed){this.deepHide=a;Ext.menu.Menu.superclass.hide.call(this);delete this.deepHide}},onHide:function(){Ext.menu.Menu.superclass.onHide.call(this);this.deactivateActive();if(this.el&&this.floating){this.el.hide()}var a=this.parentMenu;if(this.deepHide===true&&a){if(a.floating){a.hide(true)}else{a.deactivateActive()}}},lookupComponent:function(a){if(Ext.isString(a)){a=(a=="separator"||a=="-")?new Ext.menu.Separator():new Ext.menu.TextItem(a);this.applyDefaults(a)}else{if(Ext.isObject(a)){a=this.getMenuItem(a)}else{if(a.tagName||a.el){a=new Ext.BoxComponent({el:a})}}}return a},applyDefaults:function(b){if(!Ext.isString(b)){b=Ext.menu.Menu.superclass.applyDefaults.call(this,b);var a=this.internalDefaults;if(a){if(b.events){Ext.applyIf(b.initialConfig,a);Ext.apply(b,a)}else{Ext.applyIf(b,a)}}}return b},getMenuItem:function(a){a.ownerCt=this;if(!a.isXType){if(!a.xtype&&Ext.isBoolean(a.checked)){return new Ext.menu.CheckItem(a)}return Ext.create(a,this.defaultType)}return a},addSeparator:function(){return this.add(new Ext.menu.Separator())},addElement:function(a){return this.add(new Ext.menu.BaseItem({el:a}))},addItem:function(a){return this.add(a)},addMenuItem:function(a){return this.add(this.getMenuItem(a))},addText:function(a){return this.add(new Ext.menu.TextItem(a))},onDestroy:function(){Ext.EventManager.removeResizeListener(this.hide,this);var a=this.parentMenu;if(a&&a.activeChild==this){delete a.activeChild}delete this.parentMenu;Ext.menu.Menu.superclass.onDestroy.call(this);Ext.menu.MenuMgr.unregister(this);if(this.keyNav){this.keyNav.disable()}var b=this.scroller;if(b){Ext.destroy(b.topRepeater,b.bottomRepeater,b.top,b.bottom)}Ext.destroy(this.el,this.focusEl,this.ul)}});Ext.reg("menu",Ext.menu.Menu);Ext.menu.MenuNav=Ext.extend(Ext.KeyNav,function(){function a(d,c){if(!c.tryActivate(c.items.indexOf(c.activeItem)-1,-1)){c.tryActivate(c.items.length-1,-1)}}function b(d,c){if(!c.tryActivate(c.items.indexOf(c.activeItem)+1,1)){c.tryActivate(0,1)}}return{constructor:function(c){Ext.menu.MenuNav.superclass.constructor.call(this,c.el);this.scope=this.menu=c},doRelay:function(g,d){var c=g.getKey();if(this.menu.activeItem&&this.menu.activeItem.isFormField&&c!=g.TAB){return false}if(!this.menu.activeItem&&g.isNavKeyPress()&&c!=g.SPACE&&c!=g.RETURN){this.menu.tryActivate(0,1);return false}return d.call(this.scope||this,g,this.menu)},tab:function(d,c){d.stopEvent();if(d.shiftKey){a(d,c)}else{b(d,c)}},up:a,down:b,right:function(d,c){if(c.activeItem){c.activeItem.expandMenu(true)}},left:function(d,c){c.hide();if(c.parentMenu&&c.parentMenu.activeItem){c.parentMenu.activeItem.activate()}},enter:function(d,c){if(c.activeItem){d.stopPropagation();c.activeItem.onClick(d);c.fireEvent("click",this,c.activeItem);return true}}}}());Ext.menu.MenuMgr=function(){var h,e,b,d={},a=false,l=new Date();function n(){h={};e=new Ext.util.MixedCollection();b=Ext.getDoc().addKeyListener(27,j);b.disable()}function j(){if(e&&e.length>0){var o=e.clone();o.each(function(p){p.hide()});return true}return false}function g(o){e.remove(o);if(e.length<1){b.disable();Ext.getDoc().un("mousedown",m);a=false}}function k(o){var p=e.last();l=new Date();e.add(o);if(!a){b.enable();Ext.getDoc().on("mousedown",m);a=true}if(o.parentMenu){o.getEl().setZIndex(parseInt(o.parentMenu.getEl().getStyle("z-index"),10)+3);o.parentMenu.activeChild=o}else{if(p&&!p.isDestroyed&&p.isVisible()){o.getEl().setZIndex(parseInt(p.getEl().getStyle("z-index"),10)+3)}}}function c(o){if(o.activeChild){o.activeChild.hide()}if(o.autoHideTimer){clearTimeout(o.autoHideTimer);delete o.autoHideTimer}}function i(o){var p=o.parentMenu;if(!p&&!o.allowOtherMenus){j()}else{if(p&&p.activeChild){p.activeChild.hide()}}}function m(o){if(l.getElapsed()>50&&e.length>0&&!o.getTarget(".x-menu")){j()}}return{hideAll:function(){return j()},register:function(o){if(!h){n()}h[o.id]=o;o.on({beforehide:c,hide:g,beforeshow:i,show:k})},get:function(o){if(typeof o=="string"){if(!h){return null}return h[o]}else{if(o.events){return o}else{if(typeof o.length=="number"){return new Ext.menu.Menu({items:o})}else{return Ext.create(o,"menu")}}}},unregister:function(o){delete h[o.id];o.un("beforehide",c);o.un("hide",g);o.un("beforeshow",i);o.un("show",k)},registerCheckable:function(o){var p=o.group;if(p){if(!d[p]){d[p]=[]}d[p].push(o)}},unregisterCheckable:function(o){var p=o.group;if(p){d[p].remove(o)}},onCheckChange:function(q,r){if(q.group&&r){var t=d[q.group],p=0,o=t.length,s;for(;p<o;p++){s=t[p];if(s!=q){s.setChecked(false)}}}},getCheckedItem:function(q){var r=d[q];if(r){for(var p=0,o=r.length;p<o;p++){if(r[p].checked){return r[p]}}}return null},setCheckedItem:function(q,s){var r=d[q];if(r){for(var p=0,o=r.length;p<o;p++){if(r[p].id==s){r[p].setChecked(true)}}}return null}}}();Ext.menu.BaseItem=Ext.extend(Ext.Component,{canActivate:false,activeClass:"x-menu-item-active",hideOnClick:true,clickHideDelay:1,ctype:"Ext.menu.BaseItem",actionMode:"container",initComponent:function(){Ext.menu.BaseItem.superclass.initComponent.call(this);this.addEvents("click","activate","deactivate");if(this.handler){this.on("click",this.handler,this.scope)}},onRender:function(b,a){Ext.menu.BaseItem.superclass.onRender.apply(this,arguments);if(this.ownerCt&&this.ownerCt instanceof Ext.menu.Menu){this.parentMenu=this.ownerCt}else{this.container.addClass("x-menu-list-item");this.mon(this.el,{scope:this,click:this.onClick,mouseenter:this.activate,mouseleave:this.deactivate})}},setHandler:function(b,a){if(this.handler){this.un("click",this.handler,this.scope)}this.on("click",this.handler=b,this.scope=a)},onClick:function(a){if(!this.disabled&&this.fireEvent("click",this,a)!==false&&(this.parentMenu&&this.parentMenu.fireEvent("itemclick",this,a)!==false)){this.handleClick(a)}else{a.stopEvent()}},activate:function(){if(this.disabled){return false}var a=this.container;a.addClass(this.activeClass);this.region=a.getRegion().adjust(2,2,-2,-2);this.fireEvent("activate",this);return true},deactivate:function(){this.container.removeClass(this.activeClass);this.fireEvent("deactivate",this)},shouldDeactivate:function(a){return !this.region||!this.region.contains(a.getPoint())},handleClick:function(b){var a=this.parentMenu;if(this.hideOnClick){if(a.floating){this.clickHideDelayTimer=a.hide.defer(this.clickHideDelay,a,[true])}else{a.deactivateActive()}}},beforeDestroy:function(){clearTimeout(this.clickHideDelayTimer);Ext.menu.BaseItem.superclass.beforeDestroy.call(this)},expandMenu:Ext.emptyFn,hideMenu:Ext.emptyFn});Ext.reg("menubaseitem",Ext.menu.BaseItem);Ext.menu.TextItem=Ext.extend(Ext.menu.BaseItem,{hideOnClick:false,itemCls:"x-menu-text",constructor:function(a){if(typeof a=="string"){a={text:a}}Ext.menu.TextItem.superclass.constructor.call(this,a)},onRender:function(){var a=document.createElement("span");a.className=this.itemCls;a.innerHTML=this.text;this.el=a;Ext.menu.TextItem.superclass.onRender.apply(this,arguments)}});Ext.reg("menutextitem",Ext.menu.TextItem);Ext.menu.Separator=Ext.extend(Ext.menu.BaseItem,{itemCls:"x-menu-sep",hideOnClick:false,activeClass:"",onRender:function(a){var b=document.createElement("span");b.className=this.itemCls;b.innerHTML="&#160;";this.el=b;a.addClass("x-menu-sep-li");Ext.menu.Separator.superclass.onRender.apply(this,arguments)}});Ext.reg("menuseparator",Ext.menu.Separator);Ext.menu.Item=Ext.extend(Ext.menu.BaseItem,{itemCls:"x-menu-item",canActivate:true,showDelay:200,altText:"",hideDelay:200,ctype:"Ext.menu.Item",initComponent:function(){Ext.menu.Item.superclass.initComponent.call(this);if(this.menu){if(Ext.isArray(this.menu)){this.menu={items:this.menu}}if(Ext.isObject(this.menu)){this.menu.ownerCt=this}this.menu=Ext.menu.MenuMgr.get(this.menu);this.menu.ownerCt=undefined}},onRender:function(d,b){if(!this.itemTpl){this.itemTpl=Ext.menu.Item.prototype.itemTpl=new Ext.XTemplate('<a id="{id}" class="{cls} x-unselectable" hidefocus="true" unselectable="on" href="{href}"','<tpl if="hrefTarget">',' target="{hrefTarget}"',"</tpl>",">",'<img alt="{altText}" src="{icon}" class="x-menu-item-icon {iconCls}"/>','<span class="x-menu-item-text">{text}</span>',"</a>")}var c=this.getTemplateArgs();this.el=b?this.itemTpl.insertBefore(b,c,true):this.itemTpl.append(d,c,true);this.iconEl=this.el.child("img.x-menu-item-icon");this.textEl=this.el.child(".x-menu-item-text");if(!this.href){this.mon(this.el,"click",Ext.emptyFn,null,{preventDefault:true})}Ext.menu.Item.superclass.onRender.call(this,d,b)},getTemplateArgs:function(){return{id:this.id,cls:this.itemCls+(this.menu?" x-menu-item-arrow":"")+(this.cls?" "+this.cls:""),href:this.href||"#",hrefTarget:this.hrefTarget,icon:this.icon||Ext.BLANK_IMAGE_URL,iconCls:this.iconCls||"",text:this.itemText||this.text||"&#160;",altText:this.altText||""}},setText:function(a){this.text=a||"&#160;";if(this.rendered){this.textEl.update(this.text);this.parentMenu.layout.doAutoSize()}},setIconClass:function(a){var b=this.iconCls;this.iconCls=a;if(this.rendered){this.iconEl.replaceClass(b,this.iconCls)}},beforeDestroy:function(){clearTimeout(this.showTimer);clearTimeout(this.hideTimer);if(this.menu){delete this.menu.ownerCt;this.menu.destroy()}Ext.menu.Item.superclass.beforeDestroy.call(this)},handleClick:function(a){if(!this.href){a.stopEvent()}Ext.menu.Item.superclass.handleClick.apply(this,arguments)},activate:function(a){if(Ext.menu.Item.superclass.activate.apply(this,arguments)){this.focus();if(a){this.expandMenu()}}return true},shouldDeactivate:function(a){if(Ext.menu.Item.superclass.shouldDeactivate.call(this,a)){if(this.menu&&this.menu.isVisible()){return !this.menu.getEl().getRegion().contains(a.getPoint())}return true}return false},deactivate:function(){Ext.menu.Item.superclass.deactivate.apply(this,arguments);this.hideMenu()},expandMenu:function(a){if(!this.disabled&&this.menu){clearTimeout(this.hideTimer);delete this.hideTimer;if(!this.menu.isVisible()&&!this.showTimer){this.showTimer=this.deferExpand.defer(this.showDelay,this,[a])}else{if(this.menu.isVisible()&&a){this.menu.tryActivate(0,1)}}}},deferExpand:function(a){delete this.showTimer;this.menu.show(this.container,this.parentMenu.subMenuAlign||"tl-tr?",this.parentMenu);if(a){this.menu.tryActivate(0,1)}},hideMenu:function(){clearTimeout(this.showTimer);delete this.showTimer;if(!this.hideTimer&&this.menu&&this.menu.isVisible()){this.hideTimer=this.deferHide.defer(this.hideDelay,this)}},deferHide:function(){delete this.hideTimer;if(this.menu.over){this.parentMenu.setActiveItem(this,false)}else{this.menu.hide()}}});Ext.reg("menuitem",Ext.menu.Item);Ext.menu.CheckItem=Ext.extend(Ext.menu.Item,{itemCls:"x-menu-item x-menu-check-item",groupClass:"x-menu-group-item",checked:false,ctype:"Ext.menu.CheckItem",initComponent:function(){Ext.menu.CheckItem.superclass.initComponent.call(this);this.addEvents("beforecheckchange","checkchange");if(this.checkHandler){this.on("checkchange",this.checkHandler,this.scope)}Ext.menu.MenuMgr.registerCheckable(this)},onRender:function(a){Ext.menu.CheckItem.superclass.onRender.apply(this,arguments);if(this.group){this.el.addClass(this.groupClass)}if(this.checked){this.checked=false;this.setChecked(true,true)}},destroy:function(){Ext.menu.MenuMgr.unregisterCheckable(this);Ext.menu.CheckItem.superclass.destroy.apply(this,arguments)},setChecked:function(b,a){var c=a===true;if(this.checked!=b&&(c||this.fireEvent("beforecheckchange",this,b)!==false)){Ext.menu.MenuMgr.onCheckChange(this,b);if(this.container){this.container[b?"addClass":"removeClass"]("x-menu-item-checked")}this.checked=b;if(!c){this.fireEvent("checkchange",this,b)}}},handleClick:function(a){if(!this.disabled&&!(this.checked&&this.group)){this.setChecked(!this.checked)}Ext.menu.CheckItem.superclass.handleClick.apply(this,arguments)}});Ext.reg("menucheckitem",Ext.menu.CheckItem);Ext.menu.DateMenu=Ext.extend(Ext.menu.Menu,{enableScrolling:false,hideOnClick:true,pickerId:null,cls:"x-date-menu",initComponent:function(){this.on("beforeshow",this.onBeforeShow,this);if(this.strict=(Ext.isIE7&&Ext.isStrict)){this.on("show",this.onShow,this,{single:true,delay:20})}Ext.apply(this,{plain:true,showSeparator:false,items:this.picker=new Ext.DatePicker(Ext.applyIf({internalRender:this.strict||!Ext.isIE9m,ctCls:"x-menu-date-item",id:this.pickerId},this.initialConfig))});this.picker.purgeListeners();Ext.menu.DateMenu.superclass.initComponent.call(this);this.relayEvents(this.picker,["select"]);this.on("show",this.picker.focus,this.picker);this.on("select",this.menuHide,this);if(this.handler){this.on("select",this.handler,this.scope||this)}},menuHide:function(){if(this.hideOnClick){this.hide(true)}},onBeforeShow:function(){if(this.picker){this.picker.hideMonthPicker(true)}},onShow:function(){var a=this.picker.getEl();a.setWidth(a.getWidth())}});Ext.reg("datemenu",Ext.menu.DateMenu);Ext.menu.ColorMenu=Ext.extend(Ext.menu.Menu,{enableScrolling:false,hideOnClick:true,cls:"x-color-menu",paletteId:null,initComponent:function(){Ext.apply(this,{plain:true,showSeparator:false,items:this.palette=new Ext.ColorPalette(Ext.applyIf({id:this.paletteId},this.initialConfig))});this.palette.purgeListeners();Ext.menu.ColorMenu.superclass.initComponent.call(this);this.relayEvents(this.palette,["select"]);this.on("select",this.menuHide,this);if(this.handler){this.on("select",this.handler,this.scope||this)}},menuHide:function(){if(this.hideOnClick){this.hide(true)}}});Ext.reg("colormenu",Ext.menu.ColorMenu);Ext.form.Field=Ext.extend(Ext.BoxComponent,{invalidClass:"x-form-invalid",invalidText:"The value in this field is invalid",focusClass:"x-form-focus",validationEvent:"keyup",validateOnBlur:true,validationDelay:250,defaultAutoCreate:{tag:"input",type:"text",size:"20",autocomplete:"off"},fieldClass:"x-form-field",msgTarget:"qtip",msgFx:"normal",readOnly:false,disabled:false,submitValue:true,isFormField:true,msgDisplay:"",hasFocus:false,initComponent:function(){Ext.form.Field.superclass.initComponent.call(this);this.addEvents("focus","blur","specialkey","change","invalid","valid")},getName:function(){return this.rendered&&this.el.dom.name?this.el.dom.name:this.name||this.id||""},onRender:function(c,a){if(!this.el){var b=this.getAutoCreate();if(!b.name){b.name=this.name||this.id}if(this.inputType){b.type=this.inputType}this.autoEl=b}Ext.form.Field.superclass.onRender.call(this,c,a);if(this.submitValue===false){this.el.dom.removeAttribute("name")}var d=this.el.dom.type;if(d){if(d=="password"){d="text"}this.el.addClass("x-form-"+d)}if(this.readOnly){this.setReadOnly(true)}if(this.tabIndex!==undefined){this.el.dom.setAttribute("tabIndex",this.tabIndex)}this.el.addClass([this.fieldClass,this.cls])},getItemCt:function(){return this.itemCt},initValue:function(){if(this.value!==undefined){this.setValue(this.value)}else{if(!Ext.isEmpty(this.el.dom.value)&&this.el.dom.value!=this.emptyText){this.setValue(this.el.dom.value)}}this.originalValue=this.getValue()},isDirty:function(){if(this.disabled||!this.rendered){return false}return String(this.getValue())!==String(this.originalValue)},setReadOnly:function(a){if(this.rendered){this.el.dom.readOnly=a}this.readOnly=a},afterRender:function(){Ext.form.Field.superclass.afterRender.call(this);this.initEvents();this.initValue()},fireKey:function(a){if(a.isSpecialKey()){this.fireEvent("specialkey",this,a)}},reset:function(){this.setValue(this.originalValue);this.clearInvalid()},initEvents:function(){this.mon(this.el,Ext.EventManager.getKeyEvent(),this.fireKey,this);this.mon(this.el,"focus",this.onFocus,this);this.mon(this.el,"blur",this.onBlur,this,this.inEditor?{buffer:10}:null)},preFocus:Ext.emptyFn,onFocus:function(){this.preFocus();if(this.focusClass){this.el.addClass(this.focusClass)}if(!this.hasFocus){this.hasFocus=true;this.startValue=this.getValue();this.fireEvent("focus",this)}},beforeBlur:Ext.emptyFn,onBlur:function(){this.beforeBlur();if(this.focusClass){this.el.removeClass(this.focusClass)}this.hasFocus=false;if(this.validationEvent!==false&&(this.validateOnBlur||this.validationEvent=="blur")){this.validate()}var a=this.getValue();if(String(a)!==String(this.startValue)){this.fireEvent("change",this,a,this.startValue)}this.fireEvent("blur",this);this.postBlur()},postBlur:Ext.emptyFn,isValid:function(a){if(this.disabled){return true}var c=this.preventMark;this.preventMark=a===true;var b=this.validateValue(this.processValue(this.getRawValue()),a);this.preventMark=c;return b},validate:function(){if(this.disabled||this.validateValue(this.processValue(this.getRawValue()))){this.clearInvalid();return true}return false},processValue:function(a){return a},validateValue:function(b){var a=this.getErrors(b)[0];if(a==undefined){return true}else{this.markInvalid(a);return false}},getErrors:function(){return[]},getActiveError:function(){return this.activeError||""},markInvalid:function(c){if(this.rendered&&!this.preventMark){c=c||this.invalidText;var a=this.getMessageHandler();if(a){a.mark(this,c)}else{if(this.msgTarget){this.el.addClass(this.invalidClass);var b=Ext.getDom(this.msgTarget);if(b){b.innerHTML=c;b.style.display=this.msgDisplay}}}}this.setActiveError(c)},clearInvalid:function(){if(this.rendered&&!this.preventMark){this.el.removeClass(this.invalidClass);var a=this.getMessageHandler();if(a){a.clear(this)}else{if(this.msgTarget){this.el.removeClass(this.invalidClass);var b=Ext.getDom(this.msgTarget);if(b){b.innerHTML="";b.style.display="none"}}}}this.unsetActiveError()},setActiveError:function(b,a){this.activeError=b;if(a!==true){this.fireEvent("invalid",this,b)}},unsetActiveError:function(a){delete this.activeError;if(a!==true){this.fireEvent("valid",this)}},getMessageHandler:function(){return Ext.form.MessageTargets[this.msgTarget]},getErrorCt:function(){return this.el.findParent(".x-form-element",5,true)||this.el.findParent(".x-form-field-wrap",5,true)},alignErrorEl:function(){this.errorEl.setWidth(this.getErrorCt().getWidth(true)-20)},alignErrorIcon:function(){this.errorIcon.alignTo(this.el,"tl-tr",[2,0])},getRawValue:function(){var a=this.rendered?this.el.getValue():Ext.value(this.value,"");if(a===this.emptyText){a=""}return a},getValue:function(){if(!this.rendered){return this.value}var a=this.el.getValue();if(a===this.emptyText||a===undefined){a=""}return a},setRawValue:function(a){return this.rendered?(this.el.dom.value=(Ext.isEmpty(a)?"":a)):""},setValue:function(a){this.value=a;if(this.rendered){this.el.dom.value=(Ext.isEmpty(a)?"":a);this.validate()}return this},append:function(a){this.setValue([this.getValue(),a].join(""))}});Ext.form.MessageTargets={qtip:{mark:function(a,b){a.el.addClass(a.invalidClass);a.el.dom.qtip=b;a.el.dom.qclass="x-form-invalid-tip";if(Ext.QuickTips){Ext.QuickTips.enable()}},clear:function(a){a.el.removeClass(a.invalidClass);a.el.dom.qtip=""}},title:{mark:function(a,b){a.el.addClass(a.invalidClass);a.el.dom.title=b},clear:function(a){a.el.dom.title=""}},under:{mark:function(b,c){b.el.addClass(b.invalidClass);if(!b.errorEl){var a=b.getErrorCt();if(!a){b.el.dom.title=c;return}b.errorEl=a.createChild({cls:"x-form-invalid-msg"});b.on("resize",b.alignErrorEl,b);b.on("destroy",function(){Ext.destroy(this.errorEl)},b)}b.alignErrorEl();b.errorEl.update(c);Ext.form.Field.msgFx[b.msgFx].show(b.errorEl,b)},clear:function(a){a.el.removeClass(a.invalidClass);if(a.errorEl){Ext.form.Field.msgFx[a.msgFx].hide(a.errorEl,a)}else{a.el.dom.title=""}}},side:{mark:function(b,c){b.el.addClass(b.invalidClass);if(!b.errorIcon){var a=b.getErrorCt();if(!a){b.el.dom.title=c;return}b.errorIcon=a.createChild({cls:"x-form-invalid-icon"});if(b.ownerCt){b.ownerCt.on("afterlayout",b.alignErrorIcon,b);b.ownerCt.on("expand",b.alignErrorIcon,b)}b.on("resize",b.alignErrorIcon,b);b.on("destroy",function(){Ext.destroy(this.errorIcon)},b)}b.alignErrorIcon();b.errorIcon.dom.qtip=c;b.errorIcon.dom.qclass="x-form-invalid-tip";b.errorIcon.show()},clear:function(a){a.el.removeClass(a.invalidClass);if(a.errorIcon){a.errorIcon.dom.qtip="";a.errorIcon.hide()}else{a.el.dom.title=""}}}};Ext.form.Field.msgFx={normal:{show:function(a,b){a.setDisplayed("block")},hide:function(a,b){a.setDisplayed(false).update("")}},slide:{show:function(a,b){a.slideIn("t",{stopFx:true})},hide:function(a,b){a.slideOut("t",{stopFx:true,useDisplay:true})}},slideRight:{show:function(a,b){a.fixDisplay();a.alignTo(b.el,"tl-tr");a.slideIn("l",{stopFx:true})},hide:function(a,b){a.slideOut("l",{stopFx:true,useDisplay:true})}}};Ext.reg("field",Ext.form.Field);Ext.form.TextField=Ext.extend(Ext.form.Field,{grow:false,growMin:30,growMax:800,vtype:null,maskRe:null,disableKeyFilter:false,allowBlank:true,minLength:0,maxLength:Number.MAX_VALUE,minLengthText:"The minimum length for this field is {0}",maxLengthText:"The maximum length for this field is {0}",selectOnFocus:false,blankText:"This field is required",validator:null,regex:null,regexText:"",emptyText:null,emptyClass:"x-form-empty-field",initComponent:function(){Ext.form.TextField.superclass.initComponent.call(this);this.addEvents("autosize","keydown","keyup","keypress")},initEvents:function(){Ext.form.TextField.superclass.initEvents.call(this);if(this.validationEvent=="keyup"){this.validationTask=new Ext.util.DelayedTask(this.validate,this);this.mon(this.el,"keyup",this.filterValidation,this)}else{if(this.validationEvent!==false&&this.validationEvent!="blur"){this.mon(this.el,this.validationEvent,this.validate,this,{buffer:this.validationDelay})}}if(this.selectOnFocus||this.emptyText){this.mon(this.el,"mousedown",this.onMouseDown,this);if(this.emptyText){this.applyEmptyText()}}if(this.maskRe||(this.vtype&&this.disableKeyFilter!==true&&(this.maskRe=Ext.form.VTypes[this.vtype+"Mask"]))){this.mon(this.el,"keypress",this.filterKeys,this)}if(this.grow){this.mon(this.el,"keyup",this.onKeyUpBuffered,this,{buffer:50});this.mon(this.el,"click",this.autoSize,this)}if(this.enableKeyEvents){this.mon(this.el,{scope:this,keyup:this.onKeyUp,keydown:this.onKeyDown,keypress:this.onKeyPress})}},onMouseDown:function(a){if(!this.hasFocus){this.mon(this.el,"mouseup",Ext.emptyFn,this,{single:true,preventDefault:true})}},processValue:function(a){if(this.stripCharsRe){var b=a.replace(this.stripCharsRe,"");if(b!==a){this.setRawValue(b);return b}}return a},filterValidation:function(a){if(!a.isNavKeyPress()){this.validationTask.delay(this.validationDelay)}},onDisable:function(){Ext.form.TextField.superclass.onDisable.call(this);if(Ext.isIE){this.el.dom.unselectable="on"}},onEnable:function(){Ext.form.TextField.superclass.onEnable.call(this);if(Ext.isIE){this.el.dom.unselectable=""}},onKeyUpBuffered:function(a){if(this.doAutoSize(a)){this.autoSize()}},doAutoSize:function(a){return !a.isNavKeyPress()},onKeyUp:function(a){this.fireEvent("keyup",this,a)},onKeyDown:function(a){this.fireEvent("keydown",this,a)},onKeyPress:function(a){this.fireEvent("keypress",this,a)},reset:function(){Ext.form.TextField.superclass.reset.call(this);this.applyEmptyText()},applyEmptyText:function(){if(this.rendered&&this.emptyText&&this.getRawValue().length<1&&!this.hasFocus){this.setRawValue(this.emptyText);this.el.addClass(this.emptyClass)}},preFocus:function(){var a=this.el,b;if(this.emptyText){if(a.dom.value==this.emptyText){this.setRawValue("");b=true}a.removeClass(this.emptyClass)}if(this.selectOnFocus||b){a.dom.select()}},postBlur:function(){this.applyEmptyText()},filterKeys:function(b){if(b.ctrlKey){return}var a=b.getKey();if(Ext.isGecko&&(b.isNavKeyPress()||a==b.BACKSPACE||(a==b.DELETE&&b.button==-1))){return}var c=String.fromCharCode(b.getCharCode());if(!Ext.isGecko&&b.isSpecialKey()&&!c){return}if(!this.maskRe.test(c)){b.stopEvent()}},setValue:function(a){if(this.emptyText&&this.el&&!Ext.isEmpty(a)){this.el.removeClass(this.emptyClass)}Ext.form.TextField.superclass.setValue.apply(this,arguments);this.applyEmptyText();this.autoSize();return this},getErrors:function(a){var d=Ext.form.TextField.superclass.getErrors.apply(this,arguments);a=Ext.isDefined(a)?a:this.processValue(this.getRawValue());if(Ext.isFunction(this.validator)){var c=this.validator(a);if(c!==true){d.push(c)}}if(a.length<1||a===this.emptyText){if(this.allowBlank){return d}else{d.push(this.blankText)}}if(!this.allowBlank&&(a.length<1||a===this.emptyText)){d.push(this.blankText)}if(a.length<this.minLength){d.push(String.format(this.minLengthText,this.minLength))}if(a.length>this.maxLength){d.push(String.format(this.maxLengthText,this.maxLength))}if(this.vtype){var b=Ext.form.VTypes;if(!b[this.vtype](a,this)){d.push(this.vtypeText||b[this.vtype+"Text"])}}if(this.regex&&!this.regex.test(a)){d.push(this.regexText)}return d},selectText:function(h,a){var c=this.getRawValue();var e=false;if(c.length>0){h=h===undefined?0:h;a=a===undefined?c.length:a;var g=this.el.dom;if(g.setSelectionRange){g.setSelectionRange(h,a)}else{if(g.createTextRange){var b=g.createTextRange();b.moveStart("character",h);b.moveEnd("character",a-c.length);b.select()}}e=Ext.isGecko||Ext.isOpera}else{e=true}if(e){this.focus()}},autoSize:function(){if(!this.grow||!this.rendered){return}if(!this.metrics){this.metrics=Ext.util.TextMetrics.createInstance(this.el)}var c=this.el;var b=c.dom.value;var e=document.createElement("div");e.appendChild(document.createTextNode(b));b=e.innerHTML;Ext.removeNode(e);e=null;b+="&#160;";var a=Math.min(this.growMax,Math.max(this.metrics.getWidth(b)+10,this.growMin));this.el.setWidth(a);this.fireEvent("autosize",this,a)},onDestroy:function(){if(this.validationTask){this.validationTask.cancel();this.validationTask=null}Ext.form.TextField.superclass.onDestroy.call(this)}});Ext.reg("textfield",Ext.form.TextField);Ext.form.TriggerField=Ext.extend(Ext.form.TextField,{defaultAutoCreate:{tag:"input",type:"text",size:"16",autocomplete:"off"},hideTrigger:false,editable:true,readOnly:false,wrapFocusClass:"x-trigger-wrap-focus",autoSize:Ext.emptyFn,monitorTab:true,deferHeight:true,mimicing:false,actionMode:"wrap",defaultTriggerWidth:17,onResize:function(a,c){Ext.form.TriggerField.superclass.onResize.call(this,a,c);var b=this.getTriggerWidth();if(Ext.isNumber(a)){this.el.setWidth(a-b)}this.wrap.setWidth(this.el.getWidth()+b)},getTriggerWidth:function(){var a=this.trigger.getWidth();if(!this.hideTrigger&&!this.readOnly&&a===0){a=this.defaultTriggerWidth}return a},alignErrorIcon:function(){if(this.wrap){this.errorIcon.alignTo(this.wrap,"tl-tr",[2,0])}},onRender:function(b,a){this.doc=Ext.isIE?Ext.getBody():Ext.getDoc();Ext.form.TriggerField.superclass.onRender.call(this,b,a);this.wrap=this.el.wrap({cls:"x-form-field-wrap x-form-field-trigger-wrap"});this.trigger=this.wrap.createChild(this.triggerConfig||{tag:"img",src:Ext.BLANK_IMAGE_URL,alt:"",cls:"x-form-trigger "+this.triggerClass});this.initTrigger();if(!this.width){this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth())}this.resizeEl=this.positionEl=this.wrap},getWidth:function(){return(this.el.getWidth()+this.trigger.getWidth())},updateEditState:function(){if(this.rendered){if(this.readOnly){this.el.dom.readOnly=true;this.el.addClass("x-trigger-noedit");this.mun(this.el,"click",this.onTriggerClick,this);this.trigger.setDisplayed(false)}else{if(!this.editable){this.el.dom.readOnly=true;this.el.addClass("x-trigger-noedit");this.mon(this.el,"click",this.onTriggerClick,this)}else{this.el.dom.readOnly=false;this.el.removeClass("x-trigger-noedit");this.mun(this.el,"click",this.onTriggerClick,this)}this.trigger.setDisplayed(!this.hideTrigger)}this.onResize(this.width||this.wrap.getWidth())}},setHideTrigger:function(a){if(a!=this.hideTrigger){this.hideTrigger=a;this.updateEditState()}},setEditable:function(a){if(a!=this.editable){this.editable=a;this.updateEditState()}},setReadOnly:function(a){if(a!=this.readOnly){this.readOnly=a;this.updateEditState()}},afterRender:function(){Ext.form.TriggerField.superclass.afterRender.call(this);this.updateEditState()},initTrigger:function(){this.mon(this.trigger,"click",this.onTriggerClick,this,{preventDefault:true});this.trigger.addClassOnOver("x-form-trigger-over");this.trigger.addClassOnClick("x-form-trigger-click")},onDestroy:function(){Ext.destroy(this.trigger,this.wrap);if(this.mimicing){this.doc.un("mousedown",this.mimicBlur,this)}delete this.doc;Ext.form.TriggerField.superclass.onDestroy.call(this)},onFocus:function(){Ext.form.TriggerField.superclass.onFocus.call(this);if(!this.mimicing){this.wrap.addClass(this.wrapFocusClass);this.mimicing=true;this.doc.on("mousedown",this.mimicBlur,this,{delay:10});if(this.monitorTab){this.on("specialkey",this.checkTab,this)}}},checkTab:function(a,b){if(b.getKey()==b.TAB){this.triggerBlur()}},onBlur:Ext.emptyFn,mimicBlur:function(a){if(!this.isDestroyed&&!this.wrap.contains(a.target)&&this.validateBlur(a)){this.triggerBlur()}},triggerBlur:function(){this.mimicing=false;this.doc.un("mousedown",this.mimicBlur,this);if(this.monitorTab&&this.el){this.un("specialkey",this.checkTab,this)}Ext.form.TriggerField.superclass.onBlur.call(this);if(this.wrap){this.wrap.removeClass(this.wrapFocusClass)}},beforeBlur:Ext.emptyFn,validateBlur:function(a){return true},onTriggerClick:Ext.emptyFn});Ext.form.TwinTriggerField=Ext.extend(Ext.form.TriggerField,{initComponent:function(){Ext.form.TwinTriggerField.superclass.initComponent.call(this);this.triggerConfig={tag:"span",cls:"x-form-twin-triggers",cn:[{tag:"img",src:Ext.BLANK_IMAGE_URL,alt:"",cls:"x-form-trigger "+this.trigger1Class},{tag:"img",src:Ext.BLANK_IMAGE_URL,alt:"",cls:"x-form-trigger "+this.trigger2Class}]}},getTrigger:function(a){return this.triggers[a]},afterRender:function(){Ext.form.TwinTriggerField.superclass.afterRender.call(this);var c=this.triggers,b=0,a=c.length;for(;b<a;++b){if(this["hideTrigger"+(b+1)]){c[b].hide()}}},initTrigger:function(){var a=this.trigger.select(".x-form-trigger",true),b=this;a.each(function(d,g,c){var e="Trigger"+(c+1);d.hide=function(){var h=b.wrap.getWidth();this.dom.style.display="none";b.el.setWidth(h-b.trigger.getWidth());b["hidden"+e]=true};d.show=function(){var h=b.wrap.getWidth();this.dom.style.display="";b.el.setWidth(h-b.trigger.getWidth());b["hidden"+e]=false};this.mon(d,"click",this["on"+e+"Click"],this,{preventDefault:true});d.addClassOnOver("x-form-trigger-over");d.addClassOnClick("x-form-trigger-click")},this);this.triggers=a.elements},getTriggerWidth:function(){var a=0;Ext.each(this.triggers,function(d,c){var e="Trigger"+(c+1),b=d.getWidth();if(b===0&&!this["hidden"+e]){a+=this.defaultTriggerWidth}else{a+=b}},this);return a},onDestroy:function(){Ext.destroy(this.triggers);Ext.form.TwinTriggerField.superclass.onDestroy.call(this)},onTrigger1Click:Ext.emptyFn,onTrigger2Click:Ext.emptyFn});Ext.reg("trigger",Ext.form.TriggerField);Ext.reg("twintrigger",Ext.form.TwinTriggerField);Ext.form.TextArea=Ext.extend(Ext.form.TextField,{growMin:60,growMax:1000,growAppend:"&#160;\n&#160;",enterIsSpecial:false,preventScrollbars:false,onRender:function(b,a){if(!this.el){this.defaultAutoCreate={tag:"textarea",style:"width:100px;height:60px;",autocomplete:"off"}}Ext.form.TextArea.superclass.onRender.call(this,b,a);if(this.grow){this.textSizeEl=Ext.DomHelper.append(document.body,{tag:"pre",cls:"x-form-grow-sizer"});if(this.preventScrollbars){this.el.setStyle("overflow","hidden")}this.el.setHeight(this.growMin)}},onDestroy:function(){Ext.removeNode(this.textSizeEl);Ext.form.TextArea.superclass.onDestroy.call(this)},fireKey:function(a){if(a.isSpecialKey()&&(this.enterIsSpecial||(a.getKey()!=a.ENTER||a.hasModifier()))){this.fireEvent("specialkey",this,a)}},doAutoSize:function(a){return !a.isNavKeyPress()||a.getKey()==a.ENTER},filterValidation:function(a){if(!a.isNavKeyPress()||(!this.enterIsSpecial&&a.keyCode==a.ENTER)){this.validationTask.delay(this.validationDelay)}},autoSize:function(){if(!this.grow||!this.textSizeEl){return}var c=this.el,a=Ext.util.Format.htmlEncode(c.dom.value),d=this.textSizeEl,b;Ext.fly(d).setWidth(this.el.getWidth());if(a.length<1){a="&#160;&#160;"}else{a+=this.growAppend;if(Ext.isIE){a=a.replace(/\n/g,"&#160;<br />")}}d.innerHTML=a;b=Math.min(this.growMax,Math.max(d.offsetHeight,this.growMin));if(b!=this.lastHeight){this.lastHeight=b;this.el.setHeight(b);this.fireEvent("autosize",this,b)}}});Ext.reg("textarea",Ext.form.TextArea);Ext.form.NumberField=Ext.extend(Ext.form.TextField,{fieldClass:"x-form-field x-form-num-field",allowDecimals:true,decimalSeparator:".",decimalPrecision:2,allowNegative:true,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.MAX_VALUE,minText:"The minimum value for this field is {0}",maxText:"The maximum value for this field is {0}",nanText:"{0} is not a valid number",baseChars:"0123456789",autoStripChars:false,initEvents:function(){var a=this.baseChars+"";if(this.allowDecimals){a+=this.decimalSeparator}if(this.allowNegative){a+="-"}a=Ext.escapeRe(a);this.maskRe=new RegExp("["+a+"]");if(this.autoStripChars){this.stripCharsRe=new RegExp("[^"+a+"]","gi")}Ext.form.NumberField.superclass.initEvents.call(this)},getErrors:function(b){var c=Ext.form.NumberField.superclass.getErrors.apply(this,arguments);b=Ext.isDefined(b)?b:this.processValue(this.getRawValue());if(b.length<1){return c}b=String(b).replace(this.decimalSeparator,".");if(isNaN(b)){c.push(String.format(this.nanText,b))}var a=this.parseValue(b);if(a<this.minValue){c.push(String.format(this.minText,this.minValue))}if(a>this.maxValue){c.push(String.format(this.maxText,this.maxValue))}return c},getValue:function(){return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this)))},setValue:function(a){a=Ext.isNumber(a)?a:parseFloat(String(a).replace(this.decimalSeparator,"."));a=this.fixPrecision(a);a=isNaN(a)?"":String(a).replace(".",this.decimalSeparator);return Ext.form.NumberField.superclass.setValue.call(this,a)},setMinValue:function(a){this.minValue=Ext.num(a,Number.NEGATIVE_INFINITY)},setMaxValue:function(a){this.maxValue=Ext.num(a,Number.MAX_VALUE)},parseValue:function(a){a=parseFloat(String(a).replace(this.decimalSeparator,"."));return isNaN(a)?"":a},fixPrecision:function(b){var a=isNaN(b);if(!this.allowDecimals||this.decimalPrecision==-1||a||!b){return a?"":b}return parseFloat(parseFloat(b).toFixed(this.decimalPrecision))},beforeBlur:function(){var a=this.parseValue(this.getRawValue());if(!Ext.isEmpty(a)){this.setValue(a)}}});Ext.reg("numberfield",Ext.form.NumberField);Ext.form.DateField=Ext.extend(Ext.form.TriggerField,{format:"m/d/Y",altFormats:"m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d|n-j|n/j",disabledDaysText:"Disabled",disabledDatesText:"Disabled",minText:"The date in this field must be equal to or after {0}",maxText:"The date in this field must be equal to or before {0}",invalidText:"{0} is not a valid date - it must be in the format {1}",triggerClass:"x-form-date-trigger",showToday:true,startDay:0,defaultAutoCreate:{tag:"input",type:"text",size:"10",autocomplete:"off"},initTime:"12",initTimeFormat:"H",safeParse:function(b,c){if(Date.formatContainsHourInfo(c)){return Date.parseDate(b,c)}else{var a=Date.parseDate(b+" "+this.initTime,c+" "+this.initTimeFormat);if(a){return a.clearTime()}}},initComponent:function(){Ext.form.DateField.superclass.initComponent.call(this);this.addEvents("select");if(Ext.isString(this.minValue)){this.minValue=this.parseDate(this.minValue)}if(Ext.isString(this.maxValue)){this.maxValue=this.parseDate(this.maxValue)}this.disabledDatesRE=null;this.initDisabledDays()},initEvents:function(){Ext.form.DateField.superclass.initEvents.call(this);this.keyNav=new Ext.KeyNav(this.el,{down:function(a){this.onTriggerClick()},scope:this,forceKeyDown:true})},initDisabledDays:function(){if(this.disabledDates){var b=this.disabledDates,a=b.length-1,c="(?:";Ext.each(b,function(g,e){c+=Ext.isDate(g)?"^"+Ext.escapeRe(g.dateFormat(this.format))+"$":b[e];if(e!=a){c+="|"}},this);this.disabledDatesRE=new RegExp(c+")")}},setDisabledDates:function(a){this.disabledDates=a;this.initDisabledDays();if(this.menu){this.menu.picker.setDisabledDates(this.disabledDatesRE)}},setDisabledDays:function(a){this.disabledDays=a;if(this.menu){this.menu.picker.setDisabledDays(a)}},setMinValue:function(a){this.minValue=(Ext.isString(a)?this.parseDate(a):a);if(this.menu){this.menu.picker.setMinDate(this.minValue)}},setMaxValue:function(a){this.maxValue=(Ext.isString(a)?this.parseDate(a):a);if(this.menu){this.menu.picker.setMaxDate(this.maxValue)}},getErrors:function(e){var h=Ext.form.DateField.superclass.getErrors.apply(this,arguments);e=this.formatDate(e||this.processValue(this.getRawValue()));if(e.length<1){return h}var c=e;e=this.parseDate(e);if(!e){h.push(String.format(this.invalidText,c,this.format));return h}var g=e.getTime();if(this.minValue&&g<this.minValue.clearTime().getTime()){h.push(String.format(this.minText,this.formatDate(this.minValue)))}if(this.maxValue&&g>this.maxValue.clearTime().getTime()){h.push(String.format(this.maxText,this.formatDate(this.maxValue)))}if(this.disabledDays){var a=e.getDay();for(var b=0;b<this.disabledDays.length;b++){if(a===this.disabledDays[b]){h.push(this.disabledDaysText);break}}}var d=this.formatDate(e);if(this.disabledDatesRE&&this.disabledDatesRE.test(d)){h.push(String.format(this.disabledDatesText,d))}return h},validateBlur:function(){return !this.menu||!this.menu.isVisible()},getValue:function(){return this.parseDate(Ext.form.DateField.superclass.getValue.call(this))||""},setValue:function(a){return Ext.form.DateField.superclass.setValue.call(this,this.formatDate(this.parseDate(a)))},parseDate:function(g){if(!g||Ext.isDate(g)){return g}var b=this.safeParse(g,this.format),c=this.altFormats,e=this.altFormatsArray;if(!b&&c){e=e||c.split("|");for(var d=0,a=e.length;d<a&&!b;d++){b=this.safeParse(g,e[d])}}return b},onDestroy:function(){Ext.destroy(this.menu,this.keyNav);Ext.form.DateField.superclass.onDestroy.call(this)},formatDate:function(a){return Ext.isDate(a)?a.dateFormat(this.format):a},onTriggerClick:function(){if(this.disabled){return}if(this.menu==null){this.menu=new Ext.menu.DateMenu({hideOnClick:false,focusOnSelect:false})}this.onFocus();Ext.apply(this.menu.picker,{minDate:this.minValue,maxDate:this.maxValue,disabledDatesRE:this.disabledDatesRE,disabledDatesText:this.disabledDatesText,disabledDays:this.disabledDays,disabledDaysText:this.disabledDaysText,format:this.format,showToday:this.showToday,startDay:this.startDay,minText:String.format(this.minText,this.formatDate(this.minValue)),maxText:String.format(this.maxText,this.formatDate(this.maxValue))});this.menu.picker.setValue(this.getValue()||new Date());this.menu.show(this.el,"tl-bl?");this.menuEvents("on")},menuEvents:function(a){this.menu[a]("select",this.onSelect,this);this.menu[a]("hide",this.onMenuHide,this);this.menu[a]("show",this.onFocus,this)},onSelect:function(a,b){this.setValue(b);this.fireEvent("select",this,b);this.menu.hide()},onMenuHide:function(){this.focus(false,60);this.menuEvents("un")},beforeBlur:function(){var a=this.parseDate(this.getRawValue());if(a){this.setValue(a)}}});Ext.reg("datefield",Ext.form.DateField);Ext.form.DisplayField=Ext.extend(Ext.form.Field,{validationEvent:false,validateOnBlur:false,defaultAutoCreate:{tag:"div"},fieldClass:"x-form-display-field",htmlEncode:false,initEvents:Ext.emptyFn,isValid:function(){return true},validate:function(){return true},getRawValue:function(){var a=this.rendered?this.el.dom.innerHTML:Ext.value(this.value,"");if(a===this.emptyText){a=""}if(this.htmlEncode){a=Ext.util.Format.htmlDecode(a)}return a},getValue:function(){return this.getRawValue()},getName:function(){return this.name},setRawValue:function(a){if(this.htmlEncode){a=Ext.util.Format.htmlEncode(a)}return this.rendered?(this.el.dom.innerHTML=(Ext.isEmpty(a)?"":a)):(this.value=a)},setValue:function(a){this.setRawValue(a);return this}});Ext.reg("displayfield",Ext.form.DisplayField);Ext.form.ComboBox=Ext.extend(Ext.form.TriggerField,{defaultAutoCreate:{tag:"input",type:"text",size:"24",autocomplete:"off"},listClass:"",selectedClass:"x-combo-selected",listEmptyText:"",triggerClass:"x-form-arrow-trigger",shadow:"sides",listAlign:"tl-bl?",maxHeight:300,minHeight:90,triggerAction:"query",minChars:4,autoSelect:true,typeAhead:false,queryDelay:500,pageSize:0,selectOnFocus:false,queryParam:"query",loadingText:"Loading...",resizable:false,handleHeight:8,allQuery:"",mode:"remote",minListWidth:70,forceSelection:false,typeAheadDelay:250,lazyInit:true,clearFilterOnReset:true,submitValue:undefined,initComponent:function(){Ext.form.ComboBox.superclass.initComponent.call(this);this.addEvents("expand","collapse","beforeselect","select","beforequery");if(this.transform){var c=Ext.getDom(this.transform);if(!this.hiddenName){this.hiddenName=c.name}if(!this.store){this.mode="local";var j=[],e=c.options;for(var b=0,a=e.length;b<a;b++){var h=e[b],g=(h.hasAttribute?h.hasAttribute("value"):h.getAttributeNode("value").specified)?h.value:h.text;if(h.selected&&Ext.isEmpty(this.value,true)){this.value=g}j.push([g,h.text])}this.store=new Ext.data.ArrayStore({idIndex:0,fields:["value","text"],data:j,autoDestroy:true});this.valueField="value";this.displayField="text"}c.name=Ext.id();if(!this.lazyRender){this.target=true;this.el=Ext.DomHelper.insertBefore(c,this.autoCreate||this.defaultAutoCreate);this.render(this.el.parentNode,c)}Ext.removeNode(c)}else{if(this.store){this.store=Ext.StoreMgr.lookup(this.store);if(this.store.autoCreated){this.displayField=this.valueField="field1";if(!this.store.expandData){this.displayField="field2"}this.mode="local"}}}this.selectedIndex=-1;if(this.mode=="local"){if(!Ext.isDefined(this.initialConfig.queryDelay)){this.queryDelay=10}if(!Ext.isDefined(this.initialConfig.minChars)){this.minChars=0}}},onRender:function(b,a){if(this.hiddenName&&!Ext.isDefined(this.submitValue)){this.submitValue=false}Ext.form.ComboBox.superclass.onRender.call(this,b,a);if(this.hiddenName){this.hiddenField=this.el.insertSibling({tag:"input",type:"hidden",name:this.hiddenName,id:(this.hiddenId||Ext.id())},"before",true)}if(Ext.isGecko){this.el.dom.setAttribute("autocomplete","off")}if(!this.lazyInit){this.initList()}else{this.on("focus",this.initList,this,{single:true})}},initValue:function(){Ext.form.ComboBox.superclass.initValue.call(this);if(this.hiddenField){this.hiddenField.value=Ext.value(Ext.isDefined(this.hiddenValue)?this.hiddenValue:this.value,"")}},getParentZIndex:function(){var a;if(this.ownerCt){this.findParentBy(function(b){a=parseInt(b.getPositionEl().getStyle("z-index"),10);return !!a})}return a},getZIndex:function(b){b=b||Ext.getDom(this.getListParent()||Ext.getBody());var a=parseInt(Ext.fly(b).getStyle("z-index"),10);if(!a){a=this.getParentZIndex()}return(a||12000)+5},initList:function(){if(!this.list){var a="x-combo-list",c=Ext.getDom(this.getListParent()||Ext.getBody());this.list=new Ext.Layer({parentEl:c,shadow:this.shadow,cls:[a,this.listClass].join(" "),constrain:false,zindex:this.getZIndex(c)});var b=this.listWidth||Math.max(this.wrap.getWidth(),this.minListWidth);this.list.setSize(b,0);this.list.swallowEvent("mousewheel");this.assetHeight=0;if(this.syncFont!==false){this.list.setStyle("font-size",this.el.getStyle("font-size"))}if(this.title){this.header=this.list.createChild({cls:a+"-hd",html:this.title});this.assetHeight+=this.header.getHeight()}this.innerList=this.list.createChild({cls:a+"-inner"});this.mon(this.innerList,"mouseover",this.onViewOver,this);this.mon(this.innerList,"mousemove",this.onViewMove,this);this.innerList.setWidth(b-this.list.getFrameWidth("lr"));if(this.pageSize){this.footer=this.list.createChild({cls:a+"-ft"});this.pageTb=new Ext.PagingToolbar({store:this.store,pageSize:this.pageSize,renderTo:this.footer});this.assetHeight+=this.footer.getHeight()}if(!this.tpl){this.tpl='<tpl for="."><div class="'+a+'-item">{'+this.displayField+"}</div></tpl>"}this.view=new Ext.DataView({applyTo:this.innerList,tpl:this.tpl,singleSelect:true,selectedClass:this.selectedClass,itemSelector:this.itemSelector||"."+a+"-item",emptyText:this.listEmptyText,deferEmptyText:false});this.mon(this.view,{containerclick:this.onViewClick,click:this.onViewClick,scope:this});this.bindStore(this.store,true);if(this.resizable){this.resizer=new Ext.Resizable(this.list,{pinned:true,handles:"se"});this.mon(this.resizer,"resize",function(g,d,e){this.maxHeight=e-this.handleHeight-this.list.getFrameWidth("tb")-this.assetHeight;this.listWidth=d;this.innerList.setWidth(d-this.list.getFrameWidth("lr"));this.restrictHeight()},this);this[this.pageSize?"footer":"innerList"].setStyle("margin-bottom",this.handleHeight+"px")}}},getListParent:function(){return document.body},getStore:function(){return this.store},bindStore:function(a,b){if(this.store&&!b){if(this.store!==a&&this.store.autoDestroy){this.store.destroy()}else{this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("exception",this.collapse,this)}if(!a){this.store=null;if(this.view){this.view.bindStore(null)}if(this.pageTb){this.pageTb.bindStore(null)}}}if(a){if(!b){this.lastQuery=null;if(this.pageTb){this.pageTb.bindStore(a)}}this.store=Ext.StoreMgr.lookup(a);this.store.on({scope:this,beforeload:this.onBeforeLoad,load:this.onLoad,exception:this.collapse});if(this.view){this.view.bindStore(a)}}},reset:function(){if(this.clearFilterOnReset&&this.mode=="local"){this.store.clearFilter()}Ext.form.ComboBox.superclass.reset.call(this)},initEvents:function(){Ext.form.ComboBox.superclass.initEvents.call(this);this.keyNav=new Ext.KeyNav(this.el,{up:function(a){this.inKeyMode=true;this.selectPrev()},down:function(a){if(!this.isExpanded()){this.onTriggerClick()}else{this.inKeyMode=true;this.selectNext()}},enter:function(a){this.onViewClick()},esc:function(a){this.collapse()},tab:function(a){if(this.forceSelection===true){this.collapse()}else{this.onViewClick(false)}return true},scope:this,doRelay:function(c,b,a){if(a=="down"||this.scope.isExpanded()){var d=Ext.KeyNav.prototype.doRelay.apply(this,arguments);if((((Ext.isIE9&&Ext.isStrict)||Ext.isIE10p)||!Ext.isIE)&&Ext.EventManager.useKeydown){this.scope.fireKey(c)}return d}return true},forceKeyDown:true,defaultEventAction:"stopEvent"});this.queryDelay=Math.max(this.queryDelay||10,this.mode=="local"?10:250);this.dqTask=new Ext.util.DelayedTask(this.initQuery,this);if(this.typeAhead){this.taTask=new Ext.util.DelayedTask(this.onTypeAhead,this)}if(!this.enableKeyEvents){this.mon(this.el,"keyup",this.onKeyUp,this)}},onDestroy:function(){if(this.dqTask){this.dqTask.cancel();this.dqTask=null}this.bindStore(null);Ext.destroy(this.resizer,this.view,this.pageTb,this.list);Ext.destroyMembers(this,"hiddenField");Ext.form.ComboBox.superclass.onDestroy.call(this)},fireKey:function(a){if(!this.isExpanded()){Ext.form.ComboBox.superclass.fireKey.call(this,a)}},onResize:function(a,b){Ext.form.ComboBox.superclass.onResize.apply(this,arguments);if(!isNaN(a)&&this.isVisible()&&this.list){this.doResize(a)}else{this.bufferSize=a}},doResize:function(a){if(!Ext.isDefined(this.listWidth)){var b=Math.max(a,this.minListWidth);this.list.setWidth(b);this.innerList.setWidth(b-this.list.getFrameWidth("lr"))}},onEnable:function(){Ext.form.ComboBox.superclass.onEnable.apply(this,arguments);if(this.hiddenField){this.hiddenField.disabled=false}},onDisable:function(){Ext.form.ComboBox.superclass.onDisable.apply(this,arguments);if(this.hiddenField){this.hiddenField.disabled=true}},onBeforeLoad:function(){if(!this.hasFocus){return}this.innerList.update(this.loadingText?'<div class="loading-indicator">'+this.loadingText+"</div>":"");this.restrictHeight();this.selectedIndex=-1},onLoad:function(){if(!this.hasFocus){return}if(this.store.getCount()>0||this.listEmptyText){this.expand();this.restrictHeight();if(this.lastQuery==this.allQuery){if(this.editable){this.el.dom.select()}if(this.autoSelect!==false&&!this.selectByValue(this.value,true)){this.select(0,true)}}else{if(this.autoSelect!==false){this.selectNext()}if(this.typeAhead&&this.lastKey!=Ext.EventObject.BACKSPACE&&this.lastKey!=Ext.EventObject.DELETE){this.taTask.delay(this.typeAheadDelay)}}}else{this.collapse()}},onTypeAhead:function(){if(this.store.getCount()>0){var b=this.store.getAt(0);var c=b.data[this.displayField];var a=c.length;var d=this.getRawValue().length;if(d!=a){this.setRawValue(c);this.selectText(d,c.length)}}},assertValue:function(){var b=this.getRawValue(),a;if(this.valueField&&Ext.isDefined(this.value)){a=this.findRecord(this.valueField,this.value)}if(!a||a.get(this.displayField)!=b){a=this.findRecord(this.displayField,b)}if(!a&&this.forceSelection){if(b.length>0&&b!=this.emptyText){this.el.dom.value=Ext.value(this.lastSelectionText,"");this.applyEmptyText()}else{this.clearValue()}}else{if(a&&this.valueField){if(this.value==b){return}b=a.get(this.valueField||this.displayField)}this.setValue(b)}},onSelect:function(a,b){if(this.fireEvent("beforeselect",this,a,b)!==false){this.setValue(a.data[this.valueField||this.displayField]);this.collapse();this.fireEvent("select",this,a,b)}},getName:function(){var a=this.hiddenField;return a&&a.name?a.name:this.hiddenName||Ext.form.ComboBox.superclass.getName.call(this)},getValue:function(){if(this.valueField){return Ext.isDefined(this.value)?this.value:""}else{return Ext.form.ComboBox.superclass.getValue.call(this)}},clearValue:function(){if(this.hiddenField){this.hiddenField.value=""}this.setRawValue("");this.lastSelectionText="";this.applyEmptyText();this.value=""},setValue:function(a){var c=a;if(this.valueField){var b=this.findRecord(this.valueField,a);if(b){c=b.data[this.displayField]}else{if(Ext.isDefined(this.valueNotFoundText)){c=this.valueNotFoundText}}}this.lastSelectionText=c;if(this.hiddenField){this.hiddenField.value=Ext.value(a,"")}Ext.form.ComboBox.superclass.setValue.call(this,c);this.value=a;return this},findRecord:function(c,b){var a;if(this.store.getCount()>0){this.store.each(function(d){if(d.data[c]==b){a=d;return false}})}return a},onViewMove:function(b,a){this.inKeyMode=false},onViewOver:function(d,b){if(this.inKeyMode){return}var c=this.view.findItemFromChild(b);if(c){var a=this.view.indexOf(c);this.select(a,false)}},onViewClick:function(b){var a=this.view.getSelectedIndexes()[0],c=this.store,d=c.getAt(a);if(d){this.onSelect(d,a)}else{this.collapse()}if(b!==false){this.el.focus()}},restrictHeight:function(){this.innerList.dom.style.height="";var b=this.innerList.dom,e=this.list.getFrameWidth("tb")+(this.resizable?this.handleHeight:0)+this.assetHeight,c=Math.max(b.clientHeight,b.offsetHeight,b.scrollHeight),a=this.getPosition()[1]-Ext.getBody().getScroll().top,g=Ext.lib.Dom.getViewHeight()-a-this.getSize().height,d=Math.max(a,g,this.minHeight||0)-this.list.shadowOffset-e-5;c=Math.min(c,d,this.maxHeight);this.innerList.setHeight(c);this.list.beginUpdate();this.list.setHeight(c+e);this.list.alignTo.apply(this.list,[this.el].concat(this.listAlign));this.list.endUpdate()},isExpanded:function(){return this.list&&this.list.isVisible()},selectByValue:function(a,c){if(!Ext.isEmpty(a,true)){var b=this.findRecord(this.valueField||this.displayField,a);if(b){this.select(this.store.indexOf(b),c);return true}}return false},select:function(a,c){this.selectedIndex=a;this.view.select(a);if(c!==false){var b=this.view.getNode(a);if(b){this.innerList.scrollChildIntoView(b,false)}}},selectNext:function(){var a=this.store.getCount();if(a>0){if(this.selectedIndex==-1){this.select(0)}else{if(this.selectedIndex<a-1){this.select(this.selectedIndex+1)}}}},selectPrev:function(){var a=this.store.getCount();if(a>0){if(this.selectedIndex==-1){this.select(0)}else{if(this.selectedIndex!==0){this.select(this.selectedIndex-1)}}}},onKeyUp:function(b){var a=b.getKey();if(this.editable!==false&&this.readOnly!==true&&(a==b.BACKSPACE||!b.isSpecialKey())){this.lastKey=a;this.dqTask.delay(this.queryDelay)}Ext.form.ComboBox.superclass.onKeyUp.call(this,b)},validateBlur:function(){return !this.list||!this.list.isVisible()},initQuery:function(){this.doQuery(this.getRawValue())},beforeBlur:function(){this.assertValue()},postBlur:function(){Ext.form.ComboBox.superclass.postBlur.call(this);this.collapse();this.inKeyMode=false},doQuery:function(c,b){c=Ext.isEmpty(c)?"":c;var a={query:c,forceAll:b,combo:this,cancel:false};if(this.fireEvent("beforequery",a)===false||a.cancel){return false}c=a.query;b=a.forceAll;if(b===true||(c.length>=this.minChars)){if(this.lastQuery!==c){this.lastQuery=c;if(this.mode=="local"){this.selectedIndex=-1;if(b){this.store.clearFilter()}else{this.store.filter(this.displayField,c)}this.onLoad()}else{this.store.baseParams[this.queryParam]=c;this.store.load({params:this.getParams(c)});this.expand()}}else{this.selectedIndex=-1;this.onLoad()}}},getParams:function(a){var b={},c=this.store.paramNames;if(this.pageSize){b[c.start]=0;b[c.limit]=this.pageSize}return b},collapse:function(){if(!this.isExpanded()){return}this.list.hide();Ext.getDoc().un("mousewheel",this.collapseIf,this);Ext.getDoc().un("mousedown",this.collapseIf,this);this.fireEvent("collapse",this)},collapseIf:function(a){if(!this.isDestroyed&&!a.within(this.wrap)&&!a.within(this.list)){this.collapse()}},expand:function(){if(this.isExpanded()||!this.hasFocus){return}if(this.title||this.pageSize){this.assetHeight=0;if(this.title){this.assetHeight+=this.header.getHeight()}if(this.pageSize){this.assetHeight+=this.footer.getHeight()}}if(this.bufferSize){this.doResize(this.bufferSize);delete this.bufferSize}this.list.alignTo.apply(this.list,[this.el].concat(this.listAlign));this.list.setZIndex(this.getZIndex());this.list.show();if(Ext.isGecko2){this.innerList.setOverflow("auto")}this.mon(Ext.getDoc(),{scope:this,mousewheel:this.collapseIf,mousedown:this.collapseIf});this.fireEvent("expand",this)},onTriggerClick:function(){if(this.readOnly||this.disabled){return}if(this.isExpanded()){this.collapse();this.el.focus()}else{this.onFocus({});if(this.triggerAction=="all"){this.doQuery(this.allQuery,true)}else{this.doQuery(this.getRawValue())}this.el.focus()}}});Ext.reg("combo",Ext.form.ComboBox);Ext.form.Checkbox=Ext.extend(Ext.form.Field,{focusClass:undefined,fieldClass:"x-form-field",checked:false,boxLabel:"&#160;",defaultAutoCreate:{tag:"input",type:"checkbox",autocomplete:"off"},actionMode:"wrap",initComponent:function(){Ext.form.Checkbox.superclass.initComponent.call(this);this.addEvents("check")},onResize:function(){Ext.form.Checkbox.superclass.onResize.apply(this,arguments);if(!this.boxLabel&&!this.fieldLabel){this.el.alignTo(this.wrap,"c-c")}},initEvents:function(){Ext.form.Checkbox.superclass.initEvents.call(this);this.mon(this.el,{scope:this,click:this.onClick,change:this.onClick})},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,onRender:function(b,a){Ext.form.Checkbox.superclass.onRender.call(this,b,a);if(this.inputValue!==undefined){this.el.dom.value=this.inputValue}this.wrap=this.el.wrap({cls:"x-form-check-wrap"});if(this.boxLabel){this.wrap.createChild({tag:"label",htmlFor:this.el.id,cls:"x-form-cb-label",html:this.boxLabel})}if(this.checked){this.setValue(true)}else{this.checked=this.el.dom.checked}if(Ext.isIEQuirks){this.wrap.repaint()}this.resizeEl=this.positionEl=this.wrap},onDestroy:function(){Ext.destroy(this.wrap);Ext.form.Checkbox.superclass.onDestroy.call(this)},initValue:function(){this.originalValue=this.getValue()},getValue:function(){if(this.rendered){return this.el.dom.checked}return this.checked},onClick:function(){if(this.el.dom.checked!=this.checked){this.setValue(this.el.dom.checked)}},setValue:function(a){var c=this.checked,b=this.inputValue;if(a===false){this.checked=false}else{this.checked=(a===true||a==="true"||a=="1"||(b?a==b:String(a).toLowerCase()=="on"))}if(this.rendered){this.el.dom.checked=this.checked;this.el.dom.defaultChecked=this.checked}if(c!=this.checked){this.fireEvent("check",this,this.checked);if(this.handler){this.handler.call(this.scope||this,this,this.checked)}}return this}});Ext.reg("checkbox",Ext.form.Checkbox);Ext.form.CheckboxGroup=Ext.extend(Ext.form.Field,{columns:"auto",vertical:false,allowBlank:true,blankText:"You must select at least one item in this group",defaultType:"checkbox",groupCls:"x-form-check-group",initComponent:function(){this.addEvents("change");this.on("change",this.validate,this);Ext.form.CheckboxGroup.superclass.initComponent.call(this)},onRender:function(j,g){if(!this.el){var p={autoEl:{id:this.id},cls:this.groupCls,layout:"column",renderTo:j,bufferResize:false};var a={xtype:"container",defaultType:this.defaultType,layout:"form",defaults:{hideLabel:true,anchor:"100%"}};if(this.items[0].items){Ext.apply(p,{layoutConfig:{columns:this.items.length},defaults:this.defaults,items:this.items});for(var e=0,m=this.items.length;e<m;e++){Ext.applyIf(this.items[e],a)}}else{var d,n=[];if(typeof this.columns=="string"){this.columns=this.items.length}if(!Ext.isArray(this.columns)){var k=[];for(var e=0;e<this.columns;e++){k.push((100/this.columns)*0.01)}this.columns=k}d=this.columns.length;for(var e=0;e<d;e++){var b=Ext.apply({items:[]},a);b[this.columns[e]<=1?"columnWidth":"width"]=this.columns[e];if(this.defaults){b.defaults=Ext.apply(b.defaults||{},this.defaults)}n.push(b)}if(this.vertical){var r=Math.ceil(this.items.length/d),o=0;for(var e=0,m=this.items.length;e<m;e++){if(e>0&&e%r==0){o++}if(this.items[e].fieldLabel){this.items[e].hideLabel=false}n[o].items.push(this.items[e])}}else{for(var e=0,m=this.items.length;e<m;e++){var q=e%d;if(this.items[e].fieldLabel){this.items[e].hideLabel=false}n[q].items.push(this.items[e])}}Ext.apply(p,{layoutConfig:{columns:d},items:n})}this.panel=new Ext.Container(p);this.panel.ownerCt=this;this.el=this.panel.getEl();if(this.forId&&this.itemCls){var c=this.el.up(this.itemCls).child("label",true);if(c){c.setAttribute("htmlFor",this.forId)}}var h=this.panel.findBy(function(i){return i.isFormField},this);this.items=new Ext.util.MixedCollection();this.items.addAll(h)}Ext.form.CheckboxGroup.superclass.onRender.call(this,j,g)},initValue:function(){if(this.value){this.setValue.apply(this,this.buffered?this.value:[this.value]);delete this.buffered;delete this.value}},afterRender:function(){Ext.form.CheckboxGroup.superclass.afterRender.call(this);this.eachItem(function(a){a.on("check",this.fireChecked,this);a.inGroup=true})},doLayout:function(){if(this.rendered){this.panel.forceLayout=this.ownerCt.forceLayout;this.panel.doLayout()}},fireChecked:function(){var a=[];this.eachItem(function(b){if(b.checked){a.push(b)}});this.fireEvent("change",this,a)},getErrors:function(){var b=Ext.form.CheckboxGroup.superclass.getErrors.apply(this,arguments);if(!this.allowBlank){var a=true;this.eachItem(function(c){if(c.checked){return(a=false)}});if(a){b.push(this.blankText)}}return b},isDirty:function(){if(this.disabled||!this.rendered){return false}var a=false;this.eachItem(function(b){if(b.isDirty()){a=true;return false}});return a},setReadOnly:function(a){if(this.rendered){this.eachItem(function(b){b.setReadOnly(a)})}this.readOnly=a},onDisable:function(){this.eachItem(function(a){a.disable()})},onEnable:function(){this.eachItem(function(a){a.enable()})},onResize:function(a,b){this.panel.setSize(a,b);this.panel.doLayout()},reset:function(){if(this.originalValue){this.eachItem(function(a){if(a.setValue){a.setValue(false);a.originalValue=a.getValue()}});this.resetOriginal=true;this.setValue(this.originalValue);delete this.resetOriginal}else{this.eachItem(function(a){if(a.reset){a.reset()}})}(function(){this.clearInvalid()}).defer(50,this)},setValue:function(){if(this.rendered){this.onSetValue.apply(this,arguments)}else{this.buffered=true;this.value=arguments}return this},onSetValue:function(d,c){if(arguments.length==1){if(Ext.isArray(d)){Ext.each(d,function(h,e){if(Ext.isObject(h)&&h.setValue){h.setValue(true);if(this.resetOriginal===true){h.originalValue=h.getValue()}}else{var g=this.items.itemAt(e);if(g){g.setValue(h)}}},this)}else{if(Ext.isObject(d)){for(var a in d){var b=this.getBox(a);if(b){b.setValue(d[a])}}}else{this.setValueForItem(d)}}}else{var b=this.getBox(d);if(b){b.setValue(c)}}},beforeDestroy:function(){Ext.destroy(this.panel);if(!this.rendered){Ext.destroy(this.items)}Ext.form.CheckboxGroup.superclass.beforeDestroy.call(this)},setValueForItem:function(a){a=String(a).split(",");this.eachItem(function(b){if(a.indexOf(b.inputValue)>-1){b.setValue(true)}})},getBox:function(b){var a=null;this.eachItem(function(c){if(b==c||c.dataIndex==b||c.id==b||c.getName()==b){a=c;return false}});return a},getValue:function(){var a=[];this.eachItem(function(b){if(b.checked){a.push(b)}});return a},eachItem:function(b,a){if(this.items&&this.items.each){this.items.each(b,a||this)}},getRawValue:Ext.emptyFn,setRawValue:Ext.emptyFn});Ext.reg("checkboxgroup",Ext.form.CheckboxGroup);Ext.form.CompositeField=Ext.extend(Ext.form.Field,{defaultMargins:"0 5 0 0",skipLastItemMargin:true,isComposite:true,combineErrors:true,labelConnector:", ",initComponent:function(){var g=[],b=this.items,e;for(var d=0,c=b.length;d<c;d++){e=b[d];if(!Ext.isEmpty(e.ref)){e.ref="../"+e.ref}g.push(e.fieldLabel);Ext.applyIf(e,this.defaults);if(!(d==c-1&&this.skipLastItemMargin)){Ext.applyIf(e,{margins:this.defaultMargins})}}this.fieldLabel=this.fieldLabel||this.buildLabel(g);this.fieldErrors=new Ext.util.MixedCollection(true,function(h){return h.field});this.fieldErrors.on({scope:this,add:this.updateInvalidMark,remove:this.updateInvalidMark,replace:this.updateInvalidMark});Ext.form.CompositeField.superclass.initComponent.apply(this,arguments);this.innerCt=new Ext.Container({layout:"hbox",items:this.items,cls:"x-form-composite",defaultMargins:"0 3 0 0",ownerCt:this});delete this.innerCt.ownerCt;var a=this.innerCt.findBy(function(h){return h.isFormField},this);this.items=new Ext.util.MixedCollection();this.items.addAll(a)},onRender:function(c,a){if(!this.el){var d=this.innerCt;d.render(c);this.innerCt.ownerCt=this;this.el=d.getEl();if(this.combineErrors){this.eachItem(function(e){Ext.apply(e,{markInvalid:this.onFieldMarkInvalid.createDelegate(this,[e],0),clearInvalid:this.onFieldClearInvalid.createDelegate(this,[e],0)})})}var b=this.el.parent().parent().child("label",true);if(b){b.setAttribute("for",this.items.items[0].id)}}Ext.form.CompositeField.superclass.onRender.apply(this,arguments)},onFieldMarkInvalid:function(d,c){var b=d.getName(),a={field:b,errorName:d.fieldLabel||b,error:c};this.fieldErrors.replace(b,a);if(!d.preventMark){d.el.addClass(d.invalidClass)}},onFieldClearInvalid:function(a){this.fieldErrors.removeKey(a.getName());a.el.removeClass(a.invalidClass)},updateInvalidMark:function(){var a=Ext.isIE6&&Ext.isStrict;if(this.fieldErrors.length==0){this.clearInvalid();if(a){this.clearInvalid.defer(50,this)}}else{var b=this.buildCombinedErrorMessage(this.fieldErrors.items);this.sortErrors();this.markInvalid(b);if(a){this.markInvalid(b)}}},validateValue:function(c,a){var b=true;this.eachItem(function(d){if(!d.isValid(a)){b=false}});return b},buildCombinedErrorMessage:function(e){var d=[],b;for(var c=0,a=e.length;c<a;c++){b=e[c];d.push(String.format("{0}: {1}",b.errorName,b.error))}return d.join("<br />")},sortErrors:function(){var a=this.items;this.fieldErrors.sort("ASC",function(g,d){var c=function(b){return function(i){return i.getName()==b}};var h=a.findIndexBy(c(g.field)),e=a.findIndexBy(c(d.field));return h<e?-1:1})},reset:function(){this.eachItem(function(a){a.reset()});(function(){this.clearInvalid()}).defer(50,this)},clearInvalidChildren:function(){this.eachItem(function(a){a.clearInvalid()})},buildLabel:function(a){return Ext.clean(a).join(this.labelConnector)},isDirty:function(){if(this.disabled||!this.rendered){return false}var a=false;this.eachItem(function(b){if(b.isDirty()){a=true;return false}});return a},eachItem:function(b,a){if(this.items&&this.items.each){this.items.each(b,a||this)}},onResize:function(e,c,a,d){var b=this.innerCt;if(this.rendered&&b.rendered){b.setSize(e,c)}Ext.form.CompositeField.superclass.onResize.apply(this,arguments)},doLayout:function(c,b){if(this.rendered){var a=this.innerCt;a.forceLayout=this.ownerCt.forceLayout;a.doLayout(c,b)}},beforeDestroy:function(){Ext.destroy(this.innerCt);Ext.form.CompositeField.superclass.beforeDestroy.call(this)},setReadOnly:function(a){if(a==undefined){a=true}a=!!a;if(this.rendered){this.eachItem(function(b){b.setReadOnly(a)})}this.readOnly=a},onShow:function(){Ext.form.CompositeField.superclass.onShow.call(this);this.doLayout()},onDisable:function(){this.eachItem(function(a){a.disable()})},onEnable:function(){this.eachItem(function(a){a.enable()})}});Ext.reg("compositefield",Ext.form.CompositeField);Ext.form.Radio=Ext.extend(Ext.form.Checkbox,{inputType:"radio",markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,getGroupValue:function(){var a=this.el.up("form")||Ext.getBody();var b=a.child('input[name="'+this.el.dom.name+'"]:checked',true);return b?b.value:null},setValue:function(b){var a,d,c;if(typeof b=="boolean"){Ext.form.Radio.superclass.setValue.call(this,b)}else{if(this.rendered){a=this.getCheckEl();c=a.child('input[name="'+this.el.dom.name+'"][value="'+b+'"]',true);if(c){Ext.getCmp(c.id).setValue(true)}}}if(this.rendered&&this.checked){a=a||this.getCheckEl();d=this.getCheckEl().select('input[name="'+this.el.dom.name+'"]');d.each(function(e){if(e.dom.id!=this.id){Ext.getCmp(e.dom.id).setValue(false)}},this)}return this},getCheckEl:function(){if(this.inGroup){return this.el.up(".x-form-radio-group")}return this.el.up("form")||Ext.getBody()}});Ext.reg("radio",Ext.form.Radio);Ext.form.RadioGroup=Ext.extend(Ext.form.CheckboxGroup,{allowBlank:true,blankText:"You must select one item in this group",defaultType:"radio",groupCls:"x-form-radio-group",getValue:function(){var a=null;this.eachItem(function(b){if(b.checked){a=b;return false}});return a},onSetValue:function(c,b){if(arguments.length>1){var a=this.getBox(c);if(a){a.setValue(b);if(a.checked){this.eachItem(function(d){if(d!==a){d.setValue(false)}})}}}else{this.setValueForItem(c)}},setValueForItem:function(a){a=String(a).split(",")[0];this.eachItem(function(b){b.setValue(a==b.inputValue)})},fireChecked:function(){if(!this.checkTask){this.checkTask=new Ext.util.DelayedTask(this.bufferChecked,this)}this.checkTask.delay(10)},bufferChecked:function(){var a=null;this.eachItem(function(b){if(b.checked){a=b;return false}});this.fireEvent("change",this,a)},onDestroy:function(){if(this.checkTask){this.checkTask.cancel();this.checkTask=null}Ext.form.RadioGroup.superclass.onDestroy.call(this)}});Ext.reg("radiogroup",Ext.form.RadioGroup);Ext.form.Hidden=Ext.extend(Ext.form.Field,{inputType:"hidden",shouldLayout:false,onRender:function(){Ext.form.Hidden.superclass.onRender.apply(this,arguments)},initEvents:function(){this.originalValue=this.getValue()},setSize:Ext.emptyFn,setWidth:Ext.emptyFn,setHeight:Ext.emptyFn,setPosition:Ext.emptyFn,setPagePosition:Ext.emptyFn,markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn});Ext.reg("hidden",Ext.form.Hidden);Ext.form.BasicForm=Ext.extend(Ext.util.Observable,{constructor:function(b,a){Ext.apply(this,a);if(Ext.isString(this.paramOrder)){this.paramOrder=this.paramOrder.split(/[\s,|]/)}this.items=new Ext.util.MixedCollection(false,function(c){return c.getItemId()});this.addEvents("beforeaction","actionfailed","actioncomplete");if(b){this.initEl(b)}Ext.form.BasicForm.superclass.constructor.call(this)},timeout:30,paramOrder:undefined,paramsAsHash:false,waitTitle:"Please Wait...",activeAction:null,trackResetOnLoad:false,initEl:function(a){this.el=Ext.get(a);this.id=this.el.id||Ext.id();if(!this.standardSubmit){this.el.on("submit",this.onSubmit,this)}this.el.addClass("x-form")},getEl:function(){return this.el},onSubmit:function(a){a.stopEvent()},destroy:function(a){if(a!==true){this.items.each(function(b){Ext.destroy(b)});Ext.destroy(this.el)}this.items.clear();this.purgeListeners()},isValid:function(){var a=true;this.items.each(function(b){if(!b.validate()){a=false}});return a},isDirty:function(){var a=false;this.items.each(function(b){if(b.isDirty()){a=true;return false}});return a},doAction:function(b,a){if(Ext.isString(b)){b=new Ext.form.Action.ACTION_TYPES[b](this,a)}if(this.fireEvent("beforeaction",this,b)!==false){this.beforeAction(b);b.run.defer(100,b)}return this},submit:function(b){b=b||{};if(this.standardSubmit){var a=b.clientValidation===false||this.isValid();if(a){var c=this.el.dom;if(this.url&&Ext.isEmpty(c.action)){c.action=this.url}c.submit()}return a}var d=String.format("{0}submit",this.api?"direct":"");this.doAction(d,b);return this},load:function(a){var b=String.format("{0}load",this.api?"direct":"");this.doAction(b,a);return this},updateRecord:function(b){b.beginEdit();var a=b.fields,d,c;a.each(function(e){d=this.findField(e.name);if(d){c=d.getValue();if(Ext.type(c)!==false&&c.getGroupValue){c=c.getGroupValue()}else{if(d.eachItem){c=[];d.eachItem(function(g){c.push(g.getValue())})}}b.set(e.name,c)}},this);b.endEdit();return this},loadRecord:function(a){this.setValues(a.data);return this},beforeAction:function(a){this.items.each(function(c){if(c.isFormField&&c.syncValue){c.syncValue()}});var b=a.options;if(b.waitMsg){if(this.waitMsgTarget===true){this.el.mask(b.waitMsg,"x-mask-loading")}else{if(this.waitMsgTarget){this.waitMsgTarget=Ext.get(this.waitMsgTarget);this.waitMsgTarget.mask(b.waitMsg,"x-mask-loading")}else{Ext.MessageBox.wait(b.waitMsg,b.waitTitle||this.waitTitle)}}}},afterAction:function(a,c){this.activeAction=null;var b=a.options;if(b.waitMsg){if(this.waitMsgTarget===true){this.el.unmask()}else{if(this.waitMsgTarget){this.waitMsgTarget.unmask()}else{Ext.MessageBox.updateProgress(1);Ext.MessageBox.hide()}}}if(c){if(b.reset){this.reset()}Ext.callback(b.success,b.scope,[this,a]);this.fireEvent("actioncomplete",this,a)}else{Ext.callback(b.failure,b.scope,[this,a]);this.fireEvent("actionfailed",this,a)}},findField:function(c){var b=this.items.get(c);if(!Ext.isObject(b)){var a=function(d){if(d.isFormField){if(d.dataIndex==c||d.id==c||d.getName()==c){b=d;return false}else{if(d.isComposite){return d.items.each(a)}else{if(d instanceof Ext.form.CheckboxGroup&&d.rendered){return d.eachItem(a)}}}}};this.items.each(a)}return b||null},markInvalid:function(h){if(Ext.isArray(h)){for(var c=0,a=h.length;c<a;c++){var b=h[c];var d=this.findField(b.id);if(d){d.markInvalid(b.msg)}}}else{var e,g;for(g in h){if(!Ext.isFunction(h[g])&&(e=this.findField(g))){e.markInvalid(h[g])}}}return this},setValues:function(c){if(Ext.isArray(c)){for(var d=0,a=c.length;d<a;d++){var b=c[d];var e=this.findField(b.id);if(e){e.setValue(b.value);if(this.trackResetOnLoad){e.originalValue=e.getValue()}}}}else{var g,h;for(h in c){if(!Ext.isFunction(c[h])&&(g=this.findField(h))){g.setValue(c[h]);if(this.trackResetOnLoad){g.originalValue=g.getValue()}}}}return this},getValues:function(b){var a=Ext.lib.Ajax.serializeForm(this.el.dom);if(b===true){return a}return Ext.urlDecode(a)},getFieldValues:function(a){var d={},e,b,c;this.items.each(function(g){if(!g.disabled&&(a!==true||g.isDirty())){e=g.getName();b=d[e];c=g.getValue();if(Ext.isDefined(b)){if(Ext.isArray(b)){d[e].push(c)}else{d[e]=[b,c]}}else{d[e]=c}}});return d},clearInvalid:function(){this.items.each(function(a){a.clearInvalid()});return this},reset:function(){this.items.each(function(a){a.reset()});return this},add:function(){this.items.addAll(Array.prototype.slice.call(arguments,0));return this},remove:function(a){this.items.remove(a);return this},cleanDestroyed:function(){this.items.filterBy(function(a){return !!a.isDestroyed}).each(this.remove,this)},render:function(){this.items.each(function(a){if(a.isFormField&&!a.rendered&&document.getElementById(a.id)){a.applyToMarkup(a.id)}});return this},applyToFields:function(a){this.items.each(function(b){Ext.apply(b,a)});return this},applyIfToFields:function(a){this.items.each(function(b){Ext.applyIf(b,a)});return this},callFieldMethod:function(b,a){a=a||[];this.items.each(function(c){if(Ext.isFunction(c[b])){c[b].apply(c,a)}});return this}});Ext.BasicForm=Ext.form.BasicForm;Ext.FormPanel=Ext.extend(Ext.Panel,{minButtonWidth:75,labelAlign:"left",monitorValid:false,monitorPoll:200,layout:"form",initComponent:function(){this.form=this.createForm();Ext.FormPanel.superclass.initComponent.call(this);this.bodyCfg={tag:"form",cls:this.baseCls+"-body",method:this.method||"POST",id:this.formId||Ext.id()};if(this.fileUpload){this.bodyCfg.enctype="multipart/form-data"}this.initItems();this.addEvents("clientvalidation");this.relayEvents(this.form,["beforeaction","actionfailed","actioncomplete"])},createForm:function(){var a=Ext.applyIf({listeners:{}},this.initialConfig);return new Ext.form.BasicForm(null,a)},initFields:function(){var c=this.form;var a=this;var b=function(d){if(a.isField(d)){c.add(d)}else{if(d.findBy&&d!=a){a.applySettings(d);if(d.items&&d.items.each){d.items.each(b,this)}}}};this.items.each(b,this)},applySettings:function(b){var a=b.ownerCt;Ext.applyIf(b,{labelAlign:a.labelAlign,labelWidth:a.labelWidth,itemCls:a.itemCls})},getLayoutTarget:function(){return this.form.el},getForm:function(){return this.form},onRender:function(b,a){this.initFields();Ext.FormPanel.superclass.onRender.call(this,b,a);this.form.initEl(this.body)},beforeDestroy:function(){this.stopMonitoring();this.form.destroy(true);Ext.FormPanel.superclass.beforeDestroy.call(this)},isField:function(a){return !!a.setValue&&!!a.getValue&&!!a.markInvalid&&!!a.clearInvalid},initEvents:function(){Ext.FormPanel.superclass.initEvents.call(this);this.on({scope:this,add:this.onAddEvent,remove:this.onRemoveEvent});if(this.monitorValid){this.startMonitoring()}},onAdd:function(a){Ext.FormPanel.superclass.onAdd.call(this,a);this.processAdd(a)},onAddEvent:function(a,b){if(a!==this){this.processAdd(b)}},processAdd:function(a){if(this.isField(a)){this.form.add(a)}else{if(a.findBy){this.applySettings(a);this.form.add.apply(this.form,a.findBy(this.isField))}}},onRemove:function(a){Ext.FormPanel.superclass.onRemove.call(this,a);this.processRemove(a)},onRemoveEvent:function(a,b){if(a!==this){this.processRemove(b)}},processRemove:function(a){if(!this.destroying){if(this.isField(a)){this.form.remove(a)}else{if(a.findBy){Ext.each(a.findBy(this.isField),this.form.remove,this.form);this.form.cleanDestroyed()}}}},startMonitoring:function(){if(!this.validTask){this.validTask=new Ext.util.TaskRunner();this.validTask.start({run:this.bindHandler,interval:this.monitorPoll||200,scope:this})}},stopMonitoring:function(){if(this.validTask){this.validTask.stopAll();this.validTask=null}},load:function(){this.form.load.apply(this.form,arguments)},onDisable:function(){Ext.FormPanel.superclass.onDisable.call(this);if(this.form){this.form.items.each(function(){this.disable()})}},onEnable:function(){Ext.FormPanel.superclass.onEnable.call(this);if(this.form){this.form.items.each(function(){this.enable()})}},bindHandler:function(){var e=true;this.form.items.each(function(g){if(!g.isValid(true)){e=false;return false}});if(this.fbar){var b=this.fbar.items.items;for(var d=0,a=b.length;d<a;d++){var c=b[d];if(c.formBind===true&&c.disabled===e){c.setDisabled(!e)}}}this.fireEvent("clientvalidation",this,e)}});Ext.reg("form",Ext.FormPanel);Ext.form.FormPanel=Ext.FormPanel;Ext.form.FieldSet=Ext.extend(Ext.Panel,{baseCls:"x-fieldset",layout:"form",animCollapse:false,onRender:function(b,a){if(!this.el){this.el=document.createElement("fieldset");this.el.id=this.id;if(this.title||this.header||this.checkboxToggle){this.el.appendChild(document.createElement("legend")).className=this.baseCls+"-header"}}Ext.form.FieldSet.superclass.onRender.call(this,b,a);if(this.checkboxToggle){var c=typeof this.checkboxToggle=="object"?this.checkboxToggle:{tag:"input",type:"checkbox",name:this.checkboxName||this.id+"-checkbox"};this.checkbox=this.header.insertFirst(c);this.checkbox.dom.checked=!this.collapsed;this.mon(this.checkbox,"click",this.onCheckClick,this)}},onCollapse:function(a,b){if(this.checkbox){this.checkbox.dom.checked=false}Ext.form.FieldSet.superclass.onCollapse.call(this,a,b)},onExpand:function(a,b){if(this.checkbox){this.checkbox.dom.checked=true}Ext.form.FieldSet.superclass.onExpand.call(this,a,b)},onCheckClick:function(){this[this.checkbox.dom.checked?"expand":"collapse"]()}});Ext.reg("fieldset",Ext.form.FieldSet);Ext.form.HtmlEditor=Ext.extend(Ext.form.Field,{enableFormat:true,enableFontSize:true,enableColors:true,enableAlignments:true,enableLists:true,enableSourceEdit:true,enableLinks:true,enableFont:true,createLinkText:"Please enter the URL for the link:",defaultLinkValue:"http://",fontFamilies:["Arial","Courier New","Tahoma","Times New Roman","Verdana"],defaultFont:"tahoma",defaultValue:(Ext.isOpera||Ext.isIE6)?"&#160;":"&#8203;",actionMode:"wrap",validationEvent:false,deferHeight:true,initialized:false,activated:false,sourceEditMode:false,onFocus:Ext.emptyFn,iframePad:3,hideMode:"offsets",defaultAutoCreate:{tag:"textarea",style:"width:500px;height:300px;",autocomplete:"off"},initComponent:function(){this.addEvents("initialize","activate","beforesync","beforepush","sync","push","editmodechange");Ext.form.HtmlEditor.superclass.initComponent.call(this)},createFontOptions:function(){var d=[],b=this.fontFamilies,c,g;for(var e=0,a=b.length;e<a;e++){c=b[e];g=c.toLowerCase();d.push('<option value="',g,'" style="font-family:',c,';"',(this.defaultFont==g?' selected="true">':">"),c,"</option>")}return d.join("")},createToolbar:function(e){var c=[];var a=Ext.QuickTips&&Ext.QuickTips.isEnabled();function d(j,h,i){return{itemId:j,cls:"x-btn-icon",iconCls:"x-edit-"+j,enableToggle:h!==false,scope:e,handler:i||e.relayBtnCmd,clickEvent:"mousedown",tooltip:a?e.buttonTips[j]||undefined:undefined,overflowText:e.buttonTips[j].title||undefined,tabIndex:-1}}if(this.enableFont&&!Ext.isSafari2){var g=new Ext.Toolbar.Item({autoEl:{tag:"select",cls:"x-font-select",html:this.createFontOptions()}});c.push(g,"-")}if(this.enableFormat){c.push(d("bold"),d("italic"),d("underline"))}if(this.enableFontSize){c.push("-",d("increasefontsize",false,this.adjustFont),d("decreasefontsize",false,this.adjustFont))}if(this.enableColors){c.push("-",{itemId:"forecolor",cls:"x-btn-icon",iconCls:"x-edit-forecolor",clickEvent:"mousedown",tooltip:a?e.buttonTips.forecolor||undefined:undefined,tabIndex:-1,menu:new Ext.menu.ColorMenu({allowReselect:true,focus:Ext.emptyFn,value:"000000",plain:true,listeners:{scope:this,select:function(i,h){this.execCmd("forecolor",Ext.isWebKit||Ext.isIE?"#"+h:h);this.deferFocus()}},clickEvent:"mousedown"})},{itemId:"backcolor",cls:"x-btn-icon",iconCls:"x-edit-backcolor",clickEvent:"mousedown",tooltip:a?e.buttonTips.backcolor||undefined:undefined,tabIndex:-1,menu:new Ext.menu.ColorMenu({focus:Ext.emptyFn,value:"FFFFFF",plain:true,allowReselect:true,listeners:{scope:this,select:function(i,h){if(Ext.isGecko){this.execCmd("useCSS",false);this.execCmd("hilitecolor",h);this.execCmd("useCSS",true);this.deferFocus()}else{this.execCmd(Ext.isOpera?"hilitecolor":"backcolor",Ext.isWebKit||Ext.isIE?"#"+h:h);this.deferFocus()}}},clickEvent:"mousedown"})})}if(this.enableAlignments){c.push("-",d("justifyleft"),d("justifycenter"),d("justifyright"))}if(!Ext.isSafari2){if(this.enableLinks){c.push("-",d("createlink",false,this.createLink))}if(this.enableLists){c.push("-",d("insertorderedlist"),d("insertunorderedlist"))}if(this.enableSourceEdit){c.push("-",d("sourceedit",true,function(h){this.toggleSourceEdit(!this.sourceEditMode)}))}}var b=new Ext.Toolbar({renderTo:this.wrap.dom.firstChild,items:c});if(g){this.fontSelect=g.el;this.mon(this.fontSelect,"change",function(){var h=this.fontSelect.dom.value;this.relayCmd("fontname",h);this.deferFocus()},this)}this.mon(b.el,"click",function(h){h.preventDefault()});this.tb=b;this.tb.doLayout()},onDisable:function(){this.wrap.mask();Ext.form.HtmlEditor.superclass.onDisable.call(this)},onEnable:function(){this.wrap.unmask();Ext.form.HtmlEditor.superclass.onEnable.call(this)},setReadOnly:function(b){Ext.form.HtmlEditor.superclass.setReadOnly.call(this,b);if(this.initialized){if(Ext.isIE){this.getEditorBody().contentEditable=!b}else{this.setDesignMode(!b)}var a=this.getEditorBody();if(a){a.style.cursor=this.readOnly?"default":"text"}this.disableItems(b)}},getDocMarkup:function(){var a=Ext.fly(this.iframe).getHeight()-this.iframePad*2;return String.format('<html><head><style type="text/css">body{border: 0; margin: 0; padding: {0}px; height: {1}px; cursor: text}</style></head><body></body></html>',this.iframePad,a)},getEditorBody:function(){var a=this.getDoc();return a.body||a.documentElement},getDoc:function(){return Ext.isIE?this.getWin().document:(this.iframe.contentDocument||this.getWin().document)},getWin:function(){return Ext.isIE?this.iframe.contentWindow:window.frames[this.iframe.name]},onRender:function(b,a){Ext.form.HtmlEditor.superclass.onRender.call(this,b,a);this.el.dom.style.border="0 none";this.el.dom.setAttribute("tabIndex",-1);this.el.addClass("x-hidden");if(Ext.isIE){this.el.applyStyles("margin-top:-1px;margin-bottom:-1px;")}this.wrap=this.el.wrap({cls:"x-html-editor-wrap",cn:{cls:"x-html-editor-tb"}});this.createToolbar(this);this.disableItems(true);this.tb.doLayout();this.createIFrame();if(!this.width){var c=this.el.getSize();this.setSize(c.width,this.height||c.height)}this.resizeEl=this.positionEl=this.wrap},createIFrame:function(){var a=document.createElement("iframe");a.name=Ext.id();a.frameBorder="0";a.style.overflow="auto";a.src=Ext.SSL_SECURE_URL;this.wrap.dom.appendChild(a);this.iframe=a;this.monitorTask=Ext.TaskMgr.start({run:this.checkDesignMode,scope:this,interval:100})},initFrame:function(){Ext.TaskMgr.stop(this.monitorTask);var a=this.getDoc();this.win=this.getWin();a.open();a.write(this.getDocMarkup());a.close();this.readyTask={run:function(){var b=this.getDoc();if(b.body||b.readyState=="complete"){Ext.TaskMgr.stop(this.readyTask);this.setDesignMode(true);this.initEditor.defer(10,this)}},interval:10,duration:10000,scope:this};Ext.TaskMgr.start(this.readyTask)},checkDesignMode:function(){if(this.wrap&&this.wrap.dom.offsetWidth){var a=this.getDoc();if(!a){return}if(!a.editorInitialized||this.getDesignMode()!="on"){this.initFrame()}}},setDesignMode:function(b){var a=this.getDoc();if(a){if(this.readOnly){b=false}a.designMode=(/on|true/i).test(String(b).toLowerCase())?"on":"off"}},getDesignMode:function(){var a=this.getDoc();if(!a){return""}return String(a.designMode).toLowerCase()},disableItems:function(a){if(this.fontSelect){this.fontSelect.dom.disabled=a}this.tb.items.each(function(b){if(b.getItemId()!="sourceedit"){b.setDisabled(a)}})},onResize:function(b,c){Ext.form.HtmlEditor.superclass.onResize.apply(this,arguments);if(this.el&&this.iframe){if(Ext.isNumber(b)){var e=b-this.wrap.getFrameWidth("lr");this.el.setWidth(e);this.tb.setWidth(e);this.iframe.style.width=Math.max(e,0)+"px"}if(Ext.isNumber(c)){var a=c-this.wrap.getFrameWidth("tb")-this.tb.el.getHeight();this.el.setHeight(a);this.iframe.style.height=Math.max(a,0)+"px";var d=this.getEditorBody();if(d){d.style.height=Math.max((a-(this.iframePad*2)),0)+"px"}}}},toggleSourceEdit:function(b){var d,a;if(b===undefined){b=!this.sourceEditMode}this.sourceEditMode=b===true;var c=this.tb.getComponent("sourceedit");if(c.pressed!==this.sourceEditMode){c.toggle(this.sourceEditMode);if(!c.xtbHidden){return}}if(this.sourceEditMode){this.previousSize=this.getSize();d=Ext.get(this.iframe).getHeight();this.disableItems(true);this.syncValue();this.iframe.className="x-hidden";this.el.removeClass("x-hidden");this.el.dom.removeAttribute("tabIndex");this.el.focus();this.el.dom.style.height=d+"px"}else{a=parseInt(this.el.dom.style.height,10);if(this.initialized){this.disableItems(this.readOnly)}this.pushValue();this.iframe.className="";this.el.addClass("x-hidden");this.el.dom.setAttribute("tabIndex",-1);this.deferFocus();this.setSize(this.previousSize);delete this.previousSize;this.iframe.style.height=a+"px"}this.fireEvent("editmodechange",this,this.sourceEditMode)},createLink:function(){var a=prompt(this.createLinkText,this.defaultLinkValue);if(a&&a!="http://"){this.relayCmd("createlink",a)}},initEvents:function(){this.originalValue=this.getValue()},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,setValue:function(a){Ext.form.HtmlEditor.superclass.setValue.call(this,a);this.pushValue();return this},cleanHtml:function(a){a=String(a);if(Ext.isWebKit){a=a.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi,"")}if(a.charCodeAt(0)==this.defaultValue.replace(/\D/g,"")){a=a.substring(1)}return a},syncValue:function(){if(this.initialized){var d=this.getEditorBody();var c=d.innerHTML;if(Ext.isWebKit){var b=d.getAttribute("style");var a=b.match(/text-align:(.*?);/i);if(a&&a[1]){c='<div style="'+a[0]+'">'+c+"</div>"}}c=this.cleanHtml(c);if(this.fireEvent("beforesync",this,c)!==false){this.el.dom.value=c;this.fireEvent("sync",this,c)}}},getValue:function(){this[this.sourceEditMode?"pushValue":"syncValue"]();return Ext.form.HtmlEditor.superclass.getValue.call(this)},pushValue:function(){if(this.initialized){var a=this.el.dom.value;if(!this.activated&&a.length<1){a=this.defaultValue}if(this.fireEvent("beforepush",this,a)!==false){this.getEditorBody().innerHTML=a;if(Ext.isGecko){this.setDesignMode(false);this.setDesignMode(true)}this.fireEvent("push",this,a)}}},deferFocus:function(){this.focus.defer(10,this)},focus:function(){if(this.win&&!this.sourceEditMode){this.win.focus()}else{this.el.focus()}},initEditor:function(){try{var c=this.getEditorBody(),a=this.el.getStyles("font-size","font-family","background-image","background-repeat","background-color","color"),g,b;a["background-attachment"]="fixed";c.bgProperties="fixed";Ext.DomHelper.applyStyles(c,a);g=this.getDoc();if(g){try{Ext.EventManager.removeAll(g)}catch(d){}}b=this.onEditorEvent.createDelegate(this);Ext.EventManager.on(g,{mousedown:b,dblclick:b,click:b,keyup:b,buffer:100});if(Ext.isGecko){Ext.EventManager.on(g,"keypress",this.applyCommand,this)}if(Ext.isIE||Ext.isWebKit||Ext.isOpera){Ext.EventManager.on(g,"keydown",this.fixKeys,this)}g.editorInitialized=true;this.initialized=true;this.pushValue();this.setReadOnly(this.readOnly);this.fireEvent("initialize",this)}catch(d){}},beforeDestroy:function(){if(this.monitorTask){Ext.TaskMgr.stop(this.monitorTask)}if(this.readyTask){Ext.TaskMgr.stop(this.readyTask)}if(this.rendered){Ext.destroy(this.tb);var b=this.getDoc();Ext.EventManager.removeFromSpecialCache(b);if(b){try{Ext.EventManager.removeAll(b);for(var c in b){delete b[c]}}catch(a){}}if(this.wrap){this.wrap.dom.innerHTML="";this.wrap.remove()}}Ext.form.HtmlEditor.superclass.beforeDestroy.call(this)},onFirstFocus:function(){this.activated=true;this.disableItems(this.readOnly);if(Ext.isGecko){this.win.focus();var a=this.win.getSelection();if(!a.focusNode||a.focusNode.nodeType!=3){var b=a.getRangeAt(0);b.selectNodeContents(this.getEditorBody());b.collapse(true);this.deferFocus()}try{this.execCmd("useCSS",true);this.execCmd("styleWithCSS",false)}catch(c){}}this.fireEvent("activate",this)},adjustFont:function(b){var d=b.getItemId()=="increasefontsize"?1:-1,c=this.getDoc(),a=parseInt(c.queryCommandValue("FontSize")||2,10);if((Ext.isSafari&&!Ext.isSafari2)||Ext.isChrome||Ext.isAir){if(a<=10){a=1+d}else{if(a<=13){a=2+d}else{if(a<=16){a=3+d}else{if(a<=18){a=4+d}else{if(a<=24){a=5+d}else{a=6+d}}}}}a=a.constrain(1,6)}else{if(Ext.isSafari){d*=2}a=Math.max(1,a+d)+(Ext.isSafari?"px":0)}this.execCmd("FontSize",a)},onEditorEvent:function(a){this.updateToolbar()},updateToolbar:function(){if(this.readOnly){return}if(!this.activated){this.onFirstFocus();return}var b=this.tb.items.map,c=this.getDoc();if(this.enableFont&&!Ext.isSafari2){var a=(c.queryCommandValue("FontName")||this.defaultFont).toLowerCase();if(a!=this.fontSelect.dom.value){this.fontSelect.dom.value=a}}if(this.enableFormat){b.bold.toggle(c.queryCommandState("bold"));b.italic.toggle(c.queryCommandState("italic"));b.underline.toggle(c.queryCommandState("underline"))}if(this.enableAlignments){b.justifyleft.toggle(c.queryCommandState("justifyleft"));b.justifycenter.toggle(c.queryCommandState("justifycenter"));b.justifyright.toggle(c.queryCommandState("justifyright"))}if(!Ext.isSafari2&&this.enableLists){b.insertorderedlist.toggle(c.queryCommandState("insertorderedlist"));b.insertunorderedlist.toggle(c.queryCommandState("insertunorderedlist"))}Ext.menu.MenuMgr.hideAll();this.syncValue()},relayBtnCmd:function(a){this.relayCmd(a.getItemId())},relayCmd:function(b,a){(function(){this.focus();this.execCmd(b,a);this.updateToolbar()}).defer(10,this)},execCmd:function(b,a){var c=this.getDoc();c.execCommand(b,false,a===undefined?null:a);this.syncValue()},applyCommand:function(b){if(b.ctrlKey){var d=b.getCharCode(),a;if(d>0){d=String.fromCharCode(d);switch(d){case"b":a="bold";break;case"i":a="italic";break;case"u":a="underline";break}if(a){this.win.focus();this.execCmd(a);this.deferFocus();b.preventDefault()}}}},insertAtCursor:function(c){if(!this.activated){return}if(Ext.isIE){this.win.focus();var b=this.getDoc(),a=b.selection.createRange();if(a){a.pasteHTML(c);this.syncValue();this.deferFocus()}}else{this.win.focus();this.execCmd("InsertHTML",c);this.deferFocus()}},fixKeys:function(){if(Ext.isIE){return function(g){var a=g.getKey(),d=this.getDoc(),b;if(a==g.TAB){g.stopEvent();b=d.selection.createRange();if(b){b.collapse(true);b.pasteHTML("&nbsp;&nbsp;&nbsp;&nbsp;");this.deferFocus()}}else{if(a==g.ENTER){b=d.selection.createRange();if(b){var c=b.parentElement();if(!c||c.tagName.toLowerCase()!="li"){g.stopEvent();b.pasteHTML("<br />");b.collapse(false);b.select()}}}}}}else{if(Ext.isOpera){return function(b){var a=b.getKey();if(a==b.TAB){b.stopEvent();this.win.focus();this.execCmd("InsertHTML","&nbsp;&nbsp;&nbsp;&nbsp;");this.deferFocus()}}}else{if(Ext.isWebKit){return function(b){var a=b.getKey();if(a==b.TAB){b.stopEvent();this.execCmd("InsertText","\t");this.deferFocus()}else{if(a==b.ENTER){b.stopEvent();this.execCmd("InsertHtml","<br /><br />");this.deferFocus()}}}}}}}(),getToolbar:function(){return this.tb},buttonTips:{bold:{title:"Bold (Ctrl+B)",text:"Make the selected text bold.",cls:"x-html-editor-tip"},italic:{title:"Italic (Ctrl+I)",text:"Make the selected text italic.",cls:"x-html-editor-tip"},underline:{title:"Underline (Ctrl+U)",text:"Underline the selected text.",cls:"x-html-editor-tip"},increasefontsize:{title:"Grow Text",text:"Increase the font size.",cls:"x-html-editor-tip"},decreasefontsize:{title:"Shrink Text",text:"Decrease the font size.",cls:"x-html-editor-tip"},backcolor:{title:"Text Highlight Color",text:"Change the background color of the selected text.",cls:"x-html-editor-tip"},forecolor:{title:"Font Color",text:"Change the color of the selected text.",cls:"x-html-editor-tip"},justifyleft:{title:"Align Text Left",text:"Align text to the left.",cls:"x-html-editor-tip"},justifycenter:{title:"Center Text",text:"Center text in the editor.",cls:"x-html-editor-tip"},justifyright:{title:"Align Text Right",text:"Align text to the right.",cls:"x-html-editor-tip"},insertunorderedlist:{title:"Bullet List",text:"Start a bulleted list.",cls:"x-html-editor-tip"},insertorderedlist:{title:"Numbered List",text:"Start a numbered list.",cls:"x-html-editor-tip"},createlink:{title:"Hyperlink",text:"Make the selected text a hyperlink.",cls:"x-html-editor-tip"},sourceedit:{title:"Source Edit",text:"Switch to source editing mode.",cls:"x-html-editor-tip"}}});Ext.reg("htmleditor",Ext.form.HtmlEditor);Ext.form.TimeField=Ext.extend(Ext.form.ComboBox,{minValue:undefined,maxValue:undefined,minText:"The time in this field must be equal to or after {0}",maxText:"The time in this field must be equal to or before {0}",invalidText:"{0} is not a valid time",format:"g:i A",altFormats:"g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H|gi a|hi a|giA|hiA|gi A|hi A",increment:15,mode:"local",triggerAction:"all",typeAhead:false,initDate:"1/1/2008",initDateFormat:"j/n/Y",initComponent:function(){if(Ext.isDefined(this.minValue)){this.setMinValue(this.minValue,true)}if(Ext.isDefined(this.maxValue)){this.setMaxValue(this.maxValue,true)}if(!this.store){this.generateStore(true)}Ext.form.TimeField.superclass.initComponent.call(this)},setMinValue:function(b,a){this.setLimit(b,true,a);return this},setMaxValue:function(b,a){this.setLimit(b,false,a);return this},generateStore:function(b){var c=this.minValue||new Date(this.initDate).clearTime(),a=this.maxValue||new Date(this.initDate).clearTime().add("mi",(24*60)-1),d=[];while(c<=a){d.push(c.dateFormat(this.format));c=c.add("mi",this.increment)}this.bindStore(d,b)},setLimit:function(b,g,a){var e;if(Ext.isString(b)){e=this.parseDate(b)}else{if(Ext.isDate(b)){e=b}}if(e){var c=new Date(this.initDate).clearTime();c.setHours(e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds());this[g?"minValue":"maxValue"]=c;if(!a){this.generateStore()}}},getValue:function(){var a=Ext.form.TimeField.superclass.getValue.call(this);return this.formatDate(this.parseDate(a))||""},setValue:function(a){return Ext.form.TimeField.superclass.setValue.call(this,this.formatDate(this.parseDate(a)))},validateValue:Ext.form.DateField.prototype.validateValue,formatDate:Ext.form.DateField.prototype.formatDate,parseDate:function(h){if(!h||Ext.isDate(h)){return h}var j=this.initDate+" ",g=this.initDateFormat+" ",b=Date.parseDate(j+h,g+this.format),c=this.altFormats;if(!b&&c){if(!this.altFormatsArray){this.altFormatsArray=c.split("|")}for(var e=0,d=this.altFormatsArray,a=d.length;e<a&&!b;e++){b=Date.parseDate(j+h,g+d[e])}}return b}});Ext.reg("timefield",Ext.form.TimeField);Ext.form.SliderField=Ext.extend(Ext.form.Field,{useTips:true,tipText:null,actionMode:"wrap",initComponent:function(){var b=Ext.copyTo({id:this.id+"-slider"},this.initialConfig,["vertical","minValue","maxValue","decimalPrecision","keyIncrement","increment","clickToChange","animate"]);if(this.useTips){var a=this.tipText?{getText:this.tipText}:{};b.plugins=[new Ext.slider.Tip(a)]}this.slider=new Ext.Slider(b);Ext.form.SliderField.superclass.initComponent.call(this)},onRender:function(b,a){this.autoCreate={id:this.id,name:this.name,type:"hidden",tag:"input"};Ext.form.SliderField.superclass.onRender.call(this,b,a);this.wrap=this.el.wrap({cls:"x-form-field-wrap"});this.resizeEl=this.positionEl=this.wrap;this.slider.render(this.wrap)},onResize:function(b,c,d,a){Ext.form.SliderField.superclass.onResize.call(this,b,c,d,a);this.slider.setSize(b,c)},initEvents:function(){Ext.form.SliderField.superclass.initEvents.call(this);this.slider.on("change",this.onChange,this)},onChange:function(b,a){this.setValue(a,undefined,true)},onEnable:function(){Ext.form.SliderField.superclass.onEnable.call(this);this.slider.enable()},onDisable:function(){Ext.form.SliderField.superclass.onDisable.call(this);this.slider.disable()},beforeDestroy:function(){Ext.destroy(this.slider);Ext.form.SliderField.superclass.beforeDestroy.call(this)},alignErrorIcon:function(){this.errorIcon.alignTo(this.slider.el,"tl-tr",[2,0])},setMinValue:function(a){this.slider.setMinValue(a);return this},setMaxValue:function(a){this.slider.setMaxValue(a);return this},setValue:function(c,b,a){if(!a){this.slider.setValue(c,b)}return Ext.form.SliderField.superclass.setValue.call(this,this.slider.getValue())},getValue:function(){return this.slider.getValue()}});Ext.reg("sliderfield",Ext.form.SliderField);Ext.form.Label=Ext.extend(Ext.BoxComponent,{onRender:function(b,a){if(!this.el){this.el=document.createElement("label");this.el.id=this.getId();this.el.innerHTML=this.text?Ext.util.Format.htmlEncode(this.text):(this.html||"");if(this.forId){this.el.setAttribute("for",this.forId)}}Ext.form.Label.superclass.onRender.call(this,b,a)},setText:function(a,b){var c=b===false;this[!c?"text":"html"]=a;delete this[c?"text":"html"];if(this.rendered){this.el.dom.innerHTML=b!==false?Ext.util.Format.htmlEncode(a):a}return this}});Ext.reg("label",Ext.form.Label);Ext.form.Action=function(b,a){this.form=b;this.options=a||{}};Ext.form.Action.CLIENT_INVALID="client";Ext.form.Action.SERVER_INVALID="server";Ext.form.Action.CONNECT_FAILURE="connect";Ext.form.Action.LOAD_FAILURE="load";Ext.form.Action.prototype={type:"default",run:function(a){},success:function(a){},handleResponse:function(a){},failure:function(a){this.response=a;this.failureType=Ext.form.Action.CONNECT_FAILURE;this.form.afterAction(this,false)},processResponse:function(a){this.response=a;if(!a.responseText&&!a.responseXML){return true}this.result=this.handleResponse(a);return this.result},decodeResponse:function(a){try{return Ext.decode(a.responseText)}catch(b){return false}},getUrl:function(c){var a=this.options.url||this.form.url||this.form.el.dom.action;if(c){var b=this.getParams();if(b){a=Ext.urlAppend(a,b)}}return a},getMethod:function(){return(this.options.method||this.form.method||this.form.el.dom.method||"POST").toUpperCase()},getParams:function(){var a=this.form.baseParams;var b=this.options.params;if(b){if(typeof b=="object"){b=Ext.urlEncode(Ext.applyIf(b,a))}else{if(typeof b=="string"&&a){b+="&"+Ext.urlEncode(a)}}}else{if(a){b=Ext.urlEncode(a)}}return b},createCallback:function(a){var a=a||{};return{success:this.success,failure:this.failure,scope:this,timeout:(a.timeout*1000)||(this.form.timeout*1000),upload:this.form.fileUpload?this.success:undefined}}};Ext.form.Action.Submit=function(b,a){Ext.form.Action.Submit.superclass.constructor.call(this,b,a)};Ext.extend(Ext.form.Action.Submit,Ext.form.Action,{type:"submit",run:function(){var e=this.options,g=this.getMethod(),d=g=="GET";if(e.clientValidation===false||this.form.isValid()){if(e.submitEmptyText===false){var a=this.form.items,c=[],b=function(h){if(h.el.getValue()==h.emptyText){c.push(h);h.el.dom.value=""}if(h.isComposite&&h.rendered){h.items.each(b)}};a.each(b)}Ext.Ajax.request(Ext.apply(this.createCallback(e),{form:this.form.el.dom,url:this.getUrl(d),method:g,headers:e.headers,params:!d?this.getParams():null,isUpload:this.form.fileUpload}));if(e.submitEmptyText===false){Ext.each(c,function(h){if(h.applyEmptyText){h.applyEmptyText()}})}}else{if(e.clientValidation!==false){this.failureType=Ext.form.Action.CLIENT_INVALID;this.form.afterAction(this,false)}}},success:function(b){var a=this.processResponse(b);if(a===true||a.success){this.form.afterAction(this,true);return}if(a.errors){this.form.markInvalid(a.errors)}this.failureType=Ext.form.Action.SERVER_INVALID;this.form.afterAction(this,false)},handleResponse:function(c){if(this.form.errorReader){var b=this.form.errorReader.read(c);var g=[];if(b.records){for(var d=0,a=b.records.length;d<a;d++){var e=b.records[d];g[d]=e.data}}if(g.length<1){g=null}return{success:b.success,errors:g}}return this.decodeResponse(c)}});Ext.form.Action.Load=function(b,a){Ext.form.Action.Load.superclass.constructor.call(this,b,a);this.reader=this.form.reader};Ext.extend(Ext.form.Action.Load,Ext.form.Action,{type:"load",run:function(){Ext.Ajax.request(Ext.apply(this.createCallback(this.options),{method:this.getMethod(),url:this.getUrl(false),headers:this.options.headers,params:this.getParams()}))},success:function(b){var a=this.processResponse(b);if(a===true||!a.success||!a.data){this.failureType=Ext.form.Action.LOAD_FAILURE;this.form.afterAction(this,false);return}this.form.clearInvalid();this.form.setValues(a.data);this.form.afterAction(this,true)},handleResponse:function(b){if(this.form.reader){var a=this.form.reader.read(b);var c=a.records&&a.records[0]?a.records[0].data:null;return{success:a.success,data:c}}return this.decodeResponse(b)}});Ext.form.Action.DirectLoad=Ext.extend(Ext.form.Action.Load,{constructor:function(b,a){Ext.form.Action.DirectLoad.superclass.constructor.call(this,b,a)},type:"directload",run:function(){var a=this.getParams();a.push(this.success,this);this.form.api.load.apply(window,a)},getParams:function(){var c=[],h={};var e=this.form.baseParams;var g=this.options.params;Ext.apply(h,g,e);var b=this.form.paramOrder;if(b){for(var d=0,a=b.length;d<a;d++){c.push(h[b[d]])}}else{if(this.form.paramsAsHash){c.push(h)}}return c},processResponse:function(a){this.result=a;return a},success:function(a,b){if(b.type==Ext.Direct.exceptions.SERVER){a={}}Ext.form.Action.DirectLoad.superclass.success.call(this,a)}});Ext.form.Action.DirectSubmit=Ext.extend(Ext.form.Action.Submit,{constructor:function(b,a){Ext.form.Action.DirectSubmit.superclass.constructor.call(this,b,a)},type:"directsubmit",run:function(){var a=this.options;if(a.clientValidation===false||this.form.isValid()){this.success.params=this.getParams();this.form.api.submit(this.form.el.dom,this.success,this)}else{if(a.clientValidation!==false){this.failureType=Ext.form.Action.CLIENT_INVALID;this.form.afterAction(this,false)}}},getParams:function(){var c={};var a=this.form.baseParams;var b=this.options.params;Ext.apply(c,b,a);return c},processResponse:function(a){this.result=a;return a},success:function(a,b){if(b.type==Ext.Direct.exceptions.SERVER){a={}}Ext.form.Action.DirectSubmit.superclass.success.call(this,a)}});Ext.form.Action.ACTION_TYPES={load:Ext.form.Action.Load,submit:Ext.form.Action.Submit,directload:Ext.form.Action.DirectLoad,directsubmit:Ext.form.Action.DirectSubmit};Ext.form.VTypes=function(){var c=/^[a-zA-Z_]+$/,d=/^[a-zA-Z0-9_]+$/,b=/^(\w+)([\-+.\'][\w]+)*@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/,a=/(((^https?)|(^ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;return{email:function(e){return b.test(e)},emailText:'This field should be an e-mail address in the format "user@example.com"',emailMask:/[a-z0-9_\.\-\+\'@]/i,url:function(e){return a.test(e)},urlText:'This field should be a URL in the format "http://www.example.com"',alpha:function(e){return c.test(e)},alphaText:"This field should only contain letters and _",alphaMask:/[a-z_]/i,alphanum:function(e){return d.test(e)},alphanumText:"This field should only contain letters, numbers and _",alphanumMask:/[a-z0-9_]/i}}();Ext.grid.GridPanel=Ext.extend(Ext.Panel,{autoExpandColumn:false,autoExpandMax:1000,autoExpandMin:50,columnLines:false,ddText:"{0} selected row{1}",deferRowRender:true,enableColumnHide:true,enableColumnMove:true,enableDragDrop:false,enableHdMenu:true,loadMask:false,minColumnWidth:25,stripeRows:false,trackMouseOver:true,stateEvents:["columnmove","columnresize","sortchange","groupchange"],view:null,bubbleEvents:[],rendered:false,viewReady:false,initComponent:function(){Ext.grid.GridPanel.superclass.initComponent.call(this);if(this.columnLines){this.cls=(this.cls||"")+" x-grid-with-col-lines"}this.autoScroll=false;this.autoWidth=false;if(Ext.isArray(this.columns)){this.colModel=new Ext.grid.ColumnModel(this.columns);delete this.columns}if(this.ds){this.store=this.ds;delete this.ds}if(this.cm){this.colModel=this.cm;delete this.cm}if(this.sm){this.selModel=this.sm;delete this.sm}this.store=Ext.StoreMgr.lookup(this.store);this.addEvents("click","dblclick","contextmenu","mousedown","mouseup","mouseover","mouseout","keypress","keydown","cellmousedown","rowmousedown","headermousedown","groupmousedown","rowbodymousedown","containermousedown","cellclick","celldblclick","rowclick","rowdblclick","headerclick","headerdblclick","groupclick","groupdblclick","containerclick","containerdblclick","rowbodyclick","rowbodydblclick","rowcontextmenu","cellcontextmenu","headercontextmenu","groupcontextmenu","containercontextmenu","rowbodycontextmenu","bodyscroll","columnresize","columnmove","sortchange","groupchange","reconfigure","viewready")},onRender:function(d,a){Ext.grid.GridPanel.superclass.onRender.apply(this,arguments);var e=this.getGridEl();this.el.addClass("x-grid-panel");this.mon(e,{scope:this,mousedown:this.onMouseDown,click:this.onClick,dblclick:this.onDblClick,contextmenu:this.onContextMenu});this.relayEvents(e,["mousedown","mouseup","mouseover","mouseout","keypress","keydown"]);var b=this.getView();b.init(this);b.render();this.getSelectionModel().init(this)},initEvents:function(){Ext.grid.GridPanel.superclass.initEvents.call(this);if(this.loadMask){this.loadMask=new Ext.LoadMask(this.bwrap,Ext.apply({store:this.store},this.loadMask))}},initStateEvents:function(){Ext.grid.GridPanel.superclass.initStateEvents.call(this);this.mon(this.colModel,"hiddenchange",this.saveState,this,{delay:100})},applyState:function(a){var k=this.colModel,g=a.columns,j=this.store,m,h,l;if(g){for(var d=0,e=g.length;d<e;d++){m=g[d];h=k.getColumnById(m.id);if(h){l=k.getIndexById(m.id);k.setState(l,{hidden:m.hidden,width:m.width,sortable:h.sortable,editable:h.editable});if(l!=d){k.moveColumn(l,d)}}}}if(j){m=a.sort;if(m){j[j.remoteSort?"setDefaultSort":"sort"](m.field,m.direction)}m=a.group;if(j.groupBy){if(m){j.groupBy(m)}else{j.clearGrouping()}}}var b=Ext.apply({},a);delete b.columns;delete b.sort;Ext.grid.GridPanel.superclass.applyState.call(this,b)},getState:function(){var g={columns:[]},b=this.store,e,a;for(var d=0,h;(h=this.colModel.config[d]);d++){g.columns[d]={id:h.id,width:h.width};if(h.hidden){g.columns[d].hidden=true}}if(b){e=b.getSortState();if(e){g.sort=e}if(b.getGroupState){a=b.getGroupState();if(a){g.group=a}}}return g},afterRender:function(){Ext.grid.GridPanel.superclass.afterRender.call(this);var a=this.view;this.on("bodyresize",a.layout,a);a.layout(true);if(this.deferRowRender){if(!this.deferRowRenderTask){this.deferRowRenderTask=new Ext.util.DelayedTask(a.afterRender,this.view)}this.deferRowRenderTask.delay(10)}else{a.afterRender()}this.viewReady=true},reconfigure:function(a,b){var c=this.rendered;if(c){if(this.loadMask){this.loadMask.destroy();this.loadMask=new Ext.LoadMask(this.bwrap,Ext.apply({},{store:a},this.initialConfig.loadMask))}}if(this.view){this.view.initData(a,b)}this.store=a;this.colModel=b;if(c){this.view.refresh(true)}this.fireEvent("reconfigure",this,a,b)},onDestroy:function(){if(this.deferRowRenderTask&&this.deferRowRenderTask.cancel){this.deferRowRenderTask.cancel()}if(this.rendered){Ext.destroy(this.view,this.loadMask)}else{if(this.store&&this.store.autoDestroy){this.store.destroy()}}Ext.destroy(this.colModel,this.selModel);this.store=this.selModel=this.colModel=this.view=this.loadMask=null;Ext.grid.GridPanel.superclass.onDestroy.call(this)},processEvent:function(a,b){this.view.processEvent(a,b)},onClick:function(a){this.processEvent("click",a)},onMouseDown:function(a){this.processEvent("mousedown",a)},onContextMenu:function(b,a){this.processEvent("contextmenu",b)},onDblClick:function(a){this.processEvent("dblclick",a)},walkCells:function(k,c,b,e,j){var i=this.colModel,g=i.getColumnCount(),a=this.store,h=a.getCount(),d=true;if(b<0){if(c<0){k--;d=false}while(k>=0){if(!d){c=g-1}d=false;while(c>=0){if(e.call(j||this,k,c,i)===true){return[k,c]}c--}k--}}else{if(c>=g){k++;d=false}while(k<h){if(!d){c=0}d=false;while(c<g){if(e.call(j||this,k,c,i)===true){return[k,c]}c++}k++}}return null},getGridEl:function(){return this.body},stopEditing:Ext.emptyFn,getSelectionModel:function(){if(!this.selModel){this.selModel=new Ext.grid.RowSelectionModel(this.disableSelection?{selectRow:Ext.emptyFn}:null)}return this.selModel},getStore:function(){return this.store},getColumnModel:function(){return this.colModel},getView:function(){if(!this.view){this.view=new Ext.grid.GridView(this.viewConfig)}return this.view},getDragDropText:function(){var a=this.selModel.getCount?this.selModel.getCount():1;return String.format(this.ddText,a,a==1?"":"s")}});Ext.reg("grid",Ext.grid.GridPanel);Ext.grid.PivotGrid=Ext.extend(Ext.grid.GridPanel,{aggregator:"sum",renderer:undefined,initComponent:function(){Ext.grid.PivotGrid.superclass.initComponent.apply(this,arguments);this.initAxes();this.enableColumnResize=false;this.viewConfig=Ext.apply(this.viewConfig||{},{forceFit:true});this.colModel=new Ext.grid.ColumnModel({})},getAggregator:function(){if(typeof this.aggregator=="string"){return Ext.grid.PivotAggregatorMgr.types[this.aggregator]}else{return this.aggregator}},setAggregator:function(a){this.aggregator=a},setMeasure:function(a){this.measure=a},setLeftAxis:function(b,a){this.leftAxis=b;if(a){this.view.refresh()}},setTopAxis:function(b,a){this.topAxis=b;if(a){this.view.refresh()}},initAxes:function(){var a=Ext.grid.PivotAxis;if(!(this.leftAxis instanceof a)){this.setLeftAxis(new a({orientation:"vertical",dimensions:this.leftAxis||[],store:this.store}))}if(!(this.topAxis instanceof a)){this.setTopAxis(new a({orientation:"horizontal",dimensions:this.topAxis||[],store:this.store}))}},extractData:function(){var c=this.store.data.items,s=c.length,q=[],h,g,e,d;if(s==0){return[]}var l=this.leftAxis.getTuples(),o=l.length,m=this.topAxis.getTuples(),a=m.length,b=this.getAggregator();for(g=0;g<s;g++){h=c[g];for(e=0;e<o;e++){q[e]=q[e]||[];if(l[e].matcher(h)===true){for(d=0;d<a;d++){q[e][d]=q[e][d]||[];if(m[d].matcher(h)){q[e][d].push(h)}}}}}var n=q.length,p,r;for(g=0;g<n;g++){r=q[g];p=r.length;for(e=0;e<p;e++){q[g][e]=b(q[g][e],this.measure)}}return q},getView:function(){if(!this.view){this.view=new Ext.grid.PivotGridView(this.viewConfig)}return this.view}});Ext.reg("pivotgrid",Ext.grid.PivotGrid);Ext.grid.PivotAggregatorMgr=new Ext.AbstractManager();Ext.grid.PivotAggregatorMgr.registerType("sum",function(a,c){var e=a.length,d=0,b;for(b=0;b<e;b++){d+=a[b].get(c)}return d});Ext.grid.PivotAggregatorMgr.registerType("avg",function(a,c){var e=a.length,d=0,b;for(b=0;b<e;b++){d+=a[b].get(c)}return(d/e)||"n/a"});Ext.grid.PivotAggregatorMgr.registerType("min",function(a,c){var e=[],d=a.length,b;for(b=0;b<d;b++){e.push(a[b].get(c))}return Math.min.apply(this,e)||"n/a"});Ext.grid.PivotAggregatorMgr.registerType("max",function(a,c){var e=[],d=a.length,b;for(b=0;b<d;b++){e.push(a[b].get(c))}return Math.max.apply(this,e)||"n/a"});Ext.grid.PivotAggregatorMgr.registerType("count",function(a,b){return a.length});Ext.grid.GridView=Ext.extend(Ext.util.Observable,{deferEmptyText:true,scrollOffset:undefined,autoFill:false,forceFit:false,sortClasses:["sort-asc","sort-desc"],sortAscText:"Sort Ascending",sortDescText:"Sort Descending",hideSortIcons:false,columnsText:"Columns",selectedRowClass:"x-grid3-row-selected",borderWidth:2,tdClass:"x-grid3-cell",hdCls:"x-grid3-hd",markDirty:true,cellSelectorDepth:4,rowSelectorDepth:10,rowBodySelectorDepth:10,cellSelector:"td.x-grid3-cell",rowSelector:"div.x-grid3-row",rowBodySelector:"div.x-grid3-row-body",firstRowCls:"x-grid3-row-first",lastRowCls:"x-grid3-row-last",rowClsRe:/(?:^|\s+)x-grid3-row-(first|last|alt)(?:\s+|$)/g,headerMenuOpenCls:"x-grid3-hd-menu-open",rowOverCls:"x-grid3-row-over",constructor:function(a){Ext.apply(this,a);this.addEvents("beforerowremoved","beforerowsinserted","beforerefresh","rowremoved","rowsinserted","rowupdated","refresh");Ext.grid.GridView.superclass.constructor.call(this)},masterTpl:new Ext.Template('<div class="x-grid3" hidefocus="true">','<div class="x-grid3-viewport">','<div class="x-grid3-header">','<div class="x-grid3-header-inner">','<div class="x-grid3-header-offset" style="{ostyle}">{header}</div>',"</div>",'<div class="x-clear"></div>',"</div>",'<div class="x-grid3-scroller">','<div class="x-grid3-body" style="{bstyle}">{body}</div>','<a href="#" class="x-grid3-focus" tabIndex="-1"></a>',"</div>","</div>",'<div class="x-grid3-resize-marker">&#160;</div>','<div class="x-grid3-resize-proxy">&#160;</div>',"</div>"),headerTpl:new Ext.Template('<table border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',"<thead>",'<tr class="x-grid3-hd-row">{cells}</tr>',"</thead>","</table>"),bodyTpl:new Ext.Template("{rows}"),cellTpl:new Ext.Template('<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} {css}" style="{style}" tabIndex="0" {cellAttr}>','<div class="x-grid3-cell-inner x-grid3-col-{id} x-unselectable" unselectable="on" {attr}>{value}</div>',"</td>"),initTemplates:function(){var c=this.templates||{},d,b,g=new Ext.Template('<td class="x-grid3-hd x-grid3-cell x-grid3-td-{id} {css}" style="{style}">','<div {tooltip} {attr} class="x-grid3-hd-inner x-grid3-hd-{id}" unselectable="on" style="{istyle}">',this.grid.enableHdMenu?'<a class="x-grid3-hd-btn" href="#"></a>':"","{value}",'<img alt="" class="x-grid3-sort-icon" src="',Ext.BLANK_IMAGE_URL,'" />',"</div>","</td>"),a=['<tr class="x-grid3-row-body-tr" style="{bodyStyle}">','<td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on">','<div class="x-grid3-row-body">{body}</div>',"</td>","</tr>"].join(""),e=['<table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',"<tbody>","<tr>{cells}</tr>",this.enableRowBody?a:"","</tbody>","</table>"].join("");Ext.applyIf(c,{hcell:g,cell:this.cellTpl,body:this.bodyTpl,header:this.headerTpl,master:this.masterTpl,row:new Ext.Template('<div class="x-grid3-row {alt}" style="{tstyle}">'+e+"</div>"),rowInner:new Ext.Template(e)});for(b in c){d=c[b];if(d&&Ext.isFunction(d.compile)&&!d.compiled){d.disableFormats=true;d.compile()}}this.templates=c;this.colRe=new RegExp("x-grid3-td-([^\\s]+)","")},fly:function(a){if(!this._flyweight){this._flyweight=new Ext.Element.Flyweight(document.body)}this._flyweight.dom=a;return this._flyweight},getEditorParent:function(){return this.scroller.dom},initElements:function(){var b=Ext.Element,d=Ext.get(this.grid.getGridEl().dom.firstChild),e=new b(d.child("div.x-grid3-viewport")),c=new b(e.child("div.x-grid3-header")),a=new b(e.child("div.x-grid3-scroller"));if(this.grid.hideHeaders){c.setDisplayed(false)}if(this.forceFit){a.setStyle("overflow-x","hidden")}Ext.apply(this,{el:d,mainWrap:e,scroller:a,mainHd:c,innerHd:c.child("div.x-grid3-header-inner").dom,mainBody:new b(b.fly(a).child("div.x-grid3-body")),focusEl:new b(b.fly(a).child("a")),resizeMarker:new b(d.child("div.x-grid3-resize-marker")),resizeProxy:new b(d.child("div.x-grid3-resize-proxy"))});this.focusEl.swallowEvent("click",true)},getRows:function(){return this.hasRows()?this.mainBody.dom.childNodes:[]},findCell:function(a){if(!a){return false}return this.fly(a).findParent(this.cellSelector,this.cellSelectorDepth)},findCellIndex:function(d,c){var b=this.findCell(d),a;if(b){a=this.fly(b).hasClass(c);if(!c||a){return this.getCellIndex(b)}}return false},getCellIndex:function(b){if(b){var a=b.className.match(this.colRe);if(a&&a[1]){return this.cm.getIndexById(a[1])}}return false},findHeaderCell:function(b){var a=this.findCell(b);return a&&this.fly(a).hasClass(this.hdCls)?a:null},findHeaderIndex:function(a){return this.findCellIndex(a,this.hdCls)},findRow:function(a){if(!a){return false}return this.fly(a).findParent(this.rowSelector,this.rowSelectorDepth)},findRowIndex:function(a){var b=this.findRow(a);return b?b.rowIndex:false},findRowBody:function(a){if(!a){return false}return this.fly(a).findParent(this.rowBodySelector,this.rowBodySelectorDepth)},getRow:function(a){return this.getRows()[a]},getCell:function(b,a){return Ext.fly(this.getRow(b)).query(this.cellSelector)[a]},getHeaderCell:function(a){return this.mainHd.dom.getElementsByTagName("td")[a]},addRowClass:function(b,a){var c=this.getRow(b);if(c){this.fly(c).addClass(a)}},removeRowClass:function(c,a){var b=this.getRow(c);if(b){this.fly(b).removeClass(a)}},removeRow:function(a){Ext.removeNode(this.getRow(a));this.syncFocusEl(a)},removeRows:function(c,a){var b=this.mainBody.dom,d;for(d=c;d<=a;d++){Ext.removeNode(b.childNodes[c])}this.syncFocusEl(c)},getScrollState:function(){var a=this.scroller.dom;return{left:a.scrollLeft,top:a.scrollTop}},restoreScroll:function(a){var b=this.scroller.dom;b.scrollLeft=a.left;b.scrollTop=a.top},scrollToTop:function(){var a=this.scroller.dom;a.scrollTop=0;a.scrollLeft=0},syncScroll:function(){this.syncHeaderScroll();var a=this.scroller.dom;this.grid.fireEvent("bodyscroll",a.scrollLeft,a.scrollTop)},syncHeaderScroll:function(){var a=this.innerHd,b=this.scroller.dom.scrollLeft;a.scrollLeft=b;a.scrollLeft=b},updateSortIcon:function(d,c){var a=this.sortClasses,b=a[c=="DESC"?1:0],e=this.mainHd.select("td").removeClass(a);e.item(d).addClass(b)},updateAllColumnWidths:function(){var e=this.getTotalWidth(),k=this.cm.getColumnCount(),m=this.getRows(),g=m.length,b=[],l,a,h,d,c;for(d=0;d<k;d++){b[d]=this.getColumnWidth(d);this.getHeaderCell(d).style.width=b[d]}this.updateHeaderWidth();for(d=0;d<g;d++){l=m[d];l.style.width=e;a=l.firstChild;if(a){a.style.width=e;h=a.rows[0];for(c=0;c<k;c++){h.childNodes[c].style.width=b[c]}}}this.onAllColumnWidthsUpdated(b,e)},updateColumnWidth:function(d,b){var c=this.getColumnWidth(d),j=this.getTotalWidth(),h=this.getHeaderCell(d),a=this.getRows(),e=a.length,l,g,k;this.updateHeaderWidth();h.style.width=c;for(g=0;g<e;g++){l=a[g];k=l.firstChild;l.style.width=j;if(k){k.style.width=j;k.rows[0].childNodes[d].style.width=c}}this.onColumnWidthUpdated(d,c,j)},updateColumnHidden:function(b,j){var h=this.getTotalWidth(),k=j?"none":"",g=this.getHeaderCell(b),a=this.getRows(),d=a.length,l,c,e;this.updateHeaderWidth();g.style.display=k;for(e=0;e<d;e++){l=a[e];l.style.width=h;c=l.firstChild;if(c){c.style.width=h;c.rows[0].childNodes[b].style.display=k}}this.onColumnHiddenUpdated(b,j,h);delete this.lastViewWidth;this.layout()},doRender:function(d,v,m,a,r,t){var h=this.templates,c=h.cell,y=h.row,o=r-1,b="width:"+this.getTotalWidth()+";",k=[],l=[],n={tstyle:b},q={},w=v.length,x,g,e,u,s,p;for(s=0;s<w;s++){e=v[s];l=[];p=s+a;for(u=0;u<r;u++){g=d[u];q.id=g.id;q.css=u===0?"x-grid3-cell-first ":(u==o?"x-grid3-cell-last ":"");q.attr=q.cellAttr="";q.style=g.style;q.value=g.renderer.call(g.scope,e.data[g.name],q,e,p,u,m);if(Ext.isEmpty(q.value)){q.value="&#160;"}if(this.markDirty&&e.dirty&&typeof e.modified[g.name]!="undefined"){q.css+=" x-grid3-dirty-cell"}l[l.length]=c.apply(q)}x=[];if(t&&((p+1)%2===0)){x[0]="x-grid3-row-alt"}if(e.dirty){x[1]=" x-grid3-dirty-row"}n.cols=r;if(this.getRowClass){x[2]=this.getRowClass(e,p,n,m)}n.alt=x.join(" ");n.cells=l.join("");k[k.length]=y.apply(n)}return k.join("")},processRows:function(a,g){if(!this.ds||this.ds.getCount()<1){return}var d=this.getRows(),c=d.length,e,b;g=g||!this.grid.stripeRows;a=a||0;for(b=0;b<c;b++){e=d[b];if(e){e.rowIndex=b;if(!g){e.className=e.className.replace(this.rowClsRe," ");if((b+1)%2===0){e.className+=" x-grid3-row-alt"}}}}if(a===0){Ext.fly(d[0]).addClass(this.firstRowCls)}Ext.fly(d[c-1]).addClass(this.lastRowCls)},afterRender:function(){if(!this.ds||!this.cm){return}this.mainBody.dom.innerHTML=this.renderBody()||"&#160;";this.processRows(0,true);if(this.deferEmptyText!==true){this.applyEmptyText()}this.grid.fireEvent("viewready",this.grid)},afterRenderUI:function(){var a=this.grid;this.initElements();Ext.fly(this.innerHd).on("click",this.handleHdDown,this);this.mainHd.on({scope:this,mouseover:this.handleHdOver,mouseout:this.handleHdOut,mousemove:this.handleHdMove});this.scroller.on("scroll",this.syncScroll,this);if(a.enableColumnResize!==false){this.splitZone=new Ext.grid.GridView.SplitDragZone(a,this.mainHd.dom)}if(a.enableColumnMove){this.columnDrag=new Ext.grid.GridView.ColumnDragZone(a,this.innerHd);this.columnDrop=new Ext.grid.HeaderDropZone(a,this.mainHd.dom)}if(a.enableHdMenu!==false){this.hmenu=new Ext.menu.Menu({id:a.id+"-hctx"});this.hmenu.add({itemId:"asc",text:this.sortAscText,cls:"xg-hmenu-sort-asc"},{itemId:"desc",text:this.sortDescText,cls:"xg-hmenu-sort-desc"});if(a.enableColumnHide!==false){this.colMenu=new Ext.menu.Menu({id:a.id+"-hcols-menu"});this.colMenu.on({scope:this,beforeshow:this.beforeColMenuShow,itemclick:this.handleHdMenuClick});this.hmenu.add({itemId:"sortSep",xtype:"menuseparator"},{itemId:"columns",hideOnClick:false,text:this.columnsText,menu:this.colMenu,iconCls:"x-cols-icon"})}this.hmenu.on("itemclick",this.handleHdMenuClick,this)}if(a.trackMouseOver){this.mainBody.on({scope:this,mouseover:this.onRowOver,mouseout:this.onRowOut})}if(a.enableDragDrop||a.enableDrag){this.dragZone=new Ext.grid.GridDragZone(a,{ddGroup:a.ddGroup||"GridDD"})}this.updateHeaderSortState()},renderUI:function(){var a=this.templates;return a.master.apply({body:a.body.apply({rows:"&#160;"}),header:this.renderHeaders(),ostyle:"width:"+this.getOffsetWidth()+";",bstyle:"width:"+this.getTotalWidth()+";"})},processEvent:function(b,h){var i=h.getTarget(),a=this.grid,d=this.findHeaderIndex(i),k,j,c,g;a.fireEvent(b,h);if(d!==false){a.fireEvent("header"+b,a,d,h)}else{k=this.findRowIndex(i);if(k!==false){j=this.findCellIndex(i);if(j!==false){c=a.colModel.getColumnAt(j);if(a.fireEvent("cell"+b,a,k,j,h)!==false){if(!c||(c.processEvent&&(c.processEvent(b,h,a,k,j)!==false))){a.fireEvent("row"+b,a,k,h)}}}else{if(a.fireEvent("row"+b,a,k,h)!==false){(g=this.findRowBody(i))&&a.fireEvent("rowbody"+b,a,k,h)}}}else{a.fireEvent("container"+b,a,h)}}},layout:function(j){if(!this.mainBody){return}var a=this.grid,d=a.getGridEl(),c=d.getSize(true),i=c.width,b=c.height,h=this.scroller,g,e,k;if(i<20||b<20){return}if(a.autoHeight){g=h.dom.style;g.overflow="visible";if(Ext.isWebKit){g.position="static"}}else{this.el.setSize(i,b);e=this.mainHd.getHeight();k=b-e;h.setSize(i,k);if(this.innerHd){this.innerHd.style.width=(i)+"px"}}if(this.forceFit||(j===true&&this.autoFill)){if(this.lastViewWidth!=i){this.fitColumns(false,false);this.lastViewWidth=i}}else{this.autoExpand();this.syncHeaderScroll()}this.onLayout(i,k)},onLayout:function(a,b){},onColumnWidthUpdated:function(c,a,b){},onAllColumnWidthsUpdated:function(a,b){},onColumnHiddenUpdated:function(b,c,a){},updateColumnText:function(a,b){},afterMove:function(a){},init:function(a){this.grid=a;this.initTemplates();this.initData(a.store,a.colModel);this.initUI(a)},getColumnId:function(a){return this.cm.getColumnId(a)},getOffsetWidth:function(){return(this.cm.getTotalWidth()+this.getScrollOffset())+"px"},getScrollOffset:function(){return Ext.num(this.scrollOffset,Ext.getScrollBarWidth())},renderHeaders:function(){var e=this.cm,g=this.templates,a=g.hcell,d={},h=e.getColumnCount(),j=h-1,k=[],c,b;for(c=0;c<h;c++){if(c==0){b="x-grid3-cell-first "}else{b=c==j?"x-grid3-cell-last ":""}d={id:e.getColumnId(c),value:e.getColumnHeader(c)||"",style:this.getColumnStyle(c,true),css:b,tooltip:this.getColumnTooltip(c)};if(e.config[c].align=="right"){d.istyle="padding-right: 16px;"}else{delete d.istyle}k[c]=a.apply(d)}return g.header.apply({cells:k.join(""),tstyle:String.format("width: {0};",this.getTotalWidth())})},getColumnTooltip:function(a){var b=this.cm.getColumnTooltip(a);if(b){if(Ext.QuickTips.isEnabled()){return'ext:qtip="'+b+'"'}else{return'title="'+b+'"'}}return""},beforeUpdate:function(){this.grid.stopEditing(true)},updateHeaders:function(){this.innerHd.firstChild.innerHTML=this.renderHeaders();this.updateHeaderWidth(false)},updateHeaderWidth:function(c){var b=this.innerHd.firstChild,a=this.getTotalWidth();b.style.width=this.getOffsetWidth();b.firstChild.style.width=a;if(c!==false){this.mainBody.dom.style.width=a}},focusRow:function(a){this.focusCell(a,0,false)},focusCell:function(d,b,c){this.syncFocusEl(this.ensureVisible(d,b,c));var a=this.focusEl;if(Ext.isGecko){a.focus()}else{a.focus.defer(1,a)}},resolveCell:function(h,d,g){if(!Ext.isNumber(h)){h=h.rowIndex}if(!this.ds){return null}if(h<0||h>=this.ds.getCount()){return null}d=(d!==undefined?d:0);var c=this.getRow(h),b=this.cm,e=b.getColumnCount(),a;if(!(g===false&&d===0)){while(d<e&&b.isHidden(d)){d++}a=this.getCell(h,d)}return{row:c,cell:a}},getResolvedXY:function(b){if(!b){return null}var a=b.cell,c=b.row;if(a){return Ext.fly(a).getXY()}else{return[this.el.getX(),Ext.fly(c).getY()]}},syncFocusEl:function(d,a,c){var b=d;if(!Ext.isArray(b)){d=Math.min(d,Math.max(0,this.getRows().length-1));if(isNaN(d)){return}b=this.getResolvedXY(this.resolveCell(d,a,c))}this.focusEl.setXY(b||this.scroller.getXY())},ensureVisible:function(t,g,e){var r=this.resolveCell(t,g,e);if(!r||!r.row){return null}var k=r.row,h=r.cell,n=this.scroller.dom,d=k,s=0,o=this.el.dom;while(d&&d!=o){s+=d.offsetTop;d=d.offsetParent}s-=this.mainHd.dom.offsetHeight;o=parseInt(n.scrollTop,10);var q=s+k.offsetHeight,a=n.clientHeight,m=o+a;if(s<o){n.scrollTop=s}else{if(q>m){n.scrollTop=q-a}}if(e!==false){var l=parseInt(h.offsetLeft,10),j=l+h.offsetWidth,i=parseInt(n.scrollLeft,10),b=i+n.clientWidth;if(l<i){n.scrollLeft=l}else{if(j>b){n.scrollLeft=j-n.clientWidth}}}return this.getResolvedXY(r)},insertRows:function(a,i,e,h){var d=a.getCount()-1;if(!h&&i===0&&e>=d){this.fireEvent("beforerowsinserted",this,i,e);this.refresh();this.fireEvent("rowsinserted",this,i,e)}else{if(!h){this.fireEvent("beforerowsinserted",this,i,e)}var b=this.renderRows(i,e),g=this.getRow(i);if(g){if(i===0){Ext.fly(this.getRow(0)).removeClass(this.firstRowCls)}Ext.DomHelper.insertHtml("beforeBegin",g,b)}else{var c=this.getRow(d-1);if(c){Ext.fly(c).removeClass(this.lastRowCls)}Ext.DomHelper.insertHtml("beforeEnd",this.mainBody.dom,b)}if(!h){this.processRows(i);this.fireEvent("rowsinserted",this,i,e)}else{if(i===0||i>=d){Ext.fly(this.getRow(i)).addClass(i===0?this.firstRowCls:this.lastRowCls)}}}this.syncFocusEl(i)},deleteRows:function(a,c,b){if(a.getRowCount()<1){this.refresh()}else{this.fireEvent("beforerowsdeleted",this,c,b);this.removeRows(c,b);this.processRows(c);this.fireEvent("rowsdeleted",this,c,b)}},getColumnStyle:function(b,d){var a=this.cm,g=a.config,c=d?"":g[b].css||"",e=g[b].align;c+=String.format("width: {0};",this.getColumnWidth(b));if(a.isHidden(b)){c+="display: none; "}if(e){c+=String.format("text-align: {0};",e)}return c},getColumnWidth:function(b){var c=this.cm.getColumnWidth(b),a=this.borderWidth;if(Ext.isNumber(c)){if(Ext.isBorderBox){return c+"px"}else{return Math.max(c-a,0)+"px"}}else{return c}},getTotalWidth:function(){return this.cm.getTotalWidth()+"px"},fitColumns:function(g,j,h){var a=this.grid,l=this.cm,s=l.getTotalWidth(false),q=this.getGridInnerWidth(),r=q-s,c=[],o=0,n=0,u,d,p;if(q<20||r===0){return false}var e=l.getColumnCount(true),m=l.getColumnCount(false),b=e-(Ext.isNumber(h)?1:0);if(b===0){b=1;h=undefined}for(p=0;p<m;p++){if(!l.isFixed(p)&&p!==h){u=l.getColumnWidth(p);c.push(p,u);if(!l.isHidden(p)){o=p;n+=u}}}d=(q-l.getTotalWidth())/n;while(c.length){u=c.pop();p=c.pop();l.setColumnWidth(p,Math.max(a.minColumnWidth,Math.floor(u+u*d)),true)}s=l.getTotalWidth(false);if(s>q){var t=(b==e)?o:h,k=Math.max(1,l.getColumnWidth(t)-(s-q));l.setColumnWidth(t,k,true)}if(g!==true){this.updateAllColumnWidths()}return true},autoExpand:function(k){var a=this.grid,i=this.cm,e=this.getGridInnerWidth(),c=i.getTotalWidth(false),g=a.autoExpandColumn;if(!this.userResized&&g){if(e!=c){var j=i.getIndexById(g),b=i.getColumnWidth(j),h=e-c+b,d=Math.min(Math.max(h,a.autoExpandMin),a.autoExpandMax);if(b!=d){i.setColumnWidth(j,d,true);if(k!==true){this.updateColumnWidth(j,d)}}}}},getGridInnerWidth:function(){return this.grid.getGridEl().getWidth(true)-this.getScrollOffset()},getColumnData:function(){var e=[],c=this.cm,g=c.getColumnCount(),a=this.ds.fields,d,b;for(d=0;d<g;d++){b=c.getDataIndex(d);e[d]={name:Ext.isDefined(b)?b:(a.get(d)?a.get(d).name:undefined),renderer:c.getRenderer(d),scope:c.getRendererScope(d),id:c.getColumnId(d),style:this.getColumnStyle(d)}}return e},renderRows:function(i,c){var a=this.grid,g=a.store,j=a.stripeRows,e=a.colModel,h=e.getColumnCount(),d=g.getCount(),b;if(d<1){return""}i=i||0;c=Ext.isDefined(c)?c:d-1;b=g.getRange(i,c);return this.doRender(this.getColumnData(),b,g,i,h,j)},renderBody:function(){var a=this.renderRows()||"&#160;";return this.templates.body.apply({rows:a})},refreshRow:function(g){var l=this.ds,m=this.cm.getColumnCount(),c=this.getColumnData(),n=m-1,p=["x-grid3-row"],e={tstyle:String.format("width: {0};",this.getTotalWidth())},a=[],k=this.templates.cell,j,q,b,o,h,d;if(Ext.isNumber(g)){j=g;g=l.getAt(j)}else{j=l.indexOf(g)}if(!g||j<0){return}for(d=0;d<m;d++){b=c[d];if(d==0){h="x-grid3-cell-first"}else{h=(d==n)?"x-grid3-cell-last ":""}o={id:b.id,style:b.style,css:h,attr:"",cellAttr:""};o.value=b.renderer.call(b.scope,g.data[b.name],o,g,j,d,l);if(Ext.isEmpty(o.value)){o.value="&#160;"}if(this.markDirty&&g.dirty&&typeof g.modified[b.name]!="undefined"){o.css+=" x-grid3-dirty-cell"}a[d]=k.apply(o)}q=this.getRow(j);q.className="";if(this.grid.stripeRows&&((j+1)%2===0)){p.push("x-grid3-row-alt")}if(this.getRowClass){e.cols=m;p.push(this.getRowClass(g,j,e,l))}this.fly(q).addClass(p).setStyle(e.tstyle);e.cells=a.join("");q.innerHTML=this.templates.rowInner.apply(e);this.fireEvent("rowupdated",this,j,g)},refresh:function(b){this.fireEvent("beforerefresh",this);this.grid.stopEditing(true);var a=this.renderBody();this.mainBody.update(a).setWidth(this.getTotalWidth());if(b===true){this.updateHeaders();this.updateHeaderSortState()}this.processRows(0,true);this.layout();this.applyEmptyText();this.fireEvent("refresh",this)},applyEmptyText:function(){if(this.emptyText&&!this.hasRows()){this.mainBody.update('<div class="x-grid-empty">'+this.emptyText+"</div>")}},updateHeaderSortState:function(){var b=this.ds.getSortState();if(!b){return}if(!this.sortState||(this.sortState.field!=b.field||this.sortState.direction!=b.direction)){this.grid.fireEvent("sortchange",this.grid,b)}this.sortState=b;var c=this.cm.findColumnIndex(b.field);if(c!=-1){var a=b.direction;this.updateSortIcon(c,a)}},clearHeaderSortState:function(){if(!this.sortState){return}this.grid.fireEvent("sortchange",this.grid,null);this.mainHd.select("td").removeClass(this.sortClasses);delete this.sortState},destroy:function(){var j=this,a=j.grid,d=a.getGridEl(),i=j.dragZone,g=j.splitZone,h=j.columnDrag,e=j.columnDrop,k=j.scrollToTopTask,c,b;if(k&&k.cancel){k.cancel()}Ext.destroyMembers(j,"colMenu","hmenu");j.initData(null,null);j.purgeListeners();Ext.fly(j.innerHd).un("click",j.handleHdDown,j);if(a.enableColumnMove){c=h.dragData;b=h.proxy;Ext.destroy(h.el,b.ghost,b.el,e.el,e.proxyTop,e.proxyBottom,c.ddel,c.header);if(b.anim){Ext.destroy(b.anim)}delete b.ghost;delete c.ddel;delete c.header;h.destroy();delete Ext.dd.DDM.locationCache[h.id];delete h._domRef;delete e.proxyTop;delete e.proxyBottom;e.destroy();delete Ext.dd.DDM.locationCache["gridHeader"+d.id];delete e._domRef;delete Ext.dd.DDM.ids[e.ddGroup]}if(g){g.destroy();delete g._domRef;delete Ext.dd.DDM.ids["gridSplitters"+d.id]}Ext.fly(j.innerHd).removeAllListeners();Ext.removeNode(j.innerHd);delete j.innerHd;Ext.destroy(j.el,j.mainWrap,j.mainHd,j.scroller,j.mainBody,j.focusEl,j.resizeMarker,j.resizeProxy,j.activeHdBtn,j._flyweight,i,g);delete a.container;if(i){i.destroy()}Ext.dd.DDM.currentTarget=null;delete Ext.dd.DDM.locationCache[d.id];Ext.EventManager.removeResizeListener(j.onWindowResize,j)},onDenyColumnHide:function(){},render:function(){if(this.autoFill){var a=this.grid.ownerCt;if(a&&a.getLayout()){a.on("afterlayout",function(){this.fitColumns(true,true);this.updateHeaders();this.updateHeaderSortState()},this,{single:true})}}else{if(this.forceFit){this.fitColumns(true,false)}else{if(this.grid.autoExpandColumn){this.autoExpand(true)}}}this.grid.getGridEl().dom.innerHTML=this.renderUI();this.afterRenderUI()},initData:function(a,e){var b=this;if(b.ds){var d=b.ds;d.un("add",b.onAdd,b);d.un("load",b.onLoad,b);d.un("clear",b.onClear,b);d.un("remove",b.onRemove,b);d.un("update",b.onUpdate,b);d.un("datachanged",b.onDataChange,b);if(d!==a&&d.autoDestroy){d.destroy()}}if(a){a.on({scope:b,load:b.onLoad,add:b.onAdd,remove:b.onRemove,update:b.onUpdate,clear:b.onClear,datachanged:b.onDataChange})}if(b.cm){var c=b.cm;c.un("configchange",b.onColConfigChange,b);c.un("widthchange",b.onColWidthChange,b);c.un("headerchange",b.onHeaderChange,b);c.un("hiddenchange",b.onHiddenChange,b);c.un("columnmoved",b.onColumnMove,b)}if(e){delete b.lastViewWidth;e.on({scope:b,configchange:b.onColConfigChange,widthchange:b.onColWidthChange,headerchange:b.onHeaderChange,hiddenchange:b.onHiddenChange,columnmoved:b.onColumnMove})}b.ds=a;b.cm=e},onDataChange:function(){this.refresh(true);this.updateHeaderSortState();this.syncFocusEl(0)},onClear:function(){this.refresh();this.syncFocusEl(0)},onUpdate:function(b,a){this.refreshRow(a)},onAdd:function(b,a,c){this.insertRows(b,c,c+(a.length-1))},onRemove:function(b,a,c,d){if(d!==true){this.fireEvent("beforerowremoved",this,c,a)}this.removeRow(c);if(d!==true){this.processRows(c);this.applyEmptyText();this.fireEvent("rowremoved",this,c,a)}},onLoad:function(){if(Ext.isGecko){if(!this.scrollToTopTask){this.scrollToTopTask=new Ext.util.DelayedTask(this.scrollToTop,this)}this.scrollToTopTask.delay(1)}else{this.scrollToTop()}},onColWidthChange:function(a,b,c){this.updateColumnWidth(b,c)},onHeaderChange:function(a,b,c){this.updateHeaders()},onHiddenChange:function(a,b,c){this.updateColumnHidden(b,c)},onColumnMove:function(a,c,b){this.indexMap=null;this.refresh(true);this.restoreScroll(this.getScrollState());this.afterMove(b);this.grid.fireEvent("columnmove",c,b)},onColConfigChange:function(){delete this.lastViewWidth;this.indexMap=null;this.refresh(true)},initUI:function(a){a.on("headerclick",this.onHeaderClick,this)},initEvents:Ext.emptyFn,onHeaderClick:function(b,a){if(this.headersDisabled||!this.cm.isSortable(a)){return}b.stopEditing(true);b.store.sort(this.cm.getDataIndex(a))},onRowOver:function(b,a){var c=this.findRowIndex(a);if(c!==false){this.addRowClass(c,this.rowOverCls)}},onRowOut:function(b,a){var c=this.findRowIndex(a);if(c!==false&&!b.within(this.getRow(c),true)){this.removeRowClass(c,this.rowOverCls)}},onRowSelect:function(a){this.addRowClass(a,this.selectedRowClass)},onRowDeselect:function(a){this.removeRowClass(a,this.selectedRowClass)},onCellSelect:function(c,b){var a=this.getCell(c,b);if(a){this.fly(a).addClass("x-grid3-cell-selected")}},onCellDeselect:function(c,b){var a=this.getCell(c,b);if(a){this.fly(a).removeClass("x-grid3-cell-selected")}},handleWheel:function(a){a.stopPropagation()},onColumnSplitterMoved:function(a,b){this.userResized=true;this.grid.colModel.setColumnWidth(a,b,true);if(this.forceFit){this.fitColumns(true,false,a);this.updateAllColumnWidths()}else{this.updateColumnWidth(a,b);this.syncHeaderScroll()}this.grid.fireEvent("columnresize",a,b)},beforeColMenuShow:function(){var b=this.cm,d=b.getColumnCount(),a=this.colMenu,c;a.removeAll();for(c=0;c<d;c++){if(b.config[c].hideable!==false){a.add(new Ext.menu.CheckItem({text:b.getColumnHeader(c),itemId:"col-"+b.getColumnId(c),checked:!b.isHidden(c),disabled:b.config[c].hideable===false,hideOnClick:false}))}}},handleHdMenuClick:function(c){var a=this.ds,b=this.cm.getDataIndex(this.hdCtxIndex);switch(c.getItemId()){case"asc":a.sort(b,"ASC");break;case"desc":a.sort(b,"DESC");break;default:this.handleHdMenuClickDefault(c)}return true},handleHdMenuClickDefault:function(c){var b=this.cm,d=c.getItemId(),a=b.getIndexById(d.substr(4));if(a!=-1){if(c.checked&&b.getColumnsBy(this.isHideableColumn,this).length<=1){this.onDenyColumnHide();return}b.setHidden(a,c.checked)}},handleHdDown:function(i,j){if(Ext.fly(j).hasClass("x-grid3-hd-btn")){i.stopEvent();var k=this.cm,g=this.findHeaderCell(j),h=this.getCellIndex(g),d=k.isSortable(h),c=this.hmenu,b=c.items,a=this.headerMenuOpenCls,l;this.hdCtxIndex=h;Ext.fly(g).addClass(a);if(this.hideSortIcons){b.get("asc").setVisible(d);b.get("desc").setVisible(d);l=b.get("sortSep");if(l){l.setVisible(d)}}else{b.get("asc").setDisabled(!d);b.get("desc").setDisabled(!d)}c.on("hide",function(){Ext.fly(g).removeClass(a)},this,{single:true});c.show(j,"tl-bl?")}},handleHdMove:function(k){var i=this.findHeaderCell(this.activeHdRef);if(i&&!this.headersDisabled){var l=this.splitHandleWidth||5,j=this.activeHdRegion,p=i.style,m=this.cm,o="",g=k.getPageX();if(this.grid.enableColumnResize!==false){var a=this.activeHdIndex,b=this.getPreviousVisible(a),n=m.isResizable(a),c=b&&m.isResizable(b),d=g-j.left<=l,h=j.right-g<=(!this.activeHdBtn?l:2);if(d&&c){o=Ext.isAir?"move":Ext.isWebKit?"e-resize":"col-resize"}else{if(h&&n){o=Ext.isAir?"move":Ext.isWebKit?"w-resize":"col-resize"}}}p.cursor=o}},getPreviousVisible:function(a){while(a>0){if(!this.cm.isHidden(a-1)){return a}a--}return undefined},handleHdOver:function(c,b){var d=this.findHeaderCell(b);if(d&&!this.headersDisabled){var a=this.fly(d);this.activeHdRef=b;this.activeHdIndex=this.getCellIndex(d);this.activeHdRegion=a.getRegion();if(!this.isMenuDisabled(this.activeHdIndex,a)){a.addClass("x-grid3-hd-over");this.activeHdBtn=a.child(".x-grid3-hd-btn");if(this.activeHdBtn){this.activeHdBtn.dom.style.height=(d.firstChild.offsetHeight-1)+"px"}}}},handleHdOut:function(b,a){var c=this.findHeaderCell(a);if(c&&(!Ext.isIE9m||!b.within(c,true))){this.activeHdRef=null;this.fly(c).removeClass("x-grid3-hd-over");c.style.cursor=""}},isMenuDisabled:function(a,b){return this.cm.isMenuDisabled(a)},hasRows:function(){var a=this.mainBody.dom.firstChild;return a&&a.nodeType==1&&a.className!="x-grid-empty"},isHideableColumn:function(a){return !a.hidden},bind:function(a,b){this.initData(a,b)}});Ext.grid.GridView.SplitDragZone=Ext.extend(Ext.dd.DDProxy,{constructor:function(a,b){this.grid=a;this.view=a.getView();this.marker=this.view.resizeMarker;this.proxy=this.view.resizeProxy;Ext.grid.GridView.SplitDragZone.superclass.constructor.call(this,b,"gridSplitters"+this.grid.getGridEl().id,{dragElId:Ext.id(this.proxy.dom),resizeFrame:false});this.scroll=false;this.hw=this.view.splitHandleWidth||5},b4StartDrag:function(a,e){this.dragHeadersDisabled=this.view.headersDisabled;this.view.headersDisabled=true;var d=this.view.mainWrap.getHeight();this.marker.setHeight(d);this.marker.show();this.marker.alignTo(this.view.getHeaderCell(this.cellIndex),"tl-tl",[-2,0]);this.proxy.setHeight(d);var b=this.cm.getColumnWidth(this.cellIndex),c=Math.max(b-this.grid.minColumnWidth,0);this.resetConstraints();this.setXConstraint(c,1000);this.setYConstraint(0,0);this.minX=a-c;this.maxX=a+1000;this.startPos=a;Ext.dd.DDProxy.prototype.b4StartDrag.call(this,a,e)},allowHeaderDrag:function(a){return true},handleMouseDown:function(a){var h=this.view.findHeaderCell(a.getTarget());if(h&&this.allowHeaderDrag(a)){var k=this.view.fly(h).getXY(),c=k[0],i=a.getXY(),b=i[0],g=h.offsetWidth,d=false;if((b-c)<=this.hw){d=-1}else{if((c+g)-b<=this.hw){d=0}}if(d!==false){this.cm=this.grid.colModel;var j=this.view.getCellIndex(h);if(d==-1){if(j+d<0){return}while(this.cm.isHidden(j+d)){--d;if(j+d<0){return}}}this.cellIndex=j+d;this.split=h.dom;if(this.cm.isResizable(this.cellIndex)&&!this.cm.isFixed(this.cellIndex)){Ext.grid.GridView.SplitDragZone.superclass.handleMouseDown.apply(this,arguments)}}else{if(this.view.columnDrag){this.view.columnDrag.callHandleMouseDown(a)}}}},endDrag:function(g){this.marker.hide();var a=this.view,c=Math.max(this.minX,g.getPageX()),d=c-this.startPos,b=this.dragHeadersDisabled;a.onColumnSplitterMoved(this.cellIndex,this.cm.getColumnWidth(this.cellIndex)+d);setTimeout(function(){a.headersDisabled=b},50)},autoOffset:function(){this.setDelta(0,0)}});Ext.grid.PivotGridView=Ext.extend(Ext.grid.GridView,{colHeaderCellCls:"grid-hd-group-cell",title:"",getColumnHeaders:function(){return this.grid.topAxis.buildHeaders()},getRowHeaders:function(){return this.grid.leftAxis.buildHeaders()},renderRows:function(a,t){var b=this.grid,o=b.extractData(),p=o.length,g=this.templates,s=b.renderer,h=typeof s=="function",w=this.getCellCls,n=typeof w=="function",d=g.cell,x=g.row,k=[],q={},c="width:"+this.getGridInnerWidth()+"px;",l,r,e,v,m;a=a||0;t=Ext.isDefined(t)?t:p-1;for(v=0;v<p;v++){m=o[v];r=m.length;l=[];for(var u=0;u<r;u++){q.id=v+"-"+u;q.css=u===0?"x-grid3-cell-first ":(u==(r-1)?"x-grid3-cell-last ":"");q.attr=q.cellAttr="";q.value=m[u];if(Ext.isEmpty(q.value)){q.value="&#160;"}if(h){q.value=s(q.value)}if(n){q.css+=w(q.value)+" "}l[l.length]=d.apply(q)}k[k.length]=x.apply({tstyle:c,cols:r,cells:l.join(""),alt:""})}return k.join("")},masterTpl:new Ext.Template('<div class="x-grid3 x-pivotgrid" hidefocus="true">','<div class="x-grid3-viewport">','<div class="x-grid3-header">','<div class="x-grid3-header-title"><span>{title}</span></div>','<div class="x-grid3-header-inner">','<div class="x-grid3-header-offset" style="{ostyle}"></div>',"</div>",'<div class="x-clear"></div>',"</div>",'<div class="x-grid3-scroller">','<div class="x-grid3-row-headers"></div>','<div class="x-grid3-body" style="{bstyle}">{body}</div>','<a href="#" class="x-grid3-focus" tabIndex="-1"></a>',"</div>","</div>",'<div class="x-grid3-resize-marker">&#160;</div>','<div class="x-grid3-resize-proxy">&#160;</div>',"</div>"),initTemplates:function(){Ext.grid.PivotGridView.superclass.initTemplates.apply(this,arguments);var a=this.templates||{};if(!a.gcell){a.gcell=new Ext.XTemplate('<td class="x-grid3-hd x-grid3-gcell x-grid3-td-{id} ux-grid-hd-group-row-{row} '+this.colHeaderCellCls+'" style="{style}">','<div {tooltip} class="x-grid3-hd-inner x-grid3-hd-{id} x-unselectable" unselectable="on" style="{istyle}">',this.grid.enableHdMenu?'<a class="x-grid3-hd-btn" href="#"></a>':"","{value}","</div>","</td>")}this.templates=a;this.hrowRe=new RegExp("ux-grid-hd-group-row-(\\d+)","")},initElements:function(){Ext.grid.PivotGridView.superclass.initElements.apply(this,arguments);this.rowHeadersEl=new Ext.Element(this.scroller.child("div.x-grid3-row-headers"));this.headerTitleEl=new Ext.Element(this.mainHd.child("div.x-grid3-header-title"))},getGridInnerWidth:function(){var a=Ext.grid.PivotGridView.superclass.getGridInnerWidth.apply(this,arguments);return a-this.getTotalRowHeaderWidth()},getTotalRowHeaderWidth:function(){var d=this.getRowHeaders(),c=d.length,b=0,a;for(a=0;a<c;a++){b+=d[a].width}return b},getTotalColumnHeaderHeight:function(){return this.getColumnHeaders().length*21},getCellIndex:function(b){if(b){var a=b.className.match(this.colRe),c;if(a&&(c=a[1])){return parseInt(c.split("-")[1],10)}}return false},renderUI:function(){var b=this.templates,a=this.getGridInnerWidth();return b.master.apply({body:b.body.apply({rows:"&#160;"}),ostyle:"width:"+a+"px",bstyle:"width:"+a+"px"})},onLayout:function(b,a){Ext.grid.PivotGridView.superclass.onLayout.apply(this,arguments);var b=this.getGridInnerWidth();this.resizeColumnHeaders(b);this.resizeAllRows(b)},refresh:function(b){this.fireEvent("beforerefresh",this);this.grid.stopEditing(true);var a=this.renderBody();this.mainBody.update(a).setWidth(this.getGridInnerWidth());if(b===true){this.updateHeaders();this.updateHeaderSortState()}this.processRows(0,true);this.layout();this.applyEmptyText();this.fireEvent("refresh",this)},renderHeaders:Ext.emptyFn,fitColumns:Ext.emptyFn,resizeColumnHeaders:function(b){var a=this.grid.topAxis;if(a.rendered){a.el.setWidth(b)}},resizeRowHeaders:function(){var a=this.getTotalRowHeaderWidth(),b=String.format("margin-left: {0}px;",a);this.rowHeadersEl.setWidth(a);this.mainBody.applyStyles(b);Ext.fly(this.innerHd).applyStyles(b);this.headerTitleEl.setWidth(a);this.headerTitleEl.setHeight(this.getTotalColumnHeaderHeight())},resizeAllRows:function(b){var d=this.getRows(),c=d.length,a;for(a=0;a<c;a++){Ext.fly(d[a]).setWidth(b);Ext.fly(d[a]).child("table").setWidth(b)}},updateHeaders:function(){this.renderGroupRowHeaders();this.renderGroupColumnHeaders()},renderGroupRowHeaders:function(){var a=this.grid.leftAxis;this.resizeRowHeaders();a.rendered=false;a.render(this.rowHeadersEl);this.setTitle(this.title)},setTitle:function(a){this.headerTitleEl.child("span").dom.innerHTML=a},renderGroupColumnHeaders:function(){var a=this.grid.topAxis;a.rendered=false;a.render(this.innerHd.firstChild)},isMenuDisabled:function(a,b){return true}});Ext.grid.PivotAxis=Ext.extend(Ext.Component,{orientation:"horizontal",defaultHeaderWidth:80,paddingWidth:7,setDimensions:function(a){this.dimensions=a},onRender:function(b,a){var c=this.orientation=="horizontal"?this.renderHorizontalRows():this.renderVerticalRows();this.el=Ext.DomHelper.overwrite(b.dom,{tag:"table",cn:c},true)},renderHorizontalRows:function(){var k=this.buildHeaders(),a=k.length,g=[],c,h,e,d,b;for(d=0;d<a;d++){c=[];h=k[d].items;e=h.length;for(b=0;b<e;b++){c.push({tag:"td",html:h[b].header,colspan:h[b].span})}g[d]={tag:"tr",cn:c}}return g},renderVerticalRows:function(){var b=this.buildHeaders(),k=b.length,a=[],m=[],h,c,l,g,e,d;for(e=0;e<k;e++){c=b[e];g=c.width||80;h=c.items.length;for(d=0;d<h;d++){l=c.items[d];a[l.start]=a[l.start]||[];a[l.start].push({tag:"td",html:l.header,rowspan:l.span,width:Ext.isBorderBox?g:g-this.paddingWidth})}}h=a.length;for(e=0;e<h;e++){m[e]={tag:"tr",cn:a[e]}}return m},getTuples:function(){var b=new Ext.data.Store({});b.data=this.store.data.clone();b.fields=this.store.fields;var l=[],a=this.dimensions,c=a.length,j;for(j=0;j<c;j++){l.push({field:a[j].dataIndex,direction:a[j].direction||"ASC"})}b.sort(l);var e=b.data.items,n=[],k=[],o,h,d,g,m;c=e.length;for(j=0;j<c;j++){d=this.getRecordInfo(e[j]);g=d.data;h="";for(m in g){h+=g[m]+"---"}if(n.indexOf(h)==-1){n.push(h);k.push(d)}}b.destroy();return k},getRecordInfo:function(a){var e=this.dimensions,d=e.length,h={},j,c,b;for(b=0;b<d;b++){j=e[b];c=j.dataIndex;h[c]=a.get(c)}var g=function(i){return function(k){for(var l in i){if(k.get(l)!=i[l]){return false}}return true}};return{data:h,matcher:g(h)}},buildHeaders:function(){var l=this.getTuples(),m=l.length,a=this.dimensions,e,r=a.length,c=[],o,s,n,q,p,b,k,h,g,d;for(g=0;g<r;g++){e=a[g];s=[];p=0;b=0;for(d=0;d<m;d++){o=l[d];k=d==(m-1);n=o.data[e.dataIndex];h=q!=undefined&&q!=n;if(g>0&&d>0){h=h||o.data[a[g-1].dataIndex]!=l[d-1].data[a[g-1].dataIndex]}if(h){s.push({header:q,span:p,start:b});b+=p;p=0}if(k){s.push({header:n,span:p+1,start:b});b+=p;p=0}q=n;p++}c.push({items:s,width:e.width||this.defaultHeaderWidth});q=undefined}return c}});Ext.grid.HeaderDragZone=Ext.extend(Ext.dd.DragZone,{maxDragWidth:120,constructor:function(a,c,b){this.grid=a;this.view=a.getView();this.ddGroup="gridHeader"+this.grid.getGridEl().id;Ext.grid.HeaderDragZone.superclass.constructor.call(this,c);if(b){this.setHandleElId(Ext.id(c));this.setOuterHandleElId(Ext.id(b))}this.scroll=false},getDragData:function(c){var a=Ext.lib.Event.getTarget(c),b=this.view.findHeaderCell(a);if(b){return{ddel:b.firstChild,header:b}}return false},onInitDrag:function(a){this.dragHeadersDisabled=this.view.headersDisabled;this.view.headersDisabled=true;var b=this.dragData.ddel.cloneNode(true);b.id=Ext.id();b.style.width=Math.min(this.dragData.header.offsetWidth,this.maxDragWidth)+"px";this.proxy.update(b);return true},afterValidDrop:function(){this.completeDrop()},afterInvalidDrop:function(){this.completeDrop()},completeDrop:function(){var a=this.view,b=this.dragHeadersDisabled;setTimeout(function(){a.headersDisabled=b},50)}});Ext.grid.HeaderDropZone=Ext.extend(Ext.dd.DropZone,{proxyOffsets:[-4,-9],fly:Ext.Element.fly,constructor:function(a,c,b){this.grid=a;this.view=a.getView();this.proxyTop=Ext.DomHelper.append(document.body,{cls:"col-move-top",html:"&#160;"},true);this.proxyBottom=Ext.DomHelper.append(document.body,{cls:"col-move-bottom",html:"&#160;"},true);this.proxyTop.hide=this.proxyBottom.hide=function(){this.setLeftTop(-100,-100);this.setStyle("visibility","hidden")};this.ddGroup="gridHeader"+this.grid.getGridEl().id;Ext.grid.HeaderDropZone.superclass.constructor.call(this,a.getGridEl().dom)},getTargetFromEvent:function(c){var a=Ext.lib.Event.getTarget(c),b=this.view.findCellIndex(a);if(b!==false){return this.view.getHeaderCell(b)}},nextVisible:function(c){var b=this.view,a=this.grid.colModel;c=c.nextSibling;while(c){if(!a.isHidden(b.getCellIndex(c))){return c}c=c.nextSibling}return null},prevVisible:function(c){var b=this.view,a=this.grid.colModel;c=c.prevSibling;while(c){if(!a.isHidden(b.getCellIndex(c))){return c}c=c.prevSibling}return null},positionIndicator:function(d,k,j){var a=Ext.lib.Event.getPageX(j),g=Ext.lib.Dom.getRegion(k.firstChild),c,i,b=g.top+this.proxyOffsets[1];if((g.right-a)<=(g.right-g.left)/2){c=g.right+this.view.borderWidth;i="after"}else{c=g.left;i="before"}if(this.grid.colModel.isFixed(this.view.getCellIndex(k))){return false}c+=this.proxyOffsets[0];this.proxyTop.setLeftTop(c,b);this.proxyTop.show();if(!this.bottomOffset){this.bottomOffset=this.view.mainHd.getHeight()}this.proxyBottom.setLeftTop(c,b+this.proxyTop.dom.offsetHeight+this.bottomOffset);this.proxyBottom.show();return i},onNodeEnter:function(d,a,c,b){if(b.header!=d){this.positionIndicator(b.header,d,c)}},onNodeOver:function(g,b,d,c){var a=false;if(c.header!=g){a=this.positionIndicator(c.header,g,d)}if(!a){this.proxyTop.hide();this.proxyBottom.hide()}return a?this.dropAllowed:this.dropNotAllowed},onNodeOut:function(d,a,c,b){this.proxyTop.hide();this.proxyBottom.hide()},onNodeDrop:function(b,m,g,c){var d=c.header;if(d!=b){var k=this.grid.colModel,j=Ext.lib.Event.getPageX(g),a=Ext.lib.Dom.getRegion(b.firstChild),o=(a.right-j)<=((a.right-a.left)/2)?"after":"before",i=this.view.getCellIndex(d),l=this.view.getCellIndex(b);if(o=="after"){l++}if(i<l){l--}k.moveColumn(i,l);return true}return false}});Ext.grid.GridView.ColumnDragZone=Ext.extend(Ext.grid.HeaderDragZone,{constructor:function(a,b){Ext.grid.GridView.ColumnDragZone.superclass.constructor.call(this,a,b,null);this.proxy.el.addClass("x-grid3-col-dd")},handleMouseDown:function(a){},callHandleMouseDown:function(a){Ext.grid.GridView.ColumnDragZone.superclass.handleMouseDown.call(this,a)}});Ext.grid.SplitDragZone=Ext.extend(Ext.dd.DDProxy,{fly:Ext.Element.fly,constructor:function(a,c,b){this.grid=a;this.view=a.getView();this.proxy=this.view.resizeProxy;Ext.grid.SplitDragZone.superclass.constructor.call(this,c,"gridSplitters"+this.grid.getGridEl().id,{dragElId:Ext.id(this.proxy.dom),resizeFrame:false});this.setHandleElId(Ext.id(c));this.setOuterHandleElId(Ext.id(b));this.scroll=false},b4StartDrag:function(a,d){this.view.headersDisabled=true;this.proxy.setHeight(this.view.mainWrap.getHeight());var b=this.cm.getColumnWidth(this.cellIndex);var c=Math.max(b-this.grid.minColumnWidth,0);this.resetConstraints();this.setXConstraint(c,1000);this.setYConstraint(0,0);this.minX=a-c;this.maxX=a+1000;this.startPos=a;Ext.dd.DDProxy.prototype.b4StartDrag.call(this,a,d)},handleMouseDown:function(c){var b=Ext.EventObject.setEvent(c);var a=this.fly(b.getTarget());if(a.hasClass("x-grid-split")){this.cellIndex=this.view.getCellIndex(a.dom);this.split=a.dom;this.cm=this.grid.colModel;if(this.cm.isResizable(this.cellIndex)&&!this.cm.isFixed(this.cellIndex)){Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this,arguments)}}},endDrag:function(c){this.view.headersDisabled=false;var a=Math.max(this.minX,Ext.lib.Event.getPageX(c));var b=a-this.startPos;this.view.onColumnSplitterMoved(this.cellIndex,this.cm.getColumnWidth(this.cellIndex)+b)},autoOffset:function(){this.setDelta(0,0)}});Ext.grid.GridDragZone=function(b,a){this.view=b.getView();Ext.grid.GridDragZone.superclass.constructor.call(this,this.view.mainBody.dom,a);this.scroll=false;this.grid=b;this.ddel=document.createElement("div");this.ddel.className="x-grid-dd-wrap";this.preventDefault=true};Ext.extend(Ext.grid.GridDragZone,Ext.dd.DragZone,{ddGroup:"GridDD",getDragData:function(g){var c=Ext.lib.Event.getTarget(g),i,h=this.view.findRowIndex(c),b,a,d;if(h!==false){i=this.grid.selModel;if(i.getSelectedCell){b=this.view.findCellIndex(c);a=i.getSelectedCell();if(!a||a[0]!==h||a[1]!==b){i.handleMouseDown(this.grid,h,b,g)}if(this.grid.dragCell){d=i.getSelectedCell();if(!this.grid.hasOwnProperty("ddText")){this.grid.ddText="{0} selected cell{1}"}}else{d=[this.grid.store.getAt(h)]}}else{if(!i.isSelected(h)||g.hasModifier()){i.handleMouseDown(this.grid,h,g)}d=i.getSelections()}return{grid:this.grid,ddel:this.ddel,rowIndex:h,selections:d}}return false},onInitDrag:function(b){var a=this.dragData;this.ddel.innerHTML=this.grid.getDragDropText();this.proxy.update(this.ddel)},afterRepair:function(){this.dragging=false},getRepairXY:function(b,a){return false},onEndDrag:function(a,b){},onValidDrop:function(a,b,c){this.hideProxy()},beforeInvalidDrop:function(a,b){}});Ext.grid.ColumnModel=Ext.extend(Ext.util.Observable,{defaultWidth:100,defaultSortable:false,constructor:function(a){if(a.columns){Ext.apply(this,a);this.setConfig(a.columns,true)}else{this.setConfig(a,true)}this.addEvents("widthchange","headerchange","hiddenchange","columnmoved","configchange");Ext.grid.ColumnModel.superclass.constructor.call(this)},getColumnId:function(a){return this.config[a].id},getColumnAt:function(a){return this.config[a]},setConfig:function(d,b){var e,h,a;if(!b){delete this.totalWidth;for(e=0,a=this.config.length;e<a;e++){h=this.config[e];if(h.setEditor){h.setEditor(null)}}}this.defaults=Ext.apply({width:this.defaultWidth,sortable:this.defaultSortable},this.defaults);this.config=d;this.lookup={};for(e=0,a=d.length;e<a;e++){h=Ext.applyIf(d[e],this.defaults);if(Ext.isEmpty(h.id)){h.id=e}if(!h.isColumn){var g=Ext.grid.Column.types[h.xtype||"gridcolumn"];h=new g(h);d[e]=h}this.lookup[h.id]=h}if(!b){this.fireEvent("configchange",this)}},getColumnById:function(a){return this.lookup[a]},getIndexById:function(c){for(var b=0,a=this.config.length;b<a;b++){if(this.config[b].id==c){return b}}return -1},moveColumn:function(e,b){var a=this.config,d=a[e];a.splice(e,1);a.splice(b,0,d);this.dataMap=null;this.fireEvent("columnmoved",this,e,b)},getColumnCount:function(b){var d=this.config.length,e=0,a;if(b===true){for(a=0;a<d;a++){if(!this.isHidden(a)){e++}}return e}return d},getColumnsBy:function(g,e){var b=this.config,h=b.length,a=[],d,j;for(d=0;d<h;d++){j=b[d];if(g.call(e||this,j,d)===true){a[a.length]=j}}return a},isSortable:function(a){return !!this.config[a].sortable},isMenuDisabled:function(a){return !!this.config[a].menuDisabled},getRenderer:function(a){return this.config[a].renderer||Ext.grid.ColumnModel.defaultRenderer},getRendererScope:function(a){return this.config[a].scope},setRenderer:function(a,b){this.config[a].renderer=b},getColumnWidth:function(a){var b=this.config[a].width;if(typeof b!="number"){b=this.defaultWidth}return b},setColumnWidth:function(b,c,a){this.config[b].width=c;this.totalWidth=null;if(!a){this.fireEvent("widthchange",this,b,c)}},getTotalWidth:function(b){if(!this.totalWidth){this.totalWidth=0;for(var c=0,a=this.config.length;c<a;c++){if(b||!this.isHidden(c)){this.totalWidth+=this.getColumnWidth(c)}}}return this.totalWidth},getColumnHeader:function(a){return this.config[a].header},setColumnHeader:function(a,b){this.config[a].header=b;this.fireEvent("headerchange",this,a,b)},getColumnTooltip:function(a){return this.config[a].tooltip},setColumnTooltip:function(a,b){this.config[a].tooltip=b},getDataIndex:function(a){return this.config[a].dataIndex},setDataIndex:function(a,b){this.config[a].dataIndex=b},findColumnIndex:function(d){var e=this.config;for(var b=0,a=e.length;b<a;b++){if(e[b].dataIndex==d){return b}}return -1},isCellEditable:function(b,e){var d=this.config[b],a=d.editable;return !!(a||(!Ext.isDefined(a)&&d.editor))},getCellEditor:function(a,b){return this.config[a].getCellEditor(b)},setEditable:function(a,b){this.config[a].editable=b},isHidden:function(a){return !!this.config[a].hidden},isFixed:function(a){return !!this.config[a].fixed},isResizable:function(a){return a>=0&&this.config[a].resizable!==false&&this.config[a].fixed!==true},setHidden:function(a,b){var d=this.config[a];if(d.hidden!==b){d.hidden=b;this.totalWidth=null;this.fireEvent("hiddenchange",this,a,b)}},setEditor:function(a,b){this.config[a].setEditor(b)},destroy:function(){var b=this.config.length,a=0;for(;a<b;a++){this.config[a].destroy()}delete this.config;delete this.lookup;this.purgeListeners()},setState:function(a,b){b=Ext.applyIf(b,this.defaults);Ext.apply(this.config[a],b)}});Ext.grid.ColumnModel.defaultRenderer=function(a){if(typeof a=="string"&&a.length<1){return"&#160;"}return a};Ext.grid.AbstractSelectionModel=Ext.extend(Ext.util.Observable,{constructor:function(){this.locked=false;Ext.grid.AbstractSelectionModel.superclass.constructor.call(this)},init:function(a){this.grid=a;if(this.lockOnInit){delete this.lockOnInit;this.locked=false;this.lock()}this.initEvents()},lock:function(){if(!this.locked){this.locked=true;var a=this.grid;if(a){a.getView().on({scope:this,beforerefresh:this.sortUnLock,refresh:this.sortLock})}else{this.lockOnInit=true}}},sortLock:function(){this.locked=true},sortUnLock:function(){this.locked=false},unlock:function(){if(this.locked){this.locked=false;var a=this.grid,b;if(a){b=a.getView();b.un("beforerefresh",this.sortUnLock,this);b.un("refresh",this.sortLock,this)}else{delete this.lockOnInit}}},isLocked:function(){return this.locked},destroy:function(){this.unlock();this.purgeListeners()}});Ext.grid.RowSelectionModel=Ext.extend(Ext.grid.AbstractSelectionModel,{singleSelect:false,constructor:function(a){Ext.apply(this,a);this.selections=new Ext.util.MixedCollection(false,function(b){return b.id});this.last=false;this.lastActive=false;this.addEvents("selectionchange","beforerowselect","rowselect","rowdeselect");Ext.grid.RowSelectionModel.superclass.constructor.call(this)},initEvents:function(){if(!this.grid.enableDragDrop&&!this.grid.enableDrag){this.grid.on("rowmousedown",this.handleMouseDown,this)}this.rowNav=new Ext.KeyNav(this.grid.getGridEl(),{up:this.onKeyPress,down:this.onKeyPress,scope:this});this.grid.getView().on({scope:this,refresh:this.onRefresh,rowupdated:this.onRowUpdated,rowremoved:this.onRemove})},onKeyPress:function(g,b){var a=b=="up",h=a?"selectPrevious":"selectNext",d=a?-1:1,c;if(!g.shiftKey||this.singleSelect){this[h](false)}else{if(this.last!==false&&this.lastActive!==false){c=this.last;this.selectRange(this.last,this.lastActive+d);this.grid.getView().focusRow(this.lastActive);if(c!==false){this.last=c}}else{this.selectFirstRow()}}},onRefresh:function(){var g=this.grid.store,d=this.getSelections(),c=0,a=d.length,b,e;this.silent=true;this.clearSelections(true);for(;c<a;c++){e=d[c];if((b=g.indexOfId(e.id))!=-1){this.selectRow(b,true)}}if(d.length!=this.selections.getCount()){this.fireEvent("selectionchange",this)}this.silent=false},onRemove:function(a,b,c){if(this.selections.remove(c)!==false){this.fireEvent("selectionchange",this)}},onRowUpdated:function(a,b,c){if(this.isSelected(c)){a.onRowSelect(b)}},selectRecords:function(b,e){if(!e){this.clearSelections()}var d=this.grid.store,c=0,a=b.length;for(;c<a;c++){this.selectRow(d.indexOf(b[c]),true)}},getCount:function(){return this.selections.length},selectFirstRow:function(){this.selectRow(0)},selectLastRow:function(a){this.selectRow(this.grid.store.getCount()-1,a)},selectNext:function(a){if(this.hasNext()){this.selectRow(this.last+1,a);this.grid.getView().focusRow(this.last);return true}return false},selectPrevious:function(a){if(this.hasPrevious()){this.selectRow(this.last-1,a);this.grid.getView().focusRow(this.last);return true}return false},hasNext:function(){return this.last!==false&&(this.last+1)<this.grid.store.getCount()},hasPrevious:function(){return !!this.last},getSelections:function(){return[].concat(this.selections.items)},getSelected:function(){return this.selections.itemAt(0)},each:function(e,d){var c=this.getSelections(),b=0,a=c.length;for(;b<a;b++){if(e.call(d||this,c[b],b)===false){return false}}return true},clearSelections:function(a){if(this.isLocked()){return}if(a!==true){var c=this.grid.store,b=this.selections;b.each(function(d){this.deselectRow(c.indexOfId(d.id))},this);b.clear()}else{this.selections.clear()}this.last=false},selectAll:function(){if(this.isLocked()){return}this.selections.clear();for(var b=0,a=this.grid.store.getCount();b<a;b++){this.selectRow(b,true)}},hasSelection:function(){return this.selections.length>0},isSelected:function(a){var b=Ext.isNumber(a)?this.grid.store.getAt(a):a;return(b&&this.selections.key(b.id)?true:false)},isIdSelected:function(a){return(this.selections.key(a)?true:false)},handleMouseDown:function(d,i,h){if(h.button!==0||this.isLocked()){return}var a=this.grid.getView();if(h.shiftKey&&!this.singleSelect&&this.last!==false){var c=this.last;this.selectRange(c,i,h.ctrlKey);this.last=c;a.focusRow(i)}else{var b=this.isSelected(i);if(h.ctrlKey&&b){this.deselectRow(i)}else{if(!b||this.getCount()>1){this.selectRow(i,h.ctrlKey||h.shiftKey);a.focusRow(i)}}}},selectRows:function(c,d){if(!d){this.clearSelections()}for(var b=0,a=c.length;b<a;b++){this.selectRow(c[b],true)}},selectRange:function(b,a,d){var c;if(this.isLocked()){return}if(!d){this.clearSelections()}if(b<=a){for(c=b;c<=a;c++){this.selectRow(c,true)}}else{for(c=b;c>=a;c--){this.selectRow(c,true)}}},deselectRange:function(c,b,a){if(this.isLocked()){return}for(var d=c;d<=b;d++){this.deselectRow(d,a)}},selectRow:function(b,d,a){if(this.isLocked()||(b<0||b>=this.grid.store.getCount())||(d&&this.isSelected(b))){return}var c=this.grid.store.getAt(b);if(c&&this.fireEvent("beforerowselect",this,b,d,c)!==false){if(!d||this.singleSelect){this.clearSelections()}this.selections.add(c);this.last=this.lastActive=b;if(!a){this.grid.getView().onRowSelect(b)}if(!this.silent){this.fireEvent("rowselect",this,b,c);this.fireEvent("selectionchange",this)}}},deselectRow:function(b,a){if(this.isLocked()){return}if(this.last==b){this.last=false}if(this.lastActive==b){this.lastActive=false}var c=this.grid.store.getAt(b);if(c){this.selections.remove(c);if(!a){this.grid.getView().onRowDeselect(b)}this.fireEvent("rowdeselect",this,b,c);this.fireEvent("selectionchange",this)}},acceptsNav:function(c,b,a){return !a.isHidden(b)&&a.isCellEditable(b,c)},onEditorKey:function(n,l){var d=l.getKey(),h,i=this.grid,p=i.lastEdit,j=i.activeEditor,b=l.shiftKey,o,p,a,m;if(d==l.TAB){l.stopEvent();j.completeEdit();if(b){h=i.walkCells(j.row,j.col-1,-1,this.acceptsNav,this)}else{h=i.walkCells(j.row,j.col+1,1,this.acceptsNav,this)}}else{if(d==l.ENTER){if(this.moveEditorOnEnter!==false){if(b){h=i.walkCells(p.row-1,p.col,-1,this.acceptsNav,this)}else{h=i.walkCells(p.row+1,p.col,1,this.acceptsNav,this)}}}}if(h){a=h[0];m=h[1];this.onEditorSelect(a,p.row);if(i.isEditor&&i.editing){o=i.activeEditor;if(o&&o.field.triggerBlur){o.field.triggerBlur()}}i.startEditing(a,m)}},onEditorSelect:function(b,a){if(a!=b){this.selectRow(b)}},destroy:function(){Ext.destroy(this.rowNav);this.rowNav=null;Ext.grid.RowSelectionModel.superclass.destroy.call(this)}});Ext.grid.Column=Ext.extend(Ext.util.Observable,{isColumn:true,constructor:function(b){Ext.apply(this,b);if(Ext.isString(this.renderer)){this.renderer=Ext.util.Format[this.renderer]}else{if(Ext.isObject(this.renderer)){this.scope=this.renderer.scope;this.renderer=this.renderer.fn}}if(!this.scope){this.scope=this}var a=this.editor;delete this.editor;this.setEditor(a);this.addEvents("click","contextmenu","dblclick","mousedown");Ext.grid.Column.superclass.constructor.call(this)},processEvent:function(b,d,c,g,a){return this.fireEvent(b,this,c,g,d)},destroy:function(){if(this.setEditor){this.setEditor(null)}this.purgeListeners()},renderer:function(a){return a},getEditor:function(a){return this.editable!==false?this.editor:null},setEditor:function(b){var a=this.editor;if(a){if(a.gridEditor){a.gridEditor.destroy();delete a.gridEditor}else{a.destroy()}}this.editor=null;if(b){if(!b.isXType){b=Ext.create(b,"textfield")}this.editor=b}},getCellEditor:function(b){var a=this.getEditor(b);if(a){if(!a.startEdit){if(!a.gridEditor){a.gridEditor=new Ext.grid.GridEditor(a)}a=a.gridEditor}}return a}});Ext.grid.BooleanColumn=Ext.extend(Ext.grid.Column,{trueText:"true",falseText:"false",undefinedText:"&#160;",constructor:function(a){Ext.grid.BooleanColumn.superclass.constructor.call(this,a);var c=this.trueText,d=this.falseText,b=this.undefinedText;this.renderer=function(e){if(e===undefined){return b}if(!e||e==="false"){return d}return c}}});Ext.grid.NumberColumn=Ext.extend(Ext.grid.Column,{format:"0,000.00",constructor:function(a){Ext.grid.NumberColumn.superclass.constructor.call(this,a);this.renderer=Ext.util.Format.numberRenderer(this.format)}});Ext.grid.DateColumn=Ext.extend(Ext.grid.Column,{format:"m/d/Y",constructor:function(a){Ext.grid.DateColumn.superclass.constructor.call(this,a);this.renderer=Ext.util.Format.dateRenderer(this.format)}});Ext.grid.TemplateColumn=Ext.extend(Ext.grid.Column,{constructor:function(a){Ext.grid.TemplateColumn.superclass.constructor.call(this,a);var b=(!Ext.isPrimitive(this.tpl)&&this.tpl.compile)?this.tpl:new Ext.XTemplate(this.tpl);this.renderer=function(d,e,c){return b.apply(c.data)};this.tpl=b}});Ext.grid.ActionColumn=Ext.extend(Ext.grid.Column,{header:"&#160;",actionIdRe:/x-action-col-(\d+)/,altText:"",constructor:function(b){var g=this,c=b.items||(g.items=[g]),a=c.length,d,e;Ext.grid.ActionColumn.superclass.constructor.call(g,b);g.renderer=function(h,i){h=Ext.isFunction(b.renderer)?b.renderer.apply(this,arguments)||"":"";i.css+=" x-action-col-cell";for(d=0;d<a;d++){e=c[d];h+='<img alt="'+(e.altText||g.altText)+'" src="'+(e.icon||Ext.BLANK_IMAGE_URL)+'" class="x-action-col-icon x-action-col-'+String(d)+" "+(e.iconCls||"")+" "+(Ext.isFunction(e.getClass)?e.getClass.apply(e.scope||this.scope||this,arguments):"")+'"'+((e.tooltip)?' ext:qtip="'+e.tooltip+'"':"")+" />"}return h}},destroy:function(){delete this.items;delete this.renderer;return Ext.grid.ActionColumn.superclass.destroy.apply(this,arguments)},processEvent:function(c,i,d,j,b){var a=i.getTarget().className.match(this.actionIdRe),h,g;if(a&&(h=this.items[parseInt(a[1],10)])){if(c=="click"){(g=h.handler||this.handler)&&g.call(h.scope||this.scope||this,d,j,b,h,i)}else{if((c=="mousedown")&&(h.stopSelection!==false)){return false}}}return Ext.grid.ActionColumn.superclass.processEvent.apply(this,arguments)}});Ext.grid.Column.types={gridcolumn:Ext.grid.Column,booleancolumn:Ext.grid.BooleanColumn,numbercolumn:Ext.grid.NumberColumn,datecolumn:Ext.grid.DateColumn,templatecolumn:Ext.grid.TemplateColumn,actioncolumn:Ext.grid.ActionColumn};Ext.grid.RowNumberer=Ext.extend(Object,{header:"",width:23,sortable:false,constructor:function(a){Ext.apply(this,a);if(this.rowspan){this.renderer=this.renderer.createDelegate(this)}},fixed:true,hideable:false,menuDisabled:true,dataIndex:"",id:"numberer",rowspan:undefined,renderer:function(b,c,a,d){if(this.rowspan){c.cellAttr='rowspan="'+this.rowspan+'"'}return d+1}});Ext.grid.CheckboxSelectionModel=Ext.extend(Ext.grid.RowSelectionModel,{header:'<div class="x-grid3-hd-checker">&#160;</div>',width:20,sortable:false,menuDisabled:true,fixed:true,hideable:false,dataIndex:"",id:"checker",isColumn:true,constructor:function(){Ext.grid.CheckboxSelectionModel.superclass.constructor.apply(this,arguments);if(this.checkOnly){this.handleMouseDown=Ext.emptyFn}},initEvents:function(){Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);this.grid.on("render",function(){Ext.fly(this.grid.getView().innerHd).on("mousedown",this.onHdMouseDown,this)},this)},processEvent:function(b,d,c,g,a){if(b=="mousedown"){this.onMouseDown(d,d.getTarget());return false}else{return Ext.grid.Column.prototype.processEvent.apply(this,arguments)}},onMouseDown:function(c,b){if(c.button===0&&b.className=="x-grid3-row-checker"){c.stopEvent();var d=c.getTarget(".x-grid3-row");if(d){var a=d.rowIndex;if(this.isSelected(a)){this.deselectRow(a)}else{this.selectRow(a,true);this.grid.getView().focusRow(a)}}}},onHdMouseDown:function(c,a){if(a.className=="x-grid3-hd-checker"){c.stopEvent();var b=Ext.fly(a.parentNode);var d=b.hasClass("x-grid3-hd-checker-on");if(d){b.removeClass("x-grid3-hd-checker-on");this.clearSelections()}else{b.addClass("x-grid3-hd-checker-on");this.selectAll()}}},renderer:function(b,c,a){return'<div class="x-grid3-row-checker">&#160;</div>'},onEditorSelect:function(b,a){if(a!=b&&!this.checkOnly){this.selectRow(b)}}});Ext.grid.CellSelectionModel=Ext.extend(Ext.grid.AbstractSelectionModel,{constructor:function(a){Ext.apply(this,a);this.selection=null;this.addEvents("beforecellselect","cellselect","selectionchange");Ext.grid.CellSelectionModel.superclass.constructor.call(this)},initEvents:function(){this.grid.on("cellmousedown",this.handleMouseDown,this);this.grid.on(Ext.EventManager.getKeyEvent(),this.handleKeyDown,this);this.grid.getView().on({scope:this,refresh:this.onViewChange,rowupdated:this.onRowUpdated,beforerowremoved:this.clearSelections,beforerowsinserted:this.clearSelections});if(this.grid.isEditor){this.grid.on("beforeedit",this.beforeEdit,this)}},beforeEdit:function(a){this.select(a.row,a.column,false,true,a.record)},onRowUpdated:function(a,b,c){if(this.selection&&this.selection.record==c){a.onCellSelect(b,this.selection.cell[1])}},onViewChange:function(){this.clearSelections(true)},getSelectedCell:function(){return this.selection?this.selection.cell:null},clearSelections:function(b){var a=this.selection;if(a){if(b!==true){this.grid.view.onCellDeselect(a.cell[0],a.cell[1])}this.selection=null;this.fireEvent("selectionchange",this,null)}},hasSelection:function(){return this.selection?true:false},handleMouseDown:function(b,d,a,c){if(c.button!==0||this.isLocked()){return}this.select(d,a)},select:function(g,c,b,e,d){if(this.fireEvent("beforecellselect",this,g,c)!==false){this.clearSelections();d=d||this.grid.store.getAt(g);this.selection={record:d,cell:[g,c]};if(!b){var a=this.grid.getView();a.onCellSelect(g,c);if(e!==true){a.focusCell(g,c)}}this.fireEvent("cellselect",this,g,c);this.fireEvent("selectionchange",this,this.selection)}},isSelectable:function(c,b,a){return !a.isHidden(b)},onEditorKey:function(b,a){if(a.getKey()==a.TAB){this.handleKeyDown(a)}},handleKeyDown:function(j){if(!j.isNavKeyPress()){return}var d=j.getKey(),i=this.grid,p=this.selection,b=this,m=function(g,c,e){return i.walkCells(g,c,e,i.isEditor&&i.editing?b.acceptsNav:b.isSelectable,b)},o,h,a,l,n;switch(d){case j.ESC:case j.PAGE_UP:case j.PAGE_DOWN:break;default:j.stopEvent();break}if(!p){o=m(0,0,1);if(o){this.select(o[0],o[1])}return}o=p.cell;a=o[0];l=o[1];switch(d){case j.TAB:if(j.shiftKey){h=m(a,l-1,-1)}else{h=m(a,l+1,1)}break;case j.DOWN:h=m(a+1,l,1);break;case j.UP:h=m(a-1,l,-1);break;case j.RIGHT:h=m(a,l+1,1);break;case j.LEFT:h=m(a,l-1,-1);break;case j.ENTER:if(i.isEditor&&!i.editing){i.startEditing(a,l);return}break}if(h){a=h[0];l=h[1];this.select(a,l);if(i.isEditor&&i.editing){n=i.activeEditor;if(n&&n.field.triggerBlur){n.field.triggerBlur()}i.startEditing(a,l)}}},acceptsNav:function(c,b,a){return !a.isHidden(b)&&a.isCellEditable(b,c)}});Ext.grid.EditorGridPanel=Ext.extend(Ext.grid.GridPanel,{clicksToEdit:2,forceValidation:false,isEditor:true,detectEdit:false,autoEncode:false,trackMouseOver:false,initComponent:function(){Ext.grid.EditorGridPanel.superclass.initComponent.call(this);if(!this.selModel){this.selModel=new Ext.grid.CellSelectionModel()}this.activeEditor=null;this.addEvents("beforeedit","afteredit","validateedit")},initEvents:function(){Ext.grid.EditorGridPanel.superclass.initEvents.call(this);this.getGridEl().on("mousewheel",this.stopEditing.createDelegate(this,[true]),this);this.on("columnresize",this.stopEditing,this,[true]);if(this.clicksToEdit==1){this.on("cellclick",this.onCellDblClick,this)}else{var a=this.getView();if(this.clicksToEdit=="auto"&&a.mainBody){a.mainBody.on("mousedown",this.onAutoEditClick,this)}this.on("celldblclick",this.onCellDblClick,this)}},onResize:function(){Ext.grid.EditorGridPanel.superclass.onResize.apply(this,arguments);var a=this.activeEditor;if(this.editing&&a){a.realign(true)}},onCellDblClick:function(b,c,a){this.startEditing(c,a)},onAutoEditClick:function(c,b){if(c.button!==0){return}var g=this.view.findRowIndex(b),a=this.view.findCellIndex(b);if(g!==false&&a!==false){this.stopEditing();if(this.selModel.getSelectedCell){var d=this.selModel.getSelectedCell();if(d&&d[0]===g&&d[1]===a){this.startEditing(g,a)}}else{if(this.selModel.isSelected(g)){this.startEditing(g,a)}}}},onEditComplete:function(b,d,a){this.editing=false;this.lastActiveEditor=this.activeEditor;this.activeEditor=null;var c=b.record,h=this.colModel.getDataIndex(b.col);d=this.postEditValue(d,a,c,h);if(this.forceValidation===true||String(d)!==String(a)){var g={grid:this,record:c,field:h,originalValue:a,value:d,row:b.row,column:b.col,cancel:false};if(this.fireEvent("validateedit",g)!==false&&!g.cancel&&String(d)!==String(a)){c.set(h,g.value);delete g.cancel;this.fireEvent("afteredit",g)}}this.view.focusCell(b.row,b.col)},startEditing:function(i,c){this.stopEditing();if(this.colModel.isCellEditable(c,i)){this.view.ensureVisible(i,c,true);var d=this.store.getAt(i),h=this.colModel.getDataIndex(c),g={grid:this,record:d,field:h,value:d.data[h],row:i,column:c,cancel:false};if(this.fireEvent("beforeedit",g)!==false&&!g.cancel){this.editing=true;var b=this.colModel.getCellEditor(c,i);if(!b){return}if(!b.rendered){b.parentEl=this.view.getEditorParent(b);b.on({scope:this,render:{fn:function(e){e.field.focus(false,true)},single:true,scope:this},specialkey:function(k,j){this.getSelectionModel().onEditorKey(k,j)},complete:this.onEditComplete,canceledit:this.stopEditing.createDelegate(this,[true])})}Ext.apply(b,{row:i,col:c,record:d});this.lastEdit={row:i,col:c};this.activeEditor=b;if(b.field.isXType("checkbox")){b.allowBlur=false;this.setupCheckbox(b.field)}b.selectSameEditor=(this.activeEditor==this.lastActiveEditor);var a=this.preEditValue(d,h);b.startEdit(this.view.getCell(i,c).firstChild,Ext.isDefined(a)?a:"");(function(){delete b.selectSameEditor}).defer(50)}}},setupCheckbox:function(c){var b=this,a=function(){c.el.on("click",b.onCheckClick,b,{single:true})};if(c.rendered){a()}else{c.on("render",a,null,{single:true})}},onCheckClick:function(){var a=this.activeEditor;a.allowBlur=true;a.field.focus(false,10)},preEditValue:function(a,c){var b=a.data[c];return this.autoEncode&&Ext.isString(b)?Ext.util.Format.htmlDecode(b):b},postEditValue:function(c,a,b,d){return this.autoEncode&&Ext.isString(c)?Ext.util.Format.htmlEncode(c):c},stopEditing:function(b){if(this.editing){var a=this.lastActiveEditor=this.activeEditor;if(a){a[b===true?"cancelEdit":"completeEdit"]();this.view.focusCell(a.row,a.col)}this.activeEditor=null}this.editing=false}});Ext.reg("editorgrid",Ext.grid.EditorGridPanel);Ext.grid.GridEditor=function(b,a){Ext.grid.GridEditor.superclass.constructor.call(this,b,a);b.monitorTab=false};Ext.extend(Ext.grid.GridEditor,Ext.Editor,{alignment:"tl-tl",autoSize:"width",hideEl:false,cls:"x-small-editor x-grid-editor",shim:false,shadow:false});Ext.grid.PropertyRecord=Ext.data.Record.create([{name:"name",type:"string"},"value"]);Ext.grid.PropertyStore=Ext.extend(Ext.util.Observable,{constructor:function(a,b){this.grid=a;this.store=new Ext.data.Store({recordType:Ext.grid.PropertyRecord});this.store.on("update",this.onUpdate,this);if(b){this.setSource(b)}Ext.grid.PropertyStore.superclass.constructor.call(this)},setSource:function(c){this.source=c;this.store.removeAll();var b=[];for(var a in c){if(this.isEditableValue(c[a])){b.push(new Ext.grid.PropertyRecord({name:a,value:c[a]},a))}}this.store.loadRecords({records:b},{},true)},onUpdate:function(e,a,d){if(d==Ext.data.Record.EDIT){var b=a.data.value;var c=a.modified.value;if(this.grid.fireEvent("beforepropertychange",this.source,a.id,b,c)!==false){this.source[a.id]=b;a.commit();this.grid.fireEvent("propertychange",this.source,a.id,b,c)}else{a.reject()}}},getProperty:function(a){return this.store.getAt(a)},isEditableValue:function(a){return Ext.isPrimitive(a)||Ext.isDate(a)},setValue:function(d,c,a){var b=this.getRec(d);if(b){b.set("value",c);this.source[d]=c}else{if(a){this.source[d]=c;b=new Ext.grid.PropertyRecord({name:d,value:c},d);this.store.add(b)}}},remove:function(b){var a=this.getRec(b);if(a){this.store.remove(a);delete this.source[b]}},getRec:function(a){return this.store.getById(a)},getSource:function(){return this.source}});Ext.grid.PropertyColumnModel=Ext.extend(Ext.grid.ColumnModel,{nameText:"Name",valueText:"Value",dateFormat:"m/j/Y",trueText:"true",falseText:"false",constructor:function(c,b){var d=Ext.grid,e=Ext.form;this.grid=c;d.PropertyColumnModel.superclass.constructor.call(this,[{header:this.nameText,width:50,sortable:true,dataIndex:"name",id:"name",menuDisabled:true},{header:this.valueText,width:50,resizable:false,dataIndex:"value",id:"value",menuDisabled:true}]);this.store=b;var a=new e.Field({autoCreate:{tag:"select",children:[{tag:"option",value:"true",html:this.trueText},{tag:"option",value:"false",html:this.falseText}]},getValue:function(){return this.el.dom.value=="true"}});this.editors={date:new d.GridEditor(new e.DateField({selectOnFocus:true})),string:new d.GridEditor(new e.TextField({selectOnFocus:true})),number:new d.GridEditor(new e.NumberField({selectOnFocus:true,style:"text-align:left;"})),"boolean":new d.GridEditor(a,{autoSize:"both"})};this.renderCellDelegate=this.renderCell.createDelegate(this);this.renderPropDelegate=this.renderProp.createDelegate(this)},renderDate:function(a){return a.dateFormat(this.dateFormat)},renderBool:function(a){return this[a?"trueText":"falseText"]},isCellEditable:function(a,b){return a==1},getRenderer:function(a){return a==1?this.renderCellDelegate:this.renderPropDelegate},renderProp:function(a){return this.getPropertyName(a)},renderCell:function(d,b,c){var a=this.grid.customRenderers[c.get("name")];if(a){return a.apply(this,arguments)}var e=d;if(Ext.isDate(d)){e=this.renderDate(d)}else{if(typeof d=="boolean"){e=this.renderBool(d)}}return Ext.util.Format.htmlEncode(e)},getPropertyName:function(b){var a=this.grid.propertyNames;return a&&a[b]?a[b]:b},getCellEditor:function(a,e){var b=this.store.getProperty(e),d=b.data.name,c=b.data.value;if(this.grid.customEditors[d]){return this.grid.customEditors[d]}if(Ext.isDate(c)){return this.editors.date}else{if(typeof c=="number"){return this.editors.number}else{if(typeof c=="boolean"){return this.editors["boolean"]}else{return this.editors.string}}}},destroy:function(){Ext.grid.PropertyColumnModel.superclass.destroy.call(this);this.destroyEditors(this.editors);this.destroyEditors(this.grid.customEditors)},destroyEditors:function(b){for(var a in b){Ext.destroy(b[a])}}});Ext.grid.PropertyGrid=Ext.extend(Ext.grid.EditorGridPanel,{enableColumnMove:false,stripeRows:false,trackMouseOver:false,clicksToEdit:1,enableHdMenu:false,viewConfig:{forceFit:true},initComponent:function(){this.customRenderers=this.customRenderers||{};this.customEditors=this.customEditors||{};this.lastEditRow=null;var b=new Ext.grid.PropertyStore(this);this.propStore=b;var a=new Ext.grid.PropertyColumnModel(this,b);b.store.sort("name","ASC");this.addEvents("beforepropertychange","propertychange");this.cm=a;this.ds=b.store;Ext.grid.PropertyGrid.superclass.initComponent.call(this);this.mon(this.selModel,"beforecellselect",function(e,d,c){if(c===0){this.startEditing.defer(200,this,[d,1]);return false}},this)},onRender:function(){Ext.grid.PropertyGrid.superclass.onRender.apply(this,arguments);this.getGridEl().addClass("x-props-grid")},afterRender:function(){Ext.grid.PropertyGrid.superclass.afterRender.apply(this,arguments);if(this.source){this.setSource(this.source)}},setSource:function(a){this.propStore.setSource(a)},getSource:function(){return this.propStore.getSource()},setProperty:function(c,b,a){this.propStore.setValue(c,b,a)},removeProperty:function(a){this.propStore.remove(a)}});Ext.reg("propertygrid",Ext.grid.PropertyGrid);Ext.grid.GroupingView=Ext.extend(Ext.grid.GridView,{groupByText:"Group By This Field",showGroupsText:"Show in Groups",hideGroupedColumn:false,showGroupName:true,startCollapsed:false,enableGrouping:true,enableGroupingMenu:true,enableNoGroups:true,emptyGroupText:"(None)",ignoreAdd:false,groupTextTpl:"{text}",groupMode:"value",cancelEditOnToggle:true,initTemplates:function(){Ext.grid.GroupingView.superclass.initTemplates.call(this);this.state={};var a=this.grid.getSelectionModel();a.on(a.selectRow?"beforerowselect":"beforecellselect",this.onBeforeRowSelect,this);if(!this.startGroup){this.startGroup=new Ext.XTemplate('<div id="{groupId}" class="x-grid-group {cls}">','<div id="{groupId}-hd" class="x-grid-group-hd" style="{style}"><div class="x-grid-group-title">',this.groupTextTpl,"</div></div>",'<div id="{groupId}-bd" class="x-grid-group-body">')}this.startGroup.compile();if(!this.endGroup){this.endGroup="</div></div>"}},findGroup:function(a){return Ext.fly(a).up(".x-grid-group",this.mainBody.dom)},getGroups:function(){return this.hasRows()?this.mainBody.dom.childNodes:[]},onAdd:function(d,a,b){if(this.canGroup()&&!this.ignoreAdd){var c=this.getScrollState();this.fireEvent("beforerowsinserted",d,b,b+(a.length-1));this.refresh();this.restoreScroll(c);this.fireEvent("rowsinserted",d,b,b+(a.length-1))}else{if(!this.canGroup()){Ext.grid.GroupingView.superclass.onAdd.apply(this,arguments)}}},onRemove:function(e,a,b,d){Ext.grid.GroupingView.superclass.onRemove.apply(this,arguments);var c=document.getElementById(a._groupId);if(c&&c.childNodes[1].childNodes.length<1){Ext.removeNode(c)}this.applyEmptyText()},refreshRow:function(a){if(this.ds.getCount()==1){this.refresh()}else{this.isUpdating=true;Ext.grid.GroupingView.superclass.refreshRow.apply(this,arguments);this.isUpdating=false}},beforeMenuShow:function(){var c,a=this.hmenu.items,b=this.cm.config[this.hdCtxIndex].groupable===false;if((c=a.get("groupBy"))){c.setDisabled(b)}if((c=a.get("showGroups"))){c.setDisabled(b);c.setChecked(this.canGroup(),true)}},renderUI:function(){var a=Ext.grid.GroupingView.superclass.renderUI.call(this);if(this.enableGroupingMenu&&this.hmenu){this.hmenu.add("-",{itemId:"groupBy",text:this.groupByText,handler:this.onGroupByClick,scope:this,iconCls:"x-group-by-icon"});if(this.enableNoGroups){this.hmenu.add({itemId:"showGroups",text:this.showGroupsText,checked:true,checkHandler:this.onShowGroupsClick,scope:this})}this.hmenu.on("beforeshow",this.beforeMenuShow,this)}return a},processEvent:function(b,i){Ext.grid.GroupingView.superclass.processEvent.call(this,b,i);var h=i.getTarget(".x-grid-group-hd",this.mainBody);if(h){var g=this.getGroupField(),d=this.getPrefix(g),a=h.id.substring(d.length),c=new RegExp("gp-"+Ext.escapeRe(g)+"--hd");a=a.substr(0,a.length-3);if(a||c.test(h.id)){this.grid.fireEvent("group"+b,this.grid,g,a,i)}if(b=="mousedown"&&i.button==0){this.toggleGroup(h.parentNode)}}},onGroupByClick:function(){var a=this.grid;this.enableGrouping=true;a.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));a.fireEvent("groupchange",a,a.store.getGroupState());this.beforeMenuShow();this.refresh()},onShowGroupsClick:function(a,b){this.enableGrouping=b;if(b){this.onGroupByClick()}else{this.grid.store.clearGrouping();this.grid.fireEvent("groupchange",this,null)}},toggleRowIndex:function(c,a){if(!this.canGroup()){return}var b=this.getRow(c);if(b){this.toggleGroup(this.findGroup(b),a)}},toggleGroup:function(c,b){var a=Ext.get(c),d=Ext.util.Format.htmlEncode(a.id);b=Ext.isDefined(b)?b:a.hasClass("x-grid-group-collapsed");if(this.state[d]!==b){if(this.cancelEditOnToggle!==false){this.grid.stopEditing(true)}this.state[d]=b;a[b?"removeClass":"addClass"]("x-grid-group-collapsed")}},toggleAllGroups:function(c){var b=this.getGroups();for(var d=0,a=b.length;d<a;d++){this.toggleGroup(b[d],c)}},expandAllGroups:function(){this.toggleAllGroups(true)},collapseAllGroups:function(){this.toggleAllGroups(false)},getGroup:function(a,e,i,j,b,h){var c=this.cm.config[b],d=i?i.call(c.scope,a,{},e,j,b,h):String(a);if(d===""||d==="&#160;"){d=c.emptyGroupText||this.emptyGroupText}return d},getGroupField:function(){return this.grid.store.getGroupState()},afterRender:function(){if(!this.ds||!this.cm){return}Ext.grid.GroupingView.superclass.afterRender.call(this);if(this.grid.deferRowRender){this.updateGroupWidths()}},afterRenderUI:function(){Ext.grid.GroupingView.superclass.afterRenderUI.call(this);if(this.enableGroupingMenu&&this.hmenu){this.hmenu.add("-",{itemId:"groupBy",text:this.groupByText,handler:this.onGroupByClick,scope:this,iconCls:"x-group-by-icon"});if(this.enableNoGroups){this.hmenu.add({itemId:"showGroups",text:this.showGroupsText,checked:true,checkHandler:this.onShowGroupsClick,scope:this})}this.hmenu.on("beforeshow",this.beforeMenuShow,this)}},renderRows:function(){var a=this.getGroupField();var e=!!a;if(this.hideGroupedColumn){var b=this.cm.findColumnIndex(a),d=Ext.isDefined(this.lastGroupField);if(!e&&d){this.mainBody.update("");this.cm.setHidden(this.cm.findColumnIndex(this.lastGroupField),false);delete this.lastGroupField}else{if(e&&!d){this.lastGroupField=a;this.cm.setHidden(b,true)}else{if(e&&d&&a!==this.lastGroupField){this.mainBody.update("");var c=this.cm.findColumnIndex(this.lastGroupField);this.cm.setHidden(c,false);this.lastGroupField=a;this.cm.setHidden(b,true)}}}}return Ext.grid.GroupingView.superclass.renderRows.apply(this,arguments)},doRender:function(c,h,q,a,p,s){if(h.length<1){return""}if(!this.canGroup()||this.isUpdating){return Ext.grid.GroupingView.superclass.doRender.apply(this,arguments)}var z=this.getGroupField(),o=this.cm.findColumnIndex(z),w,j="width:"+this.getTotalWidth()+";",e=this.cm.config[o],b=e.groupRenderer||e.renderer,t=this.showGroupName?(e.groupName||e.header)+": ":"",y=[],l,u,v,n;for(u=0,v=h.length;u<v;u++){var k=a+u,m=h[u],d=m.data[z];w=this.getGroup(d,m,b,k,o,q);if(!l||l.group!=w){n=this.constructId(d,z,o);this.state[n]=!(Ext.isDefined(this.state[n])?!this.state[n]:this.startCollapsed);l={group:w,gvalue:d,text:t+w,groupId:n,startRow:k,rs:[m],cls:this.state[n]?"":"x-grid-group-collapsed",style:j};y.push(l)}else{l.rs.push(m)}m._groupId=n}var x=[];for(u=0,v=y.length;u<v;u++){w=y[u];this.doGroupStart(x,w,c,q,p);x[x.length]=Ext.grid.GroupingView.superclass.doRender.call(this,c,w.rs,q,w.startRow,p,s);this.doGroupEnd(x,w,c,q,p)}return x.join("")},getGroupId:function(a){var b=this.getGroupField();return this.constructId(a,b,this.cm.findColumnIndex(b))},constructId:function(c,e,a){var b=this.cm.config[a],d=b.groupRenderer||b.renderer,g=(this.groupMode=="value")?c:this.getGroup(c,{data:{}},d,0,a,this.ds);return this.getPrefix(e)+Ext.util.Format.htmlEncode(g)},canGroup:function(){return this.enableGrouping&&!!this.getGroupField()},getPrefix:function(a){return this.grid.getGridEl().id+"-gp-"+a+"-"},doGroupStart:function(a,d,b,e,c){a[a.length]=this.startGroup.apply(d)},doGroupEnd:function(a,d,b,e,c){a[a.length]=this.endGroup},getRows:function(){if(!this.canGroup()){return Ext.grid.GroupingView.superclass.getRows.call(this)}var k=[],c=this.getGroups(),h,e=0,a=c.length,d,b;for(;e<a;++e){h=c[e].childNodes[1];if(h){h=h.childNodes;for(d=0,b=h.length;d<b;++d){k[k.length]=h[d]}}}return k},updateGroupWidths:function(){if(!this.canGroup()||!this.hasRows()){return}var c=Math.max(this.cm.getTotalWidth(),this.el.dom.offsetWidth-this.getScrollOffset())+"px";var b=this.getGroups();for(var d=0,a=b.length;d<a;d++){b[d].firstChild.style.width=c}},onColumnWidthUpdated:function(c,a,b){Ext.grid.GroupingView.superclass.onColumnWidthUpdated.call(this,c,a,b);this.updateGroupWidths()},onAllColumnWidthsUpdated:function(a,b){Ext.grid.GroupingView.superclass.onAllColumnWidthsUpdated.call(this,a,b);this.updateGroupWidths()},onColumnHiddenUpdated:function(b,c,a){Ext.grid.GroupingView.superclass.onColumnHiddenUpdated.call(this,b,c,a);this.updateGroupWidths()},onLayout:function(){this.updateGroupWidths()},onBeforeRowSelect:function(b,a){this.toggleRowIndex(a,true)}});Ext.grid.GroupingView.GROUP_ID=1000; \ No newline at end of file
diff --git a/deluge/ui/web/js/extjs/ext-base-debug.js b/deluge/ui/web/js/extjs/ext-base-debug.js
new file mode 100644
index 0000000..7b20934
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-base-debug.js
@@ -0,0 +1,3352 @@
+/*
+This file is part of Ext JS 3.4
+
+Copyright (c) 2011-2013 Sencha Inc
+
+Contact: http://www.sencha.com/contact
+
+GNU General Public License Usage
+This file may be used under the terms of the GNU General Public License version 3.0 as
+published by the Free Software Foundation and appearing in the file LICENSE included in the
+packaging of this file.
+
+Please review the following information to ensure the GNU General Public License version 3.0
+requirements will be met: http://www.gnu.org/copyleft/gpl.html.
+
+If you are unsure which license is appropriate for your use, please contact the sales department
+at http://www.sencha.com/contact.
+
+Build date: 2013-04-03 15:07:25
+*/
+// for old browsers
+window.undefined = window.undefined;
+
+/**
+ * @class Ext
+ * Ext core utilities and functions.
+ * @singleton
+ */
+
+Ext = {
+ /**
+ * The version of the framework
+ * @type String
+ */
+ version : '3.4.1.1',
+ versionDetail : {
+ major : 3,
+ minor : 4,
+ patch : 1.1
+ }
+};
+
+/**
+ * Copies all the properties of config to obj.
+ * @param {Object} obj The receiver of the properties
+ * @param {Object} config The source of the properties
+ * @param {Object} defaults A different object that will also be applied for default values
+ * @return {Object} returns obj
+ * @member Ext apply
+ */
+Ext.apply = function(o, c, defaults){
+ // no "this" reference for friendly out of scope calls
+ if(defaults){
+ Ext.apply(o, defaults);
+ }
+ if(o && c && typeof c == 'object'){
+ for(var p in c){
+ o[p] = c[p];
+ }
+ }
+ return o;
+};
+
+(function(){
+ var idSeed = 0,
+ toString = Object.prototype.toString,
+ ua = navigator.userAgent.toLowerCase(),
+ check = function(r){
+ return r.test(ua);
+ },
+ DOC = document,
+ docMode = DOC.documentMode,
+ isStrict = DOC.compatMode == "CSS1Compat",
+ isOpera = check(/opera/),
+ isChrome = check(/\bchrome\b/),
+ isWebKit = check(/webkit/),
+ isSafari = !isChrome && check(/safari/),
+ isSafari2 = isSafari && check(/applewebkit\/4/), // unique to Safari 2
+ isSafari3 = isSafari && check(/version\/3/),
+ isSafari4 = isSafari && check(/version\/4/),
+ isIE = !isOpera && check(/msie/),
+ isIE7 = isIE && ((check(/msie 7/) && docMode != 8 && docMode != 9 && docMode != 10) || docMode == 7),
+ isIE8 = isIE && ((check(/msie 8/) && docMode != 7 && docMode != 9 && docMode != 10) || docMode == 8),
+ isIE9 = isIE && ((check(/msie 9/) && docMode != 7 && docMode != 8 && docMode != 10) || docMode == 9),
+ isIE10 = isIE && ((check(/msie 10/) && docMode != 7 && docMode != 8 && docMode != 9) || docMode == 10),
+ isIE6 = isIE && check(/msie 6/),
+ isIE9m = isIE && (isIE6 || isIE7 || isIE8 || isIE9),
+ isGecko = !isWebKit && check(/gecko/),
+ isGecko2 = isGecko && check(/rv:1\.8/),
+ isGecko3 = isGecko && check(/rv:1\.9/),
+ isBorderBox = isIE9m && !isStrict,
+ isWindows = check(/windows|win32/),
+ isMac = check(/macintosh|mac os x/),
+ isAir = check(/adobeair/),
+ isLinux = check(/linux/),
+ isSecure = /^https/i.test(window.location.protocol),
+ noArgs = [],
+ nonEnumerables = [],
+ emptyFn = Ext.emptyFn,
+ t = Ext.apply({}, {
+ constructor: emptyFn,
+ toString: emptyFn,
+ valueOf: emptyFn
+ }),
+ callOverrideParent = function () {
+ var method = callOverrideParent.caller.caller; // skip callParent (our caller)
+ return method.$owner.prototype[method.$name].apply(this, arguments);
+ };
+
+ if (t.constructor !== emptyFn) {
+ nonEnumerables.push('constructor');
+ }
+ if (t.toString !== emptyFn) {
+ nonEnumerables.push('toString');
+ }
+ if (t.valueOf !== emptyFn) {
+ nonEnumerables.push('valueOf');
+ }
+ if (!nonEnumerables.length) {
+ nonEnumerables = null;
+ }
+
+ // Create the abstract Base class to provide an empty constructor and callParent implementations
+ function Base () {
+ //
+ }
+
+ Ext.apply(Base, {
+ $isClass: true,
+
+ callParent: function (args) {
+ var method;
+
+ // This code is intentionally inlined for the least number of debugger stepping
+ return (method = this.callParent.caller) && (method.$previous ||
+ ((method = method.$owner ? method : method.caller) &&
+ method.$owner.superclass.self[method.$name])).apply(this, args || noArgs);
+ }
+ });
+
+ Base.prototype = {
+ constructor: function() {
+ },
+ callParent: function(args) {
+ // NOTE: this code is deliberately as few expressions (and no function calls)
+ // as possible so that a debugger can skip over this noise with the minimum number
+ // of steps. Basically, just hit Step Into until you are where you really wanted
+ // to be.
+ var method,
+ superMethod = (method = this.callParent.caller) && (method.$previous ||
+ ((method = method.$owner ? method : method.caller) &&
+ method.$owner.superclass[method.$name]));
+
+ return superMethod.apply(this, args || noArgs);
+ }
+ };
+
+ // remove css image flicker
+ if(isIE6){
+ try{
+ DOC.execCommand("BackgroundImageCache", false, true);
+ }catch(e){}
+ }
+
+ Ext.apply(Ext, {
+ /**
+ * URL to a blank file used by Ext when in secure mode for iframe src and onReady src to prevent
+ * the IE insecure content warning (<tt>'about:blank'</tt>, except for IE in secure mode, which is <tt>'javascript:""'</tt>).
+ * @type String
+ */
+ SSL_SECURE_URL : isSecure && isIE ? 'javascript:""' : 'about:blank',
+ /**
+ * True if the browser is in strict (standards-compliant) mode, as opposed to quirks mode
+ * @type Boolean
+ */
+ isStrict : isStrict,
+ /**
+ * True if the page is running over SSL
+ * @type Boolean
+ */
+ isSecure : isSecure,
+ /**
+ * True when the document is fully initialized and ready for action
+ * @type Boolean
+ */
+ isReady : false,
+
+ /**
+ * True if the {@link Ext.Fx} Class is available
+ * @type Boolean
+ * @property enableFx
+ */
+
+ /**
+ * HIGHLY EXPERIMENTAL
+ * True to force css based border-box model override and turning off javascript based adjustments. This is a
+ * runtime configuration and must be set before onReady.
+ * @type Boolean
+ */
+ enableForcedBoxModel : false,
+
+ /**
+ * True to automatically uncache orphaned Ext.Elements periodically (defaults to true)
+ * @type Boolean
+ */
+ enableGarbageCollector : true,
+
+ /**
+ * True to automatically purge event listeners during garbageCollection (defaults to false).
+ * @type Boolean
+ */
+ enableListenerCollection : false,
+
+ /**
+ * EXPERIMENTAL - True to cascade listener removal to child elements when an element is removed.
+ * Currently not optimized for performance.
+ * @type Boolean
+ */
+ enableNestedListenerRemoval : false,
+
+ /**
+ * Indicates whether to use native browser parsing for JSON methods.
+ * This option is ignored if the browser does not support native JSON methods.
+ * <b>Note: Native JSON methods will not work with objects that have functions.
+ * Also, property names must be quoted, otherwise the data will not parse.</b> (Defaults to false)
+ * @type Boolean
+ */
+ USE_NATIVE_JSON : false,
+
+ /**
+ * Copies all the properties of config to obj if they don't already exist.
+ * @param {Object} obj The receiver of the properties
+ * @param {Object} config The source of the properties
+ * @return {Object} returns obj
+ */
+ applyIf : function(o, c){
+ if(o){
+ for(var p in c){
+ if(!Ext.isDefined(o[p])){
+ o[p] = c[p];
+ }
+ }
+ }
+ return o;
+ },
+
+ /**
+ * Generates unique ids. If the element already has an id, it is unchanged
+ * @param {Mixed} el (optional) The element to generate an id for
+ * @param {String} prefix (optional) Id prefix (defaults "ext-gen")
+ * @return {String} The generated Id.
+ */
+ id : function(el, prefix){
+ el = Ext.getDom(el, true) || {};
+ if (!el.id) {
+ el.id = (prefix || "ext-gen") + (++idSeed);
+ }
+ return el.id;
+ },
+
+ /**
+ * <p>Extends one class to create a subclass and optionally overrides members with the passed literal. This method
+ * also adds the function "override()" to the subclass that can be used to override members of the class.</p>
+ * For example, to create a subclass of Ext GridPanel:
+ * <pre><code>
+MyGridPanel = Ext.extend(Ext.grid.GridPanel, {
+ constructor: function(config) {
+
+// Create configuration for this Grid.
+ var store = new Ext.data.Store({...});
+ var colModel = new Ext.grid.ColumnModel({...});
+
+// Create a new config object containing our computed properties
+// *plus* whatever was in the config parameter.
+ config = Ext.apply({
+ store: store,
+ colModel: colModel
+ }, config);
+
+ MyGridPanel.superclass.constructor.call(this, config);
+
+// Your postprocessing here
+ },
+
+ yourMethod: function() {
+ // etc.
+ }
+});
+</code></pre>
+ *
+ * <p>This function also supports a 3-argument call in which the subclass's constructor is
+ * passed as an argument. In this form, the parameters are as follows:</p>
+ * <div class="mdetail-params"><ul>
+ * <li><code>subclass</code> : Function <div class="sub-desc">The subclass constructor.</div></li>
+ * <li><code>superclass</code> : Function <div class="sub-desc">The constructor of class being extended</div></li>
+ * <li><code>overrides</code> : Object <div class="sub-desc">A literal with members which are copied into the subclass's
+ * prototype, and are therefore shared among all instances of the new class.</div></li>
+ * </ul></div>
+ *
+ * @param {Function} superclass The constructor of class being extended.
+ * @param {Object} overrides <p>A literal with members which are copied into the subclass's
+ * prototype, and are therefore shared between all instances of the new class.</p>
+ * <p>This may contain a special member named <tt><b>constructor</b></tt>. This is used
+ * to define the constructor of the new class, and is returned. If this property is
+ * <i>not</i> specified, a constructor is generated and returned which just calls the
+ * superclass's constructor passing on its parameters.</p>
+ * <p><b>It is essential that you call the superclass constructor in any provided constructor. See example code.</b></p>
+ * @return {Function} The subclass constructor from the <code>overrides</code> parameter, or a generated one if not provided.
+ */
+ extend : function(){
+ // inline overrides
+ var io = function(o){
+ for(var m in o){
+ this[m] = o[m];
+ }
+ };
+ var oc = Object.prototype.constructor;
+
+ return function(sb, sp, overrides){
+ if(typeof sp == 'object'){
+ overrides = sp;
+ sp = sb;
+ sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};
+ }
+ var F = function(){},
+ sbp,
+ spp = sp.prototype;
+
+ F.prototype = spp;
+ sbp = sb.prototype = new F();
+ sbp.constructor=sb;
+ sb.superclass=spp;
+ if(spp.constructor == oc){
+ spp.constructor=sp;
+ }
+ sb.override = function(o){
+ Ext.override(sb, o);
+ };
+ sbp.superclass = sbp.supr = (function(){
+ return spp;
+ });
+ sbp.override = io;
+ Ext.override(sb, overrides);
+ sb.extend = function(o){return Ext.extend(sb, o);};
+ return sb;
+ };
+ }(),
+
+ global: (function () {
+ return this;
+ })(),
+
+ Base: Base,
+
+ namespaceCache: {},
+
+ createNamespace: function (namespaceOrClass, isClass) {
+ var cache = Ext.namespaceCache,
+ namespace = isClass ? namespaceOrClass.substring(0, namespaceOrClass.lastIndexOf('.'))
+ : namespaceOrClass,
+ ns = cache[namespace],
+ i, n, part, parts, partials;
+
+ if (!ns) {
+ ns = Ext.global;
+ if (namespace) {
+ partials = [];
+ parts = namespace.split('.');
+
+ for (i = 0, n = parts.length; i < n; ++i) {
+ part = parts[i];
+
+ ns = ns[part] || (ns[part] = {});
+ partials.push(part);
+
+ cache[partials.join('.')] = ns; // build up prefixes as we go
+ }
+ }
+ }
+
+ return ns;
+ },
+
+ getClassByName: function (className) {
+ var parts = className.split('.'),
+ cls = Ext.global,
+ n = parts.length,
+ i;
+
+ for (i = 0; cls && i < n; ++i) {
+ cls = cls[parts[i]];
+ }
+
+ return cls || null;
+ },
+
+ addMembers: function (cls, target, members, handleNonEnumerables) {
+ var i, name, member;
+
+ for (name in members) {
+ if (members.hasOwnProperty(name)) {
+ member = members[name];
+ if (typeof member == 'function') {
+ member.$owner = cls;
+ member.$name = name;
+ }
+
+ target[name] = member;
+ }
+ }
+
+ if (handleNonEnumerables && nonEnumerables) {
+ for (i = nonEnumerables.length; i-- > 0; ) {
+ name = nonEnumerables[i];
+ if (members.hasOwnProperty(name)) {
+ member = members[name];
+ if (typeof member == 'function') {
+ member.$owner = cls;
+ member.$name = name;
+ }
+
+ target[name] = member;
+ }
+ }
+ }
+ },
+
+ /**
+ * @method
+ * Defines a class or override. A basic class is defined like this:
+ *
+ * Ext.define('My.awesome.Class', {
+ * someProperty: 'something',
+ *
+ * someMethod: function(s) {
+ * alert(s + this.someProperty);
+ * }
+ *
+ * ...
+ * });
+ *
+ * var obj = new My.awesome.Class();
+ *
+ * obj.someMethod('Say '); // alerts 'Say something'
+ *
+ * To create an anonymous class, pass `null` for the `className`:
+ *
+ * Ext.define(null, {
+ * constructor: function () {
+ * // ...
+ * }
+ * });
+ *
+ * In some cases, it is helpful to create a nested scope to contain some private
+ * properties. The best way to do this is to pass a function instead of an object
+ * as the second parameter. This function will be called to produce the class
+ * body:
+ *
+ * Ext.define('MyApp.foo.Bar', function () {
+ * var id = 0;
+ *
+ * return {
+ * nextId: function () {
+ * return ++id;
+ * }
+ * };
+ * });
+ *
+ * When using this form of `Ext.define`, the function is passed a reference to its
+ * class. This can be used as an efficient way to access any static properties you
+ * may have:
+ *
+ * Ext.define('MyApp.foo.Bar', function (Bar) {
+ * return {
+ * statics: {
+ * staticMethod: function () {
+ * // ...
+ * }
+ * },
+ *
+ * method: function () {
+ * return Bar.staticMethod();
+ * }
+ * };
+ * });
+ *
+ * To define an override, include the `override` property. The content of an
+ * override is aggregated with the specified class in order to extend or modify
+ * that class. This can be as simple as setting default property values or it can
+ * extend and/or replace methods. This can also extend the statics of the class.
+ *
+ * One use for an override is to break a large class into manageable pieces.
+ *
+ * // File: /src/app/Panel.js
+ *
+ * Ext.define('My.app.Panel', {
+ * extend: 'Ext.panel.Panel',
+ *
+ * constructor: function (config) {
+ * this.callParent(arguments); // calls Ext.panel.Panel's constructor
+ * //...
+ * },
+ *
+ * statics: {
+ * method: function () {
+ * return 'abc';
+ * }
+ * }
+ * });
+ *
+ * // File: /src/app/PanelPart2.js
+ * Ext.define('My.app.PanelPart2', {
+ * override: 'My.app.Panel',
+ *
+ * constructor: function (config) {
+ * this.callParent(arguments); // calls My.app.Panel's constructor
+ * //...
+ * }
+ * });
+ *
+ * Another use of overrides is to provide optional parts of classes that can be
+ * independently required. In this case, the class may even be unaware of the
+ * override altogether.
+ *
+ * Ext.define('My.ux.CoolTip', {
+ * override: 'Ext.tip.ToolTip',
+ *
+ * constructor: function (config) {
+ * this.callParent(arguments); // calls Ext.tip.ToolTip's constructor
+ * //...
+ * }
+ * });
+ *
+ * Overrides can also contain statics:
+ *
+ * Ext.define('My.app.BarMod', {
+ * override: 'Ext.foo.Bar',
+ *
+ * statics: {
+ * method: function (x) {
+ * return this.callParent([x * 2]); // call Ext.foo.Bar.method
+ * }
+ * }
+ * });
+ *
+ * @param {String} className The class name to create in string dot-namespaced format, for example:
+ * 'My.very.awesome.Class', 'FeedViewer.plugin.CoolPager'
+ * It is highly recommended to follow this simple convention:
+ * - The root and the class name are 'CamelCased'
+ * - Everything else is lower-cased
+ * Pass `null` to create an anonymous class.
+ * @param {Object} data The key - value pairs of properties to apply to this class. Property names can be of any valid
+ * strings, except those in the reserved listed below:
+ * - `mixins`
+ * - `statics`
+ * - `config`
+ * - `alias`
+ * - `self`
+ * - `singleton`
+ * - `alternateClassName`
+ * - `override`
+ *
+ * @param {Function} createdFn Optional callback to execute after the class is created, the execution scope of which
+ * (`this`) will be the newly created class itself.
+ * @return {Ext.Base}
+ * @markdown
+ * @member Ext
+ * @method define
+ */
+ define: function (className, body, createdFn) {
+ var override = body.override,
+ cls, extend, name, namespace;
+
+ if (override) {
+ delete body.override;
+ cls = Ext.getClassByName(override);
+ Ext.override(cls, body);
+ } else {
+ if (className) {
+ namespace = Ext.createNamespace(className, true);
+ name = className.substring(className.lastIndexOf('.')+1);
+ }
+
+ cls = function ctor () {
+ this.constructor.apply(this, arguments);
+ }
+
+ if (className) {
+ cls.displayName = className;
+ }
+ cls.$isClass = true;
+ cls.callParent = Ext.Base.callParent;
+
+ if (typeof body == 'function') {
+ body = body(cls);
+ }
+
+ extend = body.extend;
+ if (extend) {
+ delete body.extend;
+ if (typeof extend == 'string') {
+ extend = Ext.getClassByName(extend);
+ }
+ } else {
+ extend = Base;
+ }
+
+ Ext.extend(cls, extend, body);
+ if (cls.prototype.constructor === cls) {
+ delete cls.prototype.constructor;
+ }
+
+ // Not extending a class which derives from Base...
+ if (!cls.prototype.$isClass) {
+ Ext.applyIf(cls.prototype, Base.prototype);
+ }
+ cls.prototype.self = cls;
+
+ if (body.xtype) {
+ Ext.reg(body.xtype, cls);
+ }
+ cls = body.singleton ? new cls() : cls;
+ if (className) {
+ namespace[name] = cls;
+ }
+ }
+
+ if (createdFn) {
+ createdFn.call(cls);
+ }
+
+ return cls;
+ },
+
+ /**
+ * Overrides members of the specified `target` with the given values.
+ *
+ * If the `target` is a function, it is assumed to be a constructor and the contents
+ * of `overrides` are applied to its `prototype` using {@link Ext#apply Ext.apply}.
+ *
+ * If the `target` is an instance of a class created using {@link #define},
+ * the `overrides` are applied to only that instance. In this case, methods are
+ * specially processed to allow them to use {@link Ext.Base#callParent}.
+ *
+ * var panel = new Ext.Panel({ ... });
+ *
+ * Ext.override(panel, {
+ * initComponent: function () {
+ * // extra processing...
+ *
+ * this.callParent();
+ * }
+ * });
+ *
+ * If the `target` is none of these, the `overrides` are applied to the `target`
+ * using {@link Ext#apply Ext.apply}.
+ *
+ * Please refer to {@link Ext#define Ext.define} for further details.
+ *
+ * @param {Object} target The target to override.
+ * @param {Object} overrides The properties to add or replace on `target`.
+ * @method override
+ */
+ override: function (target, overrides) {
+ var proto, statics;
+
+ if (overrides) {
+ if (target.$isClass) {
+ statics = overrides.statics;
+ if (statics) {
+ delete overrides.statics;
+ }
+
+ Ext.addMembers(target, target.prototype, overrides, true);
+ if (statics) {
+ Ext.addMembers(target, target, statics);
+ }
+ } else if (typeof target == 'function') {
+ proto = target.prototype;
+ Ext.apply(proto, overrides);
+ if(Ext.isIE && overrides.hasOwnProperty('toString')){
+ proto.toString = overrides.toString;
+ }
+ } else {
+ var owner = target.self,
+ name, value;
+
+ if (owner && owner.$isClass) {
+ for (name in overrides) {
+ if (overrides.hasOwnProperty(name)) {
+ value = overrides[name];
+
+ if (typeof value == 'function') {
+ //<debug>
+ if (owner.$className) {
+ value.displayName = owner.$className + '#' + name;
+ }
+ //</debug>
+
+ value.$name = name;
+ value.$owner = owner;
+ value.$previous = target.hasOwnProperty(name)
+ ? target[name] // already hooked, so call previous hook
+ : callOverrideParent; // calls by name on prototype
+ }
+
+ target[name] = value;
+ }
+ }
+ } else {
+ Ext.apply(target, overrides);
+
+ if (!target.constructor.$isClass) {
+ target.constructor.prototype.callParent = Base.prototype.callParent;
+ target.constructor.callParent = Base.callParent;
+ }
+ }
+ }
+ }
+ },
+
+ /**
+ * Creates namespaces to be used for scoping variables and classes so that they are not global.
+ * Specifying the last node of a namespace implicitly creates all other nodes. Usage:
+ * <pre><code>
+Ext.namespace('Company', 'Company.data');
+Ext.namespace('Company.data'); // equivalent and preferable to above syntax
+Company.Widget = function() { ... }
+Company.data.CustomStore = function(config) { ... }
+</code></pre>
+ * @param {String} namespace1
+ * @param {String} namespace2
+ * @param {String} etc
+ * @return {Object} The namespace object. (If multiple arguments are passed, this will be the last namespace created)
+ * @method namespace
+ */
+ namespace : function(){
+ var len1 = arguments.length,
+ i = 0,
+ len2,
+ j,
+ main,
+ ns,
+ sub,
+ current;
+
+ for(; i < len1; ++i) {
+ main = arguments[i];
+ ns = arguments[i].split('.');
+ current = window[ns[0]];
+ if (current === undefined) {
+ current = window[ns[0]] = {};
+ }
+ sub = ns.slice(1);
+ len2 = sub.length;
+ for(j = 0; j < len2; ++j) {
+ current = current[sub[j]] = current[sub[j]] || {};
+ }
+ }
+ return current;
+ },
+
+ /**
+ * Takes an object and converts it to an encoded URL. e.g. Ext.urlEncode({foo: 1, bar: 2}); would return "foo=1&bar=2". Optionally, property values can be arrays, instead of keys and the resulting string that's returned will contain a name/value pair for each array value.
+ * @param {Object} o
+ * @param {String} pre (optional) A prefix to add to the url encoded string
+ * @return {String}
+ */
+ urlEncode : function(o, pre){
+ var empty,
+ buf = [],
+ e = encodeURIComponent;
+
+ Ext.iterate(o, function(key, item){
+ empty = Ext.isEmpty(item);
+ Ext.each(empty ? key : item, function(val){
+ buf.push('&', e(key), '=', (!Ext.isEmpty(val) && (val != key || !empty)) ? (Ext.isDate(val) ? Ext.encode(val).replace(/"/g, '') : e(val)) : '');
+ });
+ });
+ if(!pre){
+ buf.shift();
+ pre = '';
+ }
+ return pre + buf.join('');
+ },
+
+ /**
+ * Takes an encoded URL and and converts it to an object. Example: <pre><code>
+Ext.urlDecode("foo=1&bar=2"); // returns {foo: "1", bar: "2"}
+Ext.urlDecode("foo=1&bar=2&bar=3&bar=4", false); // returns {foo: "1", bar: ["2", "3", "4"]}
+</code></pre>
+ * @param {String} string
+ * @param {Boolean} overwrite (optional) Items of the same name will overwrite previous values instead of creating an an array (Defaults to false).
+ * @return {Object} A literal with members
+ */
+ urlDecode : function(string, overwrite){
+ if(Ext.isEmpty(string)){
+ return {};
+ }
+ var obj = {},
+ pairs = string.split('&'),
+ d = decodeURIComponent,
+ name,
+ value;
+ Ext.each(pairs, function(pair) {
+ pair = pair.split('=');
+ name = d(pair[0]);
+ value = d(pair[1]);
+ obj[name] = overwrite || !obj[name] ? value :
+ [].concat(obj[name]).concat(value);
+ });
+ return obj;
+ },
+
+ /**
+ * Appends content to the query string of a URL, handling logic for whether to place
+ * a question mark or ampersand.
+ * @param {String} url The URL to append to.
+ * @param {String} s The content to append to the URL.
+ * @return (String) The resulting URL
+ */
+ urlAppend : function(url, s){
+ if(!Ext.isEmpty(s)){
+ return url + (url.indexOf('?') === -1 ? '?' : '&') + s;
+ }
+ return url;
+ },
+
+ /**
+ * Converts any iterable (numeric indices and a length property) into a true array
+ * Don't use this on strings. IE doesn't support "abc"[0] which this implementation depends on.
+ * For strings, use this instead: "abc".match(/./g) => [a,b,c];
+ * @param {Iterable} the iterable object to be turned into a true Array.
+ * @return (Array) array
+ */
+ toArray : function(){
+ return isIE ?
+ function(a, i, j, res){
+ res = [];
+ for(var x = 0, len = a.length; x < len; x++) {
+ res.push(a[x]);
+ }
+ return res.slice(i || 0, j || res.length);
+ } :
+ function(a, i, j){
+ return Array.prototype.slice.call(a, i || 0, j || a.length);
+ };
+ }(),
+
+ isIterable : function(v){
+ //check for array or arguments
+ if(Ext.isArray(v) || v.callee){
+ return true;
+ }
+ //check for node list type
+ if(/NodeList|HTMLCollection/.test(toString.call(v))){
+ return true;
+ }
+ //NodeList has an item and length property
+ //IXMLDOMNodeList has nextNode method, needs to be checked first.
+ return ((typeof v.nextNode != 'undefined' || v.item) && Ext.isNumber(v.length));
+ },
+
+ /**
+ * Iterates an array calling the supplied function.
+ * @param {Array/NodeList/Mixed} array The array to be iterated. If this
+ * argument is not really an array, the supplied function is called once.
+ * @param {Function} fn The function to be called with each item. If the
+ * supplied function returns false, iteration stops and this method returns
+ * the current <code>index</code>. This function is called with
+ * the following arguments:
+ * <div class="mdetail-params"><ul>
+ * <li><code>item</code> : <i>Mixed</i>
+ * <div class="sub-desc">The item at the current <code>index</code>
+ * in the passed <code>array</code></div></li>
+ * <li><code>index</code> : <i>Number</i>
+ * <div class="sub-desc">The current index within the array</div></li>
+ * <li><code>allItems</code> : <i>Array</i>
+ * <div class="sub-desc">The <code>array</code> passed as the first
+ * argument to <code>Ext.each</code>.</div></li>
+ * </ul></div>
+ * @param {Object} scope The scope (<code>this</code> reference) in which the specified function is executed.
+ * Defaults to the <code>item</code> at the current <code>index</code>
+ * within the passed <code>array</code>.
+ * @return See description for the fn parameter.
+ */
+ each : function(array, fn, scope){
+ if(Ext.isEmpty(array, true)){
+ return;
+ }
+ if(!Ext.isIterable(array) || Ext.isPrimitive(array)){
+ array = [array];
+ }
+ for(var i = 0, len = array.length; i < len; i++){
+ if(fn.call(scope || array[i], array[i], i, array) === false){
+ return i;
+ };
+ }
+ },
+
+ /**
+ * Iterates either the elements in an array, or each of the properties in an object.
+ * <b>Note</b>: If you are only iterating arrays, it is better to call {@link #each}.
+ * @param {Object/Array} object The object or array to be iterated
+ * @param {Function} fn The function to be called for each iteration.
+ * The iteration will stop if the supplied function returns false, or
+ * all array elements / object properties have been covered. The signature
+ * varies depending on the type of object being interated:
+ * <div class="mdetail-params"><ul>
+ * <li>Arrays : <tt>(Object item, Number index, Array allItems)</tt>
+ * <div class="sub-desc">
+ * When iterating an array, the supplied function is called with each item.</div></li>
+ * <li>Objects : <tt>(String key, Object value, Object)</tt>
+ * <div class="sub-desc">
+ * When iterating an object, the supplied function is called with each key-value pair in
+ * the object, and the iterated object</div></li>
+ * </ul></div>
+ * @param {Object} scope The scope (<code>this</code> reference) in which the specified function is executed. Defaults to
+ * the <code>object</code> being iterated.
+ */
+ iterate : function(obj, fn, scope){
+ if(Ext.isEmpty(obj)){
+ return;
+ }
+ if(Ext.isIterable(obj)){
+ Ext.each(obj, fn, scope);
+ return;
+ }else if(typeof obj == 'object'){
+ for(var prop in obj){
+ if(obj.hasOwnProperty(prop)){
+ if(fn.call(scope || obj, prop, obj[prop], obj) === false){
+ return;
+ };
+ }
+ }
+ }
+ },
+
+ /**
+ * Return the dom node for the passed String (id), dom node, or Ext.Element.
+ * Optional 'strict' flag is needed for IE since it can return 'name' and
+ * 'id' elements by using getElementById.
+ * Here are some examples:
+ * <pre><code>
+// gets dom node based on id
+var elDom = Ext.getDom('elId');
+// gets dom node based on the dom node
+var elDom1 = Ext.getDom(elDom);
+
+// If we don&#39;t know if we are working with an
+// Ext.Element or a dom node use Ext.getDom
+function(el){
+ var dom = Ext.getDom(el);
+ // do something with the dom node
+}
+ * </code></pre>
+ * <b>Note</b>: the dom node to be found actually needs to exist (be rendered, etc)
+ * when this method is called to be successful.
+ * @param {Mixed} el
+ * @return HTMLElement
+ */
+ getDom : function(el, strict){
+ if(!el || !DOC){
+ return null;
+ }
+ if (el.dom){
+ return el.dom;
+ } else {
+ if (typeof el == 'string') {
+ var e = DOC.getElementById(el);
+ // IE returns elements with the 'name' and 'id' attribute.
+ // we do a strict check to return the element with only the id attribute
+ if (e && isIE && strict) {
+ if (el == e.getAttribute('id')) {
+ return e;
+ } else {
+ return null;
+ }
+ }
+ return e;
+ } else {
+ return el;
+ }
+ }
+ },
+
+ /**
+ * Returns the current document body as an {@link Ext.Element}.
+ * @return Ext.Element The document body
+ */
+ getBody : function(){
+ return Ext.get(DOC.body || DOC.documentElement);
+ },
+
+ /**
+ * Returns the current document body as an {@link Ext.Element}.
+ * @return Ext.Element The document body
+ * @method
+ */
+ getHead : function() {
+ var head;
+
+ return function() {
+ if (head == undefined) {
+ head = Ext.get(DOC.getElementsByTagName("head")[0]);
+ }
+
+ return head;
+ };
+ }(),
+
+ /**
+ * <p>Removes this element from the document, removes all DOM event listeners, and deletes the cache reference.
+ * All DOM event listeners are removed from this element. If {@link Ext#enableNestedListenerRemoval} is
+ * <code>true</code>, then DOM event listeners are also removed from all child nodes. The body node
+ * will be ignored if passed in.</p>
+ * @param {HTMLElement} node The node to remove
+ * @method
+ */
+ removeNode : isIE && !isIE8 ? function(){
+ var d;
+ return function(n){
+ if(n && n.tagName != 'BODY'){
+ (Ext.enableNestedListenerRemoval) ? Ext.EventManager.purgeElement(n, true) : Ext.EventManager.removeAll(n);
+ d = d || DOC.createElement('div');
+ d.appendChild(n);
+ d.innerHTML = '';
+ delete Ext.elCache[n.id];
+ }
+ };
+ }() : function(n){
+ if(n && n.parentNode && n.tagName != 'BODY'){
+ (Ext.enableNestedListenerRemoval) ? Ext.EventManager.purgeElement(n, true) : Ext.EventManager.removeAll(n);
+ n.parentNode.removeChild(n);
+ delete Ext.elCache[n.id];
+ }
+ },
+
+ /**
+ * <p>Returns true if the passed value is empty.</p>
+ * <p>The value is deemed to be empty if it is<div class="mdetail-params"><ul>
+ * <li>null</li>
+ * <li>undefined</li>
+ * <li>an empty array</li>
+ * <li>a zero length string (Unless the <tt>allowBlank</tt> parameter is <tt>true</tt>)</li>
+ * </ul></div>
+ * @param {Mixed} value The value to test
+ * @param {Boolean} allowBlank (optional) true to allow empty strings (defaults to false)
+ * @return {Boolean}
+ */
+ isEmpty : function(v, allowBlank){
+ return v === null || v === undefined || ((Ext.isArray(v) && !v.length)) || (!allowBlank ? v === '' : false);
+ },
+
+ /**
+ * Returns true if the passed value is a JavaScript array, otherwise false.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isArray : function(v){
+ return toString.apply(v) === '[object Array]';
+ },
+
+ /**
+ * Returns true if the passed object is a JavaScript date object, otherwise false.
+ * @param {Object} object The object to test
+ * @return {Boolean}
+ */
+ isDate : function(v){
+ return toString.apply(v) === '[object Date]';
+ },
+
+ /**
+ * Returns true if the passed value is a JavaScript Object, otherwise false.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isObject : function(v){
+ return !!v && Object.prototype.toString.call(v) === '[object Object]';
+ },
+
+ /**
+ * Returns true if the passed value is a JavaScript 'primitive', a string, number or boolean.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isPrimitive : function(v){
+ return Ext.isString(v) || Ext.isNumber(v) || Ext.isBoolean(v);
+ },
+
+ /**
+ * Returns true if the passed value is a JavaScript Function, otherwise false.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isFunction : function(v){
+ return toString.apply(v) === '[object Function]';
+ },
+
+ /**
+ * Returns true if the passed value is a number. Returns false for non-finite numbers.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isNumber : function(v){
+ return typeof v === 'number' && isFinite(v);
+ },
+
+ /**
+ * Returns true if the passed value is a string.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isString : function(v){
+ return typeof v === 'string';
+ },
+
+ /**
+ * Returns true if the passed value is a boolean.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isBoolean : function(v){
+ return typeof v === 'boolean';
+ },
+
+ /**
+ * Returns true if the passed value is an HTMLElement
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isElement : function(v) {
+ return v ? !!v.tagName : false;
+ },
+
+ /**
+ * Returns true if the passed value is not undefined.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isDefined : function(v){
+ return typeof v !== 'undefined';
+ },
+
+ /**
+ * True if the detected browser is Opera.
+ * @type Boolean
+ */
+ isOpera : isOpera,
+ /**
+ * True if the detected browser uses WebKit.
+ * @type Boolean
+ */
+ isWebKit : isWebKit,
+ /**
+ * True if the detected browser is Chrome.
+ * @type Boolean
+ */
+ isChrome : isChrome,
+ /**
+ * True if the detected browser is Safari.
+ * @type Boolean
+ */
+ isSafari : isSafari,
+ /**
+ * True if the detected browser is Safari 3.x.
+ * @type Boolean
+ */
+ isSafari3 : isSafari3,
+ /**
+ * True if the detected browser is Safari 4.x.
+ * @type Boolean
+ */
+ isSafari4 : isSafari4,
+ /**
+ * True if the detected browser is Safari 2.x.
+ * @type Boolean
+ */
+ isSafari2 : isSafari2,
+ /**
+ * True if the detected browser is Internet Explorer.
+ * @type Boolean
+ */
+ isIE : isIE,
+ /**
+ * True if the detected browser is Internet Explorer 6.x.
+ * @type Boolean
+ */
+ isIE6 : isIE6,
+ /**
+ * True if the detected browser is Internet Explorer 7.x.
+ * @type Boolean
+ */
+ isIE7 : isIE7,
+ /**
+ * True if the detected browser is Internet Explorer 8.x.
+ * @type Boolean
+ */
+ isIE8 : isIE8,
+ /**
+ * True if the detected browser is Internet Explorer 9.x.
+ * @type Boolean
+ */
+ isIE9 : isIE9,
+
+ /**
+ * True if the detected browser is Internet Explorer 10.x
+ * @type Boolean
+ */
+ isIE10 : isIE10,
+
+ /**
+ * True if the detected browser is Internet Explorer 9.x or lower
+ * @type Boolean
+ */
+ isIE9m : isIE9m,
+
+ /**
+ * True if the detected browser is Internet Explorer 10.x or higher
+ * @type Boolean
+ */
+ isIE10p : isIE && !(isIE6 || isIE7 || isIE8 || isIE9),
+
+ // IE10 quirks behaves like Gecko/WebKit quirks, so don't include it here
+ // Used internally
+ isIEQuirks: isIE && (!isStrict && (isIE6 || isIE7 || isIE8 || isIE9)),
+
+ /**
+ * True if the detected browser uses the Gecko layout engine (e.g. Mozilla, Firefox).
+ * @type Boolean
+ */
+ isGecko : isGecko,
+ /**
+ * True if the detected browser uses a pre-Gecko 1.9 layout engine (e.g. Firefox 2.x).
+ * @type Boolean
+ */
+ isGecko2 : isGecko2,
+ /**
+ * True if the detected browser uses a Gecko 1.9+ layout engine (e.g. Firefox 3.x).
+ * @type Boolean
+ */
+ isGecko3 : isGecko3,
+ /**
+ * True if the detected browser is Internet Explorer running in non-strict mode.
+ * @type Boolean
+ */
+ isBorderBox : isBorderBox,
+ /**
+ * True if the detected platform is Linux.
+ * @type Boolean
+ */
+ isLinux : isLinux,
+ /**
+ * True if the detected platform is Windows.
+ * @type Boolean
+ */
+ isWindows : isWindows,
+ /**
+ * True if the detected platform is Mac OS.
+ * @type Boolean
+ */
+ isMac : isMac,
+ /**
+ * True if the detected platform is Adobe Air.
+ * @type Boolean
+ */
+ isAir : isAir
+ });
+
+ /**
+ * Creates namespaces to be used for scoping variables and classes so that they are not global.
+ * Specifying the last node of a namespace implicitly creates all other nodes. Usage:
+ * <pre><code>
+Ext.namespace('Company', 'Company.data');
+Ext.namespace('Company.data'); // equivalent and preferable to above syntax
+Company.Widget = function() { ... }
+Company.data.CustomStore = function(config) { ... }
+</code></pre>
+ * @param {String} namespace1
+ * @param {String} namespace2
+ * @param {String} etc
+ * @return {Object} The namespace object. (If multiple arguments are passed, this will be the last namespace created)
+ * @method ns
+ */
+ Ext.ns = Ext.namespace;
+})();
+
+Ext.ns('Ext.util', 'Ext.lib', 'Ext.data', 'Ext.supports');
+
+Ext.elCache = {};
+
+/**
+ * @class Function
+ * These functions are available on every Function object (any JavaScript function).
+ */
+Ext.apply(Function.prototype, {
+ /**
+ * Creates an interceptor function. The passed function is called before the original one. If it returns false,
+ * the original one is not called. The resulting function returns the results of the original function.
+ * The passed function is called with the parameters of the original function. Example usage:
+ * <pre><code>
+var sayHi = function(name){
+ alert('Hi, ' + name);
+}
+
+sayHi('Fred'); // alerts "Hi, Fred"
+
+// create a new function that validates input without
+// directly modifying the original function:
+var sayHiToFriend = sayHi.createInterceptor(function(name){
+ return name == 'Brian';
+});
+
+sayHiToFriend('Fred'); // no alert
+sayHiToFriend('Brian'); // alerts "Hi, Brian"
+</code></pre>
+ * @param {Function} fcn The function to call before the original
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the passed function is executed.
+ * <b>If omitted, defaults to the scope in which the original function is called or the browser window.</b>
+ * @return {Function} The new function
+ */
+ createInterceptor : function(fcn, scope){
+ var method = this;
+ return !Ext.isFunction(fcn) ?
+ this :
+ function() {
+ var me = this,
+ args = arguments;
+ fcn.target = me;
+ fcn.method = method;
+ return (fcn.apply(scope || me || window, args) !== false) ?
+ method.apply(me || window, args) :
+ null;
+ };
+ },
+
+ /**
+ * Creates a callback that passes arguments[0], arguments[1], arguments[2], ...
+ * Call directly on any function. Example: <code>myFunction.createCallback(arg1, arg2)</code>
+ * Will create a function that is bound to those 2 args. <b>If a specific scope is required in the
+ * callback, use {@link #createDelegate} instead.</b> The function returned by createCallback always
+ * executes in the window scope.
+ * <p>This method is required when you want to pass arguments to a callback function. If no arguments
+ * are needed, you can simply pass a reference to the function as a callback (e.g., callback: myFn).
+ * However, if you tried to pass a function with arguments (e.g., callback: myFn(arg1, arg2)) the function
+ * would simply execute immediately when the code is parsed. Example usage:
+ * <pre><code>
+var sayHi = function(name){
+ alert('Hi, ' + name);
+}
+
+// clicking the button alerts "Hi, Fred"
+new Ext.Button({
+ text: 'Say Hi',
+ renderTo: Ext.getBody(),
+ handler: sayHi.createCallback('Fred')
+});
+</code></pre>
+ * @return {Function} The new function
+ */
+ createCallback : function(/*args...*/){
+ // make args available, in function below
+ var args = arguments,
+ method = this;
+ return function() {
+ return method.apply(window, args);
+ };
+ },
+
+ /**
+ * Creates a delegate (callback) that sets the scope to obj.
+ * Call directly on any function. Example: <code>this.myFunction.createDelegate(this, [arg1, arg2])</code>
+ * Will create a function that is automatically scoped to obj so that the <tt>this</tt> variable inside the
+ * callback points to obj. Example usage:
+ * <pre><code>
+var sayHi = function(name){
+ // Note this use of "this.text" here. This function expects to
+ // execute within a scope that contains a text property. In this
+ // example, the "this" variable is pointing to the btn object that
+ // was passed in createDelegate below.
+ alert('Hi, ' + name + '. You clicked the "' + this.text + '" button.');
+}
+
+var btn = new Ext.Button({
+ text: 'Say Hi',
+ renderTo: Ext.getBody()
+});
+
+// This callback will execute in the scope of the
+// button instance. Clicking the button alerts
+// "Hi, Fred. You clicked the "Say Hi" button."
+btn.on('click', sayHi.createDelegate(btn, ['Fred']));
+</code></pre>
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
+ * <b>If omitted, defaults to the browser window.</b>
+ * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
+ * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
+ * if a number the args are inserted at the specified position
+ * @return {Function} The new function
+ */
+ createDelegate : function(obj, args, appendArgs){
+ var method = this;
+ return function() {
+ var callArgs = args || arguments;
+ if (appendArgs === true){
+ callArgs = Array.prototype.slice.call(arguments, 0);
+ callArgs = callArgs.concat(args);
+ }else if (Ext.isNumber(appendArgs)){
+ callArgs = Array.prototype.slice.call(arguments, 0); // copy arguments first
+ var applyArgs = [appendArgs, 0].concat(args); // create method call params
+ Array.prototype.splice.apply(callArgs, applyArgs); // splice them in
+ }
+ return method.apply(obj || window, callArgs);
+ };
+ },
+
+ /**
+ * Calls this function after the number of millseconds specified, optionally in a specific scope. Example usage:
+ * <pre><code>
+var sayHi = function(name){
+ alert('Hi, ' + name);
+}
+
+// executes immediately:
+sayHi('Fred');
+
+// executes after 2 seconds:
+sayHi.defer(2000, this, ['Fred']);
+
+// this syntax is sometimes useful for deferring
+// execution of an anonymous function:
+(function(){
+ alert('Anonymous');
+}).defer(100);
+</code></pre>
+ * @param {Number} millis The number of milliseconds for the setTimeout call (if less than or equal to 0 the function is executed immediately)
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
+ * <b>If omitted, defaults to the browser window.</b>
+ * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
+ * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
+ * if a number the args are inserted at the specified position
+ * @return {Number} The timeout id that can be used with clearTimeout
+ */
+ defer : function(millis, obj, args, appendArgs){
+ var fn = this.createDelegate(obj, args, appendArgs);
+ if(millis > 0){
+ return setTimeout(fn, millis);
+ }
+ fn();
+ return 0;
+ }
+});
+
+/**
+ * @class String
+ * These functions are available on every String object.
+ */
+Ext.applyIf(String, {
+ /**
+ * Allows you to define a tokenized string and pass an arbitrary number of arguments to replace the tokens. Each
+ * token must be unique, and must increment in the format {0}, {1}, etc. Example usage:
+ * <pre><code>
+var cls = 'my-class', text = 'Some text';
+var s = String.format('&lt;div class="{0}">{1}&lt;/div>', cls, text);
+// s now contains the string: '&lt;div class="my-class">Some text&lt;/div>'
+ * </code></pre>
+ * @param {String} string The tokenized string to be formatted
+ * @param {String} value1 The value to replace token {0}
+ * @param {String} value2 Etc...
+ * @return {String} The formatted string
+ * @static
+ */
+ format : function(format){
+ var args = Ext.toArray(arguments, 1);
+ return format.replace(/\{(\d+)\}/g, function(m, i){
+ return args[i];
+ });
+ }
+});
+
+/**
+ * @class Array
+ */
+Ext.applyIf(Array.prototype, {
+ /**
+ * Checks whether or not the specified object exists in the array.
+ * @param {Object} o The object to check for
+ * @param {Number} from (Optional) The index at which to begin the search
+ * @return {Number} The index of o in the array (or -1 if it is not found)
+ */
+ indexOf : function(o, from){
+ var len = this.length;
+ from = from || 0;
+ from += (from < 0) ? len : 0;
+ for (; from < len; ++from){
+ if(this[from] === o){
+ return from;
+ }
+ }
+ return -1;
+ },
+
+ /**
+ * Removes the specified object from the array. If the object is not found nothing happens.
+ * @param {Object} o The object to remove
+ * @return {Array} this array
+ */
+ remove : function(o){
+ var index = this.indexOf(o);
+ if(index != -1){
+ this.splice(index, 1);
+ }
+ return this;
+ }
+});
+/**
+ * @class Ext.util.TaskRunner
+ * Provides the ability to execute one or more arbitrary tasks in a multithreaded
+ * manner. Generally, you can use the singleton {@link Ext.TaskMgr} instead, but
+ * if needed, you can create separate instances of TaskRunner. Any number of
+ * separate tasks can be started at any time and will run independently of each
+ * other. Example usage:
+ * <pre><code>
+// Start a simple clock task that updates a div once per second
+var updateClock = function(){
+ Ext.fly('clock').update(new Date().format('g:i:s A'));
+}
+var task = {
+ run: updateClock,
+ interval: 1000 //1 second
+}
+var runner = new Ext.util.TaskRunner();
+runner.start(task);
+
+// equivalent using TaskMgr
+Ext.TaskMgr.start({
+ run: updateClock,
+ interval: 1000
+});
+
+ * </code></pre>
+ * <p>See the {@link #start} method for details about how to configure a task object.</p>
+ * Also see {@link Ext.util.DelayedTask}.
+ *
+ * @constructor
+ * @param {Number} interval (optional) The minimum precision in milliseconds supported by this TaskRunner instance
+ * (defaults to 10)
+ */
+Ext.util.TaskRunner = function(interval){
+ interval = interval || 10;
+ var tasks = [],
+ removeQueue = [],
+ id = 0,
+ running = false,
+
+ // private
+ stopThread = function(){
+ running = false;
+ clearInterval(id);
+ id = 0;
+ },
+
+ // private
+ startThread = function(){
+ if(!running){
+ running = true;
+ id = setInterval(runTasks, interval);
+ }
+ },
+
+ // private
+ removeTask = function(t){
+ removeQueue.push(t);
+ if(t.onStop){
+ t.onStop.apply(t.scope || t);
+ }
+ },
+
+ // private
+ runTasks = function(){
+ var rqLen = removeQueue.length,
+ now = new Date().getTime();
+
+ if(rqLen > 0){
+ for(var i = 0; i < rqLen; i++){
+ tasks.remove(removeQueue[i]);
+ }
+ removeQueue = [];
+ if(tasks.length < 1){
+ stopThread();
+ return;
+ }
+ }
+ for(var i = 0, t, itime, rt, len = tasks.length; i < len; ++i){
+ t = tasks[i];
+ itime = now - t.taskRunTime;
+ if(t.interval <= itime){
+ rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);
+ t.taskRunTime = now;
+ if(rt === false || t.taskRunCount === t.repeat){
+ removeTask(t);
+ return;
+ }
+ }
+ if(t.duration && t.duration <= (now - t.taskStartTime)){
+ removeTask(t);
+ }
+ }
+ };
+
+ /**
+ * Starts a new task.
+ * @method start
+ * @param {Object} task <p>A config object that supports the following properties:<ul>
+ * <li><code>run</code> : Function<div class="sub-desc"><p>The function to execute each time the task is invoked. The
+ * function will be called at each interval and passed the <code>args</code> argument if specified, and the
+ * current invocation count if not.</p>
+ * <p>If a particular scope (<code>this</code> reference) is required, be sure to specify it using the <code>scope</code> argument.</p>
+ * <p>Return <code>false</code> from this function to terminate the task.</p></div></li>
+ * <li><code>interval</code> : Number<div class="sub-desc">The frequency in milliseconds with which the task
+ * should be invoked.</div></li>
+ * <li><code>args</code> : Array<div class="sub-desc">(optional) An array of arguments to be passed to the function
+ * specified by <code>run</code>. If not specified, the current invocation count is passed.</div></li>
+ * <li><code>scope</code> : Object<div class="sub-desc">(optional) The scope (<tt>this</tt> reference) in which to execute the
+ * <code>run</code> function. Defaults to the task config object.</div></li>
+ * <li><code>duration</code> : Number<div class="sub-desc">(optional) The length of time in milliseconds to invoke
+ * the task before stopping automatically (defaults to indefinite).</div></li>
+ * <li><code>repeat</code> : Number<div class="sub-desc">(optional) The number of times to invoke the task before
+ * stopping automatically (defaults to indefinite).</div></li>
+ * </ul></p>
+ * <p>Before each invocation, Ext injects the property <code>taskRunCount</code> into the task object so
+ * that calculations based on the repeat count can be performed.</p>
+ * @return {Object} The task
+ */
+ this.start = function(task){
+ tasks.push(task);
+ task.taskStartTime = new Date().getTime();
+ task.taskRunTime = 0;
+ task.taskRunCount = 0;
+ startThread();
+ return task;
+ };
+
+ /**
+ * Stops an existing running task.
+ * @method stop
+ * @param {Object} task The task to stop
+ * @return {Object} The task
+ */
+ this.stop = function(task){
+ removeTask(task);
+ return task;
+ };
+
+ /**
+ * Stops all tasks that are currently running.
+ * @method stopAll
+ */
+ this.stopAll = function(){
+ stopThread();
+ for(var i = 0, len = tasks.length; i < len; i++){
+ if(tasks[i].onStop){
+ tasks[i].onStop();
+ }
+ }
+ tasks = [];
+ removeQueue = [];
+ };
+};
+
+/**
+ * @class Ext.TaskMgr
+ * @extends Ext.util.TaskRunner
+ * A static {@link Ext.util.TaskRunner} instance that can be used to start and stop arbitrary tasks. See
+ * {@link Ext.util.TaskRunner} for supported methods and task config properties.
+ * <pre><code>
+// Start a simple clock task that updates a div once per second
+var task = {
+ run: function(){
+ Ext.fly('clock').update(new Date().format('g:i:s A'));
+ },
+ interval: 1000 //1 second
+}
+Ext.TaskMgr.start(task);
+</code></pre>
+ * <p>See the {@link #start} method for details about how to configure a task object.</p>
+ * @singleton
+ */
+Ext.TaskMgr = new Ext.util.TaskRunner();(function(){
+ var libFlyweight;
+
+ function fly(el) {
+ if (!libFlyweight) {
+ libFlyweight = new Ext.Element.Flyweight();
+ }
+ libFlyweight.dom = el;
+ return libFlyweight;
+ }
+
+ (function(){
+ var doc = document,
+ isCSS1 = doc.compatMode == "CSS1Compat",
+ MAX = Math.max,
+ ROUND = Math.round,
+ PARSEINT = parseInt;
+
+ Ext.lib.Dom = {
+ isAncestor : function(p, c) {
+ var ret = false;
+
+ p = Ext.getDom(p);
+ c = Ext.getDom(c);
+ if (p && c) {
+ if (p.contains) {
+ return p.contains(c);
+ } else if (p.compareDocumentPosition) {
+ return !!(p.compareDocumentPosition(c) & 16);
+ } else {
+ while (c = c.parentNode) {
+ ret = c == p || ret;
+ }
+ }
+ }
+ return ret;
+ },
+
+ getViewWidth : function(full) {
+ return full ? this.getDocumentWidth() : this.getViewportWidth();
+ },
+
+ getViewHeight : function(full) {
+ return full ? this.getDocumentHeight() : this.getViewportHeight();
+ },
+
+ getDocumentHeight: function() {
+ return MAX(!isCSS1 ? doc.body.scrollHeight : doc.documentElement.scrollHeight, this.getViewportHeight());
+ },
+
+ getDocumentWidth: function() {
+ return MAX(!isCSS1 ? doc.body.scrollWidth : doc.documentElement.scrollWidth, this.getViewportWidth());
+ },
+
+ getViewportHeight: function(){
+ return Ext.isIE9m ?
+ (Ext.isStrict ? doc.documentElement.clientHeight : doc.body.clientHeight) :
+ self.innerHeight;
+ },
+
+ getViewportWidth : function() {
+ return !Ext.isStrict && !Ext.isOpera ? doc.body.clientWidth :
+ Ext.isIE9m ? doc.documentElement.clientWidth : self.innerWidth;
+ },
+
+ getY : function(el) {
+ return this.getXY(el)[1];
+ },
+
+ getX : function(el) {
+ return this.getXY(el)[0];
+ },
+
+ getXY : function(el) {
+ var p,
+ pe,
+ b,
+ bt,
+ bl,
+ dbd,
+ x = 0,
+ y = 0,
+ scroll,
+ hasAbsolute,
+ bd = (doc.body || doc.documentElement),
+ ret = [0,0];
+
+ el = Ext.getDom(el);
+
+ if(el != bd){
+ if (el.getBoundingClientRect) {
+ b = el.getBoundingClientRect();
+ scroll = fly(document).getScroll();
+ ret = [ROUND(b.left + scroll.left), ROUND(b.top + scroll.top)];
+ } else {
+ p = el;
+ hasAbsolute = fly(el).isStyle("position", "absolute");
+
+ while (p) {
+ pe = fly(p);
+ x += p.offsetLeft;
+ y += p.offsetTop;
+
+ hasAbsolute = hasAbsolute || pe.isStyle("position", "absolute");
+
+ if (Ext.isGecko) {
+ y += bt = PARSEINT(pe.getStyle("borderTopWidth"), 10) || 0;
+ x += bl = PARSEINT(pe.getStyle("borderLeftWidth"), 10) || 0;
+
+ if (p != el && !pe.isStyle('overflow','visible')) {
+ x += bl;
+ y += bt;
+ }
+ }
+ p = p.offsetParent;
+ }
+
+ if (Ext.isSafari && hasAbsolute) {
+ x -= bd.offsetLeft;
+ y -= bd.offsetTop;
+ }
+
+ if (Ext.isGecko && !hasAbsolute) {
+ dbd = fly(bd);
+ x += PARSEINT(dbd.getStyle("borderLeftWidth"), 10) || 0;
+ y += PARSEINT(dbd.getStyle("borderTopWidth"), 10) || 0;
+ }
+
+ p = el.parentNode;
+ while (p && p != bd) {
+ if (!Ext.isOpera || (p.tagName != 'TR' && !fly(p).isStyle("display", "inline"))) {
+ x -= p.scrollLeft;
+ y -= p.scrollTop;
+ }
+ p = p.parentNode;
+ }
+ ret = [x,y];
+ }
+ }
+ return ret;
+ },
+
+ setXY : function(el, xy) {
+ (el = Ext.fly(el, '_setXY')).position();
+
+ var pts = el.translatePoints(xy),
+ style = el.dom.style,
+ pos;
+
+ for (pos in pts) {
+ if (!isNaN(pts[pos])) {
+ style[pos] = pts[pos] + "px";
+ }
+ }
+ },
+
+ setX : function(el, x) {
+ this.setXY(el, [x, false]);
+ },
+
+ setY : function(el, y) {
+ this.setXY(el, [false, y]);
+ }
+ };
+})();Ext.lib.Event = function() {
+ var loadComplete = false,
+ unloadListeners = {},
+ retryCount = 0,
+ onAvailStack = [],
+ _interval,
+ locked = false,
+ win = window,
+ doc = document,
+
+ // constants
+ POLL_RETRYS = 200,
+ POLL_INTERVAL = 20,
+ TYPE = 0,
+ FN = 1,
+ OBJ = 2,
+ ADJ_SCOPE = 3,
+ SCROLLLEFT = 'scrollLeft',
+ SCROLLTOP = 'scrollTop',
+ UNLOAD = 'unload',
+ MOUSEOVER = 'mouseover',
+ MOUSEOUT = 'mouseout',
+ // private
+ doAdd = function() {
+ var ret;
+ if (win.addEventListener) {
+ ret = function(el, eventName, fn, capture) {
+ if (eventName == 'mouseenter') {
+ fn = fn.createInterceptor(checkRelatedTarget);
+ el.addEventListener(MOUSEOVER, fn, (capture));
+ } else if (eventName == 'mouseleave') {
+ fn = fn.createInterceptor(checkRelatedTarget);
+ el.addEventListener(MOUSEOUT, fn, (capture));
+ } else {
+ el.addEventListener(eventName, fn, (capture));
+ }
+ return fn;
+ };
+ } else if (win.attachEvent) {
+ ret = function(el, eventName, fn, capture) {
+ el.attachEvent("on" + eventName, fn);
+ return fn;
+ };
+ } else {
+ ret = function(){};
+ }
+ return ret;
+ }(),
+ // private
+ doRemove = function(){
+ var ret;
+ if (win.removeEventListener) {
+ ret = function (el, eventName, fn, capture) {
+ if (eventName == 'mouseenter') {
+ eventName = MOUSEOVER;
+ } else if (eventName == 'mouseleave') {
+ eventName = MOUSEOUT;
+ }
+ el.removeEventListener(eventName, fn, (capture));
+ };
+ } else if (win.detachEvent) {
+ ret = function (el, eventName, fn) {
+ el.detachEvent("on" + eventName, fn);
+ };
+ } else {
+ ret = function(){};
+ }
+ return ret;
+ }();
+
+ function checkRelatedTarget(e) {
+ return !elContains(e.currentTarget, pub.getRelatedTarget(e));
+ }
+
+ function elContains(parent, child) {
+ if(parent && parent.firstChild){
+ while(child) {
+ if(child === parent) {
+ return true;
+ }
+ child = child.parentNode;
+ if(child && (child.nodeType != 1)) {
+ child = null;
+ }
+ }
+ }
+ return false;
+ }
+
+ // private
+ function _tryPreloadAttach() {
+ var ret = false,
+ notAvail = [],
+ element, i, v, override,
+ tryAgain = !loadComplete || (retryCount > 0);
+
+ if(!locked){
+ locked = true;
+
+ for(i = 0; i < onAvailStack.length; ++i){
+ v = onAvailStack[i];
+ if(v && (element = doc.getElementById(v.id))){
+ if(!v.checkReady || loadComplete || element.nextSibling || (doc && doc.body)) {
+ override = v.override;
+ element = override ? (override === true ? v.obj : override) : element;
+ v.fn.call(element, v.obj);
+ onAvailStack.remove(v);
+ --i;
+ }else{
+ notAvail.push(v);
+ }
+ }
+ }
+
+ retryCount = (notAvail.length === 0) ? 0 : retryCount - 1;
+
+ if (tryAgain) {
+ startInterval();
+ } else {
+ clearInterval(_interval);
+ _interval = null;
+ }
+ ret = !(locked = false);
+ }
+ return ret;
+ }
+
+ // private
+ function startInterval() {
+ if(!_interval){
+ var callback = function() {
+ _tryPreloadAttach();
+ };
+ _interval = setInterval(callback, POLL_INTERVAL);
+ }
+ }
+
+ // private
+ function getScroll() {
+ var dd = doc.documentElement,
+ db = doc.body;
+ if(dd && (dd[SCROLLTOP] || dd[SCROLLLEFT])){
+ return [dd[SCROLLLEFT], dd[SCROLLTOP]];
+ }else if(db){
+ return [db[SCROLLLEFT], db[SCROLLTOP]];
+ }else{
+ return [0, 0];
+ }
+ }
+
+ // private
+ function getPageCoord (ev, xy) {
+ ev = ev.browserEvent || ev;
+ var coord = ev['page' + xy];
+ if (!coord && coord !== 0) {
+ coord = ev['client' + xy] || 0;
+
+ if (Ext.isIE) {
+ coord += getScroll()[xy == "X" ? 0 : 1];
+ }
+ }
+
+ return coord;
+ }
+
+ var pub = {
+ extAdapter: true,
+ onAvailable : function(p_id, p_fn, p_obj, p_override) {
+ onAvailStack.push({
+ id: p_id,
+ fn: p_fn,
+ obj: p_obj,
+ override: p_override,
+ checkReady: false });
+
+ retryCount = POLL_RETRYS;
+ startInterval();
+ },
+
+ // This function should ALWAYS be called from Ext.EventManager
+ addListener: function(el, eventName, fn) {
+ el = Ext.getDom(el);
+ if (el && fn) {
+ if (eventName == UNLOAD) {
+ if (unloadListeners[el.id] === undefined) {
+ unloadListeners[el.id] = [];
+ }
+ unloadListeners[el.id].push([eventName, fn]);
+ return fn;
+ }
+ return doAdd(el, eventName, fn, false);
+ }
+ return false;
+ },
+
+ // This function should ALWAYS be called from Ext.EventManager
+ removeListener: function(el, eventName, fn) {
+ el = Ext.getDom(el);
+ var i, len, li, lis;
+ if (el && fn) {
+ if(eventName == UNLOAD){
+ if((lis = unloadListeners[el.id]) !== undefined){
+ for(i = 0, len = lis.length; i < len; i++){
+ if((li = lis[i]) && li[TYPE] == eventName && li[FN] == fn){
+ unloadListeners[el.id].splice(i, 1);
+ }
+ }
+ }
+ return;
+ }
+ doRemove(el, eventName, fn, false);
+ }
+ },
+
+ getTarget : function(ev) {
+ ev = ev.browserEvent || ev;
+ return this.resolveTextNode(ev.target || ev.srcElement);
+ },
+
+ resolveTextNode : Ext.isGecko ? function(node){
+ if(!node){
+ return;
+ }
+ // work around firefox bug, https://bugzilla.mozilla.org/show_bug.cgi?id=101197
+ var s = HTMLElement.prototype.toString.call(node);
+ if(s == '[xpconnect wrapped native prototype]' || s == '[object XULElement]'){
+ return;
+ }
+ return node.nodeType == 3 ? node.parentNode : node;
+ } : function(node){
+ return node && node.nodeType == 3 ? node.parentNode : node;
+ },
+
+ getRelatedTarget : function(ev) {
+ ev = ev.browserEvent || ev;
+ return this.resolveTextNode(ev.relatedTarget ||
+ (/(mouseout|mouseleave)/.test(ev.type) ? ev.toElement :
+ /(mouseover|mouseenter)/.test(ev.type) ? ev.fromElement : null));
+ },
+
+ getPageX : function(ev) {
+ return getPageCoord(ev, "X");
+ },
+
+ getPageY : function(ev) {
+ return getPageCoord(ev, "Y");
+ },
+
+
+ getXY : function(ev) {
+ return [this.getPageX(ev), this.getPageY(ev)];
+ },
+
+ stopEvent : function(ev) {
+ this.stopPropagation(ev);
+ this.preventDefault(ev);
+ },
+
+ stopPropagation : function(ev) {
+ ev = ev.browserEvent || ev;
+ if (ev.stopPropagation) {
+ ev.stopPropagation();
+ } else {
+ ev.cancelBubble = true;
+ }
+ },
+
+ preventDefault : function(ev) {
+ ev = ev.browserEvent || ev;
+ if (ev.preventDefault) {
+ ev.preventDefault();
+ } else {
+ if (ev.keyCode) {
+ ev.keyCode = 0;
+ }
+ ev.returnValue = false;
+ }
+ },
+
+ getEvent : function(e) {
+ e = e || win.event;
+ if (!e) {
+ var c = this.getEvent.caller;
+ while (c) {
+ e = c.arguments[0];
+ if (e && Event == e.constructor) {
+ break;
+ }
+ c = c.caller;
+ }
+ }
+ return e;
+ },
+
+ getCharCode : function(ev) {
+ ev = ev.browserEvent || ev;
+ return ev.charCode || ev.keyCode || 0;
+ },
+
+ //clearCache: function() {},
+ // deprecated, call from EventManager
+ getListeners : function(el, eventName) {
+ Ext.EventManager.getListeners(el, eventName);
+ },
+
+ // deprecated, call from EventManager
+ purgeElement : function(el, recurse, eventName) {
+ Ext.EventManager.purgeElement(el, recurse, eventName);
+ },
+
+ _load : function(e) {
+ loadComplete = true;
+
+ if (Ext.isIE9m && e !== true) {
+ // IE8 complains that _load is null or not an object
+ // so lets remove self via arguments.callee
+ doRemove(win, "load", arguments.callee);
+ }
+ },
+
+ _unload : function(e) {
+ var EU = Ext.lib.Event,
+ i, v, ul, id, len, scope;
+
+ for (id in unloadListeners) {
+ ul = unloadListeners[id];
+ for (i = 0, len = ul.length; i < len; i++) {
+ v = ul[i];
+ if (v) {
+ try{
+ scope = v[ADJ_SCOPE] ? (v[ADJ_SCOPE] === true ? v[OBJ] : v[ADJ_SCOPE]) : win;
+ v[FN].call(scope, EU.getEvent(e), v[OBJ]);
+ }catch(ex){}
+ }
+ }
+ };
+
+ Ext.EventManager._unload();
+
+ doRemove(win, UNLOAD, EU._unload);
+ }
+ };
+
+ // Initialize stuff.
+ pub.on = pub.addListener;
+ pub.un = pub.removeListener;
+ if (doc && doc.body) {
+ pub._load(true);
+ } else {
+ doAdd(win, "load", pub._load);
+ }
+ doAdd(win, UNLOAD, pub._unload);
+ _tryPreloadAttach();
+
+ return pub;
+}();
+/*
+* Portions of this file are based on pieces of Yahoo User Interface Library
+* Copyright (c) 2007, Yahoo! Inc. All rights reserved.
+* YUI licensed under the BSD License:
+* http://developer.yahoo.net/yui/license.txt
+*/
+Ext.lib.Ajax = function() {
+ var activeX = ['Msxml2.XMLHTTP.3.0',
+ 'Msxml2.XMLHTTP'],
+ CONTENTTYPE = 'Content-Type';
+
+ // private
+ function setHeader(o) {
+ var conn = o.conn,
+ prop,
+ headers = {};
+
+ function setTheHeaders(conn, headers){
+ for (prop in headers) {
+ if (headers.hasOwnProperty(prop)) {
+ conn.setRequestHeader(prop, headers[prop]);
+ }
+ }
+ }
+
+ Ext.apply(headers, pub.headers, pub.defaultHeaders);
+ setTheHeaders(conn, headers);
+ delete pub.headers;
+ }
+
+ // private
+ function createExceptionObject(tId, callbackArg, isAbort, isTimeout) {
+ return {
+ tId : tId,
+ status : isAbort ? -1 : 0,
+ statusText : isAbort ? 'transaction aborted' : 'communication failure',
+ isAbort: isAbort,
+ isTimeout: isTimeout,
+ argument : callbackArg
+ };
+ }
+
+ // private
+ function initHeader(label, value) {
+ (pub.headers = pub.headers || {})[label] = value;
+ }
+
+ // private
+ function createResponseObject(o, callbackArg) {
+ var headerObj = {},
+ headerStr,
+ conn = o.conn,
+ t,
+ s,
+ // see: https://prototype.lighthouseapp.com/projects/8886/tickets/129-ie-mangles-http-response-status-code-204-to-1223
+ isBrokenStatus = conn.status == 1223;
+
+ try {
+ headerStr = o.conn.getAllResponseHeaders();
+ Ext.each(headerStr.replace(/\r\n/g, '\n').split('\n'), function(v){
+ t = v.indexOf(':');
+ if(t >= 0){
+ s = v.substr(0, t).toLowerCase();
+ if(v.charAt(t + 1) == ' '){
+ ++t;
+ }
+ headerObj[s] = v.substr(t + 1);
+ }
+ });
+ } catch(e) {}
+
+ return {
+ tId : o.tId,
+ // Normalize the status and statusText when IE returns 1223, see the above link.
+ status : isBrokenStatus ? 204 : conn.status,
+ statusText : isBrokenStatus ? 'No Content' : conn.statusText,
+ getResponseHeader : function(header){return headerObj[header.toLowerCase()];},
+ getAllResponseHeaders : function(){return headerStr;},
+ responseText : conn.responseText,
+ responseXML : conn.responseXML,
+ argument : callbackArg
+ };
+ }
+
+ // private
+ function releaseObject(o) {
+ if (o.tId) {
+ pub.conn[o.tId] = null;
+ }
+ o.conn = null;
+ o = null;
+ }
+
+ // private
+ function handleTransactionResponse(o, callback, isAbort, isTimeout) {
+ if (!callback) {
+ releaseObject(o);
+ return;
+ }
+
+ var httpStatus, responseObject;
+
+ try {
+ if (o.conn.status !== undefined && o.conn.status != 0) {
+ httpStatus = o.conn.status;
+ }
+ else {
+ httpStatus = 13030;
+ }
+ }
+ catch(e) {
+ httpStatus = 13030;
+ }
+
+ if ((httpStatus >= 200 && httpStatus < 300) || (Ext.isIE && httpStatus == 1223)) {
+ responseObject = createResponseObject(o, callback.argument);
+ if (callback.success) {
+ if (!callback.scope) {
+ callback.success(responseObject);
+ }
+ else {
+ callback.success.apply(callback.scope, [responseObject]);
+ }
+ }
+ }
+ else {
+ switch (httpStatus) {
+ case 12002:
+ case 12029:
+ case 12030:
+ case 12031:
+ case 12152:
+ case 13030:
+ responseObject = createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false), isTimeout);
+ if (callback.failure) {
+ if (!callback.scope) {
+ callback.failure(responseObject);
+ }
+ else {
+ callback.failure.apply(callback.scope, [responseObject]);
+ }
+ }
+ break;
+ default:
+ responseObject = createResponseObject(o, callback.argument);
+ if (callback.failure) {
+ if (!callback.scope) {
+ callback.failure(responseObject);
+ }
+ else {
+ callback.failure.apply(callback.scope, [responseObject]);
+ }
+ }
+ }
+ }
+
+ releaseObject(o);
+ responseObject = null;
+ }
+
+ function checkResponse(o, callback, conn, tId, poll, cbTimeout){
+ if (conn && conn.readyState == 4) {
+ clearInterval(poll[tId]);
+ poll[tId] = null;
+
+ if (cbTimeout) {
+ clearTimeout(pub.timeout[tId]);
+ pub.timeout[tId] = null;
+ }
+ handleTransactionResponse(o, callback);
+ }
+ }
+
+ function checkTimeout(o, callback){
+ pub.abort(o, callback, true);
+ }
+
+
+ // private
+ function handleReadyState(o, callback){
+ callback = callback || {};
+ var conn = o.conn,
+ tId = o.tId,
+ poll = pub.poll,
+ cbTimeout = callback.timeout || null;
+
+ if (cbTimeout) {
+ pub.conn[tId] = conn;
+ pub.timeout[tId] = setTimeout(checkTimeout.createCallback(o, callback), cbTimeout);
+ }
+ poll[tId] = setInterval(checkResponse.createCallback(o, callback, conn, tId, poll, cbTimeout), pub.pollInterval);
+ }
+
+ // private
+ function asyncRequest(method, uri, callback, postData) {
+ var o = getConnectionObject() || null;
+
+ if (o) {
+ o.conn.open(method, uri, true);
+
+ if (pub.useDefaultXhrHeader) {
+ initHeader('X-Requested-With', pub.defaultXhrHeader);
+ }
+
+ if(postData && pub.useDefaultHeader && (!pub.headers || !pub.headers[CONTENTTYPE])){
+ initHeader(CONTENTTYPE, pub.defaultPostHeader);
+ }
+
+ if (pub.defaultHeaders || pub.headers) {
+ setHeader(o);
+ }
+
+ handleReadyState(o, callback);
+ o.conn.send(postData || null);
+ }
+ return o;
+ }
+
+ // private
+ function getConnectionObject() {
+ var o;
+
+ try {
+ if (o = createXhrObject(pub.transactionId)) {
+ pub.transactionId++;
+ }
+ } catch(e) {
+ } finally {
+ return o;
+ }
+ }
+
+ // private
+ function createXhrObject(transactionId) {
+ var http;
+
+ try {
+ http = new XMLHttpRequest();
+ } catch(e) {
+ for (var i = Ext.isIE6 ? 1 : 0; i < activeX.length; ++i) {
+ try {
+ http = new ActiveXObject(activeX[i]);
+ break;
+ } catch(e) {}
+ }
+ } finally {
+ return {conn : http, tId : transactionId};
+ }
+ }
+
+ var pub = {
+ request : function(method, uri, cb, data, options) {
+ if(options){
+ var me = this,
+ xmlData = options.xmlData,
+ jsonData = options.jsonData,
+ hs;
+
+ Ext.applyIf(me, options);
+
+ if(xmlData || jsonData){
+ hs = me.headers;
+ if(!hs || !hs[CONTENTTYPE]){
+ initHeader(CONTENTTYPE, xmlData ? 'text/xml' : 'application/json');
+ }
+ data = xmlData || (!Ext.isPrimitive(jsonData) ? Ext.encode(jsonData) : jsonData);
+ }
+ }
+ return asyncRequest(method || options.method || "POST", uri, cb, data);
+ },
+
+ serializeForm : function(form) {
+ var fElements = form.elements || (document.forms[form] || Ext.getDom(form)).elements,
+ hasSubmit = false,
+ encoder = encodeURIComponent,
+ name,
+ data = '',
+ type,
+ hasValue;
+
+ Ext.each(fElements, function(element){
+ name = element.name;
+ type = element.type;
+
+ if (!element.disabled && name) {
+ if (/select-(one|multiple)/i.test(type)) {
+ Ext.each(element.options, function(opt){
+ if (opt.selected) {
+ hasValue = opt.hasAttribute ? opt.hasAttribute('value') : opt.getAttributeNode('value').specified;
+ data += String.format("{0}={1}&", encoder(name), encoder(hasValue ? opt.value : opt.text));
+ }
+ });
+ } else if (!(/file|undefined|reset|button/i.test(type))) {
+ if (!(/radio|checkbox/i.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)) {
+ data += encoder(name) + '=' + encoder(element.value) + '&';
+ hasSubmit = /submit/i.test(type);
+ }
+ }
+ }
+ });
+ return data.substr(0, data.length - 1);
+ },
+
+ useDefaultHeader : true,
+ defaultPostHeader : 'application/x-www-form-urlencoded; charset=UTF-8',
+ useDefaultXhrHeader : true,
+ defaultXhrHeader : 'XMLHttpRequest',
+ poll : {},
+ timeout : {},
+ conn: {},
+ pollInterval : 50,
+ transactionId : 0,
+
+// This is never called - Is it worth exposing this?
+// setProgId : function(id) {
+// activeX.unshift(id);
+// },
+
+// This is never called - Is it worth exposing this?
+// setDefaultPostHeader : function(b) {
+// this.useDefaultHeader = b;
+// },
+
+// This is never called - Is it worth exposing this?
+// setDefaultXhrHeader : function(b) {
+// this.useDefaultXhrHeader = b;
+// },
+
+// This is never called - Is it worth exposing this?
+// setPollingInterval : function(i) {
+// if (typeof i == 'number' && isFinite(i)) {
+// this.pollInterval = i;
+// }
+// },
+
+// This is never called - Is it worth exposing this?
+// resetDefaultHeaders : function() {
+// this.defaultHeaders = null;
+// },
+
+ abort : function(o, callback, isTimeout) {
+ var me = this,
+ tId = o.tId,
+ isAbort = false;
+
+ if (me.isCallInProgress(o)) {
+ o.conn.abort();
+ clearInterval(me.poll[tId]);
+ me.poll[tId] = null;
+ clearTimeout(pub.timeout[tId]);
+ me.timeout[tId] = null;
+
+ handleTransactionResponse(o, callback, (isAbort = true), isTimeout);
+ }
+ return isAbort;
+ },
+
+ isCallInProgress : function(o) {
+ // if there is a connection and readyState is not 0 or 4
+ return o.conn && !{0:true,4:true}[o.conn.readyState];
+ }
+ };
+ return pub;
+}();(function(){
+ var EXTLIB = Ext.lib,
+ noNegatives = /width|height|opacity|padding/i,
+ offsetAttribute = /^((width|height)|(top|left))$/,
+ defaultUnit = /width|height|top$|bottom$|left$|right$/i,
+ offsetUnit = /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i,
+ isset = function(v){
+ return typeof v !== 'undefined';
+ },
+ now = function(){
+ return new Date();
+ };
+
+ EXTLIB.Anim = {
+ motion : function(el, args, duration, easing, cb, scope) {
+ return this.run(el, args, duration, easing, cb, scope, Ext.lib.Motion);
+ },
+
+ run : function(el, args, duration, easing, cb, scope, type) {
+ type = type || Ext.lib.AnimBase;
+ if (typeof easing == "string") {
+ easing = Ext.lib.Easing[easing];
+ }
+ var anim = new type(el, args, duration, easing);
+ anim.animateX(function() {
+ if(Ext.isFunction(cb)){
+ cb.call(scope);
+ }
+ });
+ return anim;
+ }
+ };
+
+ EXTLIB.AnimBase = function(el, attributes, duration, method) {
+ if (el) {
+ this.init(el, attributes, duration, method);
+ }
+ };
+
+ EXTLIB.AnimBase.prototype = {
+ doMethod: function(attr, start, end) {
+ var me = this;
+ return me.method(me.curFrame, start, end - start, me.totalFrames);
+ },
+
+
+ setAttr: function(attr, val, unit) {
+ if (noNegatives.test(attr) && val < 0) {
+ val = 0;
+ }
+ Ext.fly(this.el, '_anim').setStyle(attr, val + unit);
+ },
+
+
+ getAttr: function(attr) {
+ var el = Ext.fly(this.el),
+ val = el.getStyle(attr),
+ a = offsetAttribute.exec(attr) || [];
+
+ if (val !== 'auto' && !offsetUnit.test(val)) {
+ return parseFloat(val);
+ }
+
+ return (!!(a[2]) || (el.getStyle('position') == 'absolute' && !!(a[3]))) ? el.dom['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)] : 0;
+ },
+
+
+ getDefaultUnit: function(attr) {
+ return defaultUnit.test(attr) ? 'px' : '';
+ },
+
+ animateX : function(callback, scope) {
+ var me = this,
+ f = function() {
+ me.onComplete.removeListener(f);
+ if (Ext.isFunction(callback)) {
+ callback.call(scope || me, me);
+ }
+ };
+ me.onComplete.addListener(f, me);
+ me.animate();
+ },
+
+
+ setRunAttr: function(attr) {
+ var me = this,
+ a = this.attributes[attr],
+ to = a.to,
+ by = a.by,
+ from = a.from,
+ unit = a.unit,
+ ra = (this.runAttrs[attr] = {}),
+ end;
+
+ if (!isset(to) && !isset(by)){
+ return false;
+ }
+
+ var start = isset(from) ? from : me.getAttr(attr);
+ if (isset(to)) {
+ end = to;
+ }else if(isset(by)) {
+ if (Ext.isArray(start)){
+ end = [];
+ for(var i=0,len=start.length; i<len; i++) {
+ end[i] = start[i] + by[i];
+ }
+ }else{
+ end = start + by;
+ }
+ }
+
+ Ext.apply(ra, {
+ start: start,
+ end: end,
+ unit: isset(unit) ? unit : me.getDefaultUnit(attr)
+ });
+ },
+
+
+ init: function(el, attributes, duration, method) {
+ var me = this,
+ actualFrames = 0,
+ mgr = EXTLIB.AnimMgr;
+
+ Ext.apply(me, {
+ isAnimated: false,
+ startTime: null,
+ el: Ext.getDom(el),
+ attributes: attributes || {},
+ duration: duration || 1,
+ method: method || EXTLIB.Easing.easeNone,
+ useSec: true,
+ curFrame: 0,
+ totalFrames: mgr.fps,
+ runAttrs: {},
+ animate: function(){
+ var me = this,
+ d = me.duration;
+
+ if(me.isAnimated){
+ return false;
+ }
+
+ me.curFrame = 0;
+ me.totalFrames = me.useSec ? Math.ceil(mgr.fps * d) : d;
+ mgr.registerElement(me);
+ },
+
+ stop: function(finish){
+ var me = this;
+
+ if(finish){
+ me.curFrame = me.totalFrames;
+ me._onTween.fire();
+ }
+ mgr.stop(me);
+ }
+ });
+
+ var onStart = function(){
+ var me = this,
+ attr;
+
+ me.onStart.fire();
+ me.runAttrs = {};
+ for(attr in this.attributes){
+ this.setRunAttr(attr);
+ }
+
+ me.isAnimated = true;
+ me.startTime = now();
+ actualFrames = 0;
+ };
+
+
+ var onTween = function(){
+ var me = this;
+
+ me.onTween.fire({
+ duration: now() - me.startTime,
+ curFrame: me.curFrame
+ });
+
+ var ra = me.runAttrs;
+ for (var attr in ra) {
+ this.setAttr(attr, me.doMethod(attr, ra[attr].start, ra[attr].end), ra[attr].unit);
+ }
+
+ ++actualFrames;
+ };
+
+ var onComplete = function() {
+ var me = this,
+ actual = (now() - me.startTime) / 1000,
+ data = {
+ duration: actual,
+ frames: actualFrames,
+ fps: actualFrames / actual
+ };
+
+ me.isAnimated = false;
+ actualFrames = 0;
+ me.onComplete.fire(data);
+ };
+
+ me.onStart = new Ext.util.Event(me);
+ me.onTween = new Ext.util.Event(me);
+ me.onComplete = new Ext.util.Event(me);
+ (me._onStart = new Ext.util.Event(me)).addListener(onStart);
+ (me._onTween = new Ext.util.Event(me)).addListener(onTween);
+ (me._onComplete = new Ext.util.Event(me)).addListener(onComplete);
+ }
+ };
+
+
+ Ext.lib.AnimMgr = new function() {
+ var me = this,
+ thread = null,
+ queue = [],
+ tweenCount = 0;
+
+
+ Ext.apply(me, {
+ fps: 1000,
+ delay: 1,
+ registerElement: function(tween){
+ queue.push(tween);
+ ++tweenCount;
+ tween._onStart.fire();
+ me.start();
+ },
+
+ unRegister: function(tween, index){
+ tween._onComplete.fire();
+ index = index || getIndex(tween);
+ if (index != -1) {
+ queue.splice(index, 1);
+ }
+
+ if (--tweenCount <= 0) {
+ me.stop();
+ }
+ },
+
+ start: function(){
+ if(thread === null){
+ thread = setInterval(me.run, me.delay);
+ }
+ },
+
+ stop: function(tween){
+ if(!tween){
+ clearInterval(thread);
+ for(var i = 0, len = queue.length; i < len; ++i){
+ if(queue[0].isAnimated){
+ me.unRegister(queue[0], 0);
+ }
+ }
+
+ queue = [];
+ thread = null;
+ tweenCount = 0;
+ }else{
+ me.unRegister(tween);
+ }
+ },
+
+ run: function(){
+ var tf, i, len, tween;
+ for(i = 0, len = queue.length; i<len; i++) {
+ tween = queue[i];
+ if(tween && tween.isAnimated){
+ tf = tween.totalFrames;
+ if(tween.curFrame < tf || tf === null){
+ ++tween.curFrame;
+ if(tween.useSec){
+ correctFrame(tween);
+ }
+ tween._onTween.fire();
+ }else{
+ me.stop(tween);
+ }
+ }
+ }
+ }
+ });
+
+ var getIndex = function(anim) {
+ var i, len;
+ for(i = 0, len = queue.length; i<len; i++) {
+ if(queue[i] === anim) {
+ return i;
+ }
+ }
+ return -1;
+ };
+
+ var correctFrame = function(tween) {
+ var frames = tween.totalFrames,
+ frame = tween.curFrame,
+ duration = tween.duration,
+ expected = (frame * duration * 1000 / frames),
+ elapsed = (now() - tween.startTime),
+ tweak = 0;
+
+ if(elapsed < duration * 1000){
+ tweak = Math.round((elapsed / expected - 1) * frame);
+ }else{
+ tweak = frames - (frame + 1);
+ }
+ if(tweak > 0 && isFinite(tweak)){
+ if(tween.curFrame + tweak >= frames){
+ tweak = frames - (frame + 1);
+ }
+ tween.curFrame += tweak;
+ }
+ };
+ };
+
+ EXTLIB.Bezier = new function() {
+
+ this.getPosition = function(points, t) {
+ var n = points.length,
+ tmp = [],
+ c = 1 - t,
+ i,
+ j;
+
+ for (i = 0; i < n; ++i) {
+ tmp[i] = [points[i][0], points[i][1]];
+ }
+
+ for (j = 1; j < n; ++j) {
+ for (i = 0; i < n - j; ++i) {
+ tmp[i][0] = c * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0];
+ tmp[i][1] = c * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1];
+ }
+ }
+
+ return [ tmp[0][0], tmp[0][1] ];
+
+ };
+ };
+
+
+ EXTLIB.Easing = {
+ easeNone: function (t, b, c, d) {
+ return c * t / d + b;
+ },
+
+
+ easeIn: function (t, b, c, d) {
+ return c * (t /= d) * t + b;
+ },
+
+
+ easeOut: function (t, b, c, d) {
+ return -c * (t /= d) * (t - 2) + b;
+ }
+ };
+
+ (function() {
+ EXTLIB.Motion = function(el, attributes, duration, method) {
+ if (el) {
+ EXTLIB.Motion.superclass.constructor.call(this, el, attributes, duration, method);
+ }
+ };
+
+ Ext.extend(EXTLIB.Motion, Ext.lib.AnimBase);
+
+ var superclass = EXTLIB.Motion.superclass,
+ pointsRe = /^points$/i;
+
+ Ext.apply(EXTLIB.Motion.prototype, {
+ setAttr: function(attr, val, unit){
+ var me = this,
+ setAttr = superclass.setAttr;
+
+ if (pointsRe.test(attr)) {
+ unit = unit || 'px';
+ setAttr.call(me, 'left', val[0], unit);
+ setAttr.call(me, 'top', val[1], unit);
+ } else {
+ setAttr.call(me, attr, val, unit);
+ }
+ },
+
+ getAttr: function(attr){
+ var me = this,
+ getAttr = superclass.getAttr;
+
+ return pointsRe.test(attr) ? [getAttr.call(me, 'left'), getAttr.call(me, 'top')] : getAttr.call(me, attr);
+ },
+
+ doMethod: function(attr, start, end){
+ var me = this;
+
+ return pointsRe.test(attr)
+ ? EXTLIB.Bezier.getPosition(me.runAttrs[attr], me.method(me.curFrame, 0, 100, me.totalFrames) / 100)
+ : superclass.doMethod.call(me, attr, start, end);
+ },
+
+ setRunAttr: function(attr){
+ if(pointsRe.test(attr)){
+
+ var me = this,
+ el = this.el,
+ points = this.attributes.points,
+ control = points.control || [],
+ from = points.from,
+ to = points.to,
+ by = points.by,
+ DOM = EXTLIB.Dom,
+ start,
+ i,
+ end,
+ len,
+ ra;
+
+
+ if(control.length > 0 && !Ext.isArray(control[0])){
+ control = [control];
+ }else{
+ /*
+ var tmp = [];
+ for (i = 0,len = control.length; i < len; ++i) {
+ tmp[i] = control[i];
+ }
+ control = tmp;
+ */
+ }
+
+ Ext.fly(el, '_anim').position();
+ DOM.setXY(el, isset(from) ? from : DOM.getXY(el));
+ start = me.getAttr('points');
+
+
+ if(isset(to)){
+ end = translateValues.call(me, to, start);
+ for (i = 0,len = control.length; i < len; ++i) {
+ control[i] = translateValues.call(me, control[i], start);
+ }
+ } else if (isset(by)) {
+ end = [start[0] + by[0], start[1] + by[1]];
+
+ for (i = 0,len = control.length; i < len; ++i) {
+ control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ];
+ }
+ }
+
+ ra = this.runAttrs[attr] = [start];
+ if (control.length > 0) {
+ ra = ra.concat(control);
+ }
+
+ ra[ra.length] = end;
+ }else{
+ superclass.setRunAttr.call(this, attr);
+ }
+ }
+ });
+
+ var translateValues = function(val, start) {
+ var pageXY = EXTLIB.Dom.getXY(this.el);
+ return [val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1]];
+ };
+ })();
+})();// Easing functions
+(function(){
+ // shortcuts to aid compression
+ var abs = Math.abs,
+ pi = Math.PI,
+ asin = Math.asin,
+ pow = Math.pow,
+ sin = Math.sin,
+ EXTLIB = Ext.lib;
+
+ Ext.apply(EXTLIB.Easing, {
+
+ easeBoth: function (t, b, c, d) {
+ return ((t /= d / 2) < 1) ? c / 2 * t * t + b : -c / 2 * ((--t) * (t - 2) - 1) + b;
+ },
+
+ easeInStrong: function (t, b, c, d) {
+ return c * (t /= d) * t * t * t + b;
+ },
+
+ easeOutStrong: function (t, b, c, d) {
+ return -c * ((t = t / d - 1) * t * t * t - 1) + b;
+ },
+
+ easeBothStrong: function (t, b, c, d) {
+ return ((t /= d / 2) < 1) ? c / 2 * t * t * t * t + b : -c / 2 * ((t -= 2) * t * t * t - 2) + b;
+ },
+
+ elasticIn: function (t, b, c, d, a, p) {
+ if (t == 0 || (t /= d) == 1) {
+ return t == 0 ? b : b + c;
+ }
+ p = p || (d * .3);
+
+ var s;
+ if (a >= abs(c)) {
+ s = p / (2 * pi) * asin(c / a);
+ } else {
+ a = c;
+ s = p / 4;
+ }
+
+ return -(a * pow(2, 10 * (t -= 1)) * sin((t * d - s) * (2 * pi) / p)) + b;
+
+ },
+
+ elasticOut: function (t, b, c, d, a, p) {
+ if (t == 0 || (t /= d) == 1) {
+ return t == 0 ? b : b + c;
+ }
+ p = p || (d * .3);
+
+ var s;
+ if (a >= abs(c)) {
+ s = p / (2 * pi) * asin(c / a);
+ } else {
+ a = c;
+ s = p / 4;
+ }
+
+ return a * pow(2, -10 * t) * sin((t * d - s) * (2 * pi) / p) + c + b;
+ },
+
+ elasticBoth: function (t, b, c, d, a, p) {
+ if (t == 0 || (t /= d / 2) == 2) {
+ return t == 0 ? b : b + c;
+ }
+
+ p = p || (d * (.3 * 1.5));
+
+ var s;
+ if (a >= abs(c)) {
+ s = p / (2 * pi) * asin(c / a);
+ } else {
+ a = c;
+ s = p / 4;
+ }
+
+ return t < 1 ?
+ -.5 * (a * pow(2, 10 * (t -= 1)) * sin((t * d - s) * (2 * pi) / p)) + b :
+ a * pow(2, -10 * (t -= 1)) * sin((t * d - s) * (2 * pi) / p) * .5 + c + b;
+ },
+
+ backIn: function (t, b, c, d, s) {
+ s = s || 1.70158;
+ return c * (t /= d) * t * ((s + 1) * t - s) + b;
+ },
+
+
+ backOut: function (t, b, c, d, s) {
+ if (!s) {
+ s = 1.70158;
+ }
+ return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
+ },
+
+
+ backBoth: function (t, b, c, d, s) {
+ s = s || 1.70158;
+
+ return ((t /= d / 2 ) < 1) ?
+ c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b :
+ c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;
+ },
+
+
+ bounceIn: function (t, b, c, d) {
+ return c - EXTLIB.Easing.bounceOut(d - t, 0, c, d) + b;
+ },
+
+
+ bounceOut: function (t, b, c, d) {
+ if ((t /= d) < (1 / 2.75)) {
+ return c * (7.5625 * t * t) + b;
+ } else if (t < (2 / 2.75)) {
+ return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;
+ } else if (t < (2.5 / 2.75)) {
+ return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;
+ }
+ return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;
+ },
+
+
+ bounceBoth: function (t, b, c, d) {
+ return (t < d / 2) ?
+ EXTLIB.Easing.bounceIn(t * 2, 0, c, d) * .5 + b :
+ EXTLIB.Easing.bounceOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b;
+ }
+ });
+})();
+
+(function() {
+ var EXTLIB = Ext.lib;
+ // Color Animation
+ EXTLIB.Anim.color = function(el, args, duration, easing, cb, scope) {
+ return EXTLIB.Anim.run(el, args, duration, easing, cb, scope, EXTLIB.ColorAnim);
+ };
+
+ EXTLIB.ColorAnim = function(el, attributes, duration, method) {
+ EXTLIB.ColorAnim.superclass.constructor.call(this, el, attributes, duration, method);
+ };
+
+ Ext.extend(EXTLIB.ColorAnim, EXTLIB.AnimBase);
+
+ var superclass = EXTLIB.ColorAnim.superclass,
+ colorRE = /color$/i,
+ transparentRE = /^transparent|rgba\(0, 0, 0, 0\)$/,
+ rgbRE = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,
+ hexRE= /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,
+ hex3RE = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i,
+ isset = function(v){
+ return typeof v !== 'undefined';
+ };
+
+ // private
+ function parseColor(s) {
+ var pi = parseInt,
+ base,
+ out = null,
+ c;
+
+ if (s.length == 3) {
+ return s;
+ }
+
+ Ext.each([hexRE, rgbRE, hex3RE], function(re, idx){
+ base = (idx % 2 == 0) ? 16 : 10;
+ c = re.exec(s);
+ if(c && c.length == 4){
+ out = [pi(c[1], base), pi(c[2], base), pi(c[3], base)];
+ return false;
+ }
+ });
+ return out;
+ }
+
+ Ext.apply(EXTLIB.ColorAnim.prototype, {
+ getAttr : function(attr) {
+ var me = this,
+ el = me.el,
+ val;
+ if(colorRE.test(attr)){
+ while(el && transparentRE.test(val = Ext.fly(el).getStyle(attr))){
+ el = el.parentNode;
+ val = "fff";
+ }
+ }else{
+ val = superclass.getAttr.call(me, attr);
+ }
+ return val;
+ },
+
+ doMethod : function(attr, start, end) {
+ var me = this,
+ val,
+ floor = Math.floor,
+ i,
+ len,
+ v;
+
+ if(colorRE.test(attr)){
+ val = [];
+ end = end || [];
+
+ for(i = 0, len = start.length; i < len; i++) {
+ v = start[i];
+ val[i] = superclass.doMethod.call(me, attr, v, end[i]);
+ }
+ val = 'rgb(' + floor(val[0]) + ',' + floor(val[1]) + ',' + floor(val[2]) + ')';
+ }else{
+ val = superclass.doMethod.call(me, attr, start, end);
+ }
+ return val;
+ },
+
+ setRunAttr : function(attr) {
+ var me = this,
+ a = me.attributes[attr],
+ to = a.to,
+ by = a.by,
+ ra;
+
+ superclass.setRunAttr.call(me, attr);
+ ra = me.runAttrs[attr];
+ if(colorRE.test(attr)){
+ var start = parseColor(ra.start),
+ end = parseColor(ra.end);
+
+ if(!isset(to) && isset(by)){
+ end = parseColor(by);
+ for(var i=0,len=start.length; i<len; i++) {
+ end[i] = start[i] + end[i];
+ }
+ }
+ ra.start = start;
+ ra.end = end;
+ }
+ }
+ });
+})();
+
+
+(function() {
+ // Scroll Animation
+ var EXTLIB = Ext.lib;
+ EXTLIB.Anim.scroll = function(el, args, duration, easing, cb, scope) {
+ return EXTLIB.Anim.run(el, args, duration, easing, cb, scope, EXTLIB.Scroll);
+ };
+
+ EXTLIB.Scroll = function(el, attributes, duration, method) {
+ if(el){
+ EXTLIB.Scroll.superclass.constructor.call(this, el, attributes, duration, method);
+ }
+ };
+
+ Ext.extend(EXTLIB.Scroll, EXTLIB.ColorAnim);
+
+ var superclass = EXTLIB.Scroll.superclass,
+ SCROLL = 'scroll';
+
+ Ext.apply(EXTLIB.Scroll.prototype, {
+
+ doMethod : function(attr, start, end) {
+ var val,
+ me = this,
+ curFrame = me.curFrame,
+ totalFrames = me.totalFrames;
+
+ if(attr == SCROLL){
+ val = [me.method(curFrame, start[0], end[0] - start[0], totalFrames),
+ me.method(curFrame, start[1], end[1] - start[1], totalFrames)];
+ }else{
+ val = superclass.doMethod.call(me, attr, start, end);
+ }
+ return val;
+ },
+
+ getAttr : function(attr) {
+ var me = this;
+
+ if (attr == SCROLL) {
+ return [me.el.scrollLeft, me.el.scrollTop];
+ }else{
+ return superclass.getAttr.call(me, attr);
+ }
+ },
+
+ setAttr : function(attr, val, unit) {
+ var me = this;
+
+ if(attr == SCROLL){
+ me.el.scrollLeft = val[0];
+ me.el.scrollTop = val[1];
+ }else{
+ superclass.setAttr.call(me, attr, val, unit);
+ }
+ }
+ });
+})();
+ if (Ext.isIE9m) {
+ function fnCleanUp() {
+ var p = Function.prototype;
+ delete p.createSequence;
+ delete p.defer;
+ delete p.createDelegate;
+ delete p.createCallback;
+ delete p.createInterceptor;
+
+ window.detachEvent("onunload", fnCleanUp);
+ }
+ window.attachEvent("onunload", fnCleanUp);
+ }
+})();
diff --git a/deluge/ui/web/js/extjs/ext-base.js b/deluge/ui/web/js/extjs/ext-base.js
new file mode 100644
index 0000000..29047a7
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-base.js
@@ -0,0 +1,21 @@
+/*
+This file is part of Ext JS 3.4
+
+Copyright (c) 2011-2013 Sencha Inc
+
+Contact: http://www.sencha.com/contact
+
+GNU General Public License Usage
+This file may be used under the terms of the GNU General Public License version 3.0 as
+published by the Free Software Foundation and appearing in the file LICENSE included in the
+packaging of this file.
+
+Please review the following information to ensure the GNU General Public License version 3.0
+requirements will be met: http://www.gnu.org/copyleft/gpl.html.
+
+If you are unsure which license is appropriate for your use, please contact the sales department
+at http://www.sencha.com/contact.
+
+Build date: 2013-04-03 15:07:25
+*/
+window.undefined=window.undefined;Ext={version:"3.4.1.1",versionDetail:{major:3,minor:4,patch:1.1}};Ext.apply=function(d,e,b){if(b){Ext.apply(d,b)}if(d&&e&&typeof e=="object"){for(var a in e){d[a]=e[a]}}return d};(function(){var g=0,f=Object.prototype.toString,y=navigator.userAgent.toLowerCase(),n=function(e){return e.test(y)},s=document,q=s.documentMode,u=s.compatMode=="CSS1Compat",a=n(/opera/),H=n(/\bchrome\b/),z=n(/webkit/),d=!H&&n(/safari/),F=d&&n(/applewebkit\/4/),D=d&&n(/version\/3/),B=d&&n(/version\/4/),j=!a&&n(/msie/),G=j&&((n(/msie 7/)&&q!=8&&q!=9&&q!=10)||q==7),E=j&&((n(/msie 8/)&&q!=7&&q!=9&&q!=10)||q==8),C=j&&((n(/msie 9/)&&q!=7&&q!=8&&q!=10)||q==9),i=j&&((n(/msie 10/)&&q!=7&&q!=8&&q!=9)||q==10),J=j&&n(/msie 6/),K=j&&(J||G||E||C),c=!z&&n(/gecko/),M=c&&n(/rv:1\.8/),L=c&&n(/rv:1\.9/),m=K&&!u,h=n(/windows|win32/),A=n(/macintosh|mac os x/),p=n(/adobeair/),v=n(/linux/),r=/^https/i.test(window.location.protocol),b=[],w=[],o=Ext.emptyFn,x=Ext.apply({},{constructor:o,toString:o,valueOf:o}),l=function(){var e=l.caller.caller;return e.$owner.prototype[e.$name].apply(this,arguments)};if(x.constructor!==o){w.push("constructor")}if(x.toString!==o){w.push("toString")}if(x.valueOf!==o){w.push("valueOf")}if(!w.length){w=null}function k(){}Ext.apply(k,{$isClass:true,callParent:function(e){var t;return(t=this.callParent.caller)&&(t.$previous||((t=t.$owner?t:t.caller)&&t.$owner.superclass.self[t.$name])).apply(this,e||b)}});k.prototype={constructor:function(){},callParent:function(t){var N,e=(N=this.callParent.caller)&&(N.$previous||((N=N.$owner?N:N.caller)&&N.$owner.superclass[N.$name]));return e.apply(this,t||b)}};if(J){try{s.execCommand("BackgroundImageCache",false,true)}catch(I){}}Ext.apply(Ext,{SSL_SECURE_URL:r&&j?'javascript:""':"about:blank",isStrict:u,isSecure:r,isReady:false,enableForcedBoxModel:false,enableGarbageCollector:true,enableListenerCollection:false,enableNestedListenerRemoval:false,USE_NATIVE_JSON:false,applyIf:function(t,N){if(t){for(var e in N){if(!Ext.isDefined(t[e])){t[e]=N[e]}}}return t},id:function(e,t){e=Ext.getDom(e,true)||{};if(!e.id){e.id=(t||"ext-gen")+(++g)}return e.id},extend:function(){var t=function(O){for(var N in O){this[N]=O[N]}};var e=Object.prototype.constructor;return function(S,P,R){if(typeof P=="object"){R=P;P=S;S=R.constructor!=e?R.constructor:function(){P.apply(this,arguments)}}var O=function(){},Q,N=P.prototype;O.prototype=N;Q=S.prototype=new O();Q.constructor=S;S.superclass=N;if(N.constructor==e){N.constructor=P}S.override=function(T){Ext.override(S,T)};Q.superclass=Q.supr=(function(){return N});Q.override=t;Ext.override(S,R);S.extend=function(T){return Ext.extend(S,T)};return S}}(),global:(function(){return this})(),Base:k,namespaceCache:{},createNamespace:function(R,O){var e=Ext.namespaceCache,P=O?R.substring(0,R.lastIndexOf(".")):R,U=e[P],S,N,t,Q,T;if(!U){U=Ext.global;if(P){T=[];Q=P.split(".");for(S=0,N=Q.length;S<N;++S){t=Q[S];U=U[t]||(U[t]={});T.push(t);e[T.join(".")]=U}}}return U},getClassByName:function(N){var O=N.split("."),e=Ext.global,P=O.length,t;for(t=0;e&&t<P;++t){e=e[O[t]]}return e||null},addMembers:function(t,Q,N,e){var P,O,R;for(O in N){if(N.hasOwnProperty(O)){R=N[O];if(typeof R=="function"){R.$owner=t;R.$name=O}Q[O]=R}}if(e&&w){for(P=w.length;P-->0;){O=w[P];if(N.hasOwnProperty(O)){R=N[O];if(typeof R=="function"){R.$owner=t;R.$name=O}Q[O]=R}}}},define:function(R,P,N){var t=P.override,T,Q,e,O;if(t){delete P.override;T=Ext.getClassByName(t);Ext.override(T,P)}else{if(R){O=Ext.createNamespace(R,true);e=R.substring(R.lastIndexOf(".")+1)}T=function S(){this.constructor.apply(this,arguments)};if(R){T.displayName=R}T.$isClass=true;T.callParent=Ext.Base.callParent;if(typeof P=="function"){P=P(T)}Q=P.extend;if(Q){delete P.extend;if(typeof Q=="string"){Q=Ext.getClassByName(Q)}}else{Q=k}Ext.extend(T,Q,P);if(T.prototype.constructor===T){delete T.prototype.constructor}if(!T.prototype.$isClass){Ext.applyIf(T.prototype,k.prototype)}T.prototype.self=T;if(P.xtype){Ext.reg(P.xtype,T)}T=P.singleton?new T():T;if(R){O[e]=T}}if(N){N.call(T)}return T},override:function(P,R){var N,Q;if(R){if(P.$isClass){Q=R.statics;if(Q){delete R.statics}Ext.addMembers(P,P.prototype,R,true);if(Q){Ext.addMembers(P,P,Q)}}else{if(typeof P=="function"){N=P.prototype;Ext.apply(N,R);if(Ext.isIE&&R.hasOwnProperty("toString")){N.toString=R.toString}}else{var e=P.self,t,O;if(e&&e.$isClass){for(t in R){if(R.hasOwnProperty(t)){O=R[t];if(typeof O=="function"){if(e.$className){O.displayName=e.$className+"#"+t}O.$name=t;O.$owner=e;O.$previous=P.hasOwnProperty(t)?P[t]:l}P[t]=O}}}else{Ext.apply(P,R);if(!P.constructor.$isClass){P.constructor.prototype.callParent=k.prototype.callParent;P.constructor.callParent=k.callParent}}}}}},namespace:function(){var O=arguments.length,P=0,t,N,e,R,Q,S;for(;P<O;++P){e=arguments[P];R=arguments[P].split(".");S=window[R[0]];if(S===undefined){S=window[R[0]]={}}Q=R.slice(1);t=Q.length;for(N=0;N<t;++N){S=S[Q[N]]=S[Q[N]]||{}}}return S},urlEncode:function(Q,P){var N,t=[],O=encodeURIComponent;Ext.iterate(Q,function(e,R){N=Ext.isEmpty(R);Ext.each(N?e:R,function(S){t.push("&",O(e),"=",(!Ext.isEmpty(S)&&(S!=e||!N))?(Ext.isDate(S)?Ext.encode(S).replace(/"/g,""):O(S)):"")})});if(!P){t.shift();P=""}return P+t.join("")},urlDecode:function(N,t){if(Ext.isEmpty(N)){return{}}var Q={},P=N.split("&"),R=decodeURIComponent,e,O;Ext.each(P,function(S){S=S.split("=");e=R(S[0]);O=R(S[1]);Q[e]=t||!Q[e]?O:[].concat(Q[e]).concat(O)});return Q},urlAppend:function(e,t){if(!Ext.isEmpty(t)){return e+(e.indexOf("?")===-1?"?":"&")+t}return e},toArray:function(){return j?function(N,Q,O,P){P=[];for(var t=0,e=N.length;t<e;t++){P.push(N[t])}return P.slice(Q||0,O||P.length)}:function(e,N,t){return Array.prototype.slice.call(e,N||0,t||e.length)}}(),isIterable:function(e){if(Ext.isArray(e)||e.callee){return true}if(/NodeList|HTMLCollection/.test(f.call(e))){return true}return((typeof e.nextNode!="undefined"||e.item)&&Ext.isNumber(e.length))},each:function(P,O,N){if(Ext.isEmpty(P,true)){return}if(!Ext.isIterable(P)||Ext.isPrimitive(P)){P=[P]}for(var t=0,e=P.length;t<e;t++){if(O.call(N||P[t],P[t],t,P)===false){return t}}},iterate:function(N,t,e){if(Ext.isEmpty(N)){return}if(Ext.isIterable(N)){Ext.each(N,t,e);return}else{if(typeof N=="object"){for(var O in N){if(N.hasOwnProperty(O)){if(t.call(e||N,O,N[O],N)===false){return}}}}}},getDom:function(N,t){if(!N||!s){return null}if(N.dom){return N.dom}else{if(typeof N=="string"){var O=s.getElementById(N);if(O&&j&&t){if(N==O.getAttribute("id")){return O}else{return null}}return O}else{return N}}},getBody:function(){return Ext.get(s.body||s.documentElement)},getHead:function(){var e;return function(){if(e==undefined){e=Ext.get(s.getElementsByTagName("head")[0])}return e}}(),removeNode:j&&!E?function(){var e;return function(t){if(t&&t.tagName!="BODY"){(Ext.enableNestedListenerRemoval)?Ext.EventManager.purgeElement(t,true):Ext.EventManager.removeAll(t);e=e||s.createElement("div");e.appendChild(t);e.innerHTML="";delete Ext.elCache[t.id]}}}():function(e){if(e&&e.parentNode&&e.tagName!="BODY"){(Ext.enableNestedListenerRemoval)?Ext.EventManager.purgeElement(e,true):Ext.EventManager.removeAll(e);e.parentNode.removeChild(e);delete Ext.elCache[e.id]}},isEmpty:function(t,e){return t===null||t===undefined||((Ext.isArray(t)&&!t.length))||(!e?t==="":false)},isArray:function(e){return f.apply(e)==="[object Array]"},isDate:function(e){return f.apply(e)==="[object Date]"},isObject:function(e){return !!e&&Object.prototype.toString.call(e)==="[object Object]"},isPrimitive:function(e){return Ext.isString(e)||Ext.isNumber(e)||Ext.isBoolean(e)},isFunction:function(e){return f.apply(e)==="[object Function]"},isNumber:function(e){return typeof e==="number"&&isFinite(e)},isString:function(e){return typeof e==="string"},isBoolean:function(e){return typeof e==="boolean"},isElement:function(e){return e?!!e.tagName:false},isDefined:function(e){return typeof e!=="undefined"},isOpera:a,isWebKit:z,isChrome:H,isSafari:d,isSafari3:D,isSafari4:B,isSafari2:F,isIE:j,isIE6:J,isIE7:G,isIE8:E,isIE9:C,isIE10:i,isIE9m:K,isIE10p:j&&!(J||G||E||C),isIEQuirks:j&&(!u&&(J||G||E||C)),isGecko:c,isGecko2:M,isGecko3:L,isBorderBox:m,isLinux:v,isWindows:h,isMac:A,isAir:p});Ext.ns=Ext.namespace})();Ext.ns("Ext.util","Ext.lib","Ext.data","Ext.supports");Ext.elCache={};Ext.apply(Function.prototype,{createInterceptor:function(b,a){var c=this;return !Ext.isFunction(b)?this:function(){var e=this,d=arguments;b.target=e;b.method=c;return(b.apply(a||e||window,d)!==false)?c.apply(e||window,d):null}},createCallback:function(){var a=arguments,b=this;return function(){return b.apply(window,a)}},createDelegate:function(c,b,a){var d=this;return function(){var f=b||arguments;if(a===true){f=Array.prototype.slice.call(arguments,0);f=f.concat(b)}else{if(Ext.isNumber(a)){f=Array.prototype.slice.call(arguments,0);var e=[a,0].concat(b);Array.prototype.splice.apply(f,e)}}return d.apply(c||window,f)}},defer:function(c,e,b,a){var d=this.createDelegate(e,b,a);if(c>0){return setTimeout(d,c)}d();return 0}});Ext.applyIf(String,{format:function(b){var a=Ext.toArray(arguments,1);return b.replace(/\{(\d+)\}/g,function(c,d){return a[d]})}});Ext.applyIf(Array.prototype,{indexOf:function(b,c){var a=this.length;c=c||0;c+=(c<0)?a:0;for(;c<a;++c){if(this[c]===b){return c}}return -1},remove:function(b){var a=this.indexOf(b);if(a!=-1){this.splice(a,1)}return this}});Ext.util.TaskRunner=function(e){e=e||10;var f=[],a=[],b=0,g=false,d=function(){g=false;clearInterval(b);b=0},h=function(){if(!g){g=true;b=setInterval(i,e)}},c=function(j){a.push(j);if(j.onStop){j.onStop.apply(j.scope||j)}},i=function(){var l=a.length,n=new Date().getTime();if(l>0){for(var p=0;p<l;p++){f.remove(a[p])}a=[];if(f.length<1){d();return}}for(var p=0,o,k,m,j=f.length;p<j;++p){o=f[p];k=n-o.taskRunTime;if(o.interval<=k){m=o.run.apply(o.scope||o,o.args||[++o.taskRunCount]);o.taskRunTime=n;if(m===false||o.taskRunCount===o.repeat){c(o);return}}if(o.duration&&o.duration<=(n-o.taskStartTime)){c(o)}}};this.start=function(j){f.push(j);j.taskStartTime=new Date().getTime();j.taskRunTime=0;j.taskRunCount=0;h();return j};this.stop=function(j){c(j);return j};this.stopAll=function(){d();for(var k=0,j=f.length;k<j;k++){if(f[k].onStop){f[k].onStop()}}f=[];a=[]}};Ext.TaskMgr=new Ext.util.TaskRunner();(function(){var b;function c(d){if(!b){b=new Ext.Element.Flyweight()}b.dom=d;return b}(function(){var g=document,e=g.compatMode=="CSS1Compat",f=Math.max,d=Math.round,h=parseInt;Ext.lib.Dom={isAncestor:function(j,k){var i=false;j=Ext.getDom(j);k=Ext.getDom(k);if(j&&k){if(j.contains){return j.contains(k)}else{if(j.compareDocumentPosition){return !!(j.compareDocumentPosition(k)&16)}else{while(k=k.parentNode){i=k==j||i}}}}return i},getViewWidth:function(i){return i?this.getDocumentWidth():this.getViewportWidth()},getViewHeight:function(i){return i?this.getDocumentHeight():this.getViewportHeight()},getDocumentHeight:function(){return f(!e?g.body.scrollHeight:g.documentElement.scrollHeight,this.getViewportHeight())},getDocumentWidth:function(){return f(!e?g.body.scrollWidth:g.documentElement.scrollWidth,this.getViewportWidth())},getViewportHeight:function(){return Ext.isIE9m?(Ext.isStrict?g.documentElement.clientHeight:g.body.clientHeight):self.innerHeight},getViewportWidth:function(){return !Ext.isStrict&&!Ext.isOpera?g.body.clientWidth:Ext.isIE9m?g.documentElement.clientWidth:self.innerWidth},getY:function(i){return this.getXY(i)[1]},getX:function(i){return this.getXY(i)[0]},getXY:function(k){var j,q,s,v,l,m,u=0,r=0,t,i,n=(g.body||g.documentElement),o=[0,0];k=Ext.getDom(k);if(k!=n){if(k.getBoundingClientRect){s=k.getBoundingClientRect();t=c(document).getScroll();o=[d(s.left+t.left),d(s.top+t.top)]}else{j=k;i=c(k).isStyle("position","absolute");while(j){q=c(j);u+=j.offsetLeft;r+=j.offsetTop;i=i||q.isStyle("position","absolute");if(Ext.isGecko){r+=v=h(q.getStyle("borderTopWidth"),10)||0;u+=l=h(q.getStyle("borderLeftWidth"),10)||0;if(j!=k&&!q.isStyle("overflow","visible")){u+=l;r+=v}}j=j.offsetParent}if(Ext.isSafari&&i){u-=n.offsetLeft;r-=n.offsetTop}if(Ext.isGecko&&!i){m=c(n);u+=h(m.getStyle("borderLeftWidth"),10)||0;r+=h(m.getStyle("borderTopWidth"),10)||0}j=k.parentNode;while(j&&j!=n){if(!Ext.isOpera||(j.tagName!="TR"&&!c(j).isStyle("display","inline"))){u-=j.scrollLeft;r-=j.scrollTop}j=j.parentNode}o=[u,r]}}return o},setXY:function(j,k){(j=Ext.fly(j,"_setXY")).position();var l=j.translatePoints(k),i=j.dom.style,m;for(m in l){if(!isNaN(l[m])){i[m]=l[m]+"px"}}},setX:function(j,i){this.setXY(j,[i,false])},setY:function(i,j){this.setXY(i,[false,j])}}})();Ext.lib.Event=function(){var v=false,f={},z=0,o=[],d,A=false,k=window,E=document,l=200,r=20,p=0,i=1,s=2,w=3,t="scrollLeft",q="scrollTop",g="unload",y="mouseover",D="mouseout",e=function(){var F;if(k.addEventListener){F=function(J,H,I,G){if(H=="mouseenter"){I=I.createInterceptor(n);J.addEventListener(y,I,(G))}else{if(H=="mouseleave"){I=I.createInterceptor(n);J.addEventListener(D,I,(G))}else{J.addEventListener(H,I,(G))}}return I}}else{if(k.attachEvent){F=function(J,H,I,G){J.attachEvent("on"+H,I);return I}}else{F=function(){}}}return F}(),h=function(){var F;if(k.removeEventListener){F=function(J,H,I,G){if(H=="mouseenter"){H=y}else{if(H=="mouseleave"){H=D}}J.removeEventListener(H,I,(G))}}else{if(k.detachEvent){F=function(I,G,H){I.detachEvent("on"+G,H)}}else{F=function(){}}}return F}();function n(F){return !u(F.currentTarget,x.getRelatedTarget(F))}function u(F,G){if(F&&F.firstChild){while(G){if(G===F){return true}G=G.parentNode;if(G&&(G.nodeType!=1)){G=null}}}return false}function B(){var G=false,L=[],J,I,F,H,K=!v||(z>0);if(!A){A=true;for(I=0;I<o.length;++I){F=o[I];if(F&&(J=E.getElementById(F.id))){if(!F.checkReady||v||J.nextSibling||(E&&E.body)){H=F.override;J=H?(H===true?F.obj:H):J;F.fn.call(J,F.obj);o.remove(F);--I}else{L.push(F)}}}z=(L.length===0)?0:z-1;if(K){m()}else{clearInterval(d);d=null}G=!(A=false)}return G}function m(){if(!d){var F=function(){B()};d=setInterval(F,r)}}function C(){var F=E.documentElement,G=E.body;if(F&&(F[q]||F[t])){return[F[t],F[q]]}else{if(G){return[G[t],G[q]]}else{return[0,0]}}}function j(F,G){F=F.browserEvent||F;var H=F["page"+G];if(!H&&H!==0){H=F["client"+G]||0;if(Ext.isIE){H+=C()[G=="X"?0:1]}}return H}var x={extAdapter:true,onAvailable:function(H,F,I,G){o.push({id:H,fn:F,obj:I,override:G,checkReady:false});z=l;m()},addListener:function(H,F,G){H=Ext.getDom(H);if(H&&G){if(F==g){if(f[H.id]===undefined){f[H.id]=[]}f[H.id].push([F,G]);return G}return e(H,F,G,false)}return false},removeListener:function(L,H,K){L=Ext.getDom(L);var J,G,F,I;if(L&&K){if(H==g){if((I=f[L.id])!==undefined){for(J=0,G=I.length;J<G;J++){if((F=I[J])&&F[p]==H&&F[i]==K){f[L.id].splice(J,1)}}}return}h(L,H,K,false)}},getTarget:function(F){F=F.browserEvent||F;return this.resolveTextNode(F.target||F.srcElement)},resolveTextNode:Ext.isGecko?function(G){if(!G){return}var F=HTMLElement.prototype.toString.call(G);if(F=="[xpconnect wrapped native prototype]"||F=="[object XULElement]"){return}return G.nodeType==3?G.parentNode:G}:function(F){return F&&F.nodeType==3?F.parentNode:F},getRelatedTarget:function(F){F=F.browserEvent||F;return this.resolveTextNode(F.relatedTarget||(/(mouseout|mouseleave)/.test(F.type)?F.toElement:/(mouseover|mouseenter)/.test(F.type)?F.fromElement:null))},getPageX:function(F){return j(F,"X")},getPageY:function(F){return j(F,"Y")},getXY:function(F){return[this.getPageX(F),this.getPageY(F)]},stopEvent:function(F){this.stopPropagation(F);this.preventDefault(F)},stopPropagation:function(F){F=F.browserEvent||F;if(F.stopPropagation){F.stopPropagation()}else{F.cancelBubble=true}},preventDefault:function(F){F=F.browserEvent||F;if(F.preventDefault){F.preventDefault()}else{if(F.keyCode){F.keyCode=0}F.returnValue=false}},getEvent:function(F){F=F||k.event;if(!F){var G=this.getEvent.caller;while(G){F=G.arguments[0];if(F&&Event==F.constructor){break}G=G.caller}}return F},getCharCode:function(F){F=F.browserEvent||F;return F.charCode||F.keyCode||0},getListeners:function(G,F){Ext.EventManager.getListeners(G,F)},purgeElement:function(G,H,F){Ext.EventManager.purgeElement(G,H,F)},_load:function(F){v=true;if(Ext.isIE9m&&F!==true){h(k,"load",arguments.callee)}},_unload:function(J){var G=Ext.lib.Event,H,M,K,F,I,N;for(F in f){K=f[F];for(H=0,I=K.length;H<I;H++){M=K[H];if(M){try{N=M[w]?(M[w]===true?M[s]:M[w]):k;M[i].call(N,G.getEvent(J),M[s])}catch(L){}}}}Ext.EventManager._unload();h(k,g,G._unload)}};x.on=x.addListener;x.un=x.removeListener;if(E&&E.body){x._load(true)}else{e(k,"load",x._load)}e(k,g,x._unload);B();return x}();Ext.lib.Ajax=function(){var g=["Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP"],d="Content-Type";function h(v){var t=v.conn,w,u={};function s(x,y){for(w in y){if(y.hasOwnProperty(w)){x.setRequestHeader(w,y[w])}}}Ext.apply(u,k.headers,k.defaultHeaders);s(t,u);delete k.headers}function e(v,u,t,s){return{tId:v,status:t?-1:0,statusText:t?"transaction aborted":"communication failure",isAbort:t,isTimeout:s,argument:u}}function j(s,t){(k.headers=k.headers||{})[s]=t}function p(u,y){var C={},x,w=u.conn,A,B,v=w.status==1223;try{x=u.conn.getAllResponseHeaders();Ext.each(x.replace(/\r\n/g,"\n").split("\n"),function(s){A=s.indexOf(":");if(A>=0){B=s.substr(0,A).toLowerCase();if(s.charAt(A+1)==" "){++A}C[B]=s.substr(A+1)}})}catch(z){}return{tId:u.tId,status:v?204:w.status,statusText:v?"No Content":w.statusText,getResponseHeader:function(s){return C[s.toLowerCase()]},getAllResponseHeaders:function(){return x},responseText:w.responseText,responseXML:w.responseXML,argument:y}}function o(s){if(s.tId){k.conn[s.tId]=null}s.conn=null;s=null}function f(x,y,t,s){if(!y){o(x);return}var v,u;try{if(x.conn.status!==undefined&&x.conn.status!=0){v=x.conn.status}else{v=13030}}catch(w){v=13030}if((v>=200&&v<300)||(Ext.isIE&&v==1223)){u=p(x,y.argument);if(y.success){if(!y.scope){y.success(u)}else{y.success.apply(y.scope,[u])}}}else{switch(v){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:u=e(x.tId,y.argument,(t?t:false),s);if(y.failure){if(!y.scope){y.failure(u)}else{y.failure.apply(y.scope,[u])}}break;default:u=p(x,y.argument);if(y.failure){if(!y.scope){y.failure(u)}else{y.failure.apply(y.scope,[u])}}}}o(x);u=null}function m(u,x,s,w,t,v){if(s&&s.readyState==4){clearInterval(t[w]);t[w]=null;if(v){clearTimeout(k.timeout[w]);k.timeout[w]=null}f(u,x)}}function r(s,t){k.abort(s,t,true)}function n(u,x){x=x||{};var s=u.conn,w=u.tId,t=k.poll,v=x.timeout||null;if(v){k.conn[w]=s;k.timeout[w]=setTimeout(r.createCallback(u,x),v)}t[w]=setInterval(m.createCallback(u,x,s,w,t,v),k.pollInterval)}function i(w,t,v,s){var u=l()||null;if(u){u.conn.open(w,t,true);if(k.useDefaultXhrHeader){j("X-Requested-With",k.defaultXhrHeader)}if(s&&k.useDefaultHeader&&(!k.headers||!k.headers[d])){j(d,k.defaultPostHeader)}if(k.defaultHeaders||k.headers){h(u)}n(u,v);u.conn.send(s||null)}return u}function l(){var t;try{if(t=q(k.transactionId)){k.transactionId++}}catch(s){}finally{return t}}function q(v){var s;try{s=new XMLHttpRequest()}catch(u){for(var t=Ext.isIE6?1:0;t<g.length;++t){try{s=new ActiveXObject(g[t]);break}catch(u){}}}finally{return{conn:s,tId:v}}}var k={request:function(s,u,v,w,A){if(A){var x=this,t=A.xmlData,y=A.jsonData,z;Ext.applyIf(x,A);if(t||y){z=x.headers;if(!z||!z[d]){j(d,t?"text/xml":"application/json")}w=t||(!Ext.isPrimitive(y)?Ext.encode(y):y)}}return i(s||A.method||"POST",u,v,w)},serializeForm:function(y){var x=y.elements||(document.forms[y]||Ext.getDom(y)).elements,s=false,w=encodeURIComponent,t,z="",v,u;Ext.each(x,function(A){t=A.name;v=A.type;if(!A.disabled&&t){if(/select-(one|multiple)/i.test(v)){Ext.each(A.options,function(B){if(B.selected){u=B.hasAttribute?B.hasAttribute("value"):B.getAttributeNode("value").specified;z+=String.format("{0}={1}&",w(t),w(u?B.value:B.text))}})}else{if(!(/file|undefined|reset|button/i.test(v))){if(!(/radio|checkbox/i.test(v)&&!A.checked)&&!(v=="submit"&&s)){z+=w(t)+"="+w(A.value)+"&";s=/submit/i.test(v)}}}}});return z.substr(0,z.length-1)},useDefaultHeader:true,defaultPostHeader:"application/x-www-form-urlencoded; charset=UTF-8",useDefaultXhrHeader:true,defaultXhrHeader:"XMLHttpRequest",poll:{},timeout:{},conn:{},pollInterval:50,transactionId:0,abort:function(v,x,s){var u=this,w=v.tId,t=false;if(u.isCallInProgress(v)){v.conn.abort();clearInterval(u.poll[w]);u.poll[w]=null;clearTimeout(k.timeout[w]);u.timeout[w]=null;f(v,x,(t=true),s)}return t},isCallInProgress:function(s){return s.conn&&!{0:true,4:true}[s.conn.readyState]}};return k}();(function(){var g=Ext.lib,i=/width|height|opacity|padding/i,f=/^((width|height)|(top|left))$/,d=/width|height|top$|bottom$|left$|right$/i,h=/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i,j=function(k){return typeof k!=="undefined"},e=function(){return new Date()};g.Anim={motion:function(n,l,o,p,k,m){return this.run(n,l,o,p,k,m,Ext.lib.Motion)},run:function(o,l,q,r,k,n,m){m=m||Ext.lib.AnimBase;if(typeof r=="string"){r=Ext.lib.Easing[r]}var p=new m(o,l,q,r);p.animateX(function(){if(Ext.isFunction(k)){k.call(n)}});return p}};g.AnimBase=function(l,k,m,n){if(l){this.init(l,k,m,n)}};g.AnimBase.prototype={doMethod:function(k,n,l){var m=this;return m.method(m.curFrame,n,l-n,m.totalFrames)},setAttr:function(k,m,l){if(i.test(k)&&m<0){m=0}Ext.fly(this.el,"_anim").setStyle(k,m+l)},getAttr:function(k){var m=Ext.fly(this.el),n=m.getStyle(k),l=f.exec(k)||[];if(n!=="auto"&&!h.test(n)){return parseFloat(n)}return(!!(l[2])||(m.getStyle("position")=="absolute"&&!!(l[3])))?m.dom["offset"+l[0].charAt(0).toUpperCase()+l[0].substr(1)]:0},getDefaultUnit:function(k){return d.test(k)?"px":""},animateX:function(n,k){var l=this,m=function(){l.onComplete.removeListener(m);if(Ext.isFunction(n)){n.call(k||l,l)}};l.onComplete.addListener(m,l);l.animate()},setRunAttr:function(p){var r=this,s=this.attributes[p],t=s.to,q=s.by,u=s.from,v=s.unit,l=(this.runAttrs[p]={}),m;if(!j(t)&&!j(q)){return false}var k=j(u)?u:r.getAttr(p);if(j(t)){m=t}else{if(j(q)){if(Ext.isArray(k)){m=[];for(var n=0,o=k.length;n<o;n++){m[n]=k[n]+q[n]}}else{m=k+q}}}Ext.apply(l,{start:k,end:m,unit:j(v)?v:r.getDefaultUnit(p)})},init:function(l,p,o,k){var r=this,n=0,s=g.AnimMgr;Ext.apply(r,{isAnimated:false,startTime:null,el:Ext.getDom(l),attributes:p||{},duration:o||1,method:k||g.Easing.easeNone,useSec:true,curFrame:0,totalFrames:s.fps,runAttrs:{},animate:function(){var u=this,v=u.duration;if(u.isAnimated){return false}u.curFrame=0;u.totalFrames=u.useSec?Math.ceil(s.fps*v):v;s.registerElement(u)},stop:function(u){var v=this;if(u){v.curFrame=v.totalFrames;v._onTween.fire()}s.stop(v)}});var t=function(){var v=this,u;v.onStart.fire();v.runAttrs={};for(u in this.attributes){this.setRunAttr(u)}v.isAnimated=true;v.startTime=e();n=0};var q=function(){var v=this;v.onTween.fire({duration:e()-v.startTime,curFrame:v.curFrame});var w=v.runAttrs;for(var u in w){this.setAttr(u,v.doMethod(u,w[u].start,w[u].end),w[u].unit)}++n};var m=function(){var u=this,w=(e()-u.startTime)/1000,v={duration:w,frames:n,fps:n/w};u.isAnimated=false;n=0;u.onComplete.fire(v)};r.onStart=new Ext.util.Event(r);r.onTween=new Ext.util.Event(r);r.onComplete=new Ext.util.Event(r);(r._onStart=new Ext.util.Event(r)).addListener(t);(r._onTween=new Ext.util.Event(r)).addListener(q);(r._onComplete=new Ext.util.Event(r)).addListener(m)}};Ext.lib.AnimMgr=new function(){var o=this,m=null,l=[],k=0;Ext.apply(o,{fps:1000,delay:1,registerElement:function(q){l.push(q);++k;q._onStart.fire();o.start()},unRegister:function(r,q){r._onComplete.fire();q=q||p(r);if(q!=-1){l.splice(q,1)}if(--k<=0){o.stop()}},start:function(){if(m===null){m=setInterval(o.run,o.delay)}},stop:function(s){if(!s){clearInterval(m);for(var r=0,q=l.length;r<q;++r){if(l[0].isAnimated){o.unRegister(l[0],0)}}l=[];m=null;k=0}else{o.unRegister(s)}},run:function(){var t,s,q,r;for(s=0,q=l.length;s<q;s++){r=l[s];if(r&&r.isAnimated){t=r.totalFrames;if(r.curFrame<t||t===null){++r.curFrame;if(r.useSec){n(r)}r._onTween.fire()}else{o.stop(r)}}}}});var p=function(s){var r,q;for(r=0,q=l.length;r<q;r++){if(l[r]===s){return r}}return -1};var n=function(r){var v=r.totalFrames,u=r.curFrame,t=r.duration,s=(u*t*1000/v),q=(e()-r.startTime),w=0;if(q<t*1000){w=Math.round((q/s-1)*u)}else{w=v-(u+1)}if(w>0&&isFinite(w)){if(r.curFrame+w>=v){w=v-(u+1)}r.curFrame+=w}}};g.Bezier=new function(){this.getPosition=function(p,o){var r=p.length,m=[],q=1-o,l,k;for(l=0;l<r;++l){m[l]=[p[l][0],p[l][1]]}for(k=1;k<r;++k){for(l=0;l<r-k;++l){m[l][0]=q*m[l][0]+o*m[parseInt(l+1,10)][0];m[l][1]=q*m[l][1]+o*m[parseInt(l+1,10)][1]}}return[m[0][0],m[0][1]]}};g.Easing={easeNone:function(l,k,n,m){return n*l/m+k},easeIn:function(l,k,n,m){return n*(l/=m)*l+k},easeOut:function(l,k,n,m){return -n*(l/=m)*(l-2)+k}};(function(){g.Motion=function(o,n,p,q){if(o){g.Motion.superclass.constructor.call(this,o,n,p,q)}};Ext.extend(g.Motion,Ext.lib.AnimBase);var m=g.Motion.superclass,l=/^points$/i;Ext.apply(g.Motion.prototype,{setAttr:function(n,r,q){var p=this,o=m.setAttr;if(l.test(n)){q=q||"px";o.call(p,"left",r[0],q);o.call(p,"top",r[1],q)}else{o.call(p,n,r,q)}},getAttr:function(n){var p=this,o=m.getAttr;return l.test(n)?[o.call(p,"left"),o.call(p,"top")]:o.call(p,n)},doMethod:function(n,q,o){var p=this;return l.test(n)?g.Bezier.getPosition(p.runAttrs[n],p.method(p.curFrame,0,100,p.totalFrames)/100):m.doMethod.call(p,n,q,o)},setRunAttr:function(u){if(l.test(u)){var w=this,p=this.el,z=this.attributes.points,s=z.control||[],x=z.from,y=z.to,v=z.by,A=g.Dom,o,r,q,t,n;if(s.length>0&&!Ext.isArray(s[0])){s=[s]}else{}Ext.fly(p,"_anim").position();A.setXY(p,j(x)?x:A.getXY(p));o=w.getAttr("points");if(j(y)){q=k.call(w,y,o);for(r=0,t=s.length;r<t;++r){s[r]=k.call(w,s[r],o)}}else{if(j(v)){q=[o[0]+v[0],o[1]+v[1]];for(r=0,t=s.length;r<t;++r){s[r]=[o[0]+s[r][0],o[1]+s[r][1]]}}}n=this.runAttrs[u]=[o];if(s.length>0){n=n.concat(s)}n[n.length]=q}else{m.setRunAttr.call(this,u)}}});var k=function(n,p){var o=g.Dom.getXY(this.el);return[n[0]-o[0]+p[0],n[1]-o[1]+p[1]]}})()})();(function(){var d=Math.abs,i=Math.PI,h=Math.asin,g=Math.pow,e=Math.sin,f=Ext.lib;Ext.apply(f.Easing,{easeBoth:function(k,j,m,l){return((k/=l/2)<1)?m/2*k*k+j:-m/2*((--k)*(k-2)-1)+j},easeInStrong:function(k,j,m,l){return m*(k/=l)*k*k*k+j},easeOutStrong:function(k,j,m,l){return -m*((k=k/l-1)*k*k*k-1)+j},easeBothStrong:function(k,j,m,l){return((k/=l/2)<1)?m/2*k*k*k*k+j:-m/2*((k-=2)*k*k*k-2)+j},elasticIn:function(l,j,q,o,k,n){if(l==0||(l/=o)==1){return l==0?j:j+q}n=n||(o*0.3);var m;if(k>=d(q)){m=n/(2*i)*h(q/k)}else{k=q;m=n/4}return -(k*g(2,10*(l-=1))*e((l*o-m)*(2*i)/n))+j},elasticOut:function(l,j,q,o,k,n){if(l==0||(l/=o)==1){return l==0?j:j+q}n=n||(o*0.3);var m;if(k>=d(q)){m=n/(2*i)*h(q/k)}else{k=q;m=n/4}return k*g(2,-10*l)*e((l*o-m)*(2*i)/n)+q+j},elasticBoth:function(l,j,q,o,k,n){if(l==0||(l/=o/2)==2){return l==0?j:j+q}n=n||(o*(0.3*1.5));var m;if(k>=d(q)){m=n/(2*i)*h(q/k)}else{k=q;m=n/4}return l<1?-0.5*(k*g(2,10*(l-=1))*e((l*o-m)*(2*i)/n))+j:k*g(2,-10*(l-=1))*e((l*o-m)*(2*i)/n)*0.5+q+j},backIn:function(k,j,n,m,l){l=l||1.70158;return n*(k/=m)*k*((l+1)*k-l)+j},backOut:function(k,j,n,m,l){if(!l){l=1.70158}return n*((k=k/m-1)*k*((l+1)*k+l)+1)+j},backBoth:function(k,j,n,m,l){l=l||1.70158;return((k/=m/2)<1)?n/2*(k*k*(((l*=(1.525))+1)*k-l))+j:n/2*((k-=2)*k*(((l*=(1.525))+1)*k+l)+2)+j},bounceIn:function(k,j,m,l){return m-f.Easing.bounceOut(l-k,0,m,l)+j},bounceOut:function(k,j,m,l){if((k/=l)<(1/2.75)){return m*(7.5625*k*k)+j}else{if(k<(2/2.75)){return m*(7.5625*(k-=(1.5/2.75))*k+0.75)+j}else{if(k<(2.5/2.75)){return m*(7.5625*(k-=(2.25/2.75))*k+0.9375)+j}}}return m*(7.5625*(k-=(2.625/2.75))*k+0.984375)+j},bounceBoth:function(k,j,m,l){return(k<l/2)?f.Easing.bounceIn(k*2,0,m,l)*0.5+j:f.Easing.bounceOut(k*2-l,0,m,l)*0.5+m*0.5+j}})})();(function(){var h=Ext.lib;h.Anim.color=function(p,n,q,r,m,o){return h.Anim.run(p,n,q,r,m,o,h.ColorAnim)};h.ColorAnim=function(n,m,o,p){h.ColorAnim.superclass.constructor.call(this,n,m,o,p)};Ext.extend(h.ColorAnim,h.AnimBase);var j=h.ColorAnim.superclass,i=/color$/i,f=/^transparent|rgba\(0, 0, 0, 0\)$/,l=/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,d=/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,e=/^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i,g=function(m){return typeof m!=="undefined"};function k(n){var p=parseInt,o,m=null,q;if(n.length==3){return n}Ext.each([d,l,e],function(s,r){o=(r%2==0)?16:10;q=s.exec(n);if(q&&q.length==4){m=[p(q[1],o),p(q[2],o),p(q[3],o)];return false}});return m}Ext.apply(h.ColorAnim.prototype,{getAttr:function(m){var o=this,n=o.el,p;if(i.test(m)){while(n&&f.test(p=Ext.fly(n).getStyle(m))){n=n.parentNode;p="fff"}}else{p=j.getAttr.call(o,m)}return p},doMethod:function(s,m,o){var t=this,n,q=Math.floor,p,r,u;if(i.test(s)){n=[];o=o||[];for(p=0,r=m.length;p<r;p++){u=m[p];n[p]=j.doMethod.call(t,s,u,o[p])}n="rgb("+q(n[0])+","+q(n[1])+","+q(n[2])+")"}else{n=j.doMethod.call(t,s,m,o)}return n},setRunAttr:function(r){var t=this,u=t.attributes[r],v=u.to,s=u.by,n;j.setRunAttr.call(t,r);n=t.runAttrs[r];if(i.test(r)){var m=k(n.start),o=k(n.end);if(!g(v)&&g(s)){o=k(s);for(var p=0,q=m.length;p<q;p++){o[p]=m[p]+o[p]}}n.start=m;n.end=o}}})})();(function(){var d=Ext.lib;d.Anim.scroll=function(j,h,k,l,g,i){return d.Anim.run(j,h,k,l,g,i,d.Scroll)};d.Scroll=function(h,g,i,j){if(h){d.Scroll.superclass.constructor.call(this,h,g,i,j)}};Ext.extend(d.Scroll,d.ColorAnim);var f=d.Scroll.superclass,e="scroll";Ext.apply(d.Scroll.prototype,{doMethod:function(g,m,h){var k,j=this,l=j.curFrame,i=j.totalFrames;if(g==e){k=[j.method(l,m[0],h[0]-m[0],i),j.method(l,m[1],h[1]-m[1],i)]}else{k=f.doMethod.call(j,g,m,h)}return k},getAttr:function(g){var h=this;if(g==e){return[h.el.scrollLeft,h.el.scrollTop]}else{return f.getAttr.call(h,g)}},setAttr:function(g,j,i){var h=this;if(g==e){h.el.scrollLeft=j[0];h.el.scrollTop=j[1]}else{f.setAttr.call(h,g,j,i)}}})})();if(Ext.isIE9m){function a(){var d=Function.prototype;delete d.createSequence;delete d.defer;delete d.createDelegate;delete d.createCallback;delete d.createInterceptor;window.detachEvent("onunload",a)}window.attachEvent("onunload",a)}})(); \ No newline at end of file
diff --git a/deluge/ui/web/js/extjs/ext-extensions-debug.js b/deluge/ui/web/js/extjs/ext-extensions-debug.js
new file mode 100644
index 0000000..a5b4a60
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions-debug.js
@@ -0,0 +1,2931 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+Ext.ns('Ext.ux.form');
+
+/**
+ * @class Ext.ux.form.FileUploadField
+ * @extends Ext.form.TextField
+ * Creates a file upload field.
+ * @xtype fileuploadfield
+ */
+Ext.ux.form.FileUploadField = Ext.extend(Ext.form.TextField, {
+ /**
+ * @cfg {String} buttonText The button text to display on the upload button (defaults to
+ * 'Browse...'). Note that if you supply a value for {@link #buttonCfg}, the buttonCfg.text
+ * value will be used instead if available.
+ */
+ buttonText: 'Browse...',
+ /**
+ * @cfg {Boolean} buttonOnly True to display the file upload field as a button with no visible
+ * text field (defaults to false). If true, all inherited TextField members will still be available.
+ */
+ buttonOnly: false,
+ /**
+ * @cfg {Number} buttonOffset The number of pixels of space reserved between the button and the text field
+ * (defaults to 3). Note that this only applies if {@link #buttonOnly} = false.
+ */
+ buttonOffset: 3,
+
+ /**
+ * @cfg {Boolean} multiple True to select more than one file. (defaults to false).
+ * Note that this only applies if the HTML doc is using HTML5.
+ */
+ multiple: false,
+
+ /**
+ * @cfg {Object} buttonCfg A standard {@link Ext.Button} config object.
+ */
+
+ // private
+ readOnly: true,
+
+ /**
+ * @hide
+ * @method autoSize
+ */
+ autoSize: Ext.emptyFn,
+
+ // private
+ initComponent: function() {
+ Ext.ux.form.FileUploadField.superclass.initComponent.call(this);
+
+ this.addEvents(
+ /**
+ * @event fileselected
+ * Fires when the underlying file input field's value has changed from the user
+ * selecting a new file from the system file selection dialog.
+ * @param {Ext.ux.form.FileUploadField} this
+ * @param {String} value The file value returned by the underlying file input field
+ */
+ 'fileselected'
+ );
+ },
+
+ // private
+ onRender: function(ct, position) {
+ Ext.ux.form.FileUploadField.superclass.onRender.call(
+ this,
+ ct,
+ position
+ );
+
+ this.wrap = this.el.wrap({ cls: 'x-form-field-wrap x-form-file-wrap' });
+ this.el.addClass('x-form-file-text');
+ this.el.dom.removeAttribute('name');
+ this.createFileInput();
+
+ var btnCfg = Ext.applyIf(this.buttonCfg || {}, {
+ text: this.buttonText,
+ });
+ this.button = new Ext.Button(
+ Ext.apply(btnCfg, {
+ renderTo: this.wrap,
+ cls: 'x-form-file-btn' + (btnCfg.iconCls ? ' x-btn-icon' : ''),
+ })
+ );
+
+ if (this.buttonOnly) {
+ this.el.hide();
+ this.wrap.setWidth(this.button.getEl().getWidth());
+ }
+
+ this.bindListeners();
+ this.resizeEl = this.positionEl = this.wrap;
+ },
+
+ bindListeners: function() {
+ this.fileInput.on({
+ scope: this,
+ mouseenter: function() {
+ this.button.addClass(['x-btn-over', 'x-btn-focus']);
+ },
+ mouseleave: function() {
+ this.button.removeClass([
+ 'x-btn-over',
+ 'x-btn-focus',
+ 'x-btn-click',
+ ]);
+ },
+ mousedown: function() {
+ this.button.addClass('x-btn-click');
+ },
+ mouseup: function() {
+ this.button.removeClass([
+ 'x-btn-over',
+ 'x-btn-focus',
+ 'x-btn-click',
+ ]);
+ },
+ change: function() {
+ var value = this.fileInput.dom.files;
+ // Fallback to value.
+ if (!value) value = this.fileInput.dom.value;
+ this.setValue(value);
+ this.fireEvent('fileselected', this, value);
+ },
+ });
+ },
+
+ createFileInput: function() {
+ this.fileInput = this.wrap.createChild({
+ id: this.getFileInputId(),
+ name: this.name || this.getId(),
+ cls: 'x-form-file',
+ tag: 'input',
+ type: 'file',
+ size: 1,
+ });
+ this.fileInput.dom.multiple = this.multiple;
+ },
+
+ reset: function() {
+ if (this.rendered) {
+ this.fileInput.remove();
+ this.createFileInput();
+ this.bindListeners();
+ }
+ Ext.ux.form.FileUploadField.superclass.reset.call(this);
+ },
+
+ // private
+ getFileInputId: function() {
+ return this.id + '-file';
+ },
+
+ // private
+ onResize: function(w, h) {
+ Ext.ux.form.FileUploadField.superclass.onResize.call(this, w, h);
+
+ this.wrap.setWidth(w);
+
+ if (!this.buttonOnly) {
+ var w =
+ this.wrap.getWidth() -
+ this.button.getEl().getWidth() -
+ this.buttonOffset;
+ this.el.setWidth(w);
+ }
+ },
+
+ // private
+ onDestroy: function() {
+ Ext.ux.form.FileUploadField.superclass.onDestroy.call(this);
+ Ext.destroy(this.fileInput, this.button, this.wrap);
+ },
+
+ onDisable: function() {
+ Ext.ux.form.FileUploadField.superclass.onDisable.call(this);
+ this.doDisable(true);
+ },
+
+ onEnable: function() {
+ Ext.ux.form.FileUploadField.superclass.onEnable.call(this);
+ this.doDisable(false);
+ },
+
+ // private
+ doDisable: function(disabled) {
+ this.fileInput.dom.disabled = disabled;
+ this.button.setDisabled(disabled);
+ },
+
+ // private
+ preFocus: Ext.emptyFn,
+
+ // private
+ alignErrorIcon: function() {
+ this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]);
+ },
+});
+
+Ext.reg('fileuploadfield', Ext.ux.form.FileUploadField);
+
+// backwards compat
+Ext.form.FileUploadField = Ext.ux.form.FileUploadField;
+/**
+ * Ext.ux.form.RadioGroup.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+// Allow radiogroups to be treated as a single form element.
+Ext.override(Ext.form.RadioGroup, {
+ afterRender: function() {
+ this.items.each(function(i) {
+ this.relayEvents(i, ['check']);
+ }, this);
+ if (this.lazyValue) {
+ this.setValue(this.value);
+ delete this.value;
+ delete this.lazyValue;
+ }
+ Ext.form.RadioGroup.superclass.afterRender.call(this);
+ },
+
+ getName: function() {
+ return this.items.first().getName();
+ },
+
+ getValue: function() {
+ return this.items.first().getGroupValue();
+ },
+
+ setValue: function(v) {
+ if (!this.items.each) {
+ this.value = v;
+ this.lazyValue = true;
+ return;
+ }
+ this.items.each(function(item) {
+ if (item.rendered) {
+ var checked = item.el.getValue() == String(v);
+ item.el.dom.checked = checked;
+ item.el.dom.defaultChecked = checked;
+ item.wrap[checked ? 'addClass' : 'removeClass'](
+ item.checkedCls
+ );
+ }
+ });
+ },
+});
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+Ext.ns('Ext.ux.form');
+
+/**
+ * @class Ext.ux.form.SpinnerField
+ * @extends Ext.form.NumberField
+ * Creates a field utilizing Ext.ux.Spinner
+ * @xtype spinnerfield
+ */
+Ext.ux.form.SpinnerField = Ext.extend(Ext.form.NumberField, {
+ actionMode: 'wrap',
+ deferHeight: true,
+ autoSize: Ext.emptyFn,
+ onBlur: Ext.emptyFn,
+ adjustSize: Ext.BoxComponent.prototype.adjustSize,
+
+ constructor: function(config) {
+ var spinnerConfig = Ext.copyTo(
+ {},
+ config,
+ 'incrementValue,alternateIncrementValue,accelerate,defaultValue,triggerClass,splitterClass'
+ );
+
+ var spl = (this.spinner = new Ext.ux.Spinner(spinnerConfig));
+
+ var plugins = config.plugins
+ ? Ext.isArray(config.plugins)
+ ? config.plugins.push(spl)
+ : [config.plugins, spl]
+ : spl;
+
+ Ext.ux.form.SpinnerField.superclass.constructor.call(
+ this,
+ Ext.apply(config, { plugins: plugins })
+ );
+ },
+
+ // private
+ getResizeEl: function() {
+ return this.wrap;
+ },
+
+ // private
+ getPositionEl: function() {
+ return this.wrap;
+ },
+
+ // private
+ alignErrorIcon: function() {
+ if (this.wrap) {
+ this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]);
+ }
+ },
+
+ validateBlur: function() {
+ return true;
+ },
+});
+
+Ext.reg('spinnerfield', Ext.ux.form.SpinnerField);
+
+//backwards compat
+Ext.form.SpinnerField = Ext.ux.form.SpinnerField;
+/**
+ * Ext.ux.form.SpinnerField.js
+ *
+ * Copyright (c) Damien Churchill 2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.override(Ext.ux.form.SpinnerField, {
+ onBlur: Ext.form.Field.prototype.onBlur,
+});
+/**
+ * Ext.ux.form.SpinnerGroup.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Ext.ux.form');
+
+/**
+ *
+ */
+Ext.ux.form.SpinnerGroup = Ext.extend(Ext.form.CheckboxGroup, {
+ // private
+ defaultType: 'spinnerfield',
+ anchor: '98%',
+
+ // private
+ groupCls: 'x-form-spinner-group',
+
+ colCfg: {},
+
+ // private
+ onRender: function(ct, position) {
+ if (!this.el) {
+ var panelCfg = {
+ cls: this.groupCls,
+ layout: 'column',
+ border: false,
+ renderTo: ct,
+ };
+ var colCfg = Ext.apply(
+ {
+ defaultType: this.defaultType,
+ layout: 'form',
+ border: false,
+ labelWidth: 60,
+ defaults: {
+ hideLabel: true,
+ anchor: '60%',
+ },
+ },
+ this.colCfg
+ );
+
+ if (this.items[0].items) {
+ // The container has standard ColumnLayout configs, so pass them in directly
+
+ Ext.apply(panelCfg, {
+ layoutConfig: { columns: this.items.length },
+ defaults: this.defaults,
+ items: this.items,
+ });
+ for (var i = 0, len = this.items.length; i < len; i++) {
+ Ext.applyIf(this.items[i], colCfg);
+ }
+ } else {
+ // The container has field item configs, so we have to generate the column
+ // panels first then move the items into the columns as needed.
+
+ var numCols,
+ cols = [];
+
+ if (typeof this.columns == 'string') {
+ // 'auto' so create a col per item
+ this.columns = this.items.length;
+ }
+ if (!Ext.isArray(this.columns)) {
+ var cs = [];
+ for (var i = 0; i < this.columns; i++) {
+ cs.push((100 / this.columns) * 0.01); // distribute by even %
+ }
+ this.columns = cs;
+ }
+
+ numCols = this.columns.length;
+
+ // Generate the column configs with the correct width setting
+ for (var i = 0; i < numCols; i++) {
+ var cc = Ext.apply({ items: [] }, colCfg);
+ cc[
+ this.columns[i] <= 1 ? 'columnWidth' : 'width'
+ ] = this.columns[i];
+ if (this.defaults) {
+ cc.defaults = Ext.apply(
+ cc.defaults || {},
+ this.defaults
+ );
+ }
+ cols.push(cc);
+ }
+
+ // Distribute the original items into the columns
+ if (this.vertical) {
+ var rows = Math.ceil(this.items.length / numCols),
+ ri = 0;
+ for (var i = 0, len = this.items.length; i < len; i++) {
+ if (i > 0 && i % rows == 0) {
+ ri++;
+ }
+ if (this.items[i].fieldLabel) {
+ this.items[i].hideLabel = false;
+ }
+ cols[ri].items.push(this.items[i]);
+ }
+ } else {
+ for (var i = 0, len = this.items.length; i < len; i++) {
+ var ci = i % numCols;
+ if (this.items[i].fieldLabel) {
+ this.items[i].hideLabel = false;
+ }
+ cols[ci].items.push(this.items[i]);
+ }
+ }
+
+ Ext.apply(panelCfg, {
+ layoutConfig: { columns: numCols },
+ items: cols,
+ });
+ }
+
+ this.panel = new Ext.Panel(panelCfg);
+ this.el = this.panel.getEl();
+
+ if (this.forId && this.itemCls) {
+ var l = this.el.up(this.itemCls).child('label', true);
+ if (l) {
+ l.setAttribute('htmlFor', this.forId);
+ }
+ }
+
+ var fields = this.panel.findBy(function(c) {
+ return c.isFormField;
+ }, this);
+
+ this.items = new Ext.util.MixedCollection();
+ this.items.addAll(fields);
+
+ this.items.each(function(field) {
+ field.on('spin', this.onFieldChange, this);
+ field.on('change', this.onFieldChange, this);
+ }, this);
+
+ if (this.lazyValueSet) {
+ this.setValue(this.value);
+ delete this.value;
+ delete this.lazyValueSet;
+ }
+
+ if (this.lazyRawValueSet) {
+ this.setRawValue(this.rawValue);
+ delete this.rawValue;
+ delete this.lazyRawValueSet;
+ }
+ }
+
+ Ext.ux.form.SpinnerGroup.superclass.onRender.call(this, ct, position);
+ },
+
+ onFieldChange: function(spinner) {
+ this.fireEvent('change', this, this.getValue());
+ },
+
+ initValue: Ext.emptyFn,
+
+ getValue: function() {
+ var value = [this.items.getCount()];
+ this.items.each(function(item, i) {
+ value[i] = Number(item.getValue());
+ });
+ return value;
+ },
+
+ getRawValue: function() {
+ var value = [this.items.getCount()];
+ this.items.each(function(item, i) {
+ value[i] = Number(item.getRawValue());
+ });
+ return value;
+ },
+
+ setValue: function(value) {
+ if (!this.rendered) {
+ this.value = value;
+ this.lazyValueSet = true;
+ } else {
+ this.items.each(function(item, i) {
+ item.setValue(value[i]);
+ });
+ }
+ },
+
+ setRawValue: function(value) {
+ if (!this.rendered) {
+ this.rawValue = value;
+ this.lazyRawValueSet = true;
+ } else {
+ this.items.each(function(item, i) {
+ item.setRawValue(value[i]);
+ });
+ }
+ },
+});
+Ext.reg('spinnergroup', Ext.ux.form.SpinnerGroup);
+/**
+ * Ext.ux.form.ToggleField.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Ext.ux.form');
+
+/**
+ * Ext.ux.form.ToggleField class
+ *
+ * @author Damien Churchill
+ * @version v0.1
+ *
+ * @class Ext.ux.form.ToggleField
+ * @extends Ext.form.TriggerField
+ */
+Ext.ux.form.ToggleField = Ext.extend(Ext.form.Field, {
+ cls: 'x-toggle-field',
+
+ initComponent: function() {
+ Ext.ux.form.ToggleField.superclass.initComponent.call(this);
+
+ this.toggle = new Ext.form.Checkbox();
+ this.toggle.on('check', this.onToggleCheck, this);
+
+ this.input = new Ext.form.TextField({
+ disabled: true,
+ });
+ },
+
+ onRender: function(ct, position) {
+ if (!this.el) {
+ this.panel = new Ext.Panel({
+ cls: this.groupCls,
+ layout: 'table',
+ layoutConfig: {
+ columns: 2,
+ },
+ border: false,
+ renderTo: ct,
+ });
+ this.panel.ownerCt = this;
+ this.el = this.panel.getEl();
+
+ this.panel.add(this.toggle);
+ this.panel.add(this.input);
+ this.panel.doLayout();
+
+ this.toggle
+ .getEl()
+ .parent()
+ .setStyle('padding-right', '10px');
+ }
+ Ext.ux.form.ToggleField.superclass.onRender.call(this, ct, position);
+ },
+
+ // private
+ onResize: function(w, h) {
+ this.panel.setSize(w, h);
+ this.panel.doLayout();
+
+ // we substract 10 for the padding :-)
+ var inputWidth = w - this.toggle.getSize().width - 25;
+ this.input.setSize(inputWidth, h);
+ },
+
+ onToggleCheck: function(toggle, checked) {
+ this.input.setDisabled(!checked);
+ },
+});
+Ext.reg('togglefield', Ext.ux.form.ToggleField);
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+Ext.ns('Ext.ux.grid');
+
+/**
+ * @class Ext.ux.grid.BufferView
+ * @extends Ext.grid.GridView
+ * A custom GridView which renders rows on an as-needed basis.
+ */
+Ext.ux.grid.BufferView = Ext.extend(Ext.grid.GridView, {
+ /**
+ * @cfg {Number} rowHeight
+ * The height of a row in the grid.
+ */
+ rowHeight: 19,
+
+ /**
+ * @cfg {Number} borderHeight
+ * The combined height of border-top and border-bottom of a row.
+ */
+ borderHeight: 2,
+
+ /**
+ * @cfg {Boolean/Number} scrollDelay
+ * The number of milliseconds before rendering rows out of the visible
+ * viewing area. Defaults to 100. Rows will render immediately with a config
+ * of false.
+ */
+ scrollDelay: 100,
+
+ /**
+ * @cfg {Number} cacheSize
+ * The number of rows to look forward and backwards from the currently viewable
+ * area. The cache applies only to rows that have been rendered already.
+ */
+ cacheSize: 20,
+
+ /**
+ * @cfg {Number} cleanDelay
+ * The number of milliseconds to buffer cleaning of extra rows not in the
+ * cache.
+ */
+ cleanDelay: 500,
+
+ initTemplates: function() {
+ Ext.ux.grid.BufferView.superclass.initTemplates.call(this);
+ var ts = this.templates;
+ // empty div to act as a place holder for a row
+ ts.rowHolder = new Ext.Template(
+ '<div class="x-grid3-row {alt}" style="{tstyle}"></div>'
+ );
+ ts.rowHolder.disableFormats = true;
+ ts.rowHolder.compile();
+
+ ts.rowBody = new Ext.Template(
+ '<table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',
+ '<tbody><tr>{cells}</tr>',
+ this.enableRowBody
+ ? '<tr class="x-grid3-row-body-tr" style="{bodyStyle}"><td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on"><div class="x-grid3-row-body">{body}</div></td></tr>'
+ : '',
+ '</tbody></table>'
+ );
+ ts.rowBody.disableFormats = true;
+ ts.rowBody.compile();
+ },
+
+ getStyleRowHeight: function() {
+ return Ext.isBorderBox
+ ? this.rowHeight + this.borderHeight
+ : this.rowHeight;
+ },
+
+ getCalculatedRowHeight: function() {
+ return this.rowHeight + this.borderHeight;
+ },
+
+ getVisibleRowCount: function() {
+ var rh = this.getCalculatedRowHeight(),
+ visibleHeight = this.scroller.dom.clientHeight;
+ return visibleHeight < 1 ? 0 : Math.ceil(visibleHeight / rh);
+ },
+
+ getVisibleRows: function() {
+ var count = this.getVisibleRowCount(),
+ sc = this.scroller.dom.scrollTop,
+ start =
+ sc === 0
+ ? 0
+ : Math.floor(sc / this.getCalculatedRowHeight()) - 1;
+ return {
+ first: Math.max(start, 0),
+ last: Math.min(start + count + 2, this.ds.getCount() - 1),
+ };
+ },
+
+ doRender: function(cs, rs, ds, startRow, colCount, stripe, onlyBody) {
+ var ts = this.templates,
+ ct = ts.cell,
+ rt = ts.row,
+ rb = ts.rowBody,
+ last = colCount - 1,
+ rh = this.getStyleRowHeight(),
+ vr = this.getVisibleRows(),
+ tstyle = 'width:' + this.getTotalWidth() + ';height:' + rh + 'px;',
+ // buffers
+ buf = [],
+ cb,
+ c,
+ p = {},
+ rp = { tstyle: tstyle },
+ r;
+ for (var j = 0, len = rs.length; j < len; j++) {
+ r = rs[j];
+ cb = [];
+ var rowIndex = j + startRow,
+ visible = rowIndex >= vr.first && rowIndex <= vr.last;
+ if (visible) {
+ for (var i = 0; i < colCount; i++) {
+ c = cs[i];
+ p.id = c.id;
+ p.css =
+ i === 0
+ ? 'x-grid3-cell-first '
+ : i == last
+ ? 'x-grid3-cell-last '
+ : '';
+ p.attr = p.cellAttr = '';
+ p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds);
+ p.style = c.style;
+ if (p.value === undefined || p.value === '') {
+ p.value = '&#160;';
+ }
+ if (r.dirty && typeof r.modified[c.name] !== 'undefined') {
+ p.css += ' x-grid3-dirty-cell';
+ }
+ cb[cb.length] = ct.apply(p);
+ }
+ }
+ var alt = [];
+ if (stripe && (rowIndex + 1) % 2 === 0) {
+ alt[0] = 'x-grid3-row-alt';
+ }
+ if (r.dirty) {
+ alt[1] = ' x-grid3-dirty-row';
+ }
+ rp.cols = colCount;
+ if (this.getRowClass) {
+ alt[2] = this.getRowClass(r, rowIndex, rp, ds);
+ }
+ rp.alt = alt.join(' ');
+ rp.cells = cb.join('');
+ buf[buf.length] = !visible
+ ? ts.rowHolder.apply(rp)
+ : onlyBody
+ ? rb.apply(rp)
+ : rt.apply(rp);
+ }
+ return buf.join('');
+ },
+
+ isRowRendered: function(index) {
+ var row = this.getRow(index);
+ return row && row.childNodes.length > 0;
+ },
+
+ syncScroll: function() {
+ Ext.ux.grid.BufferView.superclass.syncScroll.apply(this, arguments);
+ this.update();
+ },
+
+ // a (optionally) buffered method to update contents of gridview
+ update: function() {
+ if (this.scrollDelay) {
+ if (!this.renderTask) {
+ this.renderTask = new Ext.util.DelayedTask(this.doUpdate, this);
+ }
+ this.renderTask.delay(this.scrollDelay);
+ } else {
+ this.doUpdate();
+ }
+ },
+
+ onRemove: function(ds, record, index, isUpdate) {
+ Ext.ux.grid.BufferView.superclass.onRemove.apply(this, arguments);
+ if (isUpdate !== true) {
+ this.update();
+ }
+ },
+
+ doUpdate: function() {
+ if (this.getVisibleRowCount() > 0) {
+ var g = this.grid,
+ cm = g.colModel,
+ ds = g.store,
+ cs = this.getColumnData(),
+ vr = this.getVisibleRows(),
+ row;
+ for (var i = vr.first; i <= vr.last; i++) {
+ // if row is NOT rendered and is visible, render it
+ if (!this.isRowRendered(i) && (row = this.getRow(i))) {
+ var html = this.doRender(
+ cs,
+ [ds.getAt(i)],
+ ds,
+ i,
+ cm.getColumnCount(),
+ g.stripeRows,
+ true
+ );
+ row.innerHTML = html;
+ }
+ }
+ this.clean();
+ }
+ },
+
+ // a buffered method to clean rows
+ clean: function() {
+ if (!this.cleanTask) {
+ this.cleanTask = new Ext.util.DelayedTask(this.doClean, this);
+ }
+ this.cleanTask.delay(this.cleanDelay);
+ },
+
+ doClean: function() {
+ if (this.getVisibleRowCount() > 0) {
+ var vr = this.getVisibleRows();
+ vr.first -= this.cacheSize;
+ vr.last += this.cacheSize;
+
+ var i = 0,
+ rows = this.getRows();
+ // if first is less than 0, all rows have been rendered
+ // so lets clean the end...
+ if (vr.first <= 0) {
+ i = vr.last + 1;
+ }
+ for (var len = this.ds.getCount(); i < len; i++) {
+ // if current row is outside of first and last and
+ // has content, update the innerHTML to nothing
+ if ((i < vr.first || i > vr.last) && rows[i].innerHTML) {
+ rows[i].innerHTML = '';
+ }
+ }
+ }
+ },
+
+ removeTask: function(name) {
+ var task = this[name];
+ if (task && task.cancel) {
+ task.cancel();
+ this[name] = null;
+ }
+ },
+
+ destroy: function() {
+ this.removeTask('cleanTask');
+ this.removeTask('renderTask');
+ Ext.ux.grid.BufferView.superclass.destroy.call(this);
+ },
+
+ layout: function() {
+ Ext.ux.grid.BufferView.superclass.layout.call(this);
+ this.update();
+ },
+});
+/**
+ * Ext.ux.layout.FormLayoutFix.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+// Taken from http://extjs.com/forum/showthread.php?t=75273
+// remove spaces for hidden elements and make show(), hide(), enable() and disable() act on
+// the label. don't use hideLabel with this.
+Ext.override(Ext.layout.FormLayout, {
+ renderItem: function(c, position, target) {
+ if (
+ c &&
+ !c.rendered &&
+ (c.isFormField || c.fieldLabel) &&
+ c.inputType != 'hidden'
+ ) {
+ var args = this.getTemplateArgs(c);
+ if (typeof position == 'number') {
+ position = target.dom.childNodes[position] || null;
+ }
+ if (position) {
+ c.formItem = this.fieldTpl.insertBefore(position, args, true);
+ } else {
+ c.formItem = this.fieldTpl.append(target, args, true);
+ }
+ c.actionMode = 'formItem';
+ c.render('x-form-el-' + c.id);
+ c.container = c.formItem;
+ c.actionMode = 'container';
+ } else {
+ Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments);
+ }
+ },
+});
+/**
+ * Ext.ux.tree.MultiSelectionModelFix.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * This enhances the MSM to allow for shift selecting in tree grids etc.
+ * @author Damien Churchill <damoxc@gmail.com>
+ */
+Ext.override(Ext.tree.MultiSelectionModel, {
+ onNodeClick: function(node, e) {
+ if (e.ctrlKey && this.isSelected(node)) {
+ this.unselect(node);
+ } else if (e.shiftKey && !this.isSelected(node)) {
+ var parentNode = node.parentNode;
+ // We can only shift select files in the same node
+ if (this.lastSelNode.parentNode.id != parentNode.id) return;
+
+ // Get the node indexes
+ var fi = parentNode.indexOf(node),
+ li = parentNode.indexOf(this.lastSelNode);
+
+ // Select the last clicked node and wipe old selections
+ this.select(this.lastSelNode, e, false, true);
+
+ // Swap the values if required
+ if (fi > li) {
+ (fi = fi + li), (li = fi - li), (fi = fi - li);
+ }
+
+ // Select all the nodes
+ parentNode.eachChild(function(n) {
+ var i = parentNode.indexOf(n);
+ if (fi < i && i < li) {
+ this.select(n, e, true, true);
+ }
+ }, this);
+
+ // Select the clicked node
+ this.select(node, e, true);
+ } else {
+ this.select(node, e, e.ctrlKey);
+ }
+ },
+
+ select: function(node, e, keepExisting, suppressEvent) {
+ if (keepExisting !== true) {
+ this.clearSelections(true);
+ }
+ if (this.isSelected(node)) {
+ this.lastSelNode = node;
+ return node;
+ }
+ this.selNodes.push(node);
+ this.selMap[node.id] = node;
+ this.lastSelNode = node;
+ node.ui.onSelectedChange(true);
+ if (suppressEvent !== true) {
+ this.fireEvent('selectionchange', this, this.selNodes);
+ }
+ return node;
+ },
+});
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+Ext.ns('Ext.ux.tree');
+
+/**
+ * @class Ext.ux.tree.TreeGrid
+ * @extends Ext.tree.TreePanel
+ *
+ * @xtype treegrid
+ */
+Ext.ux.tree.TreeGrid = Ext.extend(Ext.tree.TreePanel, {
+ rootVisible: false,
+ useArrows: true,
+ lines: false,
+ borderWidth: Ext.isBorderBox ? 0 : 2, // the combined left/right border for each cell
+ cls: 'x-treegrid',
+
+ columnResize: true,
+ enableSort: true,
+ reserveScrollOffset: true,
+ enableHdMenu: true,
+
+ columnsText: 'Columns',
+
+ initComponent: function() {
+ if (!this.root) {
+ this.root = new Ext.tree.AsyncTreeNode({ text: 'Root' });
+ }
+
+ // initialize the loader
+ var l = this.loader;
+ if (!l) {
+ l = new Ext.ux.tree.TreeGridLoader({
+ dataUrl: this.dataUrl,
+ requestMethod: this.requestMethod,
+ store: this.store,
+ });
+ } else if (Ext.isObject(l) && !l.load) {
+ l = new Ext.ux.tree.TreeGridLoader(l);
+ }
+ this.loader = l;
+
+ Ext.ux.tree.TreeGrid.superclass.initComponent.call(this);
+
+ this.initColumns();
+
+ if (this.enableSort) {
+ this.treeGridSorter = new Ext.ux.tree.TreeGridSorter(
+ this,
+ this.enableSort
+ );
+ }
+
+ if (this.columnResize) {
+ this.colResizer = new Ext.tree.ColumnResizer(this.columnResize);
+ this.colResizer.init(this);
+ }
+
+ var c = this.columns;
+ if (!this.internalTpl) {
+ this.internalTpl = new Ext.XTemplate(
+ '<div class="x-grid3-header">',
+ '<div class="x-treegrid-header-inner">',
+ '<div class="x-grid3-header-offset">',
+ '<table style="table-layout: fixed;" cellspacing="0" cellpadding="0" border="0"><colgroup><tpl for="columns"><col /></tpl></colgroup>',
+ '<thead><tr class="x-grid3-hd-row">',
+ '<tpl for="columns">',
+ '<td class="x-grid3-hd x-grid3-cell x-treegrid-hd" style="text-align: {align};" id="',
+ this.id,
+ '-xlhd-{#}">',
+ '<div class="x-grid3-hd-inner x-treegrid-hd-inner" unselectable="on">',
+ this.enableHdMenu
+ ? '<a class="x-grid3-hd-btn" href="#"></a>'
+ : '',
+ '{header}<img class="x-grid3-sort-icon" src="',
+ Ext.BLANK_IMAGE_URL,
+ '" />',
+ '</div>',
+ '</td></tpl>',
+ '</tr></thead>',
+ '</table>',
+ '</div></div>',
+ '</div>',
+ '<div class="x-treegrid-root-node">',
+ '<table class="x-treegrid-root-table" cellpadding="0" cellspacing="0" style="table-layout: fixed;"></table>',
+ '</div>'
+ );
+ }
+
+ if (!this.colgroupTpl) {
+ this.colgroupTpl = new Ext.XTemplate(
+ '<colgroup><tpl for="columns"><col style="width: {width}px"/></tpl></colgroup>'
+ );
+ }
+ },
+
+ initColumns: function() {
+ var cs = this.columns,
+ len = cs.length,
+ columns = [],
+ i,
+ c;
+
+ for (i = 0; i < len; i++) {
+ c = cs[i];
+ if (!c.isColumn) {
+ c.xtype = c.xtype
+ ? /^tg/.test(c.xtype)
+ ? c.xtype
+ : 'tg' + c.xtype
+ : 'tgcolumn';
+ c = Ext.create(c);
+ }
+ c.init(this);
+ columns.push(c);
+
+ if (this.enableSort !== false && c.sortable !== false) {
+ c.sortable = true;
+ this.enableSort = true;
+ }
+ }
+
+ this.columns = columns;
+ },
+
+ onRender: function() {
+ Ext.tree.TreePanel.superclass.onRender.apply(this, arguments);
+
+ this.el.addClass('x-treegrid');
+
+ this.outerCt = this.body.createChild({
+ cls:
+ 'x-tree-root-ct x-treegrid-ct ' +
+ (this.useArrows
+ ? 'x-tree-arrows'
+ : this.lines
+ ? 'x-tree-lines'
+ : 'x-tree-no-lines'),
+ });
+
+ this.internalTpl.overwrite(this.outerCt, { columns: this.columns });
+
+ this.mainHd = Ext.get(this.outerCt.dom.firstChild);
+ this.innerHd = Ext.get(this.mainHd.dom.firstChild);
+ this.innerBody = Ext.get(this.outerCt.dom.lastChild);
+ this.innerCt = Ext.get(this.innerBody.dom.firstChild);
+
+ this.colgroupTpl.insertFirst(this.innerCt, { columns: this.columns });
+
+ if (this.hideHeaders) {
+ this.el.child('.x-grid3-header').setDisplayed('none');
+ } else if (this.enableHdMenu !== false) {
+ this.hmenu = new Ext.menu.Menu({ id: this.id + '-hctx' });
+ if (this.enableColumnHide !== false) {
+ this.colMenu = new Ext.menu.Menu({
+ id: this.id + '-hcols-menu',
+ });
+ this.colMenu.on({
+ scope: this,
+ beforeshow: this.beforeColMenuShow,
+ itemclick: this.handleHdMenuClick,
+ });
+ this.hmenu.add({
+ itemId: 'columns',
+ hideOnClick: false,
+ text: this.columnsText,
+ menu: this.colMenu,
+ iconCls: 'x-cols-icon',
+ });
+ }
+ this.hmenu.on('itemclick', this.handleHdMenuClick, this);
+ }
+ },
+
+ setRootNode: function(node) {
+ node.attributes.uiProvider = Ext.ux.tree.TreeGridRootNodeUI;
+ node = Ext.ux.tree.TreeGrid.superclass.setRootNode.call(this, node);
+ if (this.innerCt) {
+ this.colgroupTpl.insertFirst(this.innerCt, {
+ columns: this.columns,
+ });
+ }
+ return node;
+ },
+
+ clearInnerCt: function() {
+ if (Ext.isIE) {
+ var dom = this.innerCt.dom;
+ while (dom.firstChild) {
+ dom.removeChild(dom.firstChild);
+ }
+ } else {
+ Ext.ux.tree.TreeGrid.superclass.clearInnerCt.call(this);
+ }
+ },
+
+ initEvents: function() {
+ Ext.ux.tree.TreeGrid.superclass.initEvents.apply(this, arguments);
+
+ this.mon(this.innerBody, 'scroll', this.syncScroll, this);
+ this.mon(this.innerHd, 'click', this.handleHdDown, this);
+ this.mon(this.mainHd, {
+ scope: this,
+ mouseover: this.handleHdOver,
+ mouseout: this.handleHdOut,
+ });
+ },
+
+ onResize: function(w, h) {
+ Ext.ux.tree.TreeGrid.superclass.onResize.apply(this, arguments);
+
+ var bd = this.innerBody.dom;
+ var hd = this.innerHd.dom;
+
+ if (!bd) {
+ return;
+ }
+
+ if (Ext.isNumber(h)) {
+ bd.style.height =
+ this.body.getHeight(true) - hd.offsetHeight + 'px';
+ }
+
+ if (Ext.isNumber(w)) {
+ var sw = Ext.num(this.scrollOffset, Ext.getScrollBarWidth());
+ if (
+ this.reserveScrollOffset ||
+ bd.offsetWidth - bd.clientWidth > 10
+ ) {
+ this.setScrollOffset(sw);
+ } else {
+ var me = this;
+ setTimeout(function() {
+ me.setScrollOffset(
+ bd.offsetWidth - bd.clientWidth > 10 ? sw : 0
+ );
+ }, 10);
+ }
+ }
+ },
+
+ updateColumnWidths: function() {
+ var cols = this.columns,
+ colCount = cols.length,
+ groups = this.outerCt.query('colgroup'),
+ groupCount = groups.length,
+ c,
+ g,
+ i,
+ j;
+
+ for (i = 0; i < colCount; i++) {
+ c = cols[i];
+ for (j = 0; j < groupCount; j++) {
+ g = groups[j];
+ g.childNodes[i].style.width = (c.hidden ? 0 : c.width) + 'px';
+ }
+ }
+
+ for (
+ i = 0, groups = this.innerHd.query('td'), len = groups.length;
+ i < len;
+ i++
+ ) {
+ c = Ext.fly(groups[i]);
+ if (cols[i] && cols[i].hidden) {
+ c.addClass('x-treegrid-hd-hidden');
+ } else {
+ c.removeClass('x-treegrid-hd-hidden');
+ }
+ }
+
+ var tcw = this.getTotalColumnWidth();
+ Ext.fly(this.innerHd.dom.firstChild).setWidth(
+ tcw + (this.scrollOffset || 0)
+ );
+ this.outerCt.select('table').setWidth(tcw);
+ this.syncHeaderScroll();
+ },
+
+ getVisibleColumns: function() {
+ var columns = [],
+ cs = this.columns,
+ len = cs.length,
+ i;
+
+ for (i = 0; i < len; i++) {
+ if (!cs[i].hidden) {
+ columns.push(cs[i]);
+ }
+ }
+ return columns;
+ },
+
+ getTotalColumnWidth: function() {
+ var total = 0;
+ for (
+ var i = 0, cs = this.getVisibleColumns(), len = cs.length;
+ i < len;
+ i++
+ ) {
+ total += cs[i].width;
+ }
+ return total;
+ },
+
+ setScrollOffset: function(scrollOffset) {
+ this.scrollOffset = scrollOffset;
+ this.updateColumnWidths();
+ },
+
+ // private
+ handleHdDown: function(e, t) {
+ var hd = e.getTarget('.x-treegrid-hd');
+
+ if (hd && Ext.fly(t).hasClass('x-grid3-hd-btn')) {
+ var ms = this.hmenu.items,
+ cs = this.columns,
+ index = this.findHeaderIndex(hd),
+ c = cs[index],
+ sort = c.sortable;
+
+ e.stopEvent();
+ Ext.fly(hd).addClass('x-grid3-hd-menu-open');
+ this.hdCtxIndex = index;
+
+ this.fireEvent('headerbuttonclick', ms, c, hd, index);
+
+ this.hmenu.on(
+ 'hide',
+ function() {
+ Ext.fly(hd).removeClass('x-grid3-hd-menu-open');
+ },
+ this,
+ { single: true }
+ );
+
+ this.hmenu.show(t, 'tl-bl?');
+ } else if (hd) {
+ var index = this.findHeaderIndex(hd);
+ this.fireEvent('headerclick', this.columns[index], hd, index);
+ }
+ },
+
+ // private
+ handleHdOver: function(e, t) {
+ var hd = e.getTarget('.x-treegrid-hd');
+ if (hd && !this.headersDisabled) {
+ index = this.findHeaderIndex(hd);
+ this.activeHdRef = t;
+ this.activeHdIndex = index;
+ var el = Ext.get(hd);
+ this.activeHdRegion = el.getRegion();
+ el.addClass('x-grid3-hd-over');
+ this.activeHdBtn = el.child('.x-grid3-hd-btn');
+ if (this.activeHdBtn) {
+ this.activeHdBtn.dom.style.height =
+ hd.firstChild.offsetHeight - 1 + 'px';
+ }
+ }
+ },
+
+ // private
+ handleHdOut: function(e, t) {
+ var hd = e.getTarget('.x-treegrid-hd');
+ if (hd && (!Ext.isIE || !e.within(hd, true))) {
+ this.activeHdRef = null;
+ Ext.fly(hd).removeClass('x-grid3-hd-over');
+ hd.style.cursor = '';
+ }
+ },
+
+ findHeaderIndex: function(hd) {
+ hd = hd.dom || hd;
+ var cs = hd.parentNode.childNodes;
+ for (var i = 0, c; (c = cs[i]); i++) {
+ if (c == hd) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ // private
+ beforeColMenuShow: function() {
+ var cols = this.columns,
+ colCount = cols.length,
+ i,
+ c;
+ this.colMenu.removeAll();
+ for (i = 1; i < colCount; i++) {
+ c = cols[i];
+ if (c.hideable !== false) {
+ this.colMenu.add(
+ new Ext.menu.CheckItem({
+ itemId: 'col-' + i,
+ text: c.header,
+ checked: !c.hidden,
+ hideOnClick: false,
+ disabled: c.hideable === false,
+ })
+ );
+ }
+ }
+ },
+
+ // private
+ handleHdMenuClick: function(item) {
+ var index = this.hdCtxIndex,
+ id = item.getItemId();
+
+ if (
+ this.fireEvent(
+ 'headermenuclick',
+ this.columns[index],
+ id,
+ index
+ ) !== false
+ ) {
+ index = id.substr(4);
+ if (index > 0 && this.columns[index]) {
+ this.setColumnVisible(index, !item.checked);
+ }
+ }
+
+ return true;
+ },
+
+ setColumnVisible: function(index, visible) {
+ this.columns[index].hidden = !visible;
+ this.updateColumnWidths();
+ },
+
+ /**
+ * Scrolls the grid to the top
+ */
+ scrollToTop: function() {
+ this.innerBody.dom.scrollTop = 0;
+ this.innerBody.dom.scrollLeft = 0;
+ },
+
+ // private
+ syncScroll: function() {
+ this.syncHeaderScroll();
+ var mb = this.innerBody.dom;
+ this.fireEvent('bodyscroll', mb.scrollLeft, mb.scrollTop);
+ },
+
+ // private
+ syncHeaderScroll: function() {
+ var mb = this.innerBody.dom;
+ this.innerHd.dom.scrollLeft = mb.scrollLeft;
+ this.innerHd.dom.scrollLeft = mb.scrollLeft; // second time for IE (1/2 time first fails, other browsers ignore)
+ },
+
+ registerNode: function(n) {
+ Ext.ux.tree.TreeGrid.superclass.registerNode.call(this, n);
+ if (!n.uiProvider && !n.isRoot && !n.ui.isTreeGridNodeUI) {
+ n.ui = new Ext.ux.tree.TreeGridNodeUI(n);
+ }
+ },
+});
+
+Ext.reg('treegrid', Ext.ux.tree.TreeGrid);
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/**
+ * @class Ext.tree.ColumnResizer
+ * @extends Ext.util.Observable
+ */
+Ext.tree.ColumnResizer = Ext.extend(Ext.util.Observable, {
+ /**
+ * @cfg {Number} minWidth The minimum width the column can be dragged to.
+ * Defaults to <tt>14</tt>.
+ */
+ minWidth: 14,
+
+ constructor: function(config) {
+ Ext.apply(this, config);
+ Ext.tree.ColumnResizer.superclass.constructor.call(this);
+ },
+
+ init: function(tree) {
+ this.tree = tree;
+ tree.on('render', this.initEvents, this);
+ },
+
+ initEvents: function(tree) {
+ tree.mon(tree.innerHd, 'mousemove', this.handleHdMove, this);
+ this.tracker = new Ext.dd.DragTracker({
+ onBeforeStart: this.onBeforeStart.createDelegate(this),
+ onStart: this.onStart.createDelegate(this),
+ onDrag: this.onDrag.createDelegate(this),
+ onEnd: this.onEnd.createDelegate(this),
+ tolerance: 3,
+ autoStart: 300,
+ });
+ this.tracker.initEl(tree.innerHd);
+ tree.on('beforedestroy', this.tracker.destroy, this.tracker);
+ },
+
+ handleHdMove: function(e, t) {
+ var hw = 5,
+ x = e.getPageX(),
+ hd = e.getTarget('.x-treegrid-hd', 3, true);
+
+ if (hd) {
+ var r = hd.getRegion(),
+ ss = hd.dom.style,
+ pn = hd.dom.parentNode;
+
+ if (x - r.left <= hw && hd.dom !== pn.firstChild) {
+ var ps = hd.dom.previousSibling;
+ while (ps && Ext.fly(ps).hasClass('x-treegrid-hd-hidden')) {
+ ps = ps.previousSibling;
+ }
+ if (ps) {
+ this.activeHd = Ext.get(ps);
+ ss.cursor = Ext.isWebKit ? 'e-resize' : 'col-resize';
+ }
+ } else if (r.right - x <= hw) {
+ var ns = hd.dom;
+ while (ns && Ext.fly(ns).hasClass('x-treegrid-hd-hidden')) {
+ ns = ns.previousSibling;
+ }
+ if (ns) {
+ this.activeHd = Ext.get(ns);
+ ss.cursor = Ext.isWebKit ? 'w-resize' : 'col-resize';
+ }
+ } else {
+ delete this.activeHd;
+ ss.cursor = '';
+ }
+ }
+ },
+
+ onBeforeStart: function(e) {
+ this.dragHd = this.activeHd;
+ return !!this.dragHd;
+ },
+
+ onStart: function(e) {
+ this.dragHeadersDisabled = this.tree.headersDisabled;
+ this.tree.headersDisabled = true;
+ this.proxy = this.tree.body.createChild({ cls: 'x-treegrid-resizer' });
+ this.proxy.setHeight(this.tree.body.getHeight());
+
+ var x = this.tracker.getXY()[0];
+
+ this.hdX = this.dragHd.getX();
+ this.hdIndex = this.tree.findHeaderIndex(this.dragHd);
+
+ this.proxy.setX(this.hdX);
+ this.proxy.setWidth(x - this.hdX);
+
+ this.maxWidth =
+ this.tree.outerCt.getWidth() -
+ this.tree.innerBody.translatePoints(this.hdX).left;
+ },
+
+ onDrag: function(e) {
+ var cursorX = this.tracker.getXY()[0];
+ this.proxy.setWidth(
+ (cursorX - this.hdX).constrain(this.minWidth, this.maxWidth)
+ );
+ },
+
+ onEnd: function(e) {
+ var nw = this.proxy.getWidth(),
+ tree = this.tree,
+ disabled = this.dragHeadersDisabled;
+
+ this.proxy.remove();
+ delete this.dragHd;
+
+ tree.columns[this.hdIndex].width = nw;
+ tree.updateColumnWidths();
+
+ setTimeout(function() {
+ tree.headersDisabled = disabled;
+ }, 100);
+ },
+});
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+(function() {
+ Ext.override(Ext.list.Column, {
+ init: function() {
+ var types = Ext.data.Types,
+ st = this.sortType;
+
+ if (this.type) {
+ if (Ext.isString(this.type)) {
+ this.type =
+ Ext.data.Types[this.type.toUpperCase()] || types.AUTO;
+ }
+ } else {
+ this.type = types.AUTO;
+ }
+
+ // named sortTypes are supported, here we look them up
+ if (Ext.isString(st)) {
+ this.sortType = Ext.data.SortTypes[st];
+ } else if (Ext.isEmpty(st)) {
+ this.sortType = this.type.sortType;
+ }
+ },
+ });
+
+ Ext.tree.Column = Ext.extend(Ext.list.Column, {});
+ Ext.tree.NumberColumn = Ext.extend(Ext.list.NumberColumn, {});
+ Ext.tree.DateColumn = Ext.extend(Ext.list.DateColumn, {});
+ Ext.tree.BooleanColumn = Ext.extend(Ext.list.BooleanColumn, {});
+
+ Ext.reg('tgcolumn', Ext.tree.Column);
+ Ext.reg('tgnumbercolumn', Ext.tree.NumberColumn);
+ Ext.reg('tgdatecolumn', Ext.tree.DateColumn);
+ Ext.reg('tgbooleancolumn', Ext.tree.BooleanColumn);
+})();
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/**
+ * @class Ext.ux.tree.TreeGridLoader
+ * @extends Ext.tree.TreeLoader
+ */
+Ext.ux.tree.TreeGridLoader = Ext.extend(Ext.tree.TreeLoader, {
+ createNode: function(attr) {
+ if (!attr.uiProvider) {
+ attr.uiProvider = Ext.ux.tree.TreeGridNodeUI;
+ }
+ return Ext.tree.TreeLoader.prototype.createNode.call(this, attr);
+ },
+});
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/**
+ * @class Ext.ux.tree.TreeGridNodeUI
+ * @extends Ext.tree.TreeNodeUI
+ */
+Ext.ux.tree.TreeGridNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
+ isTreeGridNodeUI: true,
+
+ renderElements: function(n, a, targetNode, bulkRender) {
+ var t = n.getOwnerTree(),
+ cols = t.columns,
+ c = cols[0],
+ i,
+ buf,
+ len;
+
+ this.indentMarkup = n.parentNode
+ ? n.parentNode.ui.getChildIndent()
+ : '';
+
+ buf = [
+ '<tbody class="x-tree-node">',
+ '<tr ext:tree-node-id="',
+ n.id,
+ '" class="x-tree-node-el x-tree-node-leaf ',
+ a.cls,
+ '">',
+ '<td class="x-treegrid-col">',
+ '<span class="x-tree-node-indent">',
+ this.indentMarkup,
+ '</span>',
+ '<img src="',
+ this.emptyIcon,
+ '" class="x-tree-ec-icon x-tree-elbow" />',
+ '<img src="',
+ a.icon || this.emptyIcon,
+ '" class="x-tree-node-icon',
+ a.icon ? ' x-tree-node-inline-icon' : '',
+ a.iconCls ? ' ' + a.iconCls : '',
+ '" unselectable="on" />',
+ '<a hidefocus="on" class="x-tree-node-anchor" href="',
+ a.href ? a.href : '#',
+ '" tabIndex="1" ',
+ a.hrefTarget ? ' target="' + a.hrefTarget + '"' : '',
+ '>',
+ '<span unselectable="on">',
+ c.tpl ? c.tpl.apply(a) : a[c.dataIndex] || c.text,
+ '</span></a>',
+ '</td>',
+ ];
+
+ for (i = 1, len = cols.length; i < len; i++) {
+ c = cols[i];
+ buf.push(
+ '<td class="x-treegrid-col ',
+ c.cls ? c.cls : '',
+ '">',
+ '<div unselectable="on" class="x-treegrid-text"',
+ c.align ? ' style="text-align: ' + c.align + ';"' : '',
+ '>',
+ c.tpl ? c.tpl.apply(a) : a[c.dataIndex],
+ '</div>',
+ '</td>'
+ );
+ }
+
+ buf.push(
+ '</tr><tr class="x-tree-node-ct"><td colspan="',
+ cols.length,
+ '">',
+ '<table class="x-treegrid-node-ct-table" cellpadding="0" cellspacing="0" style="table-layout: fixed; display: none; width: ',
+ t.innerCt.getWidth(),
+ 'px;"><colgroup>'
+ );
+ for (i = 0, len = cols.length; i < len; i++) {
+ buf.push(
+ '<col style="width: ',
+ cols[i].hidden ? 0 : cols[i].width,
+ 'px;" />'
+ );
+ }
+ buf.push('</colgroup></table></td></tr></tbody>');
+
+ if (bulkRender !== true && n.nextSibling && n.nextSibling.ui.getEl()) {
+ this.wrap = Ext.DomHelper.insertHtml(
+ 'beforeBegin',
+ n.nextSibling.ui.getEl(),
+ buf.join('')
+ );
+ } else {
+ this.wrap = Ext.DomHelper.insertHtml(
+ 'beforeEnd',
+ targetNode,
+ buf.join('')
+ );
+ }
+
+ this.elNode = this.wrap.childNodes[0];
+ this.ctNode = this.wrap.childNodes[1].firstChild.firstChild;
+ var cs = this.elNode.firstChild.childNodes;
+ this.indentNode = cs[0];
+ this.ecNode = cs[1];
+ this.iconNode = cs[2];
+ this.anchor = cs[3];
+ this.textNode = cs[3].firstChild;
+ },
+
+ // private
+ animExpand: function(cb) {
+ this.ctNode.style.display = '';
+ Ext.ux.tree.TreeGridNodeUI.superclass.animExpand.call(this, cb);
+ },
+});
+
+Ext.ux.tree.TreeGridRootNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
+ isTreeGridNodeUI: true,
+
+ // private
+ render: function() {
+ if (!this.rendered) {
+ this.wrap = this.ctNode = this.node.ownerTree.innerCt.dom;
+ this.node.expanded = true;
+ }
+
+ if (Ext.isWebKit) {
+ // weird table-layout: fixed issue in webkit
+ var ct = this.ctNode;
+ ct.style.tableLayout = null;
+ (function() {
+ ct.style.tableLayout = 'fixed';
+ }.defer(1));
+ }
+ },
+
+ destroy: function() {
+ if (this.elNode) {
+ Ext.dd.Registry.unregister(this.elNode.id);
+ }
+ delete this.node;
+ },
+
+ collapse: Ext.emptyFn,
+ expand: Ext.emptyFn,
+});
+/**
+ * Ext.ux.tree.TreeGridNodeUIFix.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.override(Ext.ux.tree.TreeGridNodeUI, {
+ updateColumns: function() {
+ if (!this.rendered) return;
+
+ var a = this.node.attributes,
+ t = this.node.getOwnerTree(),
+ cols = t.columns,
+ c = cols[0];
+
+ // Update the first column
+ this.anchor.firstChild.innerHTML = c.tpl
+ ? c.tpl.apply(a)
+ : a[c.dataIndex] || c.text;
+
+ // Update the remaining columns
+ for (i = 1, len = cols.length; i < len; i++) {
+ c = cols[i];
+ this.elNode.childNodes[i].firstChild.innerHTML = c.tpl
+ ? c.tpl.apply(a)
+ : a[c.dataIndex] || c.text;
+ }
+ },
+});
+Ext.tree.RenderColumn = Ext.extend(Ext.tree.Column, {
+ constructor: function(c) {
+ c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':this.format}');
+ c.tpl.format = c.renderer;
+ c.tpl.col = this;
+ Ext.tree.RenderColumn.superclass.constructor.call(this, c);
+ },
+});
+Ext.reg('tgrendercolumn', Ext.tree.RenderColumn);
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+Ext.ns('Ext.ux.tree');
+
+/**
+ * @class Ext.ux.tree.TreeGridSorter
+ * @extends Ext.tree.TreeSorter
+ * Provides sorting of nodes in a {@link Ext.ux.tree.TreeGrid}. The TreeGridSorter automatically monitors events on the
+ * associated TreeGrid that might affect the tree's sort order (beforechildrenrendered, append, insert and textchange).
+ * Example usage:<br />
+ * <pre><code>
+ new Ext.ux.tree.TreeGridSorter(myTreeGrid, {
+ folderSort: true,
+ dir: "desc",
+ sortType: function(node) {
+ // sort by a custom, typed attribute:
+ return parseInt(node.id, 10);
+ }
+ });
+ </code></pre>
+ * @constructor
+ * @param {TreeGrid} tree
+ * @param {Object} config
+ */
+Ext.ux.tree.TreeGridSorter = Ext.extend(Ext.tree.TreeSorter, {
+ /**
+ * @cfg {Array} sortClasses The CSS classes applied to a header when it is sorted. (defaults to <tt>['sort-asc', 'sort-desc']</tt>)
+ */
+ sortClasses: ['sort-asc', 'sort-desc'],
+ /**
+ * @cfg {String} sortAscText The text displayed in the 'Sort Ascending' menu item (defaults to <tt>'Sort Ascending'</tt>)
+ */
+ sortAscText: 'Sort Ascending',
+ /**
+ * @cfg {String} sortDescText The text displayed in the 'Sort Descending' menu item (defaults to <tt>'Sort Descending'</tt>)
+ */
+ sortDescText: 'Sort Descending',
+
+ constructor: function(tree, config) {
+ if (!Ext.isObject(config)) {
+ config = {
+ property: tree.columns[0].dataIndex || 'text',
+ folderSort: true,
+ };
+ }
+
+ Ext.ux.tree.TreeGridSorter.superclass.constructor.apply(
+ this,
+ arguments
+ );
+
+ this.tree = tree;
+ tree.on('headerclick', this.onHeaderClick, this);
+ tree.ddAppendOnly = true;
+
+ var me = this;
+ this.defaultSortFn = function(n1, n2) {
+ var desc = me.dir && me.dir.toLowerCase() == 'desc',
+ prop = me.property || 'text',
+ sortType = me.sortType,
+ caseSensitive = me.caseSensitive === true,
+ leafAttr = me.leafAttr || 'leaf',
+ attr1 = n1.attributes,
+ attr2 = n2.attributes;
+
+ if (me.folderSort) {
+ if (attr1[leafAttr] && !attr2[leafAttr]) {
+ return 1;
+ }
+ if (!attr1[leafAttr] && attr2[leafAttr]) {
+ return -1;
+ }
+ }
+ var prop1 = attr1[prop],
+ prop2 = attr2[prop],
+ v1 = sortType
+ ? sortType(prop1)
+ : caseSensitive
+ ? prop1
+ : prop1.toUpperCase();
+ v2 = sortType
+ ? sortType(prop2)
+ : caseSensitive
+ ? prop2
+ : prop2.toUpperCase();
+
+ if (v1 < v2) {
+ return desc ? +1 : -1;
+ } else if (v1 > v2) {
+ return desc ? -1 : +1;
+ } else {
+ return 0;
+ }
+ };
+
+ tree.on('afterrender', this.onAfterTreeRender, this, { single: true });
+ tree.on('headermenuclick', this.onHeaderMenuClick, this);
+ },
+
+ onAfterTreeRender: function() {
+ if (this.tree.hmenu) {
+ this.tree.hmenu.insert(
+ 0,
+ {
+ itemId: 'asc',
+ text: this.sortAscText,
+ cls: 'xg-hmenu-sort-asc',
+ },
+ {
+ itemId: 'desc',
+ text: this.sortDescText,
+ cls: 'xg-hmenu-sort-desc',
+ }
+ );
+ }
+ this.updateSortIcon(0, 'asc');
+ },
+
+ onHeaderMenuClick: function(c, id, index) {
+ if (id === 'asc' || id === 'desc') {
+ this.onHeaderClick(c, null, index);
+ return false;
+ }
+ },
+
+ onHeaderClick: function(c, el, i) {
+ if (c && !this.tree.headersDisabled) {
+ var me = this;
+
+ me.property = c.dataIndex;
+ me.dir = c.dir = c.dir === 'desc' ? 'asc' : 'desc';
+ me.sortType = c.sortType;
+ me.caseSensitive === Ext.isBoolean(c.caseSensitive)
+ ? c.caseSensitive
+ : this.caseSensitive;
+ me.sortFn = c.sortFn || this.defaultSortFn;
+
+ this.tree.root.cascade(function(n) {
+ if (!n.isLeaf()) {
+ me.updateSort(me.tree, n);
+ }
+ });
+
+ this.updateSortIcon(i, c.dir);
+ }
+ },
+
+ // private
+ updateSortIcon: function(col, dir) {
+ var sc = this.sortClasses,
+ hds = this.tree.innerHd.select('td').removeClass(sc);
+ hds.item(col).addClass(sc[dir == 'desc' ? 1 : 0]);
+ },
+});
+Ext.ux.JSLoader = function(options) {
+ Ext.ux.JSLoader.scripts[++Ext.ux.JSLoader.index] = {
+ url: options.url,
+ success: true,
+ jsLoadObj: null,
+ options: options,
+ onLoad: options.onLoad || Ext.emptyFn,
+ onError: options.onError || Ext.ux.JSLoader.stdError,
+ scope: options.scope || this,
+ };
+
+ Ext.Ajax.request({
+ url: options.url,
+ scriptIndex: Ext.ux.JSLoader.index,
+ success: function(response, options) {
+ var script = Ext.ux.JSLoader.scripts[options.scriptIndex];
+ try {
+ eval(response.responseText);
+ } catch (e) {
+ script.success = false;
+ script.onError(script.options, e);
+ }
+ if (script.success) {
+ script.onLoad.call(script.scope, script.options);
+ }
+ },
+ failure: function(response, options) {
+ var script = Ext.ux.JSLoader.scripts[options.scriptIndex];
+ script.success = false;
+ script.onError(script.options, response.status);
+ },
+ });
+};
+Ext.ux.JSLoader.index = 0;
+Ext.ux.JSLoader.scripts = [];
+Ext.ux.JSLoader.stdError = function(options, e) {
+ window.alert(
+ 'Error loading script:\n\n' + options.url + '\n\nstatus: ' + e
+ );
+};
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/**
+ * @class Ext.ux.Spinner
+ * @extends Ext.util.Observable
+ * Creates a Spinner control utilized by Ext.ux.form.SpinnerField
+ */
+Ext.ux.Spinner = Ext.extend(Ext.util.Observable, {
+ incrementValue: 1,
+ alternateIncrementValue: 5,
+ triggerClass: 'x-form-spinner-trigger',
+ splitterClass: 'x-form-spinner-splitter',
+ alternateKey: Ext.EventObject.shiftKey,
+ defaultValue: 0,
+ accelerate: false,
+
+ constructor: function(config) {
+ Ext.ux.Spinner.superclass.constructor.call(this, config);
+ Ext.apply(this, config);
+ this.mimicing = false;
+ },
+
+ init: function(field) {
+ this.field = field;
+
+ field.afterMethod('onRender', this.doRender, this);
+ field.afterMethod('onEnable', this.doEnable, this);
+ field.afterMethod('onDisable', this.doDisable, this);
+ field.afterMethod('afterRender', this.doAfterRender, this);
+ field.afterMethod('onResize', this.doResize, this);
+ field.afterMethod('onFocus', this.doFocus, this);
+ field.beforeMethod('onDestroy', this.doDestroy, this);
+ },
+
+ doRender: function(ct, position) {
+ var el = (this.el = this.field.getEl());
+ var f = this.field;
+
+ if (!f.wrap) {
+ f.wrap = this.wrap = el.wrap({
+ cls: 'x-form-field-wrap',
+ });
+ } else {
+ this.wrap = f.wrap.addClass('x-form-field-wrap');
+ }
+
+ this.trigger = this.wrap.createChild({
+ tag: 'img',
+ src: Ext.BLANK_IMAGE_URL,
+ cls: 'x-form-trigger ' + this.triggerClass,
+ });
+
+ if (!f.width) {
+ this.wrap.setWidth(el.getWidth() + this.trigger.getWidth());
+ }
+
+ this.splitter = this.wrap.createChild({
+ tag: 'div',
+ cls: this.splitterClass,
+ style: 'width:13px; height:2px;',
+ });
+ this.splitter
+ .setRight(Ext.isIE ? 1 : 2)
+ .setTop(10)
+ .show();
+
+ this.proxy = this.trigger.createProxy('', this.splitter, true);
+ this.proxy.addClass('x-form-spinner-proxy');
+ this.proxy.setStyle('left', '0px');
+ this.proxy.setSize(14, 1);
+ this.proxy.hide();
+ this.dd = new Ext.dd.DDProxy(this.splitter.dom.id, 'SpinnerDrag', {
+ dragElId: this.proxy.id,
+ });
+
+ this.initTrigger();
+ this.initSpinner();
+ },
+
+ doAfterRender: function() {
+ var y;
+ if (Ext.isIE && this.el.getY() != (y = this.trigger.getY())) {
+ this.el.position();
+ this.el.setY(y);
+ }
+ },
+
+ doEnable: function() {
+ if (this.wrap) {
+ this.disabled = false;
+ this.wrap.removeClass(this.field.disabledClass);
+ }
+ },
+
+ doDisable: function() {
+ if (this.wrap) {
+ this.disabled = true;
+ this.wrap.addClass(this.field.disabledClass);
+ this.el.removeClass(this.field.disabledClass);
+ }
+ },
+
+ doResize: function(w, h) {
+ if (typeof w == 'number') {
+ this.el.setWidth(w - this.trigger.getWidth());
+ }
+ this.wrap.setWidth(this.el.getWidth() + this.trigger.getWidth());
+ },
+
+ doFocus: function() {
+ if (!this.mimicing) {
+ this.wrap.addClass('x-trigger-wrap-focus');
+ this.mimicing = true;
+ Ext.get(Ext.isIE ? document.body : document).on(
+ 'mousedown',
+ this.mimicBlur,
+ this,
+ {
+ delay: 10,
+ }
+ );
+ this.el.on('keydown', this.checkTab, this);
+ }
+ },
+
+ // private
+ checkTab: function(e) {
+ if (e.getKey() == e.TAB) {
+ this.triggerBlur();
+ }
+ },
+
+ // private
+ mimicBlur: function(e) {
+ if (!this.wrap.contains(e.target) && this.field.validateBlur(e)) {
+ this.triggerBlur();
+ }
+ },
+
+ // private
+ triggerBlur: function() {
+ this.mimicing = false;
+ Ext.get(Ext.isIE ? document.body : document).un(
+ 'mousedown',
+ this.mimicBlur,
+ this
+ );
+ this.el.un('keydown', this.checkTab, this);
+ this.field.beforeBlur();
+ this.wrap.removeClass('x-trigger-wrap-focus');
+ this.field.onBlur.call(this.field);
+ },
+
+ initTrigger: function() {
+ this.trigger.addClassOnOver('x-form-trigger-over');
+ this.trigger.addClassOnClick('x-form-trigger-click');
+ },
+
+ initSpinner: function() {
+ this.field.addEvents({
+ spin: true,
+ spinup: true,
+ spindown: true,
+ });
+
+ this.keyNav = new Ext.KeyNav(this.el, {
+ up: function(e) {
+ e.preventDefault();
+ this.onSpinUp();
+ },
+
+ down: function(e) {
+ e.preventDefault();
+ this.onSpinDown();
+ },
+
+ pageUp: function(e) {
+ e.preventDefault();
+ this.onSpinUpAlternate();
+ },
+
+ pageDown: function(e) {
+ e.preventDefault();
+ this.onSpinDownAlternate();
+ },
+
+ scope: this,
+ });
+
+ this.repeater = new Ext.util.ClickRepeater(this.trigger, {
+ accelerate: this.accelerate,
+ });
+ this.field.mon(this.repeater, 'click', this.onTriggerClick, this, {
+ preventDefault: true,
+ });
+
+ this.field.mon(this.trigger, {
+ mouseover: this.onMouseOver,
+ mouseout: this.onMouseOut,
+ mousemove: this.onMouseMove,
+ mousedown: this.onMouseDown,
+ mouseup: this.onMouseUp,
+ scope: this,
+ preventDefault: true,
+ });
+
+ this.field.mon(this.wrap, 'mousewheel', this.handleMouseWheel, this);
+
+ this.dd.setXConstraint(0, 0, 10);
+ this.dd.setYConstraint(1500, 1500, 10);
+ this.dd.endDrag = this.endDrag.createDelegate(this);
+ this.dd.startDrag = this.startDrag.createDelegate(this);
+ this.dd.onDrag = this.onDrag.createDelegate(this);
+ },
+
+ onMouseOver: function() {
+ if (this.disabled) {
+ return;
+ }
+ var middle = this.getMiddle();
+ this.tmpHoverClass =
+ Ext.EventObject.getPageY() < middle
+ ? 'x-form-spinner-overup'
+ : 'x-form-spinner-overdown';
+ this.trigger.addClass(this.tmpHoverClass);
+ },
+
+ //private
+ onMouseOut: function() {
+ this.trigger.removeClass(this.tmpHoverClass);
+ },
+
+ //private
+ onMouseMove: function() {
+ if (this.disabled) {
+ return;
+ }
+ var middle = this.getMiddle();
+ if (
+ (Ext.EventObject.getPageY() > middle &&
+ this.tmpHoverClass == 'x-form-spinner-overup') ||
+ (Ext.EventObject.getPageY() < middle &&
+ this.tmpHoverClass == 'x-form-spinner-overdown')
+ ) {
+ }
+ },
+
+ //private
+ onMouseDown: function() {
+ if (this.disabled) {
+ return;
+ }
+ var middle = this.getMiddle();
+ this.tmpClickClass =
+ Ext.EventObject.getPageY() < middle
+ ? 'x-form-spinner-clickup'
+ : 'x-form-spinner-clickdown';
+ this.trigger.addClass(this.tmpClickClass);
+ },
+
+ //private
+ onMouseUp: function() {
+ this.trigger.removeClass(this.tmpClickClass);
+ },
+
+ //private
+ onTriggerClick: function() {
+ if (this.disabled || this.el.dom.readOnly) {
+ return;
+ }
+ var middle = this.getMiddle();
+ var ud = Ext.EventObject.getPageY() < middle ? 'Up' : 'Down';
+ this['onSpin' + ud]();
+ },
+
+ //private
+ getMiddle: function() {
+ var t = this.trigger.getTop();
+ var h = this.trigger.getHeight();
+ var middle = t + h / 2;
+ return middle;
+ },
+
+ //private
+ //checks if control is allowed to spin
+ isSpinnable: function() {
+ if (this.disabled || this.el.dom.readOnly) {
+ Ext.EventObject.preventDefault(); //prevent scrolling when disabled/readonly
+ return false;
+ }
+ return true;
+ },
+
+ handleMouseWheel: function(e) {
+ //disable scrolling when not focused
+ if (this.wrap.hasClass('x-trigger-wrap-focus') == false) {
+ return;
+ }
+
+ var delta = e.getWheelDelta();
+ if (delta > 0) {
+ this.onSpinUp();
+ e.stopEvent();
+ } else if (delta < 0) {
+ this.onSpinDown();
+ e.stopEvent();
+ }
+ },
+
+ //private
+ startDrag: function() {
+ this.proxy.show();
+ this._previousY = Ext.fly(this.dd.getDragEl()).getTop();
+ },
+
+ //private
+ endDrag: function() {
+ this.proxy.hide();
+ },
+
+ //private
+ onDrag: function() {
+ if (this.disabled) {
+ return;
+ }
+ var y = Ext.fly(this.dd.getDragEl()).getTop();
+ var ud = '';
+
+ if (this._previousY > y) {
+ ud = 'Up';
+ } //up
+ if (this._previousY < y) {
+ ud = 'Down';
+ } //down
+ if (ud != '') {
+ this['onSpin' + ud]();
+ }
+
+ this._previousY = y;
+ },
+
+ //private
+ onSpinUp: function() {
+ if (this.isSpinnable() == false) {
+ return;
+ }
+ if (Ext.EventObject.shiftKey == true) {
+ this.onSpinUpAlternate();
+ return;
+ } else {
+ this.spin(false, false);
+ }
+ this.field.fireEvent('spin', this);
+ this.field.fireEvent('spinup', this);
+ },
+
+ //private
+ onSpinDown: function() {
+ if (this.isSpinnable() == false) {
+ return;
+ }
+ if (Ext.EventObject.shiftKey == true) {
+ this.onSpinDownAlternate();
+ return;
+ } else {
+ this.spin(true, false);
+ }
+ this.field.fireEvent('spin', this);
+ this.field.fireEvent('spindown', this);
+ },
+
+ //private
+ onSpinUpAlternate: function() {
+ if (this.isSpinnable() == false) {
+ return;
+ }
+ this.spin(false, true);
+ this.field.fireEvent('spin', this);
+ this.field.fireEvent('spinup', this);
+ },
+
+ //private
+ onSpinDownAlternate: function() {
+ if (this.isSpinnable() == false) {
+ return;
+ }
+ this.spin(true, true);
+ this.field.fireEvent('spin', this);
+ this.field.fireEvent('spindown', this);
+ },
+
+ spin: function(down, alternate) {
+ var v = parseFloat(this.field.getValue());
+ var incr =
+ alternate == true
+ ? this.alternateIncrementValue
+ : this.incrementValue;
+ down == true ? (v -= incr) : (v += incr);
+
+ v = isNaN(v) ? this.defaultValue : v;
+ v = this.fixBoundries(v);
+ this.field.setRawValue(v);
+ },
+
+ fixBoundries: function(value) {
+ var v = value;
+
+ if (this.field.minValue != undefined && v < this.field.minValue) {
+ v = this.field.minValue;
+ }
+ if (this.field.maxValue != undefined && v > this.field.maxValue) {
+ v = this.field.maxValue;
+ }
+
+ return this.fixPrecision(v);
+ },
+
+ // private
+ fixPrecision: function(value) {
+ var nan = isNaN(value);
+ if (
+ !this.field.allowDecimals ||
+ this.field.decimalPrecision == -1 ||
+ nan ||
+ !value
+ ) {
+ return nan ? '' : value;
+ }
+ return parseFloat(
+ parseFloat(value).toFixed(this.field.decimalPrecision)
+ );
+ },
+
+ doDestroy: function() {
+ if (this.trigger) {
+ this.trigger.remove();
+ }
+ if (this.wrap) {
+ this.wrap.remove();
+ delete this.field.wrap;
+ }
+
+ if (this.splitter) {
+ this.splitter.remove();
+ }
+
+ if (this.dd) {
+ this.dd.unreg();
+ this.dd = null;
+ }
+
+ if (this.proxy) {
+ this.proxy.remove();
+ }
+
+ if (this.repeater) {
+ this.repeater.purgeListeners();
+ }
+ if (this.mimicing) {
+ Ext.get(Ext.isIE ? document.body : document).un(
+ 'mousedown',
+ this.mimicBlur,
+ this
+ );
+ }
+ },
+});
+
+//backwards compat
+Ext.form.Spinner = Ext.ux.Spinner;
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/**
+ * @class Ext.ux.StatusBar
+ * <p>Basic status bar component that can be used as the bottom toolbar of any {@link Ext.Panel}. In addition to
+ * supporting the standard {@link Ext.Toolbar} interface for adding buttons, menus and other items, the StatusBar
+ * provides a greedy status element that can be aligned to either side and has convenient methods for setting the
+ * status text and icon. You can also indicate that something is processing using the {@link #showBusy} method.</p>
+ * <pre><code>
+new Ext.Panel({
+ title: 'StatusBar',
+ // etc.
+ bbar: new Ext.ux.StatusBar({
+ id: 'my-status',
+
+ // defaults to use when the status is cleared:
+ defaultText: 'Default status text',
+ defaultIconCls: 'default-icon',
+
+ // values to set initially:
+ text: 'Ready',
+ iconCls: 'ready-icon',
+
+ // any standard Toolbar items:
+ items: [{
+ text: 'A Button'
+ }, '-', 'Plain Text']
+ })
+});
+
+// Update the status bar later in code:
+var sb = Ext.getCmp('my-status');
+sb.setStatus({
+ text: 'OK',
+ iconCls: 'ok-icon',
+ clear: true // auto-clear after a set interval
+});
+
+// Set the status bar to show that something is processing:
+sb.showBusy();
+
+// processing....
+
+sb.clearStatus(); // once completeed
+</code></pre>
+ * @extends Ext.Toolbar
+ * @constructor
+ * Creates a new StatusBar
+ * @param {Object/Array} config A config object
+ */
+Ext.ux.StatusBar = Ext.extend(Ext.Toolbar, {
+ /**
+ * @cfg {String} statusAlign
+ * The alignment of the status element within the overall StatusBar layout. When the StatusBar is rendered,
+ * it creates an internal div containing the status text and icon. Any additional Toolbar items added in the
+ * StatusBar's {@link #items} config, or added via {@link #add} or any of the supported add* methods, will be
+ * rendered, in added order, to the opposite side. The status element is greedy, so it will automatically
+ * expand to take up all sapce left over by any other items. Example usage:
+ * <pre><code>
+// Create a left-aligned status bar containing a button,
+// separator and text item that will be right-aligned (default):
+new Ext.Panel({
+ title: 'StatusBar',
+ // etc.
+ bbar: new Ext.ux.StatusBar({
+ defaultText: 'Default status text',
+ id: 'status-id',
+ items: [{
+ text: 'A Button'
+ }, '-', 'Plain Text']
+ })
+});
+
+// By adding the statusAlign config, this will create the
+// exact same toolbar, except the status and toolbar item
+// layout will be reversed from the previous example:
+new Ext.Panel({
+ title: 'StatusBar',
+ // etc.
+ bbar: new Ext.ux.StatusBar({
+ defaultText: 'Default status text',
+ id: 'status-id',
+ statusAlign: 'right',
+ items: [{
+ text: 'A Button'
+ }, '-', 'Plain Text']
+ })
+});
+</code></pre>
+ */
+ /**
+ * @cfg {String} defaultText
+ * The default {@link #text} value. This will be used anytime the status bar is cleared with the
+ * <tt>useDefaults:true</tt> option (defaults to '').
+ */
+ /**
+ * @cfg {String} defaultIconCls
+ * The default {@link #iconCls} value (see the iconCls docs for additional details about customizing the icon).
+ * This will be used anytime the status bar is cleared with the <tt>useDefaults:true</tt> option (defaults to '').
+ */
+ /**
+ * @cfg {String} text
+ * A string that will be <b>initially</b> set as the status message. This string
+ * will be set as innerHTML (html tags are accepted) for the toolbar item.
+ * If not specified, the value set for <code>{@link #defaultText}</code>
+ * will be used.
+ */
+ /**
+ * @cfg {String} iconCls
+ * A CSS class that will be <b>initially</b> set as the status bar icon and is
+ * expected to provide a background image (defaults to '').
+ * Example usage:<pre><code>
+// Example CSS rule:
+.x-statusbar .x-status-custom {
+ padding-left: 25px;
+ background: transparent url(images/custom-icon.gif) no-repeat 3px 2px;
+}
+
+// Setting a default icon:
+var sb = new Ext.ux.StatusBar({
+ defaultIconCls: 'x-status-custom'
+});
+
+// Changing the icon:
+sb.setStatus({
+ text: 'New status',
+ iconCls: 'x-status-custom'
+});
+</code></pre>
+ */
+
+ /**
+ * @cfg {String} cls
+ * The base class applied to the containing element for this component on render (defaults to 'x-statusbar')
+ */
+ cls: 'x-statusbar',
+ /**
+ * @cfg {String} busyIconCls
+ * The default <code>{@link #iconCls}</code> applied when calling
+ * <code>{@link #showBusy}</code> (defaults to <tt>'x-status-busy'</tt>).
+ * It can be overridden at any time by passing the <code>iconCls</code>
+ * argument into <code>{@link #showBusy}</code>.
+ */
+ busyIconCls: 'x-status-busy',
+ /**
+ * @cfg {String} busyText
+ * The default <code>{@link #text}</code> applied when calling
+ * <code>{@link #showBusy}</code> (defaults to <tt>'Loading...'</tt>).
+ * It can be overridden at any time by passing the <code>text</code>
+ * argument into <code>{@link #showBusy}</code>.
+ */
+ busyText: 'Loading...',
+ /**
+ * @cfg {Number} autoClear
+ * The number of milliseconds to wait after setting the status via
+ * <code>{@link #setStatus}</code> before automatically clearing the status
+ * text and icon (defaults to <tt>5000</tt>). Note that this only applies
+ * when passing the <tt>clear</tt> argument to <code>{@link #setStatus}</code>
+ * since that is the only way to defer clearing the status. This can
+ * be overridden by specifying a different <tt>wait</tt> value in
+ * <code>{@link #setStatus}</code>. Calls to <code>{@link #clearStatus}</code>
+ * always clear the status bar immediately and ignore this value.
+ */
+ autoClear: 5000,
+
+ /**
+ * @cfg {String} emptyText
+ * The text string to use if no text has been set. Defaults to
+ * <tt>'&nbsp;'</tt>). If there are no other items in the toolbar using
+ * an empty string (<tt>''</tt>) for this value would end up in the toolbar
+ * height collapsing since the empty string will not maintain the toolbar
+ * height. Use <tt>''</tt> if the toolbar should collapse in height
+ * vertically when no text is specified and there are no other items in
+ * the toolbar.
+ */
+ emptyText: '&nbsp;',
+
+ // private
+ activeThreadId: 0,
+
+ // private
+ initComponent: function() {
+ if (this.statusAlign == 'right') {
+ this.cls += ' x-status-right';
+ }
+ Ext.ux.StatusBar.superclass.initComponent.call(this);
+ },
+
+ // private
+ afterRender: function() {
+ Ext.ux.StatusBar.superclass.afterRender.call(this);
+
+ var right = this.statusAlign == 'right';
+ this.currIconCls = this.iconCls || this.defaultIconCls;
+ this.statusEl = new Ext.Toolbar.TextItem({
+ cls: 'x-status-text ' + (this.currIconCls || ''),
+ text: this.text || this.defaultText || '',
+ });
+
+ if (right) {
+ this.add('->');
+ this.add(this.statusEl);
+ } else {
+ this.insert(0, this.statusEl);
+ this.insert(1, '->');
+ }
+ this.doLayout();
+ },
+
+ /**
+ * Sets the status {@link #text} and/or {@link #iconCls}. Also supports automatically clearing the
+ * status that was set after a specified interval.
+ * @param {Object/String} config A config object specifying what status to set, or a string assumed
+ * to be the status text (and all other options are defaulted as explained below). A config
+ * object containing any or all of the following properties can be passed:<ul>
+ * <li><tt>text</tt> {String} : (optional) The status text to display. If not specified, any current
+ * status text will remain unchanged.</li>
+ * <li><tt>iconCls</tt> {String} : (optional) The CSS class used to customize the status icon (see
+ * {@link #iconCls} for details). If not specified, any current iconCls will remain unchanged.</li>
+ * <li><tt>clear</tt> {Boolean/Number/Object} : (optional) Allows you to set an internal callback that will
+ * automatically clear the status text and iconCls after a specified amount of time has passed. If clear is not
+ * specified, the new status will not be auto-cleared and will stay until updated again or cleared using
+ * {@link #clearStatus}. If <tt>true</tt> is passed, the status will be cleared using {@link #autoClear},
+ * {@link #defaultText} and {@link #defaultIconCls} via a fade out animation. If a numeric value is passed,
+ * it will be used as the callback interval (in milliseconds), overriding the {@link #autoClear} value.
+ * All other options will be defaulted as with the boolean option. To customize any other options,
+ * you can pass an object in the format:<ul>
+ * <li><tt>wait</tt> {Number} : (optional) The number of milliseconds to wait before clearing
+ * (defaults to {@link #autoClear}).</li>
+ * <li><tt>anim</tt> {Number} : (optional) False to clear the status immediately once the callback
+ * executes (defaults to true which fades the status out).</li>
+ * <li><tt>useDefaults</tt> {Number} : (optional) False to completely clear the status text and iconCls
+ * (defaults to true which uses {@link #defaultText} and {@link #defaultIconCls}).</li>
+ * </ul></li></ul>
+ * Example usage:<pre><code>
+// Simple call to update the text
+statusBar.setStatus('New status');
+
+// Set the status and icon, auto-clearing with default options:
+statusBar.setStatus({
+ text: 'New status',
+ iconCls: 'x-status-custom',
+ clear: true
+});
+
+// Auto-clear with custom options:
+statusBar.setStatus({
+ text: 'New status',
+ iconCls: 'x-status-custom',
+ clear: {
+ wait: 8000,
+ anim: false,
+ useDefaults: false
+ }
+});
+</code></pre>
+ * @return {Ext.ux.StatusBar} this
+ */
+ setStatus: function(o) {
+ o = o || {};
+
+ if (typeof o == 'string') {
+ o = { text: o };
+ }
+ if (o.text !== undefined) {
+ this.setText(o.text);
+ }
+ if (o.iconCls !== undefined) {
+ this.setIcon(o.iconCls);
+ }
+
+ if (o.clear) {
+ var c = o.clear,
+ wait = this.autoClear,
+ defaults = { useDefaults: true, anim: true };
+
+ if (typeof c == 'object') {
+ c = Ext.applyIf(c, defaults);
+ if (c.wait) {
+ wait = c.wait;
+ }
+ } else if (typeof c == 'number') {
+ wait = c;
+ c = defaults;
+ } else if (typeof c == 'boolean') {
+ c = defaults;
+ }
+
+ c.threadId = this.activeThreadId;
+ this.clearStatus.defer(wait, this, [c]);
+ }
+ return this;
+ },
+
+ /**
+ * Clears the status {@link #text} and {@link #iconCls}. Also supports clearing via an optional fade out animation.
+ * @param {Object} config (optional) A config object containing any or all of the following properties. If this
+ * object is not specified the status will be cleared using the defaults below:<ul>
+ * <li><tt>anim</tt> {Boolean} : (optional) True to clear the status by fading out the status element (defaults
+ * to false which clears immediately).</li>
+ * <li><tt>useDefaults</tt> {Boolean} : (optional) True to reset the text and icon using {@link #defaultText} and
+ * {@link #defaultIconCls} (defaults to false which sets the text to '' and removes any existing icon class).</li>
+ * </ul>
+ * @return {Ext.ux.StatusBar} this
+ */
+ clearStatus: function(o) {
+ o = o || {};
+
+ if (o.threadId && o.threadId !== this.activeThreadId) {
+ // this means the current call was made internally, but a newer
+ // thread has set a message since this call was deferred. Since
+ // we don't want to overwrite a newer message just ignore.
+ return this;
+ }
+
+ var text = o.useDefaults ? this.defaultText : this.emptyText,
+ iconCls = o.useDefaults
+ ? this.defaultIconCls
+ ? this.defaultIconCls
+ : ''
+ : '';
+
+ if (o.anim) {
+ // animate the statusEl Ext.Element
+ this.statusEl.el.fadeOut({
+ remove: false,
+ useDisplay: true,
+ scope: this,
+ callback: function() {
+ this.setStatus({
+ text: text,
+ iconCls: iconCls,
+ });
+
+ this.statusEl.el.show();
+ },
+ });
+ } else {
+ // hide/show the el to avoid jumpy text or icon
+ this.statusEl.hide();
+ this.setStatus({
+ text: text,
+ iconCls: iconCls,
+ });
+ this.statusEl.show();
+ }
+ return this;
+ },
+
+ /**
+ * Convenience method for setting the status text directly. For more flexible options see {@link #setStatus}.
+ * @param {String} text (optional) The text to set (defaults to '')
+ * @return {Ext.ux.StatusBar} this
+ */
+ setText: function(text) {
+ this.activeThreadId++;
+ this.text = text || '';
+ if (this.rendered) {
+ this.statusEl.setText(this.text);
+ }
+ return this;
+ },
+
+ /**
+ * Returns the current status text.
+ * @return {String} The status text
+ */
+ getText: function() {
+ return this.text;
+ },
+
+ /**
+ * Convenience method for setting the status icon directly. For more flexible options see {@link #setStatus}.
+ * See {@link #iconCls} for complete details about customizing the icon.
+ * @param {String} iconCls (optional) The icon class to set (defaults to '', and any current icon class is removed)
+ * @return {Ext.ux.StatusBar} this
+ */
+ setIcon: function(cls) {
+ this.activeThreadId++;
+ cls = cls || '';
+
+ if (this.rendered) {
+ if (this.currIconCls) {
+ this.statusEl.removeClass(this.currIconCls);
+ this.currIconCls = null;
+ }
+ if (cls.length > 0) {
+ this.statusEl.addClass(cls);
+ this.currIconCls = cls;
+ }
+ } else {
+ this.currIconCls = cls;
+ }
+ return this;
+ },
+
+ /**
+ * Convenience method for setting the status text and icon to special values that are pre-configured to indicate
+ * a "busy" state, usually for loading or processing activities.
+ * @param {Object/String} config (optional) A config object in the same format supported by {@link #setStatus}, or a
+ * string to use as the status text (in which case all other options for setStatus will be defaulted). Use the
+ * <tt>text</tt> and/or <tt>iconCls</tt> properties on the config to override the default {@link #busyText}
+ * and {@link #busyIconCls} settings. If the config argument is not specified, {@link #busyText} and
+ * {@link #busyIconCls} will be used in conjunction with all of the default options for {@link #setStatus}.
+ * @return {Ext.ux.StatusBar} this
+ */
+ showBusy: function(o) {
+ if (typeof o == 'string') {
+ o = { text: o };
+ }
+ o = Ext.applyIf(o || {}, {
+ text: this.busyText,
+ iconCls: this.busyIconCls,
+ });
+ return this.setStatus(o);
+ },
+});
+Ext.reg('statusbar', Ext.ux.StatusBar);
diff --git a/deluge/ui/web/js/extjs/ext-extensions/JSLoader.js b/deluge/ui/web/js/extjs/ext-extensions/JSLoader.js
new file mode 100644
index 0000000..9631fd8
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/JSLoader.js
@@ -0,0 +1,40 @@
+Ext.ux.JSLoader = function(options) {
+ Ext.ux.JSLoader.scripts[++Ext.ux.JSLoader.index] = {
+ url: options.url,
+ success: true,
+ jsLoadObj: null,
+ options: options,
+ onLoad: options.onLoad || Ext.emptyFn,
+ onError: options.onError || Ext.ux.JSLoader.stdError,
+ scope: options.scope || this,
+ };
+
+ Ext.Ajax.request({
+ url: options.url,
+ scriptIndex: Ext.ux.JSLoader.index,
+ success: function(response, options) {
+ var script = Ext.ux.JSLoader.scripts[options.scriptIndex];
+ try {
+ eval(response.responseText);
+ } catch (e) {
+ script.success = false;
+ script.onError(script.options, e);
+ }
+ if (script.success) {
+ script.onLoad.call(script.scope, script.options);
+ }
+ },
+ failure: function(response, options) {
+ var script = Ext.ux.JSLoader.scripts[options.scriptIndex];
+ script.success = false;
+ script.onError(script.options, response.status);
+ },
+ });
+};
+Ext.ux.JSLoader.index = 0;
+Ext.ux.JSLoader.scripts = [];
+Ext.ux.JSLoader.stdError = function(options, e) {
+ window.alert(
+ 'Error loading script:\n\n' + options.url + '\n\nstatus: ' + e
+ );
+};
diff --git a/deluge/ui/web/js/extjs/ext-extensions/Spinner.js b/deluge/ui/web/js/extjs/ext-extensions/Spinner.js
new file mode 100644
index 0000000..ff272d2
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/Spinner.js
@@ -0,0 +1,474 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/**
+ * @class Ext.ux.Spinner
+ * @extends Ext.util.Observable
+ * Creates a Spinner control utilized by Ext.ux.form.SpinnerField
+ */
+Ext.ux.Spinner = Ext.extend(Ext.util.Observable, {
+ incrementValue: 1,
+ alternateIncrementValue: 5,
+ triggerClass: 'x-form-spinner-trigger',
+ splitterClass: 'x-form-spinner-splitter',
+ alternateKey: Ext.EventObject.shiftKey,
+ defaultValue: 0,
+ accelerate: false,
+
+ constructor: function(config) {
+ Ext.ux.Spinner.superclass.constructor.call(this, config);
+ Ext.apply(this, config);
+ this.mimicing = false;
+ },
+
+ init: function(field) {
+ this.field = field;
+
+ field.afterMethod('onRender', this.doRender, this);
+ field.afterMethod('onEnable', this.doEnable, this);
+ field.afterMethod('onDisable', this.doDisable, this);
+ field.afterMethod('afterRender', this.doAfterRender, this);
+ field.afterMethod('onResize', this.doResize, this);
+ field.afterMethod('onFocus', this.doFocus, this);
+ field.beforeMethod('onDestroy', this.doDestroy, this);
+ },
+
+ doRender: function(ct, position) {
+ var el = (this.el = this.field.getEl());
+ var f = this.field;
+
+ if (!f.wrap) {
+ f.wrap = this.wrap = el.wrap({
+ cls: 'x-form-field-wrap',
+ });
+ } else {
+ this.wrap = f.wrap.addClass('x-form-field-wrap');
+ }
+
+ this.trigger = this.wrap.createChild({
+ tag: 'img',
+ src: Ext.BLANK_IMAGE_URL,
+ cls: 'x-form-trigger ' + this.triggerClass,
+ });
+
+ if (!f.width) {
+ this.wrap.setWidth(el.getWidth() + this.trigger.getWidth());
+ }
+
+ this.splitter = this.wrap.createChild({
+ tag: 'div',
+ cls: this.splitterClass,
+ style: 'width:13px; height:2px;',
+ });
+ this.splitter
+ .setRight(Ext.isIE ? 1 : 2)
+ .setTop(10)
+ .show();
+
+ this.proxy = this.trigger.createProxy('', this.splitter, true);
+ this.proxy.addClass('x-form-spinner-proxy');
+ this.proxy.setStyle('left', '0px');
+ this.proxy.setSize(14, 1);
+ this.proxy.hide();
+ this.dd = new Ext.dd.DDProxy(this.splitter.dom.id, 'SpinnerDrag', {
+ dragElId: this.proxy.id,
+ });
+
+ this.initTrigger();
+ this.initSpinner();
+ },
+
+ doAfterRender: function() {
+ var y;
+ if (Ext.isIE && this.el.getY() != (y = this.trigger.getY())) {
+ this.el.position();
+ this.el.setY(y);
+ }
+ },
+
+ doEnable: function() {
+ if (this.wrap) {
+ this.disabled = false;
+ this.wrap.removeClass(this.field.disabledClass);
+ }
+ },
+
+ doDisable: function() {
+ if (this.wrap) {
+ this.disabled = true;
+ this.wrap.addClass(this.field.disabledClass);
+ this.el.removeClass(this.field.disabledClass);
+ }
+ },
+
+ doResize: function(w, h) {
+ if (typeof w == 'number') {
+ this.el.setWidth(w - this.trigger.getWidth());
+ }
+ this.wrap.setWidth(this.el.getWidth() + this.trigger.getWidth());
+ },
+
+ doFocus: function() {
+ if (!this.mimicing) {
+ this.wrap.addClass('x-trigger-wrap-focus');
+ this.mimicing = true;
+ Ext.get(Ext.isIE ? document.body : document).on(
+ 'mousedown',
+ this.mimicBlur,
+ this,
+ {
+ delay: 10,
+ }
+ );
+ this.el.on('keydown', this.checkTab, this);
+ }
+ },
+
+ // private
+ checkTab: function(e) {
+ if (e.getKey() == e.TAB) {
+ this.triggerBlur();
+ }
+ },
+
+ // private
+ mimicBlur: function(e) {
+ if (!this.wrap.contains(e.target) && this.field.validateBlur(e)) {
+ this.triggerBlur();
+ }
+ },
+
+ // private
+ triggerBlur: function() {
+ this.mimicing = false;
+ Ext.get(Ext.isIE ? document.body : document).un(
+ 'mousedown',
+ this.mimicBlur,
+ this
+ );
+ this.el.un('keydown', this.checkTab, this);
+ this.field.beforeBlur();
+ this.wrap.removeClass('x-trigger-wrap-focus');
+ this.field.onBlur.call(this.field);
+ },
+
+ initTrigger: function() {
+ this.trigger.addClassOnOver('x-form-trigger-over');
+ this.trigger.addClassOnClick('x-form-trigger-click');
+ },
+
+ initSpinner: function() {
+ this.field.addEvents({
+ spin: true,
+ spinup: true,
+ spindown: true,
+ });
+
+ this.keyNav = new Ext.KeyNav(this.el, {
+ up: function(e) {
+ e.preventDefault();
+ this.onSpinUp();
+ },
+
+ down: function(e) {
+ e.preventDefault();
+ this.onSpinDown();
+ },
+
+ pageUp: function(e) {
+ e.preventDefault();
+ this.onSpinUpAlternate();
+ },
+
+ pageDown: function(e) {
+ e.preventDefault();
+ this.onSpinDownAlternate();
+ },
+
+ scope: this,
+ });
+
+ this.repeater = new Ext.util.ClickRepeater(this.trigger, {
+ accelerate: this.accelerate,
+ });
+ this.field.mon(this.repeater, 'click', this.onTriggerClick, this, {
+ preventDefault: true,
+ });
+
+ this.field.mon(this.trigger, {
+ mouseover: this.onMouseOver,
+ mouseout: this.onMouseOut,
+ mousemove: this.onMouseMove,
+ mousedown: this.onMouseDown,
+ mouseup: this.onMouseUp,
+ scope: this,
+ preventDefault: true,
+ });
+
+ this.field.mon(this.wrap, 'mousewheel', this.handleMouseWheel, this);
+
+ this.dd.setXConstraint(0, 0, 10);
+ this.dd.setYConstraint(1500, 1500, 10);
+ this.dd.endDrag = this.endDrag.createDelegate(this);
+ this.dd.startDrag = this.startDrag.createDelegate(this);
+ this.dd.onDrag = this.onDrag.createDelegate(this);
+ },
+
+ onMouseOver: function() {
+ if (this.disabled) {
+ return;
+ }
+ var middle = this.getMiddle();
+ this.tmpHoverClass =
+ Ext.EventObject.getPageY() < middle
+ ? 'x-form-spinner-overup'
+ : 'x-form-spinner-overdown';
+ this.trigger.addClass(this.tmpHoverClass);
+ },
+
+ //private
+ onMouseOut: function() {
+ this.trigger.removeClass(this.tmpHoverClass);
+ },
+
+ //private
+ onMouseMove: function() {
+ if (this.disabled) {
+ return;
+ }
+ var middle = this.getMiddle();
+ if (
+ (Ext.EventObject.getPageY() > middle &&
+ this.tmpHoverClass == 'x-form-spinner-overup') ||
+ (Ext.EventObject.getPageY() < middle &&
+ this.tmpHoverClass == 'x-form-spinner-overdown')
+ ) {
+ }
+ },
+
+ //private
+ onMouseDown: function() {
+ if (this.disabled) {
+ return;
+ }
+ var middle = this.getMiddle();
+ this.tmpClickClass =
+ Ext.EventObject.getPageY() < middle
+ ? 'x-form-spinner-clickup'
+ : 'x-form-spinner-clickdown';
+ this.trigger.addClass(this.tmpClickClass);
+ },
+
+ //private
+ onMouseUp: function() {
+ this.trigger.removeClass(this.tmpClickClass);
+ },
+
+ //private
+ onTriggerClick: function() {
+ if (this.disabled || this.el.dom.readOnly) {
+ return;
+ }
+ var middle = this.getMiddle();
+ var ud = Ext.EventObject.getPageY() < middle ? 'Up' : 'Down';
+ this['onSpin' + ud]();
+ },
+
+ //private
+ getMiddle: function() {
+ var t = this.trigger.getTop();
+ var h = this.trigger.getHeight();
+ var middle = t + h / 2;
+ return middle;
+ },
+
+ //private
+ //checks if control is allowed to spin
+ isSpinnable: function() {
+ if (this.disabled || this.el.dom.readOnly) {
+ Ext.EventObject.preventDefault(); //prevent scrolling when disabled/readonly
+ return false;
+ }
+ return true;
+ },
+
+ handleMouseWheel: function(e) {
+ //disable scrolling when not focused
+ if (this.wrap.hasClass('x-trigger-wrap-focus') == false) {
+ return;
+ }
+
+ var delta = e.getWheelDelta();
+ if (delta > 0) {
+ this.onSpinUp();
+ e.stopEvent();
+ } else if (delta < 0) {
+ this.onSpinDown();
+ e.stopEvent();
+ }
+ },
+
+ //private
+ startDrag: function() {
+ this.proxy.show();
+ this._previousY = Ext.fly(this.dd.getDragEl()).getTop();
+ },
+
+ //private
+ endDrag: function() {
+ this.proxy.hide();
+ },
+
+ //private
+ onDrag: function() {
+ if (this.disabled) {
+ return;
+ }
+ var y = Ext.fly(this.dd.getDragEl()).getTop();
+ var ud = '';
+
+ if (this._previousY > y) {
+ ud = 'Up';
+ } //up
+ if (this._previousY < y) {
+ ud = 'Down';
+ } //down
+ if (ud != '') {
+ this['onSpin' + ud]();
+ }
+
+ this._previousY = y;
+ },
+
+ //private
+ onSpinUp: function() {
+ if (this.isSpinnable() == false) {
+ return;
+ }
+ if (Ext.EventObject.shiftKey == true) {
+ this.onSpinUpAlternate();
+ return;
+ } else {
+ this.spin(false, false);
+ }
+ this.field.fireEvent('spin', this);
+ this.field.fireEvent('spinup', this);
+ },
+
+ //private
+ onSpinDown: function() {
+ if (this.isSpinnable() == false) {
+ return;
+ }
+ if (Ext.EventObject.shiftKey == true) {
+ this.onSpinDownAlternate();
+ return;
+ } else {
+ this.spin(true, false);
+ }
+ this.field.fireEvent('spin', this);
+ this.field.fireEvent('spindown', this);
+ },
+
+ //private
+ onSpinUpAlternate: function() {
+ if (this.isSpinnable() == false) {
+ return;
+ }
+ this.spin(false, true);
+ this.field.fireEvent('spin', this);
+ this.field.fireEvent('spinup', this);
+ },
+
+ //private
+ onSpinDownAlternate: function() {
+ if (this.isSpinnable() == false) {
+ return;
+ }
+ this.spin(true, true);
+ this.field.fireEvent('spin', this);
+ this.field.fireEvent('spindown', this);
+ },
+
+ spin: function(down, alternate) {
+ var v = parseFloat(this.field.getValue());
+ var incr =
+ alternate == true
+ ? this.alternateIncrementValue
+ : this.incrementValue;
+ down == true ? (v -= incr) : (v += incr);
+
+ v = isNaN(v) ? this.defaultValue : v;
+ v = this.fixBoundries(v);
+ this.field.setRawValue(v);
+ },
+
+ fixBoundries: function(value) {
+ var v = value;
+
+ if (this.field.minValue != undefined && v < this.field.minValue) {
+ v = this.field.minValue;
+ }
+ if (this.field.maxValue != undefined && v > this.field.maxValue) {
+ v = this.field.maxValue;
+ }
+
+ return this.fixPrecision(v);
+ },
+
+ // private
+ fixPrecision: function(value) {
+ var nan = isNaN(value);
+ if (
+ !this.field.allowDecimals ||
+ this.field.decimalPrecision == -1 ||
+ nan ||
+ !value
+ ) {
+ return nan ? '' : value;
+ }
+ return parseFloat(
+ parseFloat(value).toFixed(this.field.decimalPrecision)
+ );
+ },
+
+ doDestroy: function() {
+ if (this.trigger) {
+ this.trigger.remove();
+ }
+ if (this.wrap) {
+ this.wrap.remove();
+ delete this.field.wrap;
+ }
+
+ if (this.splitter) {
+ this.splitter.remove();
+ }
+
+ if (this.dd) {
+ this.dd.unreg();
+ this.dd = null;
+ }
+
+ if (this.proxy) {
+ this.proxy.remove();
+ }
+
+ if (this.repeater) {
+ this.repeater.purgeListeners();
+ }
+ if (this.mimicing) {
+ Ext.get(Ext.isIE ? document.body : document).un(
+ 'mousedown',
+ this.mimicBlur,
+ this
+ );
+ }
+ },
+});
+
+//backwards compat
+Ext.form.Spinner = Ext.ux.Spinner;
diff --git a/deluge/ui/web/js/extjs/ext-extensions/StatusBar.js b/deluge/ui/web/js/extjs/ext-extensions/StatusBar.js
new file mode 100644
index 0000000..a12b8f9
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/StatusBar.js
@@ -0,0 +1,422 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/**
+ * @class Ext.ux.StatusBar
+ * <p>Basic status bar component that can be used as the bottom toolbar of any {@link Ext.Panel}. In addition to
+ * supporting the standard {@link Ext.Toolbar} interface for adding buttons, menus and other items, the StatusBar
+ * provides a greedy status element that can be aligned to either side and has convenient methods for setting the
+ * status text and icon. You can also indicate that something is processing using the {@link #showBusy} method.</p>
+ * <pre><code>
+new Ext.Panel({
+ title: 'StatusBar',
+ // etc.
+ bbar: new Ext.ux.StatusBar({
+ id: 'my-status',
+
+ // defaults to use when the status is cleared:
+ defaultText: 'Default status text',
+ defaultIconCls: 'default-icon',
+
+ // values to set initially:
+ text: 'Ready',
+ iconCls: 'ready-icon',
+
+ // any standard Toolbar items:
+ items: [{
+ text: 'A Button'
+ }, '-', 'Plain Text']
+ })
+});
+
+// Update the status bar later in code:
+var sb = Ext.getCmp('my-status');
+sb.setStatus({
+ text: 'OK',
+ iconCls: 'ok-icon',
+ clear: true // auto-clear after a set interval
+});
+
+// Set the status bar to show that something is processing:
+sb.showBusy();
+
+// processing....
+
+sb.clearStatus(); // once completeed
+</code></pre>
+ * @extends Ext.Toolbar
+ * @constructor
+ * Creates a new StatusBar
+ * @param {Object/Array} config A config object
+ */
+Ext.ux.StatusBar = Ext.extend(Ext.Toolbar, {
+ /**
+ * @cfg {String} statusAlign
+ * The alignment of the status element within the overall StatusBar layout. When the StatusBar is rendered,
+ * it creates an internal div containing the status text and icon. Any additional Toolbar items added in the
+ * StatusBar's {@link #items} config, or added via {@link #add} or any of the supported add* methods, will be
+ * rendered, in added order, to the opposite side. The status element is greedy, so it will automatically
+ * expand to take up all sapce left over by any other items. Example usage:
+ * <pre><code>
+// Create a left-aligned status bar containing a button,
+// separator and text item that will be right-aligned (default):
+new Ext.Panel({
+ title: 'StatusBar',
+ // etc.
+ bbar: new Ext.ux.StatusBar({
+ defaultText: 'Default status text',
+ id: 'status-id',
+ items: [{
+ text: 'A Button'
+ }, '-', 'Plain Text']
+ })
+});
+
+// By adding the statusAlign config, this will create the
+// exact same toolbar, except the status and toolbar item
+// layout will be reversed from the previous example:
+new Ext.Panel({
+ title: 'StatusBar',
+ // etc.
+ bbar: new Ext.ux.StatusBar({
+ defaultText: 'Default status text',
+ id: 'status-id',
+ statusAlign: 'right',
+ items: [{
+ text: 'A Button'
+ }, '-', 'Plain Text']
+ })
+});
+</code></pre>
+ */
+ /**
+ * @cfg {String} defaultText
+ * The default {@link #text} value. This will be used anytime the status bar is cleared with the
+ * <tt>useDefaults:true</tt> option (defaults to '').
+ */
+ /**
+ * @cfg {String} defaultIconCls
+ * The default {@link #iconCls} value (see the iconCls docs for additional details about customizing the icon).
+ * This will be used anytime the status bar is cleared with the <tt>useDefaults:true</tt> option (defaults to '').
+ */
+ /**
+ * @cfg {String} text
+ * A string that will be <b>initially</b> set as the status message. This string
+ * will be set as innerHTML (html tags are accepted) for the toolbar item.
+ * If not specified, the value set for <code>{@link #defaultText}</code>
+ * will be used.
+ */
+ /**
+ * @cfg {String} iconCls
+ * A CSS class that will be <b>initially</b> set as the status bar icon and is
+ * expected to provide a background image (defaults to '').
+ * Example usage:<pre><code>
+// Example CSS rule:
+.x-statusbar .x-status-custom {
+ padding-left: 25px;
+ background: transparent url(images/custom-icon.gif) no-repeat 3px 2px;
+}
+
+// Setting a default icon:
+var sb = new Ext.ux.StatusBar({
+ defaultIconCls: 'x-status-custom'
+});
+
+// Changing the icon:
+sb.setStatus({
+ text: 'New status',
+ iconCls: 'x-status-custom'
+});
+</code></pre>
+ */
+
+ /**
+ * @cfg {String} cls
+ * The base class applied to the containing element for this component on render (defaults to 'x-statusbar')
+ */
+ cls: 'x-statusbar',
+ /**
+ * @cfg {String} busyIconCls
+ * The default <code>{@link #iconCls}</code> applied when calling
+ * <code>{@link #showBusy}</code> (defaults to <tt>'x-status-busy'</tt>).
+ * It can be overridden at any time by passing the <code>iconCls</code>
+ * argument into <code>{@link #showBusy}</code>.
+ */
+ busyIconCls: 'x-status-busy',
+ /**
+ * @cfg {String} busyText
+ * The default <code>{@link #text}</code> applied when calling
+ * <code>{@link #showBusy}</code> (defaults to <tt>'Loading...'</tt>).
+ * It can be overridden at any time by passing the <code>text</code>
+ * argument into <code>{@link #showBusy}</code>.
+ */
+ busyText: 'Loading...',
+ /**
+ * @cfg {Number} autoClear
+ * The number of milliseconds to wait after setting the status via
+ * <code>{@link #setStatus}</code> before automatically clearing the status
+ * text and icon (defaults to <tt>5000</tt>). Note that this only applies
+ * when passing the <tt>clear</tt> argument to <code>{@link #setStatus}</code>
+ * since that is the only way to defer clearing the status. This can
+ * be overridden by specifying a different <tt>wait</tt> value in
+ * <code>{@link #setStatus}</code>. Calls to <code>{@link #clearStatus}</code>
+ * always clear the status bar immediately and ignore this value.
+ */
+ autoClear: 5000,
+
+ /**
+ * @cfg {String} emptyText
+ * The text string to use if no text has been set. Defaults to
+ * <tt>'&nbsp;'</tt>). If there are no other items in the toolbar using
+ * an empty string (<tt>''</tt>) for this value would end up in the toolbar
+ * height collapsing since the empty string will not maintain the toolbar
+ * height. Use <tt>''</tt> if the toolbar should collapse in height
+ * vertically when no text is specified and there are no other items in
+ * the toolbar.
+ */
+ emptyText: '&nbsp;',
+
+ // private
+ activeThreadId: 0,
+
+ // private
+ initComponent: function() {
+ if (this.statusAlign == 'right') {
+ this.cls += ' x-status-right';
+ }
+ Ext.ux.StatusBar.superclass.initComponent.call(this);
+ },
+
+ // private
+ afterRender: function() {
+ Ext.ux.StatusBar.superclass.afterRender.call(this);
+
+ var right = this.statusAlign == 'right';
+ this.currIconCls = this.iconCls || this.defaultIconCls;
+ this.statusEl = new Ext.Toolbar.TextItem({
+ cls: 'x-status-text ' + (this.currIconCls || ''),
+ text: this.text || this.defaultText || '',
+ });
+
+ if (right) {
+ this.add('->');
+ this.add(this.statusEl);
+ } else {
+ this.insert(0, this.statusEl);
+ this.insert(1, '->');
+ }
+ this.doLayout();
+ },
+
+ /**
+ * Sets the status {@link #text} and/or {@link #iconCls}. Also supports automatically clearing the
+ * status that was set after a specified interval.
+ * @param {Object/String} config A config object specifying what status to set, or a string assumed
+ * to be the status text (and all other options are defaulted as explained below). A config
+ * object containing any or all of the following properties can be passed:<ul>
+ * <li><tt>text</tt> {String} : (optional) The status text to display. If not specified, any current
+ * status text will remain unchanged.</li>
+ * <li><tt>iconCls</tt> {String} : (optional) The CSS class used to customize the status icon (see
+ * {@link #iconCls} for details). If not specified, any current iconCls will remain unchanged.</li>
+ * <li><tt>clear</tt> {Boolean/Number/Object} : (optional) Allows you to set an internal callback that will
+ * automatically clear the status text and iconCls after a specified amount of time has passed. If clear is not
+ * specified, the new status will not be auto-cleared and will stay until updated again or cleared using
+ * {@link #clearStatus}. If <tt>true</tt> is passed, the status will be cleared using {@link #autoClear},
+ * {@link #defaultText} and {@link #defaultIconCls} via a fade out animation. If a numeric value is passed,
+ * it will be used as the callback interval (in milliseconds), overriding the {@link #autoClear} value.
+ * All other options will be defaulted as with the boolean option. To customize any other options,
+ * you can pass an object in the format:<ul>
+ * <li><tt>wait</tt> {Number} : (optional) The number of milliseconds to wait before clearing
+ * (defaults to {@link #autoClear}).</li>
+ * <li><tt>anim</tt> {Number} : (optional) False to clear the status immediately once the callback
+ * executes (defaults to true which fades the status out).</li>
+ * <li><tt>useDefaults</tt> {Number} : (optional) False to completely clear the status text and iconCls
+ * (defaults to true which uses {@link #defaultText} and {@link #defaultIconCls}).</li>
+ * </ul></li></ul>
+ * Example usage:<pre><code>
+// Simple call to update the text
+statusBar.setStatus('New status');
+
+// Set the status and icon, auto-clearing with default options:
+statusBar.setStatus({
+ text: 'New status',
+ iconCls: 'x-status-custom',
+ clear: true
+});
+
+// Auto-clear with custom options:
+statusBar.setStatus({
+ text: 'New status',
+ iconCls: 'x-status-custom',
+ clear: {
+ wait: 8000,
+ anim: false,
+ useDefaults: false
+ }
+});
+</code></pre>
+ * @return {Ext.ux.StatusBar} this
+ */
+ setStatus: function(o) {
+ o = o || {};
+
+ if (typeof o == 'string') {
+ o = { text: o };
+ }
+ if (o.text !== undefined) {
+ this.setText(o.text);
+ }
+ if (o.iconCls !== undefined) {
+ this.setIcon(o.iconCls);
+ }
+
+ if (o.clear) {
+ var c = o.clear,
+ wait = this.autoClear,
+ defaults = { useDefaults: true, anim: true };
+
+ if (typeof c == 'object') {
+ c = Ext.applyIf(c, defaults);
+ if (c.wait) {
+ wait = c.wait;
+ }
+ } else if (typeof c == 'number') {
+ wait = c;
+ c = defaults;
+ } else if (typeof c == 'boolean') {
+ c = defaults;
+ }
+
+ c.threadId = this.activeThreadId;
+ this.clearStatus.defer(wait, this, [c]);
+ }
+ return this;
+ },
+
+ /**
+ * Clears the status {@link #text} and {@link #iconCls}. Also supports clearing via an optional fade out animation.
+ * @param {Object} config (optional) A config object containing any or all of the following properties. If this
+ * object is not specified the status will be cleared using the defaults below:<ul>
+ * <li><tt>anim</tt> {Boolean} : (optional) True to clear the status by fading out the status element (defaults
+ * to false which clears immediately).</li>
+ * <li><tt>useDefaults</tt> {Boolean} : (optional) True to reset the text and icon using {@link #defaultText} and
+ * {@link #defaultIconCls} (defaults to false which sets the text to '' and removes any existing icon class).</li>
+ * </ul>
+ * @return {Ext.ux.StatusBar} this
+ */
+ clearStatus: function(o) {
+ o = o || {};
+
+ if (o.threadId && o.threadId !== this.activeThreadId) {
+ // this means the current call was made internally, but a newer
+ // thread has set a message since this call was deferred. Since
+ // we don't want to overwrite a newer message just ignore.
+ return this;
+ }
+
+ var text = o.useDefaults ? this.defaultText : this.emptyText,
+ iconCls = o.useDefaults
+ ? this.defaultIconCls
+ ? this.defaultIconCls
+ : ''
+ : '';
+
+ if (o.anim) {
+ // animate the statusEl Ext.Element
+ this.statusEl.el.fadeOut({
+ remove: false,
+ useDisplay: true,
+ scope: this,
+ callback: function() {
+ this.setStatus({
+ text: text,
+ iconCls: iconCls,
+ });
+
+ this.statusEl.el.show();
+ },
+ });
+ } else {
+ // hide/show the el to avoid jumpy text or icon
+ this.statusEl.hide();
+ this.setStatus({
+ text: text,
+ iconCls: iconCls,
+ });
+ this.statusEl.show();
+ }
+ return this;
+ },
+
+ /**
+ * Convenience method for setting the status text directly. For more flexible options see {@link #setStatus}.
+ * @param {String} text (optional) The text to set (defaults to '')
+ * @return {Ext.ux.StatusBar} this
+ */
+ setText: function(text) {
+ this.activeThreadId++;
+ this.text = text || '';
+ if (this.rendered) {
+ this.statusEl.setText(this.text);
+ }
+ return this;
+ },
+
+ /**
+ * Returns the current status text.
+ * @return {String} The status text
+ */
+ getText: function() {
+ return this.text;
+ },
+
+ /**
+ * Convenience method for setting the status icon directly. For more flexible options see {@link #setStatus}.
+ * See {@link #iconCls} for complete details about customizing the icon.
+ * @param {String} iconCls (optional) The icon class to set (defaults to '', and any current icon class is removed)
+ * @return {Ext.ux.StatusBar} this
+ */
+ setIcon: function(cls) {
+ this.activeThreadId++;
+ cls = cls || '';
+
+ if (this.rendered) {
+ if (this.currIconCls) {
+ this.statusEl.removeClass(this.currIconCls);
+ this.currIconCls = null;
+ }
+ if (cls.length > 0) {
+ this.statusEl.addClass(cls);
+ this.currIconCls = cls;
+ }
+ } else {
+ this.currIconCls = cls;
+ }
+ return this;
+ },
+
+ /**
+ * Convenience method for setting the status text and icon to special values that are pre-configured to indicate
+ * a "busy" state, usually for loading or processing activities.
+ * @param {Object/String} config (optional) A config object in the same format supported by {@link #setStatus}, or a
+ * string to use as the status text (in which case all other options for setStatus will be defaulted). Use the
+ * <tt>text</tt> and/or <tt>iconCls</tt> properties on the config to override the default {@link #busyText}
+ * and {@link #busyIconCls} settings. If the config argument is not specified, {@link #busyText} and
+ * {@link #busyIconCls} will be used in conjunction with all of the default options for {@link #setStatus}.
+ * @return {Ext.ux.StatusBar} this
+ */
+ showBusy: function(o) {
+ if (typeof o == 'string') {
+ o = { text: o };
+ }
+ o = Ext.applyIf(o || {}, {
+ text: this.busyText,
+ iconCls: this.busyIconCls,
+ });
+ return this.setStatus(o);
+ },
+});
+Ext.reg('statusbar', Ext.ux.StatusBar);
diff --git a/deluge/ui/web/js/extjs/ext-extensions/form/FileUploadField.js b/deluge/ui/web/js/extjs/ext-extensions/form/FileUploadField.js
new file mode 100644
index 0000000..ca15073
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/form/FileUploadField.js
@@ -0,0 +1,208 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+Ext.ns('Ext.ux.form');
+
+/**
+ * @class Ext.ux.form.FileUploadField
+ * @extends Ext.form.TextField
+ * Creates a file upload field.
+ * @xtype fileuploadfield
+ */
+Ext.ux.form.FileUploadField = Ext.extend(Ext.form.TextField, {
+ /**
+ * @cfg {String} buttonText The button text to display on the upload button (defaults to
+ * 'Browse...'). Note that if you supply a value for {@link #buttonCfg}, the buttonCfg.text
+ * value will be used instead if available.
+ */
+ buttonText: 'Browse...',
+ /**
+ * @cfg {Boolean} buttonOnly True to display the file upload field as a button with no visible
+ * text field (defaults to false). If true, all inherited TextField members will still be available.
+ */
+ buttonOnly: false,
+ /**
+ * @cfg {Number} buttonOffset The number of pixels of space reserved between the button and the text field
+ * (defaults to 3). Note that this only applies if {@link #buttonOnly} = false.
+ */
+ buttonOffset: 3,
+
+ /**
+ * @cfg {Boolean} multiple True to select more than one file. (defaults to false).
+ * Note that this only applies if the HTML doc is using HTML5.
+ */
+ multiple: false,
+
+ /**
+ * @cfg {Object} buttonCfg A standard {@link Ext.Button} config object.
+ */
+
+ // private
+ readOnly: true,
+
+ /**
+ * @hide
+ * @method autoSize
+ */
+ autoSize: Ext.emptyFn,
+
+ // private
+ initComponent: function() {
+ Ext.ux.form.FileUploadField.superclass.initComponent.call(this);
+
+ this.addEvents(
+ /**
+ * @event fileselected
+ * Fires when the underlying file input field's value has changed from the user
+ * selecting a new file from the system file selection dialog.
+ * @param {Ext.ux.form.FileUploadField} this
+ * @param {String} value The file value returned by the underlying file input field
+ */
+ 'fileselected'
+ );
+ },
+
+ // private
+ onRender: function(ct, position) {
+ Ext.ux.form.FileUploadField.superclass.onRender.call(
+ this,
+ ct,
+ position
+ );
+
+ this.wrap = this.el.wrap({ cls: 'x-form-field-wrap x-form-file-wrap' });
+ this.el.addClass('x-form-file-text');
+ this.el.dom.removeAttribute('name');
+ this.createFileInput();
+
+ var btnCfg = Ext.applyIf(this.buttonCfg || {}, {
+ text: this.buttonText,
+ });
+ this.button = new Ext.Button(
+ Ext.apply(btnCfg, {
+ renderTo: this.wrap,
+ cls: 'x-form-file-btn' + (btnCfg.iconCls ? ' x-btn-icon' : ''),
+ })
+ );
+
+ if (this.buttonOnly) {
+ this.el.hide();
+ this.wrap.setWidth(this.button.getEl().getWidth());
+ }
+
+ this.bindListeners();
+ this.resizeEl = this.positionEl = this.wrap;
+ },
+
+ bindListeners: function() {
+ this.fileInput.on({
+ scope: this,
+ mouseenter: function() {
+ this.button.addClass(['x-btn-over', 'x-btn-focus']);
+ },
+ mouseleave: function() {
+ this.button.removeClass([
+ 'x-btn-over',
+ 'x-btn-focus',
+ 'x-btn-click',
+ ]);
+ },
+ mousedown: function() {
+ this.button.addClass('x-btn-click');
+ },
+ mouseup: function() {
+ this.button.removeClass([
+ 'x-btn-over',
+ 'x-btn-focus',
+ 'x-btn-click',
+ ]);
+ },
+ change: function() {
+ var value = this.fileInput.dom.files;
+ // Fallback to value.
+ if (!value) value = this.fileInput.dom.value;
+ this.setValue(value);
+ this.fireEvent('fileselected', this, value);
+ },
+ });
+ },
+
+ createFileInput: function() {
+ this.fileInput = this.wrap.createChild({
+ id: this.getFileInputId(),
+ name: this.name || this.getId(),
+ cls: 'x-form-file',
+ tag: 'input',
+ type: 'file',
+ size: 1,
+ });
+ this.fileInput.dom.multiple = this.multiple;
+ },
+
+ reset: function() {
+ if (this.rendered) {
+ this.fileInput.remove();
+ this.createFileInput();
+ this.bindListeners();
+ }
+ Ext.ux.form.FileUploadField.superclass.reset.call(this);
+ },
+
+ // private
+ getFileInputId: function() {
+ return this.id + '-file';
+ },
+
+ // private
+ onResize: function(w, h) {
+ Ext.ux.form.FileUploadField.superclass.onResize.call(this, w, h);
+
+ this.wrap.setWidth(w);
+
+ if (!this.buttonOnly) {
+ var w =
+ this.wrap.getWidth() -
+ this.button.getEl().getWidth() -
+ this.buttonOffset;
+ this.el.setWidth(w);
+ }
+ },
+
+ // private
+ onDestroy: function() {
+ Ext.ux.form.FileUploadField.superclass.onDestroy.call(this);
+ Ext.destroy(this.fileInput, this.button, this.wrap);
+ },
+
+ onDisable: function() {
+ Ext.ux.form.FileUploadField.superclass.onDisable.call(this);
+ this.doDisable(true);
+ },
+
+ onEnable: function() {
+ Ext.ux.form.FileUploadField.superclass.onEnable.call(this);
+ this.doDisable(false);
+ },
+
+ // private
+ doDisable: function(disabled) {
+ this.fileInput.dom.disabled = disabled;
+ this.button.setDisabled(disabled);
+ },
+
+ // private
+ preFocus: Ext.emptyFn,
+
+ // private
+ alignErrorIcon: function() {
+ this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]);
+ },
+});
+
+Ext.reg('fileuploadfield', Ext.ux.form.FileUploadField);
+
+// backwards compat
+Ext.form.FileUploadField = Ext.ux.form.FileUploadField;
diff --git a/deluge/ui/web/js/extjs/ext-extensions/form/RadioGroupFix.js b/deluge/ui/web/js/extjs/ext-extensions/form/RadioGroupFix.js
new file mode 100644
index 0000000..134e7a1
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/form/RadioGroupFix.js
@@ -0,0 +1,50 @@
+/**
+ * Ext.ux.form.RadioGroup.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+// Allow radiogroups to be treated as a single form element.
+Ext.override(Ext.form.RadioGroup, {
+ afterRender: function() {
+ this.items.each(function(i) {
+ this.relayEvents(i, ['check']);
+ }, this);
+ if (this.lazyValue) {
+ this.setValue(this.value);
+ delete this.value;
+ delete this.lazyValue;
+ }
+ Ext.form.RadioGroup.superclass.afterRender.call(this);
+ },
+
+ getName: function() {
+ return this.items.first().getName();
+ },
+
+ getValue: function() {
+ return this.items.first().getGroupValue();
+ },
+
+ setValue: function(v) {
+ if (!this.items.each) {
+ this.value = v;
+ this.lazyValue = true;
+ return;
+ }
+ this.items.each(function(item) {
+ if (item.rendered) {
+ var checked = item.el.getValue() == String(v);
+ item.el.dom.checked = checked;
+ item.el.dom.defaultChecked = checked;
+ item.wrap[checked ? 'addClass' : 'removeClass'](
+ item.checkedCls
+ );
+ }
+ });
+ },
+});
diff --git a/deluge/ui/web/js/extjs/ext-extensions/form/SpinnerField.js b/deluge/ui/web/js/extjs/ext-extensions/form/SpinnerField.js
new file mode 100644
index 0000000..d14f320
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/form/SpinnerField.js
@@ -0,0 +1,68 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+Ext.ns('Ext.ux.form');
+
+/**
+ * @class Ext.ux.form.SpinnerField
+ * @extends Ext.form.NumberField
+ * Creates a field utilizing Ext.ux.Spinner
+ * @xtype spinnerfield
+ */
+Ext.ux.form.SpinnerField = Ext.extend(Ext.form.NumberField, {
+ actionMode: 'wrap',
+ deferHeight: true,
+ autoSize: Ext.emptyFn,
+ onBlur: Ext.emptyFn,
+ adjustSize: Ext.BoxComponent.prototype.adjustSize,
+
+ constructor: function(config) {
+ var spinnerConfig = Ext.copyTo(
+ {},
+ config,
+ 'incrementValue,alternateIncrementValue,accelerate,defaultValue,triggerClass,splitterClass'
+ );
+
+ var spl = (this.spinner = new Ext.ux.Spinner(spinnerConfig));
+
+ var plugins = config.plugins
+ ? Ext.isArray(config.plugins)
+ ? config.plugins.push(spl)
+ : [config.plugins, spl]
+ : spl;
+
+ Ext.ux.form.SpinnerField.superclass.constructor.call(
+ this,
+ Ext.apply(config, { plugins: plugins })
+ );
+ },
+
+ // private
+ getResizeEl: function() {
+ return this.wrap;
+ },
+
+ // private
+ getPositionEl: function() {
+ return this.wrap;
+ },
+
+ // private
+ alignErrorIcon: function() {
+ if (this.wrap) {
+ this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]);
+ }
+ },
+
+ validateBlur: function() {
+ return true;
+ },
+});
+
+Ext.reg('spinnerfield', Ext.ux.form.SpinnerField);
+
+//backwards compat
+Ext.form.SpinnerField = Ext.ux.form.SpinnerField;
diff --git a/deluge/ui/web/js/extjs/ext-extensions/form/SpinnerFieldFix.js b/deluge/ui/web/js/extjs/ext-extensions/form/SpinnerFieldFix.js
new file mode 100644
index 0000000..6784ae0
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/form/SpinnerFieldFix.js
@@ -0,0 +1,13 @@
+/**
+ * Ext.ux.form.SpinnerField.js
+ *
+ * Copyright (c) Damien Churchill 2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.override(Ext.ux.form.SpinnerField, {
+ onBlur: Ext.form.Field.prototype.onBlur,
+});
diff --git a/deluge/ui/web/js/extjs/ext-extensions/form/SpinnerGroup.js b/deluge/ui/web/js/extjs/ext-extensions/form/SpinnerGroup.js
new file mode 100644
index 0000000..eafc4e1
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/form/SpinnerGroup.js
@@ -0,0 +1,206 @@
+/**
+ * Ext.ux.form.SpinnerGroup.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.ns('Ext.ux.form');
+
+/**
+ *
+ */
+Ext.ux.form.SpinnerGroup = Ext.extend(Ext.form.CheckboxGroup, {
+ // private
+ defaultType: 'spinnerfield',
+ anchor: '98%',
+
+ // private
+ groupCls: 'x-form-spinner-group',
+
+ colCfg: {},
+
+ // private
+ onRender: function(ct, position) {
+ if (!this.el) {
+ var panelCfg = {
+ cls: this.groupCls,
+ layout: 'column',
+ border: false,
+ renderTo: ct,
+ };
+ var colCfg = Ext.apply(
+ {
+ defaultType: this.defaultType,
+ layout: 'form',
+ border: false,
+ labelWidth: 60,
+ defaults: {
+ hideLabel: true,
+ anchor: '60%',
+ },
+ },
+ this.colCfg
+ );
+
+ if (this.items[0].items) {
+ // The container has standard ColumnLayout configs, so pass them in directly
+
+ Ext.apply(panelCfg, {
+ layoutConfig: { columns: this.items.length },
+ defaults: this.defaults,
+ items: this.items,
+ });
+ for (var i = 0, len = this.items.length; i < len; i++) {
+ Ext.applyIf(this.items[i], colCfg);
+ }
+ } else {
+ // The container has field item configs, so we have to generate the column
+ // panels first then move the items into the columns as needed.
+
+ var numCols,
+ cols = [];
+
+ if (typeof this.columns == 'string') {
+ // 'auto' so create a col per item
+ this.columns = this.items.length;
+ }
+ if (!Ext.isArray(this.columns)) {
+ var cs = [];
+ for (var i = 0; i < this.columns; i++) {
+ cs.push((100 / this.columns) * 0.01); // distribute by even %
+ }
+ this.columns = cs;
+ }
+
+ numCols = this.columns.length;
+
+ // Generate the column configs with the correct width setting
+ for (var i = 0; i < numCols; i++) {
+ var cc = Ext.apply({ items: [] }, colCfg);
+ cc[
+ this.columns[i] <= 1 ? 'columnWidth' : 'width'
+ ] = this.columns[i];
+ if (this.defaults) {
+ cc.defaults = Ext.apply(
+ cc.defaults || {},
+ this.defaults
+ );
+ }
+ cols.push(cc);
+ }
+
+ // Distribute the original items into the columns
+ if (this.vertical) {
+ var rows = Math.ceil(this.items.length / numCols),
+ ri = 0;
+ for (var i = 0, len = this.items.length; i < len; i++) {
+ if (i > 0 && i % rows == 0) {
+ ri++;
+ }
+ if (this.items[i].fieldLabel) {
+ this.items[i].hideLabel = false;
+ }
+ cols[ri].items.push(this.items[i]);
+ }
+ } else {
+ for (var i = 0, len = this.items.length; i < len; i++) {
+ var ci = i % numCols;
+ if (this.items[i].fieldLabel) {
+ this.items[i].hideLabel = false;
+ }
+ cols[ci].items.push(this.items[i]);
+ }
+ }
+
+ Ext.apply(panelCfg, {
+ layoutConfig: { columns: numCols },
+ items: cols,
+ });
+ }
+
+ this.panel = new Ext.Panel(panelCfg);
+ this.el = this.panel.getEl();
+
+ if (this.forId && this.itemCls) {
+ var l = this.el.up(this.itemCls).child('label', true);
+ if (l) {
+ l.setAttribute('htmlFor', this.forId);
+ }
+ }
+
+ var fields = this.panel.findBy(function(c) {
+ return c.isFormField;
+ }, this);
+
+ this.items = new Ext.util.MixedCollection();
+ this.items.addAll(fields);
+
+ this.items.each(function(field) {
+ field.on('spin', this.onFieldChange, this);
+ field.on('change', this.onFieldChange, this);
+ }, this);
+
+ if (this.lazyValueSet) {
+ this.setValue(this.value);
+ delete this.value;
+ delete this.lazyValueSet;
+ }
+
+ if (this.lazyRawValueSet) {
+ this.setRawValue(this.rawValue);
+ delete this.rawValue;
+ delete this.lazyRawValueSet;
+ }
+ }
+
+ Ext.ux.form.SpinnerGroup.superclass.onRender.call(this, ct, position);
+ },
+
+ onFieldChange: function(spinner) {
+ this.fireEvent('change', this, this.getValue());
+ },
+
+ initValue: Ext.emptyFn,
+
+ getValue: function() {
+ var value = [this.items.getCount()];
+ this.items.each(function(item, i) {
+ value[i] = Number(item.getValue());
+ });
+ return value;
+ },
+
+ getRawValue: function() {
+ var value = [this.items.getCount()];
+ this.items.each(function(item, i) {
+ value[i] = Number(item.getRawValue());
+ });
+ return value;
+ },
+
+ setValue: function(value) {
+ if (!this.rendered) {
+ this.value = value;
+ this.lazyValueSet = true;
+ } else {
+ this.items.each(function(item, i) {
+ item.setValue(value[i]);
+ });
+ }
+ },
+
+ setRawValue: function(value) {
+ if (!this.rendered) {
+ this.rawValue = value;
+ this.lazyRawValueSet = true;
+ } else {
+ this.items.each(function(item, i) {
+ item.setRawValue(value[i]);
+ });
+ }
+ },
+});
+Ext.reg('spinnergroup', Ext.ux.form.SpinnerGroup);
diff --git a/deluge/ui/web/js/extjs/ext-extensions/form/ToggleField.js b/deluge/ui/web/js/extjs/ext-extensions/form/ToggleField.js
new file mode 100644
index 0000000..27eebf3
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/form/ToggleField.js
@@ -0,0 +1,75 @@
+/**
+ * Ext.ux.form.ToggleField.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+Ext.namespace('Ext.ux.form');
+
+/**
+ * Ext.ux.form.ToggleField class
+ *
+ * @author Damien Churchill
+ * @version v0.1
+ *
+ * @class Ext.ux.form.ToggleField
+ * @extends Ext.form.TriggerField
+ */
+Ext.ux.form.ToggleField = Ext.extend(Ext.form.Field, {
+ cls: 'x-toggle-field',
+
+ initComponent: function() {
+ Ext.ux.form.ToggleField.superclass.initComponent.call(this);
+
+ this.toggle = new Ext.form.Checkbox();
+ this.toggle.on('check', this.onToggleCheck, this);
+
+ this.input = new Ext.form.TextField({
+ disabled: true,
+ });
+ },
+
+ onRender: function(ct, position) {
+ if (!this.el) {
+ this.panel = new Ext.Panel({
+ cls: this.groupCls,
+ layout: 'table',
+ layoutConfig: {
+ columns: 2,
+ },
+ border: false,
+ renderTo: ct,
+ });
+ this.panel.ownerCt = this;
+ this.el = this.panel.getEl();
+
+ this.panel.add(this.toggle);
+ this.panel.add(this.input);
+ this.panel.doLayout();
+
+ this.toggle
+ .getEl()
+ .parent()
+ .setStyle('padding-right', '10px');
+ }
+ Ext.ux.form.ToggleField.superclass.onRender.call(this, ct, position);
+ },
+
+ // private
+ onResize: function(w, h) {
+ this.panel.setSize(w, h);
+ this.panel.doLayout();
+
+ // we substract 10 for the padding :-)
+ var inputWidth = w - this.toggle.getSize().width - 25;
+ this.input.setSize(inputWidth, h);
+ },
+
+ onToggleCheck: function(toggle, checked) {
+ this.input.setDisabled(!checked);
+ },
+});
+Ext.reg('togglefield', Ext.ux.form.ToggleField);
diff --git a/deluge/ui/web/js/extjs/ext-extensions/grid/BufferView.js b/deluge/ui/web/js/extjs/ext-extensions/grid/BufferView.js
new file mode 100644
index 0000000..e9f0e0c
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/grid/BufferView.js
@@ -0,0 +1,270 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+Ext.ns('Ext.ux.grid');
+
+/**
+ * @class Ext.ux.grid.BufferView
+ * @extends Ext.grid.GridView
+ * A custom GridView which renders rows on an as-needed basis.
+ */
+Ext.ux.grid.BufferView = Ext.extend(Ext.grid.GridView, {
+ /**
+ * @cfg {Number} rowHeight
+ * The height of a row in the grid.
+ */
+ rowHeight: 19,
+
+ /**
+ * @cfg {Number} borderHeight
+ * The combined height of border-top and border-bottom of a row.
+ */
+ borderHeight: 2,
+
+ /**
+ * @cfg {Boolean/Number} scrollDelay
+ * The number of milliseconds before rendering rows out of the visible
+ * viewing area. Defaults to 100. Rows will render immediately with a config
+ * of false.
+ */
+ scrollDelay: 100,
+
+ /**
+ * @cfg {Number} cacheSize
+ * The number of rows to look forward and backwards from the currently viewable
+ * area. The cache applies only to rows that have been rendered already.
+ */
+ cacheSize: 20,
+
+ /**
+ * @cfg {Number} cleanDelay
+ * The number of milliseconds to buffer cleaning of extra rows not in the
+ * cache.
+ */
+ cleanDelay: 500,
+
+ initTemplates: function() {
+ Ext.ux.grid.BufferView.superclass.initTemplates.call(this);
+ var ts = this.templates;
+ // empty div to act as a place holder for a row
+ ts.rowHolder = new Ext.Template(
+ '<div class="x-grid3-row {alt}" style="{tstyle}"></div>'
+ );
+ ts.rowHolder.disableFormats = true;
+ ts.rowHolder.compile();
+
+ ts.rowBody = new Ext.Template(
+ '<table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',
+ '<tbody><tr>{cells}</tr>',
+ this.enableRowBody
+ ? '<tr class="x-grid3-row-body-tr" style="{bodyStyle}"><td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on"><div class="x-grid3-row-body">{body}</div></td></tr>'
+ : '',
+ '</tbody></table>'
+ );
+ ts.rowBody.disableFormats = true;
+ ts.rowBody.compile();
+ },
+
+ getStyleRowHeight: function() {
+ return Ext.isBorderBox
+ ? this.rowHeight + this.borderHeight
+ : this.rowHeight;
+ },
+
+ getCalculatedRowHeight: function() {
+ return this.rowHeight + this.borderHeight;
+ },
+
+ getVisibleRowCount: function() {
+ var rh = this.getCalculatedRowHeight(),
+ visibleHeight = this.scroller.dom.clientHeight;
+ return visibleHeight < 1 ? 0 : Math.ceil(visibleHeight / rh);
+ },
+
+ getVisibleRows: function() {
+ var count = this.getVisibleRowCount(),
+ sc = this.scroller.dom.scrollTop,
+ start =
+ sc === 0
+ ? 0
+ : Math.floor(sc / this.getCalculatedRowHeight()) - 1;
+ return {
+ first: Math.max(start, 0),
+ last: Math.min(start + count + 2, this.ds.getCount() - 1),
+ };
+ },
+
+ doRender: function(cs, rs, ds, startRow, colCount, stripe, onlyBody) {
+ var ts = this.templates,
+ ct = ts.cell,
+ rt = ts.row,
+ rb = ts.rowBody,
+ last = colCount - 1,
+ rh = this.getStyleRowHeight(),
+ vr = this.getVisibleRows(),
+ tstyle = 'width:' + this.getTotalWidth() + ';height:' + rh + 'px;',
+ // buffers
+ buf = [],
+ cb,
+ c,
+ p = {},
+ rp = { tstyle: tstyle },
+ r;
+ for (var j = 0, len = rs.length; j < len; j++) {
+ r = rs[j];
+ cb = [];
+ var rowIndex = j + startRow,
+ visible = rowIndex >= vr.first && rowIndex <= vr.last;
+ if (visible) {
+ for (var i = 0; i < colCount; i++) {
+ c = cs[i];
+ p.id = c.id;
+ p.css =
+ i === 0
+ ? 'x-grid3-cell-first '
+ : i == last
+ ? 'x-grid3-cell-last '
+ : '';
+ p.attr = p.cellAttr = '';
+ p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds);
+ p.style = c.style;
+ if (p.value === undefined || p.value === '') {
+ p.value = '&#160;';
+ }
+ if (r.dirty && typeof r.modified[c.name] !== 'undefined') {
+ p.css += ' x-grid3-dirty-cell';
+ }
+ cb[cb.length] = ct.apply(p);
+ }
+ }
+ var alt = [];
+ if (stripe && (rowIndex + 1) % 2 === 0) {
+ alt[0] = 'x-grid3-row-alt';
+ }
+ if (r.dirty) {
+ alt[1] = ' x-grid3-dirty-row';
+ }
+ rp.cols = colCount;
+ if (this.getRowClass) {
+ alt[2] = this.getRowClass(r, rowIndex, rp, ds);
+ }
+ rp.alt = alt.join(' ');
+ rp.cells = cb.join('');
+ buf[buf.length] = !visible
+ ? ts.rowHolder.apply(rp)
+ : onlyBody
+ ? rb.apply(rp)
+ : rt.apply(rp);
+ }
+ return buf.join('');
+ },
+
+ isRowRendered: function(index) {
+ var row = this.getRow(index);
+ return row && row.childNodes.length > 0;
+ },
+
+ syncScroll: function() {
+ Ext.ux.grid.BufferView.superclass.syncScroll.apply(this, arguments);
+ this.update();
+ },
+
+ // a (optionally) buffered method to update contents of gridview
+ update: function() {
+ if (this.scrollDelay) {
+ if (!this.renderTask) {
+ this.renderTask = new Ext.util.DelayedTask(this.doUpdate, this);
+ }
+ this.renderTask.delay(this.scrollDelay);
+ } else {
+ this.doUpdate();
+ }
+ },
+
+ onRemove: function(ds, record, index, isUpdate) {
+ Ext.ux.grid.BufferView.superclass.onRemove.apply(this, arguments);
+ if (isUpdate !== true) {
+ this.update();
+ }
+ },
+
+ doUpdate: function() {
+ if (this.getVisibleRowCount() > 0) {
+ var g = this.grid,
+ cm = g.colModel,
+ ds = g.store,
+ cs = this.getColumnData(),
+ vr = this.getVisibleRows(),
+ row;
+ for (var i = vr.first; i <= vr.last; i++) {
+ // if row is NOT rendered and is visible, render it
+ if (!this.isRowRendered(i) && (row = this.getRow(i))) {
+ var html = this.doRender(
+ cs,
+ [ds.getAt(i)],
+ ds,
+ i,
+ cm.getColumnCount(),
+ g.stripeRows,
+ true
+ );
+ row.innerHTML = html;
+ }
+ }
+ this.clean();
+ }
+ },
+
+ // a buffered method to clean rows
+ clean: function() {
+ if (!this.cleanTask) {
+ this.cleanTask = new Ext.util.DelayedTask(this.doClean, this);
+ }
+ this.cleanTask.delay(this.cleanDelay);
+ },
+
+ doClean: function() {
+ if (this.getVisibleRowCount() > 0) {
+ var vr = this.getVisibleRows();
+ vr.first -= this.cacheSize;
+ vr.last += this.cacheSize;
+
+ var i = 0,
+ rows = this.getRows();
+ // if first is less than 0, all rows have been rendered
+ // so lets clean the end...
+ if (vr.first <= 0) {
+ i = vr.last + 1;
+ }
+ for (var len = this.ds.getCount(); i < len; i++) {
+ // if current row is outside of first and last and
+ // has content, update the innerHTML to nothing
+ if ((i < vr.first || i > vr.last) && rows[i].innerHTML) {
+ rows[i].innerHTML = '';
+ }
+ }
+ }
+ },
+
+ removeTask: function(name) {
+ var task = this[name];
+ if (task && task.cancel) {
+ task.cancel();
+ this[name] = null;
+ }
+ },
+
+ destroy: function() {
+ this.removeTask('cleanTask');
+ this.removeTask('renderTask');
+ Ext.ux.grid.BufferView.superclass.destroy.call(this);
+ },
+
+ layout: function() {
+ Ext.ux.grid.BufferView.superclass.layout.call(this);
+ this.update();
+ },
+});
diff --git a/deluge/ui/web/js/extjs/ext-extensions/layout/FormLayoutFix.js b/deluge/ui/web/js/extjs/ext-extensions/layout/FormLayoutFix.js
new file mode 100644
index 0000000..14ac55a
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/layout/FormLayoutFix.js
@@ -0,0 +1,39 @@
+/**
+ * Ext.ux.layout.FormLayoutFix.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+// Taken from http://extjs.com/forum/showthread.php?t=75273
+// remove spaces for hidden elements and make show(), hide(), enable() and disable() act on
+// the label. don't use hideLabel with this.
+Ext.override(Ext.layout.FormLayout, {
+ renderItem: function(c, position, target) {
+ if (
+ c &&
+ !c.rendered &&
+ (c.isFormField || c.fieldLabel) &&
+ c.inputType != 'hidden'
+ ) {
+ var args = this.getTemplateArgs(c);
+ if (typeof position == 'number') {
+ position = target.dom.childNodes[position] || null;
+ }
+ if (position) {
+ c.formItem = this.fieldTpl.insertBefore(position, args, true);
+ } else {
+ c.formItem = this.fieldTpl.append(target, args, true);
+ }
+ c.actionMode = 'formItem';
+ c.render('x-form-el-' + c.id);
+ c.container = c.formItem;
+ c.actionMode = 'container';
+ } else {
+ Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments);
+ }
+ },
+});
diff --git a/deluge/ui/web/js/extjs/ext-extensions/tree/MultiSelectionModelFix.js b/deluge/ui/web/js/extjs/ext-extensions/tree/MultiSelectionModelFix.js
new file mode 100644
index 0000000..979bd2c
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/tree/MultiSelectionModelFix.js
@@ -0,0 +1,68 @@
+/**
+ * Ext.ux.tree.MultiSelectionModelFix.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+/**
+ * This enhances the MSM to allow for shift selecting in tree grids etc.
+ * @author Damien Churchill <damoxc@gmail.com>
+ */
+Ext.override(Ext.tree.MultiSelectionModel, {
+ onNodeClick: function(node, e) {
+ if (e.ctrlKey && this.isSelected(node)) {
+ this.unselect(node);
+ } else if (e.shiftKey && !this.isSelected(node)) {
+ var parentNode = node.parentNode;
+ // We can only shift select files in the same node
+ if (this.lastSelNode.parentNode.id != parentNode.id) return;
+
+ // Get the node indexes
+ var fi = parentNode.indexOf(node),
+ li = parentNode.indexOf(this.lastSelNode);
+
+ // Select the last clicked node and wipe old selections
+ this.select(this.lastSelNode, e, false, true);
+
+ // Swap the values if required
+ if (fi > li) {
+ (fi = fi + li), (li = fi - li), (fi = fi - li);
+ }
+
+ // Select all the nodes
+ parentNode.eachChild(function(n) {
+ var i = parentNode.indexOf(n);
+ if (fi < i && i < li) {
+ this.select(n, e, true, true);
+ }
+ }, this);
+
+ // Select the clicked node
+ this.select(node, e, true);
+ } else {
+ this.select(node, e, e.ctrlKey);
+ }
+ },
+
+ select: function(node, e, keepExisting, suppressEvent) {
+ if (keepExisting !== true) {
+ this.clearSelections(true);
+ }
+ if (this.isSelected(node)) {
+ this.lastSelNode = node;
+ return node;
+ }
+ this.selNodes.push(node);
+ this.selMap[node.id] = node;
+ this.lastSelNode = node;
+ node.ui.onSelectedChange(true);
+ if (suppressEvent !== true) {
+ this.fireEvent('selectionchange', this, this.selNodes);
+ }
+ return node;
+ },
+});
diff --git a/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGrid.js b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGrid.js
new file mode 100644
index 0000000..d3d5fc3
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGrid.js
@@ -0,0 +1,468 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+Ext.ns('Ext.ux.tree');
+
+/**
+ * @class Ext.ux.tree.TreeGrid
+ * @extends Ext.tree.TreePanel
+ *
+ * @xtype treegrid
+ */
+Ext.ux.tree.TreeGrid = Ext.extend(Ext.tree.TreePanel, {
+ rootVisible: false,
+ useArrows: true,
+ lines: false,
+ borderWidth: Ext.isBorderBox ? 0 : 2, // the combined left/right border for each cell
+ cls: 'x-treegrid',
+
+ columnResize: true,
+ enableSort: true,
+ reserveScrollOffset: true,
+ enableHdMenu: true,
+
+ columnsText: 'Columns',
+
+ initComponent: function() {
+ if (!this.root) {
+ this.root = new Ext.tree.AsyncTreeNode({ text: 'Root' });
+ }
+
+ // initialize the loader
+ var l = this.loader;
+ if (!l) {
+ l = new Ext.ux.tree.TreeGridLoader({
+ dataUrl: this.dataUrl,
+ requestMethod: this.requestMethod,
+ store: this.store,
+ });
+ } else if (Ext.isObject(l) && !l.load) {
+ l = new Ext.ux.tree.TreeGridLoader(l);
+ }
+ this.loader = l;
+
+ Ext.ux.tree.TreeGrid.superclass.initComponent.call(this);
+
+ this.initColumns();
+
+ if (this.enableSort) {
+ this.treeGridSorter = new Ext.ux.tree.TreeGridSorter(
+ this,
+ this.enableSort
+ );
+ }
+
+ if (this.columnResize) {
+ this.colResizer = new Ext.tree.ColumnResizer(this.columnResize);
+ this.colResizer.init(this);
+ }
+
+ var c = this.columns;
+ if (!this.internalTpl) {
+ this.internalTpl = new Ext.XTemplate(
+ '<div class="x-grid3-header">',
+ '<div class="x-treegrid-header-inner">',
+ '<div class="x-grid3-header-offset">',
+ '<table style="table-layout: fixed;" cellspacing="0" cellpadding="0" border="0"><colgroup><tpl for="columns"><col /></tpl></colgroup>',
+ '<thead><tr class="x-grid3-hd-row">',
+ '<tpl for="columns">',
+ '<td class="x-grid3-hd x-grid3-cell x-treegrid-hd" style="text-align: {align};" id="',
+ this.id,
+ '-xlhd-{#}">',
+ '<div class="x-grid3-hd-inner x-treegrid-hd-inner" unselectable="on">',
+ this.enableHdMenu
+ ? '<a class="x-grid3-hd-btn" href="#"></a>'
+ : '',
+ '{header}<img class="x-grid3-sort-icon" src="',
+ Ext.BLANK_IMAGE_URL,
+ '" />',
+ '</div>',
+ '</td></tpl>',
+ '</tr></thead>',
+ '</table>',
+ '</div></div>',
+ '</div>',
+ '<div class="x-treegrid-root-node">',
+ '<table class="x-treegrid-root-table" cellpadding="0" cellspacing="0" style="table-layout: fixed;"></table>',
+ '</div>'
+ );
+ }
+
+ if (!this.colgroupTpl) {
+ this.colgroupTpl = new Ext.XTemplate(
+ '<colgroup><tpl for="columns"><col style="width: {width}px"/></tpl></colgroup>'
+ );
+ }
+ },
+
+ initColumns: function() {
+ var cs = this.columns,
+ len = cs.length,
+ columns = [],
+ i,
+ c;
+
+ for (i = 0; i < len; i++) {
+ c = cs[i];
+ if (!c.isColumn) {
+ c.xtype = c.xtype
+ ? /^tg/.test(c.xtype)
+ ? c.xtype
+ : 'tg' + c.xtype
+ : 'tgcolumn';
+ c = Ext.create(c);
+ }
+ c.init(this);
+ columns.push(c);
+
+ if (this.enableSort !== false && c.sortable !== false) {
+ c.sortable = true;
+ this.enableSort = true;
+ }
+ }
+
+ this.columns = columns;
+ },
+
+ onRender: function() {
+ Ext.tree.TreePanel.superclass.onRender.apply(this, arguments);
+
+ this.el.addClass('x-treegrid');
+
+ this.outerCt = this.body.createChild({
+ cls:
+ 'x-tree-root-ct x-treegrid-ct ' +
+ (this.useArrows
+ ? 'x-tree-arrows'
+ : this.lines
+ ? 'x-tree-lines'
+ : 'x-tree-no-lines'),
+ });
+
+ this.internalTpl.overwrite(this.outerCt, { columns: this.columns });
+
+ this.mainHd = Ext.get(this.outerCt.dom.firstChild);
+ this.innerHd = Ext.get(this.mainHd.dom.firstChild);
+ this.innerBody = Ext.get(this.outerCt.dom.lastChild);
+ this.innerCt = Ext.get(this.innerBody.dom.firstChild);
+
+ this.colgroupTpl.insertFirst(this.innerCt, { columns: this.columns });
+
+ if (this.hideHeaders) {
+ this.el.child('.x-grid3-header').setDisplayed('none');
+ } else if (this.enableHdMenu !== false) {
+ this.hmenu = new Ext.menu.Menu({ id: this.id + '-hctx' });
+ if (this.enableColumnHide !== false) {
+ this.colMenu = new Ext.menu.Menu({
+ id: this.id + '-hcols-menu',
+ });
+ this.colMenu.on({
+ scope: this,
+ beforeshow: this.beforeColMenuShow,
+ itemclick: this.handleHdMenuClick,
+ });
+ this.hmenu.add({
+ itemId: 'columns',
+ hideOnClick: false,
+ text: this.columnsText,
+ menu: this.colMenu,
+ iconCls: 'x-cols-icon',
+ });
+ }
+ this.hmenu.on('itemclick', this.handleHdMenuClick, this);
+ }
+ },
+
+ setRootNode: function(node) {
+ node.attributes.uiProvider = Ext.ux.tree.TreeGridRootNodeUI;
+ node = Ext.ux.tree.TreeGrid.superclass.setRootNode.call(this, node);
+ if (this.innerCt) {
+ this.colgroupTpl.insertFirst(this.innerCt, {
+ columns: this.columns,
+ });
+ }
+ return node;
+ },
+
+ clearInnerCt: function() {
+ if (Ext.isIE) {
+ var dom = this.innerCt.dom;
+ while (dom.firstChild) {
+ dom.removeChild(dom.firstChild);
+ }
+ } else {
+ Ext.ux.tree.TreeGrid.superclass.clearInnerCt.call(this);
+ }
+ },
+
+ initEvents: function() {
+ Ext.ux.tree.TreeGrid.superclass.initEvents.apply(this, arguments);
+
+ this.mon(this.innerBody, 'scroll', this.syncScroll, this);
+ this.mon(this.innerHd, 'click', this.handleHdDown, this);
+ this.mon(this.mainHd, {
+ scope: this,
+ mouseover: this.handleHdOver,
+ mouseout: this.handleHdOut,
+ });
+ },
+
+ onResize: function(w, h) {
+ Ext.ux.tree.TreeGrid.superclass.onResize.apply(this, arguments);
+
+ var bd = this.innerBody.dom;
+ var hd = this.innerHd.dom;
+
+ if (!bd) {
+ return;
+ }
+
+ if (Ext.isNumber(h)) {
+ bd.style.height =
+ this.body.getHeight(true) - hd.offsetHeight + 'px';
+ }
+
+ if (Ext.isNumber(w)) {
+ var sw = Ext.num(this.scrollOffset, Ext.getScrollBarWidth());
+ if (
+ this.reserveScrollOffset ||
+ bd.offsetWidth - bd.clientWidth > 10
+ ) {
+ this.setScrollOffset(sw);
+ } else {
+ var me = this;
+ setTimeout(function() {
+ me.setScrollOffset(
+ bd.offsetWidth - bd.clientWidth > 10 ? sw : 0
+ );
+ }, 10);
+ }
+ }
+ },
+
+ updateColumnWidths: function() {
+ var cols = this.columns,
+ colCount = cols.length,
+ groups = this.outerCt.query('colgroup'),
+ groupCount = groups.length,
+ c,
+ g,
+ i,
+ j;
+
+ for (i = 0; i < colCount; i++) {
+ c = cols[i];
+ for (j = 0; j < groupCount; j++) {
+ g = groups[j];
+ g.childNodes[i].style.width = (c.hidden ? 0 : c.width) + 'px';
+ }
+ }
+
+ for (
+ i = 0, groups = this.innerHd.query('td'), len = groups.length;
+ i < len;
+ i++
+ ) {
+ c = Ext.fly(groups[i]);
+ if (cols[i] && cols[i].hidden) {
+ c.addClass('x-treegrid-hd-hidden');
+ } else {
+ c.removeClass('x-treegrid-hd-hidden');
+ }
+ }
+
+ var tcw = this.getTotalColumnWidth();
+ Ext.fly(this.innerHd.dom.firstChild).setWidth(
+ tcw + (this.scrollOffset || 0)
+ );
+ this.outerCt.select('table').setWidth(tcw);
+ this.syncHeaderScroll();
+ },
+
+ getVisibleColumns: function() {
+ var columns = [],
+ cs = this.columns,
+ len = cs.length,
+ i;
+
+ for (i = 0; i < len; i++) {
+ if (!cs[i].hidden) {
+ columns.push(cs[i]);
+ }
+ }
+ return columns;
+ },
+
+ getTotalColumnWidth: function() {
+ var total = 0;
+ for (
+ var i = 0, cs = this.getVisibleColumns(), len = cs.length;
+ i < len;
+ i++
+ ) {
+ total += cs[i].width;
+ }
+ return total;
+ },
+
+ setScrollOffset: function(scrollOffset) {
+ this.scrollOffset = scrollOffset;
+ this.updateColumnWidths();
+ },
+
+ // private
+ handleHdDown: function(e, t) {
+ var hd = e.getTarget('.x-treegrid-hd');
+
+ if (hd && Ext.fly(t).hasClass('x-grid3-hd-btn')) {
+ var ms = this.hmenu.items,
+ cs = this.columns,
+ index = this.findHeaderIndex(hd),
+ c = cs[index],
+ sort = c.sortable;
+
+ e.stopEvent();
+ Ext.fly(hd).addClass('x-grid3-hd-menu-open');
+ this.hdCtxIndex = index;
+
+ this.fireEvent('headerbuttonclick', ms, c, hd, index);
+
+ this.hmenu.on(
+ 'hide',
+ function() {
+ Ext.fly(hd).removeClass('x-grid3-hd-menu-open');
+ },
+ this,
+ { single: true }
+ );
+
+ this.hmenu.show(t, 'tl-bl?');
+ } else if (hd) {
+ var index = this.findHeaderIndex(hd);
+ this.fireEvent('headerclick', this.columns[index], hd, index);
+ }
+ },
+
+ // private
+ handleHdOver: function(e, t) {
+ var hd = e.getTarget('.x-treegrid-hd');
+ if (hd && !this.headersDisabled) {
+ index = this.findHeaderIndex(hd);
+ this.activeHdRef = t;
+ this.activeHdIndex = index;
+ var el = Ext.get(hd);
+ this.activeHdRegion = el.getRegion();
+ el.addClass('x-grid3-hd-over');
+ this.activeHdBtn = el.child('.x-grid3-hd-btn');
+ if (this.activeHdBtn) {
+ this.activeHdBtn.dom.style.height =
+ hd.firstChild.offsetHeight - 1 + 'px';
+ }
+ }
+ },
+
+ // private
+ handleHdOut: function(e, t) {
+ var hd = e.getTarget('.x-treegrid-hd');
+ if (hd && (!Ext.isIE || !e.within(hd, true))) {
+ this.activeHdRef = null;
+ Ext.fly(hd).removeClass('x-grid3-hd-over');
+ hd.style.cursor = '';
+ }
+ },
+
+ findHeaderIndex: function(hd) {
+ hd = hd.dom || hd;
+ var cs = hd.parentNode.childNodes;
+ for (var i = 0, c; (c = cs[i]); i++) {
+ if (c == hd) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ // private
+ beforeColMenuShow: function() {
+ var cols = this.columns,
+ colCount = cols.length,
+ i,
+ c;
+ this.colMenu.removeAll();
+ for (i = 1; i < colCount; i++) {
+ c = cols[i];
+ if (c.hideable !== false) {
+ this.colMenu.add(
+ new Ext.menu.CheckItem({
+ itemId: 'col-' + i,
+ text: c.header,
+ checked: !c.hidden,
+ hideOnClick: false,
+ disabled: c.hideable === false,
+ })
+ );
+ }
+ }
+ },
+
+ // private
+ handleHdMenuClick: function(item) {
+ var index = this.hdCtxIndex,
+ id = item.getItemId();
+
+ if (
+ this.fireEvent(
+ 'headermenuclick',
+ this.columns[index],
+ id,
+ index
+ ) !== false
+ ) {
+ index = id.substr(4);
+ if (index > 0 && this.columns[index]) {
+ this.setColumnVisible(index, !item.checked);
+ }
+ }
+
+ return true;
+ },
+
+ setColumnVisible: function(index, visible) {
+ this.columns[index].hidden = !visible;
+ this.updateColumnWidths();
+ },
+
+ /**
+ * Scrolls the grid to the top
+ */
+ scrollToTop: function() {
+ this.innerBody.dom.scrollTop = 0;
+ this.innerBody.dom.scrollLeft = 0;
+ },
+
+ // private
+ syncScroll: function() {
+ this.syncHeaderScroll();
+ var mb = this.innerBody.dom;
+ this.fireEvent('bodyscroll', mb.scrollLeft, mb.scrollTop);
+ },
+
+ // private
+ syncHeaderScroll: function() {
+ var mb = this.innerBody.dom;
+ this.innerHd.dom.scrollLeft = mb.scrollLeft;
+ this.innerHd.dom.scrollLeft = mb.scrollLeft; // second time for IE (1/2 time first fails, other browsers ignore)
+ },
+
+ registerNode: function(n) {
+ Ext.ux.tree.TreeGrid.superclass.registerNode.call(this, n);
+ if (!n.uiProvider && !n.isRoot && !n.ui.isTreeGridNodeUI) {
+ n.ui = new Ext.ux.tree.TreeGridNodeUI(n);
+ }
+ },
+});
+
+Ext.reg('treegrid', Ext.ux.tree.TreeGrid);
diff --git a/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridColumnResizer.js b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridColumnResizer.js
new file mode 100644
index 0000000..870172e
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridColumnResizer.js
@@ -0,0 +1,123 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/**
+ * @class Ext.tree.ColumnResizer
+ * @extends Ext.util.Observable
+ */
+Ext.tree.ColumnResizer = Ext.extend(Ext.util.Observable, {
+ /**
+ * @cfg {Number} minWidth The minimum width the column can be dragged to.
+ * Defaults to <tt>14</tt>.
+ */
+ minWidth: 14,
+
+ constructor: function(config) {
+ Ext.apply(this, config);
+ Ext.tree.ColumnResizer.superclass.constructor.call(this);
+ },
+
+ init: function(tree) {
+ this.tree = tree;
+ tree.on('render', this.initEvents, this);
+ },
+
+ initEvents: function(tree) {
+ tree.mon(tree.innerHd, 'mousemove', this.handleHdMove, this);
+ this.tracker = new Ext.dd.DragTracker({
+ onBeforeStart: this.onBeforeStart.createDelegate(this),
+ onStart: this.onStart.createDelegate(this),
+ onDrag: this.onDrag.createDelegate(this),
+ onEnd: this.onEnd.createDelegate(this),
+ tolerance: 3,
+ autoStart: 300,
+ });
+ this.tracker.initEl(tree.innerHd);
+ tree.on('beforedestroy', this.tracker.destroy, this.tracker);
+ },
+
+ handleHdMove: function(e, t) {
+ var hw = 5,
+ x = e.getPageX(),
+ hd = e.getTarget('.x-treegrid-hd', 3, true);
+
+ if (hd) {
+ var r = hd.getRegion(),
+ ss = hd.dom.style,
+ pn = hd.dom.parentNode;
+
+ if (x - r.left <= hw && hd.dom !== pn.firstChild) {
+ var ps = hd.dom.previousSibling;
+ while (ps && Ext.fly(ps).hasClass('x-treegrid-hd-hidden')) {
+ ps = ps.previousSibling;
+ }
+ if (ps) {
+ this.activeHd = Ext.get(ps);
+ ss.cursor = Ext.isWebKit ? 'e-resize' : 'col-resize';
+ }
+ } else if (r.right - x <= hw) {
+ var ns = hd.dom;
+ while (ns && Ext.fly(ns).hasClass('x-treegrid-hd-hidden')) {
+ ns = ns.previousSibling;
+ }
+ if (ns) {
+ this.activeHd = Ext.get(ns);
+ ss.cursor = Ext.isWebKit ? 'w-resize' : 'col-resize';
+ }
+ } else {
+ delete this.activeHd;
+ ss.cursor = '';
+ }
+ }
+ },
+
+ onBeforeStart: function(e) {
+ this.dragHd = this.activeHd;
+ return !!this.dragHd;
+ },
+
+ onStart: function(e) {
+ this.dragHeadersDisabled = this.tree.headersDisabled;
+ this.tree.headersDisabled = true;
+ this.proxy = this.tree.body.createChild({ cls: 'x-treegrid-resizer' });
+ this.proxy.setHeight(this.tree.body.getHeight());
+
+ var x = this.tracker.getXY()[0];
+
+ this.hdX = this.dragHd.getX();
+ this.hdIndex = this.tree.findHeaderIndex(this.dragHd);
+
+ this.proxy.setX(this.hdX);
+ this.proxy.setWidth(x - this.hdX);
+
+ this.maxWidth =
+ this.tree.outerCt.getWidth() -
+ this.tree.innerBody.translatePoints(this.hdX).left;
+ },
+
+ onDrag: function(e) {
+ var cursorX = this.tracker.getXY()[0];
+ this.proxy.setWidth(
+ (cursorX - this.hdX).constrain(this.minWidth, this.maxWidth)
+ );
+ },
+
+ onEnd: function(e) {
+ var nw = this.proxy.getWidth(),
+ tree = this.tree,
+ disabled = this.dragHeadersDisabled;
+
+ this.proxy.remove();
+ delete this.dragHd;
+
+ tree.columns[this.hdIndex].width = nw;
+ tree.updateColumnWidths();
+
+ setTimeout(function() {
+ tree.headersDisabled = disabled;
+ }, 100);
+ },
+});
diff --git a/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridColumns.js b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridColumns.js
new file mode 100644
index 0000000..312bf21
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridColumns.js
@@ -0,0 +1,40 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+(function() {
+ Ext.override(Ext.list.Column, {
+ init: function() {
+ var types = Ext.data.Types,
+ st = this.sortType;
+
+ if (this.type) {
+ if (Ext.isString(this.type)) {
+ this.type =
+ Ext.data.Types[this.type.toUpperCase()] || types.AUTO;
+ }
+ } else {
+ this.type = types.AUTO;
+ }
+
+ // named sortTypes are supported, here we look them up
+ if (Ext.isString(st)) {
+ this.sortType = Ext.data.SortTypes[st];
+ } else if (Ext.isEmpty(st)) {
+ this.sortType = this.type.sortType;
+ }
+ },
+ });
+
+ Ext.tree.Column = Ext.extend(Ext.list.Column, {});
+ Ext.tree.NumberColumn = Ext.extend(Ext.list.NumberColumn, {});
+ Ext.tree.DateColumn = Ext.extend(Ext.list.DateColumn, {});
+ Ext.tree.BooleanColumn = Ext.extend(Ext.list.BooleanColumn, {});
+
+ Ext.reg('tgcolumn', Ext.tree.Column);
+ Ext.reg('tgnumbercolumn', Ext.tree.NumberColumn);
+ Ext.reg('tgdatecolumn', Ext.tree.DateColumn);
+ Ext.reg('tgbooleancolumn', Ext.tree.BooleanColumn);
+})();
diff --git a/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridLoader.js b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridLoader.js
new file mode 100644
index 0000000..eb5156a
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridLoader.js
@@ -0,0 +1,18 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/**
+ * @class Ext.ux.tree.TreeGridLoader
+ * @extends Ext.tree.TreeLoader
+ */
+Ext.ux.tree.TreeGridLoader = Ext.extend(Ext.tree.TreeLoader, {
+ createNode: function(attr) {
+ if (!attr.uiProvider) {
+ attr.uiProvider = Ext.ux.tree.TreeGridNodeUI;
+ }
+ return Ext.tree.TreeLoader.prototype.createNode.call(this, attr);
+ },
+});
diff --git a/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridNodeUI.js b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridNodeUI.js
new file mode 100644
index 0000000..e58a801
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridNodeUI.js
@@ -0,0 +1,149 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/**
+ * @class Ext.ux.tree.TreeGridNodeUI
+ * @extends Ext.tree.TreeNodeUI
+ */
+Ext.ux.tree.TreeGridNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
+ isTreeGridNodeUI: true,
+
+ renderElements: function(n, a, targetNode, bulkRender) {
+ var t = n.getOwnerTree(),
+ cols = t.columns,
+ c = cols[0],
+ i,
+ buf,
+ len;
+
+ this.indentMarkup = n.parentNode
+ ? n.parentNode.ui.getChildIndent()
+ : '';
+
+ buf = [
+ '<tbody class="x-tree-node">',
+ '<tr ext:tree-node-id="',
+ n.id,
+ '" class="x-tree-node-el x-tree-node-leaf ',
+ a.cls,
+ '">',
+ '<td class="x-treegrid-col">',
+ '<span class="x-tree-node-indent">',
+ this.indentMarkup,
+ '</span>',
+ '<img src="',
+ this.emptyIcon,
+ '" class="x-tree-ec-icon x-tree-elbow" />',
+ '<img src="',
+ a.icon || this.emptyIcon,
+ '" class="x-tree-node-icon',
+ a.icon ? ' x-tree-node-inline-icon' : '',
+ a.iconCls ? ' ' + a.iconCls : '',
+ '" unselectable="on" />',
+ '<a hidefocus="on" class="x-tree-node-anchor" href="',
+ a.href ? a.href : '#',
+ '" tabIndex="1" ',
+ a.hrefTarget ? ' target="' + a.hrefTarget + '"' : '',
+ '>',
+ '<span unselectable="on">',
+ c.tpl ? c.tpl.apply(a) : a[c.dataIndex] || c.text,
+ '</span></a>',
+ '</td>',
+ ];
+
+ for (i = 1, len = cols.length; i < len; i++) {
+ c = cols[i];
+ buf.push(
+ '<td class="x-treegrid-col ',
+ c.cls ? c.cls : '',
+ '">',
+ '<div unselectable="on" class="x-treegrid-text"',
+ c.align ? ' style="text-align: ' + c.align + ';"' : '',
+ '>',
+ c.tpl ? c.tpl.apply(a) : a[c.dataIndex],
+ '</div>',
+ '</td>'
+ );
+ }
+
+ buf.push(
+ '</tr><tr class="x-tree-node-ct"><td colspan="',
+ cols.length,
+ '">',
+ '<table class="x-treegrid-node-ct-table" cellpadding="0" cellspacing="0" style="table-layout: fixed; display: none; width: ',
+ t.innerCt.getWidth(),
+ 'px;"><colgroup>'
+ );
+ for (i = 0, len = cols.length; i < len; i++) {
+ buf.push(
+ '<col style="width: ',
+ cols[i].hidden ? 0 : cols[i].width,
+ 'px;" />'
+ );
+ }
+ buf.push('</colgroup></table></td></tr></tbody>');
+
+ if (bulkRender !== true && n.nextSibling && n.nextSibling.ui.getEl()) {
+ this.wrap = Ext.DomHelper.insertHtml(
+ 'beforeBegin',
+ n.nextSibling.ui.getEl(),
+ buf.join('')
+ );
+ } else {
+ this.wrap = Ext.DomHelper.insertHtml(
+ 'beforeEnd',
+ targetNode,
+ buf.join('')
+ );
+ }
+
+ this.elNode = this.wrap.childNodes[0];
+ this.ctNode = this.wrap.childNodes[1].firstChild.firstChild;
+ var cs = this.elNode.firstChild.childNodes;
+ this.indentNode = cs[0];
+ this.ecNode = cs[1];
+ this.iconNode = cs[2];
+ this.anchor = cs[3];
+ this.textNode = cs[3].firstChild;
+ },
+
+ // private
+ animExpand: function(cb) {
+ this.ctNode.style.display = '';
+ Ext.ux.tree.TreeGridNodeUI.superclass.animExpand.call(this, cb);
+ },
+});
+
+Ext.ux.tree.TreeGridRootNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
+ isTreeGridNodeUI: true,
+
+ // private
+ render: function() {
+ if (!this.rendered) {
+ this.wrap = this.ctNode = this.node.ownerTree.innerCt.dom;
+ this.node.expanded = true;
+ }
+
+ if (Ext.isWebKit) {
+ // weird table-layout: fixed issue in webkit
+ var ct = this.ctNode;
+ ct.style.tableLayout = null;
+ (function() {
+ ct.style.tableLayout = 'fixed';
+ }.defer(1));
+ }
+ },
+
+ destroy: function() {
+ if (this.elNode) {
+ Ext.dd.Registry.unregister(this.elNode.id);
+ }
+ delete this.node;
+ },
+
+ collapse: Ext.emptyFn,
+ expand: Ext.emptyFn,
+});
diff --git a/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridNodeUIFix.js b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridNodeUIFix.js
new file mode 100644
index 0000000..4c21bc3
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridNodeUIFix.js
@@ -0,0 +1,33 @@
+/**
+ * Ext.ux.tree.TreeGridNodeUIFix.js
+ *
+ * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
+ *
+ * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+ * the additional special exception to link portions of this program with the OpenSSL library.
+ * See LICENSE for more details.
+ */
+
+Ext.override(Ext.ux.tree.TreeGridNodeUI, {
+ updateColumns: function() {
+ if (!this.rendered) return;
+
+ var a = this.node.attributes,
+ t = this.node.getOwnerTree(),
+ cols = t.columns,
+ c = cols[0];
+
+ // Update the first column
+ this.anchor.firstChild.innerHTML = c.tpl
+ ? c.tpl.apply(a)
+ : a[c.dataIndex] || c.text;
+
+ // Update the remaining columns
+ for (i = 1, len = cols.length; i < len; i++) {
+ c = cols[i];
+ this.elNode.childNodes[i].firstChild.innerHTML = c.tpl
+ ? c.tpl.apply(a)
+ : a[c.dataIndex] || c.text;
+ }
+ },
+});
diff --git a/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridRenderColumn.js b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridRenderColumn.js
new file mode 100644
index 0000000..20bde8a
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridRenderColumn.js
@@ -0,0 +1,9 @@
+Ext.tree.RenderColumn = Ext.extend(Ext.tree.Column, {
+ constructor: function(c) {
+ c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':this.format}');
+ c.tpl.format = c.renderer;
+ c.tpl.col = this;
+ Ext.tree.RenderColumn.superclass.constructor.call(this, c);
+ },
+});
+Ext.reg('tgrendercolumn', Ext.tree.RenderColumn);
diff --git a/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridSorter.js b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridSorter.js
new file mode 100644
index 0000000..376f414
--- /dev/null
+++ b/deluge/ui/web/js/extjs/ext-extensions/tree/TreeGridSorter.js
@@ -0,0 +1,158 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+Ext.ns('Ext.ux.tree');
+
+/**
+ * @class Ext.ux.tree.TreeGridSorter
+ * @extends Ext.tree.TreeSorter
+ * Provides sorting of nodes in a {@link Ext.ux.tree.TreeGrid}. The TreeGridSorter automatically monitors events on the
+ * associated TreeGrid that might affect the tree's sort order (beforechildrenrendered, append, insert and textchange).
+ * Example usage:<br />
+ * <pre><code>
+ new Ext.ux.tree.TreeGridSorter(myTreeGrid, {
+ folderSort: true,
+ dir: "desc",
+ sortType: function(node) {
+ // sort by a custom, typed attribute:
+ return parseInt(node.id, 10);
+ }
+ });
+ </code></pre>
+ * @constructor
+ * @param {TreeGrid} tree
+ * @param {Object} config
+ */
+Ext.ux.tree.TreeGridSorter = Ext.extend(Ext.tree.TreeSorter, {
+ /**
+ * @cfg {Array} sortClasses The CSS classes applied to a header when it is sorted. (defaults to <tt>['sort-asc', 'sort-desc']</tt>)
+ */
+ sortClasses: ['sort-asc', 'sort-desc'],
+ /**
+ * @cfg {String} sortAscText The text displayed in the 'Sort Ascending' menu item (defaults to <tt>'Sort Ascending'</tt>)
+ */
+ sortAscText: 'Sort Ascending',
+ /**
+ * @cfg {String} sortDescText The text displayed in the 'Sort Descending' menu item (defaults to <tt>'Sort Descending'</tt>)
+ */
+ sortDescText: 'Sort Descending',
+
+ constructor: function(tree, config) {
+ if (!Ext.isObject(config)) {
+ config = {
+ property: tree.columns[0].dataIndex || 'text',
+ folderSort: true,
+ };
+ }
+
+ Ext.ux.tree.TreeGridSorter.superclass.constructor.apply(
+ this,
+ arguments
+ );
+
+ this.tree = tree;
+ tree.on('headerclick', this.onHeaderClick, this);
+ tree.ddAppendOnly = true;
+
+ var me = this;
+ this.defaultSortFn = function(n1, n2) {
+ var desc = me.dir && me.dir.toLowerCase() == 'desc',
+ prop = me.property || 'text',
+ sortType = me.sortType,
+ caseSensitive = me.caseSensitive === true,
+ leafAttr = me.leafAttr || 'leaf',
+ attr1 = n1.attributes,
+ attr2 = n2.attributes;
+
+ if (me.folderSort) {
+ if (attr1[leafAttr] && !attr2[leafAttr]) {
+ return 1;
+ }
+ if (!attr1[leafAttr] && attr2[leafAttr]) {
+ return -1;
+ }
+ }
+ var prop1 = attr1[prop],
+ prop2 = attr2[prop],
+ v1 = sortType
+ ? sortType(prop1)
+ : caseSensitive
+ ? prop1
+ : prop1.toUpperCase();
+ v2 = sortType
+ ? sortType(prop2)
+ : caseSensitive
+ ? prop2
+ : prop2.toUpperCase();
+
+ if (v1 < v2) {
+ return desc ? +1 : -1;
+ } else if (v1 > v2) {
+ return desc ? -1 : +1;
+ } else {
+ return 0;
+ }
+ };
+
+ tree.on('afterrender', this.onAfterTreeRender, this, { single: true });
+ tree.on('headermenuclick', this.onHeaderMenuClick, this);
+ },
+
+ onAfterTreeRender: function() {
+ if (this.tree.hmenu) {
+ this.tree.hmenu.insert(
+ 0,
+ {
+ itemId: 'asc',
+ text: this.sortAscText,
+ cls: 'xg-hmenu-sort-asc',
+ },
+ {
+ itemId: 'desc',
+ text: this.sortDescText,
+ cls: 'xg-hmenu-sort-desc',
+ }
+ );
+ }
+ this.updateSortIcon(0, 'asc');
+ },
+
+ onHeaderMenuClick: function(c, id, index) {
+ if (id === 'asc' || id === 'desc') {
+ this.onHeaderClick(c, null, index);
+ return false;
+ }
+ },
+
+ onHeaderClick: function(c, el, i) {
+ if (c && !this.tree.headersDisabled) {
+ var me = this;
+
+ me.property = c.dataIndex;
+ me.dir = c.dir = c.dir === 'desc' ? 'asc' : 'desc';
+ me.sortType = c.sortType;
+ me.caseSensitive === Ext.isBoolean(c.caseSensitive)
+ ? c.caseSensitive
+ : this.caseSensitive;
+ me.sortFn = c.sortFn || this.defaultSortFn;
+
+ this.tree.root.cascade(function(n) {
+ if (!n.isLeaf()) {
+ me.updateSort(me.tree, n);
+ }
+ });
+
+ this.updateSortIcon(i, c.dir);
+ }
+ },
+
+ // private
+ updateSortIcon: function(col, dir) {
+ var sc = this.sortClasses,
+ hds = this.tree.innerHd.select('td').removeClass(sc);
+ hds.item(col).addClass(sc[dir == 'desc' ? 1 : 0]);
+ },
+});
diff --git a/deluge/ui/web/js/gettext.js b/deluge/ui/web/js/gettext.js
new file mode 100644
index 0000000..9cc1c4f
--- /dev/null
+++ b/deluge/ui/web/js/gettext.js
@@ -0,0 +1,322 @@
+GetText={maps:{},add:function(string,translation){this.maps[string]=translation},get:function(string){if (this.maps[string]){string=this.maps[string]} return string}};function _(string){return GetText.get(string)}GetText.add('10 KiB/s','${escape(_("10 KiB/s"))}')
+GetText.add('30 KiB/s','${escape(_("30 KiB/s"))}')
+GetText.add('300 KiB/s','${escape(_("300 KiB/s"))}')
+GetText.add('5 KiB/s','${escape(_("5 KiB/s"))}')
+GetText.add('80 KiB/s','${escape(_("80 KiB/s"))}')
+GetText.add('<b>IP</b> {0}','${escape(_("<b>IP</b> {0}"))}')
+GetText.add('About Deluge','${escape(_("About Deluge"))}')
+GetText.add('Active','${escape(_("Active"))}')
+GetText.add('Active Torrents','${escape(_("Active Torrents"))}')
+GetText.add('Add','${escape(_("Add"))}')
+GetText.add('Add Connection','${escape(_("Add Connection"))}')
+GetText.add('Add In Paused State','${escape(_("Add In Paused State"))}')
+GetText.add('Add Torrents','${escape(_("Add Torrents"))}')
+GetText.add('Add Tracker','${escape(_("Add Tracker"))}')
+GetText.add('Add from Url','${escape(_("Add from Url"))}')
+GetText.add('Add torrents in Paused state','${escape(_("Add torrents in Paused state"))}')
+GetText.add('Added','${escape(_("Added"))}')
+GetText.add('Address','${escape(_("Address"))}')
+GetText.add('All','${escape(_("All"))}')
+GetText.add('Allocating','${escape(_("Allocating"))}')
+GetText.add('Allow Remote Connections','${escape(_("Allow Remote Connections"))}')
+GetText.add('Allow the use of multiple filters at once','${escape(_("Allow the use of multiple filters at once"))}')
+GetText.add('Announce OK','${escape(_("Announce OK"))}')
+GetText.add('Announce Sent','${escape(_("Announce Sent"))}')
+GetText.add('Apply','${escape(_("Apply"))}')
+GetText.add('Author Email:','${escape(_("Author Email:"))}')
+GetText.add('Author:','${escape(_("Author:"))}')
+GetText.add('Auto Managed','${escape(_("Auto Managed"))}')
+GetText.add('Avail','${escape(_("Avail"))}')
+GetText.add('Back','${escape(_("Back"))}')
+GetText.add('Bandwidth','${escape(_("Bandwidth"))}')
+GetText.add('Be alerted about new releases','${escape(_("Be alerted about new releases"))}')
+GetText.add('Bottom','${escape(_("Bottom"))}')
+GetText.add('Browse','${escape(_("Browse"))}')
+GetText.add('Browse...','${escape(_("Browse..."))}')
+GetText.add('Cache','${escape(_("Cache"))}')
+GetText.add('Cache Expiry (seconds):','${escape(_("Cache Expiry (seconds):"))}')
+GetText.add('Cache Size (16 KiB Blocks):','${escape(_("Cache Size (16 KiB Blocks):"))}')
+GetText.add('Cancel','${escape(_("Cancel"))}')
+GetText.add('Certificate:','${escape(_("Certificate:"))}')
+GetText.add('Change Default Password','${escape(_("Change Default Password"))}')
+GetText.add('Change Successful','${escape(_("Change Successful"))}')
+GetText.add('Checking','${escape(_("Checking"))}')
+GetText.add('Client','${escape(_("Client"))}')
+GetText.add('Client:','${escape(_("Client:"))}')
+GetText.add('Close','${escape(_("Close"))}')
+GetText.add('Comment:','${escape(_("Comment:"))}')
+GetText.add('Complete Seen','${escape(_("Complete Seen"))}')
+GetText.add('Completed','${escape(_("Completed"))}')
+GetText.add('Confirm:','${escape(_("Confirm:"))}')
+GetText.add('Connect','${escape(_("Connect"))}')
+GetText.add('Connected','${escape(_("Connected"))}')
+GetText.add('Connection Limit','${escape(_("Connection Limit"))}')
+GetText.add('Connection Manager','${escape(_("Connection Manager"))}')
+GetText.add('Connection restored','${escape(_("Connection restored"))}')
+GetText.add('Connections','${escape(_("Connections"))}')
+GetText.add('Cookies','${escape(_("Cookies"))}')
+GetText.add('Copy of .torrent files to:','${escape(_("Copy of .torrent files to:"))}')
+GetText.add('Copyright 2007-2018 Deluge Team','${escape(_("Copyright 2007-2018 Deluge Team"))}')
+GetText.add('Create','${escape(_("Create"))}')
+GetText.add('Created By:','${escape(_("Created By:"))}')
+GetText.add('D/L Speed Limit','${escape(_("D/L Speed Limit"))}')
+GetText.add('DHT','${escape(_("DHT"))}')
+GetText.add('DHT Nodes','${escape(_("DHT Nodes"))}')
+GetText.add('Daemon','${escape(_("Daemon"))}')
+GetText.add('Daemon port:','${escape(_("Daemon port:"))}')
+GetText.add('Deluge','${escape(_("Deluge"))}')
+GetText.add('Details','${escape(_("Details"))}')
+GetText.add('Details:','${escape(_("Details:"))}')
+GetText.add('Disabled','${escape(_("Disabled"))}')
+GetText.add('Disconnect','${escape(_("Disconnect"))}')
+GetText.add('Down','${escape(_("Down"))}')
+GetText.add('Down Limit','${escape(_("Down Limit"))}')
+GetText.add('Down Speed','${escape(_("Down Speed"))}')
+GetText.add('Download','${escape(_("Download"))}')
+GetText.add('Download Folder','${escape(_("Download Folder"))}')
+GetText.add('Download Folder:','${escape(_("Download Folder:"))}')
+GetText.add('Download Speed','${escape(_("Download Speed"))}')
+GetText.add('Download to:','${escape(_("Download to:"))}')
+GetText.add('Downloaded','${escape(_("Downloaded"))}')
+GetText.add('Downloading','${escape(_("Downloading"))}')
+GetText.add('Downloading:','${escape(_("Downloading:"))}')
+GetText.add('Downloads','${escape(_("Downloads"))}')
+GetText.add('ETA','${escape(_("ETA"))}')
+GetText.add('Edit','${escape(_("Edit"))}')
+GetText.add('Edit Connection','${escape(_("Edit Connection"))}')
+GetText.add('Edit Tracker','${escape(_("Edit Tracker"))}')
+GetText.add('Edit Trackers','${escape(_("Edit Trackers"))}')
+GetText.add('Either','${escape(_("Either"))}')
+GetText.add('Enabled','${escape(_("Enabled"))}')
+GetText.add('Encryption','${escape(_("Encryption"))}')
+GetText.add('Error','${escape(_("Error"))}')
+GetText.add('Expand All','${escape(_("Expand All"))}')
+GetText.add('External IP Address','${escape(_("External IP Address"))}')
+GetText.add('File','${escape(_("File"))}')
+GetText.add('File Browser','${escape(_("File Browser"))}')
+GetText.add('Filename','${escape(_("Filename"))}')
+GetText.add('Files','${escape(_("Files"))}')
+GetText.add('Filters','${escape(_("Filters"))}')
+GetText.add('Find More','${escape(_("Find More"))}')
+GetText.add('Folders','${escape(_("Folders"))}')
+GetText.add('Force Proxy','${escape(_("Force Proxy"))}')
+GetText.add('Force Recheck','${escape(_("Force Recheck"))}')
+GetText.add('Force Use of Proxy','${escape(_("Force Use of Proxy"))}')
+GetText.add('Forced','${escape(_("Forced"))}')
+GetText.add('Forward','${escape(_("Forward"))}')
+GetText.add('Freespace in download folder','${escape(_("Freespace in download folder"))}')
+GetText.add('From:','${escape(_("From:"))}')
+GetText.add('Full Stream','${escape(_("Full Stream"))}')
+GetText.add('General','${escape(_("General"))}')
+GetText.add('GeoIP Database','${escape(_("GeoIP Database"))}')
+GetText.add('Global Bandwidth Usage','${escape(_("Global Bandwidth Usage"))}')
+GetText.add('HTTP','${escape(_("HTTP"))}')
+GetText.add('HTTP Auth','${escape(_("HTTP Auth"))}')
+GetText.add('Handshake','${escape(_("Handshake"))}')
+GetText.add('Hash:','${escape(_("Hash:"))}')
+GetText.add('Help','${escape(_("Help"))}')
+GetText.add('Hide Client Identity','${escape(_("Hide Client Identity"))}')
+GetText.add('High','${escape(_("High"))}')
+GetText.add('Home','${escape(_("Home"))}')
+GetText.add('Homepage:','${escape(_("Homepage:"))}')
+GetText.add('Host','${escape(_("Host"))}')
+GetText.add('Host:','${escape(_("Host:"))}')
+GetText.add('I2P','${escape(_("I2P"))}')
+GetText.add('Ignore limits on local network','${escape(_("Ignore limits on local network"))}')
+GetText.add('Ignore slow torrents','${escape(_("Ignore slow torrents"))}')
+GetText.add('Incoming Address','${escape(_("Incoming Address"))}')
+GetText.add('Incoming Port','${escape(_("Incoming Port"))}')
+GetText.add('Incoming:','${escape(_("Incoming:"))}')
+GetText.add('Infohash','${escape(_("Infohash"))}')
+GetText.add('Install','${escape(_("Install"))}')
+GetText.add('Install Plugin','${escape(_("Install Plugin"))}')
+GetText.add('Interface','${escape(_("Interface"))}')
+GetText.add('Invalid Password','${escape(_("Invalid Password"))}')
+GetText.add('KiB/s','${escape(_("KiB/s"))}')
+GetText.add('LSD','${escape(_("LSD"))}')
+GetText.add('Labels','${escape(_("Labels"))}')
+GetText.add('Language','${escape(_("Language"))}')
+GetText.add('Last Transfer','${escape(_("Last Transfer"))}')
+GetText.add('Level:','${escape(_("Level:"))}')
+GetText.add('Loading','${escape(_("Loading"))}')
+GetText.add('Login','${escape(_("Login"))}')
+GetText.add('Login Failed','${escape(_("Login Failed"))}')
+GetText.add('Logout','${escape(_("Logout"))}')
+GetText.add('Lost Connection','${escape(_("Lost Connection"))}')
+GetText.add('Lost connection to webserver','${escape(_("Lost connection to webserver"))}')
+GetText.add('Low','${escape(_("Low"))}')
+GetText.add('Max Connections','${escape(_("Max Connections"))}')
+GetText.add('Max Connections:','${escape(_("Max Connections:"))}')
+GetText.add('Max Down Speed','${escape(_("Max Down Speed"))}')
+GetText.add('Max Download Speed:','${escape(_("Max Download Speed:"))}')
+GetText.add('Max Up Speed','${escape(_("Max Up Speed"))}')
+GetText.add('Max Upload Slots','${escape(_("Max Upload Slots"))}')
+GetText.add('Max Upload Slots:','${escape(_("Max Upload Slots:"))}')
+GetText.add('Max Upload Speed:','${escape(_("Max Upload Speed:"))}')
+GetText.add('Maximum Connection Attempts per Second:','${escape(_("Maximum Connection Attempts per Second:"))}')
+GetText.add('Maximum Connections:','${escape(_("Maximum Connections:"))}')
+GetText.add('Maximum Download Speed (KiB/s):','${escape(_("Maximum Download Speed (KiB/s):"))}')
+GetText.add('Maximum Half-Open Connections:','${escape(_("Maximum Half-Open Connections:"))}')
+GetText.add('Maximum Upload Slots','${escape(_("Maximum Upload Slots"))}')
+GetText.add('Maximum Upload Slots:','${escape(_("Maximum Upload Slots:"))}')
+GetText.add('Maximum Upload Speed (KiB/s):','${escape(_("Maximum Upload Speed (KiB/s):"))}')
+GetText.add('Mixed','${escape(_("Mixed"))}')
+GetText.add('Move','${escape(_("Move"))}')
+GetText.add('Move Completed Folder','${escape(_("Move Completed Folder"))}')
+GetText.add('Move Completed:','${escape(_("Move Completed:"))}')
+GetText.add('Move Download Folder','${escape(_("Move Download Folder"))}')
+GetText.add('Move completed to:','${escape(_("Move completed to:"))}')
+GetText.add('NAT-PMP','${escape(_("NAT-PMP"))}')
+GetText.add('Name','${escape(_("Name"))}')
+GetText.add('Name:','${escape(_("Name:"))}')
+GetText.add('Network','${escape(_("Network"))}')
+GetText.add('Network Extras','${escape(_("Network Extras"))}')
+GetText.add('Never','${escape(_("Never"))}')
+GetText.add('New Torrents','${escape(_("New Torrents"))}')
+GetText.add('New:','${escape(_("New:"))}')
+GetText.add('None','${escape(_("None"))}')
+GetText.add('Normal','${escape(_("Normal"))}')
+GetText.add('Not Connected','${escape(_("Not Connected"))}')
+GetText.add('Not a valid torrent','${escape(_("Not a valid torrent"))}')
+GetText.add('OK','${escape(_("OK"))}')
+GetText.add('Off','${escape(_("Off"))}')
+GetText.add('Offline','${escape(_("Offline"))}')
+GetText.add('Old:','${escape(_("Old:"))}')
+GetText.add('On','${escape(_("On"))}')
+GetText.add('Online','${escape(_("Online"))}')
+GetText.add('Options','${escape(_("Options"))}')
+GetText.add('Other','${escape(_("Other"))}')
+GetText.add('Outgoing Interface','${escape(_("Outgoing Interface"))}')
+GetText.add('Outgoing Ports','${escape(_("Outgoing Ports"))}')
+GetText.add('Outgoing:','${escape(_("Outgoing:"))}')
+GetText.add('Owner','${escape(_("Owner"))}')
+GetText.add('Password','${escape(_("Password"))}')
+GetText.add('Password:','${escape(_("Password:"))}')
+GetText.add('Path:','${escape(_("Path:"))}')
+GetText.add('Pause','${escape(_("Pause"))}')
+GetText.add('Pause torrent','${escape(_("Pause torrent"))}')
+GetText.add('Paused','${escape(_("Paused"))}')
+GetText.add('Peer Exchange','${escape(_("Peer Exchange"))}')
+GetText.add('Peer TOS Byte:','${escape(_("Peer TOS Byte:"))}')
+GetText.add('Peers','${escape(_("Peers"))}')
+GetText.add('Per Torrent Bandwidth Usage','${escape(_("Per Torrent Bandwidth Usage"))}')
+GetText.add('Periodically check the website for new releases','${escape(_("Periodically check the website for new releases"))}')
+GetText.add('Plugin','${escape(_("Plugin"))}')
+GetText.add('Plugin Egg','${escape(_("Plugin Egg"))}')
+GetText.add('Plugins','${escape(_("Plugins"))}')
+GetText.add('Port','${escape(_("Port"))}')
+GetText.add('Port:','${escape(_("Port:"))}')
+GetText.add('Pre-allocate disk space','${escape(_("Pre-allocate disk space"))}')
+GetText.add('Preallocate Disk Space','${escape(_("Preallocate Disk Space"))}')
+GetText.add('Prefer seeding torrents','${escape(_("Prefer seeding torrents"))}')
+GetText.add('Preferences','${escape(_("Preferences"))}')
+GetText.add('Prioritize First/Last','${escape(_("Prioritize First/Last"))}')
+GetText.add('Prioritize First/Last Pieces','${escape(_("Prioritize First/Last Pieces"))}')
+GetText.add('Prioritize first and last pieces of torrent','${escape(_("Prioritize first and last pieces of torrent"))}')
+GetText.add('Priority','${escape(_("Priority"))}')
+GetText.add('Private','${escape(_("Private"))}')
+GetText.add('Private Key:','${escape(_("Private Key:"))}')
+GetText.add('Progress','${escape(_("Progress"))}')
+GetText.add('Protocol Traffic Download/Upload','${escape(_("Protocol Traffic Download/Upload"))}')
+GetText.add('Proxy','${escape(_("Proxy"))}')
+GetText.add('Proxy Hostnames','${escape(_("Proxy Hostnames"))}')
+GetText.add('Proxy Peers','${escape(_("Proxy Peers"))}')
+GetText.add('Proxy Trackers','${escape(_("Proxy Trackers"))}')
+GetText.add('Public','${escape(_("Public"))}')
+GetText.add('Queue','${escape(_("Queue"))}')
+GetText.add('Queue to top','${escape(_("Queue to top"))}')
+GetText.add('Queued','${escape(_("Queued"))}')
+GetText.add('Rate limit IP overhead','${escape(_("Rate limit IP overhead"))}')
+GetText.add('Ratio','${escape(_("Ratio"))}')
+GetText.add('Refresh','${escape(_("Refresh"))}')
+GetText.add('Remaining','${escape(_("Remaining"))}')
+GetText.add('Remove','${escape(_("Remove"))}')
+GetText.add('Remove Torrent','${escape(_("Remove Torrent"))}')
+GetText.add('Remove With Data','${escape(_("Remove With Data"))}')
+GetText.add('Remove at ratio','${escape(_("Remove at ratio"))}')
+GetText.add('Remove torrent','${escape(_("Remove torrent"))}')
+GetText.add('Resume','${escape(_("Resume"))}')
+GetText.add('Save','${escape(_("Save"))}')
+GetText.add('Seeding','${escape(_("Seeding"))}')
+GetText.add('Seeding Rotation','${escape(_("Seeding Rotation"))}')
+GetText.add('Seeding:','${escape(_("Seeding:"))}')
+GetText.add('Seeds','${escape(_("Seeds"))}')
+GetText.add('Seeds:Peers','${escape(_("Seeds:Peers"))}')
+GetText.add('Select an egg','${escape(_("Select an egg"))}')
+GetText.add('Sequential Download','${escape(_("Sequential Download"))}')
+GetText.add('Sequential download','${escape(_("Sequential download"))}')
+GetText.add('Server','${escape(_("Server"))}')
+GetText.add('Server:','${escape(_("Server:"))}')
+GetText.add('Session Timeout:','${escape(_("Session Timeout:"))}')
+GetText.add('Set Maximum Connections','${escape(_("Set Maximum Connections"))}')
+GetText.add('Set Maximum Download Speed','${escape(_("Set Maximum Download Speed"))}')
+GetText.add('Set Maximum Upload Speed','${escape(_("Set Maximum Upload Speed"))}')
+GetText.add('Settings','${escape(_("Settings"))}')
+GetText.add('Share Ratio Reached','${escape(_("Share Ratio Reached"))}')
+GetText.add('Share Ratio:','${escape(_("Share Ratio:"))}')
+GetText.add('Shared','${escape(_("Shared"))}')
+GetText.add('Show filters with zero torrents','${escape(_("Show filters with zero torrents"))}')
+GetText.add('Show session speed in titlebar','${escape(_("Show session speed in titlebar"))}')
+GetText.add('Size','${escape(_("Size"))}')
+GetText.add('Skip','${escape(_("Skip"))}')
+GetText.add('Skip File Hash Check','${escape(_("Skip File Hash Check"))}')
+GetText.add('Socks4','${escape(_("Socks4"))}')
+GetText.add('Socks5','${escape(_("Socks5"))}')
+GetText.add('Socks5 Auth','${escape(_("Socks5 Auth"))}')
+GetText.add('Start Daemon','${escape(_("Start Daemon"))}')
+GetText.add('State','${escape(_("State"))}')
+GetText.add('States','${escape(_("States"))}')
+GetText.add('Status','${escape(_("Status"))}')
+GetText.add('Status:','${escape(_("Status:"))}')
+GetText.add('Stop Daemon','${escape(_("Stop Daemon"))}')
+GetText.add('Stop seed at ratio:','${escape(_("Stop seed at ratio:"))}')
+GetText.add('Super Seed','${escape(_("Super Seed"))}')
+GetText.add('Super Seeding','${escape(_("Super Seeding"))}')
+GetText.add('System Default','${escape(_("System Default"))}')
+GetText.add('System Information','${escape(_("System Information"))}')
+GetText.add('The connection to the webserver has been lost!','${escape(_("The connection to the webserver has been lost!"))}')
+GetText.add('Tier','${escape(_("Tier"))}')
+GetText.add('Time (m):','${escape(_("Time (m):"))}')
+GetText.add('Time Ratio:','${escape(_("Time Ratio:"))}')
+GetText.add('To:','${escape(_("To:"))}')
+GetText.add('Top','${escape(_("Top"))}')
+GetText.add('Total Files:','${escape(_("Total Files:"))}')
+GetText.add('Total Size:','${escape(_("Total Size:"))}')
+GetText.add('Total:','${escape(_("Total:"))}')
+GetText.add('Tracker','${escape(_("Tracker"))}')
+GetText.add('Tracker Host','${escape(_("Tracker Host"))}')
+GetText.add('Tracker:','${escape(_("Tracker:"))}')
+GetText.add('Trackers','${escape(_("Trackers"))}')
+GetText.add('Trackers:','${escape(_("Trackers:"))}')
+GetText.add('Type Of Service','${escape(_("Type Of Service"))}')
+GetText.add('Type:','${escape(_("Type:"))}')
+GetText.add('U/L Speed Limit','${escape(_("U/L Speed Limit"))}')
+GetText.add('UPnP','${escape(_("UPnP"))}')
+GetText.add('Unable to add host: {0}','${escape(_("Unable to add host: {0}"))}')
+GetText.add('Unable to edit host','${escape(_("Unable to edit host"))}')
+GetText.add('Unlimited','${escape(_("Unlimited"))}')
+GetText.add('Up','${escape(_("Up"))}')
+GetText.add('Up Limit','${escape(_("Up Limit"))}')
+GetText.add('Up Speed','${escape(_("Up Speed"))}')
+GetText.add('Update Tracker','${escape(_("Update Tracker"))}')
+GetText.add('Updates','${escape(_("Updates"))}')
+GetText.add('Upload Slot Limit','${escape(_("Upload Slot Limit"))}')
+GetText.add('Upload Speed','${escape(_("Upload Speed"))}')
+GetText.add('Uploaded','${escape(_("Uploaded"))}')
+GetText.add('Uploading your plugin...','${escape(_("Uploading your plugin..."))}')
+GetText.add('Uploading your torrent...','${escape(_("Uploading your torrent..."))}')
+GetText.add('Url','${escape(_("Url"))}')
+GetText.add('Use Random Port','${escape(_("Use Random Port"))}')
+GetText.add('Use Random Ports','${escape(_("Use Random Ports"))}')
+GetText.add('Username:','${escape(_("Username:"))}')
+GetText.add('Version','${escape(_("Version"))}')
+GetText.add('Version:','${escape(_("Version:"))}')
+GetText.add('Warning','${escape(_("Warning"))}')
+GetText.add('WebUI Language Changed','${escape(_("WebUI Language Changed"))}')
+GetText.add('WebUI Password','${escape(_("WebUI Password"))}')
+GetText.add('Yes, please send anonymous statistics','${escape(_("Yes, please send anonymous statistics"))}')
+GetText.add('You entered an incorrect password','${escape(_("You entered an incorrect password"))}')
+GetText.add('Your old password was incorrect!','${escape(_("Your old password was incorrect!"))}')
+GetText.add('Your password was successfully changed!','${escape(_("Your password was successfully changed!"))}')
+GetText.add('libtorrent:','${escape(_("libtorrent:"))}')
+GetText.add('n/a','${escape(_("n/a"))}')
diff --git a/deluge/ui/web/json_api.py b/deluge/ui/web/json_api.py
new file mode 100644
index 0000000..bfacb58
--- /dev/null
+++ b/deluge/ui/web/json_api.py
@@ -0,0 +1,1019 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2010 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import division, unicode_literals
+
+import json
+import logging
+import os
+import shutil
+import tempfile
+from base64 import b64encode
+from types import FunctionType
+from xml.sax.saxutils import escape as xml_escape
+
+from twisted.internet import defer, reactor
+from twisted.internet.defer import Deferred, DeferredList
+from twisted.web import http, resource, server
+
+from deluge import component, httpdownloader
+from deluge.common import AUTH_LEVEL_DEFAULT, get_magnet_info, is_magnet
+from deluge.configmanager import get_config_dir
+from deluge.error import NotAuthorizedError
+from deluge.i18n import get_languages
+from deluge.ui.client import Client, client
+from deluge.ui.common import FileTree2, TorrentInfo
+from deluge.ui.coreconfig import CoreConfig
+from deluge.ui.hostlist import HostList
+from deluge.ui.sessionproxy import SessionProxy
+from deluge.ui.web.common import _
+
+log = logging.getLogger(__name__)
+
+
+class JSONComponent(component.Component):
+ def __init__(self, name, interval=1, depend=None):
+ super(JSONComponent, self).__init__(name, interval, depend)
+ self._json = component.get('JSON')
+ self._json.register_object(self, name)
+
+
+def export(auth_level=AUTH_LEVEL_DEFAULT):
+ """
+ Decorator function to register an object's method as a RPC. The object
+ will need to be registered with a `:class:JSON` to be effective.
+
+ :param func: the function to export
+ :type func: function
+ :param auth_level: the auth level required to call this method
+ :type auth_level: int
+
+ """
+
+ def wrap(func, *args, **kwargs):
+ func._json_export = True
+ func._json_auth_level = auth_level
+ return func
+
+ if isinstance(auth_level, FunctionType):
+ func = auth_level
+ auth_level = AUTH_LEVEL_DEFAULT
+ return wrap(func)
+ else:
+ return wrap
+
+
+class JSONException(Exception):
+ def __init__(self, inner_exception):
+ self.inner_exception = inner_exception
+ Exception.__init__(self, str(inner_exception))
+
+
+class JSON(resource.Resource, component.Component):
+ """
+ A Twisted Web resource that exposes a JSON-RPC interface for web clients \
+ to use.
+ """
+
+ def __init__(self):
+ resource.Resource.__init__(self)
+ component.Component.__init__(self, 'JSON')
+ self._remote_methods = []
+ self._local_methods = {}
+ if client.is_standalone():
+ self.get_remote_methods()
+
+ def get_remote_methods(self, result=None):
+ """
+ Updates remote methods from the daemon.
+
+ Returns:
+ t.i.d.Deferred: A deferred returning the available remote methods
+ """
+
+ def on_get_methods(methods):
+ self._remote_methods = methods
+ return methods
+
+ return client.daemon.get_method_list().addCallback(on_get_methods)
+
+ def _exec_local(self, method, params, request):
+ """
+ Handles executing all local methods.
+ """
+ if method == 'system.listMethods':
+ d = Deferred()
+ methods = list(self._remote_methods)
+ methods.extend(self._local_methods)
+ d.callback(methods)
+ return d
+ elif method in self._local_methods:
+ # This will eventually process methods that the server adds
+ # and any plugins.
+ meth = self._local_methods[method]
+ meth.__globals__['__request__'] = request
+ component.get('Auth').check_request(request, meth)
+ return meth(*params)
+ raise JSONException('Unknown system method')
+
+ def _exec_remote(self, method, params, request):
+ """
+ Executes methods using the Deluge client.
+ """
+ component.get('Auth').check_request(request, level=AUTH_LEVEL_DEFAULT)
+ core_component, method = method.split('.')
+ return getattr(getattr(client, core_component), method)(*params)
+
+ def _handle_request(self, request):
+ """
+ Takes some json data as a string and attempts to decode it, and process
+ the rpc object that should be contained, returning a deferred for all
+ procedure calls and the request id.
+ """
+ try:
+ request_data = json.loads(request.json.decode())
+ except (ValueError, TypeError):
+ raise JSONException('JSON not decodable')
+
+ try:
+ method = request_data['method']
+ params = request_data['params']
+ request_id = request_data['id']
+ except KeyError as ex:
+ message = 'Invalid JSON request, missing param %s in %s' % (
+ ex,
+ request_data,
+ )
+ raise JSONException(message)
+
+ result = None
+ error = None
+
+ try:
+ if method.startswith('system.') or method in self._local_methods:
+ result = self._exec_local(method, params, request)
+ elif method in self._remote_methods:
+ result = self._exec_remote(method, params, request)
+ else:
+ error = {'message': 'Unknown method', 'code': 2}
+ except NotAuthorizedError:
+ error = {'message': 'Not authenticated', 'code': 1}
+ except Exception as ex:
+ log.error('Error calling method `%s`: %s', method, ex)
+ log.exception(ex)
+ error = {'message': '%s: %s' % (ex.__class__.__name__, str(ex)), 'code': 3}
+
+ return request_id, result, error
+
+ def _on_rpc_request_finished(self, result, response, request):
+ """
+ Sends the response of any rpc calls back to the json-rpc client.
+ """
+ response['result'] = result
+ return self._send_response(request, response)
+
+ def _on_rpc_request_failed(self, reason, response, request):
+ """
+ Handles any failures that occurred while making an rpc call.
+ """
+ log.error(reason)
+ response['error'] = {
+ 'message': '%s: %s' % (reason.__class__.__name__, str(reason)),
+ 'code': 4,
+ }
+ return self._send_response(request, response)
+
+ def _on_json_request(self, request):
+ """
+ Handler to take the json data as a string and pass it on to the
+ _handle_request method for further processing.
+ """
+ content_type = request.getHeader(b'content-type').decode()
+ if content_type != 'application/json':
+ message = 'Invalid JSON request content-type: %s' % content_type
+ raise JSONException(message)
+
+ log.debug('json-request: %s', request.json)
+ response = {'result': None, 'error': None, 'id': None}
+ response['id'], d, response['error'] = self._handle_request(request)
+
+ if isinstance(d, Deferred):
+ d.addCallback(self._on_rpc_request_finished, response, request)
+ d.addErrback(self._on_rpc_request_failed, response, request)
+ return d
+ else:
+ response['result'] = d
+ return self._send_response(request, response)
+
+ def _on_json_request_failed(self, reason, request):
+ """
+ Returns the error in json response.
+ """
+ log.error(reason)
+ response = {
+ 'result': None,
+ 'id': None,
+ 'error': {
+ 'code': 5,
+ 'message': '%s: %s' % (reason.__class__.__name__, str(reason)),
+ },
+ }
+ return self._send_response(request, response)
+
+ def _send_response(self, request, response):
+ if request._disconnected:
+ return ''
+ response = json.dumps(response)
+ request.setHeader(b'content-type', b'application/json')
+ request.write(response.encode())
+ request.finish()
+ return server.NOT_DONE_YET
+
+ def render(self, request):
+ """
+ Handles all the POST requests made to the /json controller.
+ """
+ if request.method != b'POST':
+ request.setResponseCode(http.NOT_ALLOWED)
+ request.finish()
+ return server.NOT_DONE_YET
+
+ try:
+ request.content.seek(0)
+ request.json = request.content.read()
+ self._on_json_request(request)
+ return server.NOT_DONE_YET
+ except Exception as ex:
+ return self._on_json_request_failed(ex, request)
+
+ def register_object(self, obj, name=None):
+ """Registers an object to export it's rpc methods.
+
+ These methods should be exported with the export decorator prior
+ to registering the object.
+
+ Args:
+ obj (object): The object that we want to export.
+ name (str): The name to use. If None, uses the object class name.
+
+ """
+ name = name or obj.__class__.__name__
+ name = name.lower()
+
+ for d in dir(obj):
+ if d[0] == '_':
+ continue
+ if getattr(getattr(obj, d), '_json_export', False):
+ log.debug('Registering method: %s', name + '.' + d)
+ self._local_methods[name + '.' + d] = getattr(obj, d)
+
+ def deregister_object(self, obj):
+ """Deregisters an objects exported rpc methods.
+
+ Args:
+ obj (object): The object that was previously registered.
+
+ """
+ for key, value in self._local_methods.items():
+ if value.__self__ == obj:
+ del self._local_methods[key]
+
+
+FILES_KEYS = ['files', 'file_progress', 'file_priorities']
+
+
+class EventQueue(object):
+ """
+ This class subscribes to events from the core and stores them until all
+ the subscribed listeners have received the events.
+ """
+
+ def __init__(self):
+ self.__events = {}
+ self.__handlers = {}
+ self.__queue = {}
+ self.__requests = {}
+
+ def add_listener(self, listener_id, event):
+ """
+ Add a listener to the event queue.
+
+ :param listener_id: A unique id for the listener
+ :type listener_id: string
+ :param event: The event name
+ :type event: string
+ """
+ if event not in self.__events:
+
+ def on_event(*args):
+ for listener in self.__events[event]:
+ if listener not in self.__queue:
+ self.__queue[listener] = []
+ self.__queue[listener].append((event, args))
+
+ client.register_event_handler(event, on_event)
+ self.__handlers[event] = on_event
+ self.__events[event] = [listener_id]
+ elif listener_id not in self.__events[event]:
+ self.__events[event].append(listener_id)
+
+ def get_events(self, listener_id):
+ """
+ Retrieve the pending events for the listener.
+
+ :param listener_id: A unique id for the listener
+ :type listener_id: string
+ """
+
+ # Check to see if we have anything to return immediately
+ if listener_id in self.__queue:
+ queue = self.__queue[listener_id]
+ del self.__queue[listener_id]
+ return queue
+
+ # Create a deferred to and check again in 100ms
+ d = Deferred()
+ reactor.callLater(0.1, self._get_events, listener_id, 0, d)
+ return d
+
+ def _get_events(self, listener_id, count, d):
+ if listener_id in self.__queue:
+ queue = self.__queue[listener_id]
+ del self.__queue[listener_id]
+ d.callback(queue)
+ else:
+ # Prevent this loop going on indefinitely incase a client leaves
+ # the page or disconnects uncleanly.
+ if count >= 50:
+ d.callback(None)
+ else:
+ reactor.callLater(0.1, self._get_events, listener_id, count + 1, d)
+
+ def remove_listener(self, listener_id, event):
+ """
+ Remove a listener from the event queue.
+
+ :param listener_id: The unique id for the listener
+ :type listener_id: string
+ :param event: The event name
+ :type event: string
+ """
+ self.__events[event].remove(listener_id)
+ if not self.__events[event]:
+ client.deregister_event_handler(event, self.__handlers[event])
+ del self.__events[event]
+ del self.__handlers[event]
+
+
+class WebApi(JSONComponent):
+ """
+ The component that implements all the methods required for managing
+ the web interface. The complete web json interface also exposes all the
+ methods available from the core RPC.
+ """
+
+ XSS_VULN_KEYS = ['name', 'message', 'comment', 'tracker_status', 'peers']
+
+ def __init__(self):
+ super(WebApi, self).__init__('Web', depend=['SessionProxy'])
+ self.hostlist = HostList()
+ self.core_config = CoreConfig()
+ self.event_queue = EventQueue()
+ try:
+ self.sessionproxy = component.get('SessionProxy')
+ except KeyError:
+ self.sessionproxy = SessionProxy()
+
+ def disable(self):
+ client.deregister_event_handler(
+ 'PluginEnabledEvent', self._json.get_remote_methods
+ )
+ client.deregister_event_handler(
+ 'PluginDisabledEvent', self._json.get_remote_methods
+ )
+
+ if client.is_standalone():
+ component.get('Web.PluginManager').stop()
+ else:
+ client.disconnect()
+ client.set_disconnect_callback(None)
+
+ def enable(self):
+ client.register_event_handler(
+ 'PluginEnabledEvent', self._json.get_remote_methods
+ )
+ client.register_event_handler(
+ 'PluginDisabledEvent', self._json.get_remote_methods
+ )
+
+ if client.is_standalone():
+ component.get('Web.PluginManager').start()
+ else:
+ client.set_disconnect_callback(self._on_client_disconnect)
+ default_host_id = component.get('DelugeWeb').config['default_daemon']
+ if default_host_id:
+ return self.connect(default_host_id)
+
+ return defer.succeed(True)
+
+ def _on_client_connect(self, *args):
+ """Handles client successfully connecting to the daemon.
+
+ Invokes retrieving the method names and starts webapi and plugins.
+
+ """
+ d_methods = self._json.get_remote_methods()
+ component.get('Web.PluginManager').start()
+ self.start()
+ return d_methods
+
+ def _on_client_connect_fail(self, result, host_id):
+ log.error(
+ 'Unable to connect to daemon, check host_id "%s" is correct.', host_id
+ )
+
+ def _on_client_disconnect(self, *args):
+ component.get('Web.PluginManager').stop()
+ return self.stop()
+
+ def start(self):
+ self.core_config.start()
+ return self.sessionproxy.start()
+
+ def stop(self):
+ self.core_config.stop()
+ self.sessionproxy.stop()
+ return defer.succeed(True)
+
+ @export
+ def connect(self, host_id):
+ """Connect the web client to a daemon.
+
+ Args:
+ host_id (str): The id of the daemon in the host list.
+
+ Returns:
+ Deferred: List of methods the daemon supports.
+ """
+ d = self.hostlist.connect_host(host_id)
+ d.addCallback(self._on_client_connect)
+ d.addErrback(self._on_client_connect_fail, host_id)
+ return d
+
+ @export
+ def connected(self):
+ """
+ The current connection state.
+
+ :returns: True if the client is connected
+ :rtype: booleon
+ """
+ return client.connected()
+
+ @export
+ def disconnect(self):
+ """
+ Disconnect the web interface from the connected daemon.
+ """
+ d = client.disconnect()
+
+ def on_disconnect(reason):
+ return str(reason)
+
+ d.addCallback(on_disconnect)
+ return d
+
+ @export
+ def update_ui(self, keys, filter_dict):
+ """
+ Gather the information required for updating the web interface.
+
+ :param keys: the information about the torrents to gather
+ :type keys: list
+ :param filter_dict: the filters to apply when selecting torrents.
+ :type filter_dict: dictionary
+ :returns: The torrent and ui information.
+ :rtype: dictionary
+ """
+ d = Deferred()
+ ui_info = {
+ 'connected': client.connected(),
+ 'torrents': None,
+ 'filters': None,
+ 'stats': {
+ 'max_download': self.core_config.get('max_download_speed'),
+ 'max_upload': self.core_config.get('max_upload_speed'),
+ 'max_num_connections': self.core_config.get('max_connections_global'),
+ },
+ }
+
+ if not client.connected():
+ d.callback(ui_info)
+ return d
+
+ def got_stats(stats):
+ ui_info['stats']['num_connections'] = stats['num_peers']
+ ui_info['stats']['upload_rate'] = stats['payload_upload_rate']
+ ui_info['stats']['download_rate'] = stats['payload_download_rate']
+ ui_info['stats']['download_protocol_rate'] = (
+ stats['download_rate'] - stats['payload_download_rate']
+ )
+ ui_info['stats']['upload_protocol_rate'] = (
+ stats['upload_rate'] - stats['payload_upload_rate']
+ )
+ ui_info['stats']['dht_nodes'] = stats['dht_nodes']
+ ui_info['stats']['has_incoming_connections'] = stats[
+ 'has_incoming_connections'
+ ]
+
+ def got_filters(filters):
+ ui_info['filters'] = filters
+
+ def got_free_space(free_space):
+ ui_info['stats']['free_space'] = free_space
+
+ def got_external_ip(external_ip):
+ ui_info['stats']['external_ip'] = external_ip
+
+ def got_torrents(torrents):
+ ui_info['torrents'] = torrents
+
+ def on_complete(result):
+ d.callback(ui_info)
+
+ d1 = component.get('SessionProxy').get_torrents_status(filter_dict, keys)
+ d1.addCallback(got_torrents)
+
+ d2 = client.core.get_filter_tree()
+ d2.addCallback(got_filters)
+
+ d3 = client.core.get_session_status(
+ [
+ 'num_peers',
+ 'payload_download_rate',
+ 'payload_upload_rate',
+ 'download_rate',
+ 'upload_rate',
+ 'dht_nodes',
+ 'has_incoming_connections',
+ ]
+ )
+ d3.addCallback(got_stats)
+
+ d4 = client.core.get_free_space(self.core_config.get('download_location'))
+ d4.addCallback(got_free_space)
+
+ d5 = client.core.get_external_ip()
+ d5.addCallback(got_external_ip)
+
+ dl = DeferredList([d1, d2, d3, d4, d5], consumeErrors=True)
+ dl.addCallback(on_complete)
+ return d
+
+ def _on_got_files(self, torrent, d):
+ files = torrent.get('files')
+ file_progress = torrent.get('file_progress')
+ file_priorities = torrent.get('file_priorities')
+
+ paths = []
+ info = {}
+ for index, torrent_file in enumerate(files):
+ path = xml_escape(torrent_file['path'])
+ paths.append(path)
+ torrent_file['progress'] = file_progress[index]
+ torrent_file['priority'] = file_priorities[index]
+ torrent_file['index'] = index
+ torrent_file['path'] = path
+ info[path] = torrent_file
+
+ # update the directory info
+ dirname = os.path.dirname(path)
+ while dirname:
+ dirinfo = info.setdefault(dirname, {})
+ dirinfo['size'] = dirinfo.get('size', 0) + torrent_file['size']
+ if 'priority' not in dirinfo:
+ dirinfo['priority'] = torrent_file['priority']
+ else:
+ if dirinfo['priority'] != torrent_file['priority']:
+ dirinfo['priority'] = 9
+
+ progresses = dirinfo.setdefault('progresses', [])
+ progresses.append(torrent_file['size'] * torrent_file['progress'] / 100)
+ dirinfo['progress'] = sum(progresses) / dirinfo['size'] * 100
+ dirinfo['path'] = dirname
+ dirname = os.path.dirname(dirname)
+
+ def walk(path, item):
+ if item['type'] == 'dir':
+ item.update(info[path])
+ return item
+ else:
+ item.update(info[path])
+ return item
+
+ file_tree = FileTree2(paths)
+ file_tree.walk(walk)
+ d.callback(file_tree.get_tree())
+
+ def _on_torrent_status(self, torrent, d):
+ for key in self.XSS_VULN_KEYS:
+ try:
+ if key == 'peers':
+ for peer in torrent[key]:
+ peer['client'] = xml_escape(peer['client'])
+ else:
+ torrent[key] = xml_escape(torrent[key])
+ except KeyError:
+ pass
+ d.callback(torrent)
+
+ @export
+ def get_torrent_status(self, torrent_id, keys):
+ """Get the status for a torrent, filtered by status keys."""
+ main_deferred = Deferred()
+ d = component.get('SessionProxy').get_torrent_status(torrent_id, keys)
+ d.addCallback(self._on_torrent_status, main_deferred)
+ return main_deferred
+
+ @export
+ def get_torrent_files(self, torrent_id):
+ """
+ Gets the files for a torrent in tree format
+
+ :param torrent_id: the id of the torrent to retrieve.
+ :type torrent_id: string
+ :returns: The torrents files in a tree
+ :rtype: dictionary
+ """
+ main_deferred = Deferred()
+ d = component.get('SessionProxy').get_torrent_status(torrent_id, FILES_KEYS)
+ d.addCallback(self._on_got_files, main_deferred)
+ return main_deferred
+
+ @export
+ def download_torrent_from_url(self, url, cookie=None):
+ """
+ Download a torrent file from a url to a temporary directory.
+
+ :param url: the url of the torrent
+ :type url: string
+ :returns: the temporary file name of the torrent file
+ :rtype: string
+ """
+
+ def on_download_success(result):
+ log.debug('Successfully downloaded %s to %s', url, result)
+ return result
+
+ def on_download_fail(result):
+ log.error('Failed to add torrent from url %s', url)
+ return result
+
+ tempdir = tempfile.mkdtemp(prefix='delugeweb-')
+ tmp_file = os.path.join(tempdir, url.split('/')[-1])
+ log.debug('filename: %s', tmp_file)
+ headers = {}
+ if cookie:
+ headers['Cookie'] = cookie
+ log.debug('cookie: %s', cookie)
+ d = httpdownloader.download_file(url, tmp_file, headers=headers)
+ d.addCallbacks(on_download_success, on_download_fail)
+ return d
+
+ @export
+ def get_torrent_info(self, filename):
+ """
+ Return information about a torrent on the filesystem.
+
+ :param filename: the path to the torrent
+ :type filename: string
+
+ :returns: information about the torrent:
+
+ ::
+
+ {
+ "name": the torrent name,
+ "files_tree": the files the torrent contains,
+ "info_hash" the torrents info_hash
+ }
+
+ :rtype: dictionary
+ """
+ try:
+ torrent_info = TorrentInfo(filename.strip(), 2)
+ return torrent_info.as_dict('name', 'info_hash', 'files_tree')
+ except Exception as ex:
+ log.error(ex)
+ return False
+
+ @export
+ def get_magnet_info(self, uri):
+ """Parse a magnet URI for hash and name."""
+ return get_magnet_info(uri)
+
+ @export
+ def add_torrents(self, torrents):
+ """
+ Add torrents by file
+
+ :param torrents: A list of dictionaries containing the torrent \
+ path and torrent options to add with.
+ :type torrents: list
+
+ ::
+
+ json_api.web.add_torrents([{
+ "path": "/tmp/deluge-web/some-torrent-file.torrent",
+ "options": {"download_location": "/home/deluge/"}
+ }])
+
+ """
+ deferreds = []
+
+ for torrent in torrents:
+ if is_magnet(torrent['path']):
+ log.info(
+ 'Adding torrent from magnet uri `%s` with options `%r`',
+ torrent['path'],
+ torrent['options'],
+ )
+ d = client.core.add_torrent_magnet(torrent['path'], torrent['options'])
+ deferreds.append(d)
+ else:
+ filename = os.path.basename(torrent['path'])
+ with open(torrent['path'], 'rb') as _file:
+ fdump = b64encode(_file.read())
+ log.info(
+ 'Adding torrent from file `%s` with options `%r`',
+ filename,
+ torrent['options'],
+ )
+ d = client.core.add_torrent_file_async(
+ filename, fdump, torrent['options']
+ )
+ deferreds.append(d)
+ return DeferredList(deferreds, consumeErrors=False)
+
+ def _get_host(self, host_id):
+ """Information about a host from supplied host id.
+
+ Args:
+ host_id (str): The id of the host.
+
+ Returns:
+ list: The host information, empty list if not found.
+
+ """
+ return list(self.hostlist.get_host_info(host_id))
+
+ @export
+ def get_hosts(self):
+ """
+ Return the hosts in the hostlist.
+ """
+ log.debug('get_hosts called')
+ return self.hostlist.get_hosts_info()
+
+ @export
+ def get_host_status(self, host_id):
+ """
+ Returns the current status for the specified host.
+
+ :param host_id: the hash id of the host
+ :type host_id: string
+
+ """
+
+ def response(result):
+ return result
+
+ return self.hostlist.get_host_status(host_id).addCallback(response)
+
+ @export
+ def add_host(self, host, port, username='', password=''):
+ """Adds a host to the list.
+
+ Args:
+ host (str): The IP or hostname of the deluge daemon.
+ port (int): The port of the deluge daemon.
+ username (str): The username to login to the daemon with.
+ password (str): The password to login to the daemon with.
+
+ Returns:
+ tuple: A tuple of (bool, str). If True will contain the host_id, otherwise
+ if False will contain the error message.
+ """
+ try:
+ host_id = self.hostlist.add_host(host, port, username, password)
+ except ValueError as ex:
+ return False, str(ex)
+ else:
+ return True, host_id
+
+ @export
+ def edit_host(self, host_id, host, port, username='', password=''):
+ """Edit host details in the hostlist.
+
+ Args:
+ host_id (str): The host identifying hash.
+ host (str): The IP or hostname of the deluge daemon.
+ port (int): The port of the deluge daemon.
+ username (str): The username to login to the daemon with.
+ password (str): The password to login to the daemon with.
+
+ Returns:
+ bool: True if succesful, False otherwise.
+
+ """
+ return self.hostlist.update_host(host_id, host, port, username, password)
+
+ @export
+ def remove_host(self, host_id):
+ """Removes a host from the hostlist.
+
+ Args:
+ host_id (str): The host identifying hash.
+
+ Returns:
+ bool: True if succesful, False otherwise.
+
+ """
+ return self.hostlist.remove_host(host_id)
+
+ @export
+ def start_daemon(self, port):
+ """
+ Starts a local daemon.
+ """
+ client.start_daemon(port, get_config_dir())
+
+ @export
+ def stop_daemon(self, host_id):
+ """
+ Stops a running daemon.
+
+ :param host_id: the hash id of the host
+ :type host_id: string
+ """
+ main_deferred = Deferred()
+ host = self._get_host(host_id)
+ if not host:
+ main_deferred.callback((False, _('Daemon does not exist')))
+ return main_deferred
+
+ try:
+
+ def on_connect(connected, c):
+ if not connected:
+ main_deferred.callback((False, _('Daemon not running')))
+ return
+ c.daemon.shutdown()
+ main_deferred.callback((True,))
+
+ def on_connect_failed(reason):
+ main_deferred.callback((False, reason))
+
+ host, port, user, password = host[1:5]
+ c = Client()
+ d = c.connect(host, port, user, password)
+ d.addCallback(on_connect, c)
+ d.addErrback(on_connect_failed)
+ except Exception:
+ main_deferred.callback((False, 'An error occurred'))
+ return main_deferred
+
+ @export
+ def get_config(self):
+ """
+ Get the configuration dictionary for the web interface.
+
+ :rtype: dictionary
+ :returns: the configuration
+ """
+ config = component.get('DelugeWeb').config.config.copy()
+ del config['sessions']
+ del config['pwd_salt']
+ del config['pwd_sha1']
+ return config
+
+ @export
+ def set_config(self, config):
+ """
+ Sets the configuration dictionary for the web interface.
+
+ :param config: The configuration options to update
+ :type config: dictionary
+ """
+ web_config = component.get('DelugeWeb').config
+ for key in config:
+ if key in ['sessions', 'pwd_salt', 'pwd_sha1']:
+ log.warning('Ignored attempt to overwrite web config key: %s', key)
+ continue
+ web_config[key] = config[key]
+
+ @export
+ def get_plugins(self):
+ """All available and enabled plugins within WebUI.
+
+ Note:
+ This does not represent all plugins from deluge.client.core.
+
+ Returns:
+ dict: A dict containing 'available_plugins' and 'enabled_plugins' lists.
+
+ """
+
+ return {
+ 'enabled_plugins': list(component.get('Web.PluginManager').plugins),
+ 'available_plugins': component.get('Web.PluginManager').available_plugins,
+ }
+
+ @export
+ def get_plugin_info(self, name):
+ """Get the details for a plugin."""
+ return component.get('Web.PluginManager').get_plugin_info(name)
+
+ @export
+ def get_plugin_resources(self, name):
+ """Get the resource data files for a plugin."""
+ return component.get('Web.PluginManager').get_plugin_resources(name)
+
+ @export
+ def upload_plugin(self, filename, path):
+ """Upload a plugin to config."""
+ main_deferred = Deferred()
+
+ shutil.copyfile(path, os.path.join(get_config_dir(), 'plugins', filename))
+ component.get('Web.PluginManager').scan_for_plugins()
+
+ if client.is_localhost():
+ client.core.rescan_plugins()
+ return True
+ with open(path, 'rb') as _file:
+ plugin_data = b64encode(_file.read())
+
+ def on_upload_complete(*args):
+ client.core.rescan_plugins()
+ component.get('Web.PluginManager').scan_for_plugins()
+ main_deferred.callback(True)
+
+ def on_upload_error(*args):
+ main_deferred.callback(False)
+
+ d = client.core.upload_plugin(filename, plugin_data)
+ d.addCallback(on_upload_complete)
+ d.addErrback(on_upload_error)
+ return main_deferred
+
+ @export
+ def register_event_listener(self, event):
+ """
+ Add a listener to the event queue.
+
+ :param event: The event name
+ :type event: string
+ """
+ self.event_queue.add_listener(__request__.session_id, event)
+
+ @export
+ def deregister_event_listener(self, event):
+ """
+ Remove an event listener from the event queue.
+
+ :param event: The event name
+ :type event: string
+ """
+ self.event_queue.remove_listener(__request__.session_id, event)
+
+ @export
+ def get_events(self):
+ """
+ Retrieve the pending events for the session.
+ """
+ return self.event_queue.get_events(__request__.session_id)
+
+
+class WebUtils(JSONComponent):
+ """
+ Utility functions for the webui that do not fit in the WebApi.
+ """
+
+ def __init__(self):
+ super(WebUtils, self).__init__('WebUtils')
+
+ @export
+ def get_languages(self):
+ """
+ Get the available translated languages
+
+ Returns:
+ list: of tuples [(lang-id, language-name), ...]
+ """
+ return get_languages()
diff --git a/deluge/ui/web/pluginmanager.py b/deluge/ui/web/pluginmanager.py
new file mode 100644
index 0000000..24f20ce
--- /dev/null
+++ b/deluge/ui/web/pluginmanager.py
@@ -0,0 +1,161 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import logging
+import os
+
+from deluge import component
+from deluge.configmanager import ConfigManager
+from deluge.pluginmanagerbase import PluginManagerBase
+from deluge.ui.client import client
+
+log = logging.getLogger(__name__)
+
+
+def gather_info(plugin):
+ # Get the scripts for the plugin
+ scripts = getattr(plugin, 'scripts', ())
+ debug_scripts = getattr(plugin, 'debug_scripts') or scripts
+
+ directories = []
+ for script in scripts + debug_scripts:
+ if os.path.dirname(script) not in directories:
+ directories.append(os.path.dirname(script))
+
+ return {
+ 'scripts': scripts,
+ 'debug_scripts': debug_scripts,
+ 'script_directories': directories,
+ }
+
+
+class PluginManager(PluginManagerBase, component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'Web.PluginManager')
+ self.config = ConfigManager('web.conf')
+ PluginManagerBase.__init__(self, 'web.conf', 'deluge.plugin.web')
+
+ client.register_event_handler(
+ 'PluginEnabledEvent', self._on_plugin_enabled_event
+ )
+ client.register_event_handler(
+ 'PluginDisabledEvent', self._on_plugin_disabled_event
+ )
+
+ def _on_get_enabled_plugins(self, plugins):
+ for plugin in plugins:
+ self.enable_plugin(plugin)
+
+ def _on_plugin_enabled_event(self, name):
+ self.enable_plugin(name)
+
+ def _on_plugin_disabled_event(self, name):
+ self.disable_plugin(name)
+
+ def disable_plugin(self, name):
+ # Get the plugin instance
+ try:
+ plugin = component.get('WebPlugin.' + name)
+ except KeyError:
+ log.debug(
+ '%s plugin contains no WebUI code, ignoring WebUI disable call.', name
+ )
+ return
+
+ info = gather_info(plugin)
+
+ scripts = component.get('Scripts')
+ for script in info['scripts']:
+ scripts.remove_script(
+ '%s/%s' % (name.lower(), os.path.basename(script).lower())
+ )
+
+ for script in info['debug_scripts']:
+ scripts.remove_script(
+ '%s/%s' % (name.lower(), os.path.basename(script).lower()), 'debug'
+ )
+ scripts.remove_script(
+ '%s/%s' % (name.lower(), os.path.basename(script).lower()), 'dev'
+ )
+
+ super(PluginManager, self).disable_plugin(name)
+
+ def enable_plugin(self, name):
+ super(PluginManager, self).enable_plugin(name)
+
+ # Get the plugin instance
+ try:
+ plugin = component.get('WebPlugin.' + name)
+ except KeyError:
+ log.info(
+ '%s plugin contains no WebUI code, ignoring WebUI enable call.', name
+ )
+ return
+
+ info = gather_info(plugin)
+
+ scripts = component.get('Scripts')
+ for script in info['scripts']:
+ log.debug('adding script %s for %s', name, os.path.basename(script))
+ scripts.add_script(
+ '%s/%s' % (name.lower(), os.path.basename(script)), script
+ )
+
+ for script in info['debug_scripts']:
+ log.debug('adding debug script %s for %s', name, os.path.basename(script))
+ scripts.add_script(
+ '%s/%s' % (name.lower(), os.path.basename(script)), script, 'debug'
+ )
+ scripts.add_script(
+ '%s/%s' % (name.lower(), os.path.basename(script)), script, 'dev'
+ )
+
+ def start(self):
+ """
+ Start up the plugin manager
+ """
+ # Update the enabled plugins from the core
+ d = client.core.get_enabled_plugins()
+ d.addCallback(self._on_get_enabled_plugins)
+
+ def stop(self):
+ """
+ Stop the plugin manager
+ """
+ self.disable_plugins()
+ client.deregister_event_handler(
+ 'PluginEnabledEvent', self._on_plugin_enabled_event
+ )
+ client.deregister_event_handler(
+ 'PluginDisabledEvent', self._on_plugin_disabled_event
+ )
+
+ def update(self):
+ pass
+
+ def get_plugin_resources(self, name):
+ # Get the plugin instance
+ try:
+ plugin = component.get('WebPlugin.' + name)
+ except KeyError:
+ log.info('Plugin has no web ui')
+ return
+ info = gather_info(plugin)
+ info['name'] = name
+ info['scripts'] = [
+ 'js/%s/%s' % (name.lower(), os.path.basename(s)) for s in info['scripts']
+ ]
+ info['debug_scripts'] = [
+ 'js/%s/%s' % (name.lower(), os.path.basename(s))
+ for s in info['debug_scripts']
+ ]
+ del info['script_directories']
+ return info
diff --git a/deluge/ui/web/render/404.html b/deluge/ui/web/render/404.html
new file mode 100644
index 0000000..8624de4
--- /dev/null
+++ b/deluge/ui/web/render/404.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Deluge: Web UI ${version}</title>
+ </head>
+ <body>
+ <h1>Error 404 - Page Not Found</h1>
+ <b>The requested template file was not found.</b>
+ </body>
+</html>
diff --git a/deluge/ui/web/render/tab_status.html b/deluge/ui/web/render/tab_status.html
new file mode 100644
index 0000000..deed7d6
--- /dev/null
+++ b/deluge/ui/web/render/tab_status.html
@@ -0,0 +1,29 @@
+<dl>
+ <dt class="downloaded">${_("Downloaded:")}</dt><dd class="downloaded"/>
+ <dt class="uploaded">${_("Uploaded:")}</dt><dd class="uploaded"/>
+ <dt class="share">${_("Share Ratio:")}</dt><dd class="share"/>
+ <dt class="announce">${_("Next Announce:")}</dt><dd class="announce"/>
+ <dt class="tracker">${_("Tracker Status:")}</dt><dd class="tracker_status"/>
+</dl>
+<dl>
+ <dt class="downspeed">${_("Down Speed:")}</dt><dd class="downspeed"/>
+ <dt class="upspeed">${_("Up Speed:")}</dt><dd class="upspeed"/>
+ <dt class="eta">${_("ETA:")}</dt><dd class="eta"/>
+ <dt class="pieces">${_("Pieces:")}</dt><dd class="pieces"/>
+ <dt class="time_since_transfer">${_("Last Transfer:")}</dt><dd class="time_since_transfer"/>
+</dl>
+<dl>
+ <dt class="seeds">${_("Seeds:")}</dt><dd class="seeds"/>
+ <dt class="peers">${_("Peers:")}</dt><dd class="peers"/>
+ <dt class="avail">${_("Availability:")}</dt><dd class="avail"/>
+ <dt class="auto_managed">${_("Auto Managed:")}</dt><dd class="auto_managed"/>
+ <dt class="last_seen_complete">${_("Complete Seen:")}</dt><dd class="last_seen_complete"/>
+</dl>
+<dl>
+ <dt class="active_time">${_("Active Time:")}</dt><dd class="active_time"/>
+ <dt class="seeding_time">${_("Seeding Time:")}</dt><dd class="seeding_time"/>
+ <dt class="seed_rank">${_("Seed Rank:")}</dt><dd class="seed_rank"/>
+ <dt class="time_rank">${_("Date Added:")}</dt><dd class="time_added"/>
+ <dt class="completed_time">${_("Completed:")}</dt><dd class="completed_time"/>
+</dl>
+<br style="clear: both;" />
diff --git a/deluge/ui/web/server.py b/deluge/ui/web/server.py
new file mode 100644
index 0000000..192c2b7
--- /dev/null
+++ b/deluge/ui/web/server.py
@@ -0,0 +1,806 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2010 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import unicode_literals
+
+import fnmatch
+import json
+import logging
+import mimetypes
+import os
+import tempfile
+
+from twisted.application import internet, service
+from twisted.internet import defer, reactor
+from twisted.web import http, resource, server, static
+from twisted.web.resource import EncodingResourceWrapper
+
+from deluge import common, component, configmanager
+from deluge.common import is_ipv6
+from deluge.core.rpcserver import check_ssl_keys
+from deluge.crypto_utils import get_context_factory
+from deluge.i18n import set_language, setup_translation
+from deluge.ui.tracker_icons import TrackerIcons
+from deluge.ui.web.auth import Auth
+from deluge.ui.web.common import Template
+from deluge.ui.web.json_api import JSON, WebApi, WebUtils
+from deluge.ui.web.pluginmanager import PluginManager
+
+log = logging.getLogger(__name__)
+
+CONFIG_DEFAULTS = {
+ # Misc Settings
+ 'enabled_plugins': [],
+ 'default_daemon': '',
+ # Auth Settings
+ 'pwd_salt': 'c26ab3bbd8b137f99cd83c2c1c0963bcc1a35cad',
+ 'pwd_sha1': '2ce1a410bcdcc53064129b6d950f2e9fee4edc1e',
+ 'session_timeout': 3600,
+ 'sessions': {},
+ # UI Settings
+ 'sidebar_show_zero': False,
+ 'sidebar_multiple_filters': True,
+ 'show_session_speed': False,
+ 'show_sidebar': True,
+ 'theme': 'gray',
+ 'first_login': True,
+ 'language': '',
+ # Server Settings
+ 'base': '/',
+ 'interface': '0.0.0.0',
+ 'port': 8112,
+ 'https': False,
+ 'pkey': 'ssl/daemon.pkey',
+ 'cert': 'ssl/daemon.cert',
+}
+
+UI_CONFIG_KEYS = (
+ 'theme',
+ 'sidebar_show_zero',
+ 'sidebar_multiple_filters',
+ 'show_session_speed',
+ 'base',
+ 'first_login',
+)
+
+
+def rpath(*paths):
+ """Convert a relative path into an absolute path relative to the location
+ of this script.
+ """
+ return common.resource_filename('deluge.ui.web', os.path.join(*paths))
+
+
+class GetText(resource.Resource):
+ def render(self, request):
+ request.setHeader(b'content-type', b'text/javascript; encoding=utf-8')
+ template = Template(filename=rpath('js', 'gettext.js'))
+ return template.render()
+
+
+class MockGetText(resource.Resource):
+ """GetText Mocking class
+
+ This class will mock the file `gettext.js` in case it does not exists.
+ It will be used to define the `_` (underscore) function for translations,
+ and will return the string to translate, as is.
+ """
+
+ def render(self, request):
+ request.setHeader(b'content-type', b'text/javascript; encoding=utf-8')
+ return b'function _(string) { return string; }'
+
+
+class Upload(resource.Resource):
+ """
+ Twisted Web resource to handle file uploads
+ """
+
+ def render(self, request):
+ """
+ Saves all uploaded files to the disk and returns a list of filenames,
+ each on a new line.
+ """
+
+ # Block all other HTTP methods.
+ if request.method != b'POST':
+ request.setResponseCode(http.NOT_ALLOWED)
+ request.finish()
+ return server.NOT_DONE_YET
+
+ files = request.args.get(b'file', [])
+ filenames = []
+
+ if files:
+ tempdir = tempfile.mkdtemp(prefix='delugeweb-')
+ log.debug('uploading files to %s', tempdir)
+
+ for upload in files:
+ fd, fn = tempfile.mkstemp('.torrent', dir=tempdir)
+ os.write(fd, upload)
+ os.close(fd)
+ filenames.append(fn)
+
+ log.debug('uploaded %d file(s)', len(filenames))
+
+ request.setHeader(b'content-type', b'text/html')
+ request.setResponseCode(http.OK)
+ return json.dumps({'success': bool(filenames), 'files': filenames}).encode(
+ 'utf8'
+ )
+
+
+class Render(resource.Resource):
+ def __init__(self):
+ resource.Resource.__init__(self)
+ # Make a list of all the template files to check requests against.
+ self.template_files = fnmatch.filter(os.listdir(rpath('render')), '*.html')
+
+ def getChild(self, path, request): # NOQA: N802
+ request.render_file = path
+ return EncodingResourceWrapper(self, [server.GzipEncoderFactory()])
+
+ def render(self, request):
+ log.debug('Render template file: %s', request.render_file)
+ if not hasattr(request, 'render_file'):
+ request.setResponseCode(http.INTERNAL_SERVER_ERROR)
+ return ''
+
+ request.setHeader(b'content-type', b'text/html')
+
+ tpl_file = request.render_file.decode()
+ if tpl_file in self.template_files:
+ request.setResponseCode(http.OK)
+ else:
+ request.setResponseCode(http.NOT_FOUND)
+ tpl_file = '404.html'
+
+ template = Template(filename=rpath(os.path.join('render', tpl_file)))
+ return template.render()
+
+
+class Tracker(resource.Resource):
+ def __init__(self):
+ resource.Resource.__init__(self)
+ try:
+ self.tracker_icons = component.get('TrackerIcons')
+ except KeyError:
+ self.tracker_icons = TrackerIcons()
+
+ def getChild(self, path, request): # NOQA: N802
+ request.tracker_name = path
+ return self
+
+ def on_got_icon(self, icon, request):
+ if icon:
+ request.setHeader(
+ b'cache-control', b'public, must-revalidate, max-age=86400'
+ )
+ request.setHeader(b'content-type', icon.get_mimetype().encode('utf8'))
+ request.setResponseCode(http.OK)
+ request.write(icon.get_data())
+ request.finish()
+ else:
+ request.setResponseCode(http.NOT_FOUND)
+ request.finish()
+
+ def render(self, request):
+ d = self.tracker_icons.fetch(request.tracker_name)
+ d.addCallback(self.on_got_icon, request)
+ return server.NOT_DONE_YET
+
+
+class Flag(resource.Resource):
+ def getChild(self, path, request): # NOQA: N802
+ request.country = path
+ return self
+
+ def render(self, request):
+ flag = request.country.decode('utf-8').lower() + '.png'
+ path = ('ui', 'data', 'pixmaps', 'flags', flag)
+ filename = common.resource_filename('deluge', os.path.join(*path))
+ if os.path.exists(filename):
+ request.setHeader(
+ b'cache-control', b'public, must-revalidate, max-age=86400'
+ )
+ request.setHeader(b'content-type', b'image/png')
+ with open(filename, 'rb') as _file:
+ data = _file.read()
+ request.setResponseCode(http.OK)
+ return data
+ else:
+ request.setResponseCode(http.NOT_FOUND)
+ return ''
+
+
+class LookupResource(resource.Resource, component.Component):
+ def __init__(self, name, *directories):
+ resource.Resource.__init__(self)
+ component.Component.__init__(self, name)
+
+ self.__paths = {}
+ for directory in directories:
+ self.add_directory(directory)
+
+ def add_directory(self, directory, path=''):
+ log.debug('Adding directory `%s` with path `%s`', directory, path)
+ paths = self.__paths.setdefault(path, [])
+ paths.append(directory)
+
+ def remove_directory(self, directory, path=''):
+ log.debug('Removing directory `%s`', directory)
+ self.__paths[path].remove(directory)
+
+ def getChild(self, path, request): # NOQA: N802
+ if hasattr(request, 'lookup_path'):
+ request.lookup_path = os.path.join(request.lookup_path, path)
+ else:
+ request.lookup_path = path
+
+ if request.uri.endswith(b'css'):
+ return EncodingResourceWrapper(self, [server.GzipEncoderFactory()])
+ else:
+ return self
+
+ def render(self, request):
+ log.debug('Requested path: %s', request.lookup_path)
+ path = os.path.dirname(request.lookup_path).decode()
+
+ if path in self.__paths:
+ filename = os.path.basename(request.path).decode()
+ for directory in self.__paths[path]:
+ path = os.path.join(directory, filename)
+ if os.path.isfile(path):
+ log.debug('Serving path: %s', path)
+ mime_type = mimetypes.guess_type(path)
+ request.setHeader(b'content-type', mime_type[0].encode())
+ with open(path, 'rb') as _file:
+ data = _file.read()
+ return data
+
+ request.setResponseCode(http.NOT_FOUND)
+ request.setHeader(b'content-type', b'text/html')
+ template = Template(filename=rpath(os.path.join('render', '404.html')))
+ return template.render()
+
+
+class ScriptResource(resource.Resource, component.Component):
+ def __init__(self):
+ resource.Resource.__init__(self)
+ component.Component.__init__(self, 'Scripts')
+ self.__scripts = {}
+ for script_type in ['normal', 'debug', 'dev']:
+ self.__scripts[script_type] = {
+ 'scripts': {},
+ 'order': [],
+ 'files_exist': True,
+ }
+
+ def has_script_type_files(self, script_type):
+ """Returns whether all the script files exist for this script type.
+
+ Args:
+ script_type (str): The script type to check (normal, debug, dev).
+
+ Returns:
+ bool: True if the files for this script type exist, otherwise False.
+
+ """
+ return self.__scripts[script_type]['files_exist']
+
+ def add_script(self, path, filepath, script_type=None):
+ """
+ Adds a script or scripts to the script resource.
+
+ :param path: The path of the script (this supports globbing)
+ :type path: string
+ :param filepath: The physical location of the script
+ :type filepath: string
+ :param script_type: The type of script to add (normal, debug, dev)
+ :param script_type: string
+ """
+ if script_type not in ('dev', 'debug', 'normal'):
+ script_type = 'normal'
+
+ self.__scripts[script_type]['scripts'][path] = filepath
+ self.__scripts[script_type]['order'].append(path)
+ if not os.path.isfile(filepath):
+ self.__scripts[script_type]['files_exist'] = False
+
+ def add_script_folder(self, path, filepath, script_type=None, recurse=True):
+ """
+ Adds a folder of scripts to the script resource.
+
+ :param path: The path of the folder
+ :type path: string
+ :param filepath: The physical location of the script
+ :type filepath: string
+ :param script_type: The type of script to add (normal, debug, dev)
+ :param script_type: string
+ :param recurse: Whether or not to recurse into other folders
+ :param recurse: bool
+ """
+ if script_type not in ('dev', 'debug', 'normal'):
+ script_type = 'normal'
+
+ self.__scripts[script_type]['scripts'][path] = (filepath, recurse)
+ self.__scripts[script_type]['order'].append(path)
+ if not os.path.isdir(filepath):
+ self.__scripts[script_type]['files_exist'] = False
+
+ def remove_script(self, path, script_type=None):
+ """
+ Removes a script or folder of scripts from the script resource.
+
+ :param path: The path of the folder
+ :type path: string
+ :param script_type: The type of script to add (normal, debug, dev)
+ :param script_type: string
+ """
+ if script_type not in ('dev', 'debug', 'normal'):
+ script_type = 'normal'
+
+ del self.__scripts[script_type]['scripts'][path]
+ self.__scripts[script_type]['order'].remove(path)
+
+ def get_scripts(self, script_type=None):
+ """
+ Returns a list of the scripts that can be used for producing
+ script tags.
+
+ :param script_type: The type of scripts to get (normal, debug, dev)
+ :param script_type: string
+ """
+ if script_type not in ('dev', 'debug', 'normal'):
+ script_type = 'normal'
+
+ _scripts = self.__scripts[script_type]['scripts']
+ _order = self.__scripts[script_type]['order']
+
+ scripts = []
+ for path in _order:
+ # Index for grouping the scripts when inserting.
+ script_idx = len(scripts)
+ # A folder resource is enclosed in a tuple.
+ if isinstance(_scripts[path], tuple):
+ filepath, recurse = _scripts[path]
+ for root, dirnames, filenames in os.walk(filepath):
+ dirnames.sort(reverse=True)
+ files = sorted(fnmatch.filter(filenames, '*.js'))
+
+ order_file = os.path.join(root, '.order')
+ if os.path.isfile(order_file):
+ with open(order_file, 'r') as _file:
+ for line in _file:
+ if line.startswith('+ '):
+ order_filename = line.split()[1]
+ files.pop(files.index(order_filename))
+ files.insert(0, order_filename)
+
+ # Ensure sub-directory scripts are top of list with root directory scripts bottom.
+ if dirnames:
+ scripts.extend(
+ ['js/' + os.path.basename(root) + '/' + f for f in files]
+ )
+ else:
+ dirpath = (
+ os.path.basename(os.path.dirname(root))
+ + '/'
+ + os.path.basename(root)
+ )
+ for filename in reversed(files):
+ scripts.insert(script_idx, 'js/' + dirpath + '/' + filename)
+
+ if not recurse:
+ break
+ else:
+ scripts.append('js/' + path)
+ return scripts
+
+ def getChild(self, path, request): # NOQA: N802
+ if hasattr(request, 'lookup_path'):
+ request.lookup_path += b'/' + path
+ else:
+ request.lookup_path = path
+ return EncodingResourceWrapper(self, [server.GzipEncoderFactory()])
+
+ def render(self, request):
+ log.debug('Requested path: %s', request.lookup_path)
+ lookup_path = request.lookup_path.decode()
+ for script_type in ('dev', 'debug', 'normal'):
+ scripts = self.__scripts[script_type]['scripts']
+ for pattern in scripts:
+ if not lookup_path.startswith(pattern):
+ continue
+
+ filepath = scripts[pattern]
+ if isinstance(filepath, tuple):
+ filepath = filepath[0]
+
+ path = filepath + lookup_path[len(pattern) :]
+
+ if not os.path.isfile(path):
+ continue
+
+ log.debug('Serving path: %s', path)
+ mime_type = mimetypes.guess_type(path)
+ request.setHeader(b'content-type', mime_type[0].encode())
+ with open(path, 'rb') as _file:
+ data = _file.read()
+ return data
+
+ request.setResponseCode(http.NOT_FOUND)
+ request.setHeader(b'content-type', b'text/html')
+ template = Template(filename=rpath(os.path.join('render', '404.html')))
+ return template.render()
+
+
+class Themes(static.File):
+ def getChild(self, path, request): # NOQA: N802
+ child = static.File.getChild(self, path, request)
+ if request.uri.endswith(b'css'):
+ return EncodingResourceWrapper(child, [server.GzipEncoderFactory()])
+ else:
+ return child
+
+
+class TopLevel(resource.Resource):
+
+ __stylesheets = [
+ 'css/ext-all-notheme.css',
+ 'css/ext-extensions.css',
+ 'css/deluge.css',
+ ]
+
+ def __init__(self):
+ resource.Resource.__init__(self)
+
+ self.putChild(b'css', LookupResource('Css', rpath('css')))
+ if os.path.isfile(rpath('js', 'gettext.js')):
+ self.putChild(
+ b'gettext.js',
+ EncodingResourceWrapper(GetText(), [server.GzipEncoderFactory()]),
+ )
+ else:
+ log.warning(
+ 'Cannot find "gettext.js" translation file!'
+ ' Text will only be available in English.'
+ )
+ self.putChild(b'gettext.js', MockGetText())
+ self.putChild(b'flag', Flag())
+ self.putChild(b'icons', LookupResource('Icons', rpath('icons')))
+ self.putChild(b'images', LookupResource('Images', rpath('images')))
+ self.putChild(
+ b'ui_images',
+ LookupResource(
+ 'UI_Images', common.resource_filename('deluge.ui.data', 'pixmaps')
+ ),
+ )
+
+ js = ScriptResource()
+
+ # configure the dev scripts
+ js.add_script(
+ 'ext-base-debug.js', rpath('js', 'extjs', 'ext-base-debug.js'), 'dev'
+ )
+ js.add_script(
+ 'ext-all-debug.js', rpath('js', 'extjs', 'ext-all-debug.js'), 'dev'
+ )
+ js.add_script_folder(
+ 'ext-extensions', rpath('js', 'extjs', 'ext-extensions'), 'dev'
+ )
+ js.add_script_folder('deluge-all', rpath('js', 'deluge-all'), 'dev')
+
+ # configure the debug scripts
+ js.add_script(
+ 'ext-base-debug.js', rpath('js', 'extjs', 'ext-base-debug.js'), 'debug'
+ )
+ js.add_script(
+ 'ext-all-debug.js', rpath('js', 'extjs', 'ext-all-debug.js'), 'debug'
+ )
+ js.add_script(
+ 'ext-extensions-debug.js',
+ rpath('js', 'extjs', 'ext-extensions-debug.js'),
+ 'debug',
+ )
+ js.add_script(
+ 'deluge-all-debug.js', rpath('js', 'deluge-all-debug.js'), 'debug'
+ )
+
+ # configure the normal scripts
+ js.add_script('ext-base.js', rpath('js', 'extjs', 'ext-base.js'))
+ js.add_script('ext-all.js', rpath('js', 'extjs', 'ext-all.js'))
+ js.add_script('ext-extensions.js', rpath('js', 'extjs', 'ext-extensions.js'))
+ js.add_script('deluge-all.js', rpath('js', 'deluge-all.js'))
+
+ self.js = js
+ self.putChild(b'js', js)
+ self.putChild(
+ b'json', EncodingResourceWrapper(JSON(), [server.GzipEncoderFactory()])
+ )
+ self.putChild(
+ b'upload', EncodingResourceWrapper(Upload(), [server.GzipEncoderFactory()])
+ )
+ self.putChild(b'render', Render())
+ self.putChild(b'themes', Themes(rpath('themes')))
+ self.putChild(b'tracker', Tracker())
+
+ theme = component.get('DelugeWeb').config['theme']
+ if not os.path.isfile(rpath('themes', 'css', 'xtheme-%s.css' % theme)):
+ theme = CONFIG_DEFAULTS.get('theme')
+ self.__stylesheets.insert(1, 'themes/css/xtheme-%s.css' % theme)
+
+ @property
+ def stylesheets(self):
+ return self.__stylesheets
+
+ def add_script(self, script):
+ """
+ Adds a script to the server so it is included in the <head> element
+ of the index page.
+
+ :param script: The path to the script
+ :type script: string
+ """
+
+ self.__scripts.append(script)
+ self.__debug_scripts.append(script)
+
+ def remove_script(self, script):
+ """
+ Removes a script from the server.
+
+ :param script: The path to the script
+ :type script: string
+ """
+ self.__scripts.remove(script)
+ self.__debug_scripts.remove(script)
+
+ def getChild(self, path, request): # NOQA: N802
+ if not path:
+ return self
+ else:
+ return resource.Resource.getChild(self, path, request)
+
+ def getChildWithDefault(self, path, request): # NOQA: N802
+ # Calculate the request base
+ header = request.getHeader(b'x-deluge-base')
+ base = header.decode('utf-8') if header else component.get('DelugeWeb').base
+
+ # validate the base parameter
+ if not base:
+ base = '/'
+
+ if base[0] != '/':
+ base = '/' + base
+
+ if base[-1] != '/':
+ base += '/'
+
+ request.base = base.encode('utf-8')
+
+ return resource.Resource.getChildWithDefault(self, path, request)
+
+ def render(self, request):
+ uri_true = ('true', 'yes', 'on', '1')
+ uri_false = ('false', 'no', 'off', '0')
+
+ debug_arg = None
+ req_dbg_arg = request.args.get('debug', [b''])[-1].decode().lower()
+ if req_dbg_arg in uri_true:
+ debug_arg = True
+ elif req_dbg_arg in uri_false:
+ debug_arg = False
+
+ dev_arg = request.args.get('dev', [b''])[-1].decode().lower() in uri_true
+ dev_ver = 'dev' in common.get_version()
+
+ script_type = 'normal'
+ if debug_arg is not None:
+ # Use debug arg to force switching to normal script type.
+ script_type = 'debug' if debug_arg else 'normal'
+ elif dev_arg or dev_ver:
+ # Also use dev files if development version.
+ script_type = 'dev'
+
+ if not self.js.has_script_type_files(script_type):
+ if not dev_ver:
+ log.warning(
+ 'Failed to enable WebUI "%s" mode, script files are missing!',
+ script_type,
+ )
+ # Fallback to checking other types in order and selecting first with
+ # files available. Ordered to start with dev files lookup.
+ for alt_script_type in [
+ x for x in ['dev', 'debug', 'normal'] if x != script_type
+ ]:
+ if self.js.has_script_type_files(alt_script_type):
+ script_type = alt_script_type
+ if not dev_ver:
+ log.warning('WebUI falling back to "%s" mode.', script_type)
+ break
+
+ scripts = component.get('Scripts').get_scripts(script_type)
+ scripts.insert(0, 'gettext.js')
+
+ template = Template(filename=rpath('index.html'))
+ request.setHeader(b'content-type', b'text/html; charset=utf-8')
+
+ web_config = component.get('Web').get_config()
+ web_config['base'] = request.base.decode()
+ config = {key: web_config[key] for key in UI_CONFIG_KEYS}
+ js_config = json.dumps(config)
+ # Insert the values into 'index.html' and return.
+ return template.render(
+ scripts=scripts,
+ stylesheets=self.stylesheets,
+ debug=str(bool(debug_arg)).lower(),
+ base=web_config['base'],
+ js_config=js_config,
+ )
+
+
+class DelugeWeb(component.Component):
+ def __init__(self, options=None, daemon=True):
+ """
+ Setup the DelugeWeb server.
+
+ Args:
+ options (argparse.Namespace): The web server options.
+ daemon (bool): If True run web server as a seperate daemon process (starts a twisted
+ reactor). If False shares the process and twisted reactor from WebUI plugin or tests.
+
+ """
+ component.Component.__init__(self, 'DelugeWeb', depend=['Web'])
+ self.config = configmanager.ConfigManager(
+ 'web.conf', defaults=CONFIG_DEFAULTS, file_version=2
+ )
+ self.config.run_converter((0, 1), 2, self._migrate_config_1_to_2)
+ self.config.register_set_function('language', self._on_language_changed)
+ self.socket = None
+ self.top_level = TopLevel()
+
+ self.interface = self.config['interface']
+ self.port = self.config['port']
+ self.https = self.config['https']
+ self.pkey = self.config['pkey']
+ self.cert = self.config['cert']
+ self.base = self.config['base']
+
+ if options:
+ self.interface = (
+ options.interface if options.interface is not None else self.interface
+ )
+ self.port = options.port if options.port else self.port
+ self.base = options.base if options.base else self.base
+ if options.ssl:
+ self.https = True
+ elif options.no_ssl:
+ self.https = False
+
+ if self.base != '/':
+ # Strip away slashes and serve on the base path as well as root path
+ self.top_level.putChild(self.base.strip('/'), self.top_level)
+
+ setup_translation()
+
+ # Remove twisted version number from 'server' http-header for security reasons
+ server.version = 'TwistedWeb'
+ self.site = server.Site(self.top_level)
+ self.web_api = WebApi()
+ self.web_utils = WebUtils()
+
+ self.auth = Auth(self.config)
+ self.daemon = daemon
+ # Initalize the plugins
+ self.plugins = PluginManager()
+
+ def _on_language_changed(self, key, value):
+ log.debug('Setting UI language %s', value)
+ set_language(value)
+
+ def install_signal_handlers(self):
+ # Since twisted assigns itself all the signals may as well make
+ # use of it.
+ reactor.addSystemEventTrigger('after', 'shutdown', self.shutdown)
+
+ # Twisted doesn't handle windows specific signals so we still
+ # need to attach to those to handle the close correctly.
+ if common.windows_check():
+ from win32api import SetConsoleCtrlHandler
+ from win32con import CTRL_CLOSE_EVENT, CTRL_SHUTDOWN_EVENT
+
+ def win_handler(ctrl_type):
+ log.debug('ctrl type: %s', ctrl_type)
+ if ctrl_type == CTRL_CLOSE_EVENT or ctrl_type == CTRL_SHUTDOWN_EVENT:
+ self.shutdown()
+ return 1
+
+ SetConsoleCtrlHandler(win_handler)
+
+ def start(self):
+ """
+ Start the DelugeWeb server
+ """
+ if self.socket:
+ log.warning('DelugeWeb is already running and cannot be started')
+ return
+
+ log.info('Starting webui server at PID %s', os.getpid())
+ if self.https:
+ self.start_ssl()
+ else:
+ self.start_normal()
+
+ component.get('Web').enable()
+
+ if self.daemon:
+ reactor.run()
+
+ def start_normal(self):
+ self.socket = reactor.listenTCP(self.port, self.site, interface=self.interface)
+ ip = self.socket.getHost().host
+ ip = '[%s]' % ip if is_ipv6(ip) else ip
+ log.info('Serving at http://%s:%s%s', ip, self.port, self.base)
+
+ def start_ssl(self):
+ check_ssl_keys()
+ log.debug('Enabling SSL with PKey: %s, Cert: %s', self.pkey, self.cert)
+
+ cert = configmanager.get_config_dir(self.cert)
+ pkey = configmanager.get_config_dir(self.pkey)
+
+ self.socket = reactor.listenSSL(
+ self.port,
+ self.site,
+ get_context_factory(cert, pkey),
+ interface=self.interface,
+ )
+ ip = self.socket.getHost().host
+ ip = '[%s]' % ip if is_ipv6(ip) else ip
+ log.info('Serving at https://%s:%s%s', ip, self.port, self.base)
+
+ def stop(self):
+ log.info('Shutting down webserver')
+ try:
+ component.get('Web').disable()
+ except KeyError:
+ pass
+
+ self.plugins.disable_plugins()
+ log.debug('Saving configuration file')
+ self.config.save()
+
+ if self.socket:
+ d = self.socket.stopListening()
+ self.socket = None
+ else:
+ d = defer.Deferred()
+ d.callback(False)
+ return d
+
+ def shutdown(self, *args):
+ self.stop()
+ if self.daemon and reactor.running:
+ reactor.stop()
+
+ def _migrate_config_1_to_2(self, config):
+ config['language'] = CONFIG_DEFAULTS['language']
+ return config
+
+
+if __name__ == '__builtin__':
+ deluge_web = DelugeWeb()
+ application = service.Application('DelugeWeb')
+ sc = service.IServiceCollection(application)
+ i = internet.TCPServer(deluge_web.port, deluge_web.site)
+ i.setServiceParent(sc)
+elif __name__ == '__main__':
+ deluge_web = DelugeWeb()
+ deluge_web.start()
diff --git a/deluge/ui/web/themes/css/xtheme-access.css b/deluge/ui/web/themes/css/xtheme-access.css
new file mode 100644
index 0000000..4ade3d9
--- /dev/null
+++ b/deluge/ui/web/themes/css/xtheme-access.css
@@ -0,0 +1,1933 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+body {
+ background-color: #16181a;
+ color: #fcfcfc;
+}
+
+.ext-el-mask {
+ background-color: #ccc;
+}
+
+.ext-el-mask-msg {
+ border-color: #223;
+ background-color: #3f4757;
+ background-image: url(../images/access/box/tb-blue.gif);
+}
+.ext-el-mask-msg div {
+ background-color: #232d38;
+ border-color: #556;
+ color: #fff;
+ font: normal 14px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-mask-loading div {
+ background-color: #232d38;
+ background-image: url(../images/access/grid/loading.gif);
+}
+
+.x-item-disabled {
+ color: #ddd;
+}
+
+.x-item-disabled * {
+ color: #ddd !important;
+}
+
+.x-splitbar-proxy {
+ background-color: #aaa;
+}
+
+.x-color-palette a {
+ border-color: #fff;
+}
+
+.x-color-palette a:hover,
+.x-color-palette a.x-color-palette-sel {
+ border-color: #8bb8f3;
+ background-color: #deecfd;
+}
+
+.x-color-palette em {
+ border-color: #aca899;
+}
+
+.x-ie-shadow {
+ background-color: #777;
+}
+
+.x-shadow .xsmc {
+ background-image: url(../images/default/shadow-c.png);
+}
+
+.x-shadow .xsml,
+.x-shadow .xsmr {
+ background-image: url(../images/default/shadow-lr.png);
+}
+
+.x-shadow .xstl,
+.x-shadow .xstc,
+.x-shadow .xstr,
+.x-shadow .xsbl,
+.x-shadow .xsbc,
+.x-shadow .xsbr {
+ background-image: url(../images/default/shadow.png);
+}
+
+.loading-indicator {
+ font-size: 14px;
+ background-image: url(../images/access/grid/loading.gif);
+}
+
+.x-spotlight {
+ background-color: #ccc;
+}
+.x-tab-panel-header,
+.x-tab-panel-footer {
+ background-color: #e18325;
+ border-color: #8db2e3;
+ overflow: hidden;
+ zoom: 1;
+}
+
+.x-tab-panel-header,
+.x-tab-panel-footer {
+ border-color: #222;
+}
+
+ul.x-tab-strip-top {
+ background-color: #343843;
+ background-image: url(../images/access/tabs/tab-strip-bg.gif);
+ border-bottom-color: #343d4e;
+}
+
+ul.x-tab-strip-bottom {
+ background-color: #343843;
+ background-image: url(../images/access/tabs/tab-strip-btm-bg.gif);
+ border-top-color: #343843;
+}
+
+.x-tab-panel-header-plain .x-tab-strip-spacer,
+.x-tab-panel-footer-plain .x-tab-strip-spacer {
+ border-color: #222;
+ background-color: #e18325;
+}
+
+.x-tab-strip span.x-tab-strip-text {
+ font: normal 14px tahoma, arial, helvetica;
+ color: #fff;
+}
+
+.x-tab-strip-over span.x-tab-strip-text {
+ color: #fff;
+}
+
+.x-tab-strip-active span.x-tab-strip-text {
+ color: #fff;
+ font-weight: bold;
+}
+
+.x-tab-strip-disabled .x-tabs-text {
+ color: #aaaaaa;
+}
+
+.x-tab-strip-top .x-tab-right,
+.x-tab-strip-top .x-tab-left,
+.x-tab-strip-top .x-tab-strip-inner {
+ background-image: url(../images/access/tabs/tabs-sprite.gif);
+}
+
+.x-tab-strip-bottom .x-tab-right {
+ background-image: url(../images/access/tabs/tab-btm-inactive-right-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-left {
+ background-image: url(../images/access/tabs/tab-btm-inactive-left-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-right {
+ background-image: url(../images/access/tabs/tab-btm-right-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-left {
+ background-image: url(../images/access/tabs/tab-btm-left-bg.gif);
+}
+
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close {
+ background-image: url(../images/access/tabs/tab-close.gif);
+}
+
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover {
+ background-image: url(../images/access/tabs/tab-close.gif);
+}
+
+.x-tab-panel-body {
+ border-color: #18181a;
+ background-color: #fff;
+}
+
+.x-tab-panel-body-top {
+ border-top: 0 none;
+}
+
+.x-tab-panel-body-bottom {
+ border-bottom: 0 none;
+}
+
+.x-tab-scroller-left {
+ background-image: url(../images/access/tabs/scroll-left.gif);
+ border-bottom-color: #8db2e3;
+}
+
+.x-tab-scroller-left-over {
+ background-position: 0 0;
+}
+
+.x-tab-scroller-left-disabled {
+ background-position: -18px 0;
+ opacity: 0.5;
+ -moz-opacity: 0.5;
+ filter: alpha(opacity=50);
+ cursor: default;
+}
+
+.x-tab-scroller-right {
+ background-image: url(../images/access/tabs/scroll-right.gif);
+ border-bottom-color: #8db2e3;
+}
+
+.x-tab-panel-bbar .x-toolbar,
+.x-tab-panel-tbar .x-toolbar {
+ border-color: #99bbe8;
+}
+.x-form-field {
+ font: normal 15px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-form-text,
+textarea.x-form-field {
+ color: #ffffff;
+ background-color: #33373d;
+ background-image: url(../images/access/form/text-bg.gif);
+ border-color: #737b8c;
+ border-width: 2px;
+}
+
+.ext-webkit .x-form-text,
+.ext-webkit textarea.x-form-field {
+ border-width: 2px;
+}
+
+.x-form-text,
+.ext-ie .x-form-file {
+ height: 26px;
+}
+
+.ext-strict .x-form-text {
+ height: 20px;
+}
+
+.x-form-select-one {
+ background-color: #fff;
+ border-color: #b5b8c8;
+}
+
+.x-form-check-group-label {
+ border-bottom: 1px solid #99bbe8;
+ color: #fff;
+}
+
+.x-editor .x-form-check-wrap {
+ background-color: #fff;
+}
+
+.x-form-field-wrap .x-form-trigger {
+ background-image: url(../images/access/form/trigger.gif);
+ border-bottom-color: #737b8c;
+ border-bottom-width: 2px;
+ height: 24px;
+ width: 20px;
+}
+
+.x-form-field-wrap .x-form-trigger.x-form-trigger-over {
+ border-bottom-color: #d97e27;
+}
+
+.x-form-field-wrap .x-form-trigger.x-form-trigger-click {
+ border-bottom-color: #c86e19;
+}
+
+.x-small-editor .x-form-field-wrap .x-form-trigger {
+ height: 24px;
+}
+
+.x-form-field-wrap .x-form-trigger-over {
+ background-position: -20px 0;
+}
+
+.x-form-field-wrap .x-form-trigger-click {
+ background-position: -40px 0;
+}
+
+.x-trigger-wrap-focus .x-form-trigger {
+ background-position: -60px 0;
+}
+
+.x-trigger-wrap-focus .x-form-trigger-over {
+ background-position: -80px 0;
+}
+
+.x-trigger-wrap-focus .x-form-trigger-click {
+ background-position: -100px 0;
+}
+
+.x-form-field-wrap .x-form-date-trigger {
+ background-image: url(../images/access/form/date-trigger.gif);
+}
+
+.x-form-field-wrap .x-form-clear-trigger {
+ background-image: url(../images/access/form/clear-trigger.gif);
+}
+
+.x-form-field-wrap .x-form-search-trigger {
+ background-image: url(../images/access/form/search-trigger.gif);
+}
+
+.x-trigger-wrap-focus .x-form-trigger {
+ border-bottom-color: #737b8c;
+}
+
+.x-item-disabled .x-form-trigger-over {
+ border-bottom-color: #b5b8c8;
+}
+
+.x-item-disabled .x-form-trigger-click {
+ border-bottom-color: #b5b8c8;
+}
+
+.x-form-focus,
+textarea.x-form-focus {
+ border-color: #ff9c33;
+}
+
+.x-form-invalid,
+textarea.x-form-invalid,
+.ext-webkit .x-form-invalid,
+.ext-webkit textarea.x-form-invalid {
+ background-color: #15171a;
+ background-image: url(../images/access/grid/invalid_line.gif);
+ border-color: #c30;
+}
+
+/*
+.ext-safari .x-form-invalid{
+ background-color:#fee;
+ border-color:#ff7870;
+}
+*/
+
+.x-form-inner-invalid,
+textarea.x-form-inner-invalid {
+ background-color: #fff;
+ background-image: url(../images/access/grid/invalid_line.gif);
+}
+
+.x-form-grow-sizer {
+ font: normal 15px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-form-item {
+ font: normal 15px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-form-invalid-msg {
+ color: #c0272b;
+ font: normal 14px tahoma, arial, helvetica, sans-serif;
+ background-image: url(../images/default/shared/warning.gif);
+}
+
+.x-form-empty-field {
+ color: #dadadd;
+}
+
+.x-small-editor .x-form-text {
+ height: 26px;
+}
+
+.x-small-editor .x-form-field {
+ font: normal 14px arial, tahoma, helvetica, sans-serif;
+}
+
+.ext-safari .x-small-editor .x-form-field {
+ font: normal 15px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-form-invalid-icon {
+ background-image: url(../images/access/form/exclamation.gif);
+ height: 25px;
+ width: 19px;
+ background-position: center right;
+}
+
+.x-fieldset {
+ border-color: #737b8c;
+}
+
+.x-fieldset legend {
+ font: bold 14px tahoma, arial, helvetica, sans-serif;
+ color: #fff;
+}
+.x-btn {
+ font: normal 14px tahoma, verdana, helvetica;
+}
+
+.x-btn button {
+ font: normal 14px arial, tahoma, verdana, helvetica;
+ color: #fffffa;
+ padding-left: 6px !important;
+ padding-right: 6px !important;
+}
+
+.x-btn-over .x-btn button {
+ color: #fff;
+}
+
+.x-btn-noicon .x-btn-small .x-btn-text,
+.x-btn-text-icon .x-btn-icon-small-left .x-btn-text,
+.x-btn-icon .x-btn-small .x-btn-text,
+.x-btn-text-icon .x-btn-icon-small-right .x-btn-text {
+ height: 18px;
+}
+
+.x-btn-icon .x-btn-small .x-btn-text {
+ width: 18px;
+}
+
+.x-btn-text-icon .x-btn-icon-small-left .x-btn-text {
+ padding-left: 21px !important;
+}
+
+.x-btn-text-icon .x-btn-icon-small-right .x-btn-text {
+ padding-right: 21px !important;
+}
+
+.x-btn-text-icon .x-btn-icon-medium-left .x-btn-text {
+ padding-left: 29px !important;
+}
+
+.x-btn-text-icon .x-btn-icon-medium-right .x-btn-text {
+ padding-right: 29px !important;
+}
+
+.x-btn-text-icon .x-btn-icon-large-left .x-btn-text {
+ padding-left: 37px !important;
+}
+
+.x-btn-text-icon .x-btn-icon-large-right .x-btn-text {
+ padding-right: 37px !important;
+}
+
+.x-btn em {
+ font-style: normal;
+ font-weight: normal;
+}
+
+.x-btn-tl,
+.x-btn-tr,
+.x-btn-tc,
+.x-btn-ml,
+.x-btn-mr,
+.x-btn-mc,
+.x-btn-bl,
+.x-btn-br,
+.x-btn-bc {
+ background-image: url(../images/access/button/btn.gif);
+}
+
+.x-btn-click .x-btn-text,
+.x-btn-menu-active .x-btn-text,
+.x-btn-pressed .x-btn-text {
+ color: #fff;
+}
+
+.x-btn-disabled * {
+ color: #eee !important;
+}
+
+.x-btn-mc em.x-btn-arrow {
+ background-image: url(../images/access/button/arrow.gif);
+ padding-right: 13px;
+}
+
+.x-btn-mc em.x-btn-split {
+ background-image: url(../images/access/button/s-arrow.gif);
+ padding-right: 20px;
+}
+
+.x-btn-over .x-btn-mc em.x-btn-split,
+.x-btn-click .x-btn-mc em.x-btn-split,
+.x-btn-menu-active .x-btn-mc em.x-btn-split,
+.x-btn-pressed .x-btn-mc em.x-btn-split {
+ background-image: url(../images/access/button/s-arrow-o.gif);
+}
+
+.x-btn-mc em.x-btn-arrow-bottom {
+ background-image: url(../images/access/button/s-arrow-b-noline.gif);
+}
+
+.x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/access/button/s-arrow-b.gif);
+}
+
+.x-btn-over .x-btn-mc em.x-btn-split-bottom,
+.x-btn-click .x-btn-mc em.x-btn-split-bottom,
+.x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,
+.x-btn-pressed .x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/access/button/s-arrow-bo.gif);
+}
+
+.x-btn-group-header {
+ color: #d2d2d2;
+}
+
+.x-btn-group-tc {
+ background-image: url(../images/access/button/group-tb.gif);
+}
+
+.x-btn-group-tl {
+ background-image: url(../images/access/button/group-cs.gif);
+}
+
+.x-btn-group-tr {
+ background-image: url(../images/access/button/group-cs.gif);
+}
+
+.x-btn-group-bc {
+ background-image: url(../images/access/button/group-tb.gif);
+}
+
+.x-btn-group-bl {
+ background-image: url(../images/access/button/group-cs.gif);
+}
+
+.x-btn-group-br {
+ background-image: url(../images/access/button/group-cs.gif);
+}
+
+.x-btn-group-ml {
+ background-image: url(../images/access/button/group-lr.gif);
+}
+
+.x-btn-group-mr {
+ background-image: url(../images/access/button/group-lr.gif);
+}
+
+.x-btn-group-notitle .x-btn-group-tc {
+ background-image: url(../images/access/button/group-tb.gif);
+}
+.x-toolbar {
+ border-color: #18181a;
+ background-color: #393d4e;
+ background-image: url(../images/access/toolbar/bg.gif);
+}
+
+.x-toolbar td,
+.x-toolbar span,
+.x-toolbar input,
+.x-toolbar div,
+.x-toolbar select,
+.x-toolbar label {
+ font: normal 14px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-toolbar .x-item-disabled {
+ color: gray;
+}
+
+.x-toolbar .x-item-disabled * {
+ color: gray;
+}
+
+.x-toolbar .x-btn-mc em.x-btn-split {
+ background-image: url(../images/access/button/s-arrow-noline.gif);
+}
+
+.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split,
+.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split,
+.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split,
+.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split {
+ background-image: url(../images/access/button/s-arrow-o.gif);
+}
+
+.x-toolbar .x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/access/button/s-arrow-b-noline.gif);
+}
+
+.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom,
+.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom,
+.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,
+.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/access/button/s-arrow-bo.gif);
+}
+
+.x-toolbar .xtb-sep {
+ background-image: url(../images/access/grid/grid-blue-split.gif);
+}
+
+.x-toolbar .x-btn {
+ padding-left: 3px;
+ padding-right: 3px;
+}
+
+.x-toolbar .x-btn-mc em.x-btn-arrow {
+ padding-right: 10px;
+}
+
+.x-toolbar .x-btn-text-icon .x-btn-icon-small-left .x-btn-text {
+ padding-left: 18px !important;
+}
+
+.x-toolbar .x-btn-mc em.x-btn-split {
+ padding-right: 14px;
+}
+
+.x-tbar-page-first {
+ background-image: url(../images/access/grid/page-first.gif) !important;
+}
+
+.x-tbar-loading {
+ background-image: url(../images/access/grid/refresh.gif) !important;
+}
+
+.x-tbar-page-last {
+ background-image: url(../images/access/grid/page-last.gif) !important;
+}
+
+.x-tbar-page-next {
+ background-image: url(../images/access/grid/page-next.gif) !important;
+}
+
+.x-tbar-page-prev {
+ background-image: url(../images/access/grid/page-prev.gif) !important;
+}
+
+.x-item-disabled .x-tbar-loading {
+ background-image: url(../images/access/grid/loading.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-first {
+ background-image: url(../images/access/grid/page-first-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-last {
+ background-image: url(../images/access/grid/page-last-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-next {
+ background-image: url(../images/access/grid/page-next-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-prev {
+ background-image: url(../images/access/grid/page-prev-disabled.gif) !important;
+}
+
+.x-paging-info {
+ color: #444;
+}
+
+.x-toolbar-more-icon {
+ background-image: url(../images/access/toolbar/more.gif) !important;
+}
+
+.x-statusbar .x-status-busy {
+ background-image: url(../images/access/grid/loading.gif);
+}
+
+.x-statusbar .x-status-text-panel {
+ border-color: #99bbe8 #fff #fff #99bbe8;
+}
+.x-resizable-handle {
+ background-color: #fff;
+ color: #000;
+}
+
+.x-resizable-over .x-resizable-handle-east,
+.x-resizable-pinned .x-resizable-handle-east,
+.x-resizable-over .x-resizable-handle-west,
+.x-resizable-pinned .x-resizable-handle-west {
+ background-image: url(../images/access/sizer/e-handle.gif);
+}
+
+.x-resizable-over .x-resizable-handle-south,
+.x-resizable-pinned .x-resizable-handle-south,
+.x-resizable-over .x-resizable-handle-north,
+.x-resizable-pinned .x-resizable-handle-north {
+ background-image: url(../images/access/sizer/s-handle.gif);
+}
+
+.x-resizable-over .x-resizable-handle-north,
+.x-resizable-pinned .x-resizable-handle-north {
+ background-image: url(../images/access/sizer/s-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-southeast,
+.x-resizable-pinned .x-resizable-handle-southeast {
+ background-image: url(../images/access/sizer/se-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-northwest,
+.x-resizable-pinned .x-resizable-handle-northwest {
+ background-image: url(../images/access/sizer/nw-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-northeast,
+.x-resizable-pinned .x-resizable-handle-northeast {
+ background-image: url(../images/access/sizer/ne-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-southwest,
+.x-resizable-pinned .x-resizable-handle-southwest {
+ background-image: url(../images/access/sizer/sw-handle.gif);
+}
+.x-resizable-proxy {
+ border-color: #3b5a82;
+}
+.x-resizable-overlay {
+ background-color: #fff;
+}
+.x-grid3 {
+ background-color: #1f2933;
+}
+
+.x-grid-panel .x-panel-mc .x-panel-body {
+ border-color: #223;
+}
+
+.x-grid3-hd-row td,
+.x-grid3-row td,
+.x-grid3-summary-row td {
+ font: normal 14px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-grid3-hd-row td {
+ border-left-color: #556;
+ border-right-color: #223;
+}
+
+.x-grid-row-loading {
+ background-color: #fff;
+ background-image: url(../images/default/shared/loading-balls.gif);
+}
+
+.x-grid3-row {
+ border: 0 none;
+ border-bottom: 1px solid #111;
+ border-right: 1px solid #1a1a1c;
+}
+
+.x-grid3-row-alt {
+ background-color: #1b232b;
+}
+
+.x-grid3-row-over {
+ background-color: #7e5530;
+}
+
+.x-grid3-resize-proxy {
+ background-color: #777;
+}
+
+.x-grid3-resize-marker {
+ background-color: #777;
+}
+
+.x-grid3-header {
+ background-color: #3b3f50;
+ background-image: url(../images/access/grid/grid3-hrow.gif);
+}
+
+.x-grid3-header-pop {
+ border-left-color: #d0d0d0;
+}
+
+.x-grid3-header-pop-inner {
+ border-left-color: #eee;
+ background-image: url(../images/default/grid/hd-pop.gif);
+}
+
+td.x-grid3-hd-over,
+td.sort-desc,
+td.sort-asc,
+td.x-grid3-hd-menu-open {
+ border-left-color: #889;
+ border-right-color: #445;
+}
+
+td.x-grid3-hd-over .x-grid3-hd-inner,
+td.sort-desc .x-grid3-hd-inner,
+td.sort-asc .x-grid3-hd-inner,
+td.x-grid3-hd-menu-open .x-grid3-hd-inner {
+ background-color: #4e628a;
+ background-image: url(../images/access/grid/grid3-hrow-over.gif);
+}
+
+.x-grid3-cell-inner,
+.x-grid3-hd-inner {
+ color: #fff;
+}
+
+.sort-asc .x-grid3-sort-icon {
+ background-image: url(../images/access/grid/sort_asc.gif);
+ width: 15px;
+ height: 9px;
+ margin-left: 5px;
+}
+
+.sort-desc .x-grid3-sort-icon {
+ background-image: url(../images/access/grid/sort_desc.gif);
+ width: 15px;
+ height: 9px;
+ margin-left: 5px;
+}
+
+.x-grid3-cell-text,
+.x-grid3-hd-text {
+ color: #fff;
+}
+
+.x-grid3-split {
+ background-image: url(../images/default/grid/grid-split.gif);
+}
+
+.x-grid3-hd-text {
+ color: #fff;
+}
+
+.x-dd-drag-proxy .x-grid3-hd-inner {
+ background-color: #ebf3fd;
+ background-image: url(../images/access/grid/grid3-hrow-over.gif);
+ border-color: #aaccf6;
+}
+
+.col-move-top {
+ background-image: url(../images/default/grid/col-move-top.gif);
+}
+
+.col-move-bottom {
+ background-image: url(../images/default/grid/col-move-bottom.gif);
+}
+
+.x-grid3-row-selected {
+ background-color: #e5872c !important;
+ background-image: none;
+ border-style: solid;
+}
+
+.x-grid3-row-selected .x-grid3-cell {
+ color: #fff;
+}
+
+.x-grid3-cell-selected {
+ background-color: #ffa340 !important;
+ color: #fff;
+}
+
+.x-grid3-cell-selected span {
+ color: #fff !important;
+}
+
+.x-grid3-cell-selected .x-grid3-cell-text {
+ color: #fff;
+}
+
+.x-grid3-locked td.x-grid3-row-marker,
+.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker {
+ background-color: #ebeadb !important;
+ background-image: url(../images/default/grid/grid-hrow.gif) !important;
+ color: #fff;
+ border-top-color: #fff;
+ border-right-color: #6fa0df !important;
+}
+
+.x-grid3-locked td.x-grid3-row-marker div,
+.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div {
+ color: #fff !important;
+}
+
+.x-grid3-dirty-cell {
+ background-image: url(../images/access/grid/dirty.gif);
+}
+
+.x-grid3-topbar,
+.x-grid3-bottombar {
+ font: normal 14px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-grid3-bottombar .x-toolbar {
+ border-top-color: #a9bfd3;
+}
+
+.x-props-grid .x-grid3-td-name .x-grid3-cell-inner {
+ background-image: url(../images/access/grid/grid3-special-col-bg.gif) !important;
+ color: #fff !important;
+}
+.x-props-grid .x-grid3-td-value {
+ color: #fff !important;
+}
+
+.x-props-grid .x-grid3-body .x-grid3-td-name {
+ background-color: #263240 !important;
+ border-right-color: #223;
+}
+
+.xg-hmenu-sort-asc .x-menu-item-icon {
+ background-image: url(../images/access/grid/hmenu-asc.gif);
+}
+
+.xg-hmenu-sort-desc .x-menu-item-icon {
+ background-image: url(../images/access/grid/hmenu-desc.gif);
+}
+
+.xg-hmenu-lock .x-menu-item-icon {
+ background-image: url(../images/access/grid/hmenu-lock.gif);
+}
+
+.xg-hmenu-unlock .x-menu-item-icon {
+ background-image: url(../images/access/grid/hmenu-unlock.gif);
+}
+
+.x-grid3-hd-btn {
+ background-color: #c2c9d0;
+ background-image: url(../images/access/grid/grid3-hd-btn.gif);
+}
+
+.x-grid3-body .x-grid3-td-expander {
+ background-image: url(../images/access/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-row-expander {
+ background-image: url(../images/access/grid/row-expand-sprite.gif);
+}
+
+.x-grid3-body .x-grid3-td-checker {
+ background-image: url(../images/access/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-row-checker,
+.x-grid3-hd-checker {
+ background-image: url(../images/default/grid/row-check-sprite.gif);
+}
+
+.x-grid3-body .x-grid3-td-numberer {
+ background-image: url(../images/access/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner {
+ color: #fff;
+}
+
+.x-grid3-body .x-grid3-td-row-icon {
+ background-image: url(../images/access/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander {
+ background-image: url(../images/access/grid/grid3-special-col-sel-bg.gif);
+}
+
+.x-grid3-check-col {
+ background-image: url(../images/default/menu/unchecked.gif);
+}
+
+.x-grid3-check-col-on {
+ background-image: url(../images/default/menu/checked.gif);
+}
+
+.x-grid-group,
+.x-grid-group-body,
+.x-grid-group-hd {
+ zoom: 1;
+}
+
+.x-grid-group-hd {
+ border-bottom-color: #4e628a;
+}
+
+.x-grid-group-hd div.x-grid-group-title {
+ background-image: url(../images/access/grid/group-collapse.gif);
+ background-position: 3px 6px;
+ color: #ffd;
+ font: bold 14px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title {
+ background-image: url(../images/access/grid/group-expand.gif);
+}
+
+.x-group-by-icon {
+ background-image: url(../images/default/grid/group-by.gif);
+}
+
+.x-cols-icon {
+ background-image: url(../images/default/grid/columns.gif);
+}
+
+.x-show-groups-icon {
+ background-image: url(../images/default/grid/group-by.gif);
+}
+
+.x-grid-empty {
+ color: gray;
+ font: normal 14px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell {
+ border-right-color: #ededed;
+}
+
+.x-grid-with-col-lines .x-grid3-row {
+ border-top-color: #ededed;
+}
+
+.x-grid-with-col-lines .x-grid3-row-selected {
+ border-top-color: #a3bae9;
+}
+.x-dd-drag-ghost {
+ color: #000;
+ font: normal 14px arial, helvetica, sans-serif;
+ border-color: #ddd #bbb #bbb #ddd;
+ background-color: #fff;
+}
+
+.x-dd-drop-nodrop .x-dd-drop-icon {
+ background-image: url(../images/default/dd/drop-no.gif);
+}
+
+.x-dd-drop-ok .x-dd-drop-icon {
+ background-image: url(../images/default/dd/drop-yes.gif);
+}
+
+.x-dd-drop-ok-add .x-dd-drop-icon {
+ background-image: url(../images/default/dd/drop-add.gif);
+}
+
+.x-view-selector {
+ background-color: #c3daf9;
+ border-color: #3399bb;
+}
+.x-tree-node-expanded .x-tree-node-icon {
+ background-image: url(../images/access/tree/folder-open.gif);
+}
+
+.x-tree-node-leaf .x-tree-node-icon {
+ background-image: url(../images/default/tree/leaf.gif);
+}
+
+.x-tree-node-collapsed .x-tree-node-icon {
+ background-image: url(../images/access/tree/folder.gif);
+}
+
+.x-tree-node-loading .x-tree-node-icon {
+ background-image: url(../images/default/tree/loading.gif) !important;
+}
+
+.x-tree-node .x-tree-node-inline-icon {
+ background-image: none;
+}
+
+.x-tree-node-loading a span {
+ font-style: italic;
+ color: #444444;
+}
+
+.ext-ie .x-tree-node-el input {
+ width: 14px;
+ height: 14px;
+}
+
+.x-tree-lines .x-tree-elbow {
+ background-image: url(../images/access/tree/elbow.gif);
+}
+
+.x-tree-lines .x-tree-elbow-plus {
+ background-image: url(../images/access/tree/elbow-plus.gif);
+}
+
+.x-tree-lines .x-tree-elbow-minus {
+ background-image: url(../images/access/tree/elbow-minus.gif);
+}
+
+.x-tree-lines .x-tree-elbow-end {
+ background-image: url(../images/access/tree/elbow-end.gif);
+}
+
+.x-tree-lines .x-tree-elbow-end-plus {
+ background-image: url(../images/access/tree/elbow-end-plus.gif);
+}
+
+.x-tree-lines .x-tree-elbow-end-minus {
+ background-image: url(../images/access/tree/elbow-end-minus.gif);
+}
+
+.x-tree-lines .x-tree-elbow-line {
+ background-image: url(../images/access/tree/elbow-line.gif);
+}
+
+.x-tree-no-lines .x-tree-elbow-plus {
+ background-image: url(../images/access/tree/elbow-plus-nl.gif);
+}
+
+.x-tree-no-lines .x-tree-elbow-minus {
+ background-image: url(../images/access/tree/elbow-minus-nl.gif);
+}
+
+.x-tree-no-lines .x-tree-elbow-end-plus {
+ background-image: url(../images/access/tree/elbow-end-plus-nl.gif);
+}
+
+.x-tree-no-lines .x-tree-elbow-end-minus {
+ background-image: url(../images/access/tree/elbow-end-minus-nl.gif);
+}
+
+.x-tree-arrows .x-tree-elbow-plus {
+ background-image: url(../images/access/tree/arrows.gif);
+}
+
+.x-tree-arrows .x-tree-elbow-minus {
+ background-image: url(../images/access/tree/arrows.gif);
+}
+
+.x-tree-arrows .x-tree-elbow-end-plus {
+ background-image: url(../images/access/tree/arrows.gif);
+}
+
+.x-tree-arrows .x-tree-elbow-end-minus {
+ background-image: url(../images/access/tree/arrows.gif);
+}
+
+.x-tree-node {
+ color: #000;
+ font: normal 14px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-tree-node a,
+.x-dd-drag-ghost a {
+ color: #fff;
+}
+
+.x-tree-node a span,
+.x-dd-drag-ghost a span {
+ color: #fff;
+}
+
+.x-tree-node .x-tree-selected a,
+.x-dd-drag-ghost a {
+ color: #fff;
+}
+
+.x-tree-node .x-tree-selected a span,
+.x-dd-drag-ghost a span {
+ color: #fff;
+}
+
+.x-tree-node .x-tree-node-disabled a span {
+ color: gray !important;
+}
+
+.x-tree-node div.x-tree-drag-insert-below {
+ border-bottom-color: #36c;
+}
+
+.x-tree-node div.x-tree-drag-insert-above {
+ border-top-color: #36c;
+}
+
+.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a {
+ border-bottom-color: #36c;
+}
+
+.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a {
+ border-top-color: #36c;
+}
+
+.x-tree-node .x-tree-drag-append a span {
+ background-color: #ddd;
+ border-color: gray;
+}
+
+.x-tree-node .x-tree-node-over {
+ background-color: #7e5530;
+}
+
+.x-tree-node .x-tree-selected {
+ background-color: #e5872c;
+}
+
+.x-tree-drop-ok-append .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-add.gif);
+}
+
+.x-tree-drop-ok-above .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-over.gif);
+}
+
+.x-tree-drop-ok-below .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-under.gif);
+}
+
+.x-tree-drop-ok-between .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-between.gif);
+}
+.x-date-picker {
+ border-color: #737b8c;
+ background-color: #21252e;
+}
+
+.x-date-middle,
+.x-date-left,
+.x-date-right {
+ background-image: url(../images/access/shared/hd-sprite.gif);
+ color: #fff;
+ font: bold 14px 'sans serif', tahoma, verdana, helvetica;
+}
+
+.x-date-middle .x-btn .x-btn-text {
+ color: #fff;
+}
+
+.x-date-middle .x-btn-mc em.x-btn-arrow {
+ background-image: url(../images/access/toolbar/btn-arrow-light.gif);
+}
+
+.x-date-right a {
+ background-image: url(../images/access/shared/right-btn.gif);
+}
+
+.x-date-left a {
+ background-image: url(../images/access/shared/left-btn.gif);
+}
+
+.x-date-inner th {
+ background-color: #363d4a;
+ background-image: url(../images/access/toolbar/bg.gif);
+ border-bottom-color: #535b5c;
+ font: normal 13px arial, helvetica, tahoma, sans-serif;
+ color: #fff;
+}
+
+.x-date-inner td {
+ border-color: #112;
+}
+
+.x-date-inner a {
+ font: normal 14px arial, helvetica, tahoma, sans-serif;
+ color: #fff;
+ padding: 2px 7px 1px 3px; /* Structure to account for larger, bolder fonts in Access theme. */
+}
+
+.x-date-inner .x-date-active {
+ color: #000;
+}
+
+.x-date-inner .x-date-selected a {
+ background-color: #e5872c;
+ background-image: none;
+ border-color: #864900;
+ padding: 1px 6px 1px 2px; /* Structure to account for larger, bolder fonts in Access theme. */
+}
+
+.x-date-inner .x-date-today a {
+ border-color: #99a;
+}
+
+.x-date-inner .x-date-selected span {
+ font-weight: bold;
+}
+
+.x-date-inner .x-date-prevday a,
+.x-date-inner .x-date-nextday a {
+ color: #aaa;
+}
+
+.x-date-bottom {
+ border-top-color: #737b8c;
+ background-color: #464d5a;
+ background-image: url(../images/access/shared/glass-bg.gif);
+}
+
+.x-date-inner a:hover,
+.x-date-inner .x-date-disabled a:hover {
+ color: #fff;
+ background-color: #7e5530;
+}
+
+.x-date-inner .x-date-disabled a {
+ background-color: #eee;
+ color: #bbb;
+}
+
+.x-date-mmenu {
+ background-color: #eee !important;
+}
+
+.x-date-mmenu .x-menu-item {
+ font-size: 13px;
+ color: #000;
+}
+
+.x-date-mp {
+ background-color: #21252e;
+}
+
+.x-date-mp td {
+ font: normal 14px arial, helvetica, tahoma, sans-serif;
+}
+
+.x-date-mp-btns button {
+ background-color: #083772;
+ color: #fff;
+ border-color: #3366cc #000055 #000055 #3366cc;
+ font: normal 14px arial, helvetica, tahoma, sans-serif;
+}
+
+.x-date-mp-btns {
+ background-color: #dfecfb;
+ background-image: url(../images/access/shared/glass-bg.gif);
+}
+
+.x-date-mp-btns td {
+ border-top-color: #c5d2df;
+}
+
+td.x-date-mp-month a,
+td.x-date-mp-year a {
+ color: #fff;
+}
+
+td.x-date-mp-month a:hover,
+td.x-date-mp-year a:hover {
+ color: #fff;
+ background-color: #7e5530;
+}
+
+td.x-date-mp-sel a {
+ background-color: #e5872c;
+ background-image: none;
+ border-color: #864900;
+}
+
+.x-date-mp-ybtn a {
+ background-image: url(../images/access/panel/tool-sprites.gif);
+}
+
+td.x-date-mp-sep {
+ border-right-color: #c5d2df;
+}
+.x-tip .x-tip-close {
+ background-image: url(../images/access/qtip/close.gif);
+}
+
+.x-tip .x-tip-tc,
+.x-tip .x-tip-tl,
+.x-tip .x-tip-tr,
+.x-tip .x-tip-bc,
+.x-tip .x-tip-bl,
+.x-tip .x-tip-br,
+.x-tip .x-tip-ml,
+.x-tip .x-tip-mr {
+ background-image: url(../images/access/qtip/tip-sprite.gif);
+}
+
+.x-tip .x-tip-mc {
+ font: normal 14px tahoma, arial, helvetica, sans-serif;
+}
+.x-tip .x-tip-ml {
+ background-color: #fff;
+}
+
+.x-tip .x-tip-header-text {
+ font: bold 14px tahoma, arial, helvetica, sans-serif;
+ color: #ffd;
+}
+
+.x-tip .x-tip-body {
+ font: normal 14px tahoma, arial, helvetica, sans-serif;
+ color: #000;
+}
+
+.x-form-invalid-tip .x-tip-tc,
+.x-form-invalid-tip .x-tip-tl,
+.x-form-invalid-tip .x-tip-tr,
+.x-form-invalid-tip .x-tip-bc,
+.x-form-invalid-tip .x-tip-bl,
+.x-form-invalid-tip .x-tip-br,
+.x-form-invalid-tip .x-tip-ml,
+.x-form-invalid-tip .x-tip-mr {
+ background-image: url(../images/default/form/error-tip-corners.gif);
+}
+
+.x-form-invalid-tip .x-tip-body {
+ background-image: url(../images/access/form/exclamation.gif);
+}
+
+.x-tip-anchor {
+ background-image: url(../images/access/qtip/tip-anchor-sprite.gif);
+}
+.x-menu {
+ border-color: #222;
+ background-color: #414551;
+ background-image: url(../images/access/menu/menu.gif);
+}
+
+.x-menu-nosep {
+ background-image: none;
+}
+
+.x-menu-list-item {
+ font: normal 14px tahoma, arial, sans-serif;
+}
+
+.x-menu-item-arrow {
+ background-image: url(../images/access/menu/menu-parent.gif);
+}
+
+.x-menu-sep {
+ background-color: #223;
+ border-bottom-color: #666;
+}
+
+a.x-menu-item {
+ color: #fffff6;
+}
+
+.x-menu-item-active {
+ background-color: #f09134;
+ background-image: none;
+ border-color: #b36427;
+}
+
+.x-menu-item-active a.x-menu-item {
+ border-color: #b36427;
+}
+
+.x-menu-check-item .x-menu-item-icon {
+ background-image: url(../images/default/menu/unchecked.gif);
+}
+
+.x-menu-item-checked .x-menu-item-icon {
+ background-image: url(../images/default/menu/checked.gif);
+}
+
+.x-menu-item-checked .x-menu-group-item .x-menu-item-icon {
+ background-image: url(../images/access/menu/group-checked.gif);
+}
+
+.x-menu-group-item .x-menu-item-icon {
+ background-image: none;
+}
+
+.x-menu-plain {
+ background-color: #fff !important;
+}
+
+.x-menu .x-date-picker {
+ border-color: #a3bad9;
+}
+
+.x-cycle-menu .x-menu-item-checked {
+ border-color: #a3bae9 !important;
+ background-color: #def8f6;
+}
+
+.x-menu-scroller-top {
+ background-image: url(../images/default/layout/mini-top.gif);
+}
+
+.x-menu-scroller-bottom {
+ background-image: url(../images/default/layout/mini-bottom.gif);
+}
+.x-box-tl {
+ background-image: url(../images/default/box/corners.gif);
+}
+
+.x-box-tc {
+ background-image: url(../images/default/box/tb.gif);
+}
+
+.x-box-tr {
+ background-image: url(../images/default/box/corners.gif);
+}
+
+.x-box-ml {
+ background-image: url(../images/default/box/l.gif);
+}
+
+.x-box-mc {
+ background-color: #eee;
+ background-image: url(../images/default/box/tb.gif);
+ font-family: 'Myriad Pro', 'Myriad Web', 'Tahoma', 'Helvetica', 'Arial',
+ sans-serif;
+ color: #393939;
+ font-size: 15px;
+}
+
+.x-box-mc h3 {
+ font-size: 18px;
+ font-weight: bold;
+}
+
+.x-box-mr {
+ background-image: url(../images/default/box/r.gif);
+}
+
+.x-box-bl {
+ background-image: url(../images/default/box/corners.gif);
+}
+
+.x-box-bc {
+ background-image: url(../images/default/box/tb.gif);
+}
+
+.x-box-br {
+ background-image: url(../images/default/box/corners.gif);
+}
+
+.x-box-blue .x-box-bl,
+.x-box-blue .x-box-br,
+.x-box-blue .x-box-tl,
+.x-box-blue .x-box-tr {
+ background-image: url(../images/default/box/corners-blue.gif);
+}
+
+.x-box-blue .x-box-bc,
+.x-box-blue .x-box-mc,
+.x-box-blue .x-box-tc {
+ background-image: url(../images/default/box/tb-blue.gif);
+}
+
+.x-box-blue .x-box-mc {
+ background-color: #c3daf9;
+}
+
+.x-box-blue .x-box-mc h3 {
+ color: #17385b;
+}
+
+.x-box-blue .x-box-ml {
+ background-image: url(../images/default/box/l-blue.gif);
+}
+
+.x-box-blue .x-box-mr {
+ background-image: url(../images/default/box/r-blue.gif);
+}
+.x-combo-list {
+ border: 2px solid #232732;
+ background-color: #555566;
+ font: normal 15px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-combo-list-inner {
+ background-color: #414551;
+}
+
+.x-combo-list-hd {
+ font: bold 14px tahoma, arial, helvetica, sans-serif;
+ color: #fff;
+ background-image: url(../images/default/layout/panel-title-light-bg.gif);
+ border-bottom-color: #98c0f4;
+}
+
+.x-resizable-pinned .x-combo-list-inner {
+ border-bottom-color: #98c0f4;
+}
+
+.x-combo-list-item {
+ border-color: #556;
+}
+
+.x-combo-list .x-combo-selected {
+ border-color: #e5872c !important;
+ background-color: #e5872c;
+}
+
+.x-combo-list .x-toolbar {
+ border-top-color: #98c0f4;
+}
+
+.x-combo-list-small {
+ font: normal 14px tahoma, arial, helvetica, sans-serif;
+}
+.x-panel {
+ border-color: #18181a;
+ font-size: 14px;
+}
+
+.x-panel-header {
+ color: #fff;
+ font-weight: bold;
+ font-size: 14px;
+ font-family: tahoma, arial, verdana, sans-serif;
+ border-color: #18181a;
+ background-image: url(../images/access/panel/white-top-bottom.gif);
+}
+
+.x-panel-body {
+ color: #fffff6;
+ border-color: #18181a;
+ background-color: #232d38;
+}
+
+.x-tab-panel .x-panel-body {
+ color: #fffff6;
+ border-color: #18181a;
+ background-color: #1f2730;
+}
+
+.x-panel-bbar .x-toolbar,
+.x-panel-tbar .x-toolbar {
+ border-color: #223;
+}
+
+.x-panel-tbar-noheader .x-toolbar,
+.x-panel-mc .x-panel-tbar .x-toolbar {
+ border-top-color: #223;
+}
+
+.x-panel-body-noheader,
+.x-panel-mc .x-panel-body {
+ border-top-color: #223;
+}
+
+.x-panel-tl .x-panel-header {
+ color: #fff;
+ font: bold 14px tahoma, arial, verdana, sans-serif;
+}
+
+.x-panel-tc {
+ background-image: url(../images/access/panel/top-bottom.gif);
+}
+
+.x-panel-tl,
+.x-panel-tr,
+.x-panel-bl,
+.x-panel-br {
+ background-image: url(../images/access/panel/corners-sprite.gif);
+ border-bottom-color: #222224;
+}
+
+.x-panel-bc {
+ background-image: url(../images/access/panel/top-bottom.gif);
+}
+
+.x-panel-mc {
+ font: normal 14px tahoma, arial, helvetica, sans-serif;
+ background-color: #3f4757;
+}
+
+.x-panel-ml {
+ background-image: url(../images/access/panel/left-right.gif);
+}
+
+.x-panel-mr {
+ background-image: url(../images/access/panel/left-right.gif);
+}
+
+.x-tool {
+ background-image: url(../images/access/panel/tool-sprites.gif);
+}
+
+.x-panel-ghost {
+ background-color: #3f4757;
+}
+
+.x-panel-ghost ul {
+ border-color: #18181a;
+}
+
+.x-panel-dd-spacer {
+ border-color: #18181a;
+}
+
+.x-panel-fbar td,
+.x-panel-fbar span,
+.x-panel-fbar input,
+.x-panel-fbar div,
+.x-panel-fbar select,
+.x-panel-fbar label {
+ font: normal 14px arial, tahoma, helvetica, sans-serif;
+}
+.x-window-proxy {
+ background-color: #1f2833;
+ border-color: #18181a;
+}
+
+.x-window-tl .x-window-header {
+ color: #fff;
+ font: bold 14px tahoma, arial, verdana, sans-serif;
+}
+
+.x-window-tc {
+ background-image: url(../images/access/window/top-bottom.png);
+}
+
+.x-window-tl {
+ background-image: url(../images/access/window/left-corners.png);
+}
+
+.x-window-tr {
+ background-image: url(../images/access/window/right-corners.png);
+}
+
+.x-window-bc {
+ background-image: url(../images/access/window/top-bottom.png);
+}
+
+.x-window-bl {
+ background-image: url(../images/access/window/left-corners.png);
+}
+
+.x-window-br {
+ background-image: url(../images/access/window/right-corners.png);
+}
+
+.x-window-mc {
+ border-color: #18181a;
+ font: normal 14px tahoma, arial, helvetica, sans-serif;
+ background-color: #1f2833;
+}
+
+.x-window-ml {
+ background-image: url(../images/access/window/left-right.png);
+}
+
+.x-window-mr {
+ background-image: url(../images/access/window/left-right.png);
+}
+
+.x-window-maximized .x-window-tc {
+ background-color: #fff;
+}
+
+.x-window-bbar .x-toolbar {
+ border-top-color: #323945;
+}
+
+.x-panel-ghost .x-window-tl {
+ border-bottom-color: #323945;
+}
+
+.x-panel-collapsed .x-window-tl {
+ border-bottom-color: #323945;
+}
+
+.x-dlg-mask {
+ background-color: #ccc;
+}
+
+.x-window-plain .x-window-mc {
+ background-color: #464f61;
+ border-color: #636778;
+}
+
+.x-window-plain .x-window-body {
+ color: #fffff6;
+ border-color: #464f61;
+}
+
+body.x-body-masked .x-window-plain .x-window-mc {
+ background-color: #464f61;
+}
+.x-html-editor-wrap {
+ border-color: #737b8c;
+ background-color: #fff;
+}
+.x-html-editor-wrap iframe {
+ background-color: #fff;
+}
+.x-html-editor-tb .x-btn-text {
+ background-image: url(../images/access/editor/tb-sprite.gif);
+}
+.x-panel-noborder .x-panel-header-noborder {
+ border-bottom-color: #343d4e;
+}
+
+.x-panel-noborder .x-panel-tbar-noborder .x-toolbar {
+ border-bottom-color: #343d4e;
+}
+
+.x-panel-noborder .x-panel-bbar-noborder .x-toolbar {
+ border-top-color: #343d4e;
+}
+
+.x-tab-panel-bbar-noborder .x-toolbar {
+ border-top-color: #343d4e;
+}
+
+.x-tab-panel-tbar-noborder .x-toolbar {
+ border-bottom-color: #343d4e;
+}
+.x-border-layout-ct {
+ background-color: #3f4757;
+}
+
+.x-accordion-hd {
+ color: #fff;
+ font-weight: normal;
+ background-image: url(../images/access/panel/light-hd.gif);
+}
+
+.x-layout-collapsed {
+ background-color: #323845;
+ border-color: #1a1a1c;
+}
+
+.x-layout-collapsed-over {
+ background-color: #2d3440;
+}
+
+.x-layout-split-west .x-layout-mini {
+ background-image: url(../images/default/layout/mini-left.gif);
+}
+
+.x-layout-split-east .x-layout-mini {
+ background-image: url(../images/default/layout/mini-right.gif);
+}
+
+.x-layout-split-north .x-layout-mini {
+ background-image: url(../images/default/layout/mini-top.gif);
+}
+
+.x-layout-split-south .x-layout-mini {
+ background-image: url(../images/default/layout/mini-bottom.gif);
+}
+
+.x-layout-cmini-west .x-layout-mini {
+ background-image: url(../images/default/layout/mini-right.gif);
+}
+
+.x-layout-cmini-east .x-layout-mini {
+ background-image: url(../images/default/layout/mini-left.gif);
+}
+
+.x-layout-cmini-north .x-layout-mini {
+ background-image: url(../images/default/layout/mini-bottom.gif);
+}
+
+.x-layout-cmini-south .x-layout-mini {
+ background-image: url(../images/default/layout/mini-top.gif);
+}
+.x-progress-wrap {
+ border-color: #18181a;
+}
+
+.x-progress-inner {
+ background-color: #232d38;
+ background-image: none;
+}
+
+.x-progress-bar {
+ background-color: #f39a00;
+ background-image: url(../images/access/progress/progress-bg.gif);
+ border-top-color: #a66900;
+ border-bottom-color: #a66900;
+ border-right-color: #ffb941;
+ height: 20px !important; /* structural override for Accessibility Theme */
+}
+
+.x-progress-text {
+ font-size: 14px;
+ font-weight: bold;
+ color: #fff;
+ padding: 0 5px !important; /* structural override for Accessibility Theme */
+}
+
+.x-progress-text-back {
+ color: #aaa;
+ line-height: 19px;
+}
+.x-list-header {
+ background-color: #393d4e;
+ background-image: url(../images/access/toolbar/bg.gif);
+ background-position: 0 top;
+}
+
+.x-list-header-inner div em {
+ border-left-color: #667;
+ font: normal 14px arial, tahoma, helvetica, sans-serif;
+ line-height: 14px;
+}
+
+.x-list-body-inner {
+ background-color: #1b232b;
+}
+
+.x-list-body dt em {
+ font: normal 14px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-list-over {
+ background-color: #7e5530;
+}
+
+.x-list-selected {
+ background-color: #e5872c;
+}
+
+.x-list-resizer {
+ border-left-color: #555;
+ border-right-color: #555;
+}
+
+.x-list-header-inner em.sort-asc,
+.x-list-header-inner em.sort-desc {
+ background-image: url(../images/access/grid/sort-hd.gif);
+ border-color: #3e4e6c;
+}
+.x-slider-horz,
+.x-slider-horz .x-slider-end,
+.x-slider-horz .x-slider-inner {
+ background-image: url(../images/access/slider/slider-bg.png);
+}
+
+.x-slider-horz .x-slider-thumb {
+ background-image: url(../images/access/slider/slider-thumb.png);
+}
+
+.x-slider-vert,
+.x-slider-vert .x-slider-end,
+.x-slider-vert .x-slider-inner {
+ background-image: url(../images/access/slider/slider-v-bg.png);
+}
+
+.x-slider-vert .x-slider-thumb {
+ background-image: url(../images/access/slider/slider-v-thumb.png);
+}
+.x-window-dlg .ext-mb-text,
+.x-window-dlg .x-window-header-text {
+ font-size: 15px;
+}
+
+.x-window-dlg .ext-mb-textarea {
+ font: normal 15px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-window-dlg .x-msg-box-wait {
+ background-image: url(../images/access/grid/loading.gif);
+}
+
+.x-window-dlg .ext-mb-info {
+ background-image: url(../images/access/window/icon-info.gif);
+}
+
+.x-window-dlg .ext-mb-warning {
+ background-image: url(../images/access/window/icon-warning.gif);
+}
+
+.x-window-dlg .ext-mb-question {
+ background-image: url(../images/access/window/icon-question.gif);
+}
+
+.x-window-dlg .ext-mb-error {
+ background-image: url(../images/access/window/icon-error.gif);
+}
diff --git a/deluge/ui/web/themes/css/xtheme-blue.css b/deluge/ui/web/themes/css/xtheme-blue.css
new file mode 100644
index 0000000..c2131cf
--- /dev/null
+++ b/deluge/ui/web/themes/css/xtheme-blue.css
@@ -0,0 +1,1793 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+.ext-el-mask {
+ background-color: #ccc;
+}
+
+.ext-el-mask-msg {
+ border-color: #6593cf;
+ background-color: #c3daf9;
+ background-image: url(../images/default/box/tb-blue.gif);
+}
+.ext-el-mask-msg div {
+ background-color: #eee;
+ border-color: #a3bad9;
+ color: #222;
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-mask-loading div {
+ background-color: #fbfbfb;
+ background-image: url(../images/default/grid/loading.gif);
+}
+
+.x-item-disabled {
+ color: gray;
+}
+
+.x-item-disabled * {
+ color: gray !important;
+}
+
+.x-splitbar-proxy {
+ background-color: #aaa;
+}
+
+.x-color-palette a {
+ border-color: #fff;
+}
+
+.x-color-palette a:hover,
+.x-color-palette a.x-color-palette-sel {
+ border-color: #8bb8f3;
+ background-color: #deecfd;
+}
+
+/*
+.x-color-palette em:hover, .x-color-palette span:hover{
+ background-color: #deecfd;
+}
+*/
+
+.x-color-palette em {
+ border-color: #aca899;
+}
+
+.x-ie-shadow {
+ background-color: #777;
+}
+
+.x-shadow .xsmc {
+ background-image: url(../images/default/shadow-c.png);
+}
+
+.x-shadow .xsml,
+.x-shadow .xsmr {
+ background-image: url(../images/default/shadow-lr.png);
+}
+
+.x-shadow .xstl,
+.x-shadow .xstc,
+.x-shadow .xstr,
+.x-shadow .xsbl,
+.x-shadow .xsbc,
+.x-shadow .xsbr {
+ background-image: url(../images/default/shadow.png);
+}
+
+.loading-indicator {
+ font-size: 11px;
+ background-image: url(../images/default/grid/loading.gif);
+}
+
+.x-spotlight {
+ background-color: #ccc;
+}
+.x-tab-panel-header,
+.x-tab-panel-footer {
+ background-color: #deecfd;
+ border-color: #8db2e3;
+ overflow: hidden;
+ zoom: 1;
+}
+
+.x-tab-panel-header,
+.x-tab-panel-footer {
+ border-color: #8db2e3;
+}
+
+ul.x-tab-strip-top {
+ background-color: #cedff5;
+ background-image: url(../images/default/tabs/tab-strip-bg.gif);
+ border-bottom-color: #8db2e3;
+}
+
+ul.x-tab-strip-bottom {
+ background-color: #cedff5;
+ background-image: url(../images/default/tabs/tab-strip-btm-bg.gif);
+ border-top-color: #8db2e3;
+}
+
+.x-tab-panel-header-plain .x-tab-strip-spacer,
+.x-tab-panel-footer-plain .x-tab-strip-spacer {
+ border-color: #8db2e3;
+ background-color: #deecfd;
+}
+
+.x-tab-strip span.x-tab-strip-text {
+ font: normal 11px tahoma, arial, helvetica;
+ color: #416aa3;
+}
+
+.x-tab-strip-over span.x-tab-strip-text {
+ color: #15428b;
+}
+
+.x-tab-strip-active span.x-tab-strip-text {
+ color: #15428b;
+ font-weight: bold;
+}
+
+.x-tab-strip-disabled .x-tabs-text {
+ color: #aaaaaa;
+}
+
+.x-tab-strip-top .x-tab-right,
+.x-tab-strip-top .x-tab-left,
+.x-tab-strip-top .x-tab-strip-inner {
+ background-image: url(../images/default/tabs/tabs-sprite.gif);
+}
+
+.x-tab-strip-bottom .x-tab-right {
+ background-image: url(../images/default/tabs/tab-btm-inactive-right-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-left {
+ background-image: url(../images/default/tabs/tab-btm-inactive-left-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-strip-over .x-tab-right {
+ background-image: url(../images/default/tabs/tab-btm-over-right-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-strip-over .x-tab-left {
+ background-image: url(../images/default/tabs/tab-btm-over-left-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-right {
+ background-image: url(../images/default/tabs/tab-btm-right-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-left {
+ background-image: url(../images/default/tabs/tab-btm-left-bg.gif);
+}
+
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close {
+ background-image: url(../images/default/tabs/tab-close.gif);
+}
+
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover {
+ background-image: url(../images/default/tabs/tab-close.gif);
+}
+
+.x-tab-panel-body {
+ border-color: #8db2e3;
+ background-color: #fff;
+}
+
+.x-tab-panel-body-top {
+ border-top: 0 none;
+}
+
+.x-tab-panel-body-bottom {
+ border-bottom: 0 none;
+}
+
+.x-tab-scroller-left {
+ background-image: url(../images/default/tabs/scroll-left.gif);
+ border-bottom-color: #8db2e3;
+}
+
+.x-tab-scroller-left-over {
+ background-position: 0 0;
+}
+
+.x-tab-scroller-left-disabled {
+ background-position: -18px 0;
+ opacity: 0.5;
+ -moz-opacity: 0.5;
+ filter: alpha(opacity=50);
+ cursor: default;
+}
+
+.x-tab-scroller-right {
+ background-image: url(../images/default/tabs/scroll-right.gif);
+ border-bottom-color: #8db2e3;
+}
+
+.x-tab-panel-bbar .x-toolbar,
+.x-tab-panel-tbar .x-toolbar {
+ border-color: #99bbe8;
+}
+.x-form-field {
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-form-text,
+textarea.x-form-field {
+ background-color: #fff;
+ background-image: url(../images/default/form/text-bg.gif);
+ border-color: #b5b8c8;
+}
+
+.x-form-select-one {
+ background-color: #fff;
+ border-color: #b5b8c8;
+}
+
+.x-form-check-group-label {
+ border-bottom: 1px solid #99bbe8;
+ color: #15428b;
+}
+
+.x-editor .x-form-check-wrap {
+ background-color: #fff;
+}
+
+.x-form-field-wrap .x-form-trigger {
+ background-image: url(../images/default/form/trigger.gif);
+ border-bottom-color: #b5b8c8;
+}
+
+.x-form-field-wrap .x-form-date-trigger {
+ background-image: url(../images/default/form/date-trigger.gif);
+}
+
+.x-form-field-wrap .x-form-clear-trigger {
+ background-image: url(../images/default/form/clear-trigger.gif);
+}
+
+.x-form-field-wrap .x-form-search-trigger {
+ background-image: url(../images/default/form/search-trigger.gif);
+}
+
+.x-trigger-wrap-focus .x-form-trigger {
+ border-bottom-color: #7eadd9;
+}
+
+.x-item-disabled .x-form-trigger-over {
+ border-bottom-color: #b5b8c8;
+}
+
+.x-item-disabled .x-form-trigger-click {
+ border-bottom-color: #b5b8c8;
+}
+
+.x-form-focus,
+textarea.x-form-focus {
+ border-color: #7eadd9;
+}
+
+.x-form-invalid,
+textarea.x-form-invalid {
+ background-color: #fff;
+ background-image: url(../images/default/grid/invalid_line.gif);
+ border-color: #c30;
+}
+
+.x-form-invalid.x-form-composite {
+ border: none;
+ background-image: none;
+}
+
+.x-form-invalid.x-form-composite .x-form-invalid {
+ background-color: #fff;
+ background-image: url(../images/default/grid/invalid_line.gif);
+ border-color: #c30;
+}
+
+.x-form-inner-invalid,
+textarea.x-form-inner-invalid {
+ background-color: #fff;
+ background-image: url(../images/default/grid/invalid_line.gif);
+}
+
+.x-form-grow-sizer {
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-form-item {
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-form-invalid-msg {
+ color: #c0272b;
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+ background-image: url(../images/default/shared/warning.gif);
+}
+
+.x-form-empty-field {
+ color: gray;
+}
+
+.x-small-editor .x-form-field {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.ext-webkit .x-small-editor .x-form-field {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-form-invalid-icon {
+ background-image: url(../images/default/form/exclamation.gif);
+}
+
+.x-fieldset {
+ border-color: #b5b8c8;
+}
+
+.x-fieldset legend {
+ font: bold 11px tahoma, arial, helvetica, sans-serif;
+ color: #15428b;
+}
+.x-btn {
+ font: normal 11px tahoma, verdana, helvetica;
+}
+
+.x-btn button {
+ font: normal 11px arial, tahoma, verdana, helvetica;
+ color: #333;
+}
+
+.x-btn em {
+ font-style: normal;
+ font-weight: normal;
+}
+
+.x-btn-tl,
+.x-btn-tr,
+.x-btn-tc,
+.x-btn-ml,
+.x-btn-mr,
+.x-btn-mc,
+.x-btn-bl,
+.x-btn-br,
+.x-btn-bc {
+ background-image: url(../images/default/button/btn.gif);
+}
+
+.x-btn-click .x-btn-text,
+.x-btn-menu-active .x-btn-text,
+.x-btn-pressed .x-btn-text {
+ color: #000;
+}
+
+.x-btn-disabled * {
+ color: gray !important;
+}
+
+.x-btn-mc em.x-btn-arrow {
+ background-image: url(../images/default/button/arrow.gif);
+}
+
+.x-btn-mc em.x-btn-split {
+ background-image: url(../images/default/button/s-arrow.gif);
+}
+
+.x-btn-over .x-btn-mc em.x-btn-split,
+.x-btn-click .x-btn-mc em.x-btn-split,
+.x-btn-menu-active .x-btn-mc em.x-btn-split,
+.x-btn-pressed .x-btn-mc em.x-btn-split {
+ background-image: url(../images/default/button/s-arrow-o.gif);
+}
+
+.x-btn-mc em.x-btn-arrow-bottom {
+ background-image: url(../images/default/button/s-arrow-b-noline.gif);
+}
+
+.x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/default/button/s-arrow-b.gif);
+}
+
+.x-btn-over .x-btn-mc em.x-btn-split-bottom,
+.x-btn-click .x-btn-mc em.x-btn-split-bottom,
+.x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,
+.x-btn-pressed .x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/default/button/s-arrow-bo.gif);
+}
+
+.x-btn-group-header {
+ color: #3e6aaa;
+}
+
+.x-btn-group-tc {
+ background-image: url(../images/default/button/group-tb.gif);
+}
+
+.x-btn-group-tl {
+ background-image: url(../images/default/button/group-cs.gif);
+}
+
+.x-btn-group-tr {
+ background-image: url(../images/default/button/group-cs.gif);
+}
+
+.x-btn-group-bc {
+ background-image: url(../images/default/button/group-tb.gif);
+}
+
+.x-btn-group-bl {
+ background-image: url(../images/default/button/group-cs.gif);
+}
+
+.x-btn-group-br {
+ background-image: url(../images/default/button/group-cs.gif);
+}
+
+.x-btn-group-ml {
+ background-image: url(../images/default/button/group-lr.gif);
+}
+.x-btn-group-mr {
+ background-image: url(../images/default/button/group-lr.gif);
+}
+
+.x-btn-group-notitle .x-btn-group-tc {
+ background-image: url(../images/default/button/group-tb.gif);
+}
+.x-toolbar {
+ border-color: #a9bfd3;
+ background-color: #d0def0;
+ background-image: url(../images/default/toolbar/bg.gif);
+}
+
+.x-toolbar td,
+.x-toolbar span,
+.x-toolbar input,
+.x-toolbar div,
+.x-toolbar select,
+.x-toolbar label {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-toolbar .x-item-disabled {
+ color: gray;
+}
+
+.x-toolbar .x-item-disabled * {
+ color: gray;
+}
+
+.x-toolbar .x-btn-mc em.x-btn-split {
+ background-image: url(../images/default/button/s-arrow-noline.gif);
+}
+
+.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split,
+.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split,
+.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split,
+.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split {
+ background-image: url(../images/default/button/s-arrow-o.gif);
+}
+
+.x-toolbar .x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/default/button/s-arrow-b-noline.gif);
+}
+
+.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom,
+.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom,
+.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,
+.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/default/button/s-arrow-bo.gif);
+}
+
+.x-toolbar .xtb-sep {
+ background-image: url(../images/default/grid/grid-blue-split.gif);
+}
+
+.x-tbar-page-first {
+ background-image: url(../images/default/grid/page-first.gif) !important;
+}
+
+.x-tbar-loading {
+ background-image: url(../images/default/grid/refresh.gif) !important;
+}
+
+.x-tbar-page-last {
+ background-image: url(../images/default/grid/page-last.gif) !important;
+}
+
+.x-tbar-page-next {
+ background-image: url(../images/default/grid/page-next.gif) !important;
+}
+
+.x-tbar-page-prev {
+ background-image: url(../images/default/grid/page-prev.gif) !important;
+}
+
+.x-item-disabled .x-tbar-loading {
+ background-image: url(../images/default/grid/refresh-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-first {
+ background-image: url(../images/default/grid/page-first-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-last {
+ background-image: url(../images/default/grid/page-last-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-next {
+ background-image: url(../images/default/grid/page-next-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-prev {
+ background-image: url(../images/default/grid/page-prev-disabled.gif) !important;
+}
+
+.x-paging-info {
+ color: #444;
+}
+
+.x-toolbar-more-icon {
+ background-image: url(../images/default/toolbar/more.gif) !important;
+}
+.x-resizable-handle {
+ background-color: #fff;
+}
+
+.x-resizable-over .x-resizable-handle-east,
+.x-resizable-pinned .x-resizable-handle-east,
+.x-resizable-over .x-resizable-handle-west,
+.x-resizable-pinned .x-resizable-handle-west {
+ background-image: url(../images/default/sizer/e-handle.gif);
+}
+
+.x-resizable-over .x-resizable-handle-south,
+.x-resizable-pinned .x-resizable-handle-south,
+.x-resizable-over .x-resizable-handle-north,
+.x-resizable-pinned .x-resizable-handle-north {
+ background-image: url(../images/default/sizer/s-handle.gif);
+}
+
+.x-resizable-over .x-resizable-handle-north,
+.x-resizable-pinned .x-resizable-handle-north {
+ background-image: url(../images/default/sizer/s-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-southeast,
+.x-resizable-pinned .x-resizable-handle-southeast {
+ background-image: url(../images/default/sizer/se-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-northwest,
+.x-resizable-pinned .x-resizable-handle-northwest {
+ background-image: url(../images/default/sizer/nw-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-northeast,
+.x-resizable-pinned .x-resizable-handle-northeast {
+ background-image: url(../images/default/sizer/ne-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-southwest,
+.x-resizable-pinned .x-resizable-handle-southwest {
+ background-image: url(../images/default/sizer/sw-handle.gif);
+}
+.x-resizable-proxy {
+ border-color: #3b5a82;
+}
+.x-resizable-overlay {
+ background-color: #fff;
+}
+.x-grid3 {
+ background-color: #fff;
+}
+
+.x-grid-panel .x-panel-mc .x-panel-body {
+ border-color: #99bbe8;
+}
+
+.x-grid3-row td,
+.x-grid3-summary-row td {
+ font: normal 11px/13px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-grid3-hd-row td {
+ font: normal 11px/15px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-grid3-hd-row td {
+ border-left-color: #eee;
+ border-right-color: #d0d0d0;
+}
+
+.x-grid-row-loading {
+ background-color: #fff;
+ background-image: url(../images/default/shared/loading-balls.gif);
+}
+
+.x-grid3-row {
+ border-color: #ededed;
+ border-top-color: #fff;
+}
+
+.x-grid3-row-alt {
+ background-color: #fafafa;
+}
+
+.x-grid3-row-over {
+ border-color: #ddd;
+ background-color: #efefef;
+ background-image: url(../images/default/grid/row-over.gif);
+}
+
+.x-grid3-resize-proxy {
+ background-color: #777;
+}
+
+.x-grid3-resize-marker {
+ background-color: #777;
+}
+
+.x-grid3-header {
+ background-color: #f9f9f9;
+ background-image: url(../images/default/grid/grid3-hrow.gif);
+}
+
+.x-grid3-header-pop {
+ border-left-color: #d0d0d0;
+}
+
+.x-grid3-header-pop-inner {
+ border-left-color: #eee;
+ background-image: url(../images/default/grid/hd-pop.gif);
+}
+
+td.x-grid3-hd-over,
+td.sort-desc,
+td.sort-asc,
+td.x-grid3-hd-menu-open {
+ border-left-color: #aaccf6;
+ border-right-color: #aaccf6;
+}
+
+td.x-grid3-hd-over .x-grid3-hd-inner,
+td.sort-desc .x-grid3-hd-inner,
+td.sort-asc .x-grid3-hd-inner,
+td.x-grid3-hd-menu-open .x-grid3-hd-inner {
+ background-color: #ebf3fd;
+ background-image: url(../images/default/grid/grid3-hrow-over.gif);
+}
+
+.sort-asc .x-grid3-sort-icon {
+ background-image: url(../images/default/grid/sort_asc.gif);
+}
+
+.sort-desc .x-grid3-sort-icon {
+ background-image: url(../images/default/grid/sort_desc.gif);
+}
+
+.x-grid3-cell-text,
+.x-grid3-hd-text {
+ color: #000;
+}
+
+.x-grid3-split {
+ background-image: url(../images/default/grid/grid-split.gif);
+}
+
+.x-grid3-hd-text {
+ color: #15428b;
+}
+
+.x-dd-drag-proxy .x-grid3-hd-inner {
+ background-color: #ebf3fd;
+ background-image: url(../images/default/grid/grid3-hrow-over.gif);
+ border-color: #aaccf6;
+}
+
+.col-move-top {
+ background-image: url(../images/default/grid/col-move-top.gif);
+}
+
+.col-move-bottom {
+ background-image: url(../images/default/grid/col-move-bottom.gif);
+}
+
+td.grid-hd-group-cell {
+ background: url(../images/default/grid/grid3-hrow.gif) repeat-x bottom;
+}
+
+.x-grid3-row-selected {
+ background-color: #dfe8f6 !important;
+ background-image: none;
+ border-color: #a3bae9;
+}
+
+.x-grid3-cell-selected {
+ background-color: #b8cfee !important;
+ color: #000;
+}
+
+.x-grid3-cell-selected span {
+ color: #000 !important;
+}
+
+.x-grid3-cell-selected .x-grid3-cell-text {
+ color: #000;
+}
+
+.x-grid3-locked td.x-grid3-row-marker,
+.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker {
+ background-color: #ebeadb !important;
+ background-image: url(../images/default/grid/grid-hrow.gif) !important;
+ color: #000;
+ border-top-color: #fff;
+ border-right-color: #6fa0df !important;
+}
+
+.x-grid3-locked td.x-grid3-row-marker div,
+.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div {
+ color: #15428b !important;
+}
+
+.x-grid3-dirty-cell {
+ background-image: url(../images/default/grid/dirty.gif);
+}
+
+.x-grid3-topbar,
+.x-grid3-bottombar {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-grid3-bottombar .x-toolbar {
+ border-top-color: #a9bfd3;
+}
+
+.x-props-grid .x-grid3-td-name .x-grid3-cell-inner {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif) !important;
+ color: #000 !important;
+}
+
+.x-props-grid .x-grid3-body .x-grid3-td-name {
+ background-color: #fff !important;
+ border-right-color: #eee;
+}
+
+.xg-hmenu-sort-asc .x-menu-item-icon {
+ background-image: url(../images/default/grid/hmenu-asc.gif);
+}
+
+.xg-hmenu-sort-desc .x-menu-item-icon {
+ background-image: url(../images/default/grid/hmenu-desc.gif);
+}
+
+.xg-hmenu-lock .x-menu-item-icon {
+ background-image: url(../images/default/grid/hmenu-lock.gif);
+}
+
+.xg-hmenu-unlock .x-menu-item-icon {
+ background-image: url(../images/default/grid/hmenu-unlock.gif);
+}
+
+.x-grid3-hd-btn {
+ background-color: #c3daf9;
+ background-image: url(../images/default/grid/grid3-hd-btn.gif);
+}
+
+.x-grid3-body .x-grid3-td-expander {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-row-expander {
+ background-image: url(../images/default/grid/row-expand-sprite.gif);
+}
+
+.x-grid3-body .x-grid3-td-checker {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-row-checker,
+.x-grid3-hd-checker {
+ background-image: url(../images/default/grid/row-check-sprite.gif);
+}
+
+.x-grid3-body .x-grid3-td-numberer {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner {
+ color: #444;
+}
+
+.x-grid3-body .x-grid3-td-row-icon {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander {
+ background-image: url(../images/default/grid/grid3-special-col-sel-bg.gif);
+}
+
+.x-grid3-check-col {
+ background-image: url(../images/default/menu/unchecked.gif);
+}
+
+.x-grid3-check-col-on {
+ background-image: url(../images/default/menu/checked.gif);
+}
+
+.x-grid-group,
+.x-grid-group-body,
+.x-grid-group-hd {
+ zoom: 1;
+}
+
+.x-grid-group-hd {
+ border-bottom-color: #99bbe8;
+}
+
+.x-grid-group-hd div.x-grid-group-title {
+ background-image: url(../images/default/grid/group-collapse.gif);
+ color: #3764a0;
+ font: bold 11px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title {
+ background-image: url(../images/default/grid/group-expand.gif);
+}
+
+.x-group-by-icon {
+ background-image: url(../images/default/grid/group-by.gif);
+}
+
+.x-cols-icon {
+ background-image: url(../images/default/grid/columns.gif);
+}
+
+.x-show-groups-icon {
+ background-image: url(../images/default/grid/group-by.gif);
+}
+
+.x-grid-empty {
+ color: gray;
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell {
+ border-right-color: #ededed;
+}
+
+.x-grid-with-col-lines .x-grid3-row-selected {
+ border-top-color: #a3bae9;
+}
+.x-pivotgrid .x-grid3-header-offset table td {
+ background: url(../images/default/grid/grid3-hrow.gif) repeat-x 50% 100%;
+ border-left: 1px solid;
+ border-right: 1px solid;
+ border-left-color: #eee;
+ border-right-color: #d0d0d0;
+}
+
+.x-pivotgrid .x-grid3-row-headers {
+ background-color: #f9f9f9;
+}
+
+.x-pivotgrid .x-grid3-row-headers table td {
+ background: #eee url(../images/default/grid/grid3-rowheader.gif) repeat-x
+ left top;
+ border-left: 1px solid;
+ border-right: 1px solid;
+ border-left-color: #eee;
+ border-right-color: #d0d0d0;
+ border-bottom: 1px solid;
+ border-bottom-color: #d0d0d0;
+ height: 18px;
+}
+.x-dd-drag-ghost {
+ color: #000;
+ font: normal 11px arial, helvetica, sans-serif;
+ border-color: #ddd #bbb #bbb #ddd;
+ background-color: #fff;
+}
+
+.x-dd-drop-nodrop .x-dd-drop-icon {
+ background-image: url(../images/default/dd/drop-no.gif);
+}
+
+.x-dd-drop-ok .x-dd-drop-icon {
+ background-image: url(../images/default/dd/drop-yes.gif);
+}
+
+.x-dd-drop-ok-add .x-dd-drop-icon {
+ background-image: url(../images/default/dd/drop-add.gif);
+}
+
+.x-view-selector {
+ background-color: #c3daf9;
+ border-color: #3399bb;
+}
+.x-tree-node-expanded .x-tree-node-icon {
+ background-image: url(../images/default/tree/folder-open.gif);
+}
+
+.x-tree-node-leaf .x-tree-node-icon {
+ background-image: url(../images/default/tree/leaf.gif);
+}
+
+.x-tree-node-collapsed .x-tree-node-icon {
+ background-image: url(../images/default/tree/folder.gif);
+}
+
+.x-tree-node-loading .x-tree-node-icon {
+ background-image: url(../images/default/tree/loading.gif) !important;
+}
+
+.x-tree-node .x-tree-node-inline-icon {
+ background-image: none;
+}
+
+.x-tree-node-loading a span {
+ font-style: italic;
+ color: #444444;
+}
+
+.x-tree-lines .x-tree-elbow {
+ background-image: url(../images/default/tree/elbow.gif);
+}
+
+.x-tree-lines .x-tree-elbow-plus {
+ background-image: url(../images/default/tree/elbow-plus.gif);
+}
+
+.x-tree-lines .x-tree-elbow-minus {
+ background-image: url(../images/default/tree/elbow-minus.gif);
+}
+
+.x-tree-lines .x-tree-elbow-end {
+ background-image: url(../images/default/tree/elbow-end.gif);
+}
+
+.x-tree-lines .x-tree-elbow-end-plus {
+ background-image: url(../images/default/tree/elbow-end-plus.gif);
+}
+
+.x-tree-lines .x-tree-elbow-end-minus {
+ background-image: url(../images/default/tree/elbow-end-minus.gif);
+}
+
+.x-tree-lines .x-tree-elbow-line {
+ background-image: url(../images/default/tree/elbow-line.gif);
+}
+
+.x-tree-no-lines .x-tree-elbow-plus {
+ background-image: url(../images/default/tree/elbow-plus-nl.gif);
+}
+
+.x-tree-no-lines .x-tree-elbow-minus {
+ background-image: url(../images/default/tree/elbow-minus-nl.gif);
+}
+
+.x-tree-no-lines .x-tree-elbow-end-plus {
+ background-image: url(../images/default/tree/elbow-end-plus-nl.gif);
+}
+
+.x-tree-no-lines .x-tree-elbow-end-minus {
+ background-image: url(../images/default/tree/elbow-end-minus-nl.gif);
+}
+
+.x-tree-arrows .x-tree-elbow-plus {
+ background-image: url(../images/default/tree/arrows.gif);
+}
+
+.x-tree-arrows .x-tree-elbow-minus {
+ background-image: url(../images/default/tree/arrows.gif);
+}
+
+.x-tree-arrows .x-tree-elbow-end-plus {
+ background-image: url(../images/default/tree/arrows.gif);
+}
+
+.x-tree-arrows .x-tree-elbow-end-minus {
+ background-image: url(../images/default/tree/arrows.gif);
+}
+
+.x-tree-node {
+ color: #000;
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-tree-node a,
+.x-dd-drag-ghost a {
+ color: #000;
+}
+
+.x-tree-node a span,
+.x-dd-drag-ghost a span {
+ color: #000;
+}
+
+.x-tree-node .x-tree-node-disabled a span {
+ color: gray !important;
+}
+
+.x-tree-node div.x-tree-drag-insert-below {
+ border-bottom-color: #36c;
+}
+
+.x-tree-node div.x-tree-drag-insert-above {
+ border-top-color: #36c;
+}
+
+.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a {
+ border-bottom-color: #36c;
+}
+
+.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a {
+ border-top-color: #36c;
+}
+
+.x-tree-node .x-tree-drag-append a span {
+ background-color: #ddd;
+ border-color: gray;
+}
+
+.x-tree-node .x-tree-node-over {
+ background-color: #eee;
+}
+
+.x-tree-node .x-tree-selected {
+ background-color: #d9e8fb;
+}
+
+.x-tree-drop-ok-append .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-add.gif);
+}
+
+.x-tree-drop-ok-above .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-over.gif);
+}
+
+.x-tree-drop-ok-below .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-under.gif);
+}
+
+.x-tree-drop-ok-between .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-between.gif);
+}
+.x-date-picker {
+ border-color: #1b376c;
+ background-color: #fff;
+}
+
+.x-date-middle,
+.x-date-left,
+.x-date-right {
+ background-image: url(../images/default/shared/hd-sprite.gif);
+ color: #fff;
+ font: bold 11px 'sans serif', tahoma, verdana, helvetica;
+}
+
+.x-date-middle .x-btn .x-btn-text {
+ color: #fff;
+}
+
+.x-date-middle .x-btn-mc em.x-btn-arrow {
+ background-image: url(../images/default/toolbar/btn-arrow-light.gif);
+}
+
+.x-date-right a {
+ background-image: url(../images/default/shared/right-btn.gif);
+}
+
+.x-date-left a {
+ background-image: url(../images/default/shared/left-btn.gif);
+}
+
+.x-date-inner th {
+ background-color: #dfecfb;
+ background-image: url(../images/default/shared/glass-bg.gif);
+ border-bottom-color: #a3bad9;
+ font: normal 10px arial, helvetica, tahoma, sans-serif;
+ color: #233d6d;
+}
+
+.x-date-inner td {
+ border-color: #fff;
+}
+
+.x-date-inner a {
+ font: normal 11px arial, helvetica, tahoma, sans-serif;
+ color: #000;
+}
+
+.x-date-inner .x-date-active {
+ color: #000;
+}
+
+.x-date-inner .x-date-selected a {
+ background-color: #dfecfb;
+ background-image: url(../images/default/shared/glass-bg.gif);
+ border-color: #8db2e3;
+}
+
+.x-date-inner .x-date-today a {
+ border-color: darkred;
+}
+
+.x-date-inner .x-date-selected span {
+ font-weight: bold;
+}
+
+.x-date-inner .x-date-prevday a,
+.x-date-inner .x-date-nextday a {
+ color: #aaa;
+}
+
+.x-date-bottom {
+ border-top-color: #a3bad9;
+ background-color: #dfecfb;
+ background-image: url(../images/default/shared/glass-bg.gif);
+}
+
+.x-date-inner a:hover,
+.x-date-inner .x-date-disabled a:hover {
+ color: #000;
+ background-color: #ddecfe;
+}
+
+.x-date-inner .x-date-disabled a {
+ background-color: #eee;
+ color: #bbb;
+}
+
+.x-date-mmenu {
+ background-color: #eee !important;
+}
+
+.x-date-mmenu .x-menu-item {
+ font-size: 10px;
+ color: #000;
+}
+
+.x-date-mp {
+ background-color: #fff;
+}
+
+.x-date-mp td {
+ font: normal 11px arial, helvetica, tahoma, sans-serif;
+}
+
+.x-date-mp-btns button {
+ background-color: #083772;
+ color: #fff;
+ border-color: #3366cc #000055 #000055 #3366cc;
+ font: normal 11px arial, helvetica, tahoma, sans-serif;
+}
+
+.x-date-mp-btns {
+ background-color: #dfecfb;
+ background-image: url(../images/default/shared/glass-bg.gif);
+}
+
+.x-date-mp-btns td {
+ border-top-color: #c5d2df;
+}
+
+td.x-date-mp-month a,
+td.x-date-mp-year a {
+ color: #15428b;
+}
+
+td.x-date-mp-month a:hover,
+td.x-date-mp-year a:hover {
+ color: #15428b;
+ background-color: #ddecfe;
+}
+
+td.x-date-mp-sel a {
+ background-color: #dfecfb;
+ background-image: url(../images/default/shared/glass-bg.gif);
+ border-color: #8db2e3;
+}
+
+.x-date-mp-ybtn a {
+ background-image: url(../images/default/panel/tool-sprites.gif);
+}
+
+td.x-date-mp-sep {
+ border-right-color: #c5d2df;
+}
+.x-tip .x-tip-close {
+ background-image: url(../images/default/qtip/close.gif);
+}
+
+.x-tip .x-tip-tc,
+.x-tip .x-tip-tl,
+.x-tip .x-tip-tr,
+.x-tip .x-tip-bc,
+.x-tip .x-tip-bl,
+.x-tip .x-tip-br,
+.x-tip .x-tip-ml,
+.x-tip .x-tip-mr {
+ background-image: url(../images/default/qtip/tip-sprite.gif);
+}
+
+.x-tip .x-tip-mc {
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+}
+.x-tip .x-tip-ml {
+ background-color: #fff;
+}
+
+.x-tip .x-tip-header-text {
+ font: bold 11px tahoma, arial, helvetica, sans-serif;
+ color: #444;
+}
+
+.x-tip .x-tip-body {
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+ color: #444;
+}
+
+.x-form-invalid-tip .x-tip-tc,
+.x-form-invalid-tip .x-tip-tl,
+.x-form-invalid-tip .x-tip-tr,
+.x-form-invalid-tip .x-tip-bc,
+.x-form-invalid-tip .x-tip-bl,
+.x-form-invalid-tip .x-tip-br,
+.x-form-invalid-tip .x-tip-ml,
+.x-form-invalid-tip .x-tip-mr {
+ background-image: url(../images/default/form/error-tip-corners.gif);
+}
+
+.x-form-invalid-tip .x-tip-body {
+ background-image: url(../images/default/form/exclamation.gif);
+}
+
+.x-tip-anchor {
+ background-image: url(../images/default/qtip/tip-anchor-sprite.gif);
+}
+.x-menu {
+ background-color: #f0f0f0;
+ background-image: url(../images/default/menu/menu.gif);
+}
+
+.x-menu-floating {
+ border-color: #718bb7;
+}
+
+.x-menu-nosep {
+ background-image: none;
+}
+
+.x-menu-list-item {
+ font: normal 11px arial, tahoma, sans-serif;
+}
+
+.x-menu-item-arrow {
+ background-image: url(../images/default/menu/menu-parent.gif);
+}
+
+.x-menu-sep {
+ background-color: #e0e0e0;
+ border-bottom-color: #fff;
+}
+
+a.x-menu-item {
+ color: #222;
+}
+
+.x-menu-item-active {
+ background-image: url(../images/default/menu/item-over.gif);
+ background-color: #dbecf4;
+ border-color: #aaccf6;
+}
+
+.x-menu-item-active a.x-menu-item {
+ border-color: #aaccf6;
+}
+
+.x-menu-check-item .x-menu-item-icon {
+ background-image: url(../images/default/menu/unchecked.gif);
+}
+
+.x-menu-item-checked .x-menu-item-icon {
+ background-image: url(../images/default/menu/checked.gif);
+}
+
+.x-menu-item-checked .x-menu-group-item .x-menu-item-icon {
+ background-image: url(../images/default/menu/group-checked.gif);
+}
+
+.x-menu-group-item .x-menu-item-icon {
+ background-image: none;
+}
+
+.x-menu-plain {
+ background-color: #f0f0f0 !important;
+ background-image: none;
+}
+
+.x-date-menu,
+.x-color-menu {
+ background-color: #fff !important;
+}
+
+.x-menu .x-date-picker {
+ border-color: #a3bad9;
+}
+
+.x-cycle-menu .x-menu-item-checked {
+ border-color: #a3bae9 !important;
+ background-color: #def8f6;
+}
+
+.x-menu-scroller-top {
+ background-image: url(../images/default/layout/mini-top.gif);
+}
+
+.x-menu-scroller-bottom {
+ background-image: url(../images/default/layout/mini-bottom.gif);
+}
+.x-box-tl {
+ background-image: url(../images/default/box/corners.gif);
+}
+
+.x-box-tc {
+ background-image: url(../images/default/box/tb.gif);
+}
+
+.x-box-tr {
+ background-image: url(../images/default/box/corners.gif);
+}
+
+.x-box-ml {
+ background-image: url(../images/default/box/l.gif);
+}
+
+.x-box-mc {
+ background-color: #eee;
+ background-image: url(../images/default/box/tb.gif);
+ font-family: 'Myriad Pro', 'Myriad Web', 'Tahoma', 'Helvetica', 'Arial',
+ sans-serif;
+ color: #393939;
+ font-size: 12px;
+}
+
+.x-box-mc h3 {
+ font-size: 14px;
+ font-weight: bold;
+}
+
+.x-box-mr {
+ background-image: url(../images/default/box/r.gif);
+}
+
+.x-box-bl {
+ background-image: url(../images/default/box/corners.gif);
+}
+
+.x-box-bc {
+ background-image: url(../images/default/box/tb.gif);
+}
+
+.x-box-br {
+ background-image: url(../images/default/box/corners.gif);
+}
+
+.x-box-blue .x-box-bl,
+.x-box-blue .x-box-br,
+.x-box-blue .x-box-tl,
+.x-box-blue .x-box-tr {
+ background-image: url(../images/default/box/corners-blue.gif);
+}
+
+.x-box-blue .x-box-bc,
+.x-box-blue .x-box-mc,
+.x-box-blue .x-box-tc {
+ background-image: url(../images/default/box/tb-blue.gif);
+}
+
+.x-box-blue .x-box-mc {
+ background-color: #c3daf9;
+}
+
+.x-box-blue .x-box-mc h3 {
+ color: #17385b;
+}
+
+.x-box-blue .x-box-ml {
+ background-image: url(../images/default/box/l-blue.gif);
+}
+
+.x-box-blue .x-box-mr {
+ background-image: url(../images/default/box/r-blue.gif);
+}
+.x-combo-list {
+ border-color: #98c0f4;
+ background-color: #ddecfe;
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-combo-list-inner {
+ background-color: #fff;
+}
+
+.x-combo-list-hd {
+ font: bold 11px tahoma, arial, helvetica, sans-serif;
+ color: #15428b;
+ background-image: url(../images/default/layout/panel-title-light-bg.gif);
+ border-bottom-color: #98c0f4;
+}
+
+.x-resizable-pinned .x-combo-list-inner {
+ border-bottom-color: #98c0f4;
+}
+
+.x-combo-list-item {
+ border-color: #fff;
+}
+
+.x-combo-list .x-combo-selected {
+ border-color: #a3bae9 !important;
+ background-color: #dfe8f6;
+}
+
+.x-combo-list .x-toolbar {
+ border-top-color: #98c0f4;
+}
+
+.x-combo-list-small {
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+}
+.x-panel {
+ border-color: #99bbe8;
+}
+
+.x-panel-header {
+ color: #15428b;
+ font-weight: bold;
+ font-size: 11px;
+ font-family: tahoma, arial, verdana, sans-serif;
+ border-color: #99bbe8;
+ background-image: url(../images/default/panel/white-top-bottom.gif);
+}
+
+.x-panel-body {
+ border-color: #99bbe8;
+ background-color: #fff;
+}
+
+.x-panel-bbar .x-toolbar,
+.x-panel-tbar .x-toolbar {
+ border-color: #99bbe8;
+}
+
+.x-panel-tbar-noheader .x-toolbar,
+.x-panel-mc .x-panel-tbar .x-toolbar {
+ border-top-color: #99bbe8;
+}
+
+.x-panel-body-noheader,
+.x-panel-mc .x-panel-body {
+ border-top-color: #99bbe8;
+}
+
+.x-panel-tl .x-panel-header {
+ color: #15428b;
+ font: bold 11px tahoma, arial, verdana, sans-serif;
+}
+
+.x-panel-tc {
+ background-image: url(../images/default/panel/top-bottom.gif);
+}
+
+.x-panel-tl,
+.x-panel-tr,
+.x-panel-bl,
+.x-panel-br {
+ background-image: url(../images/default/panel/corners-sprite.gif);
+ border-bottom-color: #99bbe8;
+}
+
+.x-panel-bc {
+ background-image: url(../images/default/panel/top-bottom.gif);
+}
+
+.x-panel-mc {
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+ background-color: #dfe8f6;
+}
+
+.x-panel-ml {
+ background-color: #fff;
+ background-image: url(../images/default/panel/left-right.gif);
+}
+
+.x-panel-mr {
+ background-image: url(../images/default/panel/left-right.gif);
+}
+
+.x-tool {
+ background-image: url(../images/default/panel/tool-sprites.gif);
+}
+
+.x-panel-ghost {
+ background-color: #cbddf3;
+}
+
+.x-panel-ghost ul {
+ border-color: #99bbe8;
+}
+
+.x-panel-dd-spacer {
+ border-color: #99bbe8;
+}
+
+.x-panel-fbar td,
+.x-panel-fbar span,
+.x-panel-fbar input,
+.x-panel-fbar div,
+.x-panel-fbar select,
+.x-panel-fbar label {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+.x-window-proxy {
+ background-color: #c7dffc;
+ border-color: #99bbe8;
+}
+
+.x-window-tl .x-window-header {
+ color: #15428b;
+ font: bold 11px tahoma, arial, verdana, sans-serif;
+}
+
+.x-window-tc {
+ background-image: url(../images/default/window/top-bottom.png);
+}
+
+.x-window-tl {
+ background-image: url(../images/default/window/left-corners.png);
+}
+
+.x-window-tr {
+ background-image: url(../images/default/window/right-corners.png);
+}
+
+.x-window-bc {
+ background-image: url(../images/default/window/top-bottom.png);
+}
+
+.x-window-bl {
+ background-image: url(../images/default/window/left-corners.png);
+}
+
+.x-window-br {
+ background-image: url(../images/default/window/right-corners.png);
+}
+
+.x-window-mc {
+ border-color: #99bbe8;
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+ background-color: #dfe8f6;
+}
+
+.x-window-ml {
+ background-image: url(../images/default/window/left-right.png);
+}
+
+.x-window-mr {
+ background-image: url(../images/default/window/left-right.png);
+}
+
+.x-window-maximized .x-window-tc {
+ background-color: #fff;
+}
+
+.x-window-bbar .x-toolbar {
+ border-top-color: #99bbe8;
+}
+
+.x-panel-ghost .x-window-tl {
+ border-bottom-color: #99bbe8;
+}
+
+.x-panel-collapsed .x-window-tl {
+ border-bottom-color: #84a0c4;
+}
+
+.x-dlg-mask {
+ background-color: #ccc;
+}
+
+.x-window-plain .x-window-mc {
+ background-color: #ccd9e8;
+ border-color: #a3bae9 #dfe8f6 #dfe8f6 #a3bae9;
+}
+
+.x-window-plain .x-window-body {
+ border-color: #dfe8f6 #a3bae9 #a3bae9 #dfe8f6;
+}
+
+body.x-body-masked .x-window-plain .x-window-mc {
+ background-color: #ccd9e8;
+}
+.x-html-editor-wrap {
+ border-color: #a9bfd3;
+ background-color: #fff;
+}
+.x-html-editor-tb .x-btn-text {
+ background-image: url(../images/default/editor/tb-sprite.gif);
+}
+.x-panel-noborder .x-panel-header-noborder {
+ border-bottom-color: #99bbe8;
+}
+
+.x-panel-noborder .x-panel-tbar-noborder .x-toolbar {
+ border-bottom-color: #99bbe8;
+}
+
+.x-panel-noborder .x-panel-bbar-noborder .x-toolbar {
+ border-top-color: #99bbe8;
+}
+
+.x-tab-panel-bbar-noborder .x-toolbar {
+ border-top-color: #99bbe8;
+}
+
+.x-tab-panel-tbar-noborder .x-toolbar {
+ border-bottom-color: #99bbe8;
+}
+.x-border-layout-ct {
+ background-color: #dfe8f6;
+}
+
+.x-accordion-hd {
+ color: #222;
+ font-weight: normal;
+ background-image: url(../images/default/panel/light-hd.gif);
+}
+
+.x-layout-collapsed {
+ background-color: #d2e0f2;
+ border-color: #98c0f4;
+}
+
+.x-layout-collapsed-over {
+ background-color: #d9e8fb;
+}
+
+.x-layout-split-west .x-layout-mini {
+ background-image: url(../images/default/layout/mini-left.gif);
+}
+.x-layout-split-east .x-layout-mini {
+ background-image: url(../images/default/layout/mini-right.gif);
+}
+.x-layout-split-north .x-layout-mini {
+ background-image: url(../images/default/layout/mini-top.gif);
+}
+.x-layout-split-south .x-layout-mini {
+ background-image: url(../images/default/layout/mini-bottom.gif);
+}
+
+.x-layout-cmini-west .x-layout-mini {
+ background-image: url(../images/default/layout/mini-right.gif);
+}
+
+.x-layout-cmini-east .x-layout-mini {
+ background-image: url(../images/default/layout/mini-left.gif);
+}
+
+.x-layout-cmini-north .x-layout-mini {
+ background-image: url(../images/default/layout/mini-bottom.gif);
+}
+
+.x-layout-cmini-south .x-layout-mini {
+ background-image: url(../images/default/layout/mini-top.gif);
+}
+.x-progress-wrap {
+ border-color: #6593cf;
+}
+
+.x-progress-inner {
+ background-color: #e0e8f3;
+ background-image: url(../images/default/qtip/bg.gif);
+}
+
+.x-progress-bar {
+ background-color: #9cbfee;
+ background-image: url(../images/default/progress/progress-bg.gif);
+ border-top-color: #d1e4fd;
+ border-bottom-color: #7fa9e4;
+ border-right-color: #7fa9e4;
+}
+
+.x-progress-text {
+ font-size: 11px;
+ font-weight: bold;
+ color: #fff;
+}
+
+.x-progress-text-back {
+ color: #396095;
+}
+.x-list-header {
+ background-color: #f9f9f9;
+ background-image: url(../images/default/grid/grid3-hrow.gif);
+}
+
+.x-list-header-inner div em {
+ border-left-color: #ddd;
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-list-body dt em {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-list-over {
+ background-color: #eee;
+}
+
+.x-list-selected {
+ background-color: #dfe8f6;
+}
+
+.x-list-resizer {
+ border-left-color: #555;
+ border-right-color: #555;
+}
+
+.x-list-header-inner em.sort-asc,
+.x-list-header-inner em.sort-desc {
+ background-image: url(../images/default/grid/sort-hd.gif);
+ border-color: #99bbe8;
+}
+.x-slider-horz,
+.x-slider-horz .x-slider-end,
+.x-slider-horz .x-slider-inner {
+ background-image: url(../images/default/slider/slider-bg.png);
+}
+
+.x-slider-horz .x-slider-thumb {
+ background-image: url(../images/default/slider/slider-thumb.png);
+}
+
+.x-slider-vert,
+.x-slider-vert .x-slider-end,
+.x-slider-vert .x-slider-inner {
+ background-image: url(../images/default/slider/slider-v-bg.png);
+}
+
+.x-slider-vert .x-slider-thumb {
+ background-image: url(../images/default/slider/slider-v-thumb.png);
+}
+.x-window-dlg .ext-mb-text,
+.x-window-dlg .x-window-header-text {
+ font-size: 12px;
+}
+
+.x-window-dlg .ext-mb-textarea {
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-window-dlg .x-msg-box-wait {
+ background-image: url(../images/default/grid/loading.gif);
+}
+
+.x-window-dlg .ext-mb-info {
+ background-image: url(../images/default/window/icon-info.gif);
+}
+
+.x-window-dlg .ext-mb-warning {
+ background-image: url(../images/default/window/icon-warning.gif);
+}
+
+.x-window-dlg .ext-mb-question {
+ background-image: url(../images/default/window/icon-question.gif);
+}
+
+.x-window-dlg .ext-mb-error {
+ background-image: url(../images/default/window/icon-error.gif);
+}
diff --git a/deluge/ui/web/themes/css/xtheme-gray.css b/deluge/ui/web/themes/css/xtheme-gray.css
new file mode 100644
index 0000000..25bae0a
--- /dev/null
+++ b/deluge/ui/web/themes/css/xtheme-gray.css
@@ -0,0 +1,1791 @@
+/**
+ * Ext JS Library 3.4.0
+ * Copyright(c) 2006-2011 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+.ext-el-mask {
+ background-color: #ccc;
+}
+
+.ext-el-mask-msg {
+ border-color: #999;
+ background-color: #ddd;
+ background-image: url(../images/gray/panel/white-top-bottom.gif);
+ background-position: 0 -1px;
+}
+.ext-el-mask-msg div {
+ background-color: #eee;
+ border-color: #d0d0d0;
+ color: #222;
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-mask-loading div {
+ background-color: #fbfbfb;
+ background-image: url(../images/default/grid/loading.gif);
+}
+
+.x-item-disabled {
+ color: gray;
+}
+
+.x-item-disabled * {
+ color: gray !important;
+}
+
+.x-splitbar-proxy {
+ background-color: #aaa;
+}
+
+.x-color-palette a {
+ border-color: #fff;
+}
+
+.x-color-palette a:hover,
+.x-color-palette a.x-color-palette-sel {
+ border-color: #cfcfcf;
+ background-color: #eaeaea;
+}
+
+/*
+.x-color-palette em:hover, .x-color-palette span:hover{
+ background-color: #eaeaea;
+}
+*/
+
+.x-color-palette em {
+ border-color: #aca899;
+}
+
+.x-ie-shadow {
+ background-color: #777;
+}
+
+.x-shadow .xsmc {
+ background-image: url(../images/default/shadow-c.png);
+}
+
+.x-shadow .xsml,
+.x-shadow .xsmr {
+ background-image: url(../images/default/shadow-lr.png);
+}
+
+.x-shadow .xstl,
+.x-shadow .xstc,
+.x-shadow .xstr,
+.x-shadow .xsbl,
+.x-shadow .xsbc,
+.x-shadow .xsbr {
+ background-image: url(../images/default/shadow.png);
+}
+
+.loading-indicator {
+ font-size: 11px;
+ background-image: url(../images/default/grid/loading.gif);
+}
+
+.x-spotlight {
+ background-color: #ccc;
+}
+.x-tab-panel-header,
+.x-tab-panel-footer {
+ background-color: #eaeaea;
+ border-color: #d0d0d0;
+ overflow: hidden;
+ zoom: 1;
+}
+
+.x-tab-panel-header,
+.x-tab-panel-footer {
+ border-color: #d0d0d0;
+}
+
+ul.x-tab-strip-top {
+ background-color: #dbdbdb;
+ background-image: url(../images/gray/tabs/tab-strip-bg.gif);
+ border-bottom-color: #d0d0d0;
+}
+
+ul.x-tab-strip-bottom {
+ background-color: #dbdbdb;
+ background-image: url(../images/gray/tabs/tab-strip-btm-bg.gif);
+ border-top-color: #d0d0d0;
+}
+
+.x-tab-panel-header-plain .x-tab-strip-spacer,
+.x-tab-panel-footer-plain .x-tab-strip-spacer {
+ border-color: #d0d0d0;
+ background-color: #eaeaea;
+}
+
+.x-tab-strip span.x-tab-strip-text {
+ font: normal 11px tahoma, arial, helvetica;
+ color: #333;
+}
+
+.x-tab-strip-over span.x-tab-strip-text {
+ color: #111;
+}
+
+.x-tab-strip-active span.x-tab-strip-text {
+ color: #333;
+ font-weight: bold;
+}
+
+.x-tab-strip-disabled .x-tabs-text {
+ color: #aaaaaa;
+}
+
+.x-tab-strip-top .x-tab-right,
+.x-tab-strip-top .x-tab-left,
+.x-tab-strip-top .x-tab-strip-inner {
+ background-image: url(../images/gray/tabs/tabs-sprite.gif);
+}
+
+.x-tab-strip-bottom .x-tab-right {
+ background-image: url(../images/gray/tabs/tab-btm-inactive-right-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-left {
+ background-image: url(../images/gray/tabs/tab-btm-inactive-left-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-strip-over .x-tab-left {
+ background-image: url(../images/gray/tabs/tab-btm-over-left-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-strip-over .x-tab-right {
+ background-image: url(../images/gray/tabs/tab-btm-over-right-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-right {
+ background-image: url(../images/gray/tabs/tab-btm-right-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-left {
+ background-image: url(../images/gray/tabs/tab-btm-left-bg.gif);
+}
+
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close {
+ background-image: url(../images/gray/tabs/tab-close.gif);
+}
+
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover {
+ background-image: url(../images/gray/tabs/tab-close.gif);
+}
+
+.x-tab-panel-body {
+ border-color: #d0d0d0;
+ background-color: #fff;
+}
+
+.x-tab-panel-body-top {
+ border-top: 0 none;
+}
+
+.x-tab-panel-body-bottom {
+ border-bottom: 0 none;
+}
+
+.x-tab-scroller-left {
+ background-image: url(../images/gray/tabs/scroll-left.gif);
+ border-bottom-color: #d0d0d0;
+}
+
+.x-tab-scroller-left-over {
+ background-position: 0 0;
+}
+
+.x-tab-scroller-left-disabled {
+ background-position: -18px 0;
+ opacity: 0.5;
+ -moz-opacity: 0.5;
+ filter: alpha(opacity=50);
+ cursor: default;
+}
+
+.x-tab-scroller-right {
+ background-image: url(../images/gray/tabs/scroll-right.gif);
+ border-bottom-color: #d0d0d0;
+}
+
+.x-tab-panel-bbar .x-toolbar,
+.x-tab-panel-tbar .x-toolbar {
+ border-color: #d0d0d0;
+}
+.x-form-field {
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-form-text,
+textarea.x-form-field {
+ background-color: #fff;
+ background-image: url(../images/default/form/text-bg.gif);
+ border-color: #c1c1c1;
+}
+
+.x-form-select-one {
+ background-color: #fff;
+ border-color: #c1c1c1;
+}
+
+.x-form-check-group-label {
+ border-bottom: 1px solid #d0d0d0;
+ color: #333;
+}
+
+.x-editor .x-form-check-wrap {
+ background-color: #fff;
+}
+
+.x-form-field-wrap .x-form-trigger {
+ background-image: url(../images/gray/form/trigger.gif);
+ border-bottom-color: #b5b8c8;
+}
+
+.x-form-field-wrap .x-form-date-trigger {
+ background-image: url(../images/gray/form/date-trigger.gif);
+}
+
+.x-form-field-wrap .x-form-clear-trigger {
+ background-image: url(../images/gray/form/clear-trigger.gif);
+}
+
+.x-form-field-wrap .x-form-search-trigger {
+ background-image: url(../images/gray/form/search-trigger.gif);
+}
+
+.x-trigger-wrap-focus .x-form-trigger {
+ border-bottom-color: #777777;
+}
+
+.x-item-disabled .x-form-trigger-over {
+ border-bottom-color: #b5b8c8;
+}
+
+.x-item-disabled .x-form-trigger-click {
+ border-bottom-color: #b5b8c8;
+}
+
+.x-form-focus,
+textarea.x-form-focus {
+ border-color: #777777;
+}
+
+.x-form-invalid,
+textarea.x-form-invalid {
+ background-color: #fff;
+ background-image: url(../images/default/grid/invalid_line.gif);
+ border-color: #c30;
+}
+
+.ext-webkit .x-form-invalid {
+ background-color: #fee;
+ border-color: #ff7870;
+}
+
+.x-form-inner-invalid,
+textarea.x-form-inner-invalid {
+ background-color: #fff;
+ background-image: url(../images/default/grid/invalid_line.gif);
+}
+
+.x-form-grow-sizer {
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-form-item {
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-form-invalid-msg {
+ color: #c0272b;
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+ background-image: url(../images/default/shared/warning.gif);
+}
+
+.x-form-empty-field {
+ color: gray;
+}
+
+.x-small-editor .x-form-field {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.ext-webkit .x-small-editor .x-form-field {
+ font: normal 12px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-form-invalid-icon {
+ background-image: url(../images/default/form/exclamation.gif);
+}
+
+.x-fieldset {
+ border-color: #cccccc;
+}
+
+.x-fieldset legend {
+ font: bold 11px tahoma, arial, helvetica, sans-serif;
+ color: #777777;
+}
+.x-btn {
+ font: normal 11px tahoma, verdana, helvetica;
+}
+
+.x-btn button {
+ font: normal 11px arial, tahoma, verdana, helvetica;
+ color: #333;
+}
+
+.x-btn em {
+ font-style: normal;
+ font-weight: normal;
+}
+
+.x-btn-tl,
+.x-btn-tr,
+.x-btn-tc,
+.x-btn-ml,
+.x-btn-mr,
+.x-btn-mc,
+.x-btn-bl,
+.x-btn-br,
+.x-btn-bc {
+ background-image: url(../images/gray/button/btn.gif);
+}
+
+.x-btn-click .x-btn-text,
+.x-btn-menu-active .x-btn-text,
+.x-btn-pressed .x-btn-text {
+ color: #000;
+}
+
+.x-btn-disabled * {
+ color: gray !important;
+}
+
+.x-btn-mc em.x-btn-arrow {
+ background-image: url(../images/default/button/arrow.gif);
+}
+
+.x-btn-mc em.x-btn-split {
+ background-image: url(../images/default/button/s-arrow.gif);
+}
+
+.x-btn-over .x-btn-mc em.x-btn-split,
+.x-btn-click .x-btn-mc em.x-btn-split,
+.x-btn-menu-active .x-btn-mc em.x-btn-split,
+.x-btn-pressed .x-btn-mc em.x-btn-split {
+ background-image: url(../images/gray/button/s-arrow-o.gif);
+}
+
+.x-btn-mc em.x-btn-arrow-bottom {
+ background-image: url(../images/default/button/s-arrow-b-noline.gif);
+}
+
+.x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/default/button/s-arrow-b.gif);
+}
+
+.x-btn-over .x-btn-mc em.x-btn-split-bottom,
+.x-btn-click .x-btn-mc em.x-btn-split-bottom,
+.x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,
+.x-btn-pressed .x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/gray/button/s-arrow-bo.gif);
+}
+
+.x-btn-group-header {
+ color: #666;
+}
+
+.x-btn-group-tc {
+ background-image: url(../images/gray/button/group-tb.gif);
+}
+
+.x-btn-group-tl {
+ background-image: url(../images/gray/button/group-cs.gif);
+}
+
+.x-btn-group-tr {
+ background-image: url(../images/gray/button/group-cs.gif);
+}
+
+.x-btn-group-bc {
+ background-image: url(../images/gray/button/group-tb.gif);
+}
+
+.x-btn-group-bl {
+ background-image: url(../images/gray/button/group-cs.gif);
+}
+
+.x-btn-group-br {
+ background-image: url(../images/gray/button/group-cs.gif);
+}
+
+.x-btn-group-ml {
+ background-image: url(../images/gray/button/group-lr.gif);
+}
+.x-btn-group-mr {
+ background-image: url(../images/gray/button/group-lr.gif);
+}
+
+.x-btn-group-notitle .x-btn-group-tc {
+ background-image: url(../images/gray/button/group-tb.gif);
+}
+.x-toolbar {
+ border-color: #d0d0d0;
+ background-color: #f0f0f0;
+ background-image: url(../images/gray/toolbar/bg.gif);
+}
+
+.x-toolbar td,
+.x-toolbar span,
+.x-toolbar input,
+.x-toolbar div,
+.x-toolbar select,
+.x-toolbar label {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-toolbar .x-item-disabled {
+ color: gray;
+}
+
+.x-toolbar .x-item-disabled * {
+ color: gray;
+}
+
+.x-toolbar .x-btn-mc em.x-btn-split {
+ background-image: url(../images/default/button/s-arrow-noline.gif);
+}
+
+.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split,
+.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split,
+.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split,
+.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split {
+ background-image: url(../images/gray/button/s-arrow-o.gif);
+}
+
+.x-toolbar .x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/default/button/s-arrow-b-noline.gif);
+}
+
+.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom,
+.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom,
+.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,
+.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/gray/button/s-arrow-bo.gif);
+}
+
+.x-toolbar .xtb-sep {
+ background-image: url(../images/default/grid/grid-split.gif);
+}
+
+.x-tbar-page-first {
+ background-image: url(../images/gray/grid/page-first.gif) !important;
+}
+
+.x-tbar-loading {
+ background-image: url(../images/gray/grid/refresh.gif) !important;
+}
+
+.x-tbar-page-last {
+ background-image: url(../images/gray/grid/page-last.gif) !important;
+}
+
+.x-tbar-page-next {
+ background-image: url(../images/gray/grid/page-next.gif) !important;
+}
+
+.x-tbar-page-prev {
+ background-image: url(../images/gray/grid/page-prev.gif) !important;
+}
+
+.x-item-disabled .x-tbar-loading {
+ background-image: url(../images/default/grid/loading.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-first {
+ background-image: url(../images/default/grid/page-first-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-last {
+ background-image: url(../images/default/grid/page-last-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-next {
+ background-image: url(../images/default/grid/page-next-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-prev {
+ background-image: url(../images/default/grid/page-prev-disabled.gif) !important;
+}
+
+.x-paging-info {
+ color: #444;
+}
+
+.x-toolbar-more-icon {
+ background-image: url(../images/gray/toolbar/more.gif) !important;
+}
+.x-resizable-handle {
+ background-color: #fff;
+}
+
+.x-resizable-over .x-resizable-handle-east,
+.x-resizable-pinned .x-resizable-handle-east,
+.x-resizable-over .x-resizable-handle-west,
+.x-resizable-pinned .x-resizable-handle-west {
+ background-image: url(../images/gray/sizer/e-handle.gif);
+}
+
+.x-resizable-over .x-resizable-handle-south,
+.x-resizable-pinned .x-resizable-handle-south,
+.x-resizable-over .x-resizable-handle-north,
+.x-resizable-pinned .x-resizable-handle-north {
+ background-image: url(../images/gray/sizer/s-handle.gif);
+}
+
+.x-resizable-over .x-resizable-handle-north,
+.x-resizable-pinned .x-resizable-handle-north {
+ background-image: url(../images/gray/sizer/s-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-southeast,
+.x-resizable-pinned .x-resizable-handle-southeast {
+ background-image: url(../images/gray/sizer/se-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-northwest,
+.x-resizable-pinned .x-resizable-handle-northwest {
+ background-image: url(../images/gray/sizer/nw-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-northeast,
+.x-resizable-pinned .x-resizable-handle-northeast {
+ background-image: url(../images/gray/sizer/ne-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-southwest,
+.x-resizable-pinned .x-resizable-handle-southwest {
+ background-image: url(../images/gray/sizer/sw-handle.gif);
+}
+.x-resizable-proxy {
+ border-color: #565656;
+}
+.x-resizable-overlay {
+ background-color: #fff;
+}
+.x-grid3 {
+ background-color: #fff;
+}
+
+.x-grid-panel .x-panel-mc .x-panel-body {
+ border-color: #d0d0d0;
+}
+
+.x-grid3-row td,
+.x-grid3-summary-row td {
+ font: normal 11px/13px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-grid3-hd-row td {
+ font: normal 11px/15px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-grid3-hd-row td {
+ border-left-color: #eee;
+ border-right-color: #d0d0d0;
+}
+
+.x-grid-row-loading {
+ background-color: #fff;
+ background-image: url(../images/default/shared/loading-balls.gif);
+}
+
+.x-grid3-row {
+ border-color: #ededed;
+ border-top-color: #fff;
+}
+
+.x-grid3-row-alt {
+ background-color: #fafafa;
+}
+
+.x-grid3-row-over {
+ border-color: #ddd;
+ background-color: #efefef;
+ background-image: url(../images/default/grid/row-over.gif);
+}
+
+.x-grid3-resize-proxy {
+ background-color: #777;
+}
+
+.x-grid3-resize-marker {
+ background-color: #777;
+}
+
+.x-grid3-header {
+ background-color: #f9f9f9;
+ background-image: url(../images/gray/grid/grid3-hrow2.gif);
+}
+
+.x-grid3-header-pop {
+ border-left-color: #d0d0d0;
+}
+
+.x-grid3-header-pop-inner {
+ border-left-color: #eee;
+ background-image: url(../images/default/grid/hd-pop.gif);
+}
+
+td.x-grid3-hd-over,
+td.sort-desc,
+td.sort-asc,
+td.x-grid3-hd-menu-open {
+ border-left-color: #acacac;
+ border-right-color: #acacac;
+}
+
+td.x-grid3-hd-over .x-grid3-hd-inner,
+td.sort-desc .x-grid3-hd-inner,
+td.sort-asc .x-grid3-hd-inner,
+td.x-grid3-hd-menu-open .x-grid3-hd-inner {
+ background-color: #f9f9f9;
+ background-image: url(../images/gray/grid/grid3-hrow-over2.gif);
+}
+
+.sort-asc .x-grid3-sort-icon {
+ background-image: url(../images/gray/grid/sort_asc.gif);
+}
+
+.sort-desc .x-grid3-sort-icon {
+ background-image: url(../images/gray/grid/sort_desc.gif);
+}
+
+.x-grid3-cell-text,
+.x-grid3-hd-text {
+ color: #000;
+}
+
+.x-grid3-split {
+ background-image: url(../images/default/grid/grid-split.gif);
+}
+
+.x-grid3-hd-text {
+ color: #333;
+}
+
+.x-dd-drag-proxy .x-grid3-hd-inner {
+ background-color: #f9f9f9;
+ background-image: url(../images/gray/grid/grid3-hrow-over2.gif);
+ border-color: #acacac;
+}
+
+.col-move-top {
+ background-image: url(../images/gray/grid/col-move-top.gif);
+}
+
+.col-move-bottom {
+ background-image: url(../images/gray/grid/col-move-bottom.gif);
+}
+
+.x-grid3-row-selected {
+ background-color: #cccccc !important;
+ background-image: none;
+ border-color: #acacac;
+}
+
+.x-grid3-cell-selected {
+ background-color: #cbcbcb !important;
+ color: #000;
+}
+
+.x-grid3-cell-selected span {
+ color: #000 !important;
+}
+
+.x-grid3-cell-selected .x-grid3-cell-text {
+ color: #000;
+}
+
+.x-grid3-locked td.x-grid3-row-marker,
+.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker {
+ background-color: #ebeadb !important;
+ background-image: url(../images/default/grid/grid-hrow.gif) !important;
+ color: #000;
+ border-top-color: #fff;
+ border-right-color: #6fa0df !important;
+}
+
+.x-grid3-locked td.x-grid3-row-marker div,
+.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div {
+ color: #333 !important;
+}
+
+.x-grid3-dirty-cell {
+ background-image: url(../images/default/grid/dirty.gif);
+}
+
+.x-grid3-topbar,
+.x-grid3-bottombar {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-grid3-bottombar .x-toolbar {
+ border-top-color: #a9bfd3;
+}
+
+.x-props-grid .x-grid3-td-name .x-grid3-cell-inner {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif) !important;
+ color: #000 !important;
+}
+
+.x-props-grid .x-grid3-body .x-grid3-td-name {
+ background-color: #fff !important;
+ border-right-color: #eee;
+}
+
+.xg-hmenu-sort-asc .x-menu-item-icon {
+ background-image: url(../images/default/grid/hmenu-asc.gif);
+}
+
+.xg-hmenu-sort-desc .x-menu-item-icon {
+ background-image: url(../images/default/grid/hmenu-desc.gif);
+}
+
+.xg-hmenu-lock .x-menu-item-icon {
+ background-image: url(../images/default/grid/hmenu-lock.gif);
+}
+
+.xg-hmenu-unlock .x-menu-item-icon {
+ background-image: url(../images/default/grid/hmenu-unlock.gif);
+}
+
+.x-grid3-hd-btn {
+ background-color: #f9f9f9;
+ background-image: url(../images/gray/grid/grid3-hd-btn.gif);
+}
+
+.x-grid3-body .x-grid3-td-expander {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-row-expander {
+ background-image: url(../images/gray/grid/row-expand-sprite.gif);
+}
+
+.x-grid3-body .x-grid3-td-checker {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-row-checker,
+.x-grid3-hd-checker {
+ background-image: url(../images/default/grid/row-check-sprite.gif);
+}
+
+.x-grid3-body .x-grid3-td-numberer {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner {
+ color: #444;
+}
+
+.x-grid3-body .x-grid3-td-row-icon {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander {
+ background-image: url(../images/gray/grid/grid3-special-col-sel-bg.gif);
+}
+
+.x-grid3-check-col {
+ background-image: url(../images/default/menu/unchecked.gif);
+}
+
+.x-grid3-check-col-on {
+ background-image: url(../images/default/menu/checked.gif);
+}
+
+.x-grid-group,
+.x-grid-group-body,
+.x-grid-group-hd {
+ zoom: 1;
+}
+
+.x-grid-group-hd {
+ border-bottom-color: #d0d0d0;
+}
+
+.x-grid-group-hd div.x-grid-group-title {
+ background-image: url(../images/gray/grid/group-collapse.gif);
+ color: #5f5f5f;
+ font: bold 11px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title {
+ background-image: url(../images/gray/grid/group-expand.gif);
+}
+
+.x-group-by-icon {
+ background-image: url(../images/default/grid/group-by.gif);
+}
+
+.x-cols-icon {
+ background-image: url(../images/default/grid/columns.gif);
+}
+
+.x-show-groups-icon {
+ background-image: url(../images/default/grid/group-by.gif);
+}
+
+.x-grid-empty {
+ color: gray;
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell {
+ border-right-color: #ededed;
+}
+
+.x-grid-with-col-lines .x-grid3-row {
+ border-top-color: #ededed;
+}
+
+.x-grid-with-col-lines .x-grid3-row-selected {
+ border-top-color: #b9b9b9;
+}
+.x-pivotgrid .x-grid3-header-offset table td {
+ background: url(../images/gray/grid/grid3-hrow2.gif) repeat-x 50% 100%;
+ border-left: 1px solid;
+ border-right: 1px solid;
+ border-left-color: #d0d0d0;
+ border-right-color: #d0d0d0;
+}
+
+.x-pivotgrid .x-grid3-row-headers {
+ background-color: #f9f9f9;
+}
+
+.x-pivotgrid .x-grid3-row-headers table td {
+ background: #eee url(../images/default/grid/grid3-rowheader.gif) repeat-x
+ left top;
+ border-left: 1px solid;
+ border-right: 1px solid;
+ border-left-color: #eee;
+ border-right-color: #d0d0d0;
+ border-bottom: 1px solid;
+ border-bottom-color: #d0d0d0;
+ height: 18px;
+}
+.x-dd-drag-ghost {
+ color: #000;
+ font: normal 11px arial, helvetica, sans-serif;
+ border-color: #ddd #bbb #bbb #ddd;
+ background-color: #fff;
+}
+
+.x-dd-drop-nodrop .x-dd-drop-icon {
+ background-image: url(../images/default/dd/drop-no.gif);
+}
+
+.x-dd-drop-ok .x-dd-drop-icon {
+ background-image: url(../images/default/dd/drop-yes.gif);
+}
+
+.x-dd-drop-ok-add .x-dd-drop-icon {
+ background-image: url(../images/default/dd/drop-add.gif);
+}
+
+.x-view-selector {
+ background-color: #d6d6d6;
+ border-color: #888888;
+}
+.x-tree-node-expanded .x-tree-node-icon {
+ background-image: url(../images/default/tree/folder-open.gif);
+}
+
+.x-tree-node-leaf .x-tree-node-icon {
+ background-image: url(../images/default/tree/leaf.gif);
+}
+
+.x-tree-node-collapsed .x-tree-node-icon {
+ background-image: url(../images/default/tree/folder.gif);
+}
+
+.x-tree-node-loading .x-tree-node-icon {
+ background-image: url(../images/default/tree/loading.gif) !important;
+}
+
+.x-tree-node .x-tree-node-inline-icon {
+ background-image: none;
+}
+
+.x-tree-node-loading a span {
+ font-style: italic;
+ color: #444444;
+}
+
+.ext-ie .x-tree-node-el input {
+ width: 15px;
+ height: 15px;
+}
+
+.x-tree-lines .x-tree-elbow {
+ background-image: url(../images/default/tree/elbow.gif);
+}
+
+.x-tree-lines .x-tree-elbow-plus {
+ background-image: url(../images/default/tree/elbow-plus.gif);
+}
+
+.x-tree-lines .x-tree-elbow-minus {
+ background-image: url(../images/default/tree/elbow-minus.gif);
+}
+
+.x-tree-lines .x-tree-elbow-end {
+ background-image: url(../images/default/tree/elbow-end.gif);
+}
+
+.x-tree-lines .x-tree-elbow-end-plus {
+ background-image: url(../images/gray/tree/elbow-end-plus.gif);
+}
+
+.x-tree-lines .x-tree-elbow-end-minus {
+ background-image: url(../images/gray/tree/elbow-end-minus.gif);
+}
+
+.x-tree-lines .x-tree-elbow-line {
+ background-image: url(../images/default/tree/elbow-line.gif);
+}
+
+.x-tree-no-lines .x-tree-elbow-plus {
+ background-image: url(../images/default/tree/elbow-plus-nl.gif);
+}
+
+.x-tree-no-lines .x-tree-elbow-minus {
+ background-image: url(../images/default/tree/elbow-minus-nl.gif);
+}
+
+.x-tree-no-lines .x-tree-elbow-end-plus {
+ background-image: url(../images/gray/tree/elbow-end-plus-nl.gif);
+}
+
+.x-tree-no-lines .x-tree-elbow-end-minus {
+ background-image: url(../images/gray/tree/elbow-end-minus-nl.gif);
+}
+
+.x-tree-arrows .x-tree-elbow-plus {
+ background-image: url(../images/gray/tree/arrows.gif);
+}
+
+.x-tree-arrows .x-tree-elbow-minus {
+ background-image: url(../images/gray/tree/arrows.gif);
+}
+
+.x-tree-arrows .x-tree-elbow-end-plus {
+ background-image: url(../images/gray/tree/arrows.gif);
+}
+
+.x-tree-arrows .x-tree-elbow-end-minus {
+ background-image: url(../images/gray/tree/arrows.gif);
+}
+
+.x-tree-node {
+ color: #000;
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-tree-node a,
+.x-dd-drag-ghost a {
+ color: #000;
+}
+
+.x-tree-node a span,
+.x-dd-drag-ghost a span {
+ color: #000;
+}
+
+.x-tree-node .x-tree-node-disabled a span {
+ color: gray !important;
+}
+
+.x-tree-node div.x-tree-drag-insert-below {
+ border-bottom-color: #36c;
+}
+
+.x-tree-node div.x-tree-drag-insert-above {
+ border-top-color: #36c;
+}
+
+.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a {
+ border-bottom-color: #36c;
+}
+
+.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a {
+ border-top-color: #36c;
+}
+
+.x-tree-node .x-tree-drag-append a span {
+ background-color: #ddd;
+ border-color: gray;
+}
+
+.x-tree-node .x-tree-node-over {
+ background-color: #eee;
+}
+
+.x-tree-node .x-tree-selected {
+ background-color: #ddd;
+}
+
+.x-tree-drop-ok-append .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-add.gif);
+}
+
+.x-tree-drop-ok-above .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-over.gif);
+}
+
+.x-tree-drop-ok-below .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-under.gif);
+}
+
+.x-tree-drop-ok-between .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-between.gif);
+}
+.x-date-picker {
+ border-color: #585858;
+ background-color: #fff;
+}
+
+.x-date-middle,
+.x-date-left,
+.x-date-right {
+ background-image: url(../images/gray/shared/hd-sprite.gif);
+ color: #fff;
+ font: bold 11px 'sans serif', tahoma, verdana, helvetica;
+}
+
+.x-date-middle .x-btn .x-btn-text {
+ color: #fff;
+}
+
+.x-date-middle .x-btn-mc em.x-btn-arrow {
+ background-image: url(../images/gray/toolbar/btn-arrow-light.gif);
+}
+
+.x-date-right a {
+ background-image: url(../images/gray/shared/right-btn.gif);
+}
+
+.x-date-left a {
+ background-image: url(../images/gray/shared/left-btn.gif);
+}
+
+.x-date-inner th {
+ background-color: #d8d8d8;
+ background-image: url(../images/gray/panel/white-top-bottom.gif);
+ border-bottom-color: #afafaf;
+ font: normal 10px arial, helvetica, tahoma, sans-serif;
+ color: #595959;
+}
+
+.x-date-inner td {
+ border-color: #fff;
+}
+
+.x-date-inner a {
+ font: normal 11px arial, helvetica, tahoma, sans-serif;
+ color: #000;
+}
+
+.x-date-inner .x-date-active {
+ color: #000;
+}
+
+.x-date-inner .x-date-selected a {
+ background-image: none;
+ background-color: #d8d8d8;
+ border-color: #dcdcdc;
+}
+
+.x-date-inner .x-date-today a {
+ border-color: darkred;
+}
+
+.x-date-inner .x-date-selected span {
+ font-weight: bold;
+}
+
+.x-date-inner .x-date-prevday a,
+.x-date-inner .x-date-nextday a {
+ color: #aaa;
+}
+
+.x-date-bottom {
+ border-top-color: #afafaf;
+ background-color: #d8d8d8;
+ background: #d8d8d8 url(../images/gray/panel/white-top-bottom.gif) 0 -2px;
+}
+
+.x-date-inner a:hover,
+.x-date-inner .x-date-disabled a:hover {
+ color: #000;
+ background-color: #d8d8d8;
+}
+
+.x-date-inner .x-date-disabled a {
+ background-color: #eee;
+ color: #bbb;
+}
+
+.x-date-mmenu {
+ background-color: #eee !important;
+}
+
+.x-date-mmenu .x-menu-item {
+ font-size: 10px;
+ color: #000;
+}
+
+.x-date-mp {
+ background-color: #fff;
+}
+
+.x-date-mp td {
+ font: normal 11px arial, helvetica, tahoma, sans-serif;
+}
+
+.x-date-mp-btns button {
+ background-color: #4e565f;
+ color: #fff;
+ border-color: #c0c0c0 #434343 #434343 #c0c0c0;
+ font: normal 11px arial, helvetica, tahoma, sans-serif;
+}
+
+.x-date-mp-btns {
+ background-color: #d8d8d8;
+ background: #d8d8d8 url(../images/gray/panel/white-top-bottom.gif) 0 -2px;
+}
+
+.x-date-mp-btns td {
+ border-top-color: #afafaf;
+}
+
+td.x-date-mp-month a,
+td.x-date-mp-year a {
+ color: #333;
+}
+
+td.x-date-mp-month a:hover,
+td.x-date-mp-year a:hover {
+ color: #333;
+ background-color: #fdfdfd;
+}
+
+td.x-date-mp-sel a {
+ background-color: #d8d8d8;
+ background: #d8d8d8 url(../images/gray/panel/white-top-bottom.gif) 0 -2px;
+ border-color: #dcdcdc;
+}
+
+.x-date-mp-ybtn a {
+ background-image: url(../images/gray/panel/tool-sprites.gif);
+}
+
+td.x-date-mp-sep {
+ border-right-color: #d7d7d7;
+}
+.x-tip .x-tip-close {
+ background-image: url(../images/gray/qtip/close.gif);
+}
+
+.x-tip .x-tip-tc,
+.x-tip .x-tip-tl,
+.x-tip .x-tip-tr,
+.x-tip .x-tip-bc,
+.x-tip .x-tip-bl,
+.x-tip .x-tip-br,
+.x-tip .x-tip-ml,
+.x-tip .x-tip-mr {
+ background-image: url(../images/gray/qtip/tip-sprite.gif);
+}
+
+.x-tip .x-tip-mc {
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+}
+.x-tip .x-tip-ml {
+ background-color: #fff;
+}
+
+.x-tip .x-tip-header-text {
+ font: bold 11px tahoma, arial, helvetica, sans-serif;
+ color: #444;
+}
+
+.x-tip .x-tip-body {
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+ color: #444;
+}
+
+.x-form-invalid-tip .x-tip-tc,
+.x-form-invalid-tip .x-tip-tl,
+.x-form-invalid-tip .x-tip-tr,
+.x-form-invalid-tip .x-tip-bc,
+.x-form-invalid-tip .x-tip-bl,
+.x-form-invalid-tip .x-tip-br,
+.x-form-invalid-tip .x-tip-ml,
+.x-form-invalid-tip .x-tip-mr {
+ background-image: url(../images/default/form/error-tip-corners.gif);
+}
+
+.x-form-invalid-tip .x-tip-body {
+ background-image: url(../images/default/form/exclamation.gif);
+}
+
+.x-tip-anchor {
+ background-image: url(../images/gray/qtip/tip-anchor-sprite.gif);
+}
+.x-menu {
+ background-color: #f0f0f0;
+ background-image: url(../images/default/menu/menu.gif);
+}
+
+.x-menu-floating {
+ border-color: #7d7d7d;
+}
+
+.x-menu-nosep {
+ background-image: none;
+}
+
+.x-menu-list-item {
+ font: normal 11px arial, tahoma, sans-serif;
+}
+
+.x-menu-item-arrow {
+ background-image: url(../images/gray/menu/menu-parent.gif);
+}
+
+.x-menu-sep {
+ background-color: #e0e0e0;
+ border-bottom-color: #fff;
+}
+
+a.x-menu-item {
+ color: #222;
+}
+
+.x-menu-item-active {
+ background-image: url(../images/gray/menu/item-over.gif);
+ background-color: #f1f1f1;
+ border-color: #acacac;
+}
+
+.x-menu-item-active a.x-menu-item {
+ border-color: #acacac;
+}
+
+.x-menu-check-item .x-menu-item-icon {
+ background-image: url(../images/default/menu/unchecked.gif);
+}
+
+.x-menu-item-checked .x-menu-item-icon {
+ background-image: url(../images/default/menu/checked.gif);
+}
+
+.x-menu-item-checked .x-menu-group-item .x-menu-item-icon {
+ background-image: url(../images/gray/menu/group-checked.gif);
+}
+
+.x-menu-group-item .x-menu-item-icon {
+ background-image: none;
+}
+
+.x-menu-plain {
+ background-color: #fff !important;
+}
+
+.x-menu .x-date-picker {
+ border-color: #afafaf;
+}
+
+.x-cycle-menu .x-menu-item-checked {
+ border-color: #b9b9b9 !important;
+ background-color: #f1f1f1;
+}
+
+.x-menu-scroller-top {
+ background-image: url(../images/default/layout/mini-top.gif);
+}
+
+.x-menu-scroller-bottom {
+ background-image: url(../images/default/layout/mini-bottom.gif);
+}
+.x-box-tl {
+ background-image: url(../images/default/box/corners.gif);
+}
+
+.x-box-tc {
+ background-image: url(../images/default/box/tb.gif);
+}
+
+.x-box-tr {
+ background-image: url(../images/default/box/corners.gif);
+}
+
+.x-box-ml {
+ background-image: url(../images/default/box/l.gif);
+}
+
+.x-box-mc {
+ background-color: #eee;
+ background-image: url(../images/default/box/tb.gif);
+ font-family: 'Myriad Pro', 'Myriad Web', 'Tahoma', 'Helvetica', 'Arial',
+ sans-serif;
+ color: #393939;
+ font-size: 12px;
+}
+
+.x-box-mc h3 {
+ font-size: 14px;
+ font-weight: bold;
+}
+
+.x-box-mr {
+ background-image: url(../images/default/box/r.gif);
+}
+
+.x-box-bl {
+ background-image: url(../images/default/box/corners.gif);
+}
+
+.x-box-bc {
+ background-image: url(../images/default/box/tb.gif);
+}
+
+.x-box-br {
+ background-image: url(../images/default/box/corners.gif);
+}
+
+.x-box-blue .x-box-bl,
+.x-box-blue .x-box-br,
+.x-box-blue .x-box-tl,
+.x-box-blue .x-box-tr {
+ background-image: url(../images/default/box/corners-blue.gif);
+}
+
+.x-box-blue .x-box-bc,
+.x-box-blue .x-box-mc,
+.x-box-blue .x-box-tc {
+ background-image: url(../images/default/box/tb-blue.gif);
+}
+
+.x-box-blue .x-box-mc {
+ background-color: #c3daf9;
+}
+
+.x-box-blue .x-box-mc h3 {
+ color: #17385b;
+}
+
+.x-box-blue .x-box-ml {
+ background-image: url(../images/default/box/l-blue.gif);
+}
+
+.x-box-blue .x-box-mr {
+ background-image: url(../images/default/box/r-blue.gif);
+}
+.x-combo-list {
+ border-color: #ccc;
+ background-color: #ddd;
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-combo-list-inner {
+ background-color: #fff;
+}
+
+.x-combo-list-hd {
+ font: bold 11px tahoma, arial, helvetica, sans-serif;
+ color: #333;
+ background-image: url(../images/default/layout/panel-title-light-bg.gif);
+ border-bottom-color: #bcbcbc;
+}
+
+.x-resizable-pinned .x-combo-list-inner {
+ border-bottom-color: #bebebe;
+}
+
+.x-combo-list-item {
+ border-color: #fff;
+}
+
+.x-combo-list .x-combo-selected {
+ border-color: #777 !important;
+ background-color: #f0f0f0;
+}
+
+.x-combo-list .x-toolbar {
+ border-top-color: #bcbcbc;
+}
+
+.x-combo-list-small {
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+}
+.x-panel {
+ border-color: #d0d0d0;
+}
+
+.x-panel-header {
+ color: #333;
+ font-weight: bold;
+ font-size: 11px;
+ font-family: tahoma, arial, verdana, sans-serif;
+ border-color: #d0d0d0;
+ background-image: url(../images/gray/panel/white-top-bottom.gif);
+}
+
+.x-panel-body {
+ border-color: #d0d0d0;
+ background-color: #fff;
+}
+
+.x-panel-bbar .x-toolbar,
+.x-panel-tbar .x-toolbar {
+ border-color: #d0d0d0;
+}
+
+.x-panel-tbar-noheader .x-toolbar,
+.x-panel-mc .x-panel-tbar .x-toolbar {
+ border-top-color: #d0d0d0;
+}
+
+.x-panel-body-noheader,
+.x-panel-mc .x-panel-body {
+ border-top-color: #d0d0d0;
+}
+
+.x-panel-tl .x-panel-header {
+ color: #333;
+ font: bold 11px tahoma, arial, verdana, sans-serif;
+}
+
+.x-panel-tc {
+ background-image: url(../images/gray/panel/top-bottom.gif);
+}
+
+.x-panel-tl,
+.x-panel-tr,
+.x-panel-bl,
+.x-panel-br {
+ background-image: url(../images/gray/panel/corners-sprite.gif);
+ border-bottom-color: #d0d0d0;
+}
+
+.x-panel-bc {
+ background-image: url(../images/gray/panel/top-bottom.gif);
+}
+
+.x-panel-mc {
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+ background-color: #f1f1f1;
+}
+
+.x-panel-ml {
+ background-color: #fff;
+ background-image: url(../images/gray/panel/left-right.gif);
+}
+
+.x-panel-mr {
+ background-image: url(../images/gray/panel/left-right.gif);
+}
+
+.x-tool {
+ background-image: url(../images/gray/panel/tool-sprites.gif);
+}
+
+.x-panel-ghost {
+ background-color: #f2f2f2;
+}
+
+.x-panel-ghost ul {
+ border-color: #d0d0d0;
+}
+
+.x-panel-dd-spacer {
+ border-color: #d0d0d0;
+}
+
+.x-panel-fbar td,
+.x-panel-fbar span,
+.x-panel-fbar input,
+.x-panel-fbar div,
+.x-panel-fbar select,
+.x-panel-fbar label {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+.x-window-proxy {
+ background-color: #fcfcfc;
+ border-color: #d0d0d0;
+}
+
+.x-window-tl .x-window-header {
+ color: #555;
+ font: bold 11px tahoma, arial, verdana, sans-serif;
+}
+
+.x-window-tc {
+ background-image: url(../images/gray/window/top-bottom.png);
+}
+
+.x-window-tl {
+ background-image: url(../images/gray/window/left-corners.png);
+}
+
+.x-window-tr {
+ background-image: url(../images/gray/window/right-corners.png);
+}
+
+.x-window-bc {
+ background-image: url(../images/gray/window/top-bottom.png);
+}
+
+.x-window-bl {
+ background-image: url(../images/gray/window/left-corners.png);
+}
+
+.x-window-br {
+ background-image: url(../images/gray/window/right-corners.png);
+}
+
+.x-window-mc {
+ border-color: #d0d0d0;
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+ background-color: #e8e8e8;
+}
+
+.x-window-ml {
+ background-image: url(../images/gray/window/left-right.png);
+}
+
+.x-window-mr {
+ background-image: url(../images/gray/window/left-right.png);
+}
+
+.x-window-maximized .x-window-tc {
+ background-color: #fff;
+}
+
+.x-window-bbar .x-toolbar {
+ border-top-color: #d0d0d0;
+}
+
+.x-panel-ghost .x-window-tl {
+ border-bottom-color: #d0d0d0;
+}
+
+.x-panel-collapsed .x-window-tl {
+ border-bottom-color: #d0d0d0;
+}
+
+.x-dlg-mask {
+ background-color: #ccc;
+}
+
+.x-window-plain .x-window-mc {
+ background-color: #e8e8e8;
+ border-color: #d0d0d0 #eeeeee #eeeeee #d0d0d0;
+}
+
+.x-window-plain .x-window-body {
+ border-color: #eeeeee #d0d0d0 #d0d0d0 #eeeeee;
+}
+
+body.x-body-masked .x-window-plain .x-window-mc {
+ background-color: #e4e4e4;
+}
+.x-html-editor-wrap {
+ border-color: #bcbcbc;
+ background-color: #fff;
+}
+.x-html-editor-tb .x-btn-text {
+ background-image: url(../images/default/editor/tb-sprite.gif);
+}
+.x-panel-noborder .x-panel-header-noborder {
+ border-bottom-color: #d0d0d0;
+}
+
+.x-panel-noborder .x-panel-tbar-noborder .x-toolbar {
+ border-bottom-color: #d0d0d0;
+}
+
+.x-panel-noborder .x-panel-bbar-noborder .x-toolbar {
+ border-top-color: #d0d0d0;
+}
+
+.x-tab-panel-bbar-noborder .x-toolbar {
+ border-top-color: #d0d0d0;
+}
+
+.x-tab-panel-tbar-noborder .x-toolbar {
+ border-bottom-color: #d0d0d0;
+}
+
+.x-border-layout-ct {
+ background-color: #f0f0f0;
+}
+.x-border-layout-ct {
+ background-color: #f0f0f0;
+}
+
+.x-accordion-hd {
+ color: #222;
+ font-weight: normal;
+ background-image: url(../images/gray/panel/light-hd.gif);
+}
+
+.x-layout-collapsed {
+ background-color: #dfdfdf;
+ border-color: #d0d0d0;
+}
+
+.x-layout-collapsed-over {
+ background-color: #e7e7e7;
+}
+
+.x-layout-split-west .x-layout-mini {
+ background-image: url(../images/default/layout/mini-left.gif);
+}
+.x-layout-split-east .x-layout-mini {
+ background-image: url(../images/default/layout/mini-right.gif);
+}
+.x-layout-split-north .x-layout-mini {
+ background-image: url(../images/default/layout/mini-top.gif);
+}
+.x-layout-split-south .x-layout-mini {
+ background-image: url(../images/default/layout/mini-bottom.gif);
+}
+
+.x-layout-cmini-west .x-layout-mini {
+ background-image: url(../images/default/layout/mini-right.gif);
+}
+
+.x-layout-cmini-east .x-layout-mini {
+ background-image: url(../images/default/layout/mini-left.gif);
+}
+
+.x-layout-cmini-north .x-layout-mini {
+ background-image: url(../images/default/layout/mini-bottom.gif);
+}
+
+.x-layout-cmini-south .x-layout-mini {
+ background-image: url(../images/default/layout/mini-top.gif);
+}
+.x-progress-wrap {
+ border-color: #8e8e8e;
+}
+
+.x-progress-inner {
+ background-color: #e7e7e7;
+ background-image: url(../images/gray/qtip/bg.gif);
+}
+
+.x-progress-bar {
+ background-color: #bcbcbc;
+ background-image: url(../images/gray/progress/progress-bg.gif);
+ border-top-color: #e2e2e2;
+ border-bottom-color: #a4a4a4;
+ border-right-color: #a4a4a4;
+}
+
+.x-progress-text {
+ font-size: 11px;
+ font-weight: bold;
+ color: #fff;
+}
+
+.x-progress-text-back {
+ color: #5f5f5f;
+}
+.x-list-header {
+ background-color: #f9f9f9;
+ background-image: url(../images/gray/grid/grid3-hrow2.gif);
+}
+
+.x-list-header-inner div em {
+ border-left-color: #ddd;
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-list-body dt em {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-list-over {
+ background-color: #eee;
+}
+
+.x-list-selected {
+ background-color: #f0f0f0;
+}
+
+.x-list-resizer {
+ border-left-color: #555;
+ border-right-color: #555;
+}
+
+.x-list-header-inner em.sort-asc,
+.x-list-header-inner em.sort-desc {
+ background-image: url(../images/gray/grid/sort-hd.gif);
+ border-color: #d0d0d0;
+}
+.x-slider-horz,
+.x-slider-horz .x-slider-end,
+.x-slider-horz .x-slider-inner {
+ background-image: url(../images/default/slider/slider-bg.png);
+}
+
+.x-slider-horz .x-slider-thumb {
+ background-image: url(../images/gray/slider/slider-thumb.png);
+}
+
+.x-slider-vert,
+.x-slider-vert .x-slider-end,
+.x-slider-vert .x-slider-inner {
+ background-image: url(../images/default/slider/slider-v-bg.png);
+}
+
+.x-slider-vert .x-slider-thumb {
+ background-image: url(../images/gray/slider/slider-v-thumb.png);
+}
+.x-window-dlg .ext-mb-text,
+.x-window-dlg .x-window-header-text {
+ font-size: 12px;
+}
+
+.x-window-dlg .ext-mb-textarea {
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-window-dlg .x-msg-box-wait {
+ background-image: url(../images/default/grid/loading.gif);
+}
+
+.x-window-dlg .ext-mb-info {
+ background-image: url(../images/gray/window/icon-info.gif);
+}
+
+.x-window-dlg .ext-mb-warning {
+ background-image: url(../images/gray/window/icon-warning.gif);
+}
+
+.x-window-dlg .ext-mb-question {
+ background-image: url(../images/gray/window/icon-question.gif);
+}
+
+.x-window-dlg .ext-mb-error {
+ background-image: url(../images/gray/window/icon-error.gif);
+}
diff --git a/deluge/ui/web/themes/images/access/box/corners-blue.gif b/deluge/ui/web/themes/images/access/box/corners-blue.gif
new file mode 100644
index 0000000..fa419b5
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/box/corners-blue.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/box/corners.gif b/deluge/ui/web/themes/images/access/box/corners.gif
new file mode 100644
index 0000000..8aa8cae
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/box/corners.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/box/l-blue.gif b/deluge/ui/web/themes/images/access/box/l-blue.gif
new file mode 100644
index 0000000..5ed7f00
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/box/l-blue.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/box/l.gif b/deluge/ui/web/themes/images/access/box/l.gif
new file mode 100644
index 0000000..0160f97
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/box/l.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/box/r-blue.gif b/deluge/ui/web/themes/images/access/box/r-blue.gif
new file mode 100644
index 0000000..3ea5cae
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/box/r-blue.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/box/r.gif b/deluge/ui/web/themes/images/access/box/r.gif
new file mode 100644
index 0000000..34237f6
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/box/r.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/box/tb-blue.gif b/deluge/ui/web/themes/images/access/box/tb-blue.gif
new file mode 100644
index 0000000..4b1382c
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/box/tb-blue.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/box/tb.gif b/deluge/ui/web/themes/images/access/box/tb.gif
new file mode 100644
index 0000000..435889b
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/box/tb.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/button/arrow.gif b/deluge/ui/web/themes/images/access/button/arrow.gif
new file mode 100644
index 0000000..087b450
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/button/arrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/button/btn.gif b/deluge/ui/web/themes/images/access/button/btn.gif
new file mode 100644
index 0000000..3e705ba
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/button/btn.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/button/group-cs.gif b/deluge/ui/web/themes/images/access/button/group-cs.gif
new file mode 100644
index 0000000..aaf0d46
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/button/group-cs.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/button/group-lr.gif b/deluge/ui/web/themes/images/access/button/group-lr.gif
new file mode 100644
index 0000000..374ea75
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/button/group-lr.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/button/group-tb.gif b/deluge/ui/web/themes/images/access/button/group-tb.gif
new file mode 100644
index 0000000..50a9972
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/button/group-tb.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/button/s-arrow-b-noline.gif b/deluge/ui/web/themes/images/access/button/s-arrow-b-noline.gif
new file mode 100644
index 0000000..644e9f3
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/button/s-arrow-b-noline.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/button/s-arrow-b.gif b/deluge/ui/web/themes/images/access/button/s-arrow-b.gif
new file mode 100644
index 0000000..ba55d0a
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/button/s-arrow-b.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/button/s-arrow-bo.gif b/deluge/ui/web/themes/images/access/button/s-arrow-bo.gif
new file mode 100644
index 0000000..c672b60
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/button/s-arrow-bo.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/button/s-arrow-noline.gif b/deluge/ui/web/themes/images/access/button/s-arrow-noline.gif
new file mode 100644
index 0000000..f3cd351
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/button/s-arrow-noline.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/button/s-arrow-o.gif b/deluge/ui/web/themes/images/access/button/s-arrow-o.gif
new file mode 100644
index 0000000..4bdafd0
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/button/s-arrow-o.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/button/s-arrow.gif b/deluge/ui/web/themes/images/access/button/s-arrow.gif
new file mode 100644
index 0000000..a77be7f
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/button/s-arrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/editor/tb-sprite.gif b/deluge/ui/web/themes/images/access/editor/tb-sprite.gif
new file mode 100644
index 0000000..bd4011d
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/editor/tb-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/checkbox.gif b/deluge/ui/web/themes/images/access/form/checkbox.gif
new file mode 100644
index 0000000..835b346
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/checkbox.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/clear-trigger.gif b/deluge/ui/web/themes/images/access/form/clear-trigger.gif
new file mode 100644
index 0000000..9bfd184
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/clear-trigger.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/clear-trigger.psd b/deluge/ui/web/themes/images/access/form/clear-trigger.psd
new file mode 100644
index 0000000..fcd7944
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/clear-trigger.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/date-trigger.gif b/deluge/ui/web/themes/images/access/form/date-trigger.gif
new file mode 100644
index 0000000..048506d
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/date-trigger.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/date-trigger.psd b/deluge/ui/web/themes/images/access/form/date-trigger.psd
new file mode 100644
index 0000000..d9f9be1
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/date-trigger.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/error-tip-corners.gif b/deluge/ui/web/themes/images/access/form/error-tip-corners.gif
new file mode 100644
index 0000000..6ea4c38
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/error-tip-corners.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/exclamation.gif b/deluge/ui/web/themes/images/access/form/exclamation.gif
new file mode 100644
index 0000000..daa88b8
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/exclamation.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/radio.gif b/deluge/ui/web/themes/images/access/form/radio.gif
new file mode 100644
index 0000000..36bb91d
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/radio.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/search-trigger.gif b/deluge/ui/web/themes/images/access/form/search-trigger.gif
new file mode 100644
index 0000000..ab8b3b4
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/search-trigger.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/search-trigger.psd b/deluge/ui/web/themes/images/access/form/search-trigger.psd
new file mode 100644
index 0000000..4f92b72
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/search-trigger.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/text-bg.gif b/deluge/ui/web/themes/images/access/form/text-bg.gif
new file mode 100644
index 0000000..4ce90bb
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/text-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/trigger-tpl.gif b/deluge/ui/web/themes/images/access/form/trigger-tpl.gif
new file mode 100644
index 0000000..2574ead
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/trigger-tpl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/trigger.gif b/deluge/ui/web/themes/images/access/form/trigger.gif
new file mode 100644
index 0000000..bd25572
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/trigger.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/form/trigger.psd b/deluge/ui/web/themes/images/access/form/trigger.psd
new file mode 100644
index 0000000..c078133
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/form/trigger.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/arrow-left-white.gif b/deluge/ui/web/themes/images/access/grid/arrow-left-white.gif
new file mode 100644
index 0000000..63088f5
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/arrow-left-white.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/arrow-right-white.gif b/deluge/ui/web/themes/images/access/grid/arrow-right-white.gif
new file mode 100644
index 0000000..e9e0678
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/arrow-right-white.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/col-move-bottom.gif b/deluge/ui/web/themes/images/access/grid/col-move-bottom.gif
new file mode 100644
index 0000000..cc1e473
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/col-move-bottom.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/col-move-top.gif b/deluge/ui/web/themes/images/access/grid/col-move-top.gif
new file mode 100644
index 0000000..58ff32c
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/col-move-top.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/columns.gif b/deluge/ui/web/themes/images/access/grid/columns.gif
new file mode 100644
index 0000000..2d3a823
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/columns.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/dirty.gif b/deluge/ui/web/themes/images/access/grid/dirty.gif
new file mode 100644
index 0000000..d524ee5
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/dirty.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/done.gif b/deluge/ui/web/themes/images/access/grid/done.gif
new file mode 100644
index 0000000..a937cb2
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/done.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/drop-no.gif b/deluge/ui/web/themes/images/access/grid/drop-no.gif
new file mode 100644
index 0000000..31a332b
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/drop-no.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/drop-yes.gif b/deluge/ui/web/themes/images/access/grid/drop-yes.gif
new file mode 100644
index 0000000..926010e
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/drop-yes.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/footer-bg.gif b/deluge/ui/web/themes/images/access/grid/footer-bg.gif
new file mode 100644
index 0000000..126120f
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/footer-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/grid-blue-hd.gif b/deluge/ui/web/themes/images/access/grid/grid-blue-hd.gif
new file mode 100644
index 0000000..862094e
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/grid-blue-hd.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/grid-blue-split.gif b/deluge/ui/web/themes/images/access/grid/grid-blue-split.gif
new file mode 100644
index 0000000..1b0bae3
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/grid-blue-split.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/grid-hrow.gif b/deluge/ui/web/themes/images/access/grid/grid-hrow.gif
new file mode 100644
index 0000000..6374104
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/grid-hrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/grid-loading.gif b/deluge/ui/web/themes/images/access/grid/grid-loading.gif
new file mode 100644
index 0000000..d112c54
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/grid-loading.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/grid-split.gif b/deluge/ui/web/themes/images/access/grid/grid-split.gif
new file mode 100644
index 0000000..c76a16e
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/grid-split.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/grid-vista-hd.gif b/deluge/ui/web/themes/images/access/grid/grid-vista-hd.gif
new file mode 100644
index 0000000..d097263
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/grid-vista-hd.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/grid3-hd-btn.gif b/deluge/ui/web/themes/images/access/grid/grid3-hd-btn.gif
new file mode 100644
index 0000000..9ecd650
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/grid3-hd-btn.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/grid3-hrow-over.gif b/deluge/ui/web/themes/images/access/grid/grid3-hrow-over.gif
new file mode 100644
index 0000000..0405f6c
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/grid3-hrow-over.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/grid3-hrow.gif b/deluge/ui/web/themes/images/access/grid/grid3-hrow.gif
new file mode 100644
index 0000000..509737a
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/grid3-hrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/grid3-special-col-bg.gif b/deluge/ui/web/themes/images/access/grid/grid3-special-col-bg.gif
new file mode 100644
index 0000000..8ec57f5
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/grid3-special-col-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/grid3-special-col-sel-bg.gif b/deluge/ui/web/themes/images/access/grid/grid3-special-col-sel-bg.gif
new file mode 100644
index 0000000..93a9ca6
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/grid3-special-col-sel-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/group-by.gif b/deluge/ui/web/themes/images/access/grid/group-by.gif
new file mode 100644
index 0000000..d6075bb
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/group-by.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/group-collapse.gif b/deluge/ui/web/themes/images/access/grid/group-collapse.gif
new file mode 100644
index 0000000..9bd255e
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/group-collapse.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/group-expand-sprite.gif b/deluge/ui/web/themes/images/access/grid/group-expand-sprite.gif
new file mode 100644
index 0000000..f230489
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/group-expand-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/group-expand.gif b/deluge/ui/web/themes/images/access/grid/group-expand.gif
new file mode 100644
index 0000000..fd22e6b
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/group-expand.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/hd-pop.gif b/deluge/ui/web/themes/images/access/grid/hd-pop.gif
new file mode 100644
index 0000000..eb8ba79
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/hd-pop.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/hmenu-asc.gif b/deluge/ui/web/themes/images/access/grid/hmenu-asc.gif
new file mode 100644
index 0000000..8917e0e
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/hmenu-asc.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/hmenu-desc.gif b/deluge/ui/web/themes/images/access/grid/hmenu-desc.gif
new file mode 100644
index 0000000..f26b7c2
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/hmenu-desc.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/hmenu-lock.gif b/deluge/ui/web/themes/images/access/grid/hmenu-lock.gif
new file mode 100644
index 0000000..1596126
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/hmenu-lock.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/hmenu-lock.png b/deluge/ui/web/themes/images/access/grid/hmenu-lock.png
new file mode 100644
index 0000000..5d33c09
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/hmenu-lock.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/hmenu-unlock.gif b/deluge/ui/web/themes/images/access/grid/hmenu-unlock.gif
new file mode 100644
index 0000000..af59cf9
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/hmenu-unlock.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/hmenu-unlock.png b/deluge/ui/web/themes/images/access/grid/hmenu-unlock.png
new file mode 100644
index 0000000..0371ca4
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/hmenu-unlock.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/invalid_line.gif b/deluge/ui/web/themes/images/access/grid/invalid_line.gif
new file mode 100644
index 0000000..025cffc
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/invalid_line.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/loading.gif b/deluge/ui/web/themes/images/access/grid/loading.gif
new file mode 100644
index 0000000..e846e1d
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/loading.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/mso-hd.gif b/deluge/ui/web/themes/images/access/grid/mso-hd.gif
new file mode 100644
index 0000000..669f3cf
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/mso-hd.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/nowait.gif b/deluge/ui/web/themes/images/access/grid/nowait.gif
new file mode 100644
index 0000000..4c5862c
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/nowait.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/page-first-disabled.gif b/deluge/ui/web/themes/images/access/grid/page-first-disabled.gif
new file mode 100644
index 0000000..e4df7a7
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/page-first-disabled.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/page-first.gif b/deluge/ui/web/themes/images/access/grid/page-first.gif
new file mode 100644
index 0000000..aa0a822
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/page-first.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/page-last-disabled.gif b/deluge/ui/web/themes/images/access/grid/page-last-disabled.gif
new file mode 100644
index 0000000..67fee75
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/page-last-disabled.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/page-last.gif b/deluge/ui/web/themes/images/access/grid/page-last.gif
new file mode 100644
index 0000000..e0cf111
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/page-last.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/page-next-disabled.gif b/deluge/ui/web/themes/images/access/grid/page-next-disabled.gif
new file mode 100644
index 0000000..e3e8e87
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/page-next-disabled.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/page-next.gif b/deluge/ui/web/themes/images/access/grid/page-next.gif
new file mode 100644
index 0000000..69899c0
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/page-next.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/page-prev-disabled.gif b/deluge/ui/web/themes/images/access/grid/page-prev-disabled.gif
new file mode 100644
index 0000000..0f94bf7
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/page-prev-disabled.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/page-prev.gif b/deluge/ui/web/themes/images/access/grid/page-prev.gif
new file mode 100644
index 0000000..289b126
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/page-prev.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/pick-button.gif b/deluge/ui/web/themes/images/access/grid/pick-button.gif
new file mode 100644
index 0000000..6957924
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/pick-button.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/refresh.gif b/deluge/ui/web/themes/images/access/grid/refresh.gif
new file mode 100644
index 0000000..8435d1e
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/refresh.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/row-check-sprite.gif b/deluge/ui/web/themes/images/access/grid/row-check-sprite.gif
new file mode 100644
index 0000000..6101164
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/row-check-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/row-expand-sprite.gif b/deluge/ui/web/themes/images/access/grid/row-expand-sprite.gif
new file mode 100644
index 0000000..6f4d874
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/row-expand-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/row-over.gif b/deluge/ui/web/themes/images/access/grid/row-over.gif
new file mode 100644
index 0000000..b288e38
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/row-over.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/row-sel.gif b/deluge/ui/web/themes/images/access/grid/row-sel.gif
new file mode 100644
index 0000000..98209e6
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/row-sel.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/sort-hd.gif b/deluge/ui/web/themes/images/access/grid/sort-hd.gif
new file mode 100644
index 0000000..681628f
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/sort-hd.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/sort_asc.gif b/deluge/ui/web/themes/images/access/grid/sort_asc.gif
new file mode 100644
index 0000000..371f5e4
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/sort_asc.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/sort_desc.gif b/deluge/ui/web/themes/images/access/grid/sort_desc.gif
new file mode 100644
index 0000000..000e363
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/sort_desc.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/grid/wait.gif b/deluge/ui/web/themes/images/access/grid/wait.gif
new file mode 100644
index 0000000..471c1a4
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/grid/wait.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/menu/checked.gif b/deluge/ui/web/themes/images/access/menu/checked.gif
new file mode 100644
index 0000000..fad5893
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/menu/checked.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/menu/group-checked.gif b/deluge/ui/web/themes/images/access/menu/group-checked.gif
new file mode 100644
index 0000000..d8b08f5
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/menu/group-checked.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/menu/item-over.gif b/deluge/ui/web/themes/images/access/menu/item-over.gif
new file mode 100644
index 0000000..0167839
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/menu/item-over.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/menu/menu-parent.gif b/deluge/ui/web/themes/images/access/menu/menu-parent.gif
new file mode 100644
index 0000000..49286cd
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/menu/menu-parent.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/menu/menu.gif b/deluge/ui/web/themes/images/access/menu/menu.gif
new file mode 100644
index 0000000..9bb3960
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/menu/menu.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/menu/unchecked.gif b/deluge/ui/web/themes/images/access/menu/unchecked.gif
new file mode 100644
index 0000000..43823e5
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/menu/unchecked.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/panel/corners-sprite.gif b/deluge/ui/web/themes/images/access/panel/corners-sprite.gif
new file mode 100644
index 0000000..43e2862
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/panel/corners-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/panel/left-right.gif b/deluge/ui/web/themes/images/access/panel/left-right.gif
new file mode 100644
index 0000000..51850b7
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/panel/left-right.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/panel/light-hd.gif b/deluge/ui/web/themes/images/access/panel/light-hd.gif
new file mode 100644
index 0000000..660bedb
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/panel/light-hd.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/panel/tool-sprite-tpl.gif b/deluge/ui/web/themes/images/access/panel/tool-sprite-tpl.gif
new file mode 100644
index 0000000..e647867
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/panel/tool-sprite-tpl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/panel/tool-sprites.gif b/deluge/ui/web/themes/images/access/panel/tool-sprites.gif
new file mode 100644
index 0000000..a3ffe58
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/panel/tool-sprites.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/panel/tools-sprites-trans.gif b/deluge/ui/web/themes/images/access/panel/tools-sprites-trans.gif
new file mode 100644
index 0000000..ead931e
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/panel/tools-sprites-trans.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/panel/top-bottom.gif b/deluge/ui/web/themes/images/access/panel/top-bottom.gif
new file mode 100644
index 0000000..6b2649d
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/panel/top-bottom.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/panel/white-corners-sprite.gif b/deluge/ui/web/themes/images/access/panel/white-corners-sprite.gif
new file mode 100644
index 0000000..22d4bba
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/panel/white-corners-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/panel/white-left-right.gif b/deluge/ui/web/themes/images/access/panel/white-left-right.gif
new file mode 100644
index 0000000..51850b7
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/panel/white-left-right.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/panel/white-top-bottom.gif b/deluge/ui/web/themes/images/access/panel/white-top-bottom.gif
new file mode 100644
index 0000000..08f8fae
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/panel/white-top-bottom.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/progress/progress-bg.gif b/deluge/ui/web/themes/images/access/progress/progress-bg.gif
new file mode 100644
index 0000000..55629b1
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/progress/progress-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/qtip/close.gif b/deluge/ui/web/themes/images/access/qtip/close.gif
new file mode 100644
index 0000000..69ab915
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/qtip/close.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/qtip/tip-anchor-sprite.gif b/deluge/ui/web/themes/images/access/qtip/tip-anchor-sprite.gif
new file mode 100644
index 0000000..f46d31d
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/qtip/tip-anchor-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/qtip/tip-sprite.gif b/deluge/ui/web/themes/images/access/qtip/tip-sprite.gif
new file mode 100644
index 0000000..9f6a629
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/qtip/tip-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/shared/glass-bg.gif b/deluge/ui/web/themes/images/access/shared/glass-bg.gif
new file mode 100644
index 0000000..ed3c886
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/shared/glass-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/shared/hd-sprite.gif b/deluge/ui/web/themes/images/access/shared/hd-sprite.gif
new file mode 100644
index 0000000..446be92
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/shared/hd-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/shared/left-btn.gif b/deluge/ui/web/themes/images/access/shared/left-btn.gif
new file mode 100644
index 0000000..0622439
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/shared/left-btn.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/shared/right-btn.gif b/deluge/ui/web/themes/images/access/shared/right-btn.gif
new file mode 100644
index 0000000..5e3215d
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/shared/right-btn.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/e-handle-dark.gif b/deluge/ui/web/themes/images/access/sizer/e-handle-dark.gif
new file mode 100644
index 0000000..70aad3f
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/e-handle-dark.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/e-handle.gif b/deluge/ui/web/themes/images/access/sizer/e-handle.gif
new file mode 100644
index 0000000..52c045e
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/e-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/ne-handle-dark.gif b/deluge/ui/web/themes/images/access/sizer/ne-handle-dark.gif
new file mode 100644
index 0000000..3a30ca2
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/ne-handle-dark.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/ne-handle.gif b/deluge/ui/web/themes/images/access/sizer/ne-handle.gif
new file mode 100644
index 0000000..e48f9f9
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/ne-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/nw-handle-dark.gif b/deluge/ui/web/themes/images/access/sizer/nw-handle-dark.gif
new file mode 100644
index 0000000..5ea8b51
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/nw-handle-dark.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/nw-handle.gif b/deluge/ui/web/themes/images/access/sizer/nw-handle.gif
new file mode 100644
index 0000000..65d5cc2
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/nw-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/s-handle-dark.gif b/deluge/ui/web/themes/images/access/sizer/s-handle-dark.gif
new file mode 100644
index 0000000..421b534
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/s-handle-dark.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/s-handle.gif b/deluge/ui/web/themes/images/access/sizer/s-handle.gif
new file mode 100644
index 0000000..2b635de
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/s-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/se-handle-dark.gif b/deluge/ui/web/themes/images/access/sizer/se-handle-dark.gif
new file mode 100644
index 0000000..881a5c4
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/se-handle-dark.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/se-handle.gif b/deluge/ui/web/themes/images/access/sizer/se-handle.gif
new file mode 100644
index 0000000..5f1e3b8
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/se-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/square.gif b/deluge/ui/web/themes/images/access/sizer/square.gif
new file mode 100644
index 0000000..4dc5a2d
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/square.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/sw-handle-dark.gif b/deluge/ui/web/themes/images/access/sizer/sw-handle-dark.gif
new file mode 100644
index 0000000..030d8f8
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/sw-handle-dark.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/sizer/sw-handle.gif b/deluge/ui/web/themes/images/access/sizer/sw-handle.gif
new file mode 100644
index 0000000..79bcb84
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/sizer/sw-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/slider/slider-bg.png b/deluge/ui/web/themes/images/access/slider/slider-bg.png
new file mode 100644
index 0000000..1ba12ad
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/slider/slider-bg.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/slider/slider-thumb.png b/deluge/ui/web/themes/images/access/slider/slider-thumb.png
new file mode 100644
index 0000000..1712edf
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/slider/slider-thumb.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/slider/slider-v-bg.png b/deluge/ui/web/themes/images/access/slider/slider-v-bg.png
new file mode 100644
index 0000000..6944f9e
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/slider/slider-v-bg.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/slider/slider-v-thumb.png b/deluge/ui/web/themes/images/access/slider/slider-v-thumb.png
new file mode 100644
index 0000000..df9cfc9
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/slider/slider-v-thumb.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tabs/scroll-left.gif b/deluge/ui/web/themes/images/access/tabs/scroll-left.gif
new file mode 100644
index 0000000..71a2e88
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tabs/scroll-left.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tabs/scroll-right.gif b/deluge/ui/web/themes/images/access/tabs/scroll-right.gif
new file mode 100644
index 0000000..8f3d659
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tabs/scroll-right.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tabs/tab-btm-inactive-left-bg.gif b/deluge/ui/web/themes/images/access/tabs/tab-btm-inactive-left-bg.gif
new file mode 100644
index 0000000..687af2b
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tabs/tab-btm-inactive-left-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tabs/tab-btm-inactive-right-bg.gif b/deluge/ui/web/themes/images/access/tabs/tab-btm-inactive-right-bg.gif
new file mode 100644
index 0000000..3c1b3eb
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tabs/tab-btm-inactive-right-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tabs/tab-btm-left-bg.gif b/deluge/ui/web/themes/images/access/tabs/tab-btm-left-bg.gif
new file mode 100644
index 0000000..e5f827a
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tabs/tab-btm-left-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tabs/tab-btm-right-bg.gif b/deluge/ui/web/themes/images/access/tabs/tab-btm-right-bg.gif
new file mode 100644
index 0000000..2551f4c
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tabs/tab-btm-right-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tabs/tab-close.gif b/deluge/ui/web/themes/images/access/tabs/tab-close.gif
new file mode 100644
index 0000000..ef9a7c2
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tabs/tab-close.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tabs/tab-strip-bg.gif b/deluge/ui/web/themes/images/access/tabs/tab-strip-bg.gif
new file mode 100644
index 0000000..fc1fdcd
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tabs/tab-strip-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tabs/tab-strip-btm-bg.gif b/deluge/ui/web/themes/images/access/tabs/tab-strip-btm-bg.gif
new file mode 100644
index 0000000..a151553
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tabs/tab-strip-btm-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tabs/tabs-sprite.gif b/deluge/ui/web/themes/images/access/tabs/tabs-sprite.gif
new file mode 100644
index 0000000..8194001
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tabs/tabs-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/toolbar/bg.gif b/deluge/ui/web/themes/images/access/toolbar/bg.gif
new file mode 100644
index 0000000..b67a54e
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/toolbar/bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/toolbar/btn-arrow-light.gif b/deluge/ui/web/themes/images/access/toolbar/btn-arrow-light.gif
new file mode 100644
index 0000000..b0e24b5
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/toolbar/btn-arrow-light.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/toolbar/btn-arrow.gif b/deluge/ui/web/themes/images/access/toolbar/btn-arrow.gif
new file mode 100644
index 0000000..8acb460
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/toolbar/btn-arrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/toolbar/btn-over-bg.gif b/deluge/ui/web/themes/images/access/toolbar/btn-over-bg.gif
new file mode 100644
index 0000000..ee2dd98
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/toolbar/btn-over-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/toolbar/gray-bg.gif b/deluge/ui/web/themes/images/access/toolbar/gray-bg.gif
new file mode 100644
index 0000000..bd49438
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/toolbar/gray-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/toolbar/more.gif b/deluge/ui/web/themes/images/access/toolbar/more.gif
new file mode 100644
index 0000000..4f01020
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/toolbar/more.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/toolbar/s-arrow-bo.gif b/deluge/ui/web/themes/images/access/toolbar/s-arrow-bo.gif
new file mode 100644
index 0000000..1505edd
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/toolbar/s-arrow-bo.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/toolbar/tb-btn-sprite.gif b/deluge/ui/web/themes/images/access/toolbar/tb-btn-sprite.gif
new file mode 100644
index 0000000..19bbef3
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/toolbar/tb-btn-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/toolbar/tb-xl-btn-sprite.gif b/deluge/ui/web/themes/images/access/toolbar/tb-xl-btn-sprite.gif
new file mode 100644
index 0000000..1bc0420
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/toolbar/tb-xl-btn-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/toolbar/tb-xl-sep.gif b/deluge/ui/web/themes/images/access/toolbar/tb-xl-sep.gif
new file mode 100644
index 0000000..30555ee
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/toolbar/tb-xl-sep.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/arrows.gif b/deluge/ui/web/themes/images/access/tree/arrows.gif
new file mode 100644
index 0000000..2e635eb
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/arrows.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/drop-add.gif b/deluge/ui/web/themes/images/access/tree/drop-add.gif
new file mode 100644
index 0000000..b22cd14
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/drop-add.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/drop-between.gif b/deluge/ui/web/themes/images/access/tree/drop-between.gif
new file mode 100644
index 0000000..5c6c09d
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/drop-between.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/drop-no.gif b/deluge/ui/web/themes/images/access/tree/drop-no.gif
new file mode 100644
index 0000000..9d9c6a9
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/drop-no.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/drop-over.gif b/deluge/ui/web/themes/images/access/tree/drop-over.gif
new file mode 100644
index 0000000..30d1ca7
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/drop-over.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/drop-under.gif b/deluge/ui/web/themes/images/access/tree/drop-under.gif
new file mode 100644
index 0000000..85f66b1
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/drop-under.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/drop-yes.gif b/deluge/ui/web/themes/images/access/tree/drop-yes.gif
new file mode 100644
index 0000000..8aacb30
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/drop-yes.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/elbow-end-minus-nl.gif b/deluge/ui/web/themes/images/access/tree/elbow-end-minus-nl.gif
new file mode 100644
index 0000000..b4ae595
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/elbow-end-minus-nl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/elbow-end-minus.gif b/deluge/ui/web/themes/images/access/tree/elbow-end-minus.gif
new file mode 100644
index 0000000..514cf3e
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/elbow-end-minus.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/elbow-end-plus-nl.gif b/deluge/ui/web/themes/images/access/tree/elbow-end-plus-nl.gif
new file mode 100644
index 0000000..6af2e29
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/elbow-end-plus-nl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/elbow-end-plus.gif b/deluge/ui/web/themes/images/access/tree/elbow-end-plus.gif
new file mode 100644
index 0000000..96df679
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/elbow-end-plus.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/elbow-end.gif b/deluge/ui/web/themes/images/access/tree/elbow-end.gif
new file mode 100644
index 0000000..f24ddee
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/elbow-end.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/elbow-line.gif b/deluge/ui/web/themes/images/access/tree/elbow-line.gif
new file mode 100644
index 0000000..75e6da4
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/elbow-line.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/elbow-minus-nl.gif b/deluge/ui/web/themes/images/access/tree/elbow-minus-nl.gif
new file mode 100644
index 0000000..b4ae595
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/elbow-minus-nl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/elbow-minus.gif b/deluge/ui/web/themes/images/access/tree/elbow-minus.gif
new file mode 100644
index 0000000..68ba298
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/elbow-minus.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/elbow-plus-nl.gif b/deluge/ui/web/themes/images/access/tree/elbow-plus-nl.gif
new file mode 100644
index 0000000..6af2e29
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/elbow-plus-nl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/elbow-plus.gif b/deluge/ui/web/themes/images/access/tree/elbow-plus.gif
new file mode 100644
index 0000000..58ba9e4
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/elbow-plus.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/elbow.gif b/deluge/ui/web/themes/images/access/tree/elbow.gif
new file mode 100644
index 0000000..b8f4208
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/elbow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/folder-open.gif b/deluge/ui/web/themes/images/access/tree/folder-open.gif
new file mode 100644
index 0000000..7c52965
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/folder-open.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/folder.gif b/deluge/ui/web/themes/images/access/tree/folder.gif
new file mode 100644
index 0000000..501e75c
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/folder.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/leaf.gif b/deluge/ui/web/themes/images/access/tree/leaf.gif
new file mode 100644
index 0000000..445769d
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/leaf.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/loading.gif b/deluge/ui/web/themes/images/access/tree/loading.gif
new file mode 100644
index 0000000..e846e1d
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/loading.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/tree/s.gif b/deluge/ui/web/themes/images/access/tree/s.gif
new file mode 100644
index 0000000..1d11fa9
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/tree/s.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/window/icon-error.gif b/deluge/ui/web/themes/images/access/window/icon-error.gif
new file mode 100644
index 0000000..05c713c
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/window/icon-error.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/window/icon-info.gif b/deluge/ui/web/themes/images/access/window/icon-info.gif
new file mode 100644
index 0000000..adc0613
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/window/icon-info.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/window/icon-question.gif b/deluge/ui/web/themes/images/access/window/icon-question.gif
new file mode 100644
index 0000000..9b31a94
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/window/icon-question.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/window/icon-warning.gif b/deluge/ui/web/themes/images/access/window/icon-warning.gif
new file mode 100644
index 0000000..0d89077
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/window/icon-warning.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/window/left-corners.png b/deluge/ui/web/themes/images/access/window/left-corners.png
new file mode 100644
index 0000000..f9a6463
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/window/left-corners.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/window/left-right.png b/deluge/ui/web/themes/images/access/window/left-right.png
new file mode 100644
index 0000000..7721193
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/window/left-right.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/window/right-corners.png b/deluge/ui/web/themes/images/access/window/right-corners.png
new file mode 100644
index 0000000..1111bb4
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/window/right-corners.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/access/window/top-bottom.png b/deluge/ui/web/themes/images/access/window/top-bottom.png
new file mode 100644
index 0000000..179747b
--- /dev/null
+++ b/deluge/ui/web/themes/images/access/window/top-bottom.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/box/corners-blue.gif b/deluge/ui/web/themes/images/default/box/corners-blue.gif
new file mode 100644
index 0000000..fa419b5
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/box/corners-blue.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/box/corners.gif b/deluge/ui/web/themes/images/default/box/corners.gif
new file mode 100644
index 0000000..8aa8cae
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/box/corners.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/box/l-blue.gif b/deluge/ui/web/themes/images/default/box/l-blue.gif
new file mode 100644
index 0000000..5ed7f00
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/box/l-blue.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/box/l.gif b/deluge/ui/web/themes/images/default/box/l.gif
new file mode 100644
index 0000000..0160f97
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/box/l.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/box/r-blue.gif b/deluge/ui/web/themes/images/default/box/r-blue.gif
new file mode 100644
index 0000000..3ea5cae
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/box/r-blue.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/box/r.gif b/deluge/ui/web/themes/images/default/box/r.gif
new file mode 100644
index 0000000..34237f6
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/box/r.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/box/tb-blue.gif b/deluge/ui/web/themes/images/default/box/tb-blue.gif
new file mode 100644
index 0000000..562fecc
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/box/tb-blue.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/box/tb.gif b/deluge/ui/web/themes/images/default/box/tb.gif
new file mode 100644
index 0000000..435889b
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/box/tb.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/button/arrow.gif b/deluge/ui/web/themes/images/default/button/arrow.gif
new file mode 100644
index 0000000..3ab4f71
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/button/arrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/button/btn.gif b/deluge/ui/web/themes/images/default/button/btn.gif
new file mode 100644
index 0000000..06b404d
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/button/btn.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/button/group-cs.gif b/deluge/ui/web/themes/images/default/button/group-cs.gif
new file mode 100644
index 0000000..3d1dca8
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/button/group-cs.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/button/group-lr.gif b/deluge/ui/web/themes/images/default/button/group-lr.gif
new file mode 100644
index 0000000..7c549f9
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/button/group-lr.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/button/group-tb.gif b/deluge/ui/web/themes/images/default/button/group-tb.gif
new file mode 100644
index 0000000..adeb0a4
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/button/group-tb.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/button/s-arrow-b-noline.gif b/deluge/ui/web/themes/images/default/button/s-arrow-b-noline.gif
new file mode 100644
index 0000000..a4220ee
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/button/s-arrow-b-noline.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/button/s-arrow-b.gif b/deluge/ui/web/themes/images/default/button/s-arrow-b.gif
new file mode 100644
index 0000000..84b6470
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/button/s-arrow-b.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/button/s-arrow-bo.gif b/deluge/ui/web/themes/images/default/button/s-arrow-bo.gif
new file mode 100644
index 0000000..548700b
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/button/s-arrow-bo.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/button/s-arrow-noline.gif b/deluge/ui/web/themes/images/default/button/s-arrow-noline.gif
new file mode 100644
index 0000000..0953eab
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/button/s-arrow-noline.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/button/s-arrow-o.gif b/deluge/ui/web/themes/images/default/button/s-arrow-o.gif
new file mode 100644
index 0000000..89c70f3
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/button/s-arrow-o.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/button/s-arrow.gif b/deluge/ui/web/themes/images/default/button/s-arrow.gif
new file mode 100644
index 0000000..8940774
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/button/s-arrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/dd/drop-add.gif b/deluge/ui/web/themes/images/default/dd/drop-add.gif
new file mode 100644
index 0000000..b22cd14
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/dd/drop-add.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/dd/drop-no.gif b/deluge/ui/web/themes/images/default/dd/drop-no.gif
new file mode 100644
index 0000000..08d0833
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/dd/drop-no.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/dd/drop-yes.gif b/deluge/ui/web/themes/images/default/dd/drop-yes.gif
new file mode 100644
index 0000000..8aacb30
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/dd/drop-yes.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/editor/tb-sprite.gif b/deluge/ui/web/themes/images/default/editor/tb-sprite.gif
new file mode 100644
index 0000000..fb70577
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/editor/tb-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/checkbox.gif b/deluge/ui/web/themes/images/default/form/checkbox.gif
new file mode 100644
index 0000000..835b346
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/checkbox.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/clear-trigger.gif b/deluge/ui/web/themes/images/default/form/clear-trigger.gif
new file mode 100644
index 0000000..da78d45
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/clear-trigger.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/clear-trigger.psd b/deluge/ui/web/themes/images/default/form/clear-trigger.psd
new file mode 100644
index 0000000..f637fa5
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/clear-trigger.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/date-trigger.gif b/deluge/ui/web/themes/images/default/form/date-trigger.gif
new file mode 100644
index 0000000..25ef7b3
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/date-trigger.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/date-trigger.psd b/deluge/ui/web/themes/images/default/form/date-trigger.psd
new file mode 100644
index 0000000..74883b2
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/date-trigger.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/error-tip-corners.gif b/deluge/ui/web/themes/images/default/form/error-tip-corners.gif
new file mode 100644
index 0000000..6ea4c38
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/error-tip-corners.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/exclamation.gif b/deluge/ui/web/themes/images/default/form/exclamation.gif
new file mode 100644
index 0000000..ea31a30
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/exclamation.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/radio.gif b/deluge/ui/web/themes/images/default/form/radio.gif
new file mode 100644
index 0000000..36bb91d
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/radio.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/search-trigger.gif b/deluge/ui/web/themes/images/default/form/search-trigger.gif
new file mode 100644
index 0000000..db8802b
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/search-trigger.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/search-trigger.psd b/deluge/ui/web/themes/images/default/form/search-trigger.psd
new file mode 100644
index 0000000..b11f273
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/search-trigger.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/text-bg.gif b/deluge/ui/web/themes/images/default/form/text-bg.gif
new file mode 100644
index 0000000..4179607
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/text-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/trigger-square.gif b/deluge/ui/web/themes/images/default/form/trigger-square.gif
new file mode 100644
index 0000000..3004ec5
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/trigger-square.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/trigger-square.psd b/deluge/ui/web/themes/images/default/form/trigger-square.psd
new file mode 100644
index 0000000..e922ee6
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/trigger-square.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/trigger-tpl.gif b/deluge/ui/web/themes/images/default/form/trigger-tpl.gif
new file mode 100644
index 0000000..e3701a3
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/trigger-tpl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/trigger.gif b/deluge/ui/web/themes/images/default/form/trigger.gif
new file mode 100644
index 0000000..f6cba37
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/trigger.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/form/trigger.psd b/deluge/ui/web/themes/images/default/form/trigger.psd
new file mode 100644
index 0000000..344c768
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/form/trigger.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/gradient-bg.gif b/deluge/ui/web/themes/images/default/gradient-bg.gif
new file mode 100644
index 0000000..8134e49
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/gradient-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/arrow-left-white.gif b/deluge/ui/web/themes/images/default/grid/arrow-left-white.gif
new file mode 100644
index 0000000..63088f5
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/arrow-left-white.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/arrow-right-white.gif b/deluge/ui/web/themes/images/default/grid/arrow-right-white.gif
new file mode 100644
index 0000000..e9e0678
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/arrow-right-white.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/col-move-bottom.gif b/deluge/ui/web/themes/images/default/grid/col-move-bottom.gif
new file mode 100644
index 0000000..cc1e473
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/col-move-bottom.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/col-move-top.gif b/deluge/ui/web/themes/images/default/grid/col-move-top.gif
new file mode 100644
index 0000000..58ff32c
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/col-move-top.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/columns.gif b/deluge/ui/web/themes/images/default/grid/columns.gif
new file mode 100644
index 0000000..2d3a823
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/columns.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/dirty.gif b/deluge/ui/web/themes/images/default/grid/dirty.gif
new file mode 100644
index 0000000..4f217a4
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/dirty.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/done.gif b/deluge/ui/web/themes/images/default/grid/done.gif
new file mode 100644
index 0000000..a937cb2
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/done.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/drop-no.gif b/deluge/ui/web/themes/images/default/grid/drop-no.gif
new file mode 100644
index 0000000..31a332b
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/drop-no.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/drop-yes.gif b/deluge/ui/web/themes/images/default/grid/drop-yes.gif
new file mode 100644
index 0000000..926010e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/drop-yes.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/footer-bg.gif b/deluge/ui/web/themes/images/default/grid/footer-bg.gif
new file mode 100644
index 0000000..126120f
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/footer-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/grid-blue-hd.gif b/deluge/ui/web/themes/images/default/grid/grid-blue-hd.gif
new file mode 100644
index 0000000..862094e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/grid-blue-hd.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/grid-blue-split.gif b/deluge/ui/web/themes/images/default/grid/grid-blue-split.gif
new file mode 100644
index 0000000..5286f58
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/grid-blue-split.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/grid-hrow.gif b/deluge/ui/web/themes/images/default/grid/grid-hrow.gif
new file mode 100644
index 0000000..6374104
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/grid-hrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/grid-loading.gif b/deluge/ui/web/themes/images/default/grid/grid-loading.gif
new file mode 100644
index 0000000..d112c54
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/grid-loading.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/grid-split.gif b/deluge/ui/web/themes/images/default/grid/grid-split.gif
new file mode 100644
index 0000000..c76a16e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/grid-split.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/grid-vista-hd.gif b/deluge/ui/web/themes/images/default/grid/grid-vista-hd.gif
new file mode 100644
index 0000000..d097263
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/grid-vista-hd.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/grid3-hd-btn.gif b/deluge/ui/web/themes/images/default/grid/grid3-hd-btn.gif
new file mode 100644
index 0000000..2112607
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/grid3-hd-btn.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/grid3-hrow-over.gif b/deluge/ui/web/themes/images/default/grid/grid3-hrow-over.gif
new file mode 100644
index 0000000..f9c07af
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/grid3-hrow-over.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/grid3-hrow.gif b/deluge/ui/web/themes/images/default/grid/grid3-hrow.gif
new file mode 100644
index 0000000..8d459a3
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/grid3-hrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/grid3-rowheader.gif b/deluge/ui/web/themes/images/default/grid/grid3-rowheader.gif
new file mode 100644
index 0000000..2799b45
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/grid3-rowheader.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/grid3-special-col-bg.gif b/deluge/ui/web/themes/images/default/grid/grid3-special-col-bg.gif
new file mode 100644
index 0000000..0b4d6ca
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/grid3-special-col-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/grid3-special-col-sel-bg.gif b/deluge/ui/web/themes/images/default/grid/grid3-special-col-sel-bg.gif
new file mode 100644
index 0000000..1dfe9a6
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/grid3-special-col-sel-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/group-by.gif b/deluge/ui/web/themes/images/default/grid/group-by.gif
new file mode 100644
index 0000000..d6075bb
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/group-by.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/group-collapse.gif b/deluge/ui/web/themes/images/default/grid/group-collapse.gif
new file mode 100644
index 0000000..495bb05
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/group-collapse.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/group-expand-sprite.gif b/deluge/ui/web/themes/images/default/grid/group-expand-sprite.gif
new file mode 100644
index 0000000..9c1653b
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/group-expand-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/group-expand.gif b/deluge/ui/web/themes/images/default/grid/group-expand.gif
new file mode 100644
index 0000000..a33ac30
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/group-expand.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/hd-pop.gif b/deluge/ui/web/themes/images/default/grid/hd-pop.gif
new file mode 100644
index 0000000..eb8ba79
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/hd-pop.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/hmenu-asc.gif b/deluge/ui/web/themes/images/default/grid/hmenu-asc.gif
new file mode 100644
index 0000000..8917e0e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/hmenu-asc.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/hmenu-desc.gif b/deluge/ui/web/themes/images/default/grid/hmenu-desc.gif
new file mode 100644
index 0000000..f26b7c2
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/hmenu-desc.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/hmenu-lock.gif b/deluge/ui/web/themes/images/default/grid/hmenu-lock.gif
new file mode 100644
index 0000000..1596126
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/hmenu-lock.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/hmenu-lock.png b/deluge/ui/web/themes/images/default/grid/hmenu-lock.png
new file mode 100644
index 0000000..5d33c09
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/hmenu-lock.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/hmenu-unlock.gif b/deluge/ui/web/themes/images/default/grid/hmenu-unlock.gif
new file mode 100644
index 0000000..af59cf9
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/hmenu-unlock.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/hmenu-unlock.png b/deluge/ui/web/themes/images/default/grid/hmenu-unlock.png
new file mode 100644
index 0000000..0371ca4
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/hmenu-unlock.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/invalid_line.gif b/deluge/ui/web/themes/images/default/grid/invalid_line.gif
new file mode 100644
index 0000000..fb7e0f3
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/invalid_line.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/loading.gif b/deluge/ui/web/themes/images/default/grid/loading.gif
new file mode 100644
index 0000000..e846e1d
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/loading.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/mso-hd.gif b/deluge/ui/web/themes/images/default/grid/mso-hd.gif
new file mode 100644
index 0000000..669f3cf
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/mso-hd.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/nowait.gif b/deluge/ui/web/themes/images/default/grid/nowait.gif
new file mode 100644
index 0000000..4c5862c
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/nowait.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/page-first-disabled.gif b/deluge/ui/web/themes/images/default/grid/page-first-disabled.gif
new file mode 100644
index 0000000..1e02c41
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/page-first-disabled.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/page-first.gif b/deluge/ui/web/themes/images/default/grid/page-first.gif
new file mode 100644
index 0000000..d84f41a
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/page-first.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/page-last-disabled.gif b/deluge/ui/web/themes/images/default/grid/page-last-disabled.gif
new file mode 100644
index 0000000..8697067
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/page-last-disabled.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/page-last.gif b/deluge/ui/web/themes/images/default/grid/page-last.gif
new file mode 100644
index 0000000..3df5c2b
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/page-last.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/page-next-disabled.gif b/deluge/ui/web/themes/images/default/grid/page-next-disabled.gif
new file mode 100644
index 0000000..90a7756
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/page-next-disabled.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/page-next.gif b/deluge/ui/web/themes/images/default/grid/page-next.gif
new file mode 100644
index 0000000..9601635
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/page-next.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/page-prev-disabled.gif b/deluge/ui/web/themes/images/default/grid/page-prev-disabled.gif
new file mode 100644
index 0000000..37154d6
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/page-prev-disabled.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/page-prev.gif b/deluge/ui/web/themes/images/default/grid/page-prev.gif
new file mode 100644
index 0000000..eb70cf8
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/page-prev.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/pick-button.gif b/deluge/ui/web/themes/images/default/grid/pick-button.gif
new file mode 100644
index 0000000..6957924
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/pick-button.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/refresh-disabled.gif b/deluge/ui/web/themes/images/default/grid/refresh-disabled.gif
new file mode 100644
index 0000000..607800b
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/refresh-disabled.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/refresh.gif b/deluge/ui/web/themes/images/default/grid/refresh.gif
new file mode 100644
index 0000000..110f684
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/refresh.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/row-check-sprite.gif b/deluge/ui/web/themes/images/default/grid/row-check-sprite.gif
new file mode 100644
index 0000000..6101164
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/row-check-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/row-expand-sprite.gif b/deluge/ui/web/themes/images/default/grid/row-expand-sprite.gif
new file mode 100644
index 0000000..6f4d874
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/row-expand-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/row-over.gif b/deluge/ui/web/themes/images/default/grid/row-over.gif
new file mode 100644
index 0000000..b288e38
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/row-over.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/row-sel.gif b/deluge/ui/web/themes/images/default/grid/row-sel.gif
new file mode 100644
index 0000000..98209e6
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/row-sel.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/sort-hd.gif b/deluge/ui/web/themes/images/default/grid/sort-hd.gif
new file mode 100644
index 0000000..45e545f
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/sort-hd.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/sort_asc.gif b/deluge/ui/web/themes/images/default/grid/sort_asc.gif
new file mode 100644
index 0000000..67a2a4c
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/sort_asc.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/sort_desc.gif b/deluge/ui/web/themes/images/default/grid/sort_desc.gif
new file mode 100644
index 0000000..34db47c
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/sort_desc.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/grid/wait.gif b/deluge/ui/web/themes/images/default/grid/wait.gif
new file mode 100644
index 0000000..471c1a4
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/grid/wait.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/collapse.gif b/deluge/ui/web/themes/images/default/layout/collapse.gif
new file mode 100644
index 0000000..d87b0a9
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/collapse.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/expand.gif b/deluge/ui/web/themes/images/default/layout/expand.gif
new file mode 100644
index 0000000..7b6e1c1
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/expand.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/gradient-bg.gif b/deluge/ui/web/themes/images/default/layout/gradient-bg.gif
new file mode 100644
index 0000000..8134e49
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/gradient-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/mini-bottom.gif b/deluge/ui/web/themes/images/default/layout/mini-bottom.gif
new file mode 100644
index 0000000..c18f9e3
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/mini-bottom.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/mini-left.gif b/deluge/ui/web/themes/images/default/layout/mini-left.gif
new file mode 100644
index 0000000..99f7993
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/mini-left.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/mini-right.gif b/deluge/ui/web/themes/images/default/layout/mini-right.gif
new file mode 100644
index 0000000..5b13c5a
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/mini-right.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/mini-top.gif b/deluge/ui/web/themes/images/default/layout/mini-top.gif
new file mode 100644
index 0000000..a4ca2bb
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/mini-top.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/ns-collapse.gif b/deluge/ui/web/themes/images/default/layout/ns-collapse.gif
new file mode 100644
index 0000000..df2a77e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/ns-collapse.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/ns-expand.gif b/deluge/ui/web/themes/images/default/layout/ns-expand.gif
new file mode 100644
index 0000000..77ab9da
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/ns-expand.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/panel-close.gif b/deluge/ui/web/themes/images/default/layout/panel-close.gif
new file mode 100644
index 0000000..2bdd623
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/panel-close.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/panel-title-bg.gif b/deluge/ui/web/themes/images/default/layout/panel-title-bg.gif
new file mode 100644
index 0000000..d1daef5
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/panel-title-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/panel-title-light-bg.gif b/deluge/ui/web/themes/images/default/layout/panel-title-light-bg.gif
new file mode 100644
index 0000000..8c2c83d
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/panel-title-light-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/stick.gif b/deluge/ui/web/themes/images/default/layout/stick.gif
new file mode 100644
index 0000000..5a1e8ba
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/stick.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/stuck.gif b/deluge/ui/web/themes/images/default/layout/stuck.gif
new file mode 100644
index 0000000..0a8de4d
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/stuck.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/tab-close-on.gif b/deluge/ui/web/themes/images/default/layout/tab-close-on.gif
new file mode 100644
index 0000000..eacea39
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/tab-close-on.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/layout/tab-close.gif b/deluge/ui/web/themes/images/default/layout/tab-close.gif
new file mode 100644
index 0000000..45db61e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/layout/tab-close.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/menu/checked.gif b/deluge/ui/web/themes/images/default/menu/checked.gif
new file mode 100644
index 0000000..fad5893
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/menu/checked.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/menu/group-checked.gif b/deluge/ui/web/themes/images/default/menu/group-checked.gif
new file mode 100644
index 0000000..d30b3e5
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/menu/group-checked.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/menu/item-over.gif b/deluge/ui/web/themes/images/default/menu/item-over.gif
new file mode 100644
index 0000000..0167839
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/menu/item-over.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/menu/menu-parent.gif b/deluge/ui/web/themes/images/default/menu/menu-parent.gif
new file mode 100644
index 0000000..1e37562
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/menu/menu-parent.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/menu/menu.gif b/deluge/ui/web/themes/images/default/menu/menu.gif
new file mode 100644
index 0000000..30a2c4b
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/menu/menu.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/menu/unchecked.gif b/deluge/ui/web/themes/images/default/menu/unchecked.gif
new file mode 100644
index 0000000..43823e5
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/menu/unchecked.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/panel/corners-sprite.gif b/deluge/ui/web/themes/images/default/panel/corners-sprite.gif
new file mode 100644
index 0000000..aa0d0ed
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/panel/corners-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/panel/left-right.gif b/deluge/ui/web/themes/images/default/panel/left-right.gif
new file mode 100644
index 0000000..9fae2d5
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/panel/left-right.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/panel/light-hd.gif b/deluge/ui/web/themes/images/default/panel/light-hd.gif
new file mode 100644
index 0000000..58d6747
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/panel/light-hd.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/panel/tool-sprite-tpl.gif b/deluge/ui/web/themes/images/default/panel/tool-sprite-tpl.gif
new file mode 100644
index 0000000..e647867
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/panel/tool-sprite-tpl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/panel/tool-sprites.gif b/deluge/ui/web/themes/images/default/panel/tool-sprites.gif
new file mode 100644
index 0000000..2b6b809
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/panel/tool-sprites.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/panel/tools-sprites-trans.gif b/deluge/ui/web/themes/images/default/panel/tools-sprites-trans.gif
new file mode 100644
index 0000000..ead931e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/panel/tools-sprites-trans.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/panel/top-bottom.gif b/deluge/ui/web/themes/images/default/panel/top-bottom.gif
new file mode 100644
index 0000000..be6c50e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/panel/top-bottom.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/panel/top-bottom.png b/deluge/ui/web/themes/images/default/panel/top-bottom.png
new file mode 100644
index 0000000..6df5f68
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/panel/top-bottom.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/panel/white-corners-sprite.gif b/deluge/ui/web/themes/images/default/panel/white-corners-sprite.gif
new file mode 100644
index 0000000..22d4bba
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/panel/white-corners-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/panel/white-left-right.gif b/deluge/ui/web/themes/images/default/panel/white-left-right.gif
new file mode 100644
index 0000000..d82c337
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/panel/white-left-right.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/panel/white-top-bottom.gif b/deluge/ui/web/themes/images/default/panel/white-top-bottom.gif
new file mode 100644
index 0000000..fe7dd1c
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/panel/white-top-bottom.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/progress/progress-bg.gif b/deluge/ui/web/themes/images/default/progress/progress-bg.gif
new file mode 100644
index 0000000..1c1abeb
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/progress/progress-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/qtip/bg.gif b/deluge/ui/web/themes/images/default/qtip/bg.gif
new file mode 100644
index 0000000..43488af
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/qtip/bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/qtip/close.gif b/deluge/ui/web/themes/images/default/qtip/close.gif
new file mode 100644
index 0000000..69ab915
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/qtip/close.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/qtip/tip-anchor-sprite.gif b/deluge/ui/web/themes/images/default/qtip/tip-anchor-sprite.gif
new file mode 100644
index 0000000..9cf4850
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/qtip/tip-anchor-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/qtip/tip-sprite.gif b/deluge/ui/web/themes/images/default/qtip/tip-sprite.gif
new file mode 100644
index 0000000..9810aca
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/qtip/tip-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/s.gif b/deluge/ui/web/themes/images/default/s.gif
new file mode 100644
index 0000000..1d11fa9
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/s.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/shadow-c.png b/deluge/ui/web/themes/images/default/shadow-c.png
new file mode 100644
index 0000000..35891d3
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/shadow-c.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/shadow-lr.png b/deluge/ui/web/themes/images/default/shadow-lr.png
new file mode 100644
index 0000000..e59a9d7
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/shadow-lr.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/shadow.png b/deluge/ui/web/themes/images/default/shadow.png
new file mode 100644
index 0000000..87dcc6e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/shadow.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/shared/blue-loading.gif b/deluge/ui/web/themes/images/default/shared/blue-loading.gif
new file mode 100644
index 0000000..3bbf639
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/shared/blue-loading.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/shared/calendar.gif b/deluge/ui/web/themes/images/default/shared/calendar.gif
new file mode 100644
index 0000000..133cf23
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/shared/calendar.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/shared/glass-bg.gif b/deluge/ui/web/themes/images/default/shared/glass-bg.gif
new file mode 100644
index 0000000..26fbbae
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/shared/glass-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/shared/hd-sprite.gif b/deluge/ui/web/themes/images/default/shared/hd-sprite.gif
new file mode 100644
index 0000000..42da1ea
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/shared/hd-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/shared/large-loading.gif b/deluge/ui/web/themes/images/default/shared/large-loading.gif
new file mode 100644
index 0000000..b36b555
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/shared/large-loading.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/shared/left-btn.gif b/deluge/ui/web/themes/images/default/shared/left-btn.gif
new file mode 100644
index 0000000..a0ddd9e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/shared/left-btn.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/shared/loading-balls.gif b/deluge/ui/web/themes/images/default/shared/loading-balls.gif
new file mode 100644
index 0000000..9ce214b
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/shared/loading-balls.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/shared/right-btn.gif b/deluge/ui/web/themes/images/default/shared/right-btn.gif
new file mode 100644
index 0000000..dee63e2
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/shared/right-btn.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/shared/warning.gif b/deluge/ui/web/themes/images/default/shared/warning.gif
new file mode 100644
index 0000000..806d4bc
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/shared/warning.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/e-handle-dark.gif b/deluge/ui/web/themes/images/default/sizer/e-handle-dark.gif
new file mode 100644
index 0000000..b5486c1
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/e-handle-dark.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/e-handle.gif b/deluge/ui/web/themes/images/default/sizer/e-handle.gif
new file mode 100644
index 0000000..00ba835
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/e-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/ne-handle-dark.gif b/deluge/ui/web/themes/images/default/sizer/ne-handle-dark.gif
new file mode 100644
index 0000000..04e5ecf
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/ne-handle-dark.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/ne-handle.gif b/deluge/ui/web/themes/images/default/sizer/ne-handle.gif
new file mode 100644
index 0000000..09405c7
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/ne-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/nw-handle-dark.gif b/deluge/ui/web/themes/images/default/sizer/nw-handle-dark.gif
new file mode 100644
index 0000000..6e49d69
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/nw-handle-dark.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/nw-handle.gif b/deluge/ui/web/themes/images/default/sizer/nw-handle.gif
new file mode 100644
index 0000000..2fcea8a
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/nw-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/s-handle-dark.gif b/deluge/ui/web/themes/images/default/sizer/s-handle-dark.gif
new file mode 100644
index 0000000..4eb5f0f
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/s-handle-dark.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/s-handle.gif b/deluge/ui/web/themes/images/default/sizer/s-handle.gif
new file mode 100644
index 0000000..bf069c2
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/s-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/se-handle-dark.gif b/deluge/ui/web/themes/images/default/sizer/se-handle-dark.gif
new file mode 100644
index 0000000..c4c1087
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/se-handle-dark.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/se-handle.gif b/deluge/ui/web/themes/images/default/sizer/se-handle.gif
new file mode 100644
index 0000000..972055e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/se-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/square.gif b/deluge/ui/web/themes/images/default/sizer/square.gif
new file mode 100644
index 0000000..14ce6f7
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/square.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/sw-handle-dark.gif b/deluge/ui/web/themes/images/default/sizer/sw-handle-dark.gif
new file mode 100644
index 0000000..77224b0
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/sw-handle-dark.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/sizer/sw-handle.gif b/deluge/ui/web/themes/images/default/sizer/sw-handle.gif
new file mode 100644
index 0000000..3ca0ed9
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/sizer/sw-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/slider/slider-bg.png b/deluge/ui/web/themes/images/default/slider/slider-bg.png
new file mode 100644
index 0000000..6825d73
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/slider/slider-bg.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/slider/slider-thumb.png b/deluge/ui/web/themes/images/default/slider/slider-thumb.png
new file mode 100644
index 0000000..d16ed52
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/slider/slider-thumb.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/slider/slider-v-bg.png b/deluge/ui/web/themes/images/default/slider/slider-v-bg.png
new file mode 100644
index 0000000..1ebe8ef
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/slider/slider-v-bg.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/slider/slider-v-thumb.png b/deluge/ui/web/themes/images/default/slider/slider-v-thumb.png
new file mode 100644
index 0000000..cc86cb7
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/slider/slider-v-thumb.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/scroll-left.gif b/deluge/ui/web/themes/images/default/tabs/scroll-left.gif
new file mode 100644
index 0000000..9f2f6d1
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/scroll-left.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/scroll-right.gif b/deluge/ui/web/themes/images/default/tabs/scroll-right.gif
new file mode 100644
index 0000000..4c5e7e3
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/scroll-right.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/scroller-bg.gif b/deluge/ui/web/themes/images/default/tabs/scroller-bg.gif
new file mode 100644
index 0000000..099b90d
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/scroller-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/tab-btm-inactive-left-bg.gif b/deluge/ui/web/themes/images/default/tabs/tab-btm-inactive-left-bg.gif
new file mode 100644
index 0000000..188bf94
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/tab-btm-inactive-left-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/tab-btm-inactive-right-bg.gif b/deluge/ui/web/themes/images/default/tabs/tab-btm-inactive-right-bg.gif
new file mode 100644
index 0000000..e1f5e3c
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/tab-btm-inactive-right-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/tab-btm-left-bg.gif b/deluge/ui/web/themes/images/default/tabs/tab-btm-left-bg.gif
new file mode 100644
index 0000000..dde7968
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/tab-btm-left-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/tab-btm-over-left-bg.gif b/deluge/ui/web/themes/images/default/tabs/tab-btm-over-left-bg.gif
new file mode 100644
index 0000000..da49c10
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/tab-btm-over-left-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/tab-btm-over-right-bg.gif b/deluge/ui/web/themes/images/default/tabs/tab-btm-over-right-bg.gif
new file mode 100644
index 0000000..45346ab
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/tab-btm-over-right-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/tab-btm-right-bg.gif b/deluge/ui/web/themes/images/default/tabs/tab-btm-right-bg.gif
new file mode 100644
index 0000000..e695186
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/tab-btm-right-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/tab-close.gif b/deluge/ui/web/themes/images/default/tabs/tab-close.gif
new file mode 100644
index 0000000..e699878
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/tab-close.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/tab-strip-bg.gif b/deluge/ui/web/themes/images/default/tabs/tab-strip-bg.gif
new file mode 100644
index 0000000..34f1333
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/tab-strip-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/tab-strip-bg.png b/deluge/ui/web/themes/images/default/tabs/tab-strip-bg.png
new file mode 100644
index 0000000..fed48eb
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/tab-strip-bg.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/tab-strip-btm-bg.gif b/deluge/ui/web/themes/images/default/tabs/tab-strip-btm-bg.gif
new file mode 100644
index 0000000..5eaba1e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/tab-strip-btm-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tabs/tabs-sprite.gif b/deluge/ui/web/themes/images/default/tabs/tabs-sprite.gif
new file mode 100644
index 0000000..e969fb0
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tabs/tabs-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/toolbar/bg.gif b/deluge/ui/web/themes/images/default/toolbar/bg.gif
new file mode 100644
index 0000000..0b085bf
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/toolbar/bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/toolbar/btn-arrow-light.gif b/deluge/ui/web/themes/images/default/toolbar/btn-arrow-light.gif
new file mode 100644
index 0000000..b0e24b5
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/toolbar/btn-arrow-light.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/toolbar/btn-arrow.gif b/deluge/ui/web/themes/images/default/toolbar/btn-arrow.gif
new file mode 100644
index 0000000..8acb460
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/toolbar/btn-arrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/toolbar/btn-over-bg.gif b/deluge/ui/web/themes/images/default/toolbar/btn-over-bg.gif
new file mode 100644
index 0000000..ee2dd98
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/toolbar/btn-over-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/toolbar/gray-bg.gif b/deluge/ui/web/themes/images/default/toolbar/gray-bg.gif
new file mode 100644
index 0000000..bd49438
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/toolbar/gray-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/toolbar/more.gif b/deluge/ui/web/themes/images/default/toolbar/more.gif
new file mode 100644
index 0000000..02c2509
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/toolbar/more.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/toolbar/tb-bg.gif b/deluge/ui/web/themes/images/default/toolbar/tb-bg.gif
new file mode 100644
index 0000000..4969e4e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/toolbar/tb-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/toolbar/tb-btn-sprite.gif b/deluge/ui/web/themes/images/default/toolbar/tb-btn-sprite.gif
new file mode 100644
index 0000000..19bbef3
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/toolbar/tb-btn-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/toolbar/tb-xl-btn-sprite.gif b/deluge/ui/web/themes/images/default/toolbar/tb-xl-btn-sprite.gif
new file mode 100644
index 0000000..1bc0420
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/toolbar/tb-xl-btn-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/toolbar/tb-xl-sep.gif b/deluge/ui/web/themes/images/default/toolbar/tb-xl-sep.gif
new file mode 100644
index 0000000..30555ee
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/toolbar/tb-xl-sep.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/arrows.gif b/deluge/ui/web/themes/images/default/tree/arrows.gif
new file mode 100644
index 0000000..2683463
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/arrows.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/drop-add.gif b/deluge/ui/web/themes/images/default/tree/drop-add.gif
new file mode 100644
index 0000000..b22cd14
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/drop-add.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/drop-between.gif b/deluge/ui/web/themes/images/default/tree/drop-between.gif
new file mode 100644
index 0000000..5c6c09d
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/drop-between.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/drop-no.gif b/deluge/ui/web/themes/images/default/tree/drop-no.gif
new file mode 100644
index 0000000..9d9c6a9
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/drop-no.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/drop-over.gif b/deluge/ui/web/themes/images/default/tree/drop-over.gif
new file mode 100644
index 0000000..30d1ca7
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/drop-over.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/drop-under.gif b/deluge/ui/web/themes/images/default/tree/drop-under.gif
new file mode 100644
index 0000000..85f66b1
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/drop-under.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/drop-yes.gif b/deluge/ui/web/themes/images/default/tree/drop-yes.gif
new file mode 100644
index 0000000..8aacb30
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/drop-yes.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/elbow-end-minus-nl.gif b/deluge/ui/web/themes/images/default/tree/elbow-end-minus-nl.gif
new file mode 100644
index 0000000..928779e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/elbow-end-minus-nl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/elbow-end-minus.gif b/deluge/ui/web/themes/images/default/tree/elbow-end-minus.gif
new file mode 100644
index 0000000..9a8d727
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/elbow-end-minus.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/elbow-end-plus-nl.gif b/deluge/ui/web/themes/images/default/tree/elbow-end-plus-nl.gif
new file mode 100644
index 0000000..9f7f698
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/elbow-end-plus-nl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/elbow-end-plus.gif b/deluge/ui/web/themes/images/default/tree/elbow-end-plus.gif
new file mode 100644
index 0000000..5943a01
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/elbow-end-plus.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/elbow-end.gif b/deluge/ui/web/themes/images/default/tree/elbow-end.gif
new file mode 100644
index 0000000..f24ddee
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/elbow-end.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/elbow-line.gif b/deluge/ui/web/themes/images/default/tree/elbow-line.gif
new file mode 100644
index 0000000..75e6da4
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/elbow-line.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/elbow-minus-nl.gif b/deluge/ui/web/themes/images/default/tree/elbow-minus-nl.gif
new file mode 100644
index 0000000..928779e
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/elbow-minus-nl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/elbow-minus.gif b/deluge/ui/web/themes/images/default/tree/elbow-minus.gif
new file mode 100644
index 0000000..97dcc71
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/elbow-minus.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/elbow-plus-nl.gif b/deluge/ui/web/themes/images/default/tree/elbow-plus-nl.gif
new file mode 100644
index 0000000..9f7f698
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/elbow-plus-nl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/elbow-plus.gif b/deluge/ui/web/themes/images/default/tree/elbow-plus.gif
new file mode 100644
index 0000000..698de47
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/elbow-plus.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/elbow.gif b/deluge/ui/web/themes/images/default/tree/elbow.gif
new file mode 100644
index 0000000..b8f4208
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/elbow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/folder-open.gif b/deluge/ui/web/themes/images/default/tree/folder-open.gif
new file mode 100644
index 0000000..56ba737
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/folder-open.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/folder.gif b/deluge/ui/web/themes/images/default/tree/folder.gif
new file mode 100644
index 0000000..20412f7
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/folder.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/leaf.gif b/deluge/ui/web/themes/images/default/tree/leaf.gif
new file mode 100644
index 0000000..445769d
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/leaf.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/loading.gif b/deluge/ui/web/themes/images/default/tree/loading.gif
new file mode 100644
index 0000000..e846e1d
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/loading.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/tree/s.gif b/deluge/ui/web/themes/images/default/tree/s.gif
new file mode 100644
index 0000000..1d11fa9
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/tree/s.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/window/icon-error.gif b/deluge/ui/web/themes/images/default/window/icon-error.gif
new file mode 100644
index 0000000..397b655
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/window/icon-error.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/window/icon-info.gif b/deluge/ui/web/themes/images/default/window/icon-info.gif
new file mode 100644
index 0000000..58281c3
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/window/icon-info.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/window/icon-question.gif b/deluge/ui/web/themes/images/default/window/icon-question.gif
new file mode 100644
index 0000000..08abd82
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/window/icon-question.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/window/icon-warning.gif b/deluge/ui/web/themes/images/default/window/icon-warning.gif
new file mode 100644
index 0000000..27ff98b
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/window/icon-warning.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/window/left-corners.png b/deluge/ui/web/themes/images/default/window/left-corners.png
new file mode 100644
index 0000000..a2250fd
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/window/left-corners.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/window/left-corners.psd b/deluge/ui/web/themes/images/default/window/left-corners.psd
new file mode 100644
index 0000000..3d7f062
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/window/left-corners.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/window/left-right.png b/deluge/ui/web/themes/images/default/window/left-right.png
new file mode 100644
index 0000000..acd72c2
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/window/left-right.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/window/left-right.psd b/deluge/ui/web/themes/images/default/window/left-right.psd
new file mode 100644
index 0000000..59a3960
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/window/left-right.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/window/right-corners.png b/deluge/ui/web/themes/images/default/window/right-corners.png
new file mode 100644
index 0000000..7c40007
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/window/right-corners.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/window/right-corners.psd b/deluge/ui/web/themes/images/default/window/right-corners.psd
new file mode 100644
index 0000000..86d5095
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/window/right-corners.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/window/top-bottom.png b/deluge/ui/web/themes/images/default/window/top-bottom.png
new file mode 100644
index 0000000..3b5f86b
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/window/top-bottom.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/default/window/top-bottom.psd b/deluge/ui/web/themes/images/default/window/top-bottom.psd
new file mode 100644
index 0000000..48c5395
--- /dev/null
+++ b/deluge/ui/web/themes/images/default/window/top-bottom.psd
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/button/btn-arrow.gif b/deluge/ui/web/themes/images/gray/button/btn-arrow.gif
new file mode 100644
index 0000000..f90d5df
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/button/btn-arrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/button/btn-sprite.gif b/deluge/ui/web/themes/images/gray/button/btn-sprite.gif
new file mode 100644
index 0000000..834ff97
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/button/btn-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/button/btn.gif b/deluge/ui/web/themes/images/gray/button/btn.gif
new file mode 100644
index 0000000..96ea61a
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/button/btn.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/button/group-cs.gif b/deluge/ui/web/themes/images/gray/button/group-cs.gif
new file mode 100644
index 0000000..7059e2b
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/button/group-cs.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/button/group-lr.gif b/deluge/ui/web/themes/images/gray/button/group-lr.gif
new file mode 100644
index 0000000..3f41fbd
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/button/group-lr.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/button/group-tb.gif b/deluge/ui/web/themes/images/gray/button/group-tb.gif
new file mode 100644
index 0000000..c5ea8ca
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/button/group-tb.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/button/s-arrow-bo.gif b/deluge/ui/web/themes/images/gray/button/s-arrow-bo.gif
new file mode 100644
index 0000000..fa5b2f4
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/button/s-arrow-bo.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/button/s-arrow-o.gif b/deluge/ui/web/themes/images/gray/button/s-arrow-o.gif
new file mode 100644
index 0000000..52a5141
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/button/s-arrow-o.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/form/clear-trigger.gif b/deluge/ui/web/themes/images/gray/form/clear-trigger.gif
new file mode 100644
index 0000000..be3ff58
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/form/clear-trigger.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/form/date-trigger.gif b/deluge/ui/web/themes/images/gray/form/date-trigger.gif
new file mode 100644
index 0000000..e0537cb
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/form/date-trigger.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/form/search-trigger.gif b/deluge/ui/web/themes/images/gray/form/search-trigger.gif
new file mode 100644
index 0000000..0cc4f59
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/form/search-trigger.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/form/trigger-square.gif b/deluge/ui/web/themes/images/gray/form/trigger-square.gif
new file mode 100644
index 0000000..7a0f585
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/form/trigger-square.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/form/trigger.gif b/deluge/ui/web/themes/images/gray/form/trigger.gif
new file mode 100644
index 0000000..b563474
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/form/trigger.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/gradient-bg.gif b/deluge/ui/web/themes/images/gray/gradient-bg.gif
new file mode 100644
index 0000000..8134e49
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/gradient-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/col-move-bottom.gif b/deluge/ui/web/themes/images/gray/grid/col-move-bottom.gif
new file mode 100644
index 0000000..c525f7e
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/col-move-bottom.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/col-move-top.gif b/deluge/ui/web/themes/images/gray/grid/col-move-top.gif
new file mode 100644
index 0000000..ccc92b6
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/col-move-top.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/grid3-hd-btn.gif b/deluge/ui/web/themes/images/gray/grid/grid3-hd-btn.gif
new file mode 100644
index 0000000..daf1ef2
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/grid3-hd-btn.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/grid3-hrow-over.gif b/deluge/ui/web/themes/images/gray/grid/grid3-hrow-over.gif
new file mode 100644
index 0000000..d37252f
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/grid3-hrow-over.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/grid3-hrow-over2.gif b/deluge/ui/web/themes/images/gray/grid/grid3-hrow-over2.gif
new file mode 100644
index 0000000..353d906
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/grid3-hrow-over2.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/grid3-hrow.gif b/deluge/ui/web/themes/images/gray/grid/grid3-hrow.gif
new file mode 100644
index 0000000..8d459a3
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/grid3-hrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/grid3-hrow2.gif b/deluge/ui/web/themes/images/gray/grid/grid3-hrow2.gif
new file mode 100644
index 0000000..423b507
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/grid3-hrow2.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/grid3-special-col-bg.gif b/deluge/ui/web/themes/images/gray/grid/grid3-special-col-bg.gif
new file mode 100644
index 0000000..12d64d7
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/grid3-special-col-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/grid3-special-col-bg2.gif b/deluge/ui/web/themes/images/gray/grid/grid3-special-col-bg2.gif
new file mode 100644
index 0000000..f10e6ad
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/grid3-special-col-bg2.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/grid3-special-col-sel-bg.gif b/deluge/ui/web/themes/images/gray/grid/grid3-special-col-sel-bg.gif
new file mode 100644
index 0000000..4fa6e10
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/grid3-special-col-sel-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/group-collapse.gif b/deluge/ui/web/themes/images/gray/grid/group-collapse.gif
new file mode 100644
index 0000000..c9ad30d
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/group-collapse.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/group-expand-sprite.gif b/deluge/ui/web/themes/images/gray/grid/group-expand-sprite.gif
new file mode 100644
index 0000000..d24891d
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/group-expand-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/group-expand.gif b/deluge/ui/web/themes/images/gray/grid/group-expand.gif
new file mode 100644
index 0000000..663b5c8
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/group-expand.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/page-first.gif b/deluge/ui/web/themes/images/gray/grid/page-first.gif
new file mode 100644
index 0000000..60be4bc
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/page-first.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/page-last.gif b/deluge/ui/web/themes/images/gray/grid/page-last.gif
new file mode 100644
index 0000000..beb4a83
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/page-last.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/page-next.gif b/deluge/ui/web/themes/images/gray/grid/page-next.gif
new file mode 100644
index 0000000..97db1c2
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/page-next.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/page-prev.gif b/deluge/ui/web/themes/images/gray/grid/page-prev.gif
new file mode 100644
index 0000000..d07e61c
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/page-prev.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/refresh.gif b/deluge/ui/web/themes/images/gray/grid/refresh.gif
new file mode 100644
index 0000000..868b2dc
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/refresh.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/row-expand-sprite.gif b/deluge/ui/web/themes/images/gray/grid/row-expand-sprite.gif
new file mode 100644
index 0000000..09c00a6
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/row-expand-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/sort-hd.gif b/deluge/ui/web/themes/images/gray/grid/sort-hd.gif
new file mode 100644
index 0000000..4cf483d
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/sort-hd.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/sort_asc.gif b/deluge/ui/web/themes/images/gray/grid/sort_asc.gif
new file mode 100644
index 0000000..7e562e2
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/sort_asc.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/grid/sort_desc.gif b/deluge/ui/web/themes/images/gray/grid/sort_desc.gif
new file mode 100644
index 0000000..9b7a871
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/grid/sort_desc.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/menu/group-checked.gif b/deluge/ui/web/themes/images/gray/menu/group-checked.gif
new file mode 100644
index 0000000..c882488
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/menu/group-checked.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/menu/item-over-disabled.gif b/deluge/ui/web/themes/images/gray/menu/item-over-disabled.gif
new file mode 100644
index 0000000..97d5ffa
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/menu/item-over-disabled.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/menu/item-over.gif b/deluge/ui/web/themes/images/gray/menu/item-over.gif
new file mode 100644
index 0000000..e0dc5f7
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/menu/item-over.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/menu/menu-parent.gif b/deluge/ui/web/themes/images/gray/menu/menu-parent.gif
new file mode 100644
index 0000000..5461a8b
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/menu/menu-parent.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/panel/corners-sprite.gif b/deluge/ui/web/themes/images/gray/panel/corners-sprite.gif
new file mode 100644
index 0000000..fad0e6d
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/panel/corners-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/panel/left-right.gif b/deluge/ui/web/themes/images/gray/panel/left-right.gif
new file mode 100644
index 0000000..c5f3dca
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/panel/left-right.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/panel/light-hd.gif b/deluge/ui/web/themes/images/gray/panel/light-hd.gif
new file mode 100644
index 0000000..6eb28ba
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/panel/light-hd.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/panel/tool-sprite-tpl.gif b/deluge/ui/web/themes/images/gray/panel/tool-sprite-tpl.gif
new file mode 100644
index 0000000..18277a3
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/panel/tool-sprite-tpl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/panel/tool-sprites.gif b/deluge/ui/web/themes/images/gray/panel/tool-sprites.gif
new file mode 100644
index 0000000..36b6b67
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/panel/tool-sprites.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/panel/tools-sprites-trans.gif b/deluge/ui/web/themes/images/gray/panel/tools-sprites-trans.gif
new file mode 100644
index 0000000..b6d7ba3
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/panel/tools-sprites-trans.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/panel/top-bottom.gif b/deluge/ui/web/themes/images/gray/panel/top-bottom.gif
new file mode 100644
index 0000000..24ceb30
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/panel/top-bottom.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/panel/top-bottom.png b/deluge/ui/web/themes/images/gray/panel/top-bottom.png
new file mode 100644
index 0000000..6df5f68
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/panel/top-bottom.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/panel/white-corners-sprite.gif b/deluge/ui/web/themes/images/gray/panel/white-corners-sprite.gif
new file mode 100644
index 0000000..d5b8adf
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/panel/white-corners-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/panel/white-left-right.gif b/deluge/ui/web/themes/images/gray/panel/white-left-right.gif
new file mode 100644
index 0000000..2c9e142
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/panel/white-left-right.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/panel/white-top-bottom.gif b/deluge/ui/web/themes/images/gray/panel/white-top-bottom.gif
new file mode 100644
index 0000000..025fbd5
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/panel/white-top-bottom.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/progress/progress-bg.gif b/deluge/ui/web/themes/images/gray/progress/progress-bg.gif
new file mode 100644
index 0000000..5585d80
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/progress/progress-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/qtip/bg.gif b/deluge/ui/web/themes/images/gray/qtip/bg.gif
new file mode 100644
index 0000000..a9055a5
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/qtip/bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/qtip/close.gif b/deluge/ui/web/themes/images/gray/qtip/close.gif
new file mode 100644
index 0000000..69ab915
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/qtip/close.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/qtip/tip-anchor-sprite.gif b/deluge/ui/web/themes/images/gray/qtip/tip-anchor-sprite.gif
new file mode 100644
index 0000000..0671586
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/qtip/tip-anchor-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/qtip/tip-sprite.gif b/deluge/ui/web/themes/images/gray/qtip/tip-sprite.gif
new file mode 100644
index 0000000..4ade664
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/qtip/tip-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/s.gif b/deluge/ui/web/themes/images/gray/s.gif
new file mode 100644
index 0000000..1d11fa9
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/s.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/shared/hd-sprite.gif b/deluge/ui/web/themes/images/gray/shared/hd-sprite.gif
new file mode 100644
index 0000000..d943833
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/shared/hd-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/shared/left-btn.gif b/deluge/ui/web/themes/images/gray/shared/left-btn.gif
new file mode 100644
index 0000000..3301054
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/shared/left-btn.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/shared/right-btn.gif b/deluge/ui/web/themes/images/gray/shared/right-btn.gif
new file mode 100644
index 0000000..c529110
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/shared/right-btn.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/sizer/e-handle.gif b/deluge/ui/web/themes/images/gray/sizer/e-handle.gif
new file mode 100644
index 0000000..a8ed0ed
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/sizer/e-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/sizer/ne-handle.gif b/deluge/ui/web/themes/images/gray/sizer/ne-handle.gif
new file mode 100644
index 0000000..6f7b0c2
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/sizer/ne-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/sizer/nw-handle.gif b/deluge/ui/web/themes/images/gray/sizer/nw-handle.gif
new file mode 100644
index 0000000..92ad82c
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/sizer/nw-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/sizer/s-handle.gif b/deluge/ui/web/themes/images/gray/sizer/s-handle.gif
new file mode 100644
index 0000000..d7eeae2
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/sizer/s-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/sizer/se-handle.gif b/deluge/ui/web/themes/images/gray/sizer/se-handle.gif
new file mode 100644
index 0000000..f011a3b
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/sizer/se-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/sizer/square.gif b/deluge/ui/web/themes/images/gray/sizer/square.gif
new file mode 100644
index 0000000..7751d5e
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/sizer/square.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/sizer/sw-handle.gif b/deluge/ui/web/themes/images/gray/sizer/sw-handle.gif
new file mode 100644
index 0000000..aa903dd
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/sizer/sw-handle.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/slider/slider-thumb.png b/deluge/ui/web/themes/images/gray/slider/slider-thumb.png
new file mode 100644
index 0000000..6ec1667
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/slider/slider-thumb.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/slider/slider-v-thumb.png b/deluge/ui/web/themes/images/gray/slider/slider-v-thumb.png
new file mode 100644
index 0000000..1945672
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/slider/slider-v-thumb.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/scroll-left.gif b/deluge/ui/web/themes/images/gray/tabs/scroll-left.gif
new file mode 100644
index 0000000..bbb3e3d
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/scroll-left.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/scroll-right.gif b/deluge/ui/web/themes/images/gray/tabs/scroll-right.gif
new file mode 100644
index 0000000..feb6a76
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/scroll-right.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/scroller-bg.gif b/deluge/ui/web/themes/images/gray/tabs/scroller-bg.gif
new file mode 100644
index 0000000..f089c0a
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/scroller-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/tab-btm-inactive-left-bg.gif b/deluge/ui/web/themes/images/gray/tabs/tab-btm-inactive-left-bg.gif
new file mode 100644
index 0000000..d718173
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/tab-btm-inactive-left-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/tab-btm-inactive-right-bg.gif b/deluge/ui/web/themes/images/gray/tabs/tab-btm-inactive-right-bg.gif
new file mode 100644
index 0000000..bf35493
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/tab-btm-inactive-right-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/tab-btm-left-bg.gif b/deluge/ui/web/themes/images/gray/tabs/tab-btm-left-bg.gif
new file mode 100644
index 0000000..96d2e5e
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/tab-btm-left-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/tab-btm-over-left-bg.gif b/deluge/ui/web/themes/images/gray/tabs/tab-btm-over-left-bg.gif
new file mode 100644
index 0000000..164d101
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/tab-btm-over-left-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/tab-btm-over-right-bg.gif b/deluge/ui/web/themes/images/gray/tabs/tab-btm-over-right-bg.gif
new file mode 100644
index 0000000..f6f0495
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/tab-btm-over-right-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/tab-btm-right-bg.gif b/deluge/ui/web/themes/images/gray/tabs/tab-btm-right-bg.gif
new file mode 100644
index 0000000..c41cada
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/tab-btm-right-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/tab-close.gif b/deluge/ui/web/themes/images/gray/tabs/tab-close.gif
new file mode 100644
index 0000000..98d5da9
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/tab-close.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/tab-strip-bg.gif b/deluge/ui/web/themes/images/gray/tabs/tab-strip-bg.gif
new file mode 100644
index 0000000..040b677
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/tab-strip-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/tab-strip-bg.png b/deluge/ui/web/themes/images/gray/tabs/tab-strip-bg.png
new file mode 100644
index 0000000..fed48eb
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/tab-strip-bg.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/tab-strip-btm-bg.gif b/deluge/ui/web/themes/images/gray/tabs/tab-strip-btm-bg.gif
new file mode 100644
index 0000000..f35087f
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/tab-strip-btm-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tabs/tabs-sprite.gif b/deluge/ui/web/themes/images/gray/tabs/tabs-sprite.gif
new file mode 100644
index 0000000..1901b23
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tabs/tabs-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/toolbar/bg.gif b/deluge/ui/web/themes/images/gray/toolbar/bg.gif
new file mode 100644
index 0000000..9ab78a2
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/toolbar/bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/toolbar/btn-arrow-light.gif b/deluge/ui/web/themes/images/gray/toolbar/btn-arrow-light.gif
new file mode 100644
index 0000000..b0e24b5
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/toolbar/btn-arrow-light.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/toolbar/btn-arrow.gif b/deluge/ui/web/themes/images/gray/toolbar/btn-arrow.gif
new file mode 100644
index 0000000..8acb460
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/toolbar/btn-arrow.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/toolbar/btn-over-bg.gif b/deluge/ui/web/themes/images/gray/toolbar/btn-over-bg.gif
new file mode 100644
index 0000000..ee2dd98
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/toolbar/btn-over-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/toolbar/gray-bg.gif b/deluge/ui/web/themes/images/gray/toolbar/gray-bg.gif
new file mode 100644
index 0000000..5464e21
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/toolbar/gray-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/toolbar/more.gif b/deluge/ui/web/themes/images/gray/toolbar/more.gif
new file mode 100644
index 0000000..77f4f23
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/toolbar/more.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/toolbar/tb-bg.gif b/deluge/ui/web/themes/images/gray/toolbar/tb-bg.gif
new file mode 100644
index 0000000..4969e4e
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/toolbar/tb-bg.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/toolbar/tb-btn-sprite.gif b/deluge/ui/web/themes/images/gray/toolbar/tb-btn-sprite.gif
new file mode 100644
index 0000000..894fef2
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/toolbar/tb-btn-sprite.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tree/arrows.gif b/deluge/ui/web/themes/images/gray/tree/arrows.gif
new file mode 100644
index 0000000..a51a8e4
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tree/arrows.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tree/elbow-end-minus-nl.gif b/deluge/ui/web/themes/images/gray/tree/elbow-end-minus-nl.gif
new file mode 100644
index 0000000..8c5bc5d
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tree/elbow-end-minus-nl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tree/elbow-end-minus.gif b/deluge/ui/web/themes/images/gray/tree/elbow-end-minus.gif
new file mode 100644
index 0000000..5850513
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tree/elbow-end-minus.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tree/elbow-end-plus-nl.gif b/deluge/ui/web/themes/images/gray/tree/elbow-end-plus-nl.gif
new file mode 100644
index 0000000..752b42a
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tree/elbow-end-plus-nl.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/tree/elbow-end-plus.gif b/deluge/ui/web/themes/images/gray/tree/elbow-end-plus.gif
new file mode 100644
index 0000000..ff12635
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/tree/elbow-end-plus.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/window/icon-error.gif b/deluge/ui/web/themes/images/gray/window/icon-error.gif
new file mode 100644
index 0000000..397b655
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/window/icon-error.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/window/icon-info.gif b/deluge/ui/web/themes/images/gray/window/icon-info.gif
new file mode 100644
index 0000000..58281c3
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/window/icon-info.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/window/icon-question.gif b/deluge/ui/web/themes/images/gray/window/icon-question.gif
new file mode 100644
index 0000000..08abd82
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/window/icon-question.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/window/icon-warning.gif b/deluge/ui/web/themes/images/gray/window/icon-warning.gif
new file mode 100644
index 0000000..27ff98b
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/window/icon-warning.gif
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/window/left-corners.png b/deluge/ui/web/themes/images/gray/window/left-corners.png
new file mode 100644
index 0000000..f9f44ad
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/window/left-corners.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/window/left-right.png b/deluge/ui/web/themes/images/gray/window/left-right.png
new file mode 100644
index 0000000..0272b5d
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/window/left-right.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/window/right-corners.png b/deluge/ui/web/themes/images/gray/window/right-corners.png
new file mode 100644
index 0000000..e0a58d3
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/window/right-corners.png
Binary files differ
diff --git a/deluge/ui/web/themes/images/gray/window/top-bottom.png b/deluge/ui/web/themes/images/gray/window/top-bottom.png
new file mode 100644
index 0000000..798cb9b
--- /dev/null
+++ b/deluge/ui/web/themes/images/gray/window/top-bottom.png
Binary files differ
diff --git a/deluge/ui/web/web.py b/deluge/ui/web/web.py
new file mode 100644
index 0000000..4d06247
--- /dev/null
+++ b/deluge/ui/web/web.py
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+from __future__ import print_function, unicode_literals
+
+import logging
+
+from twisted.internet.error import CannotListenError
+
+from deluge.common import run_profiled
+from deluge.ui.ui import UI
+
+log = logging.getLogger(__name__)
+
+
+class Web(UI):
+
+ cmd_description = """Web-based user interface (http://localhost:8112)"""
+
+ def __init__(self, *args, **kwargs):
+ super(Web, self).__init__(
+ 'web', *args, description='Starts the Deluge Web interface', **kwargs
+ )
+ self.__server = None
+
+ group = self.parser.add_argument_group(_('Web Server Options'))
+ group.add_argument(
+ '-i',
+ '--interface',
+ metavar='<ip_address>',
+ action='store',
+ help=_('IP address for web server to listen on'),
+ )
+ group.add_argument(
+ '-p',
+ '--port',
+ metavar='<port>',
+ type=int,
+ action='store',
+ help=_('Port for web server to listen on'),
+ )
+ group.add_argument(
+ '-b',
+ '--base',
+ metavar='<path>',
+ action='store',
+ help=_('Set the base path that the ui is running on'),
+ )
+ group.add_argument(
+ '--ssl', action='store_true', help=_('Force the web server to use SSL')
+ )
+ group.add_argument(
+ '--no-ssl',
+ action='store_true',
+ help=_('Force the web server to disable SSL'),
+ )
+ self.parser.add_process_arg_group()
+
+ @property
+ def server(self):
+ return self.__server
+
+ def start(self):
+ super(Web, self).start()
+
+ from deluge.ui.web import server
+
+ self.__server = server.DelugeWeb(options=self.options)
+
+ def run():
+ try:
+ self.server.install_signal_handlers()
+ self.server.start()
+ except CannotListenError as ex:
+ log.error(
+ '%s \nCheck that deluge-web or webui plugin is not already running.',
+ ex,
+ )
+ except Exception as ex:
+ log.exception(ex)
+ raise
+
+ run_profiled(
+ run, output_file=self.options.profile, do_profile=self.options.profile
+ )